PandaRoot
PndProcessTask.h
Go to the documentation of this file.
1 #ifndef PNDPROCESSTASK_H
2 #define PNDPROCESSTASK_H
3 
4 #include <algorithm>
5 #include <iterator>
6 #include <stdexcept>
7 #include <string>
8 #include <vector>
9 
10 #include "TClonesArray.h"
11 #include "TString.h"
12 
13 #include "FairLogger.h"
14 #include "FairRun.h"
15 #include "FairRuntimeDb.h"
16 
17 #include "PndPersistencyTask.h"
18 #include "PndProcess.h"
19 #include "PndProcessHandler.h"
20 
27 template <class DataStruct>
28 class PndProcessTask : public PndPersistencyTask, public PndProcessHandler<DataStruct> {
29  public:
30  PndProcessTask(const std::string &t_detectorName);
31  virtual ~PndProcessTask();
32 
39  virtual InitStatus Init() /*override*/ final;
40 
45  virtual void Exec(Option_t *t_opt = nullptr) /*override*/;
46 
51  virtual void Finish() /*override*/;
52 
53  protected:
58  void SetParContainers() /*override*/ final;
59 
64  virtual void PreProcessing(Option_t * /*unused*/);
65 
70  virtual void PostProcessing(Option_t * /*unused*/);
71 
76  virtual void SetupDataArrays() = 0;
77 
78  private:
79  ClassDef(PndProcessTask, 1);
80 };
81 
82 template <class DataStruct>
83 PndProcessTask<DataStruct>::PndProcessTask(const std::string &t_detectorName) : PndPersistencyTask(), PndProcessHandler<DataStruct>(t_detectorName)
84 {
85 }
86 
87 template <class DataStruct>
89 {
90 }
91 
92 template <class DataStruct>
94 {
95  InitStatus result = kSUCCESS;
96  try {
98  this->SetupProcesses();
99  } catch (const std::exception &e) {
100  result = kERROR;
101  }
102  return result;
103 }
104 
105 template <class DataStruct>
106 void PndProcessTask<DataStruct>::Exec(Option_t *t_option)
107 {
108  PreProcessing(t_option);
109  this->CallProcesses();
110  PostProcessing(t_option);
111 }
112 
113 template <class DataStruct>
115 {
116  LOG(INFO) << "PndProcessTask: Finish - " << this->fDetectorName;
117  for (PndProcess<DataStruct> *process : this->fProcesses) {
118  process->TearDown();
119  }
120 }
121 
122 template <class DataStruct>
123 void PndProcessTask<DataStruct>::PreProcessing(Option_t * /*unused*/)
124 {
125  LOG(trace) << "PndProcessTask: PreProcessing - " << this->fDetectorName;
126 }
127 
128 template <class DataStruct>
130 {
131  LOG(trace) << "PndProcessTask: PostProcessing - " << this->fDetectorName;
132 }
133 
134 template <class DataStruct>
136 {
137  // Get run and runtime database
138  FairRun *run = FairRun::Instance();
139  if (run == nullptr) {
140  Fatal("SetParContainers", "No analysis run");
141  }
142  FairRuntimeDb *db = run->GetRuntimeDb();
143  if (db == nullptr) {
144  Fatal("SetParContainers", "No runtime database");
145  }
146 
147  LOG(DEBUG) << "PndProcessTask - " << this->fDetectorName << " SetParContainers()";
148  for (const std::string &parameterName : this->fParameterRegister->GetRequestList()) {
149  LOG(DEBUG) << parameterName;
150  this->fParameterRegister->SetParameter(parameterName, db->getContainer(parameterName.c_str()));
151  }
152 }
153 
154 #endif /*PNDPROCESSTASK_H*/
Base Process class.
Definition: PndProcess.h:24
Task based version of a PndProcessHandler.
virtual void SetupDataArrays()=0
Define which data containers need to be fetched from the FairRootManager, pass the data container add...
virtual ~PndProcessTask()
PndProcessTask(const std::string &t_detectorName)
void SetParContainers() final
Fetch the FairRuntimeDb and populate the PndParameterRegister with all requested parameter. Has to be called before Init()
std::unique_ptr< PndParameterRegister > fParameterRegister
virtual void Finish()
End the task, call TearDown for all PndProcesses.
void SetupProcesses()
Call for each PndProcess the SetData and SetupParameter.
virtual void Exec(Option_t *t_opt=nullptr)
Prepare Task for processing of PndProcess (e.g. reset data arrays), process the PndProcesses and do c...
void CallProcesses()
Call for all PndProcesses the PreProcess/Process/PosProcess functions.
std::string fDetectorName
virtual void PostProcessing(Option_t *)
Do some task post clean up after PndProcesses are run once per event.
std::vector< PndProcess< DataStruct > * > fProcesses
Base class for classes handling a set of PndProcesses.
virtual InitStatus Init() final
Initialise this task. This must be called AFTER SetParContainers(), otherwise we will try to pass the...
virtual void PreProcessing(Option_t *)
Do some task preparation before PndProcesses are run once per event.