hlit-ana  0.0.0
 All Classes Functions Variables Pages
HlitTask.cxx
1 #include <HlitConfig.h>
2 #ifdef USE_OPENMP
3 #include <omp.h>
4 #endif
5 #include <TDirectory.h>
6 #include <TROOT.h>
7 #include <Riostream.h>
8 #include "HlitTask.h"
9 
11 ClassImp(HlitTask);
13 
14 HlitTask::HlitTask() : TTask("task", "Task"), fParent(0), fOutput(0) {}
15 
16 HlitTask::HlitTask(const char *name, const char *title)
17  : TTask(name, title), fParent(0), fOutput(0) {
18 
22  fOutput = new TList();
23  fOutput->SetName("out");
24  fOutput->SetOwner();
25 }
26 
31 }
32 
33 void HlitTask::Add(TTask *task) {
34  if (!task)
35  return;
36 
37  TTask::Add(task);
38 
39  if (task->InheritsFrom(HlitTask::Class())) {
40  ((HlitTask *)task)->SetParent(this);
41  }
42 }
43 
44 void HlitTask::ExecuteTask(Option_t *option) {
45 
49 
50  if (fgBeginTask) {
51  Error("ExecuteTask", "Cannot execute task:%s, already running task: %s",
52  GetName(), fgBeginTask->GetName());
53  return;
54  }
55  if (!IsActive())
56  return;
57 
58  fOption = option;
59  fgBeginTask = this;
60  fgBreakPoint = 0;
61 
62  if (fBreakin)
63  return;
64  if (gDebug > 1) {
65  TROOT::IndentLevel();
66  std::cout << "Execute task:" << GetName() << " : " << GetTitle()
67  << std::endl;
68  TROOT::IncreaseDirLevel();
69  }
70 
71  Exec(option);
72  fHasExecuted = kTRUE;
73  ExecuteTasks(option);
74  ExecPost(option);
75 
76  if (gDebug > 1)
77  TROOT::DecreaseDirLevel();
78  if (fBreakout)
79  return;
80 
81  if (!fgBreakPoint) {
82  fgBeginTask->CleanTasks();
83  fgBeginTask = 0;
84  }
85 }
86 
87 void HlitTask::ExecuteTasks(Option_t *option) {
91 
92  HlitTask *task;
93  Int_t i;
94 #ifdef USE_OPENMP
95 #pragma omp parallel for schedule(guided) private(i, task)
96 #endif
97  for (i = 0; i < fTasks->GetEntries(); i++) {
98  // #ifdef USE_OPENMP
99  // if (!i)
100  // Printf("HlitTask num of threads : %d", omp_get_num_threads());
101  // #endif
102  // Printf("task %d", i);
103  task = (HlitTask *)fTasks->At(i);
104  if (!task->IsActive())
105  continue;
106  if (task->fHasExecuted) {
107  task->ExecuteTasks(option);
108  continue;
109  }
110  if (task->fHasExecuted) {
111  task->ExecuteTasks(option);
112  continue;
113  }
114  task->Exec(option);
115  task->fHasExecuted = kTRUE;
116  task->ExecuteTasks(option);
117  task->ExecPost(option);
118  }
119 
120  // TIter next(fTasks);
121  // HlitTask *task;
122  // while ((task = (HlitTask *)next())) {
123  // if (fgBreakPoint)
124  // return;
125  // if (!task->IsActive())
126  // continue;
127  // if (task->fHasExecuted) {
128  // task->ExecuteTasks(option);
129  // continue;
130  // }
131  // if (task->fBreakin == 1) {
132  // printf("Break at entry of task: %s\n", task->GetName());
133  // fgBreakPoint = this;
134  // task->fBreakin++;
135  // return;
136  // }
137  //
138  // if (gDebug > 1) {
139  // TROOT::IndentLevel();
140  // std::cout << "Execute task:" << task->GetName() << " : "
141  // << task->GetTitle() << std::endl;
142  // TROOT::IncreaseDirLevel();
143  // }
144  // task->Exec(option);
145  // task->fHasExecuted = kTRUE;
146  // task->ExecuteTasks(option);
147  // task->ExecPost(option);
148  // if (gDebug > 1)
149  // TROOT::DecreaseDirLevel();
150  // if (task->fBreakout == 1) {
151  // printf("Break at exit of task: %s\n", task->GetName());
152  // fgBreakPoint = this;
153  // task->fBreakout++;
154  // return;
155  // }
156  // }
157 }
158 
159 void HlitTask::Init(Option_t *option) {
160  TIter next(fTasks);
161  HlitTask *t;
162  while ((t = (HlitTask *)next())) {
163  t->Init(option);
164  }
165 }
166 
167 void HlitTask::Exec(Option_t * /*option*/) {}
168 
169 void HlitTask::ExecPost(Option_t * /*option*/) {}
170 
171 void HlitTask::Finish(Option_t *option) {
172  TIter next(fTasks);
173  HlitTask *t;
174  while ((t = (HlitTask *)next())) {
175  t->Finish(option);
176  }
177 }
178 
179 void HlitTask::Browse(TBrowser *b) {
180  TTask::Browse(b);
181  if (fOutput)
182  fOutput->Browse(b);
183 }
184 
185 void HlitTask::Export(TDirectory *parent) {
186 
187  if (!parent)
188  return;
189  TDirectory *out = parent->mkdir(GetName(), GetTitle());
190  if (!out)
191  return;
192 
193  TIter next(fTasks);
194  HlitTask *t;
195  while ((t = (HlitTask *)next())) {
196  t->Export(out);
197  }
198  out->cd();
199  if (fOutput)
200  fOutput->Write();
201 
202  parent->cd();
203 }
virtual void Add(TTask *task)
Adds task.
Definition: HlitTask.cxx:33
virtual void Browse(TBrowser *b)
Browse elements.
Definition: HlitTask.cxx:179
Base task.
Definition: HlitTask.h:13
virtual void ExecuteTask(Option_t *option)
Definition: HlitTask.cxx:44
virtual void Finish(Option_t *option)
User&#39;s function executed after all sub tasks.
Definition: HlitTask.cxx:171
virtual void ExecuteTasks(Option_t *option)
Definition: HlitTask.cxx:87
virtual void Init(Option_t *option)
Init function.
Definition: HlitTask.cxx:159
virtual void Export(TDirectory *root)
Export tasks to TDirectory.
Definition: HlitTask.cxx:185
virtual ~HlitTask()
Definition: HlitTask.cxx:27
TList * fOutput
Output.
Definition: HlitTask.h:88
virtual void Exec(Option_t *option)
User&#39;s function.
Definition: HlitTask.cxx:167
virtual void ExecPost(Option_t *option)
User&#39;s function executed after all sub tasks.
Definition: HlitTask.cxx:169