BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
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
9using namespace std;
10using namespace TMath;
11
13{
14 fPeriodId = period;
15 fEventNo = 0;
16 fGlobalTracksArray = NULL;
18 fGlobalTracksBranchName = "BmnGlobalTrack";
19 fVertexBranchName = "BmnVertex";
20}
21
26
28{
29 if (fVerbose > 1)
30 cout << "=========================== Vertex finder init started ====================" << endl;
31
33
34 // Get ROOT Manager
35 FairRootManager* ioman = FairRootManager::Instance();
36 if (NULL == ioman)
37 Fatal("Init", "FairRootManager is not instantiated");
38
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
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
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
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
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
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
302Double_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
322Double_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}
int i
Definition P4_F32vec4.h:22
bool Bool_t
int Int_t
float Float_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
const char Option_t
void Fatal(const char *location, const char *msgfmt,...)
TMatrixTSym< Float_t > TMatrixFSym
@ kBMNERROR
Error.
Definition BmnEnums.h:95
BmnGlobalTrack.h.
void SetFlag(Int_t flag)
Definition BmnTrack.h:74
FairTrackParam * GetParamFirst()
Definition BmnTrack.h:63
Int_t GetFlag() const
Definition BmnTrack.h:53
virtual void Finish()
BmnVertex FindSecondaryVertex(TClonesArray *tracks)
virtual InitStatus Init()
virtual ~BmnVertexFinder()
virtual void Exec(Option_t *opt)
BmnVertex FindPrimaryVertex(TClonesArray *tracks)
Double_t CalcRms2D(vector< Double_t > x, vector< Double_t > y)
TString fVertexBranchName
Float_t FindVZByVirtualPlanes(Float_t z_0, Float_t range, TClonesArray *tracks, Int_t flag)
Double_t CalcMeanDist(vector< Double_t > x, vector< Double_t > y)
TString fGlobalTracksBranchName
TClonesArray * fVertexArray
TClonesArray * fGlobalTracksArray
BmnKalmanFilter * fKalman
double Parameter(unsigned int i) const
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Axis_t xmin=0, Axis_t xmax=0)
Int_t GetEntriesFast() const
TObject * At(Int_t idx) const override
Double_t RealTime()
void Start(Bool_t reset=kTRUE)
void Stop()
@ kRange
Double_t Sq(Double_t x)
Double_t Sqrt(Double_t x)
Double_t Abs(Double_t d)
Double_t Mean(Iterator first, Iterator last)
Definition json.hpp:4446