ATTPCROOT  0.3.0-alpha
A ROOT-based framework for analyzing data from active target detectors
AtFitterTask.cxx
Go to the documentation of this file.
1 #include "AtFitterTask.h"
2 
3 #include "AtDigiPar.h"
4 #include "AtFitter.h"
5 #include "AtGenfit.h"
6 #include "AtPatternEvent.h"
7 
8 #include <FairLogger.h>
9 #include <FairRootManager.h>
10 #include <FairRun.h>
11 #include <FairRuntimeDb.h>
12 #include <FairTask.h>
13 
14 #include <TClonesArray.h>
15 #include <TObject.h>
16 #include <Track.h>
17 
18 #include <algorithm>
19 #include <iostream>
20 
21 class AtTrack;
22 
23 constexpr auto cRED = "\033[1;31m";
24 constexpr auto cYELLOW = "\033[1;33m";
25 constexpr auto cNORMAL = "\033[0m";
26 constexpr auto cGREEN = "\033[1;32m";
27 
29 
31  : fLogger(FairLogger::GetLogger()), fIsPersistence(kFALSE), fPatternEventArray(new TClonesArray("ATPatternEvent")),
32  fGenfitTrackArray(new TClonesArray("genfit::Track")), fGenfitTrackVector(new std::vector<genfit::Track>())
33 {
34 }
35 
36 AtFitterTask::~AtFitterTask() = default;
37 
38 void AtFitterTask::SetPersistence(Bool_t value)
39 {
40  fIsPersistence = value;
41 }
42 
43 InitStatus AtFitterTask::Init()
44 {
45  FairRootManager *ioMan = FairRootManager::Instance();
46  if (ioMan == nullptr) {
47  LOG(error) << "Cannot find RootManager!";
48  return kERROR;
49  }
50 
51  fPatternEventArray = dynamic_cast<TClonesArray *>(ioMan->GetObject("AtPatternEvent"));
52  if (fPatternEventArray == nullptr) {
53  LOG(error) << "Cannot find AtPatternEvent array!";
54  return kERROR;
55  }
56 
57  // Algorithm selection
58 
59  if (fFitterAlgorithm == 0) {
60  LOG(info) << "Using GENFIT2";
61  std::cout << cGREEN << " AtFitterTask::Init - Fit parameters. "
62  << "\n";
63  std::cout << " Magnetic Field : " << fMagneticField << " T\n";
64  std::cout << " PDG Code : " << fPDGCode << "\n";
65  std::cout << " Mass : " << fMass << " amu\n";
66  std::cout << " Atomic Number : " << fAtomicNumber << "\n";
67  std::cout << " Number of fit points : " << fNumFitPoints << "\n";
68  std::cout << " Maximum iterations : " << fMaxIterations << "\n";
69  std::cout << " Minimum iterations : " << fMinIterations << "\n";
70  std::cout << " Maximum brho : " << fMaxBrho << "\n";
71  std::cout << " Minimum brho : " << fMinBrho << "\n";
72  std::cout << " Energy loss file : " << fELossFile << "\n";
73  std::cout << " --------------------------------------------- " << cNORMAL << "\n";
74 
75  fFitter = new AtFITTER::AtGenfit(fMagneticField, fMinBrho, fMaxBrho, fELossFile, fMinIterations, fMaxIterations);
76  dynamic_cast<AtFITTER::AtGenfit *>(fFitter)->SetPDGCode(fPDGCode);
77  dynamic_cast<AtFITTER::AtGenfit *>(fFitter)->SetMass(fMass);
78  dynamic_cast<AtFITTER::AtGenfit *>(fFitter)->SetAtomicNumber(fAtomicNumber);
79  dynamic_cast<AtFITTER::AtGenfit *>(fFitter)->SetNumFitPoints(fNumFitPoints);
80 
81  } else if (fFitterAlgorithm == 1) {
82  LOG(error) << "Fitter algorithm not defined!";
83  return kERROR;
84  } else if (fFitterAlgorithm == 2) {
85  LOG(error) << "Fitter algorithm not defined!";
86  return kERROR;
87  }
88 
89  // ioMan -> Register("genfitTrackTCA","ATTPC",fGenfitTrackArray, fIsPersistence);
90  ioMan->RegisterAny("ATTPC", fGenfitTrackVector, fIsPersistence);
91 
92  return kSUCCESS;
93 }
94 
96 {
97  LOG(debug) << "SetParContainers of AtFitterTask";
98 
99  FairRun *run = FairRun::Instance();
100  if (!run)
101  LOG(fatal) << "No analysis run!";
102 
103  FairRuntimeDb *db = run->GetRuntimeDb(); // NOLINT
104  if (!db)
105  LOG(fatal) << "No runtime database!";
106 
107  fPar = (AtDigiPar *)db->getContainer("AtDigiPar"); // NOLINT
108  if (!fPar)
109  LOG(fatal) << "AtDigiPar not found!!";
110 }
111 
112 void AtFitterTask::Exec(Option_t *option)
113 {
114  if (fPatternEventArray->GetEntriesFast() == 0)
115  return;
116 
117  fGenfitTrackArray->Clear("C");
118  fGenfitTrackVector->clear();
119 
120  fFitter->Init();
121 
122  std::cout << " Event Counter " << fEventCnt << "\n";
123 
124  AtPatternEvent &patternEvent = *(dynamic_cast<AtPatternEvent *>(fPatternEventArray->At(0)));
125  std::vector<AtTrack> &patternTrackCand = patternEvent.GetTrackCand();
126  std::cout << " AtFitterTask:Exec - Number of candidate tracks : " << patternTrackCand.size() << "\n";
127 
128  if (patternTrackCand.size() < 10) {
129 
130  for (auto track : patternTrackCand) {
131 
132  genfit::Track *fitTrack = fFitter->FitTracks(&track);
133  if (fitTrack != nullptr)
134  fGenfitTrackVector->push_back(*static_cast<genfit::Track *>(fitTrack));
135  }
136  }
137 
138  /*if(patternTrackCand.size()>1){
139  genfit::Track *fitTrack=fFitter->FitTracks(&patternTrackCand.at(1));
140  if(fitTrack!=nullptr)fGenfitTrackVector->push_back(*static_cast<genfit::Track *>(fitTrack));
141  }*/
142 
143  // if(fitTrack==nullptr)
144  // std::cout<<" Nullptr "<<"\n";
145 
146  //}
147 
148  // }
149 
150  // TODO: Genfit block, add a dynamic cast and a try-catch
151 
152  /*try {
153  auto genfitTrackArray = dynamic_cast<AtFITTER::AtGenfit *>(fFitter)->GetGenfitTrackArray();
154  auto genfitTracks = genfitTrackArray->GetEntriesFast();
155 
156  for (auto iTrack = 0; iTrack < genfitTracks; ++iTrack) {
157  new ((*fGenfitTrackArray)[iTrack]) genfit::Track(*static_cast<genfit::Track *>(genfitTrackArray->At(iTrack)));
158  // auto trackTest = *static_cast<genfit::Track*>(genfitTrackArray->At(iTrack));
159  // trackTest.Print();
160  // genfit::MeasuredStateOnPlane fitState = trackTest.getFittedState();
161  // fitState.Print();
162  fGenfitTrackVector->push_back(*static_cast<genfit::Track *>(genfitTrackArray->At(iTrack)));
163  }
164 
165  //auto genfitTracks_ = fGenfitTrackArray->GetEntriesFast();
166  //for(auto iTrack=0;iTrack<genfitTracks_;++iTrack){
167 
168  // auto trackTest = *static_cast<genfit::Track*>(fGenfitTrackArray->At(iTrack));
169  // trackTest.Print();
170  // genfit::MeasuredStateOnPlane fitState = trackTest.getFittedState();
171  // fitState.Print();
172  //}
173 
174  } catch (std::exception &e) {
175  std::cout << " " << e.what() << "\n";
176  }*/
177 
178  ++fEventCnt;
179 }
cRED
constexpr auto cRED
Definition: AtFitterTask.cxx:23
AtFitterTask::Exec
virtual void Exec(Option_t *opt)
Definition: AtFitterTask.cxx:112
AtFitterTask::~AtFitterTask
~AtFitterTask()
AtPatternEvent
Definition: AtPatternEvent.h:19
AtFitterTask
Definition: AtFitterTask.h:33
AtFitterTask::SetMass
void SetMass(Float_t mass)
Definition: AtFitterTask.h:49
genfit
Definition: AtFitter.h:20
cGREEN
constexpr auto cGREEN
Definition: AtFitterTask.cxx:26
AtFitterTask.h
AtFitterTask::SetPersistence
void SetPersistence(Bool_t value=kTRUE)
Definition: AtFitterTask.cxx:38
AtFitter.h
AtFITTER::AtFitter::Init
virtual void Init()=0
AtFitterTask::SetAtomicNumber
void SetAtomicNumber(Int_t znum)
Definition: AtFitterTask.h:50
AtFitterTask::SetNumFitPoints
void SetNumFitPoints(Float_t numpoints)
Definition: AtFitterTask.h:51
AtPatternEvent::GetTrackCand
std::vector< AtTrack > & GetTrackCand()
Definition: AtPatternEvent.h:56
AtTrack
Definition: AtTrack.h:25
AtFITTER::AtGenfit
Definition: AtGenfit.h:34
cNORMAL
constexpr auto cNORMAL
Definition: AtFitterTask.cxx:25
AtDigiPar.h
AtDigiPar
Definition: AtDigiPar.h:14
AtPatternEvent.h
cYELLOW
constexpr auto cYELLOW
Definition: AtFitterTask.cxx:24
AtFITTER::AtFitter::FitTracks
virtual genfit::Track * FitTracks(AtTrack *track)=0
AtFitterTask::SetParContainers
virtual void SetParContainers()
Definition: AtFitterTask.cxx:95
AtFitterTask::SetPDGCode
void SetPDGCode(Int_t pdgcode)
Definition: AtFitterTask.h:48
AtFitterTask::Init
virtual InitStatus Init()
Definition: AtFitterTask.cxx:43
ClassImp
ClassImp(AtFitterTask)
AtFitterTask::AtFitterTask
AtFitterTask()
Definition: AtFitterTask.cxx:30
AtGenfit.h