BmnRoot
26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Toggle main menu visibility
Loading...
Searching...
No Matches
BmnVertexFinder.cxx
Go to the documentation of this file.
1
#include "
BmnVertexFinder.h
"
2
3
#include "BmnMath.h"
4
#include "
TCanvas.h
"
5
#include "
TFitResult.h
"
6
#include "
TGraph.h
"
7
#include "vector"
8
9
using namespace
std
;
10
using namespace
TMath
;
11
12
BmnVertexFinder::BmnVertexFinder
(
Int_t
period)
13
{
14
fPeriodId
= period;
15
fEventNo
= 0;
16
fGlobalTracksArray
= NULL;
17
fRobustRefit
=
kTRUE
;
18
fGlobalTracksBranchName
=
"BmnGlobalTrack"
;
19
fVertexBranchName
=
"BmnVertex"
;
20
}
21
22
BmnVertexFinder::~BmnVertexFinder
()
23
{
24
delete
fKalman
;
25
}
26
27
InitStatus
BmnVertexFinder::Init
()
28
{
29
if
(fVerbose > 1)
30
cout <<
"=========================== Vertex finder init started ===================="
<< endl;
31
32
fKalman
=
new
BmnKalmanFilter
();
33
34
// Get ROOT Manager
35
FairRootManager* ioman = FairRootManager::Instance();
36
if
(NULL == ioman)
37
Fatal
(
"Init"
,
"FairRootManager is not instantiated"
);
38
39
fGlobalTracksArray
= (
TClonesArray
*)ioman->GetObject(
fGlobalTracksBranchName
);
// in
40
if
(!
fGlobalTracksArray
) {
41
cout <<
"BmnVertexFinder::Init(): branch "
<<
fGlobalTracksBranchName
<<
" not found! Task will be deactivated"
42
<< endl;
43
SetActive(
kFALSE
);
44
return
kERROR;
45
}
46
47
fVertexArray
=
new
TClonesArray
(
"BmnVertex"
, 1);
// out
48
ioman->Register(
fVertexBranchName
,
"GEM"
,
fVertexArray
,
kTRUE
);
49
50
if
(fVerbose > 1)
51
cout <<
"=========================== Vertex finder init finished ==================="
<< endl;
52
53
return
kSUCCESS;
54
}
55
56
void
BmnVertexFinder::Exec
(
Option_t
* opt)
57
{
58
TStopwatch
sw;
59
sw.
Start
();
60
61
if
(!IsActive())
62
return
;
63
64
if
(fVerbose > 1)
65
cout <<
"======================== Vertex finder exec started ======================"
<< endl;
66
if
(fVerbose > 1)
67
cout <<
"Event number: "
<<
fEventNo
++ << endl;
68
69
fVertexArray
->Delete();
70
71
new
((*fVertexArray)[
fVertexArray
->GetEntriesFast()])
BmnVertex
(
FindPrimaryVertex
(
fGlobalTracksArray
));
72
new
((*fVertexArray)[
fVertexArray
->GetEntriesFast()])
BmnVertex
(
FindSecondaryVertex
(
fGlobalTracksArray
));
73
74
if
(fVerbose > 1)
75
cout <<
"\n======================== Vertex finder exec finished ======================"
<< endl;
76
77
sw.
Stop
();
78
fTime
+= sw.
RealTime
();
79
}
80
81
BmnVertex
BmnVertexFinder::FindPrimaryVertex
(
TClonesArray
* tracks)
82
{
83
// cout << "Primary" << endl;
84
const
Double_t
kRange
= (
fPeriodId
== 8) ? 200.0 : 50.0;
85
const
Double_t
xVertMin = (
fPeriodId
== 8) ? -10.0 : -0.5;
86
const
Double_t
xVertMax = (
fPeriodId
== 8) ? +10.0 : +2.0;
87
const
Double_t
yVertMin = (
fPeriodId
== 8) ? -10.0 : -5.0;
88
const
Double_t
yVertMax = (
fPeriodId
== 8) ? +10.0 : -2.5;
89
Double_t
roughVertexZ = (
fPeriodId
== 8) ? 0.0 : -1.0;
90
Int_t
nPrim = 0;
91
92
for
(
Int_t
iTr = 0; iTr < tracks->
GetEntriesFast
(); ++iTr) {
93
BmnGlobalTrack
* track = (
BmnGlobalTrack
*)tracks->
At
(iTr);
94
FairTrackParam par0 = *(track->
GetParamFirst
());
95
if
(
fKalman
->TGeoTrackPropagate(&par0, roughVertexZ, (par0.GetQp() > 0.) ? 2212 : -211, NULL, NULL)
96
==
kBMNERROR
)
97
{
98
continue
;
99
}
100
101
if
(par0.GetX() > xVertMin && par0.GetX() < xVertMax && par0.GetY() > yVertMin && par0.GetY() < yVertMax) {
102
track->
SetFlag
(0);
// primary track
103
nPrim++;
104
}
else
{
105
track->
SetFlag
(1);
// secondary track
106
}
107
}
108
109
if
(nPrim < 2) {
110
return
BmnVertex
();
111
}
112
113
Double_t
vz =
FindVZByVirtualPlanes
(roughVertexZ,
kRange
, tracks, 0);
114
if
(
Abs
(vz - roughVertexZ) >
kRange
) {
115
for
(
Int_t
iTr = 0; iTr < tracks->
GetEntriesFast
(); ++iTr) {
116
BmnGlobalTrack
* track = (
BmnGlobalTrack
*)tracks->
At
(iTr);
117
track->
SetFlag
(1);
118
}
119
return
BmnVertex
();
120
}
121
122
vector<Double_t> xHits;
123
vector<Double_t> yHits;
124
vector<Int_t> indexes;
125
for
(
Int_t
iTr = 0; iTr < tracks->
GetEntriesFast
(); ++iTr) {
126
BmnGlobalTrack
* track = (
BmnGlobalTrack
*)tracks->
At
(iTr);
127
if
(track->
GetFlag
() != 0)
128
continue
;
129
FairTrackParam par0 = *(track->
GetParamFirst
());
130
if
(
fKalman
->TGeoTrackPropagate(&par0, vz, (par0.GetQp() > 0.) ? 2212 : -211, NULL, NULL) ==
kBMNERROR
) {
131
continue
;
132
}
133
xHits.push_back(par0.GetX());
134
yHits.push_back(par0.GetY());
135
indexes.push_back(iTr);
136
}
137
138
Double_t
vx =
Mean
(xHits.begin(), xHits.end());
139
Double_t
vy =
Mean
(yHits.begin(), yHits.end());
140
141
Double_t
rRMS =
CalcRms2D
(xHits, yHits);
142
143
return
BmnVertex
(vx, vy, vz, rRMS, 0, xHits.size(),
TMatrixFSym
(3), -1, vector<Int_t>());
144
}
145
146
BmnVertex
BmnVertexFinder::FindSecondaryVertex
(
TClonesArray
* tracks)
147
{
148
// cout << "Sacondary" << endl;
149
Double_t
roughVertexZ = (
fPeriodId
== 8) ? 0.0 : (
fPeriodId
== 7) ? -1.0 : (
fPeriodId
== 6) ? -21.9 : 0.0;
150
const
Double_t
kRange
= 300.0;
151
152
Int_t
nSec = 0;
153
154
for
(
Int_t
iTr = 0; iTr < tracks->
GetEntriesFast
(); ++iTr) {
155
BmnGlobalTrack
* track = (
BmnGlobalTrack
*)tracks->
At
(iTr);
156
if
(track->
GetFlag
() == 1)
157
nSec++;
// secondary track
158
}
159
160
if
(nSec < 2) {
161
return
BmnVertex
();
162
}
163
164
Double_t
vz =
FindVZByVirtualPlanes
(roughVertexZ,
kRange
, tracks, 1);
165
166
vector<Double_t> xHits;
167
vector<Double_t> yHits;
168
vector<Int_t> indexes;
169
for
(
Int_t
iTr = 0; iTr < tracks->
GetEntriesFast
(); ++iTr) {
170
BmnGlobalTrack
* track = (
BmnGlobalTrack
*)tracks->
At
(iTr);
171
if
(track->
GetFlag
() != 1)
172
continue
;
173
FairTrackParam par0 = *(track->
GetParamFirst
());
174
if
(
fKalman
->TGeoTrackPropagate(&par0, vz, (par0.GetQp() > 0.) ? 2212 : -211, NULL, NULL) ==
kBMNERROR
) {
175
continue
;
176
}
177
xHits.push_back(par0.GetX());
178
yHits.push_back(par0.GetY());
179
indexes.push_back(iTr);
180
}
181
182
Double_t
vx =
Mean
(xHits.begin(), xHits.end());
183
Double_t
vy =
Mean
(yHits.begin(), yHits.end());
184
185
Double_t
rRMS =
CalcRms2D
(xHits, yHits);
186
187
return
BmnVertex
(vx, vy, vz, rRMS, 0, xHits.size(),
TMatrixFSym
(3), -1, vector<Int_t>());
188
}
189
190
Float_t
BmnVertexFinder::FindVZByVirtualPlanes
(
Float_t
z_0,
Float_t
range,
TClonesArray
* tracks,
Int_t
flag)
191
{
192
const
Int_t
nPlanes = 3;
193
Float_t
minZ = z_0;
194
195
while
(range >= 0.01) {
196
Float_t
zMax = minZ + range;
197
Float_t
zMin = minZ - range;
198
Float_t
zStep = (zMax - zMin) / (nPlanes - 1);
199
200
vector<Double_t> xHits[nPlanes];
201
vector<Double_t> yHits[nPlanes];
202
Float_t
zPlane[nPlanes];
203
Float_t
rRMS[nPlanes] = {0};
204
205
for
(
Int_t
iPlane = 0; iPlane < nPlanes; ++iPlane)
206
zPlane[iPlane] = zMax - iPlane * zStep;
207
208
Int_t
nOkTr = 0;
209
210
for
(
Int_t
iTr = 0; iTr < tracks->
GetEntriesFast
(); ++iTr) {
211
BmnGlobalTrack
* track = (
BmnGlobalTrack
*)tracks->
At
(iTr);
212
if
(track->
GetFlag
() != flag)
213
continue
;
214
FairTrackParam par0 = *(track->
GetParamFirst
());
215
// cout << "tr" << iTr << endl;
216
Double_t
xTr[nPlanes];
217
Double_t
yTr[nPlanes];
218
Bool_t
trOk =
kTRUE
;
219
for
(
Int_t
iPlane = 0; iPlane < nPlanes; ++iPlane) {
220
if
(
fKalman
->TGeoTrackPropagate(&par0, zPlane[iPlane], (par0.GetQp() > 0.) ? 2212 : -211, NULL, NULL)
221
==
kBMNERROR
)
222
{
223
track->
SetFlag
(-1);
// maybe 666???
224
trOk =
kFALSE
;
225
break
;
226
}
227
228
// cout << " " << par0.GetX() << " " << par0.GetY() << " " << par0.GetZ() << endl;
229
xTr[iPlane] = par0.GetX();
230
yTr[iPlane] = par0.GetY();
231
// xHits[iPlane].push_back(par0.GetX());
232
// yHits[iPlane].push_back(par0.GetY());
233
}
234
235
if
(trOk) {
236
nOkTr++;
237
for
(
Int_t
iPlane = 0; iPlane < nPlanes; ++iPlane) {
238
xHits[iPlane].push_back(xTr[iPlane]);
239
yHits[iPlane].push_back(yTr[iPlane]);
240
}
241
}
242
}
243
244
if
(nOkTr < 2)
245
return
-1000.0;
246
247
// Double_t minRMS = DBL_MAX;
248
249
// Calculation minZ as minimal value
250
// for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
251
// rRMS[iPlane] = CalcMeanDist(xHits[iPlane], yHits[iPlane]);
252
// if (rRMS[iPlane] < minRMS) {
253
// minRMS = rRMS[iPlane];
254
// minZ = zPlane[iPlane];
255
// }
256
// }
257
258
// Calculation minZ as minimum of parabola
259
for
(
Int_t
iPlane = 0; iPlane < nPlanes; ++iPlane) {
260
rRMS[iPlane] =
CalcMeanDist
(xHits[iPlane], yHits[iPlane]);
261
}
262
TGraph
* vertex =
new
TGraph
(nPlanes, zPlane, rRMS);
263
TFitResultPtr
ptr = vertex->
Fit
(
"pol2"
,
"QFS"
);
264
Float_t
b = ptr->
Parameter
(1);
265
Float_t
a = ptr->
Parameter
(2);
266
minZ = -b / (2 * a);
267
delete
vertex;
268
269
range /= 2;
270
271
// for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane)
272
// //rRMS[iPlane] = CalcRms2D(xHits[iPlane], yHits[iPlane]);
273
// rRMS[iPlane] = CalcMeanDist(xHits[iPlane], yHits[iPlane]);
274
275
// TCanvas* c = new TCanvas("c1", "c1", 1200, 800);
276
// //c->Divide(1, 1);
277
// //c->cd(1);
278
// TGraph* vertex = new TGraph(nPlanes, zPlane, rRMS);
279
// TFitResultPtr ptr = vertex->Fit("pol2", "QFS");
280
// // TF1 *fit_func = vertex->GetFunction("pol2");
281
// Float_t b = ptr->Parameter(1);
282
// Float_t a = ptr->Parameter(2);
283
// minZ = -b / (2 * a);
284
// range /= 2;
285
// vertex->Draw("AP*");
286
// c->SaveAs("tmp.pdf");
287
// getchar();
288
// delete vertex;
289
}
290
return
minZ;
291
}
292
293
void
BmnVertexFinder::Finish
()
294
{
295
ofstream outFile;
296
outFile.open(
"QA/timing.txt"
, ofstream::app);
297
outFile <<
"Vertex Finder Time: "
<<
fTime
;
298
if
(fVerbose == 0)
299
cout <<
"Work time of the GEM vertex finder: "
<<
fTime
<< endl;
300
}
301
302
Double_t
BmnVertexFinder::CalcRms2D
(vector<Double_t> x, vector<Double_t> y)
303
{
304
Double_t
xMean = 0.0;
305
Double_t
yMean = 0.0;
306
Double_t
rms = 0.0;
307
for
(
size_t
iHit = 0; iHit < x.size(); ++iHit) {
308
xMean += x.at(iHit);
309
yMean += y.at(iHit);
310
}
311
xMean /= x.size();
312
yMean /= y.size();
313
314
for
(
size_t
iHit = 0; iHit < x.size(); ++iHit) {
315
rms += (
Sq
(x.at(iHit) - xMean) +
Sq
(y.at(iHit) - yMean));
316
}
317
318
rms /= x.size();
319
return
Sqrt
(rms);
320
}
321
322
Double_t
BmnVertexFinder::CalcMeanDist
(vector<Double_t> x, vector<Double_t> y)
323
{
324
Double_t
sumDist = 0.0;
325
Int_t
nPairs = 0;
326
for
(
size_t
i
= 0;
i
< x.size(); ++
i
) {
327
for
(
size_t
j =
i
+ 1; j < x.size(); ++j) {
328
sumDist +=
Sqrt
(
Sq
(x[
i
] - x[j]) +
Sq
(y[
i
] - y[j]));
329
nPairs++;
330
}
331
}
332
return
sumDist / nPairs;
// calc. ave. dist value
333
}
i
int i
Definition
P4_F32vec4.h:22
Bool_t
bool Bool_t
Int_t
int Int_t
Float_t
float Float_t
kFALSE
constexpr Bool_t kFALSE
Double_t
double Double_t
kTRUE
constexpr Bool_t kTRUE
Option_t
const char Option_t
TCanvas.h
Fatal
void Fatal(const char *location, const char *msgfmt,...)
TFitResult.h
TGraph.h
TMatrixFSym
TMatrixTSym< Float_t > TMatrixFSym
kBMNERROR
@ kBMNERROR
Error.
Definition
BmnEnums.h:95
BmnGlobalTrack
BmnGlobalTrack.h.
Definition
BmnGlobalTrack.h:14
BmnKalmanFilter
Definition
BmnKalmanFilter.h:28
BmnTrack::SetFlag
void SetFlag(Int_t flag)
Definition
BmnTrack.h:74
BmnTrack::GetParamFirst
FairTrackParam * GetParamFirst()
Definition
BmnTrack.h:63
BmnTrack::GetFlag
Int_t GetFlag() const
Definition
BmnTrack.h:53
BmnVertexFinder::Finish
virtual void Finish()
Definition
BmnVertexFinder.cxx:293
BmnVertexFinder::fRobustRefit
Bool_t fRobustRefit
Definition
BmnVertexFinder.h:53
BmnVertexFinder::fPeriodId
Int_t fPeriodId
Definition
BmnVertexFinder.h:46
BmnVertexFinder::FindSecondaryVertex
BmnVertex FindSecondaryVertex(TClonesArray *tracks)
Definition
BmnVertexFinder.cxx:146
BmnVertexFinder::fTime
Double_t fTime
Definition
BmnVertexFinder.h:51
BmnVertexFinder::Init
virtual InitStatus Init()
Definition
BmnVertexFinder.cxx:27
BmnVertexFinder::~BmnVertexFinder
virtual ~BmnVertexFinder()
Definition
BmnVertexFinder.cxx:22
BmnVertexFinder::Exec
virtual void Exec(Option_t *opt)
Definition
BmnVertexFinder.cxx:56
BmnVertexFinder::FindPrimaryVertex
BmnVertex FindPrimaryVertex(TClonesArray *tracks)
Definition
BmnVertexFinder.cxx:81
BmnVertexFinder::CalcRms2D
Double_t CalcRms2D(vector< Double_t > x, vector< Double_t > y)
Definition
BmnVertexFinder.cxx:302
BmnVertexFinder::fVertexBranchName
TString fVertexBranchName
Definition
BmnVertexFinder.h:43
BmnVertexFinder::FindVZByVirtualPlanes
Float_t FindVZByVirtualPlanes(Float_t z_0, Float_t range, TClonesArray *tracks, Int_t flag)
Definition
BmnVertexFinder.cxx:190
BmnVertexFinder::CalcMeanDist
Double_t CalcMeanDist(vector< Double_t > x, vector< Double_t > y)
Definition
BmnVertexFinder.cxx:322
BmnVertexFinder::fEventNo
Int_t fEventNo
Definition
BmnVertexFinder.h:45
BmnVertexFinder::BmnVertexFinder
BmnVertexFinder()
Definition
BmnVertexFinder.h:25
BmnVertexFinder::fGlobalTracksBranchName
TString fGlobalTracksBranchName
Definition
BmnVertexFinder.h:42
BmnVertexFinder::fVertexArray
TClonesArray * fVertexArray
Definition
BmnVertexFinder.h:49
BmnVertexFinder::fGlobalTracksArray
TClonesArray * fGlobalTracksArray
Definition
BmnVertexFinder.h:48
BmnVertexFinder::fKalman
BmnKalmanFilter * fKalman
Definition
BmnVertexFinder.h:55
BmnVertex
Definition
BmnVertex.h:22
ROOT::Fit::FitResult::Parameter
double Parameter(unsigned int i) const
TClonesArray
TFitResultPtr
TGraph
TGraph::Fit
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Axis_t xmin=0, Axis_t xmax=0)
TObjArray::GetEntriesFast
Int_t GetEntriesFast() const
TObjArray::At
TObject * At(Int_t idx) const override
TStopwatch
TStopwatch::RealTime
Double_t RealTime()
TStopwatch::Start
void Start(Bool_t reset=kTRUE)
TStopwatch::Stop
void Stop()
kRange
@ kRange
TMath
TMath::Sq
Double_t Sq(Double_t x)
TMath::Sqrt
Double_t Sqrt(Double_t x)
TMath::Abs
Double_t Abs(Double_t d)
TMath::Mean
Double_t Mean(Iterator first, Iterator last)
std
Definition
json.hpp:4446
BmnVertexFinder.h
reconstruction
globaltracking
BmnVertexFinder.cxx
Generated on
for BmnRoot by
1.17.0