ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtFissionTask.cxx
Go to the documentation of this file.
1 #include "AtFissionTask.h"
2 
3 #include "AtEvent.h"
4 #include "AtFissionEvent.h"
5 #include "AtHit.h" // for AtHit
6 #include "AtPatternEvent.h" // for AtPatternEvent
7 
8 #include <FairLogger.h> // for LOG, Logger
9 #include <FairRootManager.h> // for FairRootManager
10 
11 #include <TObject.h> // for TObject
12 
13 #include <algorithm> // for sort, find_if
14 #include <utility> // for move
15 
17  : FairTask("AtFissionTask"), fFissionEventArray("AtFissionEvent", 1), fLambda(lambda)
18 {
19 }
20 
21 InitStatus AtFissionTask::Init()
22 {
23  FairRootManager *ioMan = FairRootManager::Instance();
24  if (ioMan == nullptr) {
25  LOG(fatal) << "Cannot find RootManager!";
26  return kFATAL;
27  }
28 
29  fPatternEventArray = dynamic_cast<TClonesArray *>(ioMan->GetObject(fPatternBranch));
30  if (fPatternEventArray == nullptr) {
31  LOG(fatal) << "Cannot find AtPatternEvent array in branch " << fPatternBranch << "!";
32  return kFATAL;
33  }
34  fEventArray = dynamic_cast<TClonesArray *>(ioMan->GetObject(fEventBranch));
35  if (fEventArray == nullptr) {
36  LOG(fatal) << "Cannot find AtPatternEvent array in branch " << fEventBranch << "!";
37  return kFATAL;
38  }
39 
40  ioMan->Register(fOutBranch, "AtTPC", &fFissionEventArray, fIsPersistant);
41 
42  return kSUCCESS;
43 }
44 
49 {
50  auto beamHits = event->GetBeamHitsCorr();
51  std::sort(beamHits.begin(), beamHits.end(),
52  [](const AtHit *a, const AtHit *b) { return a->GetHitID() < b->GetHitID(); });
53  return beamHits;
54 }
55 
56 std::vector<AtHit *> AtFissionTask::GetSortedFragmentHits(AtFissionEvent *event, int fragID)
57 {
58  auto hits = event->GetFragHitsCorr(fragID);
59  std::sort(hits.begin(), hits.end(), [](const AtHit *a, const AtHit *b) { return a->GetHitID() < b->GetHitID(); });
60  return hits;
61 }
62 
63 void AtFissionTask::Exec(Option_t *opt)
64 {
65  fFissionEventArray.Clear();
66  auto *fissionEvent = dynamic_cast<AtFissionEvent *>(fFissionEventArray.ConstructedAt(0));
67  if (fissionEvent == nullptr) {
68  LOG(fatal) << "Failed to create or load a fission event in the branch.";
69  return;
70  }
71 
72  auto *patternEvent = dynamic_cast<AtPatternEvent *>(fPatternEventArray->At(0));
73  if (patternEvent == nullptr) {
74  LOG(fatal) << "Failed to load an AtPatternEvent in the branch.";
75  return;
76  }
77 
78  auto *event = dynamic_cast<AtEvent *>(fEventArray->At(0));
79  if (event == nullptr) {
80  LOG(fatal) << "Failed to load an AtEvent in the branch.";
81  return;
82  }
83 
84  // Skip if event is not good
85  if (!event->IsGood())
86  return;
87 
88  try {
89  // Copy this pattern event into our fission event
90  *fissionEvent = AtFissionEvent(*patternEvent);
91  fissionEvent->SetLambda(fLambda);
92 
93  // This is the vector we will search through for the hits to clone into our fission event
94  event->SortHitArrayID();
95  auto &uncorrHits = event->GetHits();
96 
97  // Get this hits associated with the beam and copy the uncorrected version of them
98  auto clonedHits = GetMatchingHits(GetSortedBeamHits(fissionEvent), uncorrHits);
99  fissionEvent->SetBeamHits(std::move(clonedHits));
100 
101  // Get this hits associated with the fragments and copy the uncorrected version of them
102  for (int i = 0; i < 2; ++i) {
103  clonedHits = GetMatchingHits(GetSortedFragmentHits(fissionEvent, i), uncorrHits);
104  fissionEvent->SetFragHits(i, std::move(clonedHits));
105  }
106  } catch (...) {
107  LOG(error) << "Failed to create a fission event for event " << event->GetEventID();
108  }
109 }
110 
112 AtFissionTask::GetMatchingHits(const std::vector<AtHit *> hitsToFind, const HitVector &hitsToClone)
113 {
114  auto lastHit = hitsToClone.begin();
115  HitVector ret;
116  for (auto hit : hitsToFind) {
117  auto hitIt = std::find_if(lastHit, hitsToClone.end(), [hit](const std::unique_ptr<AtHit> &hit2) {
118  return hit->GetHitID() == hit2->GetHitID();
119  });
120 
121  if (hitIt == hitsToClone.end())
122  continue;
123 
124  ret.push_back(hitIt->get()->Clone());
125  lastHit = hitIt;
126  }
127  return ret;
128 }
AtFissionTask::fEventBranch
TString fEventBranch
Definition: AtFissionTask.h:27
AtFissionTask::GetSortedBeamHits
std::vector< AtHit * > GetSortedBeamHits(AtFissionEvent *event)
Definition: AtFissionTask.cxx:48
AtPatternEvent
Definition: AtPatternEvent.h:19
AtEvent.h
AtFissionTask::fPatternEventArray
TClonesArray * fPatternEventArray
Definition: AtFissionTask.h:30
AtFissionEvent.h
AtFissionTask::HitVector
std::vector< std::unique_ptr< AtHit > > HitVector
Definition: AtFissionTask.h:50
AtFissionTask::AtFissionTask
AtFissionTask(double fLambda=0)
Definition: AtFissionTask.cxx:16
AtEvent
Definition: AtEvent.h:22
AtFissionTask::GetMatchingHits
static HitVector GetMatchingHits(const std::vector< AtHit * > hitsToFind, const HitVector &hitsToClone)
Definition: AtFissionTask.cxx:112
AtFissionTask::GetSortedFragmentHits
std::vector< AtHit * > GetSortedFragmentHits(AtFissionEvent *event, int fragID)
Definition: AtFissionTask.cxx:56
AtFissionTask::Exec
virtual void Exec(Option_t *opt)
Definition: AtFissionTask.cxx:63
AtFissionTask::fEventArray
TClonesArray * fEventArray
Definition: AtFissionTask.h:31
AtFissionTask::Init
virtual InitStatus Init()
Definition: AtFissionTask.cxx:21
AtFissionTask::fLambda
Double_t fLambda
Definition: AtFissionTask.h:34
AtFissionTask::fPatternBranch
TString fPatternBranch
Definition: AtFissionTask.h:26
AtHit.h
AtFissionTask::fIsPersistant
Bool_t fIsPersistant
Definition: AtFissionTask.h:33
AtPatternEvent.h
AtFissionTask.h
AtFissionTask::fOutBranch
TString fOutBranch
Definition: AtFissionTask.h:25
AtFissionEvent
Definition: AtFissionEvent.h:29
AtFissionTask::fFissionEventArray
TClonesArray fFissionEventArray
Definition: AtFissionTask.h:29
AtHit
Point in space with charge.
Definition: AtHit.h:27