4#include "BmnGemStripHit.h"
5#include "BmnKalmanFilter.h"
8#include "FairTrackParam.h"
22#define GCC_DIAGNOSTIC_AWARE 1
23#if GCC_DIAGNOSTIC_AWARE
24#pragma GCC diagnostic ignored "-Wunknown-pragmas"
50 Fatal(
"BmnCellAutoTracking()",
51 "Probably, run number has been changed manually in reco macro. Aborting ...");
62 const Int_t runTransition = 3589;
69 :
TString(setup +
"_run7_noField.dat"));
140 cout <<
"======================== GEM tracking init started ====================" << endl;
143 FairRootManager* ioman = FairRootManager::Instance();
145 Fatal(
"Init",
"FairRootManager is not instantiated");
175 cout <<
"BmnCellAutoTracking::Init(): branch " <<
fGemHitsBranchName <<
" not found! Task will be deactivated"
186 fField = FairRunAna::Instance()->GetField();
188 Fatal(
"Init",
"No Magnetic Field found");
193 TString gPathGemConfig = gPathConfig +
"/parameters/gem/XMLConfigs/";
195 : (
fPeriodId == 6) ?
"GemRunSpring2017.xml"
196 :
"GemRunSpring2017.xml";
201 TString gPathSiConfig = gPathConfig +
"/parameters/silicon/XMLConfigs/";
203 :
"SiliconRunSpring2017.xml";
213 fNStations = nGemStations + nSilStations + nSsdStations;
228 cout <<
"======================== GEM tracking init finished ===================" << endl;
236 cout <<
"\n======================== GEM tracking exec started ====================" << endl;
238 cout <<
"\n Event number: " <<
fEventNo << endl;
243 clock_t tStart = clock();
305 vector<BmnTrack> candidates;
306 vector<BmnTrack> sortedCandidates;
316 for (
Int_t iter = 0; iter < nIter; ++iter) {
324 clock_t t0 = clock();
326 clock_t t1 = clock();
328 clock_t t2 = clock();
331 candidates.push_back(tr);
332 clock_t t3 = clock();
337 clock_t t4 = clock();
345 clock_t t5 = clock();
348 clock_t t6 = clock();
352 clock_t tFinish = clock();
354 cout <<
"BmnCellAutoTracking: " <<
fGlobTracksArray->GetEntriesFast() <<
" tracks" << endl;
359 cout <<
"\n======================== GEM tracking exec finished ===================" << endl;
365 multimap<Float_t, Int_t> sortedMap[
n];
367 for (
size_t iTr = 0; iTr < inTracks.size(); ++iTr) {
368 if (inTracks.at(iTr).GetNHits() <
fNHitsCut)
370 if (inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF() >
fChiSquareCut)
372 sortedMap[inTracks.at(iTr).GetNHits() -
fNHitsCut].insert(
373 pair<Float_t, Int_t>(inTracks.at(iTr).GetChi2() / inTracks.at(iTr).GetNDF(), iTr));
377 for (
auto it : sortedMap[
i])
378 sortedTracks.push_back(inTracks.at(it.second));
379 sortedMap[
i].clear();
395 outFile.open(
"QA/timing.txt");
396 outFile <<
"Track Finder Time: " <<
workTime << endl;
398 cout <<
"Cells creation time: " <<
createTime << endl;
399 cout <<
"States calculation time: " <<
stateTime << endl;
400 cout <<
"Cells connection time: " <<
connectTime << endl;
401 cout <<
"Tracks sorting time: " <<
sortTime << endl;
402 cout <<
"Tracks selection time: " <<
selectTime << endl;
404 cout <<
"Work time of the GEM tracking: " <<
workTime << endl;
422 hitsOnStation[station].push_back(iHit);
426 for (
size_t iHit = 0; iHit < hitsOnStation[0].size(); ++iHit) {
435 Double_t slopeXZ = (x1 - x0) / (z1 - z0);
438 Double_t slopeYZ = (y1 - y0) / (z1 - z0);
443 duetVirt.
SetLastIdx(hitsOnStation[0].at(iHit));
450 cells[0].push_back(duetVirt);
454 for (
size_t iHit0 = 0; iHit0 < hitsOnStation[iSt - 1].size(); ++iHit0) {
459 for (
size_t iHit1 = 0; iHit1 < hitsOnStation[iSt].size(); ++iHit1) {
464 Double_t slopeXZ = (x1 - x0) / (z1 - z0);
467 Double_t slopeYZ = (y1 - y0) / (z1 - z0);
472 duet.
SetFirstIdx(hitsOnStation[iSt - 1].at(iHit0));
473 duet.
SetLastIdx(hitsOnStation[iSt].at(iHit1));
480 cells[iSt].push_back(duet);
491 if (cells[iCell].size() > 10000)
494 Int_t idx = duet.GetFirstIdx();
495 Int_t state = duet.GetOldState();
497 if (state != leftNeigh.GetOldState())
499 if (idx != leftNeigh.GetLastIdx())
507 duet.SetNewState(duet.GetOldState() + 1);
514 it.SetOldState(it.GetNewState());
527 vector<BmnTrack> cands;
532 omp_set_num_threads(nThreads);
534 vector<vector<BmnTrack>> candsThread(nThreads);
540#pragma omp parallel firstprivate(curDuet)
545 for (
size_t i = 0;
i < cells[maxCell].size(); ++
i) {
555 for (
Int_t iCellLeft = maxCell - 1; iCellLeft >= 0; iCellLeft--) {
568 minSlopeDiff = slopeDiffYZ;
572 if (minLeft !=
nullptr) {
588 threadNum = omp_get_thread_num();
590 candsThread.at(threadNum).push_back(trackCand);
595 for (
Int_t i = 0;
i < nThreads; ++
i)
596 for (
size_t j = 0; j < candsThread[
i].size(); ++j)
597 cands.push_back(candsThread[
i][j]);
610 cand.
SetChi2((chiX - chiY) > 0. ? chiX : chiY);
625 FairTrackParam par = *(cand.GetParamFirst());
628 for (
Int_t iHit = 0; iHit < cand.GetNHits(); ++iHit) {
631 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), 2212,
nullptr,
nullptr,
fIsField);
632 fKalman->Update(&par, hit, chi);
634 cand.SetParamLast(par);
635 for (
Int_t iHit = cand.GetNHits() - 1; iHit >= 0; iHit--) {
638 fKalman->TGeoTrackPropagate(&par, hit->GetZ(), 2212,
nullptr,
nullptr,
fIsField);
639 fKalman->Update(&par, hit, chi);
642 cand.SetParamFirst(par);
643 cand.SetChi2(chiTot);
694 for (
size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
708 else if (detId ==
kSSD)
710 else if (detId ==
kGEM)
763 const UInt_t nHits = tr->
GetNHits();
769 fField = FairRunAna::Instance()->GetField();
774 Double_t sumX(0.0), sumY(0.0), sumTx(0.0), sumTy(0.0), sumQP(0.0);
775 Double_t sumXX(0.0), sumXY(0.0), sumXTx(0.0), sumXTy(0.0), sumXQP(0.0);
776 Double_t sumYY(0.0), sumYTx(0.0), sumYTy(0.0), sumYQP(0.0);
777 Double_t sumTxTx(0.0), sumTxTy(0.0), sumTxQP(0.0);
778 Double_t sumTyTy(0.0), sumTyQP(0.0);
781 for (UInt_t
i = 0;
i < nHits; ++
i) {
789 Double_t Txi = -1.0 * (Zi - Zc) / (Xi - Xc);
808 sumTxTx += Txi * Txi;
809 sumTxTy += Txi * Tyi;
810 sumTxQP += Txi * QPi;
811 sumTyTy += Tyi * Tyi;
812 sumTyQP += Tyi * QPi;
813 sumQPQP += QPi * QPi;
823 Double_t Cov_X_Y = sumXY / nHits - meanX * meanY;
824 Double_t Cov_X_Tx = sumXTx / nHits - meanX * meanTx;
825 Double_t Cov_X_Ty = sumXTy / nHits - meanX * meanTy;
826 Double_t Cov_X_Qp = sumXQP / nHits - meanX * meanQP;
828 Double_t Cov_Y_Tx = sumYTx / nHits - meanY * meanTx;
829 Double_t Cov_Y_Ty = sumYTy / nHits - meanY * meanTy;
830 Double_t Cov_Y_Qp = sumYQP / nHits - meanY * meanQP;
831 Double_t Cov_Tx_Tx = sumTxTx / nHits -
Sq(meanTx);
832 Double_t Cov_Tx_Ty = sumTxTy / nHits - meanTx * meanTy;
833 Double_t Cov_Tx_Qp = sumTxQP / nHits - meanTx * meanQP;
834 Double_t Cov_Ty_Ty = sumTyTy / nHits -
Sq(meanTy);
835 Double_t Cov_Ty_Qp = sumTyQP / nHits - meanTy * meanQP;
836 Double_t Cov_Qp_Qp = sumQPQP / nHits -
Sq(meanQP);
839 par.SetCovariance(0, 0, Cov_X_X);
840 par.SetCovariance(0, 1, Cov_X_Y);
841 par.SetCovariance(0, 2, Cov_X_Tx);
842 par.SetCovariance(0, 3, Cov_X_Ty);
843 par.SetCovariance(0, 4, Cov_X_Qp);
844 par.SetCovariance(1, 1, Cov_Y_Y);
845 par.SetCovariance(1, 2, Cov_Y_Tx);
846 par.SetCovariance(1, 3, Cov_Y_Ty);
847 par.SetCovariance(1, 4, Cov_Y_Qp);
848 par.SetCovariance(2, 2, Cov_Tx_Tx);
849 par.SetCovariance(2, 3, Cov_Tx_Ty);
850 par.SetCovariance(2, 4, Cov_Tx_Qp);
851 par.SetCovariance(3, 3, Cov_Ty_Ty);
852 par.SetCovariance(3, 4, Cov_Ty_Qp);
853 par.SetCovariance(4, 4, Cov_Qp_Qp);
864 const UInt_t nHits = tr->
GetNHits();
899 for (
size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
900 QpSum += QpSegm[iSegm];
902 Double_t QpMean = QpSum / QpSegm.size();
905 for (
size_t iSegm = 0; iSegm < QpSegm.size(); iSegm++)
906 sqSigmaSum +=
Sq(QpSegm[iSegm] - QpMean);
908 return TVector2(QpMean,
Sqrt(sqSigmaSum / QpSegm.size()));
915 vector<BmnHit*> hits;
923 vector<Double_t> QpSegmBefore;
926 for (
Int_t iHit = 0; iHit < kNSegm; iHit++) {
927 BmnHit* first = hits[iHit];
928 BmnHit* second = hits[iHit + 1];
929 BmnHit* third = hits[iHit + 2];
938 * (
Abs(
fField->GetBy(third->GetX(), third->GetY(), third->GetZ()))
939 +
Abs(
fField->GetBy(second->GetX(), second->GetY(), second->GetZ()))
940 +
Abs(
fField->GetBy(first->GetX(), first->GetY(), first->GetZ())))
949 Double_t Tx_first = h * (fZ - Zc) / (fX - Xc);
960 QpSegmBefore.push_back(QP);
965 vector<Double_t> QpSegmAfter;
970 if (std::isnan(sigma) && fVerbose == 3) {
971 cout <<
"Bad refit convergence for track segment!!" << endl;
975 for (
size_t iSegm = 0; iSegm < QpSegmBefore.size(); iSegm++)
976 if (
Abs(QpSegmBefore[iSegm] - mean) - sigma <= 0.001)
977 QpSegmAfter.push_back(QpSegmBefore[iSegm]);
979 if (QpSegmAfter.size() == QpSegmBefore.size()) {
983 QpSegmBefore.clear();
984 QpSegmBefore.resize(0);
986 for (
size_t iSegm = 0; iSegm < QpSegmAfter.size(); iSegm++)
987 QpSegmBefore.push_back(QpSegmAfter[iSegm]);
990 QpSegmAfter.resize(0);
997 for (
size_t iEle = 0; iEle < QpSegmBefore.size(); iEle++)
998 QpRefit += QpSegmBefore[iEle];
1000 QpRefit /= QpSegmBefore.size();
1002 vector<Double_t> d =
dist(QpSegmBefore, QpRefit);
1005 for (
size_t i = 0;
i < QpSegmBefore.size();
i++)
1006 sigma += (QpSegmBefore[
i] - QpRefit) * (QpSegmBefore[
i] - QpRefit);
1007 sigma =
Sqrt(sigma / QpSegmBefore.size());
1009 vector<Double_t> w =
W(d, sigma);
1010 sigma =
Sigma(d, w);
1012 const Int_t kNIter = 20;
1013 for (
Int_t iIter = 1; iIter < kNIter; iIter++) {
1014 QpRefit =
Mu(QpSegmBefore, w);
1015 d =
dist(QpSegmBefore, QpRefit);
1017 sigma =
Sigma(d, w);
1029 vector<Double_t> X, Y, Z;
1034 X.push_back(hit->GetX());
1035 Y.push_back(hit->GetY());
1036 Z.push_back(hit->GetZ());
1040 for (
size_t i = 0;
i < X.size() - 1;
i++) {
1044 length +=
Sqrt(dX * dX + dY * dY + dZ * dZ);
1054 const Int_t kNSharedHits = 0;
1056 for (
size_t iTr = 0; iTr < sortedTracks.size(); ++iTr) {
1057 BmnTrack* tr = &(sortedTracks.at(iTr));
1061 Int_t nofSharedHits = 0;
1063 for (
Int_t iHit = 0; iHit < nofHits; iHit++)
1064 if (hitsId.find(tr->
GetHitIndex(iHit)) != hitsId.end()) {
1066 if (nofSharedHits > kNSharedHits) {
1074 for (
Int_t iHit = 0; iHit < nofHits; iHit++)
1084 TH2F* h_HitsZX =
new TH2F(
"h_HitsZX",
"h_HitsZX", 400, 0.0, 200.0, 400, -100.0, 100.0);
1085 TH2F* h_HitsZY =
new TH2F(
"h_HitsZY",
"h_HitsZY", 400, 0.0, 200.0, 400, -10.0, 50.0);
1088 h_HitsZX->
Fill(hit->GetZ(), hit->GetX());
1089 h_HitsZY->
Fill(hit->GetZ(), hit->GetY());
1098 h_HitsZX->
Draw(
"P");
1104 h_HitsZY->
Draw(
"P");
1117 if (glTrack->GetSilTrackIndex() != -1) {
1129 TLine* lineZX =
new TLine(z, x, zPrev, xPrev);
1132 TLine* lineZY =
new TLine(z, y, zPrev, yPrev);
1136 lineZX->
Draw(
"same");
1138 lineZY->
Draw(
"same");
1144 if (glTrack->GetSsdTrackIndex() != -1) {
1156 TLine* lineZX =
new TLine(z, x, zPrev, xPrev);
1159 TLine* lineZY =
new TLine(z, y, zPrev, yPrev);
1163 lineZX->
Draw(
"same");
1165 lineZY->
Draw(
"same");
1177 if (glTrack->GetSilTrackIndex() == -1 && glTrack->GetSsdTrackIndex() == -1) {
1184 for (
Int_t iHit = startIdx; iHit < gemTr->
GetNHits(); iHit++) {
1189 TLine* lineZX =
new TLine(z, x, zPrev, xPrev);
1192 TLine* lineZY =
new TLine(z, y, zPrev, yPrev);
1196 lineZX->
Draw(
"same");
1198 lineZY->
Draw(
"same");
1206 Int_t nMCtracks = 0;
1210 vector<TLine*> vLineZX;
1211 vector<TLine*> vLineZY;
1220 if (pnt->GetTrackID() == iTr) {
1225 vSt.insert(
fSilDetector->GetPointStationOwnership(z1));
1226 vLineZX.push_back(
new TLine(z0, x0, z1, x1));
1227 vLineZY.push_back(
new TLine(z0, y0, z1, y1));
1253 if (pnt->GetTrackID() == iTr) {
1259 vLineZX.push_back(
new TLine(z0, x0, z1, x1));
1260 vLineZY.push_back(
new TLine(z0, y0, z1, y1));
1266 if (nPoints > 3 && vSt.size() > 3) {
1269 for (
TLine* it : vLineZX) {
1270 it->SetLineColor(
kBlue);
1271 it->SetLineStyle(9);
1275 for (
TLine* it : vLineZY) {
1276 it->SetLineColor(
kBlue);
1277 it->SetLineStyle(9);
1283 printf(
"NMCTracks = %d GlobTracks = %d\n", nMCtracks,
fGlobTracksArray->GetEntriesFast());
static Double_t selectTime
static Double_t createTime
static Double_t connectTime
static Double_t stateTime
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.
TClonesArray * fMCTracksArray
TString fSsdHitsBranchName
map< DetectorId, Bool_t > fInnerTrackerSetup
Double_t * fCellSlopeYZCutMin
BmnStatus SortTracks(vector< BmnTrack > &inTracks, vector< BmnTrack > &sortedTracks)
TString fSsdTracksBranchName
Short_t fNSiliconStations
BmnStatus CheckSharedHits(vector< BmnTrack > &sortedTracks)
Double_t * fCellDiffSlopeXZCut
vector< BmnTrack > CellsConnection(vector< BmnCellDuet > *cells)
Double_t * fCellSlopeXZCutMin
Double_t * fCellSlopeYZCutMax
BmnKalmanFilter * fKalman
virtual void Exec(Option_t *opt)
TClonesArray * fSsdPointsArray
BmnSiliconStationSet * fSilDetector
Double_t CalculateLength(BmnTrack *tr)
BmnGemStripStationSet * fGemDetector
TClonesArray * fGemTracksArray
TClonesArray * fGemPointsArray
BmnStatus TrackSelection(vector< BmnTrack > &cands)
TClonesArray * fGemHitsArray
TClonesArray * fHitsArray
TString fGemTracksBranchName
void SetHitsUsing(BmnTrack *tr, Bool_t use)
Double_t * fCellDiffSlopeYZCut
TVector2 CalcMeanSigma(vector< Double_t >)
TClonesArray * fSilHitsArray
TClonesArray * fSsdHitsArray
TClonesArray * fSilTracksArray
virtual ~BmnCellAutoTracking()
TString fGlobTracksBranchName
TClonesArray * fSsdTracksArray
TString fSilTracksBranchName
TClonesArray * fGlobTracksArray
Double_t CalcQp(BmnTrack *track)
Double_t * fCellSlopeXZCutMax
TString fGemHitsBranchName
virtual InitStatus Init()
BmnStatus TrackUpdateByKalman(vector< BmnTrack > &cands)
TClonesArray * fSilPointsArray
BmnStatus CalculateTrackParams(BmnTrack *tr)
TString fSilHitsBranchName
BmnStatus StateCalculation(vector< BmnCellDuet > *cells)
BmnStatus TrackUpdateByLine(vector< BmnTrack > &cands)
BmnStatus CalcCovMatrix(BmnTrack *tr)
BmnStatus CellsCreation(vector< BmnCellDuet > *cells)
void SetLastIdx(Int_t idx)
void SetSlopeXZ(Double_t s)
void SetOldState(Short_t st)
void SetFirstIdx(Int_t idx)
void SetStartPlane(Short_t p)
void SetNewState(Short_t st)
void SetSlopeYZ(Double_t s)
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...
Double_t GetStartZ() const
Double_t GetStartY() const
Double_t GetStartX() const
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)