diff --git a/reco/L1/qa/CbmCaTrackFitQa.cxx b/reco/L1/qa/CbmCaTrackFitQa.cxx index f109f0576716d0a514bef804dc526821068b6cbe..f642be83d43949bbb5d22a2453e65b8c4f3fddda 100644 --- a/reco/L1/qa/CbmCaTrackFitQa.cxx +++ b/reco/L1/qa/CbmCaTrackFitQa.cxx @@ -86,6 +86,21 @@ CbmQaCanvas* TrackFitQa::CreatePullPlot() return pCanv; } +// --------------------------------------------------------------------------------------------------------------------- +void TrackFitQa::FillResAndPull(ETrackParType type, double recoVal, double recoErr, double trueVal) +{ + if (fvbParIgnored[type]) { + return; + } + double res = recoVal - trueVal; + double pull = res / recoErr; + if (type == ETrackParType::kQP) { // for the q/p parameter, the residual is calculated for the momentum + res = (recoVal / trueVal - 1.); + } + fvphResiduals[type]->Fill(res); + fvphPulls[type]->Fill(pull); +} + // --------------------------------------------------------------------------------------------------------------------- // void TrackFitQa::Init() @@ -115,7 +130,7 @@ void TrackFitQa::Init() CreateResidualHisto(ETrackParType::kY, "res_y", "y-coordinate;y^{reco} - y^{MC} [cm]"); CreateResidualHisto(ETrackParType::kTX, "res_tx", "slope along x-axis;T_{x}^{reco} - T_{x}^{MC}"); CreateResidualHisto(ETrackParType::kTY, "res_ty", "slope along y-axis;T_{y}^{reco} - T_{y}^{MC}"); - CreateResidualHisto(ETrackParType::kQP, "res_qp", "charge over mom.;(q/p)^{reco} - (q/p)^{MC} [ec/GeV]"); + CreateResidualHisto(ETrackParType::kQP, "res_P", "momentum; (p^{reco} - p^{MC})/p^{MC} []"); CreateResidualHisto(ETrackParType::kTIME, "res_t", "time;t^{reco} - t^{MC} [ns]"); CreateResidualHisto(ETrackParType::kVI, "res_vi", "inverse speed;v^{-1}_{reco} - v^{-1}_{MC} [c^{-1}]"); @@ -151,40 +166,40 @@ void TrackFitQa::Fill(const TrackParamV& trPar, const tools::MCPoint& mcPoint, b fitter.SetTrack(trPar); cbm::algo::ca::FieldRegion fieldRegion; fieldRegion.SetUseOriginalField(); // Precised magnetic field is used - fitter.Extrapolate(mcPoint.GetZOut(), fieldRegion); + fitter.Extrapolate(mcPoint.GetZ(), fieldRegion); const TrackParamV& trParExtr = fitter.Tr(); // Track parameters extrapolated to given MC point // ** Time-independent measurements ** - FillResAndPull(ETrackParType::kX, trPar.GetX()[0], trParExtr.GetXError()[0], mcPoint.GetXOut()); - FillResAndPull(ETrackParType::kY, trPar.GetY()[0], trParExtr.GetYError()[0], mcPoint.GetYOut()); - FillResAndPull(ETrackParType::kTX, trPar.GetTx()[0], trParExtr.GetTxError()[0], mcPoint.GetTxOut()); - FillResAndPull(ETrackParType::kTY, trPar.GetTy()[0], trParExtr.GetTyError()[0], mcPoint.GetTyOut()); - FillResAndPull(ETrackParType::kQP, trPar.GetQp()[0], trParExtr.GetQpError()[0], mcPoint.GetQpOut()); + FillResAndPull(ETrackParType::kX, trParExtr.GetX()[0], trParExtr.GetXError()[0], mcPoint.GetX()); + FillResAndPull(ETrackParType::kY, trParExtr.GetY()[0], trParExtr.GetYError()[0], mcPoint.GetY()); + FillResAndPull(ETrackParType::kTX, trParExtr.GetTx()[0], trParExtr.GetTxError()[0], mcPoint.GetTx()); + FillResAndPull(ETrackParType::kTY, trParExtr.GetTy()[0], trParExtr.GetTyError()[0], mcPoint.GetTy()); + FillResAndPull(ETrackParType::kQP, trParExtr.GetQp()[0], trParExtr.GetQpError()[0], mcPoint.GetQp()); // Momentum resolution double recoP = std::fabs(mcPoint.GetCharge() / trParExtr.GetQp()[0]); // reco mom. (with MC charge) - double resP = recoP - mcPoint.GetPOut(); // residual of total momentum + double resP = recoP - mcPoint.GetP(); // residual of total momentum // Phi resolution - double mcPhi = mcPoint.GetPhiOut(); - double recoTx = trPar.Tx()[0]; - double recoTy = trPar.Ty()[0]; + double mcPhi = mcPoint.GetPhi(); + double recoTx = trParExtr.Tx()[0]; + double recoTy = trParExtr.Ty()[0]; double resPhi = atan2(recoTx * cos(mcPhi) + recoTy * sin(mcPhi), -recoTx * cos(mcPhi) + recoTy * sin(mcPhi)); // Theta resolution - double resTheta = trPar.GetTheta()[0] - mcPoint.GetThetaOut(); // residual of polar angle + double resTheta = trParExtr.GetTheta()[0] - mcPoint.GetTheta(); // residual of polar angle resPhi = std::atan2(std::sin(resPhi), std::cos(resPhi)); // overflow over (-pi, pi] protection - fph_res_p_pMC->Fill(mcPoint.GetPOut(), resP); - fph_res_phi_phiMC->Fill(mcPoint.GetPhiOut(), resPhi); - fph_res_theta_thetaMC->Fill(mcPoint.GetThetaOut(), resTheta); + fph_res_p_pMC->Fill(mcPoint.GetP(), resP); + fph_res_phi_phiMC->Fill(mcPoint.GetPhi(), resPhi); + fph_res_theta_thetaMC->Fill(mcPoint.GetTheta(), resTheta); // ** Time-dependent measurements ** if (bTimeMeasured) { - FillResAndPull(ETrackParType::kTIME, trPar.GetTime()[0], trPar.GetTimeError()[0], mcPoint.GetTime()); - FillResAndPull(ETrackParType::kVI, trPar.GetVi()[0], trPar.GetViError()[0], mcPoint.GetInvSpeedOut()); + FillResAndPull(ETrackParType::kTIME, trParExtr.GetTime()[0], trParExtr.GetTimeError()[0], mcPoint.GetTime()); + FillResAndPull(ETrackParType::kVI, trParExtr.GetVi()[0], trParExtr.GetViError()[0], mcPoint.GetInvSpeed()); } } @@ -206,8 +221,8 @@ void TrackFitQa::SetDefaultProperties() fvRLo[ETrackParType::kTY] = -4.e-3; ///< Lower boundary, residual of slope along y-axis fvRUp[ETrackParType::kTY] = +4.e-3; ///< Upper boundary, residual of slope along y-axis fvRBins[ETrackParType::kQP] = 200; ///< Number of bins, residual of q/p - fvRLo[ETrackParType::kQP] = -1.; ///< Lower boundary, residual of q/p [ec/GeV] - fvRUp[ETrackParType::kQP] = +1.; ///< Upper boundary, residual of q/p [ec/GeV] + fvRLo[ETrackParType::kQP] = -.3; ///< Lower boundary, residual of q/p [ec/GeV] + fvRUp[ETrackParType::kQP] = +.3; ///< Upper boundary, residual of q/p [ec/GeV] fvRBins[ETrackParType::kTIME] = 200; ///< Number of bins, residual of time fvRLo[ETrackParType::kTIME] = -1.; ///< Lower boundary, residual of time [ns] fvRUp[ETrackParType::kTIME] = +1.; ///< Upper boundary, residual of time [ns] diff --git a/reco/L1/qa/CbmCaTrackFitQa.h b/reco/L1/qa/CbmCaTrackFitQa.h index 0ce34ddd9b01c34033ccf7cf1217d17a8b616419..2e8eee53e94933d7f2c3812e0be6dd7820f642a3 100644 --- a/reco/L1/qa/CbmCaTrackFitQa.h +++ b/reco/L1/qa/CbmCaTrackFitQa.h @@ -203,20 +203,4 @@ namespace cbm::ca ClassDefNV(TrackFitQa, 0); }; - // ***************************** - // ** Inline implementation ** - // ***************************** - - // --------------------------------------------------------------------------------------------------------------------- - // TODO: Test this function for performance penalties - inline void TrackFitQa::FillResAndPull(ETrackParType type, double recoVal, double recoErr, double trueVal) - { - if (fvbParIgnored[type]) { - return; - } - double res = recoVal - trueVal; - double pull = res / recoErr; - fvphResiduals[type]->Fill(res); - fvphPulls[type]->Fill(pull); - } } // namespace cbm::ca diff --git a/reco/L1/qa/CbmCaTrackTypeQa.cxx b/reco/L1/qa/CbmCaTrackTypeQa.cxx index 00407aefc4400e77446e1e4773ba1fe2decb1a90..db6156bfcbb0a73ca04a33e8a1830461766eb208 100644 --- a/reco/L1/qa/CbmCaTrackTypeQa.cxx +++ b/reco/L1/qa/CbmCaTrackTypeQa.cxx @@ -226,9 +226,7 @@ void TrackTypeQa::FillRecoTrack(int iTrkReco, double weight) if (iPfst > -1) { const auto& mcPoint = fpMCData->GetPoint(iPfst); TrackParamV trPar(recoTrack); - fTrackFit.SetTrack(trPar); - fTrackFit.Extrapolate(mcPoint.GetZOut(), fFieldRegion); - fpFitQaFirstHit->Fill(fTrackFit.Tr(), mcPoint, isTimeFitted); + fpFitQaFirstHit->Fill(trPar, mcPoint, isTimeFitted); } } @@ -239,8 +237,6 @@ void TrackTypeQa::FillRecoTrack(int iTrkReco, double weight) if (iPlst > -1) { const auto& mcPoint = fpMCData->GetPoint(iPlst); TrackParamV trPar(recoTrack.TLast); - fTrackFit.SetTrack(trPar); - fTrackFit.Extrapolate(mcPoint.GetZOut(), fFieldRegion); fpFitQaLastHit->Fill(trPar, mcPoint, isTimeFitted); } }