@@ -96,7 +96,7 @@ struct perfK0sResolution {
9696
9797 void init (InitContext const &)
9898 {
99- const AxisSpec eventAxis{ 10 , 0 , 10 , " Events " };
99+ const AxisSpec statAxis{ 5 , 0 , 5 , " Stats " };
100100 const AxisSpec mAxis {mBins , " #it{m} (GeV/#it{c}^{2})" };
101101 const AxisSpec pTAxis{pTBins, " #it{p}_{T} (GeV/#it{c})" };
102102 const AxisSpec pTResAxis{pTResBins, " #Delta#it{p}_{T} (GeV/#it{c})" };
@@ -109,17 +109,12 @@ struct perfK0sResolution {
109109 const AxisSpec phiAxis{phiBins, " #phi" };
110110 const AxisSpec trueK0Axis{2 , -0.5 , 1.5 , " True K0" };
111111
112- int nProc = 0 ;
113- if (doprocessData) {
114- LOG (info) << " processData enabled" ;
115- nProc++;
116- }
117- if (doprocessMC) {
118- LOG (info) << " processMC enabled" ;
119- nProc++;
112+ rK0sResolution.add (" h1_stats" , " h1_stats" , {HistType::kTH1F , {statAxis}});
113+ TString hStatsLabels[5 ] = {" Selected Events" , " All V0s" , " Selected V0s" , " Daughters have MC particles" , " Daughters corr. rec." };
114+ for (Int_t n = 1 ; n <= rK0sResolution.get <TH1 >(HIST (" h1_stats" ))->GetNbinsX (); n++) {
115+ rK0sResolution.get <TH1 >(HIST (" h1_stats" ))->GetXaxis ()->SetBinLabel (n, hStatsLabels[n - 1 ]);
120116 }
121117
122- rK0sResolution.add (" h1_events" , " h1_events" , {HistType::kTH1F , {eventAxis}});
123118 if (doprocessMC) {
124119 rK0sDauResolution.add (" h2_massPosPtRes" , " h2_massPosPtRes" , {HistType::kTH2F , {mAxis , pTResAxis}});
125120 rK0sDauResolution.add (" h2_massNegPtRes" , " h2_massNegPtRes" , {HistType::kTH2F , {mAxis , pTResAxis}});
@@ -152,13 +147,12 @@ struct perfK0sResolution {
152147 rK0sDauResolution.add (" h3_tpc_vs_pid_hypothesis" , " h3_tpc_vs_pid_hypothesis" , {HistType::kTH3F , {{200 , -10 .f , 10 .f , " #it{p}/Z (GeV/#it{c})" }, {1000 , 0 , 1000 .f , " dE/dx (a.u.)" }, {10 , -0.5 , 9 .5f , " PID hypothesis" }}});
153148 }
154149
155- ccdb->setURL (ccdburl);
156- ccdb->setCaching (true );
157- ccdb->setLocalObjectValidityChecking ();
158- ccdb->setFatalWhenNull (false );
159-
160150 // / TrackTuner initialization
161151 if (useTrackTuner) {
152+ ccdb->setURL (ccdburl);
153+ ccdb->setCaching (true );
154+ ccdb->setLocalObjectValidityChecking ();
155+ ccdb->setFatalWhenNull (false );
162156 lut = o2::base::MatLayerCylSet::rectifyPtrFromFile (ccdb->get <o2::base::MatLayerCylSet>(lutPath));
163157 std::string outputStringParams = trackTunerObj.configParams (trackTunerParams);
164158 trackTunerObj.getDcaGraphs ();
@@ -374,13 +368,14 @@ struct perfK0sResolution {
374368 soa::Filtered<aod::V0Datas> const & fullV0s,
375369 PIDTracks const &)
376370 {
377- rK0sResolution.fill (HIST (" h1_events " ), 0.5 );
371+ rK0sResolution.fill (HIST (" h1_stats " ), 0.5 );
378372 for (auto & v0 : fullV0s) {
379- rK0sResolution.fill (HIST (" h1_events " ), 1.5 );
373+ rK0sResolution.fill (HIST (" h1_stats " ), 1.5 );
380374 const auto & posTrack = v0.posTrack_as <PIDTracks>();
381375 const auto & negTrack = v0.negTrack_as <PIDTracks>();
382376 if (!acceptV0 (v0, negTrack, posTrack, collision))
383377 continue ;
378+ rK0sResolution.fill (HIST (" h1_stats" ), 2.5 );
384379
385380 float mass = v0.mK0Short ();
386381 if (computeInvMassFromDaughters) {
@@ -410,16 +405,15 @@ struct perfK0sResolution {
410405 o2::track::TrackParametrizationWithError<float > mTrackParCovPos ;
411406 o2::track::TrackParametrizationWithError<float > mTrackParCovNeg ;
412407
413- template <class TV0TracksTo , typename TV0 >
408+ template <typename TV0 , typename TV0Track >
414409 void tuneV0 (TV0 const & v0,
410+ TV0Track const & posTrack,
411+ TV0Track const & negTrack,
415412 aod::McParticles const &,
416413 aod::BCsWithTimestamps const & bcs)
417414 {
418415 initCCDB (bcs.begin ());
419416 trackTunedTracks->Fill (1 , 2 ); // tune 2 tracks
420-
421- const auto & posTrack = v0.template posTrack_as <TV0TracksTo>();
422- const auto & negTrack = v0.template negTrack_as <TV0TracksTo>();
423417 setTrackParCov (posTrack, mTrackParCovPos );
424418 setTrackParCov (negTrack, mTrackParCovNeg );
425419 mTrackParCovPos .setPID (posTrack.pidForTracking ());
@@ -440,30 +434,35 @@ struct perfK0sResolution {
440434 o2::base::Propagator::Instance ()->propagateToDCABxByBz (mVtx , mTrackParCovNeg , 2 .f , matCorr, &mDcaInfoCovNeg );
441435 }
442436
437+ bool daughtersHaveMCParticles = false ;
438+ bool daughtersCorrRec = false ;
439+
443440 void processMC (soa::Filtered<SelectedCollisions>::iterator const & collision,
444441 soa::Filtered<soa::Join<aod::V0Datas, aod::V0Covs, aod::V0DauCovs, aod::McV0Labels>> const & fullV0s,
445442 PIDTracksIUMC const &,
446443 aod::McParticles const & mcParticles,
447444 aod::BCsWithTimestamps const & bcs)
448445 {
449- rK0sResolution.fill (HIST (" h1_events " ), 0.5 );
446+ rK0sResolution.fill (HIST (" h1_stats " ), 0.5 );
450447 for (auto & v0 : fullV0s) {
451- rK0sResolution.fill (HIST (" h1_events " ), 1.5 );
448+ rK0sResolution.fill (HIST (" h1_stats " ), 1.5 );
452449 const auto & posTrack = v0.posTrack_as <PIDTracksIUMC>();
453450 const auto & negTrack = v0.negTrack_as <PIDTracksIUMC>();
454451 if (!acceptV0 (v0, negTrack, posTrack, collision))
455452 continue ;
456- if (!posTrack.has_mcParticle ()) {
457- continue ;
458- }
459- if (!negTrack.has_mcParticle ()) {
460- continue ;
461- }
462- if (posTrack.mcParticle ().pdgCode () != 211 || negTrack.mcParticle ().pdgCode () != -211 ) {
463- continue ;
453+ rK0sResolution.fill (HIST (" h1_stats" ), 2.5 );
454+
455+ if (posTrack.has_mcParticle () && negTrack.has_mcParticle ()) {
456+ daughtersHaveMCParticles = true ;
457+ rK0sResolution.fill (HIST (" h1_stats" ), 3.5 );
458+ if (posTrack.mcParticle ().pdgCode () == 211 && negTrack.mcParticle ().pdgCode () == -211 ) {
459+ daughtersCorrRec = true ;
460+ rK0sResolution.fill (HIST (" h1_stats" ), 4.5 );
461+ }
464462 }
465- if (useTrackTuner) {
466- tuneV0<PIDTracksIUMC>(v0, mcParticles, bcs);
463+
464+ if (useTrackTuner && daughtersHaveMCParticles) {
465+ tuneV0 (v0, posTrack, negTrack, mcParticles, bcs);
467466 }
468467
469468 float mass = v0.mK0Short ();
@@ -473,7 +472,7 @@ struct perfK0sResolution {
473472 std::array{negTrack.px (), negTrack.py (), negTrack.pz ()}},
474473 std::array{o2::constants::physics::MassPionCharged, o2::constants::physics::MassPionCharged});
475474 }
476- if (useTrackTuner) {
475+ if (useTrackTuner && daughtersHaveMCParticles ) {
477476 std::array<float , 3 > pPos{0 ., 0 ., 0 .};
478477 std::array<float , 3 > pNeg{0 ., 0 ., 0 .};
479478 mTrackParCovPos .getPxPyPzGlo (pPos);
@@ -487,33 +486,35 @@ struct perfK0sResolution {
487486 if (!isTrueK0s && requireTrueK0s) {
488487 continue ;
489488 }
490- rK0sDauResolution.fill (HIST (" h2_genPtPosPtRes" ), (v0.positivept () - posTrack.mcParticle ().pt ()) / posTrack.mcParticle ().pt (), posTrack.mcParticle ().pt ());
491- rK0sDauResolution.fill (HIST (" h2_genPxPosPxRes" ), (v0.pxpos () - posTrack.mcParticle ().px ()) / posTrack.mcParticle ().px (), posTrack.mcParticle ().px ());
492- rK0sDauResolution.fill (HIST (" h2_genPyPosPyRes" ), (v0.pypos () - posTrack.mcParticle ().py ()) / posTrack.mcParticle ().py (), posTrack.mcParticle ().py ());
493- rK0sDauResolution.fill (HIST (" h2_genPzPosPzRes" ), (v0.pzpos () - posTrack.mcParticle ().pz ()) / posTrack.mcParticle ().pz (), posTrack.mcParticle ().pz ());
494-
495- rK0sDauResolution.fill (HIST (" h2_genPtNegPtRes" ), (v0.negativept () - negTrack.mcParticle ().pt ()) / negTrack.mcParticle ().pt (), negTrack.mcParticle ().pt ());
496- rK0sDauResolution.fill (HIST (" h2_genPxNegPxRes" ), (v0.pxneg () - negTrack.mcParticle ().px ()) / negTrack.mcParticle ().px (), negTrack.mcParticle ().px ());
497- rK0sDauResolution.fill (HIST (" h2_genPyNegPyRes" ), (v0.pyneg () - negTrack.mcParticle ().py ()) / negTrack.mcParticle ().py (), negTrack.mcParticle ().py ());
498- rK0sDauResolution.fill (HIST (" h2_genPzNegPzRes" ), (v0.pzneg () - negTrack.mcParticle ().pz ()) / negTrack.mcParticle ().pz (), negTrack.mcParticle ().pz ());
499489
500- rK0sDauResolution.fill (HIST (" h2_massPosPtRes" ), mass, v0.positivept () - posTrack.mcParticle ().pt ());
501- rK0sDauResolution.fill (HIST (" h2_massNegPtRes" ), mass, v0.negativept () - negTrack.mcParticle ().pt ());
490+ // QA of correctly reconstructed V0 daughters
491+ if (daughtersCorrRec) {
492+ rK0sDauResolution.fill (HIST (" h2_genPtPosPtRes" ), (v0.positivept () - posTrack.mcParticle ().pt ()) / posTrack.mcParticle ().pt (), posTrack.mcParticle ().pt ());
493+ rK0sDauResolution.fill (HIST (" h2_genPxPosPxRes" ), (v0.pxpos () - posTrack.mcParticle ().px ()) / posTrack.mcParticle ().px (), posTrack.mcParticle ().px ());
494+ rK0sDauResolution.fill (HIST (" h2_genPyPosPyRes" ), (v0.pypos () - posTrack.mcParticle ().py ()) / posTrack.mcParticle ().py (), posTrack.mcParticle ().py ());
495+ rK0sDauResolution.fill (HIST (" h2_genPzPosPzRes" ), (v0.pzpos () - posTrack.mcParticle ().pz ()) / posTrack.mcParticle ().pz (), posTrack.mcParticle ().pz ());
496+
497+ rK0sDauResolution.fill (HIST (" h2_genPtNegPtRes" ), (v0.negativept () - negTrack.mcParticle ().pt ()) / negTrack.mcParticle ().pt (), negTrack.mcParticle ().pt ());
498+ rK0sDauResolution.fill (HIST (" h2_genPxNegPxRes" ), (v0.pxneg () - negTrack.mcParticle ().px ()) / negTrack.mcParticle ().px (), negTrack.mcParticle ().px ());
499+ rK0sDauResolution.fill (HIST (" h2_genPyNegPyRes" ), (v0.pyneg () - negTrack.mcParticle ().py ()) / negTrack.mcParticle ().py (), negTrack.mcParticle ().py ());
500+ rK0sDauResolution.fill (HIST (" h2_genPzNegPzRes" ), (v0.pzneg () - negTrack.mcParticle ().pz ()) / negTrack.mcParticle ().pz (), negTrack.mcParticle ().pz ());
501+
502+ rK0sDauResolution.fill (HIST (" h2_massPosPtRes" ), mass, v0.positivept () - posTrack.mcParticle ().pt ());
503+ rK0sDauResolution.fill (HIST (" h2_massNegPtRes" ), mass, v0.negativept () - negTrack.mcParticle ().pt ());
504+ if (useMultidimHisto) {
505+ rK0sResolution.fill (HIST (" thn_mass" ), mass, v0.pt (), v0.eta (), v0.phi (), posTrack.eta (), negTrack.eta (),
506+ 1 . / v0.positivept () - 1 . / posTrack.mcParticle ().pt (),
507+ 1 . / v0.negativept () - 1 . / negTrack.mcParticle ().pt (),
508+ isTrueK0s);
509+ }
510+ }
502511
512+ // QA of seleted V0s
503513 rK0sDauResolution.fill (HIST (" h2_PosRelPtRes" ), v0.positivept (), RecoDecay::sqrtSumOfSquares (v0.covMatPosDau ()[9 ], v0.covMatPosDau ()[14 ]), v0.positivept ());
504514 rK0sDauResolution.fill (HIST (" h2_NegRelPtRes" ), v0.negativept (), RecoDecay::sqrtSumOfSquares (v0.covMatNegDau ()[9 ], v0.covMatNegDau ()[14 ]), v0.positivept ());
505-
506- // Can be taken from kTHnSparseF (useMultidimHisto configurable)
507515 rK0sResolution.fill (HIST (" h2_masspT" ), mass, v0.pt ());
508516 rK0sResolution.fill (HIST (" h2_masseta" ), mass, v0.eta ());
509517 rK0sResolution.fill (HIST (" h2_massphi" ), mass, v0.phi ());
510-
511- if (useMultidimHisto) {
512- rK0sResolution.fill (HIST (" thn_mass" ), mass, v0.pt (), v0.eta (), v0.phi (), posTrack.eta (), negTrack.eta (),
513- 1 . / v0.positivept () - 1 . / posTrack.mcParticle ().pt (),
514- 1 . / v0.negativept () - 1 . / negTrack.mcParticle ().pt (),
515- isTrueK0s);
516- }
517518 }
518519 }
519520 PROCESS_SWITCH (perfK0sResolution, processMC, " Process MC" , false );
0 commit comments