diff --git a/core/qa/CbmQaConstants.h b/core/qa/CbmQaConstants.h index 91f62f272f400d9076c5d90f1bcaff64f27a5f0f..488b9d8fecf5b8e0d7ccdbbb10eb36d2fccd2d95 100644 --- a/core/qa/CbmQaConstants.h +++ b/core/qa/CbmQaConstants.h @@ -7,6 +7,9 @@ /// @since 04.04.2023 /// @author Sergei Zharko <s.zharko@gsi.de> +#ifndef CbmQaConstants_h +#define CbmQaConstants_h 1 + namespace CbmQaConstants { @@ -20,4 +23,6 @@ namespace CbmQaConstants constexpr double nm = cm * 1.e-7; } // namespace unit -} // namespace CbmQaConstants \ No newline at end of file +} // namespace CbmQaConstants + +#endif // CbmQaConstants_h diff --git a/reco/L1/CbmCaMCModule.cxx b/reco/L1/CbmCaMCModule.cxx index ba105dc7e527ba0a59fff4d1bb469402e6a88a12..60ac9e5a06f3b2ecb5f49cf7112e4d5b3fb8a880 100644 --- a/reco/L1/CbmCaMCModule.cxx +++ b/reco/L1/CbmCaMCModule.cxx @@ -10,8 +10,8 @@ #include "CbmCaMCModule.h" #include "CbmEvent.h" -#include "CbmL1.h" // for L1DetectorID #include "CbmL1Constants.h" +#include "CbmL1DetectorID.h" #include "CbmL1Hit.h" #include "CbmMCDataManager.h" #include "CbmMCDataObject.h" diff --git a/reco/L1/CbmL1.cxx b/reco/L1/CbmL1.cxx index c900f001af0ce51c7380ef8321b1955aa271ac8c..0804bbf7a39a2f7a1d6c4b4563cd9c6178bed626 100644 --- a/reco/L1/CbmL1.cxx +++ b/reco/L1/CbmL1.cxx @@ -955,12 +955,12 @@ void CbmL1::Reconstruct(CbmEvent* event) // FieldApproxCheck(); // FieldIntegralCheck(); - if (fVerbose > 1) { cout << "L1 Track finder..." << endl; } + if (fVerbose > 1) { LOG(info) << "L1 Track finder..."; } fpAlgo->CaTrackFinder(); // IdealTrackFinder(); fTrackingTime = fpAlgo->fCaRecoTime; - if (fVerbose > 1) { cout << "L1 Track finder ok" << endl; } + if (fVerbose > 1) { LOG(info) << "L1 Track finder ok"; } // save reconstructed tracks @@ -1001,7 +1001,7 @@ void CbmL1::Reconstruct(CbmEvent* event) fvRecoTracks.push_back(t); } - LOG(debug) << "CA Track Finder: " << fpAlgo->fCaRecoTime << " s/sub-ts" << endl; + LOG(debug) << "CA Track Finder: " << fpAlgo->fCaRecoTime << " s/sub-ts"; if ((fPerformance) && (fSTAPDataMode < 2)) { InputPerformance(); } @@ -1009,7 +1009,7 @@ void CbmL1::Reconstruct(CbmEvent* event) // output performance if (fPerformance) { - if (fVerbose > 1) { cout << "Performance..." << endl; } + if (fVerbose > 1) { LOG(info) << "Performance..."; } TrackMatch(); EfficienciesPerformance(); HistoPerformance(); @@ -1019,7 +1019,18 @@ void CbmL1::Reconstruct(CbmEvent* event) /// WriteSIMDKFData(); } if (fVerbose > 1) { LOG(info) << "Tracking performance... done"; } - if (fVerbose > 1) { LOG(info) << "End of L1"; } + if (fVerbose > 1) { LOG(info) << "End of CA"; } + + static bool ask = 0; + char symbol; + if (ask) { + LOG(info) << "\nCA run (any/r/q) > "; + do { + std::cin.get(symbol); + if (symbol == 'r') ask = false; + if ((symbol == 'e') || (symbol == 'q')) exit(0); + } while (symbol != '\n'); + } } // ----- Finish CbmStsFitPerformanceTask task ----------------------------- diff --git a/reco/L1/catools/CaToolsMCTrack.h b/reco/L1/catools/CaToolsMCTrack.h index 338ecaac1a861efa1b3d3844999654f1172c3130..3c474af8012bc113f4e3895f6ecc9a74839bac05 100644 --- a/reco/L1/catools/CaToolsMCTrack.h +++ b/reco/L1/catools/CaToolsMCTrack.h @@ -188,6 +188,9 @@ namespace ca::tools /// Gets z component of the track vertex [cm] double GetStartZ() const { return fPos[2]; } + /// @brief Gets track polar angle + double GetTheta() const { return std::acos(fMom[2] / GetP()); } + /// Gets total number of stations with hits int GetTotNofStationsWithHit() const { return fTotNofStationsWithHit; } diff --git a/reco/L1/qa/CbmCaOutputQa.cxx b/reco/L1/qa/CbmCaOutputQa.cxx index b0c7ba4004fc5a7522b0de04f34db3fc87a3fc1b..549a52f2951f3fbc18f4c60483eaedbcc9e8d7ac 100644 --- a/reco/L1/qa/CbmCaOutputQa.cxx +++ b/reco/L1/qa/CbmCaOutputQa.cxx @@ -38,87 +38,14 @@ void OutputQa::FillHistograms() for (size_t iTrkReco = 0; iTrkReco < fvRecoTracks.size(); ++iTrkReco) { const auto& recoTrk = fvRecoTracks[iTrkReco]; + // Reject tracks, which do not contain hits if (recoTrk.GetNofHits() < 1) { continue; } - const auto& hitFst = (fvHits)[recoTrk.GetHitIndexes()[0]]; // first hit of track - const auto& hitSnd = (fvHits)[recoTrk.GetHitIndexes()[1]]; // second hit of track - const auto& hitLst = (fvHits)[recoTrk.GetHitIndexes()[recoTrk.GetNofHits() - 1]]; // last hit of track - - // *************************************************** - // ** Histograms, requiring reconstructed data only ** - // *************************************************** - // - fph_reco_p->Fill(recoTrk.GetP()); - fph_reco_pt->Fill(recoTrk.GetPt()); - fph_reco_phi->Fill(recoTrk.GetPhi()); - fph_reco_tx->Fill(recoTrk.GetTx()); - fph_reco_ty->Fill(recoTrk.GetTy()); - fph_reco_nhits->Fill(recoTrk.GetNofHits()); - fph_reco_fsta->Fill(hitFst.GetStationId()); - fph_reco_fhitR->Fill(hitFst.GetR()); - - - // ****************************************** - // ** Histograms, requiring MC information ** - // ****************************************** - // - if (IsMCUsed()) { fph_reco_purity->Fill(100 * recoTrk.GetMaxPurity()); } - - if (recoTrk.GetNDF() > 0) { - if (IsMCUsed() && recoTrk.IsGhost()) { - fph_ghost_chi2_ndf->Fill(recoTrk.GetChiSq() / recoTrk.GetNDF()); - fph_ghost_prob->Fill(recoTrk.GetProb()); - } - else { - int iTmc = recoTrk.GetMCTrackIndexes()[0]; // Index of first MC-track - const auto& mcTrk = fMCData.GetTrack(iTmc); - // NOTE: reconstructed tracks usually have reference to only one MC-track - if (mcTrk.IsReconstructable()) { - fph_reco_chi2_ndf->Fill(recoTrk.GetChiSq() / recoTrk.GetNDF()); - fph_reco_prob->Fill(recoTrk.GetProb()); - } - else { - fph_rest_chi2_ndf->Fill(recoTrk.GetChiSq() / recoTrk.GetNDF()); - fph_rest_prob->Fill(recoTrk.GetProb()); - } - } - } // recoTrk.GetNDF() > 0: end - - if (IsMCUsed()) { - if (recoTrk.IsGhost()) { - fph_ghost_purity->Fill(100 * recoTrk.GetMaxPurity()); - fph_ghost_p->Fill(recoTrk.GetP()); - fph_ghost_pt->Fill(recoTrk.GetPt()); - fph_ghost_phi->Fill(recoTrk.GetPhi()); - fph_ghost_nhits->Fill(recoTrk.GetNofHits()); - fph_ghost_fsta->Fill(hitFst.GetStationId()); - fph_ghost_fhitR->Fill(hitFst.GetR()); - - // z-positions of the first and second hit stations - double z0 = fpParameters->GetStation(hitFst.GetStationId()).fZ[0]; - double z1 = fpParameters->GetStation(hitSnd.GetStationId()).fZ[0]; - - if (fabs(z1 - z0) > 1.e-4) { // test for z1 != z2 - fph_ghost_tx->Fill((hitSnd.GetX() - hitFst.GetX()) / (z1 - z0)); - fph_ghost_ty->Fill((hitSnd.GetY() - hitFst.GetY()) / (z1 - z0)); - } - - fph_ghost_nhits_vs_p->Fill(recoTrk.GetP(), recoTrk.GetNofHits()); - fph_ghost_fsta_vs_p->Fill(recoTrk.GetP(), hitFst.GetStationId()); - if (hitFst.GetStationId() <= hitLst.GetStationId()) { - fph_ghost_lsta_vs_fsta->Fill(hitFst.GetStationId(), hitLst.GetStationId()); - } - } // recoTrk.IsGhost(): end - } - - // ******************************** - // ** Different track categories ** - // ******************************** - fvpTrackHistograms[ETrackType::kAll]->FillRecoTrack(iTrkReco); if (IsMCUsed()) { + if (recoTrk.IsGhost()) { fvpTrackHistograms[ETrackType::kGhost]->FillRecoTrack(iTrkReco); } int iTrkMC = recoTrk.GetMatchedMCTrackIndex(); if (iTrkMC > -1) { const auto& mcTrk = fMCData.GetTrack(iTrkMC); @@ -150,6 +77,11 @@ void OutputQa::FillHistograms() if (IsMCUsed()) { for (int iTrkMC = 0; iTrkMC < fMCData.GetNofTracks(); ++iTrkMC) { const auto& mcTrk = fMCData.GetTrack(iTrkMC); + + // Cut tracks, which did not leave hits in tracker + if (mcTrk.GetNofHits() == 0) { continue; } + + // Fill different track categories fvpTrackHistograms[ETrackType::kAll]->FillMCTrack(iTrkMC); int pdg = mcTrk.GetPdgCode(); @@ -260,67 +192,15 @@ InitStatus OutputQa::InitHistograms() fvpTrackHistograms[type]->Init(); }; + RegisterTrackQa("ghost", ETrackType::kGhost, /*suppress MC*/ true); RegisterTrackQa("all", ETrackType::kAll); - RegisterTrackQa("prim", ETrackType::kPrim); - RegisterTrackQa("sec", ETrackType::kSec); - RegisterTrackQa("prim_pip", ETrackType::kPrimPIP); - RegisterTrackQa("prim_pim", ETrackType::kPrimPIM); - RegisterTrackQa("sec_pip", ETrackType::kSecPIP); - RegisterTrackQa("sec_pim", ETrackType::kSecPIM); - - - fph_reco_p = MakeHistoFromConfig<TH1F>("reco_p"); - fph_reco_pt = MakeHistoFromConfig<TH1F>("reco_pt"); - fph_reco_phi = MakeHistoFromConfig<TH1F>("reco_phi"); - fph_reco_tx = MakeHistoFromConfig<TH1F>("reco_tx"); - fph_reco_ty = MakeHistoFromConfig<TH1F>("reco_ty"); - fph_reco_nhits = MakeHistoFromConfig<TH1F>("reco_nhits"); - fph_reco_fsta = MakeHistoFromConfig<TH1F>("reco_fsta"); - fph_reco_fhitR = MakeHistoFromConfig<TH1F>("reco_fhitR"); - if (IsMCUsed()) { - fph_reco_purity = MakeHistoFromConfig<TH1F>("reco_purity"); - fph_reco_chi2_ndf = MakeHistoFromConfig<TH1F>("reco_chi2_ndf"); // TODO: Can be filled without MC - fph_reco_prob = MakeHistoFromConfig<TH1F>("reco_prob"); // TODO: Can be filled without MC - fph_rest_chi2_ndf = MakeHistoFromConfig<TH1F>("rest_chi2_ndf"); - fph_rest_prob = MakeHistoFromConfig<TH1F>("rest_prob"); - - fph_ghost_p = MakeHistoFromConfig<TH1F>("ghost_p"); - fph_ghost_pt = MakeHistoFromConfig<TH1F>("ghost_pt"); - fph_ghost_phi = MakeHistoFromConfig<TH1F>("ghost_phi"); - fph_ghost_nhits = MakeHistoFromConfig<TH1F>("ghost_nhits"); - fph_ghost_fsta = MakeHistoFromConfig<TH1F>("ghost_fsta"); - fph_ghost_purity = MakeHistoFromConfig<TH1F>("ghost_purity"); - fph_ghost_chi2_ndf = MakeHistoFromConfig<TH1F>("ghost_chi2_ndf"); - fph_ghost_prob = MakeHistoFromConfig<TH1F>("ghost_prob"); - fph_ghost_tx = MakeHistoFromConfig<TH1F>("ghost_tx"); - fph_ghost_ty = MakeHistoFromConfig<TH1F>("ghost_ty"); - fph_ghost_fhitR = MakeHistoFromConfig<TH1F>("ghost_fhitR"); - fph_ghost_nhits_vs_p = MakeHistoFromConfig<TH2F>("ghost_nhits_vs_p"); - fph_ghost_fsta_vs_p = MakeHistoFromConfig<TH2F>("ghost_fsta_vs_p"); - fph_ghost_lsta_vs_fsta = MakeHistoFromConfig<TH2F>("ghost_lsta_vs_fsta"); - - // Reconstructed tracks vs. MC quantities - fph_reco_pMC = MakeHistoFromConfig<TH1F>("reco_pMC"); - fph_reco_yMC = MakeHistoFromConfig<TH1F>("reco_yMC"); - fph_reco_pMC_vs_yMC = MakeHistoFromConfig<TH2F>("reco_pMC_vs_yMC"); - - // Residuals and pools of track parameters - fph_fst_res_x = MakeHistoFromConfig<TH1F>("fst_res_x"); - fph_fst_res_y = MakeHistoFromConfig<TH1F>("fst_res_y"); - fph_fst_res_tx = MakeHistoFromConfig<TH1F>("fst_res_tx"); - fph_fst_res_ty = MakeHistoFromConfig<TH1F>("fst_res_ty"); - fph_fst_res_qp = MakeHistoFromConfig<TH1F>("fst_res_qp"); - fph_fst_res_time = MakeHistoFromConfig<TH1F>("fst_res_time"); - fph_fst_res_v = MakeHistoFromConfig<TH1F>("fst_res_v"); - - fph_fst_pull_x = MakeHistoFromConfig<TH1F>("fst_pull_x"); - fph_fst_pull_y = MakeHistoFromConfig<TH1F>("fst_pull_y"); - fph_fst_pull_tx = MakeHistoFromConfig<TH1F>("fst_pull_tx"); - fph_fst_pull_ty = MakeHistoFromConfig<TH1F>("fst_pull_ty"); - fph_fst_pull_qp = MakeHistoFromConfig<TH1F>("fst_pull_qp"); - fph_fst_pull_time = MakeHistoFromConfig<TH1F>("fst_pull_time"); - fph_fst_pull_v = MakeHistoFromConfig<TH1F>("fst_pull_v"); + RegisterTrackQa("prim", ETrackType::kPrim); + RegisterTrackQa("sec", ETrackType::kSec); + RegisterTrackQa("prim_pip", ETrackType::kPrimPIP); + RegisterTrackQa("prim_pim", ETrackType::kPrimPIM); + RegisterTrackQa("sec_pip", ETrackType::kSecPIP); + RegisterTrackQa("sec_pim", ETrackType::kSecPIM); } return kSUCCESS; diff --git a/reco/L1/qa/CbmCaOutputQa.h b/reco/L1/qa/CbmCaOutputQa.h index 930134f7415d08bc55d75e9ce9b1086c1b7eac54..cd7ebc203692728682545da907c23fd2b3843adf 100644 --- a/reco/L1/qa/CbmCaOutputQa.h +++ b/reco/L1/qa/CbmCaOutputQa.h @@ -32,9 +32,10 @@ namespace cbm::ca /// @brief Enumeration of track category enum ETrackType { - kAll, ///< all tracks - kPrim, ///< primary tracks - kSec, ///< secondary tracks + kAll, ///< all tracks + kGhost, ///< ghost tracks (no MC is used) + kPrim, ///< primary tracks + kSec, ///< secondary tracks // kPrimEP, ///< primary electron tracks // kPrimEM, ///< primary positron tracks // kSecEP, ///< secondary electron tracks @@ -180,59 +181,6 @@ namespace cbm::ca std::array<std::unique_ptr<TrackTypeQa>, ETrackType::kEND> fvpTrackHistograms; std::array<std::tuple<Style_t, Marker_t, Color_t>, ETrackType::kEND> fvpTrackHistogramStyles; - - // Reconstructed tracks - TH1F* fph_reco_p = nullptr; ///< Total momentum over charge of reconstructed tracks - TH1F* fph_reco_pt = nullptr; ///< Transverse momentum over charge of reconstructed tracks - TH1F* fph_reco_phi = nullptr; ///< Azimuthal angle of reconstructed tracks - TH1F* fph_reco_tx = nullptr; ///< Slope along x-axis of reconstructed tracks - TH1F* fph_reco_ty = nullptr; ///< Slope along y-axis of reconstructed tracks - TH1F* fph_reco_fhitR = nullptr; ///< Distance of the first hit from z-axis for reconstructed tracks - TH1F* fph_reco_nhits = nullptr; ///< Hit number of reconstructed tracks - TH1F* fph_reco_fsta = nullptr; ///< First station index of reconstructed tracks - TH1F* fph_reco_chi2_ndf = nullptr; ///< Fit chi2 over NDF of reconstructed tracks - TH1F* fph_reco_prob = nullptr; ///< Fit probability of reconstructed tracks - TH1F* fph_rest_chi2_ndf = nullptr; ///< Fit chi2 over NDF of non-reconstructable tracks - TH1F* fph_rest_prob = nullptr; ///< Fit probability of non-reconstructable tracks - - // Ghost tracks - TH1F* fph_ghost_p = nullptr; ///< Total momentum over charge of ghost tracks - TH1F* fph_ghost_pt = nullptr; ///< Transverse momentum over charge of ghost tracks - TH1F* fph_ghost_phi = nullptr; ///< Azimuthal angle of ghost tracks - TH1F* fph_ghost_nhits = nullptr; ///< Hit number of ghost tracks - TH1F* fph_ghost_fsta = nullptr; ///< First station index of ghost tracks - TH1F* fph_ghost_purity = nullptr; ///< Purity of ghost tracks - TH1F* fph_ghost_chi2_ndf = nullptr; ///< Fit chi2 over NDF of ghost tracks - TH1F* fph_ghost_prob = nullptr; ///< Fit probability of ghost tracks - TH1F* fph_ghost_tx = nullptr; ///< Slope along x-axis of ghost tracks - TH1F* fph_ghost_ty = nullptr; ///< Slope along y-axis of ghost tracks - TH1F* fph_ghost_fhitR = nullptr; ///< Distance of the first hit from z-axis for ghost tracks - TH2F* fph_ghost_nhits_vs_p = nullptr; ///< Hit number vs. total momentum over charge of ghost tracks - TH2F* fph_ghost_fsta_vs_p = nullptr; ///< First station index vs. total momentum over charge for ghost tracks - TH2F* fph_ghost_lsta_vs_fsta = nullptr; ///< Last station index vs. first station index of ghost tracks - - // Reco tracks vs MC variables - TH1F* fph_reco_pMC = nullptr; ///< Reconstructed track distribution vs MC momemntum - TH1F* fph_reco_yMC = nullptr; ///< Reconstructed track distribution vs MC rapidity - TH2F* fph_reco_pMC_vs_yMC = nullptr; ///< Reconstructed track phase space (MC mom vs rapidity) - TH1F* fph_reco_purity = nullptr; ///< Purity of reconstructed tracks (\note purity requires MC information) - - // Residuals and pulls at the first track point - TH1F* fph_fst_res_x = nullptr; ///< Residual of x at first track point [cm] - TH1F* fph_fst_res_y = nullptr; ///< Residual of y at first track point [cm] - TH1F* fph_fst_res_tx = nullptr; ///< Residual of tx at first track point - TH1F* fph_fst_res_ty = nullptr; ///< Residual of ty at first track point - TH1F* fph_fst_res_qp = nullptr; ///< Residual of q/p at first track point [GeV/ec] - TH1F* fph_fst_res_time = nullptr; ///< Residual of time at first track point [ns] - TH1F* fph_fst_res_v = nullptr; ///< Residual of velocity at first track point [c] - - TH1F* fph_fst_pull_x = nullptr; ///< Pull of x at first track point [cm] - TH1F* fph_fst_pull_y = nullptr; ///< Pull of y at first track point [cm] - TH1F* fph_fst_pull_tx = nullptr; ///< Pull of tx at first track point - TH1F* fph_fst_pull_ty = nullptr; ///< Pull of ty at first track point - TH1F* fph_fst_pull_qp = nullptr; ///< Pull of q/p at first track point [GeV/ec] - TH1F* fph_fst_pull_time = nullptr; ///< Pull of time at first track point [ns] - TH1F* fph_fst_pull_v = nullptr; ///< Pull of velocity at first track point [c] }; } // namespace cbm::ca diff --git a/reco/L1/qa/CbmCaTrackTypeQa.cxx b/reco/L1/qa/CbmCaTrackTypeQa.cxx index c69ce7aa16880da7101543e3df1086843b98bad4..eed783fb873e9fbf047ce6912d99920d5f5f9c44 100644 --- a/reco/L1/qa/CbmCaTrackTypeQa.cxx +++ b/reco/L1/qa/CbmCaTrackTypeQa.cxx @@ -37,6 +37,9 @@ void TrackTypeQa::Init() assert(fpvHits); assert(!fbUseMC || fpMCData); + // + // ** Distributions of reconstructed tracks vs. reconstructed quantities ** + // fph_reco_p = MakeHisto<TH1F>("reco_p", "", kBinsP, kLoP, kUpP); fph_reco_pt = MakeHisto<TH1F>("reco_pt", "", kBinsPT, kLoPT, kUpPT); fph_reco_eta = MakeHisto<TH1F>("reco_eta", "", kBinsETA, kLoETA, kUpETA); @@ -48,36 +51,68 @@ void TrackTypeQa::Init() fph_reco_nhits = MakeHisto<TH1F>("reco_nhits", "", kBinsNHITS, kLoNHITS, kUpNHITS); // TODO: ... - fph_reco_p->SetTitle("Total momentum of reconstructed track;p_{reco} [GeV/c]"); - fph_reco_pt->SetTitle("Transverse momentum of reconstructed track;p_{T}_{reco} [GeV/c]"); - fph_reco_phi->SetTitle("Azimuthal angle of reconstructed track;#phi_{reco} [rad]"); - fph_reco_theta->SetTitle("Polar angle of reconstructed track;#theta_{reco} [rad]"); - fph_reco_tx->SetTitle("Slope along x-axis of reconstructed tracks;t_{x}"); - fph_reco_ty->SetTitle("Slope along y-axis of reconstructed tracks;t_{y}"); + fph_reco_p->SetTitle("Total momentum of reconstructed track;p^{reco} [GeV/c]"); + fph_reco_pt->SetTitle("Transverse momentum of reconstructed track;p_{T}^{reco} [GeV/c]"); + fph_reco_phi->SetTitle("Azimuthal angle of reconstructed track;#phi^{reco} [rad]"); + fph_reco_theta->SetTitle("Polar angle of reconstructed track;#theta^{reco} [rad]"); + fph_reco_tx->SetTitle("Slope along x-axis of reconstructed tracks;t_{x}^{reco}"); + fph_reco_ty->SetTitle("Slope along y-axis of reconstructed tracks;t_{y}^{reco}"); fph_reco_fhitR->SetTitle("Distance of the first hit from z-axis for reconstructed tracks"); fph_reco_nhits->SetTitle("Hit number of reconstructed tracks"); if (fbUseMC) { + // + // ** Distributions of reconstructed tracks vs. MC quantities ** + // fph_reco_pMC = MakeHisto<TH1F>("reco_pMC", "", kBinsP, kLoP, kUpP); fph_reco_yMC = MakeHisto<TH1F>("reco_yMC", "", kBinsY, kLoY, kUpY); fph_reco_pMC_yMC = MakeHisto<TH2F>("reco_pMC_yMC", "", kBinsY, kLoY, kUpY, kBinsP, kLoP, kUpP); fph_reco_phiMC = MakeHisto<TH1F>("reco_phiMC", "", kBinsPHI, kLoPHI, kUpPHI); fph_reco_thetaMC = MakeHisto<TH1F>("reco_thetaMC", "", kBinsTHETA, kLoTHETA, kUpTHETA); - fph_reco_pMC->SetTitle("MC total momentum of reconstructed track;p_{MC} [GeV/c]"); - fph_reco_yMC->SetTitle("MC rapidity of reconstructed track;y_{MC}"); - fph_reco_pMC_yMC->SetTitle("Transverse momentum of reconstructed track;y_{MC};p_{T}_{MC} [GeV/c]"); - fph_reco_phiMC->SetTitle("Azimuthal angle of reconstructed track;#phi_{reco} [rad]"); - fph_reco_thetaMC->SetTitle("Polar angle of reconstructed track;#theta_{reco} [rad]"); + fph_reco_pMC->SetTitle("MC total momentum of reconstructed track;p^{MC} [GeV/c]"); + fph_reco_yMC->SetTitle("MC rapidity of reconstructed track;y^{MC}"); + fph_reco_pMC_yMC->SetTitle("Transverse momentum of reconstructed track;y^{MC};p_{T}^{MC} [GeV/c]"); + fph_reco_phiMC->SetTitle("Azimuthal angle of reconstructed track;#phi^{MC} [rad]"); + fph_reco_thetaMC->SetTitle("Polar angle of reconstructed track;#theta^{MC} [rad]"); fph_mc_pMC = MakeHisto<TH1F>("mc_pMC", "", kBinsP, kLoP, kUpP); fph_mc_yMC = MakeHisto<TH1F>("mc_yMC", "", kBinsY, kLoY, kUpY); fph_mc_pMC_yMC = MakeHisto<TH2F>("mc_pMC_yMC", "", kBinsY, kLoY, kUpY, kBinsP, kLoP, kUpP); - fph_mc_pMC->SetTitle("MC total momentum of MC tracks;p_{MC} [GeV/c]"); - fph_mc_yMC->SetTitle("MC rapidity of MC tracks;y_{MC}"); - fph_mc_pMC_yMC->SetTitle("MC total momentum vs. MC rapidity of MC tracks;y_{MC};p_{MC} [GeV/c]"); - + fph_mc_pMC->SetTitle("MC total momentum of MC tracks;p^{MC} [GeV/c]"); + fph_mc_yMC->SetTitle("MC rapidity of MC tracks;y^{MC}"); + fph_mc_pMC_yMC->SetTitle("MC total momentum vs. MC rapidity of MC tracks;y^{MC};p^{MC} [GeV/c]"); + + // + // ** Efficiencies ** + // + fph_eff_int = MakeHisto<TProfile>("eff_int", "", 1, -0.5, 0.5, 0., 1.); + fph_eff_pMC = MakeHisto<TProfile>("eff_pMC", "", kBinsP, kLoP, kUpP, 0., 1.); + fph_eff_yMC = MakeHisto<TProfile>("eff_yMC", "", kBinsY, kLoY, kUpY, 0., 1.); + fph_eff_ptMC = MakeHisto<TProfile>("eff_ptMC", "", kBinsPT, kLoPT, kUpPT, 0., 1.); + fph_eff_thetaMC = MakeHisto<TProfile>("eff_thetaMC", "", kBinsTHETA, kLoTHETA, kUpTHETA, 0., 1.); + fph_eff_phiMC = MakeHisto<TProfile>("eff_phiMC", "", kBinsPHI, kLoPHI, kUpPHI, 0., 1.); + fph_eff_nhitsMC = MakeHisto<TProfile>("eff_nhitsMC", "", kBinsNHITS, kLoNHITS, kUpNHITS, 0., 1.); + + fph_eff_int->SetTitle("Integrated efficiency;;#epsilon_{CA}"); + fph_eff_pMC->SetTitle("Efficiency vs. MC total momentum;p_{MC} [GeV/c];#epsilon_{CA}"); + fph_eff_yMC->SetTitle("Efficiency vs. MC rapidity;y_{MC};#epsilon"); + fph_eff_ptMC->SetTitle("Efficiency vs. MC total momentum;p_{T}^{MC} [GeV/c];#epsilon_{CA}"); + fph_eff_thetaMC->SetTitle("Efficiency vs. MC polar angle;#theta^{MC};#epsilon_{CA}"); + fph_eff_phiMC->SetTitle("Efficiency vs. MC azimuthal angle;#phi^{MC};#epsilon_{CA}"); + fph_eff_nhitsMC->SetTitle("Efficiency vs. MC number of stations with hits;N_{hit}^{MC};#epsilon_{CA}"); + + fph_eff_pMC_yMC = MakeHisto<TProfile2D>("eff_pMC_yMC", "", kBinsY, kLoY, kUpY, kBinsP, kLoP, kUpP, 0., 1.); + fph_eff_thetaMC_phiMC = + MakeHisto<TProfile2D>("eff_theta_phi", "", kBinsPHI, kLoPHI, kUpPHI, kBinsTHETA, kLoTHETA, kUpTHETA, 0., 1.); + + fph_eff_pMC_yMC->SetTitle("Efficiency vs. MC total momentum and MC rapidity;y^{MC};#epsilon_{CA};p^{MC} [GeV/c]"); + fph_eff_thetaMC_phiMC->SetTitle( + "Efficiency vs. MC polar and azimuthal angles;#phi^{MC} [rad];#theta^{MC} [rad];#epsilon_{CA}"); + // + // ** Track fit parameter properties (residuals and pulls) ** + // fpFitQaFirstHit = std::make_unique<TrackFitQa>("fst_hit", fsPrefix, fpFolderRoot); fpFitQaFirstHit->SetTitle("First hit"); fpFitQaFirstHit->Init(); @@ -151,7 +186,27 @@ void TrackTypeQa::FillMCTrack(int iTrkMC, double weight) assert(fbUseMC); const MCTrack& mcTrack = fpMCData->GetTrack(iTrkMC); + + // Only reconstructable tracks are considered (?) + if (!mcTrack.IsReconstructable()) { return; } + + // ** Distributions ** fph_mc_pMC->Fill(mcTrack.GetP(), weight); fph_mc_yMC->Fill(mcTrack.GetRapidity(), weight); fph_mc_pMC_yMC->Fill(mcTrack.GetRapidity(), mcTrack.GetP(), weight); + + // ** Efficiencies ** + bool bReco = mcTrack.IsReconstructed(); + + // NOTE: Weight is ignored in efficiencies + fph_eff_int->Fill(0., bReco); + fph_eff_pMC->Fill(mcTrack.GetP(), bReco); + fph_eff_yMC->Fill(mcTrack.GetRapidity(), bReco); + fph_eff_ptMC->Fill(mcTrack.GetPt(), bReco); + fph_eff_thetaMC->Fill(mcTrack.GetTheta(), bReco); + fph_eff_phiMC->Fill(mcTrack.GetPhi(), bReco); + fph_eff_nhitsMC->Fill(mcTrack.GetTotNofStationsWithHit(), bReco); + + fph_eff_pMC_yMC->Fill(mcTrack.GetRapidity(), mcTrack.GetP(), bReco); + fph_eff_thetaMC_phiMC->Fill(mcTrack.GetPhi(), mcTrack.GetPhi(), bReco); } diff --git a/reco/L1/qa/CbmCaTrackTypeQa.h b/reco/L1/qa/CbmCaTrackTypeQa.h index c54479019fc2a9de4f6c2619033426fa40529fc2..13acc148490ab9147d28031f757609c450ebd12f 100644 --- a/reco/L1/qa/CbmCaTrackTypeQa.h +++ b/reco/L1/qa/CbmCaTrackTypeQa.h @@ -30,6 +30,7 @@ class CbmL1HitDebugInfo; class TH1F; class TH2F; class TProfile; +class TProfile2D; namespace cbm::ca { @@ -147,9 +148,17 @@ namespace cbm::ca TH1F* fph_mc_tyMC = nullptr; ///< Slope along y-axis of reconstructed tracks // ** Efficiencies ** - TProfile* fph_eff_p = nullptr; ///< Track efficiency - TProfile* fph_eff_nhits = nullptr; - TProfile* fph_eff_pMC = nullptr; + TProfile* fph_eff_int = nullptr; ///< Integrated efficiency + TProfile* fph_eff_pMC = nullptr; ///< Efficiency vs. MC momentum + TProfile* fph_eff_yMC = nullptr; ///< Efficiency vs. MC rapidity + TProfile* fph_eff_ptMC = nullptr; ///< Efficiency vs. MC transverse momentum + TProfile* fph_eff_thetaMC = nullptr; ///< Efficiency vs. MC polar angle + TProfile* fph_eff_phiMC = nullptr; ///< Efficiency vs. MC azimuthal angle + TProfile* fph_eff_nhitsMC = nullptr; ///< Efficiency vs. MC number of hits + + TProfile2D* fph_eff_thetaMC_phiMC = nullptr; ///< Efficiency vs. MC theta and MC phi + TProfile2D* fph_eff_pMC_yMC = nullptr; ///< Efficiency vs. MC momentum and MC rapidity + TProfile2D* fph_eff_tyMC_txMC = nullptr; ///< Efficiency vs. MC slopes // ** Fit QA ** std::unique_ptr<TrackFitQa> fpFitQaFirstMCpoint = nullptr; @@ -206,4 +215,4 @@ namespace cbm::ca }; } // namespace cbm::ca -#endif // CbmCaOutput \ No newline at end of file +#endif // CbmCaOutput