4#include "BmnFieldMap.h"
5#include "BmnGemStripHit.h"
6#include "BmnKalmanFilter.h"
10#include "FairTrackParam.h"
67 cout <<
"======================== GEM tracking init started ====================" << endl;
72 FairRootManager* ioman = FairRootManager::Instance();
74 Fatal(
"Init",
"FairRootManager is not instantiated");
86 cout <<
"SrcInnerTrackingRun7::Init(): branch " <<
fGemHitsBranchName <<
" not found! Task will be deactivated"
97 fField = FairRunAna::Instance()->GetField();
99 Fatal(
"Init",
"No Magnetic Field found");
102 TString gPathGemConfig = gPathConfig +
"/parameters/gem/XMLConfigs/GemRunSRCSpring2018.xml";
116 cout <<
"======================== GEM tracking init finished ===================" << endl;
124 cout <<
"\n======================== GEM tracking exec started ====================" << endl;
126 cout <<
"\n Event number: " <<
fEventNo << endl;
131 clock_t tStart = clock();
138 Int_t nHitsCut = 200;
151 hit.SetDxyz(0.5, 0.5, 0.5);
178 clock_t tFinish = clock();
180 cout <<
"SrcInnerTrackingRun7: " <<
fGlobTracksArray->GetEntriesFast() <<
" tracks" << endl;
185 cout <<
"\n======================== GEM tracking exec finished ===================" << endl;
194 vector<BmnTrack> candidates;
195 vector<BmnTrack> sortedCandidates;
197 for (
BmnHit* hit5 : sortedHits[5]) {
198 for (
BmnHit* hit4 : sortedHits[4]) {
199 if (
Abs(hit5->GetX() - hit4->GetX()) > 5 ||
Abs(hit5->GetY() - hit4->GetY()) > 2)
201 for (
BmnHit* hit3 : sortedHits[3]) {
202 if (
Abs(hit4->GetX() - hit3->GetX()) > 5 ||
Abs(hit4->GetY() - hit3->GetY()) > 2)
204 for (
BmnHit* hit2 : sortedHits[2]) {
205 if (
Abs(hit3->GetX() - hit2->GetX()) > 5 ||
Abs(hit3->GetY() - hit2->GetY()) > 2)
207 for (
BmnHit* hit1 : sortedHits[1]) {
208 if (
Abs(hit2->GetX() - hit1->GetX()) > 5 ||
Abs(hit2->GetY() - hit1->GetY()) > 2)
210 for (
BmnHit* hit0 : sortedHits[0]) {
211 if (
Abs(hit1->GetX() - hit0->GetX()) > 5 ||
Abs(hit1->GetY() - hit0->GetY()) > 2)
214 cand.
AddHit(hit5->GetRefIndex(), hit5);
215 cand.
AddHit(hit4->GetRefIndex(), hit4);
216 cand.
AddHit(hit3->GetRefIndex(), hit3);
217 cand.
AddHit(hit2->GetRefIndex(), hit2);
218 cand.
AddHit(hit1->GetRefIndex(), hit1);
219 cand.
AddHit(hit0->GetRefIndex(), hit0);
223 candidates.push_back(cand);
248 vector<BmnTrack> candidates;
249 vector<BmnTrack> sortedCandidates;
273 vector<BmnTrack> candidates;
274 vector<BmnTrack> sortedCandidates;
300 vector<BmnTrack> candidates;
301 vector<BmnTrack> sortedCandidates;
338 vector<BmnTrack>& candidates,
339 vector<BmnHit*>* sortedHits)
341 for (
BmnHit* hit4 : sortedHits[st4]) {
342 for (
BmnHit* hit3 : sortedHits[st3]) {
343 if (
Abs(hit4->GetX() - hit3->GetX()) > 5 ||
Abs(hit4->GetY() - hit3->GetY()) > 2)
345 for (
BmnHit* hit2 : sortedHits[st2]) {
346 if (
Abs(hit3->GetX() - hit2->GetX()) > 5 ||
Abs(hit3->GetY() - hit2->GetY()) > 2)
348 for (
BmnHit* hit1 : sortedHits[st1]) {
349 if (
Abs(hit2->GetX() - hit1->GetX()) > 5 ||
Abs(hit2->GetY() - hit1->GetY()) > 2)
351 for (
BmnHit* hit0 : sortedHits[st0]) {
352 if (
Abs(hit1->GetX() - hit0->GetX()) > 5 ||
Abs(hit1->GetY() - hit0->GetY()) > 2)
355 cand.
AddHit(hit4->GetRefIndex(), hit4);
356 cand.
AddHit(hit3->GetRefIndex(), hit3);
357 cand.
AddHit(hit2->GetRefIndex(), hit2);
358 cand.
AddHit(hit1->GetRefIndex(), hit1);
359 cand.
AddHit(hit0->GetRefIndex(), hit0);
362 candidates.push_back(cand);
376 vector<BmnTrack>& candidates,
377 vector<BmnHit*>* sortedHits)
379 for (
BmnHit* hit3 : sortedHits[st3]) {
380 for (
BmnHit* hit2 : sortedHits[st2]) {
381 if (
Abs(hit3->GetX() - hit2->GetX()) > 5 ||
Abs(hit3->GetY() - hit2->GetY()) > 2)
383 for (
BmnHit* hit1 : sortedHits[st1]) {
384 if (
Abs(hit2->GetX() - hit1->GetX()) > 5 ||
Abs(hit2->GetY() - hit1->GetY()) > 2)
386 for (
BmnHit* hit0 : sortedHits[st0]) {
387 if (
Abs(hit1->GetX() - hit0->GetX()) > 5 ||
Abs(hit1->GetY() - hit0->GetY()) > 2)
390 cand.
AddHit(hit3->GetRefIndex(), hit3);
391 cand.
AddHit(hit2->GetRefIndex(), hit2);
392 cand.
AddHit(hit1->GetRefIndex(), hit1);
393 cand.
AddHit(hit0->GetRefIndex(), hit0);
396 candidates.push_back(cand);
401 vector<Short_t> restSt(2);
403 if (
i == st0 ||
i == st1 ||
i == st2 ||
i == st3)
409 MatchHit(&cand, sortedHits[restSt[
i]], restSt[
i] > st3);
414 cand.SetNDF(cand.GetNHits() * 2 - 5);
423 vector<BmnTrack>& candidates,
424 vector<BmnHit*>* sortedHits)
426 for (
BmnHit* hit2 : sortedHits[st2]) {
427 for (
BmnHit* hit1 : sortedHits[st1]) {
428 if (
Abs(hit2->GetX() - hit1->GetX()) > 10 ||
Abs(hit2->GetY() - hit1->GetY()) > 5)
430 for (
BmnHit* hit0 : sortedHits[st0]) {
431 if (
Abs(hit1->GetX() - hit0->GetX()) > 10 ||
Abs(hit1->GetY() - hit0->GetY()) > 5)
434 cand.
AddHit(hit2->GetRefIndex(), hit2);
435 cand.
AddHit(hit1->GetRefIndex(), hit1);
436 cand.
AddHit(hit0->GetRefIndex(), hit0);
439 candidates.push_back(cand);
443 vector<Short_t> restSt(3);
445 if (
i == st0 ||
i == st1 ||
i == st2)
451 MatchHit(&cand, sortedHits[restSt[
i]], restSt[
i] > st2);
456 cand.SetNDF(cand.GetNHits() * 2 - 5);
466 if (sortedHits.size() == 0)
473 fKalman->TGeoTrackPropagate(&par, sortedHits.at(0)->GetZ(), 2212,
nullptr,
nullptr);
474 for (
BmnHit* hit : sortedHits) {
477 Double_t d =
Sqrt(
Sq(par.GetX() - hit->GetX()) +
Sq(par.GetY() - hit->GetY()));
487 cand->
AddHit(minHit->GetRefIndex(), minHit);
490 fKalman->Update(&par, minHit, chi2);
504 multimap<Float_t, Int_t> sortedMap[
n];
506 for (
size_t iTr = 0; iTr < inTracks.size(); ++iTr) {
507 if (inTracks.at(iTr).GetNHits() <
fNHitsCut)
509 if (inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF() >
fChiSquareCut)
511 sortedMap[inTracks.at(iTr).GetNHits() -
fNHitsCut].insert(
512 pair<Float_t, Int_t>(inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF(), iTr));
516 for (
auto it : sortedMap[
i])
517 sortedTracks.push_back(inTracks.at(it.second));
518 sortedMap[
i].clear();
526 outFile.open(
"QA/timing.txt");
527 outFile <<
"Track Finder Time: " <<
workTime << endl;
528 cout <<
"Work time of the GEM tracking: " <<
workTime << endl;
540 hit->SetRefIndex(iHit);
546 sortedHits[station].push_back(hit);
560 cand.
SetChi2((chiX - chiY) > 0. ? chiX : chiY);
577 FairTrackParam par = *(cand.GetParamFirst());
580 for (
Int_t iHit = 0; iHit < cand.GetNHits(); ++iHit) {
583 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), 2212,
nullptr,
nullptr);
584 fKalman->Update(&par, hit, chi);
586 cand.SetParamLast(par);
587 for (
Int_t iHit = cand.GetNHits() - 1; iHit >= 0; iHit--) {
590 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), 2212,
nullptr,
nullptr);
591 fKalman->Update(&par, hit, chi);
594 cand.SetParamFirst(par);
595 cand.SetChi2(chiTot);
604 for (
size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
613 globTr.
AddHit(hit->GetRefIndex(), hit);
674 const UInt_t nHits = tr->
GetNHits();
680 fField = FairRunAna::Instance()->GetField();
685 Double_t sumX(0.0), sumY(0.0), sumTx(0.0), sumTy(0.0), sumQP(0.0);
686 Double_t sumXX(0.0), sumXY(0.0), sumXTx(0.0), sumXTy(0.0), sumXQP(0.0);
687 Double_t sumYY(0.0), sumYTx(0.0), sumYTy(0.0), sumYQP(0.0);
688 Double_t sumTxTx(0.0), sumTxTy(0.0), sumTxQP(0.0);
689 Double_t sumTyTy(0.0), sumTyQP(0.0);
692 for (UInt_t
i = 0;
i < nHits; ++
i) {
700 Double_t Txi = -1.0 * (Zi - Zc) / (Xi - Xc);
719 sumTxTx += Txi * Txi;
720 sumTxTy += Txi * Tyi;
721 sumTxQP += Txi * QPi;
722 sumTyTy += Tyi * Tyi;
723 sumTyQP += Tyi * QPi;
724 sumQPQP += QPi * QPi;
734 Double_t Cov_X_Y = sumXY / nHits - meanX * meanY;
735 Double_t Cov_X_Tx = sumXTx / nHits - meanX * meanTx;
736 Double_t Cov_X_Ty = sumXTy / nHits - meanX * meanTy;
737 Double_t Cov_X_Qp = sumXQP / nHits - meanX * meanQP;
739 Double_t Cov_Y_Tx = sumYTx / nHits - meanY * meanTx;
740 Double_t Cov_Y_Ty = sumYTy / nHits - meanY * meanTy;
741 Double_t Cov_Y_Qp = sumYQP / nHits - meanY * meanQP;
742 Double_t Cov_Tx_Tx = sumTxTx / nHits -
Sq(meanTx);
743 Double_t Cov_Tx_Ty = sumTxTy / nHits - meanTx * meanTy;
744 Double_t Cov_Tx_Qp = sumTxQP / nHits - meanTx * meanQP;
745 Double_t Cov_Ty_Ty = sumTyTy / nHits -
Sq(meanTy);
746 Double_t Cov_Ty_Qp = sumTyQP / nHits - meanTy * meanQP;
747 Double_t Cov_Qp_Qp = sumQPQP / nHits -
Sq(meanQP);
750 par.SetCovariance(0, 0, Cov_X_X);
751 par.SetCovariance(0, 1, Cov_X_Y);
752 par.SetCovariance(0, 2, Cov_X_Tx);
753 par.SetCovariance(0, 3, Cov_X_Ty);
754 par.SetCovariance(0, 4, Cov_X_Qp);
755 par.SetCovariance(1, 1, Cov_Y_Y);
756 par.SetCovariance(1, 2, Cov_Y_Tx);
757 par.SetCovariance(1, 3, Cov_Y_Ty);
758 par.SetCovariance(1, 4, Cov_Y_Qp);
759 par.SetCovariance(2, 2, Cov_Tx_Tx);
760 par.SetCovariance(2, 3, Cov_Tx_Ty);
761 par.SetCovariance(2, 4, Cov_Tx_Qp);
762 par.SetCovariance(3, 3, Cov_Ty_Ty);
763 par.SetCovariance(3, 4, Cov_Ty_Qp);
764 par.SetCovariance(4, 4, Cov_Qp_Qp);
779 const UInt_t nHits = tr->
GetNHits();
783 if (lineParZY.
Z() > 1)
816 for (
size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
817 QpSum += QpSegm[iSegm];
819 Double_t QpMean = QpSum / QpSegm.size();
822 for (
size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
823 sqSigmaSum +=
Sq(QpSegm[iSegm] - QpMean);
825 return TVector2(QpMean,
Sqrt(sqSigmaSum / QpSegm.size()));
832 vector<BmnHit*> hits;
840 vector<Double_t> QpSegmBefore;
843 for (
Int_t iHit = 0; iHit < kNSegm; iHit++) {
844 BmnHit* first = hits[iHit];
845 BmnHit* second = hits[iHit + 1];
846 BmnHit* third = hits[iHit + 2];
855 * (
Abs(
fField->GetBy(third->GetX(), third->GetY(), third->GetZ()))
856 +
Abs(
fField->GetBy(second->GetX(), second->GetY(), second->GetZ()))
857 +
Abs(
fField->GetBy(first->GetX(), first->GetY(), first->GetZ())))
866 Double_t Tx_first = h * (fZ - Zc) / (fX - Xc);
877 QpSegmBefore.push_back(QP);
882 vector<Double_t> QpSegmAfter;
887 if (std::isnan(sigma) && fVerbose == 3) {
888 cout <<
"Bad refit convergence for track segment!!" << endl;
892 for (
size_t iSegm = 0; iSegm < QpSegmBefore.size(); iSegm++)
893 if (
Abs(QpSegmBefore[iSegm] - mean) - sigma <= 0.001)
894 QpSegmAfter.push_back(QpSegmBefore[iSegm]);
896 if (QpSegmAfter.size() == QpSegmBefore.size()) {
900 QpSegmBefore.clear();
901 QpSegmBefore.resize(0);
903 for (
size_t iSegm = 0; iSegm < QpSegmAfter.size(); iSegm++)
904 QpSegmBefore.push_back(QpSegmAfter[iSegm]);
907 QpSegmAfter.resize(0);
916 for (
size_t iEle = 0; iEle < QpSegmBefore.size(); iEle++)
917 QpRefit += QpSegmBefore[iEle];
919 QpRefit /= QpSegmBefore.size();
921 vector<Double_t> d =
dist(QpSegmBefore, QpRefit);
924 for (
size_t i = 0;
i < QpSegmBefore.size();
i++)
925 sigma += (QpSegmBefore[
i] - QpRefit) * (QpSegmBefore[
i] - QpRefit);
926 sigma =
Sqrt(sigma / QpSegmBefore.size());
928 vector<Double_t> w =
W(d, sigma);
931 const Int_t kNIter = 20;
932 for (
Int_t iIter = 1; iIter < kNIter; iIter++) {
933 QpRefit =
Mu(QpSegmBefore, w);
934 d =
dist(QpSegmBefore, QpRefit);
948 vector<Double_t> X, Y, Z;
953 X.push_back(hit->GetX());
954 Y.push_back(hit->GetY());
955 Z.push_back(hit->GetZ());
959 for (
size_t i = 0;
i < X.size() - 1;
i++) {
963 length +=
Sqrt(dX * dX + dY * dY + dZ * dZ);
973 const Int_t kNSharedHits = 0;
975 for (
size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
976 BmnTrack* tr = &(sortedTracks.at(iTr));
980 Int_t nofSharedHits = 0;
982 for (
Int_t iHit = 0; iHit < nofHits; iHit++)
983 if (hitsId.find(tr->
GetHitIndex(iHit)) != hitsId.end()) {
985 if (nofSharedHits > kNSharedHits) {
993 for (
Int_t iHit = 0; iHit < nofHits; iHit++)
1003 TH2F* h_HitsZX =
new TH2F(
"h_HitsZX",
"h_HitsZX", 400, 0.0, 200.0, 400, -100.0, 100.0);
1004 TH2F* h_HitsZY =
new TH2F(
"h_HitsZY",
"h_HitsZY", 400, 0.0, 200.0, 400, -10.0, 50.0);
1007 h_HitsZX->
Fill(hit->GetZ(), hit->GetX());
1008 h_HitsZY->
Fill(hit->GetZ(), hit->GetY());
1017 h_HitsZX->
Draw(
"P");
1023 h_HitsZY->
Draw(
"P");
1042 if (glTrack->GetSilTrackIndex() == -1) {
1049 for (
Int_t iHit = startIdx; iHit < gemTr->
GetNHits(); iHit++) {
1054 TLine* lineZX =
new TLine(z, x, zPrev, xPrev);
1057 TLine* lineZY =
new TLine(z, y, zPrev, yPrev);
1061 lineZX->
Draw(
"same");
1063 lineZY->
Draw(
"same");
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)
vector< Double_t > W(vector< Double_t > dist, Double_t sig)
void Fatal(const char *location, const char *msgfmt,...)
R__EXTERN TSystem * gSystem
BmnStatus
Define status code.
Bool_t IsFieldOff() const
Whether magnetic field is off.
Double_t GetStripTotalSignalInUpperLayer()
Double_t GetStripTotalSignalInLowerLayer()
Strip layer characteristics of the hit (total signal, cluster size, strip position as the cluster mea...
void SetGemTrackIndex(Int_t iGem)
Modifiers.
Int_t GetGemTrackIndex() const
Accessors.
DetectorId GetDetId() const
void SetUsing(Bool_t use)
void SetDetId(DetectorId det)
void SetStation(Short_t st)
Short_t GetStation() const
void SetChi2(Double_t chi2)
void SetParamLast(FairTrackParam &par)
FairTrackParam * GetParamFirst()
Int_t GetNHits() const
Accessors.
Int_t GetHitIndex(Int_t iHit) const
void AddHit(Int_t hitIndex, FairHit *Hit)
Associate a FairHit to the track.
void SetParamFirst(FairTrackParam &par)
Modifiers.
FairTrackParam * GetParamLast()
void SetLength(Double_t length)
void SortHits()
Public method SortHits Sorts the hits in downstream direction and writes the hit indices into the mem...
TClonesArray * fMCTracksArray
BmnStatus MatchHit(BmnTrack *cand, vector< BmnHit * > sortedHits, Bool_t downstream)
virtual ~SrcInnerTrackingRun7()
TClonesArray * fGlobTracksArray
TClonesArray * fGemHitsArray
BmnStatus SortTracks(vector< BmnTrack > &inTracks, vector< BmnTrack > &sortedTracks)
BmnGemStripStationSet * fGemDetector
TClonesArray * fGemPointsArray
virtual InitStatus Init()
TClonesArray * fHitsArray
BmnStatus FindTracks_3of6()
BmnStatus FindTracks_5of6()
BmnStatus CalcCovMatrix(BmnTrack *tr)
BmnStatus TrackUpdateByLine(vector< BmnTrack > &cands)
TVector2 CalcMeanSigma(vector< Double_t >)
BmnStatus CalculateTrackParams(BmnTrack *tr)
BmnStatus FindCandidateByThreeStations(Short_t st0, Short_t st1, Short_t st2, vector< BmnTrack > &candidates, vector< BmnHit * > *sortedHits)
BmnStatus FindTracks_4of6()
BmnKalmanFilter * fKalman
BmnStatus SortHits(vector< BmnHit * > *sortedHits)
TString fGemTracksBranchName
BmnStatus TrackSelection(vector< BmnTrack > &cands)
BmnStatus TrackUpdateByKalman(vector< BmnTrack > &cands)
TClonesArray * fGemTracksArray
BmnStatus FindCandidateByFourStations(Short_t st0, Short_t st1, Short_t st2, Short_t st3, vector< BmnTrack > &candidates, vector< BmnHit * > *sortedHits)
BmnStatus FindCandidateByFiveStations(Short_t st0, Short_t st1, Short_t st2, Short_t st3, Short_t st4, vector< BmnTrack > &candidates, vector< BmnHit * > *sortedHits)
BmnStatus FindTracks_6of6()
void SetHitsUsing(BmnTrack *tr, Bool_t use)
Double_t CalculateLength(BmnTrack *tr)
virtual void Exec(Option_t *opt)
BmnStatus CheckSharedHits(vector< BmnTrack > &sortedTracks)
Double_t CalcQp(BmnTrack *track, Bool_t doSimple)
TString fGemHitsBranchName
TString fGlobTracksBranchName
virtual void SetLineWidth(Width_t lwidth)
virtual void SetLineColor(Color_t lcolor)
virtual void SetMarkerColor(Color_t mcolor=1)
virtual void SetMarkerStyle(Style_t mstyle=1)
virtual void SetMarkerSize(Size_t msize=1)
TVirtualPad * cd(Int_t subpadnumber=0) override
void Draw(Option_t *option="") override
virtual Int_t Fill(const char *namex, const char *namey, Double_t w)
virtual void Draw(Option_t *option="")
void Divide(Int_t nx=1, Int_t ny=1, Float_t xmargin=0.01, Float_t ymargin=0.01, Int_t color=0) override
void SaveAs(const char *filename="", Option_t *option="") const override
*brief user defined string literal for JSON values *sa std::size_t n
constexpr Double_t Sigma()
Double_t Sqrt(Double_t x)