2424#include " Framework/runDataProcessing.h"
2525#include " Framework/StaticFor.h"
2626
27+ #include " CCDB/BasicCCDBManager.h"
2728#include " Common/DataModel/CollisionAssociationTables.h"
2829
2930#include " PWGHF/DataModel/CandidateReconstructionTables.h"
3031#include " PWGHF/DataModel/CandidateSelectionTables.h"
32+ #include " PWGHF/Utils/utilsEvSelHf.h"
3133
3234using namespace o2 ;
3335using namespace o2 ::analysis;
3436using namespace o2 ::aod;
3537using namespace o2 ::framework;
3638using namespace o2 ::framework::expressions;
39+ using namespace o2 ::hf_evsel;
3740
3841namespace
3942{
@@ -393,12 +396,15 @@ struct HfTaskMcValidationRec {
393396
394397 using HfCand2ProngWithMCRec = soa::Join<aod::HfCand2Prong, aod::HfCand2ProngMcRec>;
395398 using HfCand3ProngWithMCRec = soa::Join<aod::HfCand3Prong, aod::HfCand3ProngMcRec>;
396- using CollisionsWithMCLabels = soa::Join<aod::Collisions, aod::McCollisionLabels , aod::HfSelCollision >;
399+ using CollisionsWithMCLabels = soa::Join<aod::Collisions, aod::EvSels , aod::McCollisionLabels >;
397400 using TracksWithSel = soa::Join<aod::TracksWMc, aod::TracksExtra, aod::TrackSelection, aod::TrackCompColls>;
398401
399402 Partition<TracksWithSel> tracksFilteredGlobalTrackWoDCA = requireGlobalTrackWoDCAInFilter();
400403 Partition<TracksWithSel> tracksInAcc = requireTrackCutInFilter(TrackSelectionFlags::kInAcceptanceTracks );
401404
405+ Service<o2::ccdb::BasicCCDBManager> ccdb;
406+ HfEventSelection hfEvSel; // event selection and monitoring
407+
402408 AxisSpec axisDeltaMom{2000 , -1 ., 1 .};
403409 AxisSpec axisOrigin{4 , -1.5 , 2.5 };
404410 AxisSpec axisEta{40 , -1 ., 1 .};
@@ -478,6 +484,16 @@ struct HfTaskMcValidationRec {
478484
479485 void init (InitContext&)
480486 {
487+ std::array<bool , 3 > procCollisions = {doprocessColl, doprocessCollWithCentFTOC, doprocessCollWithCentFTOM};
488+ if (std::accumulate (procCollisions.begin (), procCollisions.end (), 0 ) > 1 ) {
489+ LOGP (fatal, " At most one process function for collision study can be enabled at a time." );
490+ }
491+
492+ std::array<bool , 3 > procCollAccoc = {doprocessCollAssoc, doprocessCollAssocWithCentFTOC, doprocessCollAssocWithCentFTOM};
493+ if (std::accumulate (procCollAccoc.begin (), procCollAccoc.end (), 0 ) > 1 ) {
494+ LOGP (fatal, " At most one process for collision association study function can be enabled at a time." );
495+ }
496+
481497 histOriginTracks[0 ] = registry.add <THnSparse>(" TrackToCollChecks/histOriginNonAssociatedTracks" , " ;origin;#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm); is PV contributor; has TOF; number of ITS hits" , HistType::kTHnSparseF , {axisOrigin, axisPt, axisEta, axisDeltaVtx, axisDecision, axisDecision, axisITShits}); // tracks not associated to any collision
482498 histOriginTracks[1 ] = registry.add <THnSparse>(" TrackToCollChecks/histOriginAssociatedTracks" , " ;origin;#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm); is PV contributor; has TOF; number of ITS hits" , HistType::kTHnSparseF , {axisOrigin, axisPt, axisEta, axisDeltaVtx, axisDecision, axisDecision, axisITShits}); // tracks associasted to a collision
483499 histOriginTracks[2 ] = registry.add <THnSparse>(" TrackToCollChecks/histOriginGoodAssociatedTracks" , " ;origin;#it{p}_{T}^{reco} (GeV/#it{c});#it{#eta}^{reco};#it{Z}_{vtx}^{reco}#minus#it{Z}_{vtx}^{gen} (cm); is PV contributor; has TOF; number of ITS hits" , HistType::kTHnSparseF , {axisOrigin, axisPt, axisEta, axisDeltaVtx, axisDecision, axisDecision, axisITShits}); // tracks associated to the correct collision considering only first reco collision (based on the MC collision index)
@@ -519,19 +535,31 @@ struct HfTaskMcValidationRec {
519535 histContributors = registry.add <TH1>(" TrackToCollChecks/histContributors" , " PV contributors from correct/wrong MC collision;;entries" , HistType::kTH1F , {axisDecision});
520536 histContributors->GetXaxis ()->SetBinLabel (1 , " correct MC collision" );
521537 histContributors->GetXaxis ()->SetBinLabel (2 , " wrong MC collision" );
538+ hfEvSel.addHistograms (registry); // collision monitoring
539+
540+ ccdb->setURL (" http://alice-ccdb.cern.ch" );
541+ ccdb->setCaching (true );
542+ ccdb->setLocalObjectValidityChecking ();
522543 }
523544
524- void process (CollisionsWithMCLabels::iterator const & collision,
525- aod::McCollisions const &)
545+ template <o2::hf_centrality::CentralityEstimator centEstimator, typename Coll>
546+ void checkCollisions (Coll const & collision,
547+ aod::McCollisions const &,
548+ aod::BCsWithTimestamps const &)
526549 {
527- // check that collision is selected by hf-track-index-skim-creator-tag-sel-collisions
528- if (collision.whyRejectColl () != 0 ) {
550+ // apply event selection
551+ if (! collision.has_mcCollision () ) {
529552 return ;
530553 }
531- if (!collision.has_mcCollision ()) {
554+
555+ float centrality{-1 .f };
556+ const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask <true , centEstimator, aod::BCsWithTimestamps>(collision, centrality, ccdb);
557+ if (rejectionMask != 0 ) {
558+ // / at least one event selection not satisfied --> reject the candidate
532559 return ;
533560 }
534- auto mcCollision = collision.mcCollision_as <aod::McCollisions>();
561+
562+ auto mcCollision = collision.template mcCollision_as <aod::McCollisions>();
535563 if (eventGeneratorType >= 0 && mcCollision.getSubGeneratorId () != eventGeneratorType) {
536564 return ;
537565 }
@@ -540,24 +568,30 @@ struct HfTaskMcValidationRec {
540568 registry.fill (HIST (" histYvtxReco" ), collision.posY ());
541569 registry.fill (HIST (" histZvtxReco" ), collision.posZ ());
542570 registry.fill (HIST (" histDeltaZvtx" ), collision.numContrib (), collision.posZ () - mcCollision.posZ ());
543- } // end process
571+ }
544572
545- void processCollAssoc (CollisionsWithMCLabels const & collisions,
546- TracksWithSel const &,
547- aod::McParticles const & mcParticles,
548- aod::McCollisions const &,
549- aod::BCs const &)
573+ template <o2::hf_centrality::CentralityEstimator centEstimator, typename Colls>
574+ void checkCollisionAssociation (Colls const & collisions,
575+ TracksWithSel const &,
576+ aod::McParticles const & mcParticles,
577+ aod::McCollisions const &,
578+ aod::BCsWithTimestamps const &)
550579 {
551580 // loop over collisions
552- for (auto collision = collisions. begin (); collision != collisions. end (); ++collision ) {
581+ for (const auto & collision : collisions) {
553582 // check that collision is selected by hf-track-index-skim-creator-tag-sel-collisions
554- if (collision.whyRejectColl () != 0 ) {
583+
584+ float centrality{-1 .f };
585+ const auto rejectionMask = hfEvSel.getHfCollisionRejectionMask <true , centEstimator, aod::BCsWithTimestamps>(collision, centrality, ccdb);
586+ if (rejectionMask != 0 ) {
587+ // / at least one event selection not satisfied --> reject the candidate
555588 continue ;
556589 }
590+
557591 if (!collision.has_mcCollision ()) {
558592 continue ;
559593 }
560- auto mcCollision = collision.mcCollision_as <aod::McCollisions>();
594+ auto mcCollision = collision.template mcCollision_as <aod::McCollisions>();
561595 if (eventGeneratorType >= 0 && mcCollision.getSubGeneratorId () != eventGeneratorType) {
562596 continue ;
563597 }
@@ -678,8 +712,61 @@ struct HfTaskMcValidationRec {
678712 }
679713 }
680714 }
715+
716+ void processColl (CollisionsWithMCLabels::iterator const & collision,
717+ aod::McCollisions const & mcCollisions,
718+ aod::BCsWithTimestamps const & bcs)
719+ {
720+ checkCollisions<o2::hf_centrality::CentralityEstimator::None>(collision, mcCollisions, bcs);
721+ } // end process
722+ PROCESS_SWITCH (HfTaskMcValidationRec, processColl, " Process collision information without centrality selection" , true );
723+
724+ void processCollWithCentFTOC (soa::Join<CollisionsWithMCLabels, aod::CentFT0Cs>::iterator const & collision,
725+ aod::McCollisions const & mcCollisions,
726+ aod::BCsWithTimestamps const & bcs)
727+ {
728+ checkCollisions<o2::hf_centrality::CentralityEstimator::FT0C>(collision, mcCollisions, bcs);
729+ } // end process
730+ PROCESS_SWITCH (HfTaskMcValidationRec, processCollWithCentFTOC, " Process collision information with centrality selection with FT0C" , false );
731+
732+ void processCollWithCentFTOM (soa::Join<CollisionsWithMCLabels, aod::CentFT0Ms>::iterator const & collision,
733+ aod::McCollisions const & mcCollisions,
734+ aod::BCsWithTimestamps const & bcs)
735+ {
736+ checkCollisions<o2::hf_centrality::CentralityEstimator::FT0M>(collision, mcCollisions, bcs);
737+ } // end process
738+ PROCESS_SWITCH (HfTaskMcValidationRec, processCollWithCentFTOM, " Process collision information with centrality selection with FT0M" , false );
739+
740+ void processCollAssoc (CollisionsWithMCLabels const & collisions,
741+ TracksWithSel const & tracks,
742+ aod::McParticles const & mcParticles,
743+ aod::McCollisions const & mcCollisions,
744+ aod::BCsWithTimestamps const & bcs)
745+ {
746+ checkCollisionAssociation<o2::hf_centrality::CentralityEstimator::None>(collisions, tracks, mcParticles, mcCollisions, bcs);
747+ }
681748 PROCESS_SWITCH (HfTaskMcValidationRec, processCollAssoc, " Process collision-association information, requires extra table from TrackToCollisionAssociation task (fillTableOfCollIdsPerTrack=true)" , false );
682749
750+ void processCollAssocWithCentFTOC (soa::Join<CollisionsWithMCLabels, aod::CentFT0Cs> const & collisions,
751+ TracksWithSel const & tracks,
752+ aod::McParticles const & mcParticles,
753+ aod::McCollisions const & mcCollisions,
754+ aod::BCsWithTimestamps const & bcs)
755+ {
756+ checkCollisionAssociation<o2::hf_centrality::CentralityEstimator::FT0C>(collisions, tracks, mcParticles, mcCollisions, bcs);
757+ }
758+ PROCESS_SWITCH (HfTaskMcValidationRec, processCollAssocWithCentFTOC, " Process collision-association information with centrality selection with FT0C, requires extra table from TrackToCollisionAssociation task (fillTableOfCollIdsPerTrack=true)" , false );
759+
760+ void processCollAssocWithCentFTOM (soa::Join<CollisionsWithMCLabels, aod::CentFT0Ms> const & collisions,
761+ TracksWithSel const & tracks,
762+ aod::McParticles const & mcParticles,
763+ aod::McCollisions const & mcCollisions,
764+ aod::BCsWithTimestamps const & bcs)
765+ {
766+ checkCollisionAssociation<o2::hf_centrality::CentralityEstimator::FT0M>(collisions, tracks, mcParticles, mcCollisions, bcs);
767+ }
768+ PROCESS_SWITCH (HfTaskMcValidationRec, processCollAssocWithCentFTOM, " Process collision-association information with centrality selection with FT0M, requires extra table from TrackToCollisionAssociation task (fillTableOfCollIdsPerTrack=true)" , false );
769+
683770 void processEff (HfCand2ProngWithMCRec const & cand2Prongs,
684771 HfCand3ProngWithMCRec const & cand3Prongs,
685772 aod::TracksWMc const &,
0 commit comments