ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtPulseTask.cxx
Go to the documentation of this file.
1 #include "AtPulseTask.h"
2 
3 #include "AtDigiPar.h" // for AtDigiPar
4 #include "AtElectronicResponse.h" // for ElectronicResponse
5 #include "AtMCPoint.h" // for AtMCPoint
6 #include "AtMap.h" // for AtMap
7 #include "AtPulse.h" // for AtPulse, AtPulse::AtMapPtr
8 #include "AtRawEvent.h" // for AtRawEvent
9 #include "AtSimulatedPoint.h" // for AtSimulatedPoint
10 
11 #include <FairLogger.h> // for LOG, Logger
12 #include <FairParSet.h> // for FairParSet
13 #include <FairRootManager.h> // for FairRootManager
14 #include <FairRunAna.h> // for FairRunAna
15 #include <FairRuntimeDb.h> // for FairRuntimeDb
16 #include <FairTask.h> // for kFATAL, FairTask, InitStatus, kSUC...
17 
18 #include <Math/Point2D.h> // for PositionVector2D
19 #include <Math/Point2Dfwd.h> // for XYPoint
20 #include <Math/Vector3D.h> // for DisplacementVector3D
21 #include <Math/Vector3Dfwd.h> // for XYZVector
22 #include <TClonesArray.h> // for TClonesArray
23 #include <TObject.h> // for TObject
24 
25 #include <algorithm> // for max
26 #include <iostream> // for operator<<, basic_ostream::operator<<
27 #include <utility> // for pair, make_pair, move
28 #include <vector> // for vector
29 
30 constexpr auto cRED = "\033[1;31m";
31 constexpr auto cYELLOW = "\033[1;33m";
32 constexpr auto cNORMAL = "\033[0m";
33 constexpr auto cGREEN = "\033[1;32m";
34 
35 using namespace ElectronicResponse;
37 
38 AtPulseTask::AtPulseTask(std::shared_ptr<AtPulse> pulse)
39  : FairTask("AtPulseTask"), fPulse(std::move(pulse)), fRawEventArray(TClonesArray("AtRawEvent", 1))
40 {
41 }
42 
44 {
45  FairRunAna *ana = FairRunAna::Instance();
46  FairRuntimeDb *rtdb = ana->GetRuntimeDb();
47  fPar = dynamic_cast<AtDigiPar *>(rtdb->getContainer("AtDigiPar"));
48  if (fPar == nullptr)
49  LOG(fatal) << "Could not get the parameter container "
50  << "AtDigiPar";
51 }
52 
53 InitStatus AtPulseTask::Init()
54 {
55  LOG(INFO) << "Initilization of AtPulseTask";
56  FairRootManager *ioman = FairRootManager::Instance();
57 
58  fSimulatedPointArray = dynamic_cast<TClonesArray *>(ioman->GetObject("AtSimulatedPoint"));
59  if (fSimulatedPointArray == nullptr) {
60  LOG(fatal) << "ERROR: Cannot find fSimulatedPointArray array!";
61  return kFATAL;
62  }
63 
64  ioman->Register("AtRawEvent", "cbmsim", &fRawEventArray, fIsPersistent);
65 
66  fPulse->SetParameters(fPar);
67 
68  // Retrieve kinematics for each simulated point
69  fMCPointArray = dynamic_cast<TClonesArray *>(ioman->GetObject("AtTpcPoint"));
70  if (fMCPointArray == nullptr && fSaveMCInfo) {
71  LOG(fatal) << "Cannot find fMCPointArray array!";
72  return kFATAL;
73  }
74  if (fMCPointArray != nullptr)
75  ioman->Register("AtTpcPoint", "cbmsim", fMCPointArray, fIsPersistentAtTpcPoint);
76 
77  ioman->Register("AtTpcPoint", "cbmsim", fMCPointArray, fIsPersistentAtTpcPoint);
78 
79  LOG(info) << " AtPulseTask : Initialization of parameters complete!";
80  return kSUCCESS;
81 }
82 
83 void AtPulseTask::Exec(Option_t *option)
84 {
85  LOG(debug) << "Exec of AtPulseTask";
86  reset();
87 
88  Int_t nMCPoints = fSimulatedPointArray->GetEntries();
89  LOG(info) << "AtPulseTask: Number of Points " << nMCPoints;
90 
91  // Distributing electron pulses among the pads
92  // Create a vector of simPoints to pass
93  std::vector<AtSimulatedPoint *> simPoints;
94  for (Int_t i = 0; i < nMCPoints; i++) {
95  simPoints.push_back(dynamic_cast<AtSimulatedPoint *>(fSimulatedPointArray->At(i)));
96  if (fSaveMCInfo)
97  FillPointsMap(simPoints.back());
98  }
99  auto rawEvent = fPulse->GenerateEvent(simPoints);
100 
101  LOG(info) << "...End of collection of electrons in this event." << std::endl;
102 
103  rawEvent.SetEventID(fEventID);
104  if (fSaveMCInfo)
105  rawEvent.SetSimMCPointMap(MCPointsMap);
106  rawEvent.SetIsGood(true);
107 
108  new (fRawEventArray[0]) AtRawEvent(std::move(rawEvent));
109 
110  std::cout << "AtPulseTask Event ID : " << fEventID << "\n";
111  ++fEventID;
112 }
113 
115 {
116  auto pos = XYPoint(point->GetPosition().X(), point->GetPosition().Y());
117  int padNum = fPulse->GetMap()->GetPadNum(pos);
118  auto mcPoint = dynamic_cast<AtMCPoint *>(fMCPointArray->At(point->GetMCPointID()));
119  saveMCInfo(point->GetMCPointID(), padNum, mcPoint->GetTrackID());
120 }
121 
122 void AtPulseTask::saveMCInfo(int mcPointID, int padNumber, int trackID)
123 {
124  // Count occurrences of simPoints coming from the same mcPoint
125  int count = 0;
126 
127  // The same MC point ID is saved per pad only once, but duplicates are allowed in other pads
128  for (auto it = MCPointsMap.lower_bound(padNumber); it != MCPointsMap.upper_bound(padNumber); ++it) {
129  auto mcPointMap = dynamic_cast<AtMCPoint *>(fMCPointArray->At(mcPointID));
130  auto trackIDMap = mcPointMap->GetTrackID();
131  if (it->second == mcPointID || (trackID == trackIDMap)) {
132  ++count;
133  break;
134  }
135  }
136 
137  // insert if the mcPointID and trackID do not both match any existing point
138  if (count == 0)
139  MCPointsMap.insert(std::make_pair(padNumber, mcPointID));
140 }
141 
143 {
144  MCPointsMap.clear();
145  fRawEventArray.Delete();
146 }
147 
AtPulseTask::MCPointsMap
std::multimap< Int_t, std::size_t > MCPointsMap
[padNum] = mcPointID
Definition: AtPulseTask.h:47
AtRawEvent.h
AtPulseTask::fPar
AtDigiPar * fPar
Definition: AtPulseTask.h:50
AtPulseTask::fPulse
std::shared_ptr< AtPulse > fPulse
Definition: AtPulseTask.h:49
cRED
constexpr auto cRED
Definition: AtPulseTask.cxx:30
AtElectronicResponse.h
AtPulseTask::saveMCInfo
void saveMCInfo(int mcPointID, int padNumber, int trackID)
Definition: AtPulseTask.cxx:122
XYPoint
ROOT::Math::XYPoint XYPoint
Definition: AtPatternCircle2D.cxx:16
AtSimulatedPoint::GetMCPointID
std::size_t GetMCPointID()
Definition: AtSimulatedPoint.cxx:50
AtPulseTask::fIsPersistentAtTpcPoint
Bool_t fIsPersistentAtTpcPoint
If true, save container.
Definition: AtPulseTask.h:40
AtRawEvent
Definition: AtRawEvent.h:34
AtPulseTask::fRawEventArray
TClonesArray fRawEventArray
Raw Event array (only one)
Definition: AtPulseTask.h:45
cGREEN
constexpr auto cGREEN
Definition: AtPulseTask.cxx:33
AtSimulatedPoint.h
AtSimulatedPoint
Definition: AtSimulatedPoint.h:16
AtPulseTask::fSaveMCInfo
Bool_t fSaveMCInfo
< Propagates MC information (adds AtTpcPoint branch to output
Definition: AtPulseTask.h:41
cNORMAL
constexpr auto cNORMAL
Definition: AtPulseTask.cxx:32
AtPulseTask::fIsPersistent
Bool_t fIsPersistent
EventID.
Definition: AtPulseTask.h:39
AtDigiPar.h
AtPulseTask::Init
virtual InitStatus Init() override
Initiliazation of task at the beginning of a run.
Definition: AtPulseTask.cxx:53
AtDigiPar
Definition: AtDigiPar.h:14
AtPulseTask::AtPulseTask
AtPulseTask(std::shared_ptr< AtPulse > pulse)
Definition: AtPulseTask.cxx:38
AtPulseTask::fMCPointArray
TClonesArray * fMCPointArray
MC Point Array (input)
Definition: AtPulseTask.h:44
AtPulseTask::SetParContainers
virtual void SetParContainers() override
Load the parameter container from the runtime database.
Definition: AtPulseTask.cxx:43
AtPulseTask::FillPointsMap
void FillPointsMap(AtSimulatedPoint *point)
Definition: AtPulseTask.cxx:114
AtMCPoint.h
ClassImp
ClassImp(AtPulseTask)
AtSimulatedPoint::GetPosition
virtual ROOT::Math::XYZVector GetPosition()
Definition: AtSimulatedPoint.cxx:46
cYELLOW
constexpr auto cYELLOW
Definition: AtPulseTask.cxx:31
XYPoint
ROOT::Math::XYPoint XYPoint
Definition: AtPulseTask.cxx:36
AtPulseTask::fEventID
Int_t fEventID
Definition: AtPulseTask.h:38
AtMap.h
AtPulseTask::fSimulatedPointArray
TClonesArray * fSimulatedPointArray
drifted electron array (input)
Definition: AtPulseTask.h:43
AtPulseTask::Exec
virtual void Exec(Option_t *opt) override
Executed for each event.
Definition: AtPulseTask.cxx:83
AtMCPoint
Definition: AtMCPoint.h:26
AtPulseTask.h
AtPulseTask
Definition: AtPulseTask.h:30
AtPulseTask::reset
void reset()
Definition: AtPulseTask.cxx:142
ElectronicResponse
Definition: AtVectorResponse.h:8
AtPulse.h