BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
SrcVertexFinder.cxx
Go to the documentation of this file.
1#include "SrcVertexFinder.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 = nullptr;
17 fGemHitsArray = nullptr;
18 fMwpcTracksArray = nullptr;
19 fTof400HitsArray = nullptr;
20 fVertexArray = nullptr;
21 fArmTracksArray = nullptr;
22 fTime = 0.0;
23 fisExp = isExp;
24}
25
30
32{
33 if (fVerbose > 1)
34 cout << "=========================== Vertex finder init started ====================" << endl;
35
37
38 // Get ROOT Manager
39 FairRootManager* ioman = FairRootManager::Instance();
40 if (nullptr == ioman)
41 Fatal("Init", "FairRootManager is not instantiated");
42
43 fGlobalTracksArray = (TClonesArray*)ioman->GetObject("BmnGlobalTrack"); // in
44 if (!fGlobalTracksArray) {
45 cout << "SrcVertexFinder::Init(): branch BmnGlobalTrack not found! Task will be deactivated" << endl;
46 SetActive(kFALSE);
47 return kERROR;
48 }
49 fGemHitsArray = (TClonesArray*)ioman->GetObject("BmnGemStripHit"); // in
50 if (!fGemHitsArray) {
51 cout << "SrcVertexFinder::Init(): branch BmnGemStripHit not found! Task will be deactivated" << endl;
52 SetActive(kFALSE);
53 return kERROR;
54 }
55 fTof400HitsArray = (TClonesArray*)ioman->GetObject("BmnTof400Hit"); // in
56 if (!fTof400HitsArray) {
57 cout << "SrcVertexFinder::Init(): branch BmnTof400Hit not found! Task will be deactivated" << endl;
58 SetActive(kFALSE);
59 return kERROR;
60 }
61 fMwpcTracksArray = (TClonesArray*)ioman->GetObject("BmnMwpcTrack"); // in
62 if (!fMwpcTracksArray) {
63 cout << "SrcVertexFinder::Init(): branch BmnMwpcTrack not found! Task will be deactivated" << endl;
64 SetActive(kFALSE);
65 return kERROR;
66 }
67
68 fVertexArray = new TClonesArray("BmnVertex", 1); // out
69 ioman->Register("SrcVertex", "VERTEX", fVertexArray, kTRUE);
70 fArmTracksArray = new TClonesArray("BmnTrack", 1); // out
71 ioman->Register("SrcArmTrack", "ARM", fArmTracksArray, kTRUE);
72
73 if (fVerbose > 1)
74 cout << "=========================== Vertex finder init finished ===================" << endl;
75
76 return kSUCCESS;
77}
78
80{
81 TStopwatch sw;
82 sw.Start();
83
84 if (!IsActive())
85 return;
86
87 if (fVerbose > 1) {
88 cout << "======================== Vertex finder exec started ======================" << endl;
89 cout << "Event number: " << fEventNo++ << endl;
90 }
91
92 fVertexArray->Delete();
93 fArmTracksArray->Delete();
94
95 vector<BmnTrack> lTracks;
96 vector<BmnTrack> rTracks;
97 CreateArmCandidates(lTracks, rTracks);
98
99 Int_t nTrWithUpstream = 0;
100 for (Int_t iTrack = 0; iTrack < fGlobalTracksArray->GetEntriesFast(); iTrack++) {
101 BmnGlobalTrack* track = (BmnGlobalTrack*)fGlobalTracksArray->UncheckedAt(iTrack);
102 if (track->GetUpstreamTrackIndex() == -1)
103 track->SetFlag(13);
104 else
105 nTrWithUpstream++;
106 }
107
108 if (lTracks.size() > 100 || rTracks.size() > 100 || nTrWithUpstream > 10) { // Check this condition!
109 new ((*fVertexArray)[fVertexArray->GetEntriesFast()]) BmnVertex();
110 if (fVerbose > 0)
111 cout << "SrcVertexFinder: Vertex NOT found" << endl;
112 } else {
113 // FindVertexByVirtualPlanes(lTracks, rTracks);
114 FindVertexAnalitically(lTracks, rTracks);
115 if (fVerbose > 0) {
116 BmnVertex* vert = (BmnVertex*)fVertexArray->At(0);
117 vert->Print();
118 }
119 }
120 lTracks.clear();
121 rTracks.clear();
122
123 if (fVerbose > 1)
124 cout << "\n======================== Vertex finder exec finished ======================" << endl;
125
126 sw.Stop();
127 fTime += sw.RealTime();
128}
129
130void SrcVertexFinder::FindVertexAnalitically(vector<BmnTrack>& lTracks, vector<BmnTrack>& rTracks)
131{
132 Double_t minVZ = 1000;
133 Double_t vy = 1000;
134 Double_t vx = 1000;
135 Double_t minDist = 1000;
136 vector<BmnTrack> trackCombination;
137 vector<BmnTrack> bestCombination;
138 if (lTracks.size() != 0 && rTracks.size() != 0) {
139 minDist = 1000;
140 minVZ = 1000;
141 for (auto lTr : lTracks) {
142 for (auto rTr : rTracks) {
143 trackCombination.push_back(lTr);
144 trackCombination.push_back(rTr);
146 Double_t vz = GetVzByVectorStraightTracks(trackCombination, dist);
147 if (dist < minDist) {
148 minDist = dist;
149 minVZ = vz;
150 bestCombination = trackCombination;
151 }
152 trackCombination.clear();
153 }
154 }
155 } else if (lTracks.size() != 0 && rTracks.size() == 0) {
156 for (auto lTr : lTracks) {
157 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
159 if (gl->GetUpstreamTrackIndex() == -1)
160 continue;
161 trackCombination.push_back(*((BmnTrack*)fGlobalTracksArray->At(iGl)));
162 }
163 for (Int_t iM = 0; iM < fMwpcTracksArray->GetEntriesFast(); ++iM) {
164 BmnTrack* mTr = (BmnTrack*)fMwpcTracksArray->At(iM);
165 if (mTr->GetParamFirst()->GetZ() < -700)
166 trackCombination.push_back(*mTr);
167 }
168 trackCombination.push_back(lTr);
170 Double_t vz = GetVzByVectorStraightTracks(trackCombination, dist);
171 if (dist < minDist) {
172 minDist = dist;
173 minVZ = vz;
174 bestCombination = trackCombination;
175 }
176 trackCombination.clear();
177 }
178 } else if (rTracks.size() != 0 && lTracks.size() == 0) {
179 for (auto rTr : rTracks) {
180 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
182 if (gl->GetUpstreamTrackIndex() == -1)
183 continue;
184 trackCombination.push_back(*((BmnTrack*)fGlobalTracksArray->At(iGl)));
185 }
186 for (Int_t iM = 0; iM < fMwpcTracksArray->GetEntriesFast(); ++iM) {
187 BmnTrack* mTr = (BmnTrack*)fMwpcTracksArray->At(iM);
188 if (mTr->GetParamFirst()->GetZ() < -700)
189 trackCombination.push_back(*mTr);
190 }
191 trackCombination.push_back(rTr);
193 Double_t vz = GetVzByVectorStraightTracks(trackCombination, dist);
194 if (dist < minDist) {
195 minDist = dist;
196 minVZ = vz;
197 bestCombination = trackCombination;
198 }
199 trackCombination.clear();
200 }
201 } else if (rTracks.size() == 0 && lTracks.size() == 0) {
202 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
204 if (gl->GetUpstreamTrackIndex() == -1)
205 continue;
206 trackCombination.push_back(*((BmnTrack*)fGlobalTracksArray->At(iGl)));
207 }
208 for (Int_t iM = 0; iM < fMwpcTracksArray->GetEntriesFast(); ++iM) {
209 BmnTrack* mTr = (BmnTrack*)fMwpcTracksArray->At(iM);
210 if (mTr->GetParamFirst()->GetZ() < -700)
211 trackCombination.push_back(*mTr);
212 }
214 Double_t vz = GetVzByVectorStraightTracks(trackCombination, dist);
215 if (dist < minDist) {
216 minDist = dist;
217 minVZ = vz;
218 bestCombination = trackCombination;
219 }
220 trackCombination.clear();
221 } else
222 new ((*fVertexArray)[fVertexArray->GetEntriesFast()]) BmnVertex();
223
224 if (minDist > 10.0) {
225 new ((*fVertexArray)[fVertexArray->GetEntriesFast()]) BmnVertex();
226 } else {
227 for (Int_t iM = 0; iM < fMwpcTracksArray->GetEntriesFast(); ++iM) {
228 BmnTrack* mTr = (BmnTrack*)fMwpcTracksArray->At(iM);
229 if (mTr->GetParamFirst()->GetZ() > -700)
230 continue; // we need incoming beam
231 Double_t ax = mTr->GetParamFirst()->GetTx();
232 Double_t ay = mTr->GetParamFirst()->GetTy();
233 Double_t x = mTr->GetParamFirst()->GetX();
234 Double_t y = mTr->GetParamFirst()->GetY();
235 Double_t z = mTr->GetParamFirst()->GetZ();
236 Double_t bx = x - ax * z;
237 Double_t by = y - ay * z;
238 vx = ax * minVZ + bx;
239 vy = ay * minVZ + by;
240 }
241
242 Bool_t isLeft = kFALSE;
243 Bool_t isRight = kFALSE;
244 Bool_t isFragm = kFALSE;
245 Bool_t isBeam = kFALSE;
246 for (size_t iTr = 0; iTr < bestCombination.size(); ++iTr) {
247 BmnTrack track = bestCombination[iTr];
248 if (track.GetFlag() == 13)
249 continue;
250 if (track.GetParamFirst()->GetZ() > -700 && track.GetParamFirst()->GetZ() < -400
251 && track.GetParamFirst()->GetX() < 0)
252 { // right arm track
253 track.SetNHits(2);
254 new ((*fArmTracksArray)[fArmTracksArray->GetEntriesFast()]) BmnTrack(track);
255 isRight = kTRUE;
256 }
257 if (track.GetParamFirst()->GetZ() > -700 && track.GetParamFirst()->GetZ() < -400
258 && track.GetParamFirst()->GetX() > 0)
259 { // left arm track
260 track.SetNHits(2);
261 new ((*fArmTracksArray)[fArmTracksArray->GetEntriesFast()]) BmnTrack(track);
262 isLeft = kTRUE;
263 }
264 if (track.GetParamFirst()->GetZ() > -400) { // fragment track
265 isFragm = kTRUE;
266 }
267 if (track.GetParamFirst()->GetZ() < -700) { // fragment track
268 isBeam = kTRUE;
269 }
270 }
271
272 Int_t type = (isRight && isLeft) ? 10
273 : (isLeft && isFragm && isBeam) ? 11
274 : (isRight && isFragm && isBeam) ? 12
275 : (isBeam && isFragm) ? 13
276 : -1;
277
278 vector<Int_t> idx;
279 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
280 BmnTrack gl = *((BmnTrack*)fGlobalTracksArray->At(iGl));
281 if (gl.GetFlag() != 13)
282 idx.push_back(iGl);
283 }
284
285 new ((*fVertexArray)[fVertexArray->GetEntriesFast()])
286 BmnVertex(vx, vy, minVZ, minDist, 0, bestCombination.size(), TMatrixFSym(3), type, idx);
287 }
288}
289
290void SrcVertexFinder::FindVertexByVirtualPlanes(vector<BmnTrack>& lTracks, vector<BmnTrack>& rTracks)
291{
292 Float_t minDist = DBL_MAX; // minimal distance beetween tracks in point of vertex
293 Float_t minVZ = DBL_MAX; // VZ for tracks with minimal distance
294 vector<BmnTrack> trackCombination;
295 vector<BmnTrack> bestCombination;
296 if (lTracks.size() > 0 && rTracks.size() > 0) {
297 for (auto lTr : lTracks) {
298 for (auto rTr : rTracks) {
299 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
301 if (gl.GetUpstreamTrackIndex() != -1)
302 trackCombination.push_back(*((BmnTrack*)fGlobalTracksArray->At(iGl)));
303 }
304 trackCombination.push_back(lTr);
305 trackCombination.push_back(rTr);
307 Float_t vz = FindVZByVirtualPlanes(-647, 100, trackCombination, dist);
308 if (vz < -999) {
309 trackCombination.clear();
310 continue;
311 }
312 if (dist < minDist) {
313 minDist = dist;
314 minVZ = vz;
315 bestCombination = trackCombination;
316 }
317 trackCombination.clear();
318 }
319 }
320 } else if (lTracks.size() == 0 && rTracks.size() > 0) {
321 for (auto rTr : rTracks) {
322 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
324 if (gl.GetUpstreamTrackIndex() != -1)
325 trackCombination.push_back(*((BmnTrack*)fGlobalTracksArray->At(iGl)));
326 }
327 trackCombination.push_back(rTr);
329 Float_t vz = FindVZByVirtualPlanes(-647, 100, trackCombination, dist);
330 if (vz < -999) {
331 trackCombination.clear();
332 continue;
333 }
334 if (dist < minDist) {
335 minDist = dist;
336 minVZ = vz;
337 bestCombination = trackCombination;
338 }
339 trackCombination.clear();
340 }
341 } else if (lTracks.size() > 0 && rTracks.size() == 0) {
342 for (auto lTr : lTracks) {
343 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
345 if (gl.GetUpstreamTrackIndex() != -1)
346 trackCombination.push_back(*((BmnTrack*)fGlobalTracksArray->At(iGl)));
347 }
348 trackCombination.push_back(lTr);
350 Float_t vz = FindVZByVirtualPlanes(-647, 100, trackCombination, dist);
351 if (vz < -999) {
352 trackCombination.clear();
353 continue;
354 }
355 if (dist < minDist) {
356 minDist = dist;
357 minVZ = vz;
358 bestCombination = trackCombination;
359 }
360 trackCombination.clear();
361 }
362 }
363 if (minDist > 10.0) {
364 new ((*fVertexArray)[fVertexArray->GetEntriesFast()]) BmnVertex();
365 } else {
366 vector<Double_t> xHits;
367 vector<Double_t> yHits;
368 for (size_t iTr = 0; iTr < bestCombination.size(); ++iTr) {
369 BmnTrack* track = &bestCombination[iTr];
370 FairTrackParam par0 =
371 (track->GetParamFirst()->GetZ() < -400) ? (*(track->GetParamLast())) : (*(track->GetParamFirst()));
372 Double_t len = track->GetLength();
373 if (fKalman->TGeoTrackPropagate(&par0, minVZ, 2212, nullptr, &len) == kBMNERROR) {
374 track->SetFlag(13);
375 continue;
376 }
377 track->SetLength(len);
378 track->SetB(
379 len / track->GetB()
380 / (TMath::C() * 1e-7)); // for arm tracks B contains beta. It is stupid, but simple way to store it...
381 xHits.push_back(par0.GetX());
382 yHits.push_back(par0.GetY());
383 }
384 if (xHits.size() < 2) {
385 new ((*fVertexArray)[fVertexArray->GetEntriesFast()]) BmnVertex();
386 return;
387 }
388
389 Bool_t isLeft = kFALSE;
390 Bool_t isRight = kFALSE;
391 Bool_t isFragm = kFALSE;
392 for (size_t iTr = 0; iTr < bestCombination.size(); ++iTr) {
393 BmnTrack track = bestCombination[iTr];
394 if (track.GetFlag() == 13)
395 continue;
396 if (track.GetParamFirst()->GetZ() < -400 && track.GetParamFirst()->GetX() < 0) { // right arm track
397 track.SetNHits(2);
398 new ((*fArmTracksArray)[fArmTracksArray->GetEntriesFast()]) BmnTrack(track);
399 isRight = kTRUE;
400 }
401 if (track.GetParamFirst()->GetZ() < -400 && track.GetParamFirst()->GetX() > 0) { // left arm track
402 track.SetNHits(2);
403 new ((*fArmTracksArray)[fArmTracksArray->GetEntriesFast()]) BmnTrack(track);
404 isLeft = kTRUE;
405 }
406 if (track.GetParamFirst()->GetZ() > -400) { // fragment track
407
408 isFragm = kTRUE;
409 }
410 }
411
412 Int_t type = (isRight && isLeft && isFragm) ? 10 : (isRight && isLeft) ? 11 : (isLeft && isFragm) ? 12 : 13;
413
414 Double_t vz = minVZ;
415 Double_t vx = Mean(xHits.begin(), xHits.end());
416 Double_t vy = Mean(yHits.begin(), yHits.end());
417
418 vector<Int_t> idx;
419 for (Int_t iGl = 0; iGl < fGlobalTracksArray->GetEntriesFast(); ++iGl) {
420 BmnTrack gl = *((BmnTrack*)fGlobalTracksArray->At(iGl));
421 if (gl.GetFlag() != 13)
422 idx.push_back(iGl);
423 }
424
425 new ((*fVertexArray)[fVertexArray->GetEntriesFast()])
426 BmnVertex(vx, vy, vz, minDist, 0, xHits.size(), TMatrixFSym(3), type, idx);
427 }
428}
429
431{
432 ofstream outFile;
433 outFile.open("QA/timing.txt", ofstream::app);
434 outFile << "Vertex Finder Time: " << fTime;
435 if (fVerbose == 0)
436 cout << "Work time of the GEM vertex finder: " << fTime << endl;
437}
438
439Double_t SrcVertexFinder::CalcMeanDist(vector<Double_t> x, vector<Double_t> y)
440{
441 Double_t sumDist = 0.0;
442 Int_t nPairs = 0;
443 for (size_t i = 0; i < x.size(); ++i) {
444 for (size_t j = i + 1; j < x.size(); ++j) {
445 sumDist += Sqrt(Sq(x[i] - x[j]) + Sq(y[i] - y[j]));
446 nPairs++;
447 }
448 }
449 return sumDist / nPairs; // calc. ave. dist value
450}
451
452Float_t SrcVertexFinder::FindVZByVirtualPlanes(Float_t z_0, Float_t range, vector<BmnTrack> tracks, Float_t& minDist)
453{
454 const Int_t nPlanes = 5;
455 Float_t minZ = z_0;
456
457 while (range >= 0.01) {
458 Float_t zMax = minZ + range;
459 Float_t zMin = minZ - range;
460 Float_t zStep = (zMax - zMin) / (nPlanes - 1);
461
462 vector<Double_t> xHits[nPlanes];
463 vector<Double_t> yHits[nPlanes];
464 Float_t zPlane[nPlanes];
465 Float_t rRMS[nPlanes] = {0};
466
467 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane)
468 zPlane[iPlane] = zMax - iPlane * zStep;
469
470 Int_t nOkTr = 0;
471
472 for (size_t iTr = 0; iTr < tracks.size(); ++iTr) {
473 BmnTrack track = tracks[iTr];
474 FairTrackParam par0 = *(track.GetParamFirst());
475 Double_t xTr[nPlanes];
476 Double_t yTr[nPlanes];
477 Bool_t trOk = kTRUE;
478 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
479 if (fKalman->TGeoTrackPropagate(&par0, zPlane[iPlane], 2212, nullptr, nullptr) == kBMNERROR) {
480 trOk = kFALSE;
481 break;
482 }
483
484 // cout << " " << par0.GetX() << " " << par0.GetY() << " " << par0.GetZ() << endl;
485 xTr[iPlane] = par0.GetX();
486 yTr[iPlane] = par0.GetY();
487 // xHits[iPlane].push_back(par0.GetX());
488 // yHits[iPlane].push_back(par0.GetY());
489 }
490
491 if (trOk) {
492 nOkTr++;
493 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
494 xHits[iPlane].push_back(xTr[iPlane]);
495 yHits[iPlane].push_back(yTr[iPlane]);
496 }
497 }
498 }
499
500 if (nOkTr < 2) {
501 minDist = DBL_MAX;
502 return -1000.0;
503 }
504
505 // Calculation minZ as minimum of parabola
506 for (Int_t iPlane = 0; iPlane < nPlanes; ++iPlane) {
507 rRMS[iPlane] = CalcMeanDist(xHits[iPlane], yHits[iPlane]);
508 }
509 TGraph* vertex = new TGraph(nPlanes, zPlane, rRMS);
510 TFitResultPtr ptr = vertex->Fit("pol2", "QFS");
511 Float_t c = ptr->Parameter(0);
512 Float_t b = ptr->Parameter(1);
513 Float_t a = ptr->Parameter(2);
514 minZ = -b / (2 * a);
515 minDist = a * minZ * minZ + b * minZ + c;
516 delete vertex;
517
518 range /= 2;
519 }
520 return minZ;
521}
522
523void SrcVertexFinder::CreateArmCandidates(vector<BmnTrack>& lTracks, vector<BmnTrack>& rTracks)
524{
525 vector<Int_t> lTofHitIdx;
526 vector<Int_t> rTofHitIdx;
527 for (Int_t iTof = 0; iTof < fTof400HitsArray->GetEntriesFast(); ++iTof) {
528 BmnHit* tHit = (BmnHit*)fTof400HitsArray->At(iTof);
529 if (tHit->GetX() > 0)
530 lTofHitIdx.push_back(iTof);
531 else
532 rTofHitIdx.push_back(iTof);
533 }
534 // Maybe we don't need next condition? Check it!
535 // if (lTofHitIdx.size() == 0 || rTofHitIdx.size() == 0) return; //one track must be on the left arm, another on
536 // the right
537
538 vector<Int_t> lGemHitIdx;
539 vector<Int_t> rGemHitIdx;
540 for (Int_t iGem = 0; iGem < fGemHitsArray->GetEntriesFast(); ++iGem) {
541 BmnHit* gHit = (BmnHit*)fGemHitsArray->At(iGem);
542 if (gHit->GetStation() > 3)
543 continue;
544 if (gHit->GetX() > 0)
545 lGemHitIdx.push_back(iGem);
546 else
547 rGemHitIdx.push_back(iGem);
548 }
549 // Maybe we don't need next condition? Check it!
550 // if (lGemHitIdx.size() == 0 || rGemHitIdx.size() == 0) return; //one track must be on the left arm, another on
551 // the right
552
553 BmnHit tHit, gHit;
554
555 // Coeficients for arms alignment
556 Double_t dxall, dyall;
557 Double_t dy_tl, dy_tr;
558 Double_t gx, gy, gz, tx, ty, tz;
559 if (fisExp) {
560 dxall = -2.113;
561 dyall = 2.504;
562 dy_tl = -1.72;
563 dy_tr = 1.3;
564 } else {
565 dxall = 0;
566 dyall = 0;
567 dy_tl = 0;
568 dy_tr = 0;
569 }
570
571 for (auto gIdx : lGemHitIdx) {
572 for (auto tIdx : lTofHitIdx) {
573 tHit = *((BmnHit*)fTof400HitsArray->At(tIdx));
574 gHit = *((BmnHit*)fGemHitsArray->At(gIdx));
575 BmnTrack lTr;
576 gx = gHit.GetX() + dxall;
577 gy = gHit.GetY() + dyall;
578 gz = gHit.GetZ();
579 tx = tHit.GetX() + dxall;
580 ty = tHit.GetY() + dyall + dy_tl;
581 tz = tHit.GetZ();
582
583 lTr.GetParamFirst()->SetX(gx);
584 lTr.GetParamFirst()->SetY(gy);
585 lTr.GetParamFirst()->SetZ(gz);
586 lTr.GetParamFirst()->SetTx((tx - gx) / (tz - gz));
587 lTr.GetParamFirst()->SetTy((ty - gy) / (tz - gz));
588 lTr.GetParamLast()->SetX(tx);
589 lTr.GetParamLast()->SetY(ty);
590 lTr.GetParamLast()->SetZ(tz);
591 lTr.GetParamLast()->SetTx((tx - gx) / (tz - gz));
592 lTr.GetParamLast()->SetTy((ty - gy) / (tz - gz));
593 lTr.SetB(tHit.GetTimeStamp()); // temporary
594 lTracks.push_back(lTr);
595 }
596 }
597 for (auto gIdx : rGemHitIdx) {
598 for (auto tIdx : rTofHitIdx) {
599 tHit = *((BmnHit*)fTof400HitsArray->At(tIdx));
600 gHit = *((BmnHit*)fGemHitsArray->At(gIdx));
601 BmnTrack rTr;
602 gx = gHit.GetX() + dxall;
603 gy = gHit.GetY() + dyall;
604 gz = gHit.GetZ();
605 tx = tHit.GetX() + dxall;
606 ty = tHit.GetY() + dyall + dy_tr;
607 tz = tHit.GetZ();
608
609 rTr.GetParamFirst()->SetX(gx);
610 rTr.GetParamFirst()->SetY(gy);
611 rTr.GetParamFirst()->SetZ(gz);
612 rTr.GetParamFirst()->SetTx((tx - gx) / (tz - gz));
613 rTr.GetParamFirst()->SetTy((ty - gy) / (tz - gz));
614 rTr.GetParamLast()->SetX(tx);
615 rTr.GetParamLast()->SetY(ty);
616 rTr.GetParamLast()->SetZ(tz);
617 rTr.GetParamLast()->SetTx((tx - gx) / (tz - gz));
618 rTr.GetParamLast()->SetTy((ty - gy) / (tz - gz));
619 rTr.SetB(tHit.GetTimeStamp()); // temporary
620 rTracks.push_back(rTr);
621 }
622 }
623}
vector< Double_t > dist(vector< Double_t > qp, Double_t mu)
Definition BmnMath.cxx:869
Double_t GetVzByVectorStraightTracks(vector< BmnTrack > tr, Double_t &dist)
Definition BmnMath.cxx:999
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.
Short_t GetStation() const
Definition BmnHit.h:35
Float_t GetLength() const
Definition BmnTrack.h:61
void SetFlag(Int_t flag)
Definition BmnTrack.h:74
FairTrackParam * GetParamFirst()
Definition BmnTrack.h:63
Float_t GetB() const
Definition BmnTrack.h:59
void SetNHits(Int_t n)
Definition BmnTrack.h:80
void SetB(Double_t b)
Definition BmnTrack.h:82
FairTrackParam * GetParamLast()
Definition BmnTrack.h:65
void SetLength(Double_t length)
Definition BmnTrack.h:84
Int_t GetFlag() const
Definition BmnTrack.h:53
void Print()
Ouput to screen.
Definition BmnVertex.cxx:65
double Parameter(unsigned int i) const
TClonesArray * fGemHitsArray
TClonesArray * fGlobalTracksArray
TClonesArray * fArmTracksArray
TClonesArray * fTof400HitsArray
void FindVertexAnalitically(vector< BmnTrack > &lTracks, vector< BmnTrack > &rTracks)
TClonesArray * fMwpcTracksArray
virtual ~SrcVertexFinder()
void FindVertexByVirtualPlanes(vector< BmnTrack > &lTracks, vector< BmnTrack > &rTracks)
void CreateArmCandidates(vector< BmnTrack > &lTracks, vector< BmnTrack > &rTracks)
Double_t CalcMeanDist(vector< Double_t > x, vector< Double_t > y)
virtual void Finish()
Float_t FindVZByVirtualPlanes(Float_t z_0, Float_t range, vector< BmnTrack > tracks, Float_t &minDist)
TClonesArray * fVertexArray
virtual InitStatus Init()
virtual void Exec(Option_t *opt)
BmnKalmanFilter * fKalman
virtual TFitResultPtr Fit(const char *formula, Option_t *option="", Option_t *goption="", Axis_t xmin=0, Axis_t xmax=0)
Double_t RealTime()
void Start(Bool_t reset=kTRUE)
void Stop()
constexpr Double_t C()
Double_t Sq(Double_t x)
Double_t Sqrt(Double_t x)
Double_t Mean(Iterator first, Iterator last)
Definition json.hpp:4446