@@ -105,6 +105,7 @@ struct HfTaskD0 {
105105 HfUpcGapThresholds upcThresholds; // UPC gap determination thresholds
106106 ctpRateFetcher mRateFetcher ;
107107
108+
108109 SliceCache cache;
109110 Service<o2::ccdb::BasicCCDBManager> ccdb{};
110111
@@ -123,7 +124,8 @@ struct HfTaskD0 {
123124 using CollisionsWithMcLabels = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels>;
124125 using CollisionsWithMcLabelsCent = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels, aod::CentFT0Ms, aod::CentFT0Cs>;
125126 using TracksSelQuality = soa::Join<aod::TracksExtra, aod::TracksWMc>;
126- using TracksWPid = soa::Join<aod::Tracks, aod::TracksPidPi, aod::PidTpcTofFullPi, aod::TracksPidKa, aod::PidTpcTofFullKa>;
127+ using TracksWPid = soa::Join<o2::aod::FullTracks, aod::TracksDCA, o2::aod::TrackSelection, aod::TracksPidPi, aod::PidTpcTofFullPi, aod::TracksPidKa, aod::PidTpcTofFullKa, aod::TracksPidPr, aod::PidTpcTofFullPr>;
128+ // using TracksWithExtra = o2::soa::Join<o2::aod::FullTracks, o2::aod::TrackSelection>;
127129
128130 Filter filterD0Flag = (o2::aod::hf_track_index::hfflag & static_cast <uint8_t >(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK))) != static_cast <uint8_t >(0 );
129131
@@ -141,6 +143,8 @@ struct HfTaskD0 {
141143 Partition<D0CandidatesMlMc> selectedD0CandidatesMlMc = aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf;
142144 Partition<D0CandidatesMlMcKF> selectedD0CandidatesMlMcKF = aod::hf_sel_candidate_d0::isRecoHfFlag >= selectionFlagHf;
143145
146+ Preslice<TracksWPid> perCol = aod::track::collisionId;
147+
144148 // ThnSparse for ML outputScores and Vars
145149 ConfigurableAxis thnConfigAxisBkgScore{" thnConfigAxisBkgScore" , {50 , 0 , 1 }, " Bkg score bins" };
146150 ConfigurableAxis thnConfigAxisNonPromptScore{" thnConfigAxisNonPromptScore" , {50 , 0 , 1 }, " Non-prompt score bins" };
@@ -396,11 +400,13 @@ struct HfTaskD0 {
396400 }
397401
398402 registry.add (" Data/fitInfo/ampFT0A_vs_ampFT0C" , " FT0-A vs FT0-C amplitude;FT0-A amplitude (a.u.);FT0-C amplitude (a.u.)" , {HistType::kTH2F , {{2500 , 0 ., 250 }, {2500 , 0 ., 250 }}});
399- registry.add (" Data/zdc/energyZNA_vs_energyZNC" , " ZNA vs ZNC common energy;E_{ZNA}^{common} (a.u.);E_{ZNC}^{common} (a.u.)" , {HistType::kTH2F , {{200 , 0 ., 200 }, {1000 , 0 ., 2000 }}});
400- registry.add (" Data/zdc/timeZNA_vs_timeZNC" , " ZNA vs ZNC time;ZNA Time;ZNC time" , {HistType::kTH2F , {{700 , -35 ., 35 .}, {700 , -35 ., 35 .}}});
403+ registry.add (" Data/zdc/energyZNA_vs_energyZNC" , " ZNA vs ZNC common energy;E_{ZNA}^{common} (a.u.);E_{ZNC}^{common} (a.u.)" , {HistType::kTH2F , {{1000 , 0 ., 20000 }, {1000 , 0 ., 20000 }}});
404+ registry.add (" Data/zdc/timeZNA_vs_timeZNC" , " ZNA vs ZNC time;ZNA Time;ZNC time" , {HistType::kTH2F , {{200 , -10 ., 10 .}, {200 , -10 ., 10 .}}});
401405 registry.add (" Data/hUpcGapAfterSelection" , " UPC gap type after selection;Gap type;Counts" , {HistType::kTH1F , {{7 , -1.5 , 5.5 }}});
402406 registry.add (" Data/hGapVsEtaTrack0" , " UPC gap vs Eta;Gap type;Eta" , {HistType::kTH2F , {{7 , -1.5 , 5.5 }, {50 , -1 ., 1 .}}});
403407 registry.add (" Data/hGapVsEtaTrack1" , " UPC gap vs Eta;Gap type;Eta" , {HistType::kTH2F , {{7 , -1.5 , 5.5 }, {50 , -1 ., 1 .}}});
408+ registry.add (" QAtracks/hEtaTrackVsGap" , " " , {HistType::kTH2F , {{7 , -1.5 , 5.5 }, {100 , -1.8 , 1.8 }}});
409+ registry.add (" QAtracks/hPtTrackVsGap" , " " , {HistType::kTH2F , {{7 , -1.5 , 5.5 }, {100 , 0 , 50 }}});
404410
405411 registry.add (" Data/hTPCnSigProng0Pion_GapA" , " Gap A Prong 0;P (GeV/c) ;TPC nSigma Pion" , {HistType::kTH2F , {{100 , 0 , 50 }, {120 , -6 ., 6 .}}});
406412 registry.add (" Data/hTPCnSigProng1Kaon_GapA" , " Gap A Prong 1;P (GeV/c) ;TPC nSigma Kaon" , {HistType::kTH2F , {{100 , 0 , 50 }, {120 , -6 ., 6 .}}});
@@ -428,8 +434,50 @@ struct HfTaskD0 {
428434 registry.add (" Data/hTpcTofnSigProng1Kaon_GapC" , " Gap C Prong 1;P (GeV/c) ;TpcTof nSigma Kaon" , {HistType::kTH2F , {{100 , 0 , 50 }, {50 , 0 ., 10 .}}});
429435 registry.add (" Data/hTpcTofnSigProng0Kaon_GapC" , " Gap C Prong 0;P (GeV/c) ;TpcTof nSigma Pion" , {HistType::kTH2F , {{100 , 0 , 50 }, {50 , 0 ., 10 .}}});
430436 registry.add (" Data/hTpcTofnSigProng1Pion_GapC" , " Gap C Prong 1;P (GeV/c) ;TpcTof nSigma Kaon" , {HistType::kTH2F , {{100 , 0 , 50 }, {50 , 0 ., 10 .}}});
431-
432437 registry.add (" Data/hGapVsRap" , " UPC gap vs Eta;Gap type;Eta" , {HistType::kTH2F , {{7 , -1.5 , 5.5 }, {50 , -1 ., 1 .}}});
438+ // QA histograms for Event level info
439+ registry.add (" QAevents/hPVcontrVsGap" , " ;Gap ; N PV contributors" , {HistType::kTH2F , {{7 , -1.5 , 5.5 }, {800 , 0 ., 200 .}}});
440+ registry.add (" QAevents/ampFT0AVsC_GapA" , " FT0-A vs FT0-C amplitude;FT0-A amplitude (a.u.);FT0-C amplitude (a.u.) Gap A" , {HistType::kTH2F , {{2500 , 0 ., 250 }, {2500 , 0 ., 250 }}});
441+ registry.add (" QAevents/ampFT0AVsC_GapC" , " FT0-A vs FT0-C amplitude;FT0-A amplitude (a.u.);FT0-C amplitude (a.u.) Gap C" , {HistType::kTH2F , {{2500 , 0 ., 250 }, {2500 , 0 ., 250 }}});
442+ registry.add (" QAevents/energyZNAvsC_GapA" , " ZNA vs ZNC common energy;E_{ZNA}^{common} (a.u.);E_{ZNC}^{common} (a.u.) Gap A" , {HistType::kTH2F , {{1000 , 0 ., 20000 }, {1000 , 0 ., 20000 }}});
443+ registry.add (" QAevents/energyZNAvsC_GapC" , " ZNA vs ZNC common energy;E_{ZNA}^{common} (a.u.);E_{ZNC}^{common} (a.u.) Gap A" , {HistType::kTH2F , {{1000 , 0 ., 20000 }, {1000 , 0 ., 20000 }}});
444+ registry.add (" QAevents/timeZNAvsC_GapA" , " ZNA vs ZNC time;ZNA Time;ZNC time Gap A" , {HistType::kTH2F , {{200 , -10 ., 10 .}, {200 , -10 ., 10 .}}});
445+ registry.add (" QAevents/timeZNAvsC_GapC" , " ZNA vs ZNC time;ZNA Time;ZNC time Gap C" , {HistType::kTH2F , {{200 , -10 ., 10 .}, {200 , -10 ., 10 .}}});
446+ // QA histograms for tracks
447+ // A side gap
448+ registry.add (" QAtracks/hTPCnSigmaPi_GapA" , " Gap A;P (GeV/c) ;TPC nSigma Pi" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
449+ registry.add (" QAtracks/hTPCnSigmaKa_GapA" , " Gap A;P (GeV/c) ;TPC nSigma Ka" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
450+ registry.add (" QAtracks/hTPCnSigmaPr_GapA" , " Gap A;P (GeV/c) ;TPC nSigma Pr" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
451+ registry.add (" QAtracks/hTOFnSigmaPi_GapA" , " Gap A;P (GeV/c) ;TOF nSigma Pi" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
452+ registry.add (" QAtracks/hTOFnSigmaKa_GapA" , " Gap A;P (GeV/c) ;TOF nSigma Ka" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
453+ registry.add (" QAtracks/hTOFnSigmaPr_GapA" , " Gap A;P (GeV/c) ;TOF nSigma Pr" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
454+ registry.add (" QAtracks/hTPCTOFnSigmaPi_GapA" , " Gap A;P (GeV/c) ;TPCTOF nSigma Pi" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , 0 ., 6 .}}});
455+ registry.add (" QAtracks/hTPCTOFnSigmaKa_GapA" , " Gap A;P (GeV/c) ;TPCTOF nSigma Ka" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , 0 ., 6 .}}});
456+ registry.add (" QAtracks/hTPCTOFnSigmaPr_GapA" , " Gap A;P (GeV/c) ;TPCTOF nSigma Pr" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , 0 ., 6 .}}});
457+
458+ registry.add (" QAtracks/hTPCNCls_GapA" , " Gap A; TPC Cls" , {HistType::kTH1F , {{160 , 0 ., 160 .}}});
459+ registry.add (" QAtracks/hTPCChi2_GapA" , " Gap A; TPC chi2" , {HistType::kTH1F , {{24 , 0 ., 6 .}}});
460+ registry.add (" QAtracks/hITSNCls_GapA" , " Gap A; TPC Cls" , {HistType::kTH1F , {{8 , -1 ., 7 .}}});
461+ registry.add (" QAtracks/hDCAxy_GapA" , " Gap A; DCA xy" , {HistType::kTH1F , {{400 , -2 , 2 .}}});
462+ registry.add (" QAtracks/hDCAz_GapA" , " Gap A; DCA z" , {HistType::kTH1F , {{400 , -4 , 4 .}}});
463+
464+ // C side gap
465+ registry.add (" QAtracks/hTPCnSigmaPi_GapC" , " Gap C;P (GeV/c) ;TPC nSigma Pi" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
466+ registry.add (" QAtracks/hTPCnSigmaKa_GapC" , " Gap C;P (GeV/c) ;TPC nSigma Ka" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
467+ registry.add (" QAtracks/hTPCnSigmaPr_GapC" , " Gap C;P (GeV/c) ;TPC nSigma Pr" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
468+ registry.add (" QAtracks/hTOFnSigmaPi_GapC" , " Gap C;P (GeV/c) ;TOF nSigma Pi" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
469+ registry.add (" QAtracks/hTOFnSigmaKa_GapC" , " Gap C;P (GeV/c) ;TOF nSigma Ka" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
470+ registry.add (" QAtracks/hTOFnSigmaPr_GapC" , " Gap C;P (GeV/c) ;TOF nSigma Pr" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , -6 ., 6 .}}});
471+ registry.add (" QAtracks/hTPCTOFnSigmaPi_GapC" , " Gap C;P (GeV/c) ;TPCTOF nSigma Pi" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , 0 , 6 .}}});
472+ registry.add (" QAtracks/hTPCTOFnSigmaKa_GapC" , " Gap C;P (GeV/c) ;TPCTOF nSigma Ka" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , 0 ., 6 .}}});
473+ registry.add (" QAtracks/hTPCTOFnSigmaPr_GapC" , " Gap C;P (GeV/c) ;TPCTOF nSigma Pr" , {HistType::kTH2F , {{360 , 0 , 36 }, {120 , 0 ., 6 .}}});
474+
475+ registry.add (" QAtracks/hTPCNCls_GapC" , " Gap C; TPC Cls" , {HistType::kTH1F , {{160 , 0 ., 160 .}}});
476+ registry.add (" QAtracks/hTPCChi2_GapC" , " Gap C; TPC chi2" , {HistType::kTH1F , {{24 , 0 ., 6 .}}});
477+ registry.add (" QAtracks/hITSNCls_GapC" , " Gap C; TPC Cls" , {HistType::kTH1F , {{8 , -1 ., 7 .}}});
478+ registry.add (" QAtracks/hDCAxy_GapC" , " Gap C; DCA xy" , {HistType::kTH1F , {{400 , -2 , 2 .}}});
479+ registry.add (" QAtracks/hDCAz_GapC" , " Gap C; DCA z" , {HistType::kTH1F , {{400 , -4 , 4 .}}});
480+
433481
434482 hfEvSel.addHistograms (registry);
435483
@@ -625,7 +673,7 @@ struct HfTaskD0 {
625673 aod::FT0s const & ft0s,
626674 aod::FV0As const & fv0as,
627675 aod::FDDs const & fdds,
628- TracksWPid const &)
676+ TracksWPid const & tracks )
629677 {
630678 for (const auto & collision : collisions) {
631679 float centrality{-1 .f };
@@ -667,6 +715,19 @@ struct HfTaskD0 {
667715 }
668716 registry.fill (HIST (" Data/fitInfo/ampFT0A_vs_ampFT0C" ), fitInfo.ampFT0A , fitInfo.ampFT0C );
669717 registry.fill (HIST (" Data/hUpcGapAfterSelection" ), gap);
718+ registry.fill (HIST (" QAevents/hPVcontrVsGap" ), gap, collision.numContrib ());
719+
720+ if (gap == 0 ) {
721+ registry.fill (HIST (" QAevents/ampFT0AVsC_GapA" ), fitInfo.ampFT0A , fitInfo.ampFT0C );
722+ registry.fill (HIST (" QAevents/energyZNAvsC_GapA" ), zdcEnergyZNA, zdcEnergyZNC);
723+ registry.fill (HIST (" QAevents/timeZNAvsC_GapA" ), zdcTimeZNA, zdcTimeZNC);
724+ }
725+
726+ if (gap == 1 ) {
727+ registry.fill (HIST (" QAevents/ampFT0AVsC_GapC" ), fitInfo.ampFT0A , fitInfo.ampFT0C );
728+ registry.fill (HIST (" QAevents/energyZNAvsC_GapC" ), zdcEnergyZNA, zdcEnergyZNC);
729+ registry.fill (HIST (" QAevents/timeZNAvsC_GapC" ), zdcTimeZNA, zdcTimeZNC);
730+ }
670731
671732 const auto thisCollId = collision.globalIndex ();
672733 const auto & groupedD0Candidates = candidates.sliceBy (candD0PerCollision, thisCollId);
@@ -679,6 +740,50 @@ struct HfTaskD0 {
679740 ir = mRateFetcher .fetch (ccdb.service , bc.timestamp (), bc.runNumber (), irSource, true ) * 1 .e -3 ; // kHz
680741 }
681742
743+ auto tracksample = tracks.sliceBy (perCol, collision.globalIndex ());
744+ if (collision.numContrib () > 1 ) {
745+ for (const auto & track : tracksample) {
746+ if (!track.isGlobalTrack ()) {
747+ continue ;
748+ }
749+ registry.fill (HIST (" QAtracks/hEtaTrackVsGap" ), gap, track.eta ());
750+ registry.fill (HIST (" QAtracks/hPtTrackVsGap" ), gap, track.pt ());
751+
752+ if (gap == 0 ) { // QA for Gap A
753+ registry.fill (HIST (" QAtracks/hTPCnSigmaPi_GapA" ), track.p (), track.tpcNSigmaPi ());
754+ registry.fill (HIST (" QAtracks/hTPCnSigmaKa_GapA" ), track.p (), track.tpcNSigmaKa ());
755+ registry.fill (HIST (" QAtracks/hTPCnSigmaPr_GapA" ), track.p (), track.tpcNSigmaPr ());
756+ registry.fill (HIST (" QAtracks/hTOFnSigmaPi_GapA" ), track.p (), track.tofNSigmaPi ());
757+ registry.fill (HIST (" QAtracks/hTOFnSigmaKa_GapA" ), track.p (), track.tofNSigmaKa ());
758+ registry.fill (HIST (" QAtracks/hTOFnSigmaPr_GapA" ), track.p (), track.tofNSigmaPr ());
759+ registry.fill (HIST (" QAtracks/hTPCTOFnSigmaPi_GapA" ), track.p (), track.tpcTofNSigmaPi ());
760+ registry.fill (HIST (" QAtracks/hTPCTOFnSigmaKa_GapA" ), track.p (), track.tpcTofNSigmaKa ());
761+ registry.fill (HIST (" QAtracks/hTPCTOFnSigmaPr_GapA" ), track.p (), track.tpcTofNSigmaPr ());
762+ registry.fill (HIST (" QAtracks/hTPCNCls_GapA" ), track.tpcNClsFound ());
763+ registry.fill (HIST (" QAtracks/hTPCChi2_GapA" ), track.tpcChi2NCl ());
764+ registry.fill (HIST (" QAtracks/hITSNCls_GapA" ), track.itsNCls ());
765+ registry.fill (HIST (" QAtracks/hDCAxy_GapA" ), track.dcaXY ());
766+ registry.fill (HIST (" QAtracks/hDCAz_GapA" ), track.dcaZ ());
767+ }
768+ if (gap == 1 ) { // QA for Gap C
769+ registry.fill (HIST (" QAtracks/hTPCnSigmaPi_GapC" ), track.p (), track.tpcNSigmaPi ());
770+ registry.fill (HIST (" QAtracks/hTPCnSigmaKa_GapC" ), track.p (), track.tpcNSigmaKa ());
771+ registry.fill (HIST (" QAtracks/hTPCnSigmaPr_GapC" ), track.p (), track.tpcNSigmaPr ());
772+ registry.fill (HIST (" QAtracks/hTOFnSigmaPi_GapC" ), track.p (), track.tofNSigmaPi ());
773+ registry.fill (HIST (" QAtracks/hTOFnSigmaKa_GapC" ), track.p (), track.tofNSigmaKa ());
774+ registry.fill (HIST (" QAtracks/hTOFnSigmaPr_GapC" ), track.p (), track.tofNSigmaPr ());
775+ registry.fill (HIST (" QAtracks/hTPCTOFnSigmaPi_GapC" ), track.p (), track.tpcTofNSigmaPi ());
776+ registry.fill (HIST (" QAtracks/hTPCTOFnSigmaKa_GapC" ), track.p (), track.tpcTofNSigmaKa ());
777+ registry.fill (HIST (" QAtracks/hTPCTOFnSigmaPr_GapC" ), track.p (), track.tpcTofNSigmaPr ());
778+ registry.fill (HIST (" QAtracks/hTPCNCls_GapC" ), track.tpcNClsFound ());
779+ registry.fill (HIST (" QAtracks/hTPCChi2_GapC" ), track.tpcChi2NCl ());
780+ registry.fill (HIST (" QAtracks/hITSNCls_GapC" ), track.itsNCls ());
781+ registry.fill (HIST (" QAtracks/hDCAxy_GapC" ), track.dcaXY ());
782+ registry.fill (HIST (" QAtracks/hDCAz_GapC" ), track.dcaZ ());
783+ }
784+ }
785+ }
786+
682787 for (const auto & candidate : groupedD0Candidates) {
683788 if (yCandRecoMax >= 0 . && std::abs (HfHelper::yD0 (candidate)) > yCandRecoMax) {
684789 continue ;
0 commit comments