ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtPRAtask.cxx
Go to the documentation of this file.
1 #include "AtPRAtask.h"
2 
3 #include "AtDigiPar.h" // for AtDigiPar
4 #include "AtEvent.h" // for AtEvent
5 #include "AtPRA.h" // for AtPRA
6 #include "AtPatternEvent.h" // for AtPatternEvent
7 #include "AtTrackFinderTC.h" // for AtTrackFinderHC
8 
9 #include <FairLogger.h> // for LOG, FairLogger
10 #include <FairRootManager.h> // for FairRootManager
11 #include <FairRun.h> // for FairRun
12 #include <FairRuntimeDb.h> // for FairRuntimeDb
13 
14 #include <TObject.h> // for TObject
15 
16 #include <iostream> // for operator<<, basic_ostream, cout, ostream
17 #include <memory> // for unique_ptr<>::element_type, unique_ptr
18 #include <stdexcept> // for runtime_error
19 #include <utility> // for move
20 #include <vector> // for allocator, vector
21 
23  : fInputBranchName("AtEventH"), fOutputBranchName("AtPatternEvent"), FairTask("AtPRAtask"),
24  fPatternEventArray("AtPatternEvent", 1)
25 {
26 
27  LOG(debug) << "Default Constructor of AtPRAtask";
28  fPar = nullptr;
29  fPRAlgorithm = 0;
30  kIsPersistence = kFALSE;
31  fMinNumHits = 10;
32  fMaxNumHits = 5000;
33 
34  fHCs = 0.3;
35  fHCk = 19;
36  fHCn = 2;
37  fHCm = 15;
38  fHCr = 2.0;
39  fHCa = 0.03;
40  fHCt = 4.0;
41  fHCpadding = 0.0;
42 
43  kSetPrunning = kFALSE;
44  fKNN = 5;
45  fStdDevMulkNN = 0.0;
46  fkNNDist = 10.0;
47 }
48 
50 {
51  LOG(debug) << "Destructor of AtPRAtask";
52 }
53 
54 void AtPRAtask::SetPersistence(Bool_t value)
55 {
56  kIsPersistence = value;
57 }
58 void AtPRAtask::SetPRAlgorithm(Int_t value)
59 {
60  fPRAlgorithm = value;
61 }
62 
64 {
65  LOG(debug) << "SetParContainers of AtPRAtask";
66 
67  FairRun *run = FairRun::Instance();
68  if (!run)
69  LOG(fatal) << "No analysis run!";
70 
71  FairRuntimeDb *db = run->GetRuntimeDb(); // NOLINT
72  if (!db)
73  LOG(fatal) << "No runtime database!";
74 
75  fPar = (AtDigiPar *)db->getContainer("AtDigiPar"); // NOLINT
76  if (!fPar)
77  LOG(fatal) << "AtDigiPar not found!!";
78 }
79 
80 InitStatus AtPRAtask::Init()
81 {
82  LOG(debug) << "Initilization of AtPRAtask";
83 
84  if (fPRAlgorithm == 0) {
85  LOG(info) << "Using Track Finder TriplClust algorithm";
86 
87  fPRA = new AtPATTERN::AtTrackFinderTC();
88  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetTcluster(fHCt);
89  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetScluster(fHCs);
90  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetKtriplet(fHCk);
91  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetNtriplet(fHCn);
92  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetMcluster(fHCm);
93  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetRsmooth(fHCr);
94  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetAtriplet(fHCa);
95  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetPadding(fHCpadding);
96 
97  std::cout << " Track Finder TriplClust parameters (see Dalitz et al.) "
98  << "\n";
99  std::cout << " T Cluster : " << fHCt << "\n";
100  std::cout << " S Cluster : " << fHCs << "\n";
101  std::cout << " K Triplet : " << fHCk << "\n";
102  std::cout << " N Triplet : " << fHCn << "\n";
103  std::cout << " M Cluster : " << fHCm << "\n";
104  std::cout << " R Smooth : " << fHCr << "\n";
105  std::cout << " A Triplet : " << fHCa << "\n";
106 
107  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetClusterRadius(fClusterRadius);
108  dynamic_cast<AtPATTERN::AtTrackFinderTC *>(fPRA)->SetClusterDistance(fClusterDistance);
109 
110  std::cout << " Track finder - Parameters for clusterization "
111  << "\n";
112  std::cout << " Cluster radius " << fClusterRadius << "\n";
113  std::cout << " Cluster distance " << fClusterDistance << "\n";
114 
115  } else if (fPRAlgorithm == 1) {
116  LOG(info) << "Using RANSAC algorithm";
117 
118  } else if (fPRAlgorithm == 2) {
119  LOG(info) << "Using Hough transform algorithm";
120  // fPSA = new AtPSAProto();
121  }
122 
123  // Prunning options
124  std::cout << " Track prunning : " << kSetPrunning << "\n";
125  if (kSetPrunning) {
126  fPRA->SetPrunning();
127  std::cout << " Number of k-nearest neighbors (kNN) : " << fKNN << "\n";
128  fPRA->SetkNN(fKNN);
129  std::cout << " Std deviation multiplier : " << fStdDevMulkNN << "\n";
130  fPRA->SetStdDevMulkNN(fStdDevMulkNN);
131  std::cout << " kNN Distance threshold : " << fkNNDist << "\n";
132  fPRA->SetkNNDist(fkNNDist);
133  }
134 
135  // Get a handle from the IO manager
136  FairRootManager *ioMan = FairRootManager::Instance();
137  if (ioMan == nullptr) {
138  LOG(error) << "Cannot find RootManager!";
139  return kERROR;
140  }
141 
142  fEventHArray = dynamic_cast<TClonesArray *>(ioMan->GetObject(fInputBranchName));
143  if (fEventHArray == nullptr) {
144  LOG(error) << "Cannot find AtEvent array!";
145  return kERROR;
146  }
147 
148  ioMan->Register(fOutputBranchName, "AtTPC", &fPatternEventArray, kIsPersistence);
149 
150  return kSUCCESS;
151 }
152 
153 void AtPRAtask::Exec(Option_t *option)
154 {
155  LOG(debug) << "Exec of AtPRAtask";
156 
157  fPatternEventArray.Delete();
158 
159  if (fEventHArray->GetEntriesFast() == 0)
160  return;
161 
162  AtEvent &event = *(dynamic_cast<AtEvent *>(fEventHArray->At(0))); // TODO: Make sure we are not copying
163  auto &hitArray = event.GetHits();
164 
165  std::cout << " -I- AtPRAtask - Event Number : " << event.GetEventID() << "\n";
166 
167  try {
168 
169  if (hitArray.size() > fMinNumHits && hitArray.size() < fMaxNumHits) {
170  auto patternEvent = fPRA->FindTracks(event);
171  new (fPatternEventArray[0]) AtPatternEvent(std::move(*patternEvent));
172  }
173 
174  } catch (std::runtime_error e) {
175  std::cout << "Analyzation failed! Error: " << e.what() << std::endl;
176  }
177 
178  // fEvent = (AtEvent *) fEventHArray -> At(0);
179 }
180 
182 {
183  LOG(debug) << "Finish of AtPRAtask";
184 }
AtPRAtask::SetPersistence
void SetPersistence(Bool_t value=kTRUE)
Definition: AtPRAtask.cxx:54
AtPRAtask::AtPRAtask
AtPRAtask()
Definition: AtPRAtask.cxx:22
AtPatternEvent
Definition: AtPatternEvent.h:19
AtPRAtask::SetPadding
void SetPadding(size_t padding)
Definition: AtPRAtask.h:87
AtEvent.h
AtPRAtask::SetRsmooth
void SetRsmooth(float r)
Definition: AtPRAtask.h:84
AtPRAtask.h
AtPATTERN::AtPRA::SetkNN
void SetkNN(Double_t knn)
Definition: AtPRA.h:61
AtPATTERN::AtPRA::SetPrunning
void SetPrunning()
Definition: AtPRA.h:64
AtPATTERN::AtPRA::SetkNNDist
void SetkNNDist(Double_t dist)
Definition: AtPRA.h:63
AtPRA.h
AtPRAtask::SetNtriplet
void SetNtriplet(size_t n)
Definition: AtPRAtask.h:82
AtEvent
Definition: AtEvent.h:22
AtPRAtask::Init
virtual InitStatus Init()
Definition: AtPRAtask.cxx:80
AtPATTERN::AtPRA::SetStdDevMulkNN
void SetStdDevMulkNN(Double_t stdDevMul)
Definition: AtPRA.h:62
AtPRAtask::~AtPRAtask
~AtPRAtask()
Definition: AtPRAtask.cxx:49
AtPRAtask::SetParContainers
virtual void SetParContainers()
Definition: AtPRAtask.cxx:63
AtTrackFinderTC.h
AtEvent::GetHits
const HitVector & GetHits() const
Definition: AtEvent.h:116
AtDigiPar.h
AtDigiPar
Definition: AtDigiPar.h:14
AtPRAtask::SetAtriplet
void SetAtriplet(float a)
Definition: AtPRAtask.h:85
AtPatternEvent.h
AtPRAtask::SetMcluster
void SetMcluster(size_t m)
Definition: AtPRAtask.h:83
AtPRAtask::SetClusterRadius
void SetClusterRadius(Double_t clusterRadius)
Definition: AtPRAtask.h:97
AtPRAtask::Finish
virtual void Finish()
Definition: AtPRAtask.cxx:181
AtPRAtask::SetClusterDistance
void SetClusterDistance(Double_t clusterDistance)
Definition: AtPRAtask.h:98
AtPRAtask::SetScluster
void SetScluster(float s)
Definition: AtPRAtask.h:80
AtPRAtask::SetPRAlgorithm
void SetPRAlgorithm(Int_t value=0)
Definition: AtPRAtask.cxx:58
AtPRAtask::Exec
virtual void Exec(Option_t *option)
Definition: AtPRAtask.cxx:153
AtPATTERN::AtTrackFinderTC
Definition: AtTrackFinderTC.h:42
AtPATTERN::AtPRA::FindTracks
virtual std::unique_ptr< AtPatternEvent > FindTracks(AtEvent &event)=0
AtPRAtask::SetKtriplet
void SetKtriplet(size_t k)
Definition: AtPRAtask.h:81
AtPRAtask::SetTcluster
void SetTcluster(float t)
Definition: AtPRAtask.h:86