ROOT logo
using namespace std;
#include "htaskset.h"
#include "hdebug.h"
#include "hmessagemgr.h"
#include "hades.h"
#include "TROOT.h"
#include "TClass.h"
#include "haddef.h"
#include "TBrowser.h"

#include <iostream>
#include <iomanip>

//*-- Author : Manuel Sanchez
//*-- Modified: 13/02/2004 by R. Holzmann
//*-- Modified: 19/11/2001 by D. Magestro
//*-- Modified: 09/03/2000 by R. Holzmann
//*-- Modified: 26/5/1999 by D.Bertini
//*-- Modified: 9/11/1998

//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
// HTaskSet
//
// This HTask is in fact a set of tasks arbitrarily connected among themselves.
//
// The tasks are connected such that when a task is finished a pointer to
// the next task is retrieved; note that the tasks must not necessarily be
// connected in a linear fashion.
///////////////////////////////////////////////////////////////////////////////

HTaskSet::HTaskSet(const Text_t name[],const Text_t title[]) : HTask(name,title) {
  // Constructor
  fFirstTask=0;
  fNextTask=0;
  fIsTimed=kFALSE;
  owner=0;
  for (Int_t i=0;i<8;i++) ids[i] = -1;
}


HTaskSet::HTaskSet(void) {
  // Default constructor
  fIsTimed=kFALSE;
  owner=0;
  for (Int_t i=0;i<8;i++) ids[i] = -1;
}

/*
// old code .... its not a copy and and not used ... so don"t allow it
 HTaskSet::HTaskSet(HTaskSet &ts) {
  // Copy constructor.
  fFirstTask=ts.fFirstTask;
  fNextTask=ts.fNextTask;
  fTasks.AddAll(&ts.fTasks);
  fIsTimed=ts.fIsTimed;
  owner=ts.owner;
  for (Int_t i=0;i<8;i++) ids[i] = ts.ids[i];
}
*/

HTaskSet::~HTaskSet(void) {
  // Destructor.
  fTasks.Delete();
}


HTask* HTaskSet::getTask(const Char_t *name) {
  // return pointer to first task of given name found
  if (strcmp(GetName(),name)==0) return this;

  HTask* task=NULL;
  HTask* found=NULL;
  TIterator *iter=fTasks.MakeIterator();
  while ( (task=(HTask*)iter->Next()) ) {
    if ( (found=task->getTask(name)) ) return found;
  }
  return NULL;
}


Bool_t HTaskSet::add( HTask* task ){
 // For the moment only elementary task are added

 if ( fTasks.IsEmpty() ) {
   fTasks.Add( task );
   fFirstTask=task;
   task->setOwner(this);
   return kTRUE;
 } else {
   HTask* pTask = (HTask*) fTasks.Last();
   pTask->connectTask(task,0);
   if (!(fTasks.FindObject(task))) fTasks.Add( task );
   task->setOwner(this);
   return kTRUE;
 }
}

Bool_t HTaskSet::connect(HTask *task) {
  // Connects "task" as the first task to be performed in the set.
  if (!fTasks.FindObject(task)) fTasks.Add(task);
  fFirstTask=task;
  task->setOwner(this);
  return kTRUE;
}


Bool_t HTaskSet::connect(HTask *task,HTask *where,Int_t n) {
  // connects task "task" to the task "where" with parameter "n"
  if(!task) return kTRUE;
  if (where) {
    if (fTasks.FindObject(where)) {
      where->connectTask(task,n);
      if (!(fTasks.FindObject(task))) fTasks.Add(task);
    } else return kFALSE;
  } else {
    fTasks.Add(task);
    fFirstTask=task;
  }
  task->setOwner(this);
  return kTRUE;
}


Bool_t HTaskSet::connect(HTask *task,const Text_t *where,Int_t n) {
  // Connects task "task" to the task with name "where" using "n" as parameter.
  if(!task) return kTRUE;
  if(where) {
    HTask *wh=NULL;
    wh=(HTask *)fTasks.FindObject(where);
    if (wh) {
      if(wh->connectTask(task,n)) {
        if (!(fTasks.FindObject(task))) fTasks.Add(task);
      } else {
        WARNING_msg(10,HMessageMgr::DET_ALL,"Problem in connecting task!\n");
        return kFALSE;
      }
    } else return kFALSE;
    task->setOwner(this);
    return kTRUE;
  }
  return kFALSE;
}


Bool_t HTaskSet::connect(const Text_t task[],const Text_t where[],Int_t n) {
  // Connects the task named "task" to the one named "where" using "n" as
  // parameter.
  HTask *ta=NULL,*wh=NULL;
  wh=(HTask *)fTasks.FindObject(where);
  ta=(HTask *)fTasks.FindObject(task);
    if (ta && wh) {
      wh->connectTask(ta,n);
      if (!(fTasks.FindObject(task))) fTasks.Add(ta);
    } else return kFALSE;
  ta->setOwner(this);
  return kTRUE;
}


void HTaskSet::Clear(Option_t *opt) {

//FIXME: "HTaskSet::Clear should clear not delete..."
  fTasks.Delete();
  fFirstTask=NULL;
  fNextTask=NULL;
}


Bool_t HTaskSet::init(void) {
  // Calls the init function for each of the tasks in the task set.
    TIter next(&fTasks);
  HTask *task=NULL;
  if(fIsTimed) resetTimer();
  while ( (task=(HTask *)next())!=NULL) {
    if (!task->init()) {
	Error("init","%s initialization failed!",task->GetName());
	return kFALSE;
    }
  }
  return kTRUE;
}


Bool_t HTaskSet::reinit(void) {
  // Calls the init function for each of the tasks in the task set.
  TIter next(&fTasks);
  HTask *task=NULL;
  while ( (task=(HTask *)next())!=NULL) {
      if (!(task->reinit())) { Error("reinit()","Error returned from %s",task->GetName()); return kFALSE; }
  }
  return kTRUE;
}


Bool_t HTaskSet::finalize(void) {
  // Calls the finalize function for each of the tasks in the set
  TIter next(&fTasks);
  HTask *task=NULL;
  while ( (task=(HTask *)next())!=NULL) {
    if (!task->finalize()) return kFALSE;
  }
  return kTRUE;
}


void HTaskSet::print(void) {
  // Dumps dependencies for each of the tasks in the set
    TIter next(&fTasks);
    HTask *task=NULL;

    if(owner==NULL) {
	gHades->getMsg()->info(10,HMessageMgr::DET_ALL,GetName(),"=== TASK SET: %-15s ========================\n",
			       GetName());
    }
    else if(owner->getOwner()==NULL) {
	gHades->getMsg()->info(10,HMessageMgr::DET_ALL,GetName(),"--- Task Set: %-15s -------------------\n",
			       GetName());
    }
    else {
	gHades->getMsg()->info(10,HMessageMgr::DET_ALL,GetName(),"- - Task set: %-15s - - - - - - - -\n",
			       GetName());
    }
    while ( (task=(HTask *)next())!=NULL) {
	if(strcmp((task->IsA())->GetName(),"HTaskSet")==0) {
	    ((HTaskSet*) task)->print();
	    SEPERATOR_msg("-",63);
	    //printf("\n");
	}
	else { task->getConnections(); }
    }

    if(owner==NULL) { SEPERATOR_msg("=",63); }
    //printf("================================================================\n\n");
//  else
//  printf("-----------------------------------------------------------\n");
}


void HTaskSet::setIds(Int_t i0, Int_t i1, Int_t i2, Int_t i3,  Int_t i4,
                      Int_t i5, Int_t i6, Int_t i7) {
  // set event ids for which this task set should execute
  //
  ids[0] = i0;
  ids[1] = i1;
  ids[2] = i2;
  ids[3] = i3;
  ids[4] = i4;
  ids[5] = i5;
  ids[6] = i6;
  ids[7] = i7;

}

HTask* HTaskSet::next(Int_t &errCode, Int_t evtId) {
  // do tasks only if evtId matches with one of the 8 tabulated ids
  //
  if (fFirstTask) {
    for (Int_t i=0;i<8; i++) if (evtId==ids[i]) return next(errCode);
  }
  return NULL;
}

HTask *HTaskSet::next(Int_t &errCode) {
  // Iterates throught the task set. When the iteration is finished it
  // returns a pointer to the next task as set by connectTask()
  HTask *task;
  if (fFirstTask==NULL) return fNextTask;   // task set is empty
  Int_t err=0;

  //loop over task in the list
  task=fFirstTask;
  while (task) {
    task=task->next(err);
  }
  errCode=err;
     // check the errcode value stop and skipevent
     // (when skipping an event in a multi-tasklist
     // layout, the next tasklist is correctly skipped

  if (errCode ==  kSTOP || errCode == kSkipEvent) return NULL;
  return fNextTask;
}


Bool_t HTaskSet::connectTask(HTask *task,Int_t) {
  // Connects "task" as the next task to be performed; n is ignored.
  fNextTask=task;
  return kTRUE;
}


Bool_t HTaskSet::IsFolder(void) const {
  // Returns true. This tells the Root browser to show HTaskSet as a folder
  // holding other objects
  return kTRUE;
}


void HTaskSet::Browse(TBrowser *b) {
  // Adds the tasks in the this taskset to the current ROOT browser.
  //
  // This function is called by Root when browsing gHades with the Root browser
  //

  TIterator *next=fTasks.MakeIterator();
  TObject *task=0;

  while ( (task=(HTask *)next->Next()) != 0) {
    b->Add(task);
  }
  delete next;
}


void HTaskSet::isTimed(Bool_t flag) {
  // Set timing flag for all tasks in set
  TIter next(&fTasks);
  HTask *task=NULL;
  while ( (task=(HTask *)next()) != NULL ) task->isTimed(flag);
  fIsTimed = flag;
}


void HTaskSet::resetTimer(void) {
  // Calls the reset function for each of the task timers in the task set.
  if(fIsTimed) {
    TIter next(&fTasks);
    HTask *task=NULL;
    while ( (task=(HTask *)next()) != NULL ) task->resetTimer();
  }
}


void HTaskSet::printTimer(void) {
  // Calls the print function for each of the task timers in the task set.
  if(fIsTimed) {
    TIter next(&fTasks);
    HTask *task=NULL;
    gHades->getMsg()->infoB(10,HMessageMgr::DET_ALL,"Timing information for taskset %s:\n",this->GetName());
    while ( (task=(HTask *)next()) != NULL ) task->printTimer();
  }
  else gHades->getMsg()->infoB(10,HMessageMgr::DET_ALL,"No timing information has been collected for taskset %s!\n",
                                                             this->GetName());
}

void HTaskSet::Streamer(TBuffer &R__b)
{
   // Stream an object of class HTaskSet.

   UInt_t R__s, R__c;
   if (R__b.IsReading()) {
      Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
      HTask::Streamer(R__b);
      fTasks.Streamer(R__b);
      R__b >> fNextTask;
      R__b >> fFirstTask;
      if (R__v > 1 )R__b.ReadStaticArray(ids);
      else for (Int_t i=0; i<8; i++) ids[i] = 0;
      R__b.CheckByteCount(R__s, R__c, HTaskSet::IsA());
   } else {
      R__c = R__b.WriteVersion(HTaskSet::IsA(), kTRUE);
      HTask::Streamer(R__b);
      fTasks.Streamer(R__b);
      R__b << fNextTask;
      R__b << fFirstTask;
      R__b.WriteArray(ids, 8);
      R__b.SetByteCount(R__c, kTRUE);
   }
}

ClassImp(HTaskSet)
































 htaskset.cc:1
 htaskset.cc:2
 htaskset.cc:3
 htaskset.cc:4
 htaskset.cc:5
 htaskset.cc:6
 htaskset.cc:7
 htaskset.cc:8
 htaskset.cc:9
 htaskset.cc:10
 htaskset.cc:11
 htaskset.cc:12
 htaskset.cc:13
 htaskset.cc:14
 htaskset.cc:15
 htaskset.cc:16
 htaskset.cc:17
 htaskset.cc:18
 htaskset.cc:19
 htaskset.cc:20
 htaskset.cc:21
 htaskset.cc:22
 htaskset.cc:23
 htaskset.cc:24
 htaskset.cc:25
 htaskset.cc:26
 htaskset.cc:27
 htaskset.cc:28
 htaskset.cc:29
 htaskset.cc:30
 htaskset.cc:31
 htaskset.cc:32
 htaskset.cc:33
 htaskset.cc:34
 htaskset.cc:35
 htaskset.cc:36
 htaskset.cc:37
 htaskset.cc:38
 htaskset.cc:39
 htaskset.cc:40
 htaskset.cc:41
 htaskset.cc:42
 htaskset.cc:43
 htaskset.cc:44
 htaskset.cc:45
 htaskset.cc:46
 htaskset.cc:47
 htaskset.cc:48
 htaskset.cc:49
 htaskset.cc:50
 htaskset.cc:51
 htaskset.cc:52
 htaskset.cc:53
 htaskset.cc:54
 htaskset.cc:55
 htaskset.cc:56
 htaskset.cc:57
 htaskset.cc:58
 htaskset.cc:59
 htaskset.cc:60
 htaskset.cc:61
 htaskset.cc:62
 htaskset.cc:63
 htaskset.cc:64
 htaskset.cc:65
 htaskset.cc:66
 htaskset.cc:67
 htaskset.cc:68
 htaskset.cc:69
 htaskset.cc:70
 htaskset.cc:71
 htaskset.cc:72
 htaskset.cc:73
 htaskset.cc:74
 htaskset.cc:75
 htaskset.cc:76
 htaskset.cc:77
 htaskset.cc:78
 htaskset.cc:79
 htaskset.cc:80
 htaskset.cc:81
 htaskset.cc:82
 htaskset.cc:83
 htaskset.cc:84
 htaskset.cc:85
 htaskset.cc:86
 htaskset.cc:87
 htaskset.cc:88
 htaskset.cc:89
 htaskset.cc:90
 htaskset.cc:91
 htaskset.cc:92
 htaskset.cc:93
 htaskset.cc:94
 htaskset.cc:95
 htaskset.cc:96
 htaskset.cc:97
 htaskset.cc:98
 htaskset.cc:99
 htaskset.cc:100
 htaskset.cc:101
 htaskset.cc:102
 htaskset.cc:103
 htaskset.cc:104
 htaskset.cc:105
 htaskset.cc:106
 htaskset.cc:107
 htaskset.cc:108
 htaskset.cc:109
 htaskset.cc:110
 htaskset.cc:111
 htaskset.cc:112
 htaskset.cc:113
 htaskset.cc:114
 htaskset.cc:115
 htaskset.cc:116
 htaskset.cc:117
 htaskset.cc:118
 htaskset.cc:119
 htaskset.cc:120
 htaskset.cc:121
 htaskset.cc:122
 htaskset.cc:123
 htaskset.cc:124
 htaskset.cc:125
 htaskset.cc:126
 htaskset.cc:127
 htaskset.cc:128
 htaskset.cc:129
 htaskset.cc:130
 htaskset.cc:131
 htaskset.cc:132
 htaskset.cc:133
 htaskset.cc:134
 htaskset.cc:135
 htaskset.cc:136
 htaskset.cc:137
 htaskset.cc:138
 htaskset.cc:139
 htaskset.cc:140
 htaskset.cc:141
 htaskset.cc:142
 htaskset.cc:143
 htaskset.cc:144
 htaskset.cc:145
 htaskset.cc:146
 htaskset.cc:147
 htaskset.cc:148
 htaskset.cc:149
 htaskset.cc:150
 htaskset.cc:151
 htaskset.cc:152
 htaskset.cc:153
 htaskset.cc:154
 htaskset.cc:155
 htaskset.cc:156
 htaskset.cc:157
 htaskset.cc:158
 htaskset.cc:159
 htaskset.cc:160
 htaskset.cc:161
 htaskset.cc:162
 htaskset.cc:163
 htaskset.cc:164
 htaskset.cc:165
 htaskset.cc:166
 htaskset.cc:167
 htaskset.cc:168
 htaskset.cc:169
 htaskset.cc:170
 htaskset.cc:171
 htaskset.cc:172
 htaskset.cc:173
 htaskset.cc:174
 htaskset.cc:175
 htaskset.cc:176
 htaskset.cc:177
 htaskset.cc:178
 htaskset.cc:179
 htaskset.cc:180
 htaskset.cc:181
 htaskset.cc:182
 htaskset.cc:183
 htaskset.cc:184
 htaskset.cc:185
 htaskset.cc:186
 htaskset.cc:187
 htaskset.cc:188
 htaskset.cc:189
 htaskset.cc:190
 htaskset.cc:191
 htaskset.cc:192
 htaskset.cc:193
 htaskset.cc:194
 htaskset.cc:195
 htaskset.cc:196
 htaskset.cc:197
 htaskset.cc:198
 htaskset.cc:199
 htaskset.cc:200
 htaskset.cc:201
 htaskset.cc:202
 htaskset.cc:203
 htaskset.cc:204
 htaskset.cc:205
 htaskset.cc:206
 htaskset.cc:207
 htaskset.cc:208
 htaskset.cc:209
 htaskset.cc:210
 htaskset.cc:211
 htaskset.cc:212
 htaskset.cc:213
 htaskset.cc:214
 htaskset.cc:215
 htaskset.cc:216
 htaskset.cc:217
 htaskset.cc:218
 htaskset.cc:219
 htaskset.cc:220
 htaskset.cc:221
 htaskset.cc:222
 htaskset.cc:223
 htaskset.cc:224
 htaskset.cc:225
 htaskset.cc:226
 htaskset.cc:227
 htaskset.cc:228
 htaskset.cc:229
 htaskset.cc:230
 htaskset.cc:231
 htaskset.cc:232
 htaskset.cc:233
 htaskset.cc:234
 htaskset.cc:235
 htaskset.cc:236
 htaskset.cc:237
 htaskset.cc:238
 htaskset.cc:239
 htaskset.cc:240
 htaskset.cc:241
 htaskset.cc:242
 htaskset.cc:243
 htaskset.cc:244
 htaskset.cc:245
 htaskset.cc:246
 htaskset.cc:247
 htaskset.cc:248
 htaskset.cc:249
 htaskset.cc:250
 htaskset.cc:251
 htaskset.cc:252
 htaskset.cc:253
 htaskset.cc:254
 htaskset.cc:255
 htaskset.cc:256
 htaskset.cc:257
 htaskset.cc:258
 htaskset.cc:259
 htaskset.cc:260
 htaskset.cc:261
 htaskset.cc:262
 htaskset.cc:263
 htaskset.cc:264
 htaskset.cc:265
 htaskset.cc:266
 htaskset.cc:267
 htaskset.cc:268
 htaskset.cc:269
 htaskset.cc:270
 htaskset.cc:271
 htaskset.cc:272
 htaskset.cc:273
 htaskset.cc:274
 htaskset.cc:275
 htaskset.cc:276
 htaskset.cc:277
 htaskset.cc:278
 htaskset.cc:279
 htaskset.cc:280
 htaskset.cc:281
 htaskset.cc:282
 htaskset.cc:283
 htaskset.cc:284
 htaskset.cc:285
 htaskset.cc:286
 htaskset.cc:287
 htaskset.cc:288
 htaskset.cc:289
 htaskset.cc:290
 htaskset.cc:291
 htaskset.cc:292
 htaskset.cc:293
 htaskset.cc:294
 htaskset.cc:295
 htaskset.cc:296
 htaskset.cc:297
 htaskset.cc:298
 htaskset.cc:299
 htaskset.cc:300
 htaskset.cc:301
 htaskset.cc:302
 htaskset.cc:303
 htaskset.cc:304
 htaskset.cc:305
 htaskset.cc:306
 htaskset.cc:307
 htaskset.cc:308
 htaskset.cc:309
 htaskset.cc:310
 htaskset.cc:311
 htaskset.cc:312
 htaskset.cc:313
 htaskset.cc:314
 htaskset.cc:315
 htaskset.cc:316
 htaskset.cc:317
 htaskset.cc:318
 htaskset.cc:319
 htaskset.cc:320
 htaskset.cc:321
 htaskset.cc:322
 htaskset.cc:323
 htaskset.cc:324
 htaskset.cc:325
 htaskset.cc:326
 htaskset.cc:327
 htaskset.cc:328
 htaskset.cc:329
 htaskset.cc:330
 htaskset.cc:331
 htaskset.cc:332
 htaskset.cc:333
 htaskset.cc:334
 htaskset.cc:335
 htaskset.cc:336
 htaskset.cc:337
 htaskset.cc:338
 htaskset.cc:339
 htaskset.cc:340
 htaskset.cc:341
 htaskset.cc:342
 htaskset.cc:343
 htaskset.cc:344
 htaskset.cc:345
 htaskset.cc:346
 htaskset.cc:347
 htaskset.cc:348
 htaskset.cc:349
 htaskset.cc:350
 htaskset.cc:351
 htaskset.cc:352
 htaskset.cc:353
 htaskset.cc:354
 htaskset.cc:355
 htaskset.cc:356
 htaskset.cc:357
 htaskset.cc:358
 htaskset.cc:359
 htaskset.cc:360
 htaskset.cc:361
 htaskset.cc:362
 htaskset.cc:363
 htaskset.cc:364
 htaskset.cc:365
 htaskset.cc:366
 htaskset.cc:367
 htaskset.cc:368
 htaskset.cc:369
 htaskset.cc:370
 htaskset.cc:371
 htaskset.cc:372
 htaskset.cc:373
 htaskset.cc:374
 htaskset.cc:375
 htaskset.cc:376
 htaskset.cc:377
 htaskset.cc:378
 htaskset.cc:379
 htaskset.cc:380
 htaskset.cc:381
 htaskset.cc:382
 htaskset.cc:383
 htaskset.cc:384
 htaskset.cc:385
 htaskset.cc:386
 htaskset.cc:387
 htaskset.cc:388
 htaskset.cc:389
 htaskset.cc:390
 htaskset.cc:391
 htaskset.cc:392
 htaskset.cc:393
 htaskset.cc:394
 htaskset.cc:395
 htaskset.cc:396
 htaskset.cc:397
 htaskset.cc:398
 htaskset.cc:399
 htaskset.cc:400
 htaskset.cc:401
 htaskset.cc:402
 htaskset.cc:403
 htaskset.cc:404