12#include "BmnGemStripHit.h"
13#include "BmnKalmanFilter.h"
16#include "FairRunAna.h"
17#include "FairTrackParam.h"
19#include "BmnFieldMap.h"
27static Double_t workTime = 0.0;
39 fGemHitsArray =
nullptr;
41 fGlobTracksArray =
nullptr;
42 fGemTracksArray =
nullptr;
44 fGemHitsBranchName =
"BmnGemStripHit";
45 fGlobTracksBranchName =
"BmnGlobalTrack";
46 fGemTracksBranchName =
"BmnGemTrack";
47 fGemDetector =
nullptr;
48 fHitXCutMin =
nullptr;
49 fHitXCutMax =
nullptr;
50 fHitYCutMin =
nullptr;
51 fHitYCutMax =
nullptr;
65 if (fVerbose > 1) cout <<
"======================== GEM tracking init started ====================" << endl;
70 FairRootManager* ioman = FairRootManager::Instance();
72 Fatal(
"Init",
"FairRootManager is not instantiated");
75 fMCTracksArray = (TClonesArray*)ioman->GetObject(
"MCTrack");
78 fGemPointsArray = (TClonesArray*)ioman->GetObject(
"StsPoint");
79 fGemHitsArray = (TClonesArray*)ioman->GetObject(fGemHitsBranchName);
80 fGemTracksArray =
new TClonesArray(
"BmnTrack", 100);
81 ioman->Register(fGemTracksBranchName,
"GEM", fGemTracksArray, kTRUE);
84 cout <<
"SrcInnerTrackingRun7::Init(): branch " << fGemHitsBranchName <<
" not found! Task will be deactivated" << endl;
89 fGlobTracksArray =
new TClonesArray(
"BmnGlobalTrack", 100);
90 ioman->Register(fGlobTracksBranchName,
"GLOBAL", fGlobTracksArray, kTRUE);
91 fHitsArray =
new TClonesArray(
"BmnHit", 100);
92 ioman->Register(
"BmnInnerHits",
"HITS", fHitsArray, kTRUE);
94 fField = FairRunAna::Instance()->GetField();
95 if (!fField) Fatal(
"Init",
"No Magnetic Field found");
97 TString gPathConfig = gSystem->Getenv(
"VMCWORKDIR");
98 TString gPathGemConfig = gPathConfig +
"/parameters/gem/XMLConfigs/GemRunSRCSpring2018.xml";
102 fHitXCutMin =
new Double_t[fNStations];
103 fHitXCutMax =
new Double_t[fNStations];
104 fHitYCutMin =
new Double_t[fNStations];
105 fHitYCutMax =
new Double_t[fNStations];
109 fSteering =
new BmnSteering(isField ?
"SRC_run7_withField.dat" :
"SRC_run7_noField.dat");
111 if (fVerbose > 1) cout <<
"======================== GEM tracking init finished ===================" << endl;
117 if (fVerbose > 1) cout <<
"\n======================== GEM tracking exec started ====================" << endl;
118 if (fVerbose > 1) cout <<
"\n Event number: " << fEventNo << endl;
120 if (!IsActive())
return;
122 clock_t tStart = clock();
124 fGemTracksArray->Delete();
125 fGlobTracksArray->Delete();
126 fHitsArray->Delete();
129 Int_t nHitsCut = 200;
131 for (Int_t iHit = 0; iHit < fGemHitsArray->GetEntriesFast(); ++iHit) {
138 hit.SetDxyz(0.5, 0.5, 0.5);
139 new ((*fHitsArray)[fHitsArray->GetEntriesFast()])
BmnHit(hit);
142 if (fHitsArray->GetEntriesFast() > nHitsCut || fHitsArray->GetEntriesFast() == 0)
return;
144 for (Int_t iStat = 0; iStat < fNStations; iStat++) {
164 clock_t tFinish = clock();
165 if (fVerbose > 0) cout <<
"SrcInnerTrackingRun7: " << fGlobTracksArray->GetEntriesFast() <<
" tracks" << endl;
167 workTime += ((Double_t)(tFinish - tStart)) / CLOCKS_PER_SEC;
169 if (fVerbose > 1) cout <<
"\n======================== GEM tracking exec finished ===================" << endl;
173BmnStatus SrcInnerTrackingRun7::FindTracks_6of6() {
174 vector<BmnHit*> sortedHits[fNStations];
175 SortHits(sortedHits);
177 vector<BmnTrack> candidates;
178 vector<BmnTrack> sortedCandidates;
180 for (
BmnHit* hit5 : sortedHits[5]) {
181 for (
BmnHit* hit4 : sortedHits[4]) {
182 if (Abs(hit5->GetX() - hit4->GetX()) > 5 || Abs(hit5->GetY() - hit4->GetY()) > 2)
continue;
183 for (
BmnHit* hit3 : sortedHits[3]) {
184 if (Abs(hit4->GetX() - hit3->GetX()) > 5 || Abs(hit4->GetY() - hit3->GetY()) > 2)
continue;
185 for (
BmnHit* hit2 : sortedHits[2]) {
186 if (Abs(hit3->GetX() - hit2->GetX()) > 5 || Abs(hit3->GetY() - hit2->GetY()) > 2)
continue;
187 for (
BmnHit* hit1 : sortedHits[1]) {
188 if (Abs(hit2->GetX() - hit1->GetX()) > 5 || Abs(hit2->GetY() - hit1->GetY()) > 2)
continue;
189 for (
BmnHit* hit0 : sortedHits[0]) {
190 if (Abs(hit1->GetX() - hit0->GetX()) > 5 || Abs(hit1->GetY() - hit0->GetY()) > 2)
continue;
192 cand.
AddHit(hit5->GetRefIndex(), hit5);
193 cand.
AddHit(hit4->GetRefIndex(), hit4);
194 cand.
AddHit(hit3->GetRefIndex(), hit3);
195 cand.
AddHit(hit2->GetRefIndex(), hit2);
196 cand.
AddHit(hit1->GetRefIndex(), hit1);
197 cand.
AddHit(hit0->GetRefIndex(), hit0);
199 CalculateTrackParams(&cand);
201 candidates.push_back(cand);
212 TrackUpdateByKalman(candidates);
214 TrackUpdateByLine(candidates);
215 SortTracks(candidates, sortedCandidates);
216 TrackSelection(sortedCandidates);
221BmnStatus SrcInnerTrackingRun7::FindTracks_3of6() {
222 vector<BmnHit*> sortedHits[fNStations];
223 SortHits(sortedHits);
225 vector<BmnTrack> candidates;
226 vector<BmnTrack> sortedCandidates;
228 FindCandidateByThreeStations(0, 1, 2, candidates, sortedHits);
229 FindCandidateByThreeStations(1, 2, 3, candidates, sortedHits);
230 FindCandidateByThreeStations(2, 3, 4, candidates, sortedHits);
231 FindCandidateByThreeStations(3, 4, 5, candidates, sortedHits);
236 TrackUpdateByKalman(candidates);
238 TrackUpdateByLine(candidates);
239 SortTracks(candidates, sortedCandidates);
240 TrackSelection(sortedCandidates);
245BmnStatus SrcInnerTrackingRun7::FindTracks_5of6() {
246 vector<BmnHit*> sortedHits[fNStations];
247 SortHits(sortedHits);
249 vector<BmnTrack> candidates;
250 vector<BmnTrack> sortedCandidates;
252 FindCandidateByFiveStations(0, 1, 2, 3, 4, candidates, sortedHits);
253 FindCandidateByFiveStations(0, 1, 2, 3, 5, candidates, sortedHits);
254 FindCandidateByFiveStations(0, 1, 2, 4, 5, candidates, sortedHits);
255 FindCandidateByFiveStations(0, 1, 3, 4, 5, candidates, sortedHits);
256 FindCandidateByFiveStations(0, 2, 3, 4, 5, candidates, sortedHits);
257 FindCandidateByFiveStations(1, 2, 3, 4, 5, candidates, sortedHits);
262 TrackUpdateByKalman(candidates);
264 TrackUpdateByLine(candidates);
265 SortTracks(candidates, sortedCandidates);
266 TrackSelection(sortedCandidates);
271BmnStatus SrcInnerTrackingRun7::FindTracks_4of6() {
272 vector<BmnHit*> sortedHits[fNStations];
273 SortHits(sortedHits);
275 vector<BmnTrack> candidates;
276 vector<BmnTrack> sortedCandidates;
278 FindCandidateByFourStations(0, 1, 2, 3, candidates, sortedHits);
279 FindCandidateByFourStations(1, 2, 3, 4, candidates, sortedHits);
280 FindCandidateByFourStations(2, 3, 4, 5, candidates, sortedHits);
282 FindCandidateByFourStations(1, 3, 4, 5, candidates, sortedHits);
283 FindCandidateByFourStations(0, 2, 3, 4, candidates, sortedHits);
284 FindCandidateByFourStations(1, 2, 3, 5, candidates, sortedHits);
285 FindCandidateByFourStations(0, 1, 2, 4, candidates, sortedHits);
287 FindCandidateByFourStations(0, 3, 4, 5, candidates, sortedHits);
288 FindCandidateByFourStations(0, 1, 2, 5, candidates, sortedHits);
289 FindCandidateByFourStations(1, 2, 4, 5, candidates, sortedHits);
290 FindCandidateByFourStations(0, 2, 4, 5, candidates, sortedHits);
291 FindCandidateByFourStations(0, 2, 3, 5, candidates, sortedHits);
292 FindCandidateByFourStations(0, 1, 4, 5, candidates, sortedHits);
293 FindCandidateByFourStations(0, 1, 3, 5, candidates, sortedHits);
294 FindCandidateByFourStations(0, 1, 3, 4, candidates, sortedHits);
299 TrackUpdateByKalman(candidates);
301 TrackUpdateByLine(candidates);
302 SortTracks(candidates, sortedCandidates);
303 TrackSelection(sortedCandidates);
308BmnStatus SrcInnerTrackingRun7::FindCandidateByFiveStations(Short_t st0, Short_t st1, Short_t st2, Short_t st3, Short_t st4, vector<BmnTrack>& candidates, vector<BmnHit*>* sortedHits) {
309 for (
BmnHit* hit4 : sortedHits[st4]) {
310 for (
BmnHit* hit3 : sortedHits[st3]) {
311 if (Abs(hit4->GetX() - hit3->GetX()) > 5 || Abs(hit4->GetY() - hit3->GetY()) > 2)
continue;
312 for (
BmnHit* hit2 : sortedHits[st2]) {
313 if (Abs(hit3->GetX() - hit2->GetX()) > 5 || Abs(hit3->GetY() - hit2->GetY()) > 2)
continue;
314 for (
BmnHit* hit1 : sortedHits[st1]) {
315 if (Abs(hit2->GetX() - hit1->GetX()) > 5 || Abs(hit2->GetY() - hit1->GetY()) > 2)
continue;
316 for (
BmnHit* hit0 : sortedHits[st0]) {
317 if (Abs(hit1->GetX() - hit0->GetX()) > 5 || Abs(hit1->GetY() - hit0->GetY()) > 2)
continue;
319 cand.
AddHit(hit4->GetRefIndex(), hit4);
320 cand.
AddHit(hit3->GetRefIndex(), hit3);
321 cand.
AddHit(hit2->GetRefIndex(), hit2);
322 cand.
AddHit(hit1->GetRefIndex(), hit1);
323 cand.
AddHit(hit0->GetRefIndex(), hit0);
325 CalculateTrackParams(&cand);
326 candidates.push_back(cand);
336BmnStatus SrcInnerTrackingRun7::FindCandidateByFourStations(Short_t st0, Short_t st1, Short_t st2, Short_t st3, vector<BmnTrack>& candidates, vector<BmnHit*>* sortedHits) {
337 for (
BmnHit* hit3 : sortedHits[st3]) {
338 for (
BmnHit* hit2 : sortedHits[st2]) {
339 if (Abs(hit3->GetX() - hit2->GetX()) > 5 || Abs(hit3->GetY() - hit2->GetY()) > 2)
continue;
340 for (
BmnHit* hit1 : sortedHits[st1]) {
341 if (Abs(hit2->GetX() - hit1->GetX()) > 5 || Abs(hit2->GetY() - hit1->GetY()) > 2)
continue;
342 for (
BmnHit* hit0 : sortedHits[st0]) {
343 if (Abs(hit1->GetX() - hit0->GetX()) > 5 || Abs(hit1->GetY() - hit0->GetY()) > 2)
continue;
345 cand.
AddHit(hit3->GetRefIndex(), hit3);
346 cand.
AddHit(hit2->GetRefIndex(), hit2);
347 cand.
AddHit(hit1->GetRefIndex(), hit1);
348 cand.
AddHit(hit0->GetRefIndex(), hit0);
350 CalculateTrackParams(&cand);
351 candidates.push_back(cand);
356 vector<Short_t> restSt(2);
357 for (Int_t
i = 0;
i < fNStations; ++
i) {
358 if (
i == st0 ||
i == st1 ||
i == st2 ||
i == st3)
continue;
362 for (Int_t
i = 0;
i < 2; ++
i) {
363 MatchHit(&cand, sortedHits[restSt[
i]], restSt[
i] > st3);
374BmnStatus SrcInnerTrackingRun7::FindCandidateByThreeStations(Short_t st0, Short_t st1, Short_t st2, vector<BmnTrack>& candidates, vector<BmnHit*>* sortedHits) {
375 for (
BmnHit* hit2 : sortedHits[st2]) {
376 for (
BmnHit* hit1 : sortedHits[st1]) {
377 if (Abs(hit2->GetX() - hit1->GetX()) > 10 || Abs(hit2->GetY() - hit1->GetY()) > 5)
continue;
378 for (
BmnHit* hit0 : sortedHits[st0]) {
379 if (Abs(hit1->GetX() - hit0->GetX()) > 10 || Abs(hit1->GetY() - hit0->GetY()) > 5)
continue;
381 cand.
AddHit(hit2->GetRefIndex(), hit2);
382 cand.
AddHit(hit1->GetRefIndex(), hit1);
383 cand.
AddHit(hit0->GetRefIndex(), hit0);
385 CalculateTrackParams(&cand);
386 candidates.push_back(cand);
390 vector<Short_t> restSt(3);
391 for (Int_t
i = 0;
i < fNStations; ++
i) {
392 if (
i == st0 ||
i == st1 ||
i == st2)
continue;
396 for (Int_t
i = 0;
i < 3; ++
i) {
397 MatchHit(&cand, sortedHits[restSt[
i]], restSt[
i] > st2);
408BmnStatus SrcInnerTrackingRun7::MatchHit(
BmnTrack* cand, vector<BmnHit*> sortedHits, Bool_t downstream) {
411 if (sortedHits.size() == 0)
return kBMNERROR;
412 FairTrackParam par = downstream ? *(cand->
GetParamLast()) : *(cand->GetParamFirst());
413 Double_t minDist = DBL_MAX;
418 for (
BmnHit* hit : sortedHits) {
421 Double_t
d = Sqrt(Sq(par.GetX() - hit->GetX()) + Sq(par.GetY() - hit->GetY()));
423 if (
d < fDistCut &&
d < minDist) {
431 cand->
AddHit(minHit->GetRefIndex(), minHit);
434 fKalman->
Update(&par, minHit, chi2);
445BmnStatus SrcInnerTrackingRun7::SortTracks(vector<BmnTrack>& inTracks, vector<BmnTrack>& sortedTracks) {
446 const Int_t n = fNStations - fNHitsCut + 1;
447 multimap<Float_t, Int_t> sortedMap[n];
448 for (
size_t iTr = 0; iTr < inTracks.size(); ++iTr) {
449 if (inTracks.at(iTr).GetNHits() < fNHitsCut)
continue;
450 if (inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF() > fChiSquareCut)
continue;
451 sortedMap[inTracks.at(iTr).GetNHits() - fNHitsCut].insert(pair<Float_t, Int_t>(inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF(), iTr));
454 for (Int_t
i = n - 1;
i >= 0;
i--) {
455 for (
auto it : sortedMap[
i])
456 sortedTracks.push_back(inTracks.at(it.second));
457 sortedMap[
i].clear();
464 outFile.open(
"QA/timing.txt");
465 outFile <<
"Track Finder Time: " << workTime << endl;
466 cout <<
"Work time of the GEM tracking: " << workTime << endl;
470BmnStatus SrcInnerTrackingRun7::SortHits(vector<BmnHit*>* sortedHits) {
471 for (Int_t iHit = 0; iHit < fHitsArray->GetEntriesFast(); ++iHit) {
474 if (hit->
IsUsed())
continue;
475 hit->SetRefIndex(iHit);
477 if (station < 0)
continue;
480 sortedHits[station].push_back(hit);
486BmnStatus SrcInnerTrackingRun7::TrackUpdateByLine(vector<BmnTrack>& cands) {
493 cand.
SetChi2((chiX - chiY) > 0. ? chiX : chiY);
505BmnStatus SrcInnerTrackingRun7::TrackUpdateByKalman(vector<BmnTrack>& cands) {
507 if (cand.
GetNHits() < fNHitsCut)
continue;
510 Double_t chiTot = 0.0;
511 for (Int_t iHit = 0; iHit < cand.
GetNHits(); ++iHit) {
515 fKalman->
Update(&par, hit, chi);
518 for (Int_t iHit = cand.
GetNHits() - 1; iHit >= 0; iHit--) {
522 fKalman->
Update(&par, hit, chi);
532BmnStatus SrcInnerTrackingRun7::TrackSelection(vector<BmnTrack>& sortedTracks) {
533 CheckSharedHits(sortedTracks);
534 for (
size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
540 for (Int_t iHit = 0; iHit < tr.
GetNHits(); ++iHit) {
542 globTr.
AddHit(hit->GetRefIndex(), hit);
555 new ((*fGemTracksArray)[fGemTracksArray->GetEntriesFast()])
BmnTrack(gemTr);
564 new ((*fGlobTracksArray)[fGlobTracksArray->GetEntriesFast()])
BmnGlobalTrack(globTr);
565 SetHitsUsing(&tr, kTRUE);
566 if (!fIsTarget && iTr == 0)
break;
572void SrcInnerTrackingRun7::SetHitsUsing(
BmnTrack* tr, Bool_t use) {
599 const UInt_t nHits = tr->
GetNHits();
600 Double_t chi2circ = 0.0;
601 TVector3 CircParZX =
CircleFit(tr, fHitsArray, chi2circ);
603 Double_t Xc = CircParZX.Y();
604 Double_t Zc = CircParZX.X();
605 fField = FairRunAna::Instance()->GetField();
606 const Double_t B = (
LineFit(tr, fHitsArray,
"ZY")).X();
608 Double_t Q = (Xc > 0) ? +1 : -1;
610 Double_t sumX(0.0), sumY(0.0), sumTx(0.0), sumTy(0.0), sumQP(0.0);
611 Double_t sumXX(0.0), sumXY(0.0), sumXTx(0.0), sumXTy(0.0), sumXQP(0.0);
612 Double_t sumYY(0.0), sumYTx(0.0), sumYTy(0.0), sumYQP(0.0);
613 Double_t sumTxTx(0.0), sumTxTy(0.0), sumTxQP(0.0);
614 Double_t sumTyTy(0.0), sumTyQP(0.0);
615 Double_t sumQPQP(0.0);
617 for (UInt_t
i = 0;
i < nHits; ++
i) {
620 Double_t Xi = hit->GetX();
621 Double_t Yi = hit->GetY();
622 Double_t Zi = hit->GetZ();
624 Double_t Txi = -1.0 * (Zi - Zc) / (Xi - Xc);
626 Double_t Ri = Sqrt(Sq(Xi - Xc) + Sq(Zi - Zc));
627 Double_t QPi = Q / (0.0003 * Abs(fField->GetBy(Xi, Yi, Zi)) * Ri);
643 sumTxTx += Txi * Txi;
644 sumTxTy += Txi * Tyi;
645 sumTxQP += Txi * QPi;
646 sumTyTy += Tyi * Tyi;
647 sumTyQP += Tyi * QPi;
648 sumQPQP += QPi * QPi;
651 Double_t meanX = sumX / nHits;
652 Double_t meanY = sumY / nHits;
653 Double_t meanTx = sumTx / nHits;
654 Double_t meanTy = sumTy / nHits;
655 Double_t meanQP = sumQP / nHits;
657 Double_t Cov_X_X = sumXX / nHits - Sq(meanX);
658 Double_t Cov_X_Y = sumXY / nHits - meanX * meanY;
659 Double_t Cov_X_Tx = sumXTx / nHits - meanX * meanTx;
660 Double_t Cov_X_Ty = sumXTy / nHits - meanX * meanTy;
661 Double_t Cov_X_Qp = sumXQP / nHits - meanX * meanQP;
662 Double_t Cov_Y_Y = sumYY / nHits - Sq(meanY);
663 Double_t Cov_Y_Tx = sumYTx / nHits - meanY * meanTx;
664 Double_t Cov_Y_Ty = sumYTy / nHits - meanY * meanTy;
665 Double_t Cov_Y_Qp = sumYQP / nHits - meanY * meanQP;
666 Double_t Cov_Tx_Tx = sumTxTx / nHits - Sq(meanTx);
667 Double_t Cov_Tx_Ty = sumTxTy / nHits - meanTx * meanTy;
668 Double_t Cov_Tx_Qp = sumTxQP / nHits - meanTx * meanQP;
669 Double_t Cov_Ty_Ty = sumTyTy / nHits - Sq(meanTy);
670 Double_t Cov_Ty_Qp = sumTyQP / nHits - meanTy * meanQP;
671 Double_t Cov_Qp_Qp = sumQPQP / nHits - Sq(meanQP);
674 par.SetCovariance(0, 0, Cov_X_X);
675 par.SetCovariance(0, 1, Cov_X_Y);
676 par.SetCovariance(0, 2, Cov_X_Tx);
677 par.SetCovariance(0, 3, Cov_X_Ty);
678 par.SetCovariance(0, 4, Cov_X_Qp);
679 par.SetCovariance(1, 1, Cov_Y_Y);
680 par.SetCovariance(1, 2, Cov_Y_Tx);
681 par.SetCovariance(1, 3, Cov_Y_Ty);
682 par.SetCovariance(1, 4, Cov_Y_Qp);
683 par.SetCovariance(2, 2, Cov_Tx_Tx);
684 par.SetCovariance(2, 3, Cov_Tx_Ty);
685 par.SetCovariance(2, 4, Cov_Tx_Qp);
686 par.SetCovariance(3, 3, Cov_Ty_Ty);
687 par.SetCovariance(3, 4, Cov_Ty_Qp);
688 par.SetCovariance(4, 4, Cov_Qp_Qp);
702 const UInt_t nHits = tr->
GetNHits();
704 TVector3 lineParZY =
LineFit(tr, fHitsArray,
"ZY");
707 const Double_t B = lineParZY.X();
712 if (isField) CalcCovMatrix(tr);
723 Bool_t doSimple = (nHits == 3) ? kTRUE : kFALSE;
724 Double_t QP = isField ? CalcQp(tr, doSimple) : 0.0;
730TVector2 SrcInnerTrackingRun7::CalcMeanSigma(vector<Double_t> QpSegm) {
732 for (
size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
733 QpSum += QpSegm[iSegm];
735 Double_t QpMean = QpSum / QpSegm.size();
737 Double_t sqSigmaSum = 0.;
738 for (
size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
739 sqSigmaSum += Sq(QpSegm[iSegm] - QpMean);
741 return TVector2(QpMean, Sqrt(sqSigmaSum / QpSegm.size()));
744Double_t SrcInnerTrackingRun7::CalcQp(
BmnTrack* track, Bool_t doSimple) {
747 vector<BmnHit*> hits;
749 for (Int_t iHit = 0; iHit < track->
GetNHits(); iHit++)
752 Int_t kNSegm = track->
GetNHits() - 2;
754 Double_t QpRefit = 0.;
755 vector<Double_t> QpSegmBefore;
758 for (Int_t iHit = 0; iHit < kNSegm; iHit++) {
759 BmnHit* first = hits[iHit];
760 BmnHit* second = hits[iHit + 1];
761 BmnHit* third = hits[iHit + 2];
763 TVector3 CircParZX =
CircleBy3Hit(first, second, third);
764 Double_t R = CircParZX.Z();
765 Double_t Xc = CircParZX.Y();
766 Double_t Zc = CircParZX.X();
768 Double_t Q = (Xc > 0) ? +1. : -1.;
769 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.;
772 Double_t fX = first->GetX();
773 Double_t fZ = first->GetZ();
777 Double_t Tx_first = h * (fZ - Zc) / (fX - Xc);
778 TVector3 lineParZY =
LineFit(track, fHitsArray,
"ZY");
779 const Double_t B = lineParZY.X();
780 Double_t Ty_first = B;
782 Double_t Pz = Pt / Sqrt(1 + Sq(Tx_first));
783 Double_t Px = Tx_first * Pz;
784 Double_t Py = Ty_first * Pz;
785 Double_t P = Sqrt(Sq(Px) + Sq(Py) + Sq(Pz));
788 QpSegmBefore.push_back(QP);
793 vector<Double_t> QpSegmAfter;
795 TVector2 meanSig = CalcMeanSigma(QpSegmBefore);
796 Double_t mean = meanSig.X();
797 Double_t sigma = meanSig.Y();
798 if (std::isnan(sigma) && fVerbose == 3) {
799 cout <<
"Bad refit convergence for track segment!!" << endl;
803 for (
size_t iSegm = 0; iSegm < QpSegmBefore.size(); iSegm++)
804 if (Abs(QpSegmBefore[iSegm] - mean) - sigma <= 0.001)
805 QpSegmAfter.push_back(QpSegmBefore[iSegm]);
807 if (QpSegmAfter.size() == QpSegmBefore.size()) {
811 QpSegmBefore.clear();
812 QpSegmBefore.resize(0);
814 for (
size_t iSegm = 0; iSegm < QpSegmAfter.size(); iSegm++)
815 QpSegmBefore.push_back(QpSegmAfter[iSegm]);
818 QpSegmAfter.resize(0);
826 for (
size_t iEle = 0; iEle < QpSegmBefore.size(); iEle++)
827 QpRefit += QpSegmBefore[iEle];
829 QpRefit /= QpSegmBefore.size();
831 vector<Double_t>
d =
dist(QpSegmBefore, QpRefit);
834 for (
size_t i = 0;
i < QpSegmBefore.size();
i++)
835 sigma += (QpSegmBefore[
i] - QpRefit) * (QpSegmBefore[
i] - QpRefit);
836 sigma = Sqrt(sigma / QpSegmBefore.size());
838 vector<Double_t> w =
W(
d, sigma);
841 const Int_t kNIter = 20;
842 for (Int_t iIter = 1; iIter < kNIter; iIter++) {
843 QpRefit =
Mu(QpSegmBefore, w);
844 d =
dist(QpSegmBefore, QpRefit);
853Double_t SrcInnerTrackingRun7::CalculateLength(
BmnTrack* tr) {
856 vector<Double_t> X, Y, Z;
857 for (Int_t iGem = 0; iGem < tr->
GetNHits(); iGem++) {
860 X.push_back(hit->GetX());
861 Y.push_back(hit->GetY());
862 Z.push_back(hit->GetZ());
865 Double_t length = 0.;
866 for (
size_t i = 0;
i < X.size() - 1;
i++) {
867 Double_t dX = X[
i] - X[
i + 1];
868 Double_t dY = Y[
i] - Y[
i + 1];
869 Double_t dZ = Z[
i] - Z[
i + 1];
870 length += Sqrt(dX * dX + dY * dY + dZ * dZ);
876BmnStatus SrcInnerTrackingRun7::CheckSharedHits(vector<BmnTrack>& sortedTracks) {
879 const Int_t kNSharedHits = 0;
881 for (
size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
882 BmnTrack* tr = &(sortedTracks.at(iTr));
883 if (tr->
GetFlag() == 666)
continue;
885 Int_t nofSharedHits = 0;
887 for (Int_t iHit = 0; iHit < nofHits; iHit++)
888 if (hitsId.find(tr->
GetHitIndex(iHit)) != hitsId.end()) {
890 if (nofSharedHits > kNSharedHits) {
895 if (tr->
GetFlag() == 666)
continue;
897 for (Int_t iHit = 0; iHit < nofHits; iHit++)
905BmnStatus SrcInnerTrackingRun7::DrawHits() {
906 TH2F* h_HitsZX =
new TH2F(
"h_HitsZX",
"h_HitsZX", 400, 0.0, 200.0, 400, -100.0, 100.0);
907 TH2F* h_HitsZY =
new TH2F(
"h_HitsZY",
"h_HitsZY", 400, 0.0, 200.0, 400, -10.0, 50.0);
908 for (Int_t
i = 0;
i < fHitsArray->GetEntriesFast(); ++
i) {
910 h_HitsZX->Fill(hit->GetZ(), hit->GetX());
911 h_HitsZY->Fill(hit->GetZ(), hit->GetY());
914 TCanvas* c =
new TCanvas(
"c",
"c", 1000, 1000);
917 h_HitsZX->SetMarkerStyle(8);
918 h_HitsZX->SetMarkerSize(0.7);
919 h_HitsZX->SetMarkerColor(kRed);
923 h_HitsZY->SetMarkerStyle(8);
924 h_HitsZY->SetMarkerSize(0.7);
925 h_HitsZY->SetMarkerColor(kRed);
930 for (Int_t iTr = 0; iTr < fGlobTracksArray->GetEntriesFast(); ++iTr) {
952 for (Int_t iHit = startIdx; iHit < gemTr->
GetNHits(); iHit++) {
954 Double_t x = hit->GetX();
955 Double_t y = hit->GetY();
956 Double_t z = hit->GetZ();
957 TLine* lineZX =
new TLine(z, x, zPrev, xPrev);
958 lineZX->SetLineColor(kRed);
959 lineZX->SetLineWidth(2);
960 TLine* lineZY =
new TLine(z, y, zPrev, yPrev);
961 lineZY->SetLineColor(kRed);
962 lineZY->SetLineWidth(2);
964 lineZX->Draw(
"same");
966 lineZY->Draw(
"same");
1037 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 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
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 * 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)
virtual ~SrcInnerTrackingRun7()
virtual InitStatus Init()
virtual void Exec(Option_t *opt)