57 : FairTask(name, iVerbose)
58 , fMcEventListBranchName(
"MCEventList.")
59 , fStsTrackBranchName(
"StsTrack")
60 , fGlobalTrackBranchName(
"GlobalTrack")
61 , fRichBranchName(
"RichRing")
62 , fTrdBranchName(
"TrdTrack")
63 , fTrdHitBranchName(
"TrdHit")
64 , fTofBranchName(
"TofHit")
65 , fMuchTrackBranchName(
"MuchTrack")
66 , fMCTracksBranchName(
"MCTrack")
67 , fStsTrackMatchBranchName(
"StsTrackMatch")
68 , fRichRingMatchBranchName(
"RichRingMatch")
69 , fTrdTrackMatchBranchName(
"TrdTrackMatch")
70 , fTofHitMatchBranchName(
"TofHitMatch")
71 , fMuchTrackMatchBranchName(
"MuchTrackMatch")
72 , fStsTrackArray(nullptr)
73 , fGlobalTrackArray(nullptr)
74 , fRichRingArray(nullptr)
75 , fTrdTrackArray(nullptr)
76 , fTrdHitArray(nullptr)
77 , fTofHitArray(nullptr)
78 , fMuchTrackArray(nullptr)
79 , fMCTrackArray(nullptr)
80 , fStsTrackMatchArray(nullptr)
81 , fRichRingMatchArray(nullptr)
82 , fTrdTrackMatchArray(nullptr)
83 , fTofHitMatchArray(nullptr)
84 , fMuchTrackMatchArray(nullptr)
85 , fOutFileName(outFileName)
91 TFile* curFile = gFile;
92 TDirectory* curDirectory = gDirectory;
106 gDirectory->mkdir(
"STS");
107 gDirectory->cd(
"STS");
109 TString histoName[
NStsHisto] = {
"NHits",
"chi2/NDF",
"prob"};
110 TString axisName[
NStsHisto] = {
"N hits",
"#chi^{2}/NDF",
"prob"};
112 float xMin[
NStsHisto] = {-0.5, 0.f, 0.f};
113 float xMax[
NStsHisto] = {15.5, 20.f, 1.f};
115 TString subdirs[8] = {
"Tracks",
"e",
"mu",
"pi",
"K",
"p",
"fragments",
"ghost"};
117 for (
int iDir = 0; iDir < 8; iDir++) {
118 gDirectory->mkdir(subdirs[iDir].Data());
119 gDirectory->cd(subdirs[iDir].Data());
121 gDirectory->mkdir(
"TrackFitQA");
122 gDirectory->cd(
"TrackFitQA");
125 TString pull =
"pull";
127 TString parName[5] = {
"X",
"Y",
"Tx",
"Ty",
"QP"};
130 float xMaxFit[5] = {0.05, 0.045, 0.01, 0.01, 0.1};
132 for (
int iH = 0; iH < 5; iH++) {
134 new TH1F((res + parName[iH]).Data(), (res + parName[iH]).Data(), nBinsFit, -xMaxFit[iH], xMaxFit[iH]);
136 new TH1F((pull + parName[iH]).Data(), (pull + parName[iH]).Data(), nBinsFit, -10, 10);
139 gDirectory->cd(
"..");
142 hStsHisto[iDir][iH] =
new TH1F(histoName[iH].Data(), histoName[iH].Data(), nBins[iH], xMin[iH], xMax[iH]);
143 hStsHisto[iDir][iH]->GetXaxis()->SetTitle(axisName[iH].Data());
146 gDirectory->cd(
"..");
149 gDirectory->cd(
"..");
151 gDirectory->mkdir(
"MuCh");
152 gDirectory->cd(
"MuCh");
154 TString histoName[
NMuchHisto] = {
"NHits",
"FirstStation",
"LastStation",
"chi2/NDF",
"prob"};
155 TString axisName[
NMuchHisto] = {
"N hits",
"First Station",
"Last Station",
"#chi^{2}/NDF",
"prob"};
156 int nBins[
NMuchHisto] = {16, 16, 16, 100, 100};
157 float xMin[
NMuchHisto] = {-0.5f, -0.5f, -0.5f, 0.f, 0.f};
158 float xMax[
NMuchHisto] = {15.5f, 15.5f, 15.5f, 20.f, 1.f};
160 TString subdirs[3] = {
"mu",
"Background",
"Ghost"};
162 for (
int iDir = 0; iDir < 3; iDir++) {
163 gDirectory->mkdir(subdirs[iDir].Data());
164 gDirectory->cd(subdirs[iDir].Data());
166 hMuchHisto[iDir][iH] =
new TH1F(histoName[iH].Data(), histoName[iH].Data(), nBins[iH], xMin[iH], xMax[iH]);
167 hMuchHisto[iDir][iH]->GetXaxis()->SetTitle(axisName[iH].Data());
169 gDirectory->cd(
"..");
172 gDirectory->cd(
"..");
174 gDirectory->mkdir(
"RICH");
175 gDirectory->cd(
"RICH");
177 TString subdirs[10] = {
"AllTracks",
"e",
"mu",
"pi",
"K",
"p",
"Fragments",
"Mismatch",
"GhostTrack",
"GhostRing"};
180 for (
int iDir = 0; iDir < 10; iDir++) {
181 gDirectory->mkdir(subdirs[iDir]);
182 gDirectory->cd(subdirs[iDir]);
184 hRichRingHisto2D[iDir][iH] =
new TH2F(histoName2D[iH], histoName2D[iH], 1000, 0, 15., 1000, 0, 10.);
185 hRichRingHisto2D[iDir][iH]->GetYaxis()->SetTitle(histoName2D[iH] + TString(
" [cm]"));
188 gDirectory->cd(
"..");
191 gDirectory->cd(
"..");
193 gDirectory->mkdir(
"TRD");
194 gDirectory->cd(
"TRD");
196 TString histoName[
NTrdHisto] = {
"Wkn",
"ANN"};
197 TString axisName[
NTrdHisto] = {
"Wkn",
"ANN"};
202 TString subdirs[14] = {
"AllTracks",
"e",
"mu",
"pi",
"K",
"p",
"Fragments",
"Mismatch",
"GhostTrack",
203 "GhostTrdTrack",
"d",
"t",
"He3",
"He4"};
205 for (
int iDir = 0; iDir < 14; iDir++) {
206 gDirectory->mkdir(subdirs[iDir].Data());
207 gDirectory->cd(subdirs[iDir].Data());
209 hTrdHisto[iDir][iH] =
new TH1F(histoName[iH].Data(), histoName[iH].Data(), nBins[iH], xMin[iH], xMax[iH]);
210 hTrdHisto[iDir][iH]->GetXaxis()->SetTitle(axisName[iH].Data());
212 hTrdHisto2D[iDir][0] =
new TH2F(
"dE/dx",
"dE/dx", 1500, 0., 15., 1000, 0., 1000.);
213 hTrdHisto2D[iDir][0]->GetYaxis()->SetTitle(
"dE/dx [keV/(cm)]");
214 hTrdHisto2D[iDir][0]->GetXaxis()->SetTitle(
"p [GeV/c]");
215 gDirectory->cd(
"..");
218 gDirectory->cd(
"..");
220 gDirectory->mkdir(
"TOF");
221 gDirectory->cd(
"TOF");
223 TString histoName2D[
NTofHisto2D] = {
"M2P",
"M2dEdX"};
224 TString xAxisName[
NTofHisto2D] = {
"p [GeV/c]",
"dE/dx [keV/(cm)]"};
225 TString yAxisName[
NTofHisto2D] = {
"m^{2} [GeV^{2}/c^{4}]",
"m^{2} [GeV^{2}/c^{4}]"};
233 TString profName[
NTofProfiles] = {
"MatchEff",
"Mismatch",
"NoMatch"};
235 TString subdirs[14] = {
"AllTracks",
"e",
"mu",
"pi",
"K",
"p",
"Fragments",
"Mismatch",
"GhostTrack",
236 "WrongTofPoint",
"d",
"t",
"He3",
"He4"};
238 for (
int iDir = 0; iDir < 14; iDir++) {
239 gDirectory->mkdir(subdirs[iDir].Data());
240 gDirectory->cd(subdirs[iDir].Data());
243 hTofHisto2D[iDir][iH] =
new TH2F(histoName2D[iH].Data(), histoName2D[iH].Data(), xBins[iH], xMin[iH], xMax[iH],
244 yBins[iH], yMin[iH], yMax[iH]);
245 hTofHisto2D[iDir][iH]->GetXaxis()->SetTitle(xAxisName[iH]);
246 hTofHisto2D[iDir][iH]->GetYaxis()->SetTitle(yAxisName[iH]);
250 hTofProfiles[iDir][iH] =
new TProfile(profName[iH].Data(), profName[iH].Data(), 100, 0., 15.);
251 hTofProfiles[iDir][iH]->GetXaxis()->SetTitle(
"p [GeV/c]");
254 gDirectory->cd(
"..");
257 gDirectory->cd(
"..");
260 gDirectory = curDirectory;
390 for (Int_t iMC = 0; iMC <
nMCTracks; iMC++) {
403 if (pdg < 9999999 && ((TParticlePDG*) TDatabasePDG::Instance()->GetParticle(pdg))) {
404 q = TDatabasePDG::Instance()->GetParticle(pdg)->Charge() / 3.0;
406 else if (pdg == 1000010020) {
409 else if (pdg == -1000010020) {
412 else if (pdg == 1000010030) {
415 else if (pdg == -1000010030) {
418 else if (pdg == 1000020030) {
421 else if (pdg == -1000020030) {
424 else if (pdg == 1000020040) {
427 else if (pdg == -1000020040) {
433 Double_t p = cbmMCTrack->
GetP();
442 vector<int> trackMatch(ntrackMatches, -1);
444 for (
int iTr = 0; iTr < ntrackMatches; iTr++) {
449 Float_t bestWeight = 0.f;
450 Float_t totalWeight = 0.f;
451 Int_t mcTrackId = -1;
452 for (
int iLink = 0; iLink < stsTrackMatch->
GetNofLinks(); iLink++) {
459 if (bestWeight / totalWeight < 0.7) {
462 if (mcTrackId >=
nMCTracks || mcTrackId < 0) {
463 std::cout <<
"Sts Matching is wrong! StsTackId = " << mcTrackId <<
" N mc tracks = " <<
nMCTracks << std::endl;
467 mcTracks[mcTrackId].SetReconstructed();
468 trackMatch[iTr] = mcTrackId;
474 for (
int iTr = 0; iTr <
fStsTrackArray->GetEntriesFast(); iTr++) {
476 vRTracks[iTr] = *stsTrack;
477 if (trackMatch[iTr] > -1) {
478 pdg[iTr] =
mcTracks[trackMatch[iTr]].PDG();
483 vector<CbmL1PFFitter::PFFieldRegion> vField;
484 fitter.
Fit(vRTracks, pdg);
490 for (
unsigned int iTr = 0; iTr < vRTracks.size(); iTr++) {
491 if (trackMatch[iTr] < 0) {
495 const KFMCTrack& mcTrack =
mcTracks[trackMatch[iTr]];
496 if (mcTrack.MotherId() > -1) {
501 const FairTrackParam* parameters = vRTracks[iTr].GetParamFirst();
503 Double_t recoParam[5] = {parameters->GetX(), parameters->GetY(), parameters->GetTx(), parameters->GetTy(),
504 parameters->GetQp()};
505 Double_t recoError[5] = {parameters->GetCovariance(0, 0), parameters->GetCovariance(1, 1),
506 parameters->GetCovariance(2, 2), parameters->GetCovariance(3, 3),
507 parameters->GetCovariance(4, 4)};
508 Double_t mcParam[5] = {mcTrack.X(), mcTrack.Y(), mcTrack.Px() / mcTrack.Pz(), mcTrack.Py() / mcTrack.Pz(),
514 for (
int iParam = 0; iParam < 5; iParam++) {
515 Double_t residual = recoParam[iParam] - mcParam[iParam];
517 Double_t pReco = fabs(1. / recoParam[iParam]);
518 Double_t pMC = fabs(1. / mcParam[iParam]);
528 if (recoError[iParam] >= 0.) {
529 Double_t pull = residual /
sqrt(recoError[iParam]);
539 vector<int> trackMuchMatch;
542 trackMuchMatch.resize(nMuchTrackMatches, -1);
544 for (
int iTr = 0; iTr < nMuchTrackMatches; iTr++) {
549 Float_t bestWeight = 0.f;
550 Float_t totalWeight = 0.f;
551 Int_t mcTrackId = -1;
552 for (
int iLink = 0; iLink < muchTrackMatch->
GetNofLinks(); iLink++) {
559 if (bestWeight / totalWeight < 0.7) {
562 if (mcTrackId >=
nMCTracks || mcTrackId < 0) {
563 std::cout <<
"Much Matching is wrong! MuchTackId = " << mcTrackId <<
" N mc tracks = " <<
nMCTracks
568 trackMuchMatch[iTr] = mcTrackId;
573 Warning(
"KF Track QA",
"No GlobalTrack array!");
588 hStsHisto[0][iH]->Fill(stsHistoData[iH]);
591 int stsTrackMCIndex = trackMatch[stsTrackIndex];
592 if (stsTrackMCIndex >= 0) {
596 hStsHisto[iDir][iH]->Fill(stsHistoData[iH]);
602 hStsHisto[7][iH]->Fill(stsHistoData[iH]);
607 if (muchIndex > -1) {
610 int muchTrackMCIndex = trackMuchMatch[muchIndex];
612 Double_t* muchHistoData =
new Double_t[
NMuchHisto];
617 muchHistoData[4] = TMath::Prob(muchTrack->
GetChiSq(), muchTrack->
GetNDF());
619 if (stsTrackMCIndex < 0 || stsTrackMCIndex != muchTrackMCIndex) {
625 if (TMath::Abs(
mcTracks[stsTrackMCIndex].PDG()) == 13) {
636 delete[] muchHistoData;
642 stsPar->Momentum(mom);
644 Double_t p = mom.Mag();
645 Double_t pt = mom.Perp();
646 Double_t pz =
sqrt(p * p - pt * pt);
650 if (richIndex > -1) {
653 int richTrackMCIndex = -1;
657 float bestWeight = 0.f;
658 float totalWeight = 0.f;
659 int bestMCTrackId = -1;
660 for (
int iLink = 0; iLink < richRingMatch->
GetNofLinks(); iLink++) {
667 if (bestWeight / totalWeight >= 0.7) {
668 richTrackMCIndex = bestMCTrackId;
674 Double_t axisA = richRing->
GetAaxis();
675 Double_t axisB = richRing->
GetBaxis();
681 int iTrackCategory = -1;
682 if (stsTrackMCIndex < 0) {
685 else if (richTrackMCIndex < 0) {
688 else if (stsTrackMCIndex != richTrackMCIndex) {
695 if (iTrackCategory < 10) {
707 vector<int> trackTrdMatch(ntrackTrdMatches, -1);
717 Int_t trdTrackMCIndex = -1;
719 for (
int iTr = 0; iTr < ntrackTrdMatches; iTr++) {
723 Float_t bestWeight = 0.f;
724 Float_t totalWeight = 0.f;
725 for (
int iLink = 0; iLink < trdTrackMatch->
GetNofLinks(); iLink++) {
732 if (bestWeight / totalWeight < 0.7) {
735 if (trdTrackMCIndex >=
nMCTracks || trdTrackMCIndex < 0) {
736 std::cout <<
"Trd Matching is wrong! TrdTackId = " << trdTrackMCIndex
737 <<
" N mc tracks = " <<
nMCTracks << std::endl;
741 mcTracks[trdTrackMCIndex].SetReconstructed();
742 trackTrdMatch[iTr] = trdTrackMCIndex;
745 Double_t* trdHistoData =
new Double_t[
NTrdHisto];
750 for (Int_t iTRD = 0; iTRD < trdTrack->
GetNofHits(); iTRD++) {
758 int iTrackCategory = -1;
759 if (stsTrackMCIndex < 0) {
762 else if (trdTrackMCIndex < 0) {
765 else if (stsTrackMCIndex != trdTrackMCIndex) {
773 hTrdHisto[0][iH]->Fill(trdHistoData[iH]);
774 hTrdHisto[iTrackCategory][iH]->Fill(trdHistoData[iH]);
776 dedx = 1e6 * (pz / p) * eloss;
778 hTrdHisto2D[iTrackCategory][0]->Fill(mom.Mag(), dedx);
780 delete[] trdHistoData;
805 bool isReconstructible = 0;
813 Int_t tofMCTrackId = tofPoint->GetTrackID();
814 if (tofMCTrackId == stsTrackMCIndex) {
815 isReconstructible = 1;
820 if (stsTrackMCIndex < 0) {
821 isReconstructible = 0;
824 if (isReconstructible) {
825 bool reconstructed = 0;
834 Int_t tofMCTrackId = tofPoint->GetTrackID();
835 if (tofMCTrackId == stsTrackMCIndex) {
847 hTofProfiles[iTrackCategory][0]->Fill(p, reconstructed);
870 Double_t time = tofHit->
GetTime() - eventTime;
871 Double_t q = stsPar->GetQp() > 0 ? 1. : -1.;
874 Double_t m2 = p * p * (1. / ((l / time / 29.9792458) * (l / time / 29.9792458)) - 1.);
880 if (!tofHit || !tofHitMatch || !stsMatch) {
885 Int_t tofMCTrackId = tofPoint->GetTrackID();
894 int iHitCategory = -1;
895 if (stsTrackMCIndex < 0) {
898 else if (tofMCTrackId < 0) {
901 else if (stsTrackMCIndex != tofMCTrackId) {
909 hTofHisto2D[iHitCategory][1]->Fill(eloss * 1e6, m2);