ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtFilterTask.cxx
Go to the documentation of this file.
1 #include "AtFilterTask.h"
2 
3 #include "AtAuxPad.h"
4 #include "AtBaseEvent.h"
5 #include "AtFilter.h"
6 #include "AtPadReference.h" // for operator<<
7 #include "AtRawEvent.h"
8 
9 #include <FairLogger.h>
10 #include <FairRootManager.h>
11 #include <FairTask.h>
12 
13 #include <TClonesArray.h>
14 #include <TObject.h>
15 
16 #include <iostream>
17 #include <map>
18 #include <memory>
19 #include <unordered_map> // for _Node_iterator, operator!=, unordered_map
20 #include <utility>
21 #include <vector>
22 
23 class AtPad;
24 
26 
27 AtFilterTask::AtFilterTask(AtFilter *filter, const char *name)
28  : FairTask(name), fOutputEventArray(new TClonesArray("AtRawEvent")), fFilter(filter)
29 {
30 }
31 
32 InitStatus AtFilterTask::Init()
33 {
34  FairRootManager *ioManager = FairRootManager::Instance();
35 
36  if (ioManager == nullptr) {
37  LOG(ERROR) << "Cannot find RootManager!" << std::endl;
38  return kERROR;
39  }
40 
41  // Get the old data from the io manager
42  fInputEventArray = dynamic_cast<TClonesArray *>(ioManager->GetObject(fInputBranchName));
43  if (fInputEventArray == nullptr) {
44  LOG(fatal) << "AtFilterTask: Cannot find AtRawEvent array!";
45  return kFATAL;
46  }
47 
48  // Set the raw event array, and new output event array
49  ioManager->Register(fOutputBranchName, "AtTPC", fOutputEventArray, fIsPersistent);
50 
51  fFilter->Init();
52 
53  return kSUCCESS;
54 }
55 
56 void AtFilterTask::Exec(Option_t *opt)
57 {
58  fOutputEventArray->Delete();
59 
60  if (fInputEventArray->GetEntriesFast() == 0)
61  return;
62 
63  auto rawEvent = dynamic_cast<AtRawEvent *>(fInputEventArray->At(0));
64  fFilter->InitEvent(rawEvent); // Can modify rawEvent if necessary (shouldn't touch traces)
65  auto filteredEvent = fFilter->ConstructOutputEvent(fOutputEventArray, rawEvent);
66 
67  if (!rawEvent->IsGood())
68  return;
69 
70  if (fFilterAux)
71  for (auto &padIt : filteredEvent->fAuxPadMap) {
72  AtPad *pad = &(padIt.second);
73  fFilter->Filter(pad);
74  }
75 
76  if (fFilterFPN)
77  for (auto &[ref, pad] : filteredEvent->fFpnMap) {
78  LOG(debug) << "Filtering " << ref;
79  AtPadReference padRef = ref;
80  fFilter->Filter(&pad, &padRef);
81  }
82 
83  if (fFilterPads)
84  for (auto &pad : filteredEvent->fPadList)
85  fFilter->Filter(pad.get());
86 
87  auto isGood = filteredEvent->IsGood() && fFilter->IsGoodEvent();
88  filteredEvent->SetIsGood(isGood);
89 }
AtFilterTask.h
AtRawEvent.h
AtBaseEvent.h
AtAuxPad.h
AtPadReference.h
ClassImp
ClassImp(AtFilterTask)
AtFilterTask::Exec
virtual void Exec(Option_t *opt) override
Definition: AtFilterTask.cxx:56
AtRawEvent
Definition: AtRawEvent.h:34
AtFilter
Definition: AtFilter.h:13
AtFilter::InitEvent
virtual void InitEvent(AtRawEvent *inputEvent)=0
Called once for each event at the start of the Exec phase.
AtFilter.h
AtFilter::IsGoodEvent
virtual bool IsGoodEvent()=0
Called at the end of an event. Returns if filtering was successful.
AtFilterTask
Definition: AtFilterTask.h:15
AtPad
Container class for AtPadBase objects.
Definition: AtPad.h:38
AtFilterTask::AtFilterTask
AtFilterTask(AtFilter *filter, const char *name="AtFilterTask")
Definition: AtFilterTask.cxx:27
AtFilter::ConstructOutputEvent
virtual AtRawEvent * ConstructOutputEvent(TClonesArray *outputEventArray, AtRawEvent *inputEvent)
Construct output event from input event array.
Definition: AtFilter.cxx:7
AtFilter::Init
virtual void Init()=0
Called at the init stage of the AtFilterTask.
AtPadReference
Definition: AtPadReference.h:20
AtFilter::Filter
virtual void Filter(AtPad *pad, AtPadReference *padReference=nullptr)=0
Called to filter each pad.
AtFilterTask::Init
virtual InitStatus Init() override
Definition: AtFilterTask.cxx:32