12#include "BmnGemStripHit.h"
13#include "BmnKalmanFilter.h"
16#include "BmnSiliconHit.h"
17#include "FairRunAna.h"
18#include "FairTrackParam.h"
20#include "BmnFieldMap.h"
28static Double_t workTime = 0.0;
29static Double_t hitMatchTime = 0.0;
30static Double_t hitMatchTimeLoop = 0.0;
31static Double_t construct_4of4_time = 0.0;
32static Double_t construct_3of4_time = 0.0;
33static Double_t construct_2of4_time = 0.0;
34static Double_t CalculateTrackParTime = 0.0;
35static Double_t SortHitsTime = 0.0;
36static Double_t trackUpdateTime = 0.0;
37static Double_t sortTrackTime = 0.0;
38static Double_t trackSelectionTime = 0.0;
50 fNSiliconStations = 0;
51 fGemHitsArray =
nullptr;
52 fSilHitsArray =
nullptr;
54 fRoughVertex = TVector3(0.5, -4.6, -2.3);
55 fGlobTracksArray =
nullptr;
56 fGemTracksArray =
nullptr;
57 fSilTracksArray =
nullptr;
59 fGemHitsBranchName =
"BmnGemStripHit";
60 fSilHitsBranchName =
"BmnSiliconHit";
61 fGlobTracksBranchName =
"BmnGlobalTrack";
62 fGemTracksBranchName =
"BmnGemTrack";
63 fSilTracksBranchName =
"BmnSiliconTrack";
64 fGemDetector =
nullptr;
65 fSilDetector =
nullptr;
66 fHitXCutMin =
nullptr;
67 fHitXCutMax =
nullptr;
68 fHitYCutMin =
nullptr;
69 fHitYCutMax =
nullptr;
71 fDoHitAsymFiltration = kTRUE;
85 if (fVerbose > 1) cout <<
"======================== GEM tracking init started ====================" << endl;
90 FairRootManager* ioman = FairRootManager::Instance();
92 Fatal(
"Init",
"FairRootManager is not instantiated");
95 fMCTracksArray = (TClonesArray*)ioman->GetObject(
"MCTrack");
98 fGemPointsArray = (TClonesArray*)ioman->GetObject(
"StsPoint");
99 fGemHitsArray = (TClonesArray*)ioman->GetObject(fGemHitsBranchName);
100 fGemTracksArray =
new TClonesArray(
"BmnTrack", 100);
101 ioman->Register(fGemTracksBranchName,
"GEM", fGemTracksArray, kTRUE);
104 fSilPointsArray = (TClonesArray*)ioman->GetObject(
"SiliconPoint");
105 fSilHitsArray = (TClonesArray*)ioman->GetObject(fSilHitsBranchName);
106 fSilTracksArray =
new TClonesArray(
"BmnTrack", 100);
107 ioman->Register(fSilTracksBranchName,
"SILICON", fSilTracksArray, kTRUE);
109 if (!fGemHitsArray) {
110 cout <<
"BmnInnerTrackingRun7::Init(): branch " << fGemHitsBranchName <<
" not found! Task will be deactivated" << endl;
112 return InitStatus::kERROR;
115 fGlobTracksArray =
new TClonesArray(
"BmnGlobalTrack", 100);
116 ioman->Register(fGlobTracksBranchName,
"GLOBAL", fGlobTracksArray, kTRUE);
117 fHitsArray =
new TClonesArray(
"BmnHit", 100);
118 ioman->Register(
"BmnInnerHits",
"HITS", fHitsArray, kTRUE);
120 fField = FairRunAna::Instance()->GetField();
121 if (!fField) Fatal(
"Init",
"No Magnetic Field found");
123 TString gPathConfig = gSystem->Getenv(
"VMCWORKDIR");
125 TString gPathGemConfig = gPathConfig +
"/parameters/gem/XMLConfigs/";
126 TString confGem =
"GemRunSpring2018.xml";
129 TString gPathSiConfig = gPathConfig +
"/parameters/silicon/XMLConfigs/";
130 TString confSi =
"SiliconRunSpring2018.xml";
136 fNSiliconStations = nSilStations;
138 fNStations = nGemStations + nSilStations;
140 fHitXCutMin =
new Double_t[fNStations];
141 fHitXCutMax =
new Double_t[fNStations];
142 fHitYCutMin =
new Double_t[fNStations];
143 fHitYCutMax =
new Double_t[fNStations];
147 fSteering =
new BmnSteering(isField ?
"BMN_run7_withField.dat" :
"BMN_run7_noField.dat");
149 if (fVerbose > 1) cout <<
"======================== GEM tracking init finished ===================" << endl;
155 if (fVerbose > 1) cout <<
"\n======================== GEM tracking exec started ====================" << endl;
156 if (fVerbose > 1) cout <<
"\n Event number: " << fEventNo << endl;
158 if (!IsActive())
return;
160 clock_t tStart = clock();
162 fSilTracksArray->Delete();
163 fGemTracksArray->Delete();
164 fGlobTracksArray->Delete();
165 fHitsArray->Delete();
174 Double_t a[2][9] = {{1.29, 1.50, 1.33, 1.14, 1.17, 1.14, 1.00, 1.14, 1.14},
175 {1.33, 1.17, 1.00, 1.14, 1.33, 1.33, 1.14, 1.33, 1.33}};
176 Double_t b[2][9] = {{-645, -1500, -1330, -570, -585, -570, -500, -570, -570},
177 {500, 1000, 1000, 500, 500, 500, 500, 500, 500}};
179 for (Int_t iHit = 0; iHit < fSilHitsArray->GetEntriesFast(); ++iHit) {
184 if (fDoHitAsymFiltration)
186 if (Sl < a[0][iSt] * Su + b[0][iSt] || Sl > a[1][iSt] * Su + b[1][iSt])
197 innerHit.SetDxyz(0.5, 0.5, 0.5);
199 new ((*fHitsArray)[fHitsArray->GetEntriesFast()])
BmnHit(innerHit);
201 for (Int_t iHit = 0; iHit < fGemHitsArray->GetEntriesFast(); ++iHit) {
206 if (fDoHitAsymFiltration)
208 if (Sl < a[0][iSt] * Su + b[0][iSt] || Sl > a[1][iSt] * Su + b[1][iSt])
220 innerHit.SetDxyz(0.5, 0.5, 0.5);
222 new ((*fHitsArray)[fHitsArray->GetEntriesFast()])
BmnHit(innerHit);
225 if (fHitsArray->GetEntriesFast() > nHitsCut || fHitsArray->GetEntriesFast() == 0)
return;
227 for (Int_t iStat = 0; iStat < fNStations; iStat++) {
239 FindTracks_4of4_OnLastGEMStations();
241 FindTracks_3of4_OnLastGEMStations();
244 FindTracks_2of2_OnFirstGEMStationsDownstream();
246 FindTracks_2of2_OnFirstGEMStationsUpstream();
251 clock_t tFinish = clock();
252 if (fVerbose > 0) cout <<
"BmnInnerTrackingRun7: " << fGlobTracksArray->GetEntriesFast() <<
" tracks" << endl;
254 workTime += ((Double_t)(tFinish - tStart)) / CLOCKS_PER_SEC;
256 if (fVerbose > 1) cout <<
"\n======================== GEM tracking exec finished ===================" << endl;
259BmnStatus BmnInnerTrackingRun7::FindTracks_4of4_OnLastGEMStations() {
261 const Int_t nxRanges = 8;
262 const Int_t nyRanges = 5;
263 Double_t xRangeMin[nxRanges] = {-80, -60, -40, -20, 0, 20, 40, 60};
264 Double_t xRangeMax[nxRanges] = {-60, -40, -20, 0, 20, 40, 60, 80};
265 map<Short_t, vector<Double_t>> xRMS = {
266 {6, {7.0, 5.3, 4.4, 3.5, 3.4, 3.9, 5.1, 5.3}},
267 {7, {6.8, 6.3, 4.8, 3.7, 3.7, 4.5, 5.3, 6.0}},
268 {8, {6.0, 5.9, 5.2, 4.3, 3.4, 4.2, 4.8, 5.1}}};
269 Double_t yRangeMin[nyRanges] = {-10, 0, 10, 20, 30};
270 Double_t yRangeMax[nyRanges] = {0, 10, 20, 30, 40};
271 map<Short_t, vector<Double_t>> yRMS = {
272 {6, {0.8, 0.8, 0.9, 1.0, 0.9}},
273 {7, {0.9, 0.7, 1.0, 1.0, 0.9}},
274 {8, {0.5, 0.6, 0.8, 0.7, 0.7}}};
276 Double_t Y6[2] = {0.87, 0.16};
277 Double_t Y7[2] = {0.84, 0.15};
278 Double_t Y8[2] = {0.61, 0.13};
279 Double_t X6[2] = {1.04, 0.19};
280 Double_t X7[2] = {1.42, 0.18};
281 Double_t X8[2] = {1.41, 0.14};
283 vector<BmnHit*> sortedHits[fNStations];
284 SortHits(sortedHits);
286 vector<BmnTrack> candidates;
287 vector<BmnTrack> sortedCandidates;
298 for (
BmnHit* hit8 : sortedHits[8]) {
299 for (
BmnHit* hit7 : sortedHits[7]) {
300 Double_t x8 = hit8->GetX();
301 Double_t y8 = hit8->GetY();
302 Double_t dxEx = x8 - hit7->GetX();
303 Double_t dxTh = x8 * X8[1] + X8[0];
304 Double_t dyEx = y8 - hit7->GetY();
305 Double_t dyTh = y8 * Y8[1] + Y8[0];
308 for (
iX = 0;
iX < nxRanges; ++
iX)
309 if (x8 > xRangeMin[
iX] && x8 < xRangeMax[
iX])
break;
311 for (
iY = 0;
iY < nyRanges; ++
iY)
312 if (y8 > yRangeMin[
iY] && y8 < yRangeMax[
iY])
break;
313 if ((
iX >= nxRanges) || (
iY >= nyRanges))
315 if (fVerbose > 0) cout<<
"WARNING: x8 or y8 is out of range, the hit is skipped (x = "<<x8<<
", y = "<<y8<<
")"<<endl;
318 Double_t rmsX = 2.0 * xRMS[8][
iX];
319 Double_t rmsY = 3.0 * yRMS[8][
iY];
321 if (Abs(dxEx - dxTh) > rmsX || Abs(dyEx - dyTh) > rmsY)
continue;
322 for (
BmnHit* hit6 : sortedHits[6]) {
323 Double_t x7 = hit7->GetX();
324 Double_t y7 = hit7->GetY();
325 dxEx = x7 - hit6->GetX();
326 dxTh = x7 * X7[1] + X7[0];
327 dyEx = y7 - hit6->GetY();
328 dyTh = y7 * Y7[1] + Y7[0];
331 for (
iX = 0;
iX < nxRanges; ++
iX)
332 if (x7 > xRangeMin[
iX] && x7 < xRangeMax[
iX])
break;
334 for (
iY = 0;
iY < nyRanges; ++
iY)
335 if (y7 > yRangeMin[
iY] && y7 < yRangeMax[
iY])
break;
336 if ((
iX >= nxRanges) || (
iY >= nyRanges))
338 if (fVerbose > 0) cout<<
"WARNING: x7 or y7 is out of range, the hit is skipped (x = "<<x7<<
", y = "<<y7<<
")"<<endl;
341 rmsX = 2.0 * xRMS[7][
iX];
342 rmsY = 3.0 * yRMS[7][
iY];
344 if (Abs(dxEx - dxTh) > rmsX || Abs(dyEx - dyTh) > rmsY)
continue;
345 for (
BmnHit* hit5 : sortedHits[5]) {
346 Double_t x6 = hit6->GetX();
347 Double_t y6 = hit6->GetY();
348 dxEx = x6 - hit5->GetX();
349 dxTh = x6 * X6[1] + X6[0];
350 dyEx = y6 - hit5->GetY();
351 dyTh = y6 * Y6[1] + Y6[0];
354 for (
iX = 0;
iX < nxRanges; ++
iX)
355 if (x6 > xRangeMin[
iX] && x6 < xRangeMax[
iX])
break;
357 for (
iY = 0;
iY < nyRanges; ++
iY)
358 if (y6 > yRangeMin[
iY] && y6 < yRangeMax[
iY])
break;
359 if ((
iX >= nxRanges) || (
iY >= nyRanges))
361 if (fVerbose > 0) cout<<
"WARNING: x6 or y6 is out of range, the hit is skipped (x = "<<x6<<
", y = "<<y6<<
")"<<endl;
364 rmsX = 2.0 * xRMS[6][
iX];
365 rmsY = 3.0 * yRMS[6][
iY];
367 if (Abs(dxEx - dxTh) > rmsX || Abs(dyEx - dyTh) > rmsY)
continue;
369 cand.
AddHit(hit8->GetRefIndex(), hit8);
370 cand.
AddHit(hit7->GetRefIndex(), hit7);
371 cand.
AddHit(hit6->GetRefIndex(), hit6);
372 cand.
AddHit(hit5->GetRefIndex(), hit5);
374 candidates.push_back(cand);
380 construct_4of4_time += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
387 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
389 MatchHit(&cand, sortedHits[4], kFALSE);
390 MatchHit(&cand, sortedHits[3], kFALSE);
392 MatchHit(&cand, sortedHits[2], kFALSE);
393 MatchHit(&cand, sortedHits[1], kFALSE);
394 MatchHit(&cand, sortedHits[0], kFALSE);
409 TrackUpdateByKalman(candidates);
411 TrackUpdateByLine(candidates);
412 SortTracks(candidates, sortedCandidates);
413 TrackSelection(sortedCandidates);
418BmnStatus BmnInnerTrackingRun7::FindCandidateByThreeStations(Short_t st0,
421 vector<BmnTrack>& candidates,
422 vector<BmnHit*>* sortedHits) {
425 const Int_t nxRanges = 8;
426 const Int_t nyRanges = 5;
427 Double_t xRangeMin[nxRanges] = {-80, -60, -40, -20, 0, 20, 40, 60};
428 Double_t xRangeMax[nxRanges] = {-60, -40, -20, 0, 20, 40, 60, 80};
430 map<Short_t, vector<Double_t>> xRMS = {
431 {6, {7.0, 5.3, 4.4, 3.5, 3.4, 3.9, 5.1, 5.3}},
432 {7, {6.8, 6.3, 4.8, 3.7, 3.7, 4.5, 5.3, 6.0}},
433 {8, {6.0, 5.9, 5.2, 4.3, 3.4, 4.2, 4.8, 5.1}}};
434 Double_t yRangeMin[nyRanges] = {-10, 0, 10, 20, 30};
435 Double_t yRangeMax[nyRanges] = {0, 10, 20, 30, 40};
436 map<Short_t, vector<Double_t>> yRMS = {
437 {6, {0.8, 0.8, 0.9, 1.0, 0.9}},
438 {7, {0.9, 0.7, 1.0, 1.0, 0.9}},
439 {8, {0.5, 0.6, 0.8, 0.7, 0.7}}};
440 map<Short_t, vector<Double_t>> xMap = {
444 map<Short_t, vector<Double_t>> yMap = {
449 for (
BmnHit* hit2 : sortedHits[st2]) {
450 for (
BmnHit* hit1 : sortedHits[st1]) {
451 Double_t x2 = hit2->GetX();
452 Double_t y2 = hit2->GetY();
453 Double_t x1 = hit1->GetX();
454 Double_t y1 = hit1->GetY();
455 Double_t dxEx = Abs(x2 - x1);
456 Double_t dxTh = Abs(x2 * xMap[st2][1] + xMap[st2][0]);
457 Double_t dyEx = Abs(y2 - y1);
458 Double_t dyTh = Abs(y2 * yMap[st2][1] + yMap[st2][0]);
461 for (
iX = 0;
iX < nxRanges; ++
iX)
462 if (x2 > xRangeMin[
iX] && x2 < xRangeMax[
iX])
break;
464 for (
iY = 0;
iY < nyRanges; ++
iY)
465 if (y2 > yRangeMin[
iY] && y2 < yRangeMax[
iY])
break;
466 if ((
iX >= nxRanges) || (
iY >= nyRanges))
468 if (fVerbose > 0) cout<<
"WARNING: x2 or y2 is out of range, the hit is skipped (x = "<<x2<<
", y = "<<y2<<
")"<<endl;
471 Double_t rmsX = 2.0 * xRMS[st2][
iX];
472 Double_t rmsY = 3.0 * yRMS[st2][
iY];
474 if (Abs(dxEx - dxTh) > rmsX || Abs(dyEx - dyTh) > rmsY)
continue;
475 for (
BmnHit* hit0 : sortedHits[st0]) {
476 dxEx = Abs(x1 - hit0->GetX());
477 dxTh = Abs(x1 * xMap[st1][1] + xMap[st1][0]);
478 dyEx = Abs(y1 - hit0->GetY());
479 dyTh = Abs(y1 * yMap[st1][1] + yMap[st1][0]);
482 for (
iX = 0;
iX < nxRanges; ++
iX)
483 if (x1 > xRangeMin[
iX] && x1 < xRangeMax[
iX])
break;
485 for (
iY = 0;
iY < nyRanges; ++
iY)
486 if (y1 > yRangeMin[
iY] && y1 < yRangeMax[
iY])
break;
487 if ((
iX >= nxRanges) || (
iY >= nyRanges))
489 if (fVerbose > 0) cout<<
"WARNING: x1 or y1 is out of range, the hit is skipped (x = "<<x1<<
", y = "<<y1<<
")"<<endl;
492 rmsX = 2.0 * xRMS[st1][
iX];
493 rmsY = 3.0 * yRMS[st1][
iY];
495 if (Abs(dxEx - dxTh) > rmsX || Abs(dyEx - dyTh) > rmsY)
continue;
497 cand.
AddHit(hit2->GetRefIndex(), hit2);
498 cand.
AddHit(hit1->GetRefIndex(), hit1);
499 cand.
AddHit(hit0->GetRefIndex(), hit0);
501 CalculateTrackParams(&cand);
502 candidates.push_back(cand);
507 construct_3of4_time += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
512BmnStatus BmnInnerTrackingRun7::FindTracks_3of4_OnLastGEMStations() {
513 vector<BmnHit*> sortedHits[fNStations];
514 SortHits(sortedHits);
516 vector<BmnTrack> candidates;
517 vector<BmnTrack> sortedCandidates;
519 FindCandidateByThreeStations(5, 6, 7, candidates, sortedHits);
520 FindCandidateByThreeStations(5, 7, 8, candidates, sortedHits);
521 FindCandidateByThreeStations(5, 6, 8, candidates, sortedHits);
522 FindCandidateByThreeStations(6, 7, 8, candidates, sortedHits);
527 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
529 MatchHit(&cand, sortedHits[4], kFALSE);
530 MatchHit(&cand, sortedHits[3], kFALSE);
532 MatchHit(&cand, sortedHits[2], kFALSE);
533 MatchHit(&cand, sortedHits[1], kFALSE);
534 MatchHit(&cand, sortedHits[0], kFALSE);
544 TrackUpdateByKalman(candidates);
546 TrackUpdateByLine(candidates);
547 SortTracks(candidates, sortedCandidates);
548 TrackSelection(sortedCandidates);
553BmnStatus BmnInnerTrackingRun7::MatchHit(
BmnTrack* cand, vector<BmnHit*> sortedHits, Bool_t downstream) {
557 if (sortedHits.size() == 0)
return kBMNERROR;
558 FairTrackParam par = downstream ? *(cand->
GetParamLast()) : *(cand->GetParamFirst());
559 Double_t minDist = DBL_MAX;
566 for (
BmnHit* hit : sortedHits) {
569 Double_t
d = Sqrt(Sq(par.GetX() - hit->GetX()) + Sq(par.GetY() - hit->GetY()));
571 if (
d < fDistCut &&
d < minDist) {
579 cand->
AddHit(minHit->GetRefIndex(), minHit);
582 fKalman->
Update(&par, minHit, chi2);
590 hitMatchTime += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
591 hitMatchTimeLoop += ((Double_t)(t0_1 - t0_0)) / CLOCKS_PER_SEC;
596BmnStatus BmnInnerTrackingRun7::FindCandidateByTwoStations(Short_t st0, Short_t st1, vector<BmnTrack>& candidates, vector<BmnHit*>* sortedHits) {
597 for (
BmnHit* hit1 : sortedHits[st1]) {
598 Double_t y1 = hit1->GetY();
599 Double_t z1 = hit1->GetZ();
600 for (
BmnHit* hit0 : sortedHits[st0]) {
601 Double_t y0 = hit0->GetY();
602 Double_t
z0 = hit0->GetZ();
603 if (Abs(hit1->GetX() - hit0->GetX()) > 40.0 || Abs(y1 - y0) > 20.0)
continue;
605 cand.
AddHit(hit1->GetRefIndex(), hit1);
606 cand.
AddHit(hit0->GetRefIndex(), hit0);
607 Double_t a = (y1 - y0) / (z1 -
z0);
608 Double_t b = (z1 * y0 - y1 *
z0) / (z1 -
z0);
609 Double_t minDist = DBL_MAX;
611 for (
BmnHit* hit : sortedHits[4]) {
612 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
613 if (
d < minDist &&
d < 0.5) {
619 cand.
AddHit(minHit->GetRefIndex(), minHit);
623 for (
BmnHit* hit : sortedHits[3]) {
624 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
625 if (
d < minDist &&
d < 0.5) {
631 cand.
AddHit(minHit->GetRefIndex(), minHit);
634 candidates.push_back(cand);
641BmnStatus BmnInnerTrackingRun7::FindTracks_2of2_OnFirstGEMStationsDownstream() {
642 vector<BmnHit*> sortedHits[fNStations];
643 SortHits(sortedHits);
646 vector<BmnTrack> candidates;
647 vector<BmnTrack> sortedCandidates;
648 for (
BmnHit* hit1 : sortedHits[4]) {
649 Double_t y1 = hit1->GetY();
650 Double_t z1 = hit1->GetZ();
651 for (
BmnHit* hit0 : sortedHits[3]) {
652 Double_t y0 = hit0->GetY();
653 Double_t
z0 = hit0->GetZ();
654 if (Abs(hit1->GetX() - hit0->GetX()) > 40.0 || Abs(y1 - y0) > 10.0)
continue;
656 cand.
AddHit(hit1->GetRefIndex(), hit1);
657 cand.
AddHit(hit0->GetRefIndex(), hit0);
658 Double_t a = (y1 - y0) / (z1 -
z0);
659 Double_t b = (z1 * y0 - y1 *
z0) / (z1 -
z0);
661 Double_t minDist = DBL_MAX;
663 for (
BmnHit* hit : sortedHits[5]) {
664 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
665 if (
d < minDist &&
d < fDistCut) {
671 cand.
AddHit(minHit->GetRefIndex(), minHit);
674 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
680 MatchHit(&cand, sortedHits[6], kTRUE);
681 MatchHit(&cand, sortedHits[7], kTRUE);
682 MatchHit(&cand, sortedHits[8], kTRUE);
685 MatchHit(&cand, sortedHits[2], kFALSE);
686 MatchHit(&cand, sortedHits[1], kFALSE);
687 MatchHit(&cand, sortedHits[0], kFALSE);
689 candidates.push_back(cand);
693 for (
BmnHit* hit : sortedHits[6]) {
694 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
695 if (
d < minDist &&
d < fDistCut) {
701 cand.
AddHit(minHit->GetRefIndex(), minHit);
704 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
710 MatchHit(&cand, sortedHits[7], kTRUE);
711 MatchHit(&cand, sortedHits[8], kTRUE);
714 MatchHit(&cand, sortedHits[2], kFALSE);
715 MatchHit(&cand, sortedHits[1], kFALSE);
716 MatchHit(&cand, sortedHits[0], kFALSE);
718 candidates.push_back(cand);
722 for (
BmnHit* hit : sortedHits[7]) {
723 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
724 if (
d < minDist &&
d < fDistCut) {
730 cand.
AddHit(minHit->GetRefIndex(), minHit);
733 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
739 MatchHit(&cand, sortedHits[8], kTRUE);
742 MatchHit(&cand, sortedHits[2], kFALSE);
743 MatchHit(&cand, sortedHits[1], kFALSE);
744 MatchHit(&cand, sortedHits[0], kFALSE);
746 candidates.push_back(cand);
750 for (
BmnHit* hit : sortedHits[8]) {
751 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
752 if (
d < minDist &&
d < fDistCut) {
758 cand.
AddHit(minHit->GetRefIndex(), minHit);
761 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
767 MatchHit(&cand, sortedHits[2], kFALSE);
768 MatchHit(&cand, sortedHits[1], kFALSE);
769 MatchHit(&cand, sortedHits[0], kFALSE);
771 candidates.push_back(cand);
775 for (
BmnHit* hit : sortedHits[2]) {
776 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
777 if (
d < minDist &&
d < fDistCut) {
783 cand.
AddHit(minHit->GetRefIndex(), minHit);
786 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
792 MatchHit(&cand, sortedHits[1], kFALSE);
793 MatchHit(&cand, sortedHits[0], kFALSE);
795 candidates.push_back(cand);
799 for (
BmnHit* hit : sortedHits[1]) {
800 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
801 if (
d < minDist &&
d < fDistCut) {
807 cand.
AddHit(minHit->GetRefIndex(), minHit);
810 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
816 MatchHit(&cand, sortedHits[0], kFALSE);
818 candidates.push_back(cand);
828 construct_2of4_time += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
834 TrackUpdateByKalman(candidates);
836 TrackUpdateByLine(candidates);
837 SortTracks(candidates, sortedCandidates);
838 TrackSelection(sortedCandidates);
843BmnStatus BmnInnerTrackingRun7::FindTracks_2of2_OnFirstGEMStationsUpstream() {
844 vector<BmnHit*> sortedHits[fNStations];
845 SortHits(sortedHits);
847 vector<BmnTrack> candidates;
848 vector<BmnTrack> sortedCandidates;
849 for (
BmnHit* hit1 : sortedHits[4]) {
850 Double_t y1 = hit1->GetY();
851 Double_t z1 = hit1->GetZ();
852 for (
BmnHit* hit0 : sortedHits[3]) {
853 Double_t y0 = hit0->GetY();
854 Double_t
z0 = hit0->GetZ();
855 if (Abs(hit1->GetX() - hit0->GetX()) > 40.0 || Abs(y1 - y0) > 10.0)
continue;
857 cand.
AddHit(hit1->GetRefIndex(), hit1);
858 cand.
AddHit(hit0->GetRefIndex(), hit0);
859 Double_t a = (y1 - y0) / (z1 -
z0);
860 Double_t b = (z1 * y0 - y1 *
z0) / (z1 -
z0);
861 Double_t minDist = DBL_MAX;
863 for (
BmnHit* hit : sortedHits[2]) {
864 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
865 if (
d < minDist &&
d < fDistCut) {
871 cand.
AddHit(minHit->GetRefIndex(), minHit);
875 for (
BmnHit* hit : sortedHits[1]) {
876 Double_t
d = Abs(hit->GetY() - (a * hit->GetZ() + b));
877 if (
d < minDist &&
d < fDistCut) {
883 cand.
AddHit(minHit->GetRefIndex(), minHit);
886 candidates.push_back(cand);
890 construct_2of4_time += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
894 if (CalculateTrackParams(&cand) ==
kBMNERROR)
continue;
897 MatchHit(&cand, sortedHits[5], kTRUE);
898 MatchHit(&cand, sortedHits[6], kTRUE);
899 MatchHit(&cand, sortedHits[7], kTRUE);
900 MatchHit(&cand, sortedHits[8], kTRUE);
903 MatchHit(&cand, sortedHits[2], kFALSE);
904 MatchHit(&cand, sortedHits[1], kFALSE);
905 MatchHit(&cand, sortedHits[0], kFALSE);
915 TrackUpdateByKalman(candidates);
917 TrackUpdateByLine(candidates);
918 SortTracks(candidates, sortedCandidates);
919 TrackSelection(sortedCandidates);
924BmnStatus BmnInnerTrackingRun7::SortTracks(vector<BmnTrack>& inTracks, vector<BmnTrack>& sortedTracks) {
926 const Int_t n = fNStations - fNHitsCut + 1;
927 multimap<Float_t, Int_t> sortedMap[n];
928 for (
size_t iTr = 0; iTr < inTracks.size(); ++iTr) {
929 if (inTracks.at(iTr).GetNHits() < fNHitsCut || inTracks.at(iTr).GetNHits() > fNStations)
continue;
930 if (inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF() > fChiSquareCut)
continue;
931 sortedMap[inTracks.at(iTr).GetNHits() - fNHitsCut].insert(pair<Float_t, Int_t>(inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF(), iTr));
934 for (Int_t
i = n - 1;
i >= 0;
i--) {
935 for (
auto it : sortedMap[
i])
936 sortedTracks.push_back(inTracks.at(it.second));
937 sortedMap[
i].clear();
947 sortTrackTime += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
953 outFile.open(
"QA/timing.txt");
954 outFile <<
"Track Finder Time: " << workTime << endl;
956 cout <<
"hitMatchTime: " << hitMatchTime << endl;
957 cout <<
"hitMatchTimeLoop: " << hitMatchTimeLoop << endl;
958 cout <<
"construct_4of4_time: " << construct_4of4_time << endl;
959 cout <<
"construct_3of4_time: " << construct_3of4_time << endl;
960 cout <<
"construct_2of4_time: " << construct_2of4_time << endl;
961 cout <<
"CalculateTrackParTime: " << CalculateTrackParTime << endl;
962 cout <<
"SortHitsTime: " << SortHitsTime << endl;
963 cout <<
"trackUpdateTime: " << trackUpdateTime << endl;
964 cout <<
"sortTrackTime: " << sortTrackTime << endl;
965 cout <<
"trackSelectionTime: " << trackSelectionTime << endl;
967 cout <<
"Work time of the GEM tracking: " << workTime << endl;
971BmnStatus BmnInnerTrackingRun7::SortHits(vector<BmnHit*>* sortedHits) {
973 for (Int_t iHit = 0; iHit < fHitsArray->GetEntriesFast(); ++iHit) {
976 if (hit->
IsUsed())
continue;
977 hit->SetRefIndex(iHit);
980 if (hit->GetY() > fHitYCutMax[station] || hit->GetY() < fHitYCutMin[station])
continue;
981 sortedHits[station].push_back(hit);
984 SortHitsTime += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
989BmnStatus BmnInnerTrackingRun7::TrackUpdateByLine(vector<BmnTrack>& cands) {
996 cand.
SetChi2((chiX - chiY) > 0. ? chiX : chiY);
1008BmnStatus BmnInnerTrackingRun7::TrackUpdateByKalman(vector<BmnTrack>& cands) {
1011 if (cand.
GetNHits() < fNHitsCut)
continue;
1014 Double_t chiTot = 0.0;
1015 for (Int_t iHit = 0; iHit < cand.
GetNHits(); ++iHit) {
1019 fKalman->
Update(&par, hit, chi);
1022 for (Int_t iHit = cand.
GetNHits() - 1; iHit >= 0; iHit--) {
1026 fKalman->
Update(&par, hit, chi);
1033 trackUpdateTime += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
1038BmnStatus BmnInnerTrackingRun7::TrackSelection(vector<BmnTrack>& sortedTracks) {
1061 CheckSharedHits(sortedTracks);
1062 for (
size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
1069 for (Int_t iHit = 0; iHit < tr.
GetNHits(); ++iHit) {
1071 globTr.
AddHit(hit->GetRefIndex(), hit);
1075 else if (detId ==
kGEM)
1086 new ((*fSilTracksArray)[fSilTracksArray->GetEntriesFast()])
BmnTrack(silTr);
1092 new ((*fGemTracksArray)[fGemTracksArray->GetEntriesFast()])
BmnTrack(gemTr);
1101 new ((*fGlobTracksArray)[fGlobTracksArray->GetEntriesFast()])
BmnGlobalTrack(globTr);
1102 SetHitsUsing(&tr, kTRUE);
1103 if (!fIsTarget && iTr == 0)
break;
1106 trackSelectionTime += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
1111void BmnInnerTrackingRun7::SetHitsUsing(
BmnTrack* tr, Bool_t use) {
1137 const UInt_t nHits = tr->
GetNHits();
1138 Double_t chi2circ = 0.0;
1139 TVector3 CircParZX =
CircleFit(tr, fHitsArray, chi2circ);
1141 Double_t Xc = CircParZX.Y();
1142 Double_t Zc = CircParZX.X();
1143 fField = FairRunAna::Instance()->GetField();
1144 const Double_t B = (
LineFit(tr, fHitsArray,
"ZY")).X();
1146 Double_t Q = (Xc > 0) ? +1 : -1;
1148 Double_t sumX(0.0), sumY(0.0), sumTx(0.0), sumTy(0.0), sumQP(0.0);
1149 Double_t sumXX(0.0), sumXY(0.0), sumXTx(0.0), sumXTy(0.0), sumXQP(0.0);
1150 Double_t sumYY(0.0), sumYTx(0.0), sumYTy(0.0), sumYQP(0.0);
1151 Double_t sumTxTx(0.0), sumTxTy(0.0), sumTxQP(0.0);
1152 Double_t sumTyTy(0.0), sumTyQP(0.0);
1153 Double_t sumQPQP(0.0);
1155 for (UInt_t
i = 0;
i < nHits; ++
i) {
1158 Double_t Xi = hit->GetX();
1159 Double_t Yi = hit->GetY();
1160 Double_t Zi = hit->GetZ();
1162 Double_t Txi = -1.0 * (Zi - Zc) / (Xi - Xc);
1164 Double_t Ri = Sqrt(Sq(Xi - Xc) + Sq(Zi - Zc));
1165 Double_t QPi = Q / (0.0003 * Abs(fField->GetBy(Xi, Yi, Zi)) * Ri);
1181 sumTxTx += Txi * Txi;
1182 sumTxTy += Txi * Tyi;
1183 sumTxQP += Txi * QPi;
1184 sumTyTy += Tyi * Tyi;
1185 sumTyQP += Tyi * QPi;
1186 sumQPQP += QPi * QPi;
1189 Double_t meanX = sumX / nHits;
1190 Double_t meanY = sumY / nHits;
1191 Double_t meanTx = sumTx / nHits;
1192 Double_t meanTy = sumTy / nHits;
1193 Double_t meanQP = sumQP / nHits;
1195 Double_t Cov_X_X = sumXX / nHits - Sq(meanX);
1196 Double_t Cov_X_Y = sumXY / nHits - meanX * meanY;
1197 Double_t Cov_X_Tx = sumXTx / nHits - meanX * meanTx;
1198 Double_t Cov_X_Ty = sumXTy / nHits - meanX * meanTy;
1199 Double_t Cov_X_Qp = sumXQP / nHits - meanX * meanQP;
1200 Double_t Cov_Y_Y = sumYY / nHits - Sq(meanY);
1201 Double_t Cov_Y_Tx = sumYTx / nHits - meanY * meanTx;
1202 Double_t Cov_Y_Ty = sumYTy / nHits - meanY * meanTy;
1203 Double_t Cov_Y_Qp = sumYQP / nHits - meanY * meanQP;
1204 Double_t Cov_Tx_Tx = sumTxTx / nHits - Sq(meanTx);
1205 Double_t Cov_Tx_Ty = sumTxTy / nHits - meanTx * meanTy;
1206 Double_t Cov_Tx_Qp = sumTxQP / nHits - meanTx * meanQP;
1207 Double_t Cov_Ty_Ty = sumTyTy / nHits - Sq(meanTy);
1208 Double_t Cov_Ty_Qp = sumTyQP / nHits - meanTy * meanQP;
1209 Double_t Cov_Qp_Qp = sumQPQP / nHits - Sq(meanQP);
1212 par.SetCovariance(0, 0, Cov_X_X);
1213 par.SetCovariance(0, 1, Cov_X_Y);
1214 par.SetCovariance(0, 2, Cov_X_Tx);
1215 par.SetCovariance(0, 3, Cov_X_Ty);
1216 par.SetCovariance(0, 4, Cov_X_Qp);
1217 par.SetCovariance(1, 1, Cov_Y_Y);
1218 par.SetCovariance(1, 2, Cov_Y_Tx);
1219 par.SetCovariance(1, 3, Cov_Y_Ty);
1220 par.SetCovariance(1, 4, Cov_Y_Qp);
1221 par.SetCovariance(2, 2, Cov_Tx_Tx);
1222 par.SetCovariance(2, 3, Cov_Tx_Ty);
1223 par.SetCovariance(2, 4, Cov_Tx_Qp);
1224 par.SetCovariance(3, 3, Cov_Ty_Ty);
1225 par.SetCovariance(3, 4, Cov_Ty_Qp);
1226 par.SetCovariance(4, 4, Cov_Qp_Qp);
1240 const UInt_t nHits = tr->
GetNHits();
1242 TVector3 lineParZY =
LineFit(tr, fHitsArray,
"ZY");
1243 if (lineParZY.Z() > 1)
return kBMNERROR;
1245 const Double_t B = lineParZY.X();
1250 if (isField) CalcCovMatrix(tr);
1261 Bool_t doSimple = (nHits == 3) ? kTRUE : kFALSE;
1262 Double_t QP = isField ? CalcQp(tr, doSimple) : 0.0;
1266 CalculateTrackParTime += ((Double_t)(t1 - t0)) / CLOCKS_PER_SEC;
1270TVector2 BmnInnerTrackingRun7::CalcMeanSigma(vector<Double_t> QpSegm) {
1271 Double_t QpSum = 0.;
1272 for (
size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
1273 QpSum += QpSegm[iSegm];
1275 Double_t QpMean = QpSum / QpSegm.size();
1277 Double_t sqSigmaSum = 0.;
1278 for (
size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
1279 sqSigmaSum += Sq(QpSegm[iSegm] - QpMean);
1281 return TVector2(QpMean, Sqrt(sqSigmaSum / QpSegm.size()));
1284Double_t BmnInnerTrackingRun7::CalcQp(
BmnTrack* track, Bool_t doSimple) {
1287 vector<BmnHit*> hits;
1289 for (Int_t iHit = 0; iHit < track->
GetNHits(); iHit++)
1292 Int_t kNSegm = track->
GetNHits() - 2;
1294 Double_t QpRefit = 0.;
1295 vector<Double_t> QpSegmBefore;
1298 for (Int_t iHit = 0; iHit < kNSegm; iHit++) {
1299 BmnHit* first = hits[iHit];
1300 BmnHit* second = hits[iHit + 1];
1301 BmnHit* third = hits[iHit + 2];
1303 TVector3 CircParZX =
CircleBy3Hit(first, second, third);
1304 Double_t R = CircParZX.Z();
1305 Double_t Xc = CircParZX.Y();
1306 Double_t Zc = CircParZX.X();
1308 Double_t Q = (Xc > 0) ? +1. : -1.;
1309 Double_t S = 0.0003 * (Abs(fField->GetBy(third->GetX(), third->GetY(), third->GetZ())) + Abs(fField->GetBy(second->GetX(), second->GetY(), second->GetZ())) + Abs(fField->GetBy(first->GetX(), first->GetY(), first->GetZ()))) / 3.;
1311 Double_t Pt = S * R;
1312 Double_t fX = first->GetX();
1313 Double_t fZ = first->GetZ();
1317 Double_t Tx_first = h * (fZ - Zc) / (fX - Xc);
1318 TVector3 lineParZY =
LineFit(track, fHitsArray,
"ZY");
1319 const Double_t B = lineParZY.X();
1320 Double_t Ty_first = B;
1322 Double_t Pz = Pt / Sqrt(1 + Sq(Tx_first));
1323 Double_t Px = Tx_first * Pz;
1324 Double_t Py = Ty_first * Pz;
1325 Double_t P = Sqrt(Sq(Px) + Sq(Py) + Sq(Pz));
1326 Double_t QP = Q / P;
1328 QpSegmBefore.push_back(QP);
1333 vector<Double_t> QpSegmAfter;
1335 TVector2 meanSig = CalcMeanSigma(QpSegmBefore);
1336 Double_t mean = meanSig.X();
1337 Double_t sigma = meanSig.Y();
1338 if (std::isnan(sigma) && fVerbose == 3) {
1339 cout <<
"Bad refit convergence for track segment!!" << endl;
1343 for (
size_t iSegm = 0; iSegm < QpSegmBefore.size(); iSegm++)
1344 if (Abs(QpSegmBefore[iSegm] - mean) - sigma <= 0.001)
1345 QpSegmAfter.push_back(QpSegmBefore[iSegm]);
1347 if (QpSegmAfter.size() == QpSegmBefore.size()) {
1351 QpSegmBefore.clear();
1352 QpSegmBefore.resize(0);
1354 for (
size_t iSegm = 0; iSegm < QpSegmAfter.size(); iSegm++)
1355 QpSegmBefore.push_back(QpSegmAfter[iSegm]);
1357 QpSegmAfter.clear();
1358 QpSegmAfter.resize(0);
1366 for (
size_t iEle = 0; iEle < QpSegmBefore.size(); iEle++)
1367 QpRefit += QpSegmBefore[iEle];
1369 QpRefit /= QpSegmBefore.size();
1371 vector<Double_t>
d =
dist(QpSegmBefore, QpRefit);
1373 Double_t sigma = 0.;
1374 for (
size_t i = 0;
i < QpSegmBefore.size();
i++)
1375 sigma += (QpSegmBefore[
i] - QpRefit) * (QpSegmBefore[
i] - QpRefit);
1376 sigma = Sqrt(sigma / QpSegmBefore.size());
1378 vector<Double_t> w =
W(
d, sigma);
1381 const Int_t kNIter = 20;
1382 for (Int_t iIter = 1; iIter < kNIter; iIter++) {
1383 QpRefit =
Mu(QpSegmBefore, w);
1384 d =
dist(QpSegmBefore, QpRefit);
1393Double_t BmnInnerTrackingRun7::CalculateLength(
BmnTrack* tr) {
1394 if (!tr)
return 0.0;
1396 vector<Double_t> X, Y, Z;
1397 for (Int_t iGem = 0; iGem < tr->
GetNHits(); iGem++) {
1400 X.push_back(hit->GetX());
1401 Y.push_back(hit->GetY());
1402 Z.push_back(hit->GetZ());
1405 Double_t length = 0.;
1406 for (
size_t i = 0;
i < X.size() - 1;
i++) {
1407 Double_t dX = X[
i] - X[
i + 1];
1408 Double_t dY = Y[
i] - Y[
i + 1];
1409 Double_t dZ = Z[
i] - Z[
i + 1];
1410 length += Sqrt(dX * dX + dY * dY + dZ * dZ);
1416BmnStatus BmnInnerTrackingRun7::CheckSharedHits(vector<BmnTrack>& sortedTracks) {
1419 const Int_t kNSharedHits = 1;
1421 for (
size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
1422 BmnTrack* tr = &(sortedTracks.at(iTr));
1423 if (tr->
GetFlag() == 666)
continue;
1425 Int_t nofSharedHits = 0;
1427 for (Int_t iHit = 0; iHit < nofHits; iHit++)
1428 if (hitsId.find(tr->
GetHitIndex(iHit)) != hitsId.end()) {
1430 if (nofSharedHits > kNSharedHits) {
1435 if (tr->
GetFlag() == 666)
continue;
1437 for (Int_t iHit = 0; iHit < nofHits; iHit++)
1445BmnStatus BmnInnerTrackingRun7::DrawHits() {
1446 TH2F* h_HitsZX =
new TH2F(
"h_HitsZX",
"h_HitsZX", 400, 0.0, 200.0, 400, -100.0, 100.0);
1447 TH2F* h_HitsZY =
new TH2F(
"h_HitsZY",
"h_HitsZY", 400, 0.0, 200.0, 400, -10.0, 50.0);
1448 for (Int_t
i = 0;
i < fHitsArray->GetEntriesFast(); ++
i) {
1450 h_HitsZX->Fill(hit->GetZ(), hit->GetX());
1451 h_HitsZY->Fill(hit->GetZ(), hit->GetY());
1454 TCanvas* c =
new TCanvas(
"c",
"c", 1000, 1000);
1457 h_HitsZX->SetMarkerStyle(8);
1458 h_HitsZX->SetMarkerSize(0.7);
1459 h_HitsZX->SetMarkerColor(kRed);
1460 h_HitsZX->Draw(
"P");
1463 h_HitsZY->SetMarkerStyle(8);
1464 h_HitsZY->SetMarkerSize(0.7);
1465 h_HitsZY->SetMarkerColor(kRed);
1466 h_HitsZY->Draw(
"P");
1470 for (Int_t iTr = 0; iTr < fGlobTracksArray->GetEntriesFast(); ++iTr) {
1487 for (Int_t iHit = 1; iHit < silTr->
GetNHits(); iHit++) {
1489 Double_t x = hit->GetX();
1490 Double_t y = hit->GetY();
1491 Double_t z = hit->GetZ();
1492 TLine* lineZX =
new TLine(z, x, zPrev, xPrev);
1493 lineZX->SetLineColor(kRed);
1494 lineZX->SetLineWidth(2);
1495 TLine* lineZY =
new TLine(z, y, zPrev, yPrev);
1496 lineZY->SetLineColor(kRed);
1497 lineZY->SetLineWidth(2);
1499 lineZX->Draw(
"same");
1501 lineZY->Draw(
"same");
1520 for (Int_t iHit = startIdx; iHit < gemTr->
GetNHits(); iHit++) {
1522 Double_t x = hit->GetX();
1523 Double_t y = hit->GetY();
1524 Double_t z = hit->GetZ();
1525 TLine* lineZX =
new TLine(z, x, zPrev, xPrev);
1526 lineZX->SetLineColor(kRed);
1527 lineZX->SetLineWidth(2);
1528 TLine* lineZY =
new TLine(z, y, zPrev, yPrev);
1529 lineZY->SetLineColor(kRed);
1530 lineZY->SetLineWidth(2);
1532 lineZX->Draw(
"same");
1534 lineZY->Draw(
"same");
1605 c->SaveAs(
"hits.png");
TVector3 LineFit(BmnTrack *track, const TClonesArray *arr, TString type)
TVector3 CircleBy3Hit(BmnTrack *track, const TClonesArray *arr)
Double_t Mu(vector< Double_t > qp, vector< Double_t > w)
TVector3 CircleFit(BmnTrack *track, const TClonesArray *arr, Double_t &chi2)
Double_t CalcTx(const BmnHit *h0, const BmnHit *h1, const BmnHit *h2)
vector< Double_t > dist(vector< Double_t > qp, Double_t mu)
Bool_t IsParCorrect(const FairTrackParam *par, const Bool_t isField)
Double_t Sigma(vector< Double_t > dist, vector< Double_t > w)
vector< Double_t > W(vector< Double_t > dist, Double_t sig)
const Float_t d
Z-ccordinate of the first GEM-station.
Bool_t IsFieldOff() const
Double_t GetStripTotalSignalInUpperLayer()
Double_t GetStripTotalSignalInLowerLayer()
void SetSilTrackIndex(Int_t iSil)
void SetGemTrackIndex(Int_t iGem)
Int_t GetGemTrackIndex() const
Int_t GetSilTrackIndex() const
DetectorId GetDetId() const
void SetUsing(Bool_t use)
void SetDetId(DetectorId det)
void SetStation(Short_t st)
Short_t GetStation() const
virtual InitStatus Init()
virtual ~BmnInnerTrackingRun7()
virtual void Exec(Option_t *opt)
BmnStatus TGeoTrackPropagate(FairTrackParam *par, Double_t zOut, Int_t pdg, vector< Double_t > *F, Double_t *length, Bool_t isField)
BmnStatus Update(FairTrackParam *par, const BmnHit *hit, Double_t &chiSq)
Double_t GetStripTotalSignalInLowerLayer()
Double_t GetStripTotalSignalInUpperLayer()
Double_t * GetHitXCutMax()
Double_t * GetHitYCutMin()
Double_t * GetHitYCutMax()
Double_t * GetHitXCutMin()
Double_t GetChiSquareCut()
void SetChi2(Double_t chi2)
void SetParamLast(FairTrackParam &par)
FairTrackParam * GetParamFirst()
Int_t GetHitIndex(Int_t iHit) const
void AddHit(Int_t hitIndex, FairHit *Hit)
void SetParamFirst(FairTrackParam &par)
FairTrackParam * GetParamLast()
void SetLength(Double_t length)