5151#include < Framework/O2DatabasePDGPlugin.h>
5252#include < Framework/WorkflowSpec.h>
5353#include < Framework/runDataProcessing.h>
54+ #include " Framework/RunningWorkflowInfo.h"
5455#include < ReconstructionDataFormats/DCA.h>
5556#include < ReconstructionDataFormats/Track.h>
5657
@@ -123,6 +124,7 @@ struct HfDataCreatorJpsiHadReduced {
123124 Produces<aod::HfCfgBpToJpsi> rowCandidateConfigBplus;
124125 Produces<aod::HfCfgBsToJpsis> rowCandidateConfigBs;
125126
127+ Configurable<bool > skipRejectedCollisions{" skipRejectedCollisions" , true , " skips collisions rejected by the event selection, instead of flagging only" };
126128 Configurable<bool > propagateToPCA{" propagateToPCA" , true , " create tracks version propagated to PCA" };
127129 Configurable<bool > useAbsDCA{" useAbsDCA" , false , " Minimise abs. distance rather than chi2" };
128130 Configurable<bool > useWeightedFinalPCA{" useWeightedFinalPCA" , false , " Recalculate vertex position using track covariances, effective only if useAbsDCA is true" };
@@ -163,10 +165,12 @@ struct HfDataCreatorJpsiHadReduced {
163165 using TracksSel = soa::Join<aod::TracksWDcaExtra, aod::TracksPidPi, aod::PidTpcTofFullPi, aod::TracksPidKa, aod::PidTpcTofFullKa>;
164166 using TracksPidWithSelAndMc = soa::Join<TracksPidWithSel, aod::McTrackLabels>;
165167 using CollisionsWCMcLabels = soa::Join<aod::Collisions, aod::McCollisionLabels, aod::EvSels>;
168+ using BCsInfo = soa::Join<aod::BCsWithTimestamps, aod::BcSels>;
166169
167170 Preslice<aod::HfCand2ProngWPid> candsJpsiPerCollision = aod::track_association::collisionId;
168171 Preslice<aod::TrackAssoc> trackIndicesPerCollision = aod::track_association::collisionId;
169172 PresliceUnsorted<CollisionsWCMcLabels> colPerMcCollision = aod::mccollisionlabel::mcCollisionId;
173+ Preslice<aod::McParticles> mcParticlesPerMcCollision = aod::mcparticle::mcCollisionId;
170174
171175 o2::base::Propagator::MatCorrType noMatCorr = o2::base::Propagator::MatCorrType::USEMatCorrNONE;
172176 int runNumber;
@@ -175,13 +179,15 @@ struct HfDataCreatorJpsiHadReduced {
175179 bool isHfCandBhadConfigFilled = false ;
176180
177181 o2::hf_evsel::HfEventSelection hfEvSel;
182+ o2::hf_evsel::HfEventSelectionMc hfEvSelMc;
183+
178184 o2::vertexing::DCAFitterN<2 > df2;
179185 o2::vertexing::DCAFitterN<3 > df3;
180186 o2::vertexing::DCAFitterN<4 > df4;
181187
182188 HistogramRegistry registry{" registry" };
183189
184- void init (InitContext const & )
190+ void init (InitContext& initContext )
185191 {
186192 std::array<int , 4 > doProcess = {doprocessJpsiKData, doprocessJpsiKMc, doprocessJpsiPhiData, doprocessJpsiPhiMc};
187193 if (std::accumulate (doProcess.begin (), doProcess.end (), 0 ) != 1 ) {
@@ -271,6 +277,19 @@ struct HfDataCreatorJpsiHadReduced {
271277 invMass2JpsiHadMin = (MassBS - invMassWindowJpsiHad) * (MassBS - invMassWindowJpsiHad);
272278 invMass2JpsiHadMax = (MassBS + invMassWindowJpsiHad) * (MassBS + invMassWindowJpsiHad);
273279 }
280+
281+ // init HF event selection helper
282+ hfEvSel.init (registry);
283+ if (doprocessJpsiKMc || doprocessJpsiPhiMc) {
284+ const auto & workflows = initContext.services ().get <RunningWorkflowInfo const >();
285+ for (const DeviceSpec& device : workflows.devices ) {
286+ if (device.name .compare (" hf-data-creator-jpsi-had-reduced" ) == 0 ) {
287+ // init HF event selection helper
288+ hfEvSelMc.init (device, registry);
289+ break ;
290+ }
291+ }
292+ }
274293 }
275294
276295 // / Topological cuts
@@ -513,10 +532,23 @@ struct HfDataCreatorJpsiHadReduced {
513532 }
514533
515534 template <uint8_t decChannel>
516- void runMcGen (aod::McParticles const & particlesMc)
535+ void runMcGen (aod::McCollision const & mcCollision,
536+ aod::McParticles const & particlesMc,
537+ CollisionsWCMcLabels const & collisions,
538+ BCsInfo const &)
517539 {
540+ // Check event selection
541+ float centDummy{-1 .f }, centFT0C{-1 .f }, centFT0M{-1 .f };
542+ const auto collSlice = collisions.sliceBy (colPerMcCollision, mcCollision.globalIndex ());
543+ auto hfRejMap = hfEvSelMc.getHfMcCollisionRejectionMask <BCsInfo, o2::hf_centrality::CentralityEstimator::None>(mcCollision, collSlice, centDummy);
544+ if (skipRejectedCollisions && hfRejMap!= 0 ) {
545+ return ;
546+ }
547+
548+ const auto mcParticlesPerMcColl = particlesMc.sliceBy (mcParticlesPerMcCollision, mcCollision.globalIndex ());
549+
518550 // Match generated particles.
519- for (const auto & particle : particlesMc ) {
551+ for (const auto & particle : mcParticlesPerMcColl ) {
520552 int8_t sign{0 }, flag{0 }, channel{0 };
521553 if constexpr (decChannel == DecayChannel::BplusToJpsiK) {
522554 // B+ → J/Psi K+ → (µ+µ-) K+
@@ -557,7 +589,7 @@ struct HfDataCreatorJpsiHadReduced {
557589 }
558590 rowHfBpMcGenReduced (flag, channel, ptParticle, yParticle, etaParticle,
559591 ptProngs[0 ], yProngs[0 ], etaProngs[0 ],
560- ptProngs[1 ], yProngs[1 ], etaProngs[1 ]);
592+ ptProngs[1 ], yProngs[1 ], etaProngs[1 ], hfRejMap, centFT0C, centFT0M );
561593 } else if constexpr (decChannel == DecayChannel::BsToJpsiPhi) {
562594 // Bs → J/Psi phi → (µ+µ-) (K+K-)
563595 if (RecoDecay::isMatchedMCGen<true >(particlesMc, particle, Pdg::kBS , std::array{static_cast <int >(Pdg::kJPsi ), +kKPlus , -kKPlus }, true , &sign, 2 )) {
@@ -597,22 +629,29 @@ struct HfDataCreatorJpsiHadReduced {
597629 }
598630 rowHfBsMcGenReduced (flag, channel, ptParticle, yParticle, etaParticle,
599631 ptProngs[0 ], yProngs[0 ], etaProngs[0 ],
600- ptProngs[1 ], yProngs[1 ], etaProngs[1 ]);
632+ ptProngs[1 ], yProngs[1 ], etaProngs[1 ], hfRejMap, centFT0C, centFT0M );
601633 }
602634 } // gen
603635 }
604636
605637 // Jpsi candidate selection
606- template <bool doMc, uint8_t decChannel, typename Coll, typename JpsiCands, typename TTracks, typename PParticles>
638+ template <bool doMc, uint8_t decChannel, typename Coll, typename JpsiCands, typename TTracks, typename PParticles, typename BBCs >
607639 void runDataCreation (Coll const & collision,
608640 JpsiCands const & candsJpsi,
609641 aod::TrackAssoc const & trackIndices,
610642 TTracks const &,
611643 PParticles const & particlesMc,
612644 uint64_t const & indexCollisionMaxNumContrib,
613- aod::BCsWithTimestamps const &)
645+ BBCs const &)
614646 {
615647
648+ registry.fill (HIST (" hEvents" ), 1 + Event::Processed);
649+ float centrality = -1 .f ;
650+ auto hfRejMap = hfEvSel.getHfCollisionRejectionMask <true , o2::hf_centrality::CentralityEstimator::None, aod::BCsWithTimestamps>(collision, centrality, ccdb, registry);
651+ if (skipRejectedCollisions && hfRejMap != 0 ) {
652+ return ;
653+ }
654+
616655 // helpers for ReducedTables filling
617656 int indexHfReducedCollision = hfReducedCollision.lastIndex () + 1 ;
618657 // std::map where the key is the track.globalIndex() and
@@ -960,14 +999,11 @@ struct HfDataCreatorJpsiHadReduced {
960999 }
9611000 } // candsJpsi loop
9621001
963- registry.fill (HIST (" hEvents" ), 1 + Event::Processed);
9641002 if (!fillHfReducedCollision) {
9651003 registry.fill (HIST (" hEvents" ), 1 + Event::NoCharmHadPiSelected);
9661004 return ;
9671005 }
9681006 registry.fill (HIST (" hEvents" ), 1 + Event::CharmHadPiSelected);
969- float centrality = -1 .f ;
970- uint16_t hfRejMap = hfEvSel.getHfCollisionRejectionMask <true , o2::hf_centrality::CentralityEstimator::None, aod::BCsWithTimestamps>(collision, centrality, ccdb, registry);
9711007 // fill collision table if it contains a J/Psi K pair at minimum
9721008 hfReducedCollision (collision.posX (), collision.posY (), collision.posZ (), collision.numContrib (), hfRejMap, bz);
9731009 hfReducedCollExtra (collision.covXX (), collision.covXY (), collision.covYY (),
@@ -1048,8 +1084,8 @@ struct HfDataCreatorJpsiHadReduced {
10481084 aod::TrackAssoc const & trackIndices,
10491085 TracksPidWithSelAndMc const & tracks,
10501086 aod::McParticles const & particlesMc,
1051- aod::BCsWithTimestamps const & bcs,
1052- McCollisions const &)
1087+ BCsInfo const & bcs,
1088+ McCollisions const & mcCollisions )
10531089 {
10541090 // store configurables needed for B+ workflow
10551091 if (!isHfCandBhadConfigFilled) {
@@ -1074,7 +1110,9 @@ struct HfDataCreatorJpsiHadReduced {
10741110 }
10751111 // handle normalization by the right number of collisions
10761112 hfCollisionCounter (collisions.tableSize (), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl);
1077- runMcGen<DecayChannel::BplusToJpsiK>(particlesMc);
1113+ for (const auto & mcCollision: mcCollisions) {
1114+ runMcGen<DecayChannel::BplusToJpsiK>(mcCollision, particlesMc, collisions, bcs);
1115+ }
10781116 }
10791117 PROCESS_SWITCH (HfDataCreatorJpsiHadReduced, processJpsiKMc, " Process J/Psi K with MC info" , false );
10801118
@@ -1083,8 +1121,8 @@ struct HfDataCreatorJpsiHadReduced {
10831121 aod::TrackAssoc const & trackIndices,
10841122 TracksPidWithSelAndMc const & tracks,
10851123 aod::McParticles const & particlesMc,
1086- aod::BCsWithTimestamps const & bcs,
1087- McCollisions const &)
1124+ BCsInfo const & bcs,
1125+ McCollisions const & mcCollisions )
10881126 {
10891127 // store configurables needed for B+ workflow
10901128 if (!isHfCandBhadConfigFilled) {
@@ -1109,7 +1147,9 @@ struct HfDataCreatorJpsiHadReduced {
11091147 }
11101148 // handle normalization by the right number of collisions
11111149 hfCollisionCounter (collisions.tableSize (), zvtxColl, sel8Coll, zvtxAndSel8Coll, zvtxAndSel8CollAndSoftTrig, allSelColl);
1112- runMcGen<DecayChannel::BsToJpsiPhi>(particlesMc);
1150+ for (const auto & mcCollision: mcCollisions) {
1151+ runMcGen<DecayChannel::BsToJpsiPhi>(mcCollision, particlesMc, collisions, bcs);
1152+ }
11131153 }
11141154 PROCESS_SWITCH (HfDataCreatorJpsiHadReduced, processJpsiPhiMc, " Process J/Psi phi with MC info" , false );
11151155};
0 commit comments