BmnRoot
26.10.0-210-gc52d34b0
Software framework of the BM@N experiment
Toggle main menu visibility
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.int
7
8
BmnRootIterator class implementation
9
*/
10
// TODO: check if we can use std::move() across the project to optimize a little
11
#include "
BmnRootIterator.h
"
12
13
#include "
BmnHit.h
"
14
#include "
BmnWeightedLine.h
"
15
#include "fairlogger/Logger.h"
16
17
#include <utility>
18
19
namespace
20
{
21
constexpr
Int_t
SIBT_STATIONS{3};
// the beam line needs one hit in each, numbered from 0 along the beam
22
}
// anonymous namespace
23
24
BmnRootIterator::BmnRootIterator
(
const
char
* filesPathList,
25
const
BmnDetectorModel
& detModel,
26
TrackFilter_t
trackFilter,
27
HitFilter_t
hitFilter,
28
BmnSimpleProgressBar
* pb,
29
Bool_t
verbose,
30
Int_t
maxTracks)
31
:
BmnDataIterator
(pb)
32
,
fpDetModel
(&detModel)
33
,
fTrackFilter
(std::move(trackFilter))
34
,
fHitFilter
(std::move(hitFilter))
35
,
fpData
(new
BmnDataReader
(filesPathList, verbose))
36
,
fpReader
(&
fpData
->Reader())
37
,
fTrackLimit
(maxTracks)
38
{
39
if
(!
fTrackFilter
)
40
fTrackFilter
= [](
const
Track_t
&,
Int_t
) {
return
kTRUE
; };
41
if
(!
fHitFilter
)
42
fHitFilter
= [](
const
Hit_t
&) {
return
kTRUE
; };
43
44
// detect whether the source data has a DstEventHeader branch
45
Bool_t
hasEventHeader{
fpData
->Chain().GetBranch(
BMN_EVENT_BRANCH_NAME
) !=
nullptr
};
46
47
const
Bool_t
withVertex{detModel.
TargetID
() >= 0};
48
if
(withVertex) {
49
if
(detModel.
Target
().
zEnd
<= detModel.
Target
().
zStart
) {
50
LOG(error) <<
" <!> BmnRootIterator : the detector model has a target element but no"
51
" target geometry - pass the target .geo file to its Init()"
;
52
return
;
53
}
54
if
(!
fpData
->Chain().GetBranch(
BMN_BEAM_BRANCH_NAME
)) {
55
LOG(error) <<
" <!> BmnRootIterator : the detector model has a target element but the data"
56
" has no "
BMN_BEAM_BRANCH_NAME
" branch to build the vertex hit from"
;
57
return
;
58
}
59
}
60
61
// turn off unneeded branches
62
// notice: turning off branches works weirdly and does not give any speedup
63
// but let it be for now - maybe it will give something later
64
fpData
->Chain().SetBranchStatus(
"*"
,
kFALSE
);
65
fpData
->Chain().SetBranchStatus(
BMN_TRACKS_BRANCH_NAME
"*"
,
kTRUE
);
66
fpData
->Chain().SetBranchStatus(
BMN_HITS_BRANCH_NAME
"*"
,
kTRUE
);
67
if
(hasEventHeader)
68
fpData
->Chain().SetBranchStatus(
BMN_EVENT_BRANCH_NAME
"*"
,
kTRUE
);
69
if (withVertex)
70
fpData
->Chain().SetBranchStatus(
BMN_BEAM_BRANCH_NAME
"*"
,
kTRUE
);
71
72
// Tryed to use TTreeReaderArray but failed to make it work
73
fpRootTracks
=
new
TTreeReaderValue<TClonesArray>
{*fpReader, BMN_TRACKS_BRANCH_NAME};
74
fpRootHits
=
new
TTreeReaderValue<TClonesArray>
{*fpReader, BMN_HITS_BRANCH_NAME};
75
if (hasEventHeader)
76
fpRootEventHeader
=
new
TTreeReaderValue<DstEventHeader>
{*
fpReader
,
BMN_EVENT_BRANCH_NAME
};
77
if
(withVertex)
78
fpRootBeamHits
=
new
TTreeReaderValue<TClonesArray>
{*
fpReader
,
BMN_BEAM_BRANCH_NAME
};
79
80
fProgressByTracks
=
kFALSE
;
// progress by events until tracks are counted
81
fTotalEvents
=
fpReader
->GetEntries(
kTRUE
);
// without kTRUE result is not guaranteed
82
SetTickProgress
(1.0f /
fTotalEvents
);
83
84
fInitialized
=
kTRUE
;
85
}
86
87
BmnRootIterator::~BmnRootIterator
()
88
{
89
delete
fpRootTracks
;
90
delete
fpRootHits
;
91
delete
fpRootBeamHits
;
92
delete
fpRootEventHeader
;
93
delete
fpData
;
94
}
95
96
void
BmnRootIterator::CountElements
()
97
{
98
// Count all tracks and hits that matches minimum number
99
// of hits per track and maximum allowed chi2 per hit,
100
// Filtration is built in ResetAll() and NextTrack() directly.
101
LOG_IF(warning,
fTrackLimit
) <<
" ! track limit is set to "
<<
fTrackLimit
<<
" tracks"
;
102
LOG(info) <<
" counting suitable tracks..."
;
103
104
SetTickProgress
(1.0f /
fTotalEvents
);
105
fProgressByTracks
=
kFALSE
;
// progress by events
106
ProgressReset
();
107
fTotalTracks
= 0;
108
fTotalHits
= 0;
109
ResetAll
();
110
while
(!
EndOfTracks
()) {
111
fTotalTracks
++;
112
fTotalHits
+=
HitsInTrack
();
113
NextTrack
();
114
}
115
ProgressClear
();
116
fProgressByTracks
=
kTRUE
;
117
SetTickProgress
(1.0f /
fTotalTracks
);
118
119
LOG(info) <<
" "
<<
fTotalTracks
<<
" total suitable tracks found"
;
120
LOG(info) <<
" "
<<
fTotalHits
<<
" total hits counted"
;
121
LOG(info) <<
" "
<<
fTotalEvents
<<
" events processed"
;
122
}
123
124
void
BmnRootIterator::ResetAll
()
125
{
126
if
(!
fInitialized
)
127
return
;
128
129
if
(
fpRootBeamHits
)
130
fVertexZ
= 0.5 * (
fpDetModel
->Target().zStart +
fpDetModel
->Target().zEnd);
131
UnsetProperties
();
132
fpReader
->Restart();
133
Bool_t
event
=
fpReader
->Next();
134
if
(!event)
135
return
;
// no events at all
136
if
(!
fProgressByTracks
)
137
ProgressTick
();
138
139
// search for event with tracks
140
fTracksInEvent
= (*fpRootTracks)->GetEntries();
141
while
(event &&
fTracksInEvent
<= 0) {
142
event
=
fpReader
->Next();
143
if
(!
fProgressByTracks
)
144
ProgressTick
();
145
fTracksInEvent
= (*fpRootTracks)->GetEntries();
146
}
147
if
(!event)
148
return
;
// no events with tracks
149
if
(
fpRootEventHeader
)
150
fEventID
= (*fpRootEventHeader)->GetEventId();
151
ScanEvent
();
152
153
fpCurrentTrack
= (
Track_t
*)(*fpRootTracks)->At(0);
154
fTrackIdx
= 0;
155
fEndOfTracks
=
kFALSE
;
156
// CountUsableHits() first: the track predicate is told how many hits will
157
// actually be read, not how many the track claims
158
if
(!
fTrackFilter
(*
fpCurrentTrack
,
CountUsableHits
()))
159
NextTrack
();
160
else
{
161
fTrackCount
= 1;
162
fEventTracks
= 1;
163
ResetHits
();
164
}
165
}
166
167
void
BmnRootIterator::NextTrack
()
168
{
169
if
(!
fInitialized
||
fEndOfTracks
)
170
return
;
171
if
(
fTrackLimit
&&
fTrackCount
==
fTrackLimit
) {
172
UnsetProperties
();
173
return
;
174
}
175
do
{
176
if
(++
fTrackIdx
>=
fTracksInEvent
) {
177
Bool_t
event
{
fpReader
->Next()};
178
if
(!
fProgressByTracks
)
179
ProgressTick
();
180
if
(event) {
181
fTracksInEvent
= (*fpRootTracks)->GetEntries();
182
while
(event &&
fTracksInEvent
<= 0) {
183
event
=
fpReader
->Next();
184
if
(!
fProgressByTracks
)
185
ProgressTick
();
186
fTracksInEvent
= (*fpRootTracks)->GetEntries();
187
}
188
}
189
// (!event) must be checked againg, don't use else
190
if
(!event) {
// no more events - no more tracks
191
UnsetProperties
();
192
return
;
193
}
194
if
(
fpRootEventHeader
)
195
fEventID
= (*fpRootEventHeader)->GetEventId();
196
fTrackIdx
= 0;
197
fEventTracks
= 0;
198
ScanEvent
();
199
}
200
fpCurrentTrack
= (
Track_t
*)(*fpRootTracks)->At(
fTrackIdx
);
201
}
while
(!
fTrackFilter
(*
fpCurrentTrack
,
CountUsableHits
()));
202
fTrackCount
++;
203
fEventTracks
++;
204
ResetHits
();
205
if
(
fProgressByTracks
)
206
ProgressTick
();
207
}
208
209
/*
210
* Builds the vertex hit of the event just read. The beam line is fitted
211
* through the SiBT hits and taken at the target centre. Every track that
212
* passes the filters takes that hit; BmnAligner::Align() later disables the
213
* ones whose residual shows the track does not come from the vertex. The beam
214
* gives one measurement per event, so its weight is shared out among those N
215
* tracks instead of being counted N times.
216
*/
217
void
BmnRootIterator::ScanEvent
()
218
{
219
fVertexTrack
.clear();
220
if
(!
fpRootBeamHits
)
221
return
;
222
223
const
TClonesArray
& beamHits{**
fpRootBeamHits
};
224
if
(SIBT_STATIONS != beamHits.
GetEntriesFast
())
225
return
;
226
BmnWeightedLine
lineX, lineY;
227
UInt_t stations{0};
228
for
(
Int_t
i
{0};
i
< SIBT_STATIONS;
i
++) {
229
const
BmnHit
& hit{*
static_cast<
BmnHit
*
>
(beamHits.
At
(
i
))};
230
if
(hit.
GetStation
() >= 0 && hit.
GetStation
() < SIBT_STATIONS)
231
stations |= 1u << hit.
GetStation
();
232
lineX.
Add
(hit.GetZ(), hit.GetX(),
BmnHitRecord::Weight
(hit.GetDx()));
233
lineY.
Add
(hit.GetZ(), hit.GetY(),
BmnHitRecord::Weight
(hit.GetDy()));
234
}
235
if
(stations != (1u << SIBT_STATIONS) - 1)
236
return
;
237
238
fVertexTrack
.assign(
fTracksInEvent
,
kFALSE
);
239
Int_t
vertexTracks{0};
240
for
(
Int_t
i
{0};
i
<
fTracksInEvent
;
i
++) {
241
const
Track_t
& track{*
static_cast<
Track_t
*
>
((*fpRootTracks)->At(
i
))};
242
Int_t
usableHits{0};
243
for
(
Int_t
h{0}; h < track.
GetNStsHits
(); h++)
244
if
(
fHitFilter
(*
static_cast<
Hit_t
*
>
((*fpRootHits)->At(track.
GetStsHitIndex
(h)))))
245
usableHits++;
246
if
(!
fTrackFilter
(track, usableHits))
247
continue
;
248
fVertexTrack
[
i
] =
kTRUE
;
249
vertexTracks++;
250
}
251
if
(!vertexTracks)
252
return
;
253
254
fVertexX
= lineX.
At
(
fVertexZ
);
255
fVertexY
= lineY.
At
(
fVertexZ
);
256
fVertexVarX
= lineX.
Var
(
fVertexZ
);
257
fVertexVarY
= lineY.
Var
(
fVertexZ
);
258
fVertexWx
= 1.0 / (
fVertexVarX
* vertexTracks);
259
fVertexWy
= 1.0 / (
fVertexVarY
* vertexTracks);
260
}
HitFilter_t
std::function< Bool_t(const CbmStsHit &)> HitFilter_t
Definition
BmnDataFilters.h:56
TrackFilter_t
std::function< Bool_t(const CbmStsTrack &, Int_t usableHits)> TrackFilter_t
Definition
BmnDataFilters.h:57
BmnHit.h
BmnRootIterator.h
BMN_EVENT_BRANCH_NAME
#define BMN_EVENT_BRANCH_NAME
Definition
BmnRootIterator.h:28
BMN_BEAM_BRANCH_NAME
#define BMN_BEAM_BRANCH_NAME
Definition
BmnRootIterator.h:32
BMN_TRACKS_BRANCH_NAME
#define BMN_TRACKS_BRANCH_NAME
Definition
BmnRootIterator.h:29
BMN_HITS_BRANCH_NAME
#define BMN_HITS_BRANCH_NAME
Definition
BmnRootIterator.h:30
BmnWeightedLine.h
i
int i
Definition
P4_F32vec4.h:22
Bool_t
bool Bool_t
Int_t
int Int_t
kFALSE
constexpr Bool_t kFALSE
kTRUE
constexpr Bool_t kTRUE
BmnDataIterator::ProgressClear
void ProgressClear()
Definition
BmnDataIterator.h:71
BmnDataIterator::BmnDataIterator
BmnDataIterator(BmnSimpleProgressBar *pb=nullptr)
Definition
BmnDataIterator.h:21
BmnDataIterator::fInitialized
Bool_t fInitialized
Definition
BmnDataIterator.h:42
BmnDataIterator::SetTickProgress
void SetTickProgress(Float_t progress)
Definition
BmnDataIterator.h:52
BmnDataIterator::fEndOfTracks
Bool_t fEndOfTracks
Definition
BmnDataIterator.h:42
BmnDataIterator::ProgressTick
void ProgressTick()
Definition
BmnDataIterator.h:53
BmnDataIterator::EndOfTracks
Bool_t EndOfTracks() const noexcept
Definition
BmnDataIterator.h:38
BmnDataIterator::ProgressReset
void ProgressReset()
Definition
BmnDataIterator.h:64
BmnDataReader
Definition
BmnDataReader.h:26
BmnDetectorModel
Definition
BmnDetectorModel.h:28
BmnDetectorModel::Target
const Layer & Target() const
Definition
BmnDetectorModel.h:105
BmnDetectorModel::TargetID
virtual Int_t TargetID() const
Definition
BmnDetectorModel.h:84
BmnHitRecord::Weight
static constexpr Double_t Weight(Double_t error) noexcept
Definition
BmnHitRecord.h:29
BmnHit
Definition
BmnHit.h:21
BmnHit::GetStation
Short_t GetStation() const
Definition
BmnHit.h:35
BmnRootIterator::CountUsableHits
Int_t CountUsableHits()
Definition
BmnRootIterator.h:140
BmnRootIterator::Hit_t
CbmStsHit Hit_t
Definition
BmnRootIterator.h:44
BmnRootIterator::ResetAll
virtual void ResetAll() override
Definition
BmnRootIterator.cxx:124
BmnRootIterator::fHitFilter
HitFilter_t fHitFilter
kTRUE keeps the track
Definition
BmnRootIterator.h:91
BmnRootIterator::fVertexWy
Double_t fVertexWy
Definition
BmnRootIterator.h:112
BmnRootIterator::fVertexZ
Double_t fVertexZ
Definition
BmnRootIterator.h:110
BmnRootIterator::fpDetModel
const BmnDetectorModel * fpDetModel
Definition
BmnRootIterator.h:88
BmnRootIterator::fVertexX
Double_t fVertexX
per track of the event: kTRUE if it takes the vertex hit
Definition
BmnRootIterator.h:109
BmnRootIterator::fTrackFilter
TrackFilter_t fTrackFilter
Definition
BmnRootIterator.h:90
BmnRootIterator::fpCurrentTrack
Track_t * fpCurrentTrack
Definition
BmnRootIterator.h:97
BmnRootIterator::fpRootBeamHits
TTreeReaderValue< TClonesArray > * fpRootBeamHits
Definition
BmnRootIterator.h:94
BmnRootIterator::fVertexVarX
Double_t fVertexVarX
Definition
BmnRootIterator.h:112
BmnRootIterator::UnsetProperties
void UnsetProperties()
Definition
BmnRootIterator.h:227
BmnRootIterator::BmnRootIterator
BmnRootIterator()=delete
BmnRootIterator::fpData
BmnDataReader * fpData
kTRUE keeps the hit
Definition
BmnRootIterator.h:92
BmnRootIterator::fEventID
UInt_t fEventID
Definition
BmnRootIterator.h:105
BmnRootIterator::fVertexVarY
Double_t fVertexVarY
Definition
BmnRootIterator.h:112
BmnRootIterator::fTrackCount
Int_t fTrackCount
Definition
BmnRootIterator.h:104
BmnRootIterator::fVertexWx
Double_t fVertexWx
Definition
BmnRootIterator.h:112
BmnRootIterator::fProgressByTracks
Bool_t fProgressByTracks
Definition
BmnRootIterator.h:116
BmnRootIterator::fEventTracks
Int_t fEventTracks
Definition
BmnRootIterator.h:104
BmnRootIterator::fpRootEventHeader
TTreeReaderValue< DstEventHeader > * fpRootEventHeader
Definition
BmnRootIterator.h:95
BmnRootIterator::fTracksInEvent
Int_t fTracksInEvent
Definition
BmnRootIterator.h:100
BmnRootIterator::fTrackLimit
Int_t fTrackLimit
Definition
BmnRootIterator.h:104
BmnRootIterator::fVertexTrack
std::vector< Bool_t > fVertexTrack
Definition
BmnRootIterator.h:108
BmnRootIterator::HitsInTrack
virtual Int_t HitsInTrack() const override
Definition
BmnRootIterator.h:220
BmnRootIterator::fTotalTracks
Int_t fTotalTracks
Definition
BmnRootIterator.h:100
BmnRootIterator::ScanEvent
void ScanEvent()
Definition
BmnRootIterator.cxx:217
BmnRootIterator::fTotalEvents
Long64_t fTotalEvents
Definition
BmnRootIterator.h:99
BmnRootIterator::fpReader
TTreeReader * fpReader
Definition
BmnRootIterator.h:93
BmnRootIterator::CountElements
void CountElements()
Definition
BmnRootIterator.cxx:96
BmnRootIterator::ResetHits
virtual void ResetHits() override
Definition
BmnRootIterator.h:150
BmnRootIterator::Track_t
CbmStsTrack Track_t
Definition
BmnRootIterator.h:43
BmnRootIterator::fpRootHits
TTreeReaderValue< TClonesArray > * fpRootHits
Definition
BmnRootIterator.h:94
BmnRootIterator::fTrackIdx
Int_t fTrackIdx
Definition
BmnRootIterator.h:103
BmnRootIterator::fTotalHits
Int_t fTotalHits
Definition
BmnRootIterator.h:100
BmnRootIterator::~BmnRootIterator
virtual ~BmnRootIterator()
Definition
BmnRootIterator.cxx:87
BmnRootIterator::NextTrack
virtual void NextTrack() override
Definition
BmnRootIterator.cxx:167
BmnRootIterator::fpRootTracks
TTreeReaderValue< TClonesArray > * fpRootTracks
Definition
BmnRootIterator.h:94
BmnRootIterator::fVertexY
Double_t fVertexY
Definition
BmnRootIterator.h:109
BmnSimpleProgressBar
Definition
BmnSimpleProgressBar.h:20
BmnWeightedLine
Definition
BmnWeightedLine.h:25
BmnWeightedLine::Var
Double_t Var(Double_t z) const noexcept
Definition
BmnWeightedLine.h:64
BmnWeightedLine::At
Double_t At(Double_t z) const noexcept
Definition
BmnWeightedLine.h:58
BmnWeightedLine::Add
void Add(Double_t z, Double_t v, Double_t w=1.0) noexcept
Definition
BmnWeightedLine.h:33
CbmStsTrack::GetNStsHits
Int_t GetNStsHits() const
Accessors.
Definition
CbmStsTrack.h:60
CbmStsTrack::GetStsHitIndex
Int_t GetStsHitIndex(Int_t iHit) const
Definition
CbmStsTrack.h:62
TClonesArray
TObjArray::GetEntriesFast
Int_t GetEntriesFast() const
TObjArray::At
TObject * At(Int_t idx) const override
TTreeReaderValue
BmnDetectorModel::Layer::zEnd
Double_t zEnd
Definition
BmnDetectorModel.h:47
BmnDetectorModel::Layer::zStart
Double_t zStart
Definition
BmnDetectorModel.h:47
align_new
src
BmnRootIterator.cxx
Generated on
for BmnRoot by
1.17.0