BmnRoot
Loading...
Searching...
No Matches
BmnRootIterator.cxx
Go to the documentation of this file.
1/*
2 BM@N alignment routine
3 BM@N experiment at NICA complex, JINR, 2025
4
5 Department: Math & Soft Group of HEP lab
6 Author: Igor Polev, polev@jinr.ru
7
8 BmnRootIterator class implementation
9*/
10
11#include "BmnRootIterator.h"
12
13#include "BmnAlignDefines.h"
14#include "fairlogger/Logger.h"
15
16BmnRootIterator::BmnRootIterator(const char* filesPathList, const BmnDetectorModel& detModel, BmnSimpleProgressBar* pb)
17 : BmnDataIterator(pb)
18 , fpDetModel(&detModel)
19 , fpData(new BmnDataReader(filesPathList))
20 , fpReader(&fpData->Reader())
21{
22 // turn off unneeded branches
23 // notice: turning off branches works weirdly and does not give any speedup
24 // but let it be for now - maybe it will give something later
25 fpData->Chain().SetBranchStatus("*", kFALSE);
26 fpData->Chain().SetBranchStatus(BMN_TRACKS_BRACH_NAME "*", kTRUE);
27 fpData->Chain().SetBranchStatus(BMN_HITS_BRACH_NAME "*", kTRUE);
28
29 // Tryed to use TTreeReaderArray but it does not work
30 fpRootTracks = new TTreeReaderValue<TClonesArray>{*fpReader, BMN_TRACKS_BRACH_NAME};
31 fpRootHits = new TTreeReaderValue<TClonesArray>{*fpReader, BMN_HITS_BRACH_NAME};
32
33 fProgressByTracks = kFALSE; // progress by events until tracks are counted
34 fTotalEvents = fpData->Chain().GetEntries();
35 SetTickProgress(1.0f / fTotalEvents);
36
37 fInitialized = kTRUE;
38}
39
41{
42 if (fpRootTracks)
43 delete fpRootTracks;
44 if (fpRootHits)
45 delete fpRootHits;
46 if (fpData)
47 delete fpData;
48}
49
51{
52 // Count all tracks and hits that matches minimum number
53 // of hits per track and maximum allowed chi2 per hit,
54 // Filtration is built in ResetAll() and NextTrack() directly.
55 LOG(info) << " minimum hits per track = " << BMN_MIN_HITS_PER_TRACK;
56 LOG(info) << " maximum track chi2/NDF = " << BMN_MAX_CHI2_PER_NDF;
57 LOG(info) << " counting suitable tracks and other elements...";
58
59 auto events{fpData->Chain().GetEntries()};
60 SetTickProgress(1.0f / events);
61 fProgressByTracks = kFALSE; // progress by events
63 fTotalTracks = 0;
64 fTotalHits = 0;
65 ResetAll();
66 while (!EndOfTracks()) {
67 fTotalTracks++;
68 fTotalHits += fHitsInTrack;
69 NextTrack();
70 }
72 fProgressByTracks = kTRUE;
73 SetTickProgress(1.0f / fTotalTracks);
74
75 LOG(info) << " " << fTotalTracks << " total suitable tracks found";
76 LOG(info) << " " << fTotalHits << " total hits counted";
77 LOG(info) << " " << events << " events processed";
78}
79
81{
82 fHitsInTrack = fpCurrentTrack->GetNStsHits();
83 if (fHitsInTrack > 0) {
84 fpCurrentHit = (Hit_t*)(*fpRootHits)->At(fpCurrentTrack->GetStsHitIndex(0));
85 fHitIdx = 0;
86 fEndOfHits = kFALSE;
87 } else {
88 fpCurrentHit = nullptr;
89 fEndOfHits = kTRUE;
90 }
91}
92
94{
95 if (!fInitialized)
96 return;
97
98 UnsetProperties();
99 fpReader->Restart();
100 Bool_t event = fpReader->Next();
101 if (!event)
102 return; // no events at all
103 if (!fProgressByTracks)
104 ProgressTick();
105
106 // search for event with tracks
107 fTracksInEvent = (*fpRootTracks)->GetEntries();
108 while (event && fTracksInEvent <= 0) {
109 event = fpReader->Next();
110 if (!fProgressByTracks)
111 ProgressTick();
112 fTracksInEvent = (*fpRootTracks)->GetEntries();
113 }
114 if (!event)
115 return; // no events with tracks
116
117 fpCurrentTrack = (Track_t*)(*fpRootTracks)->At(0);
118 fTrackIdx = 0;
119 fEndOfTracks = kFALSE;
120 // skip track with too few hits or too big chi2 per NDF
121 if (BMN_MIN_HITS_PER_TRACK > fpCurrentTrack->GetNStsHits()
122 || BMN_MAX_CHI2_PER_NDF < fpCurrentTrack->GetChi2() / fpCurrentTrack->GetNDF())
123 NextTrack();
124 else
125 ResetHits();
126}
127
129{
131 return;
132 Bool_t search{kTRUE}; // skip track with too few hits or too big chi2 per hit
133 while (search) {
134 if (++fTrackIdx >= fTracksInEvent) {
135 Bool_t event{fpReader->Next()};
136 if (!fProgressByTracks)
137 ProgressTick();
138 if (event) {
139 fTracksInEvent = (*fpRootTracks)->GetEntries();
140 while (event && fTracksInEvent <= 0) {
141 event = fpReader->Next();
142 if (!fProgressByTracks)
143 ProgressTick();
144 fTracksInEvent = (*fpRootTracks)->GetEntries();
145 }
146 }
147 // (!event) must be checked againg, don't use else
148 if (!event) { // no more events - no more tracks
149 UnsetProperties();
150 return;
151 }
152 fTrackIdx = 0;
153 }
154 fpCurrentTrack = (Track_t*)(*fpRootTracks)->At(fTrackIdx);
155 search = (BMN_MIN_HITS_PER_TRACK > fpCurrentTrack->GetNStsHits()
156 || BMN_MAX_CHI2_PER_NDF < fpCurrentTrack->GetChi2() / fpCurrentTrack->GetNDF());
157 }
158 ResetHits();
159 if (fProgressByTracks)
160 ProgressTick();
161}
162
164{
165 if (!fInitialized || fEndOfHits)
166 return;
167 if (++fHitIdx >= fHitsInTrack) {
168 fpCurrentHit = nullptr;
169 fEndOfHits = kTRUE;
170 } else
171 fpCurrentHit = (Hit_t*)(*fpRootHits)->At(fpCurrentTrack->GetStsHitIndex(fHitIdx));
172}
173
174Double_t BmnRootIterator::HitX() const
175{
176 if (!fInitialized || fEndOfHits)
177 return 0.0;
178 return fpCurrentHit->GetX();
179}
180
181Double_t BmnRootIterator::HitY() const
182{
183 if (!fInitialized || fEndOfHits)
184 return 0.0;
185 return fpCurrentHit->GetY();
186}
187
188Double_t BmnRootIterator::HitZ() const
189{
190 if (!fInitialized || fEndOfHits)
191 return 0.0;
192 return fpCurrentHit->GetZ();
193}
194
196{
197 if (!fInitialized || fEndOfHits)
198 return 0.0;
199 return (fpCurrentHit->GetDx() < BMN_CLOSE_TO_ZERO) ? MAX_WEIGHT
200 : 1.0 / (fpCurrentHit->GetDx() * fpCurrentHit->GetDx());
201}
202
204{
205 if (!fInitialized || fEndOfHits)
206 return 0.0;
207 return (fpCurrentHit->GetDy() < BMN_CLOSE_TO_ZERO) ? MAX_WEIGHT
208 : 1.0 / (fpCurrentHit->GetDy() * fpCurrentHit->GetDy());
209}
210
212{
213 if (!fInitialized || fEndOfHits)
214 return 0;
215 return fpDetModel->IDfromHit(fpCurrentHit->GetDetectorID());
216 // this is the moment when hit detector encoding transformed into alignment encoding
217}
218
220{
222 return 0;
223 return fHitsInTrack;
224}
225
226void BmnRootIterator::UnsetProperties()
227{
228 fTracksInEvent = 0;
229 fHitsInTrack = 0;
230 fpCurrentTrack = nullptr;
231 fpCurrentHit = nullptr;
232 fEndOfTracks = kTRUE;
233 fEndOfHits = kTRUE;
234}
#define BMN_CLOSE_TO_ZERO
#define BMN_MIN_HITS_PER_TRACK
#define BMN_MAX_CHI2_PER_NDF
void SetTickProgress(Float_t progress)
Bool_t EndOfTracks() const noexcept
TChain & Chain()
virtual Int_t IDfromHit(Int_t HitDetectorID) const =0
virtual Double_t HitY() const override
virtual void ResetAll() override
virtual Double_t HitWy() const override
virtual Int_t HitDetectorID() const override
virtual Double_t HitZ() const override
BmnRootIterator()=delete
virtual Double_t HitX() const override
virtual Int_t HitsInTrack() const override
virtual Double_t HitWx() const override
virtual void ResetHits() override
virtual ~BmnRootIterator()
virtual void NextTrack() override
virtual void NextHit() override
Int_t GetNStsHits() const
Definition CbmStsTrack.h:60
Double_t GetChi2() const
Definition CbmStsTrack.h:66
Int_t GetStsHitIndex(Int_t iHit) const
Definition CbmStsTrack.h:62
Int_t GetNDF() const
Definition CbmStsTrack.h:67
#define BMN_TRACKS_BRACH_NAME
#define BMN_HITS_BRACH_NAME