@@ -202,6 +202,28 @@ constexpr std::array<double, 3> kHePidTrkPParamsHeDefault = {0., 0., 0.};
202202
203203} // namespace
204204
205+ struct CollisionInfo {
206+ int64_t collisionID = -1 ;
207+ uint32_t selectionFlags = 0 ;
208+ float posZ = -999 .f;
209+ int numContributors = -1 ;
210+ float centFT0C = -999 .f;
211+ int multFT0C = -1 ;
212+ float occupancy = -999 .f;
213+
214+ template <typename Collision>
215+ void fillFromCollision (const Collision& collision, uint32_t collisionSelectionFlag)
216+ {
217+ collisionID = collision.globalIndex ();
218+ selectionFlags = collisionSelectionFlag;
219+ posZ = collision.posZ ();
220+ numContributors = collision.numContrib ();
221+ centFT0C = collision.centFT0C ();
222+ multFT0C = collision.multFT0C ();
223+ occupancy = collision.trackOccupancyInTimeRange ();
224+ }
225+ };
226+
205227struct He3HadCandidate {
206228
207229 [[nodiscard]] float recoPtHe3 () const { return signHe3 * std::hypot (momHe3[0 ], momHe3[1 ]); }
@@ -378,6 +400,8 @@ struct he3HadronFemto {
378400 o2::aod::ITSResponse mResponseITS ;
379401
380402 std::vector<bool > mGoodCollisions ;
403+ std::vector<bool > mRecoMcCollisions ;
404+ std::vector<int > mMcCollisionIdToRecoCollisionId ;
381405 std::vector<uint32_t > mCollisionSelectionFlags ;
382406 std::vector<SVCand> mTrackPairs ;
383407 o2::vertexing::DCAFitterN<2 > mFitter ;
@@ -603,20 +627,32 @@ struct he3HadronFemto {
603627 bool selectCollision (const Tcollision& collision, const aod::BCsWithTimestamps&, uint32_t & collisionSelectionFlag)
604628 {
605629 mQaRegistry .fill (HIST (" hEvents" ), 0 );
630+ if constexpr (isMC) {
631+ if (collision.has_mcCollision ()) {
632+ mMcCollisionIdToRecoCollisionId [collision.mcCollisionId ()] = collision.globalIndex ();
633+ }
634+ }
606635
607636 auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
608637 initCCDB (bc);
609638
610639 if (!nuclei::eventSelection (collision, mQaRegistry , settingEventSelections, cutSettings.settingCutVertex , collisionSelectionFlag)) {
611640 return false ;
612641 }
642+
613643 if (settingSkimmedProcessing) {
614644 bool zorroSelected = mZorro .isSelected (collision.template bc_as <aod::BCsWithTimestamps>().globalBC ());
615645 if (zorroSelected) {
616646 mQaRegistry .fill (HIST (" hEvents" ), 2 );
617647 }
618648 }
619649
650+ if constexpr (isMC) {
651+ if (collision.has_mcCollision ()) {
652+ mRecoMcCollisions [collision.mcCollisionId ()] = true ;
653+ }
654+ }
655+
620656 mQaRegistry .fill (HIST (" hEvents" ), 1 );
621657 mQaRegistry .fill (HIST (" hNcontributor" ), collision.numContrib ());
622658 mQaRegistry .fill (HIST (" hCentralityFT0A" ), collision.centFT0A ());
@@ -1048,10 +1084,8 @@ struct he3HadronFemto {
10481084 }
10491085 }
10501086
1051- template <typename Tcoll>
1052- void fillTable (const He3HadCandidate& he3Hadcand, const Tcoll& collision, bool isMC = false )
1087+ void fillTable (const He3HadCandidate& he3Hadcand, const CollisionInfo& collisionInfo, bool isMC = false )
10531088 {
1054- const uint32_t collisionSelectionFlag = mCollisionSelectionFlags [he3Hadcand.collisionID ];
10551089 outputDataTable (
10561090 he3Hadcand.recoPtHe3 (), he3Hadcand.recoEtaHe3 (), he3Hadcand.recoPhiHe3 (),
10571091 he3Hadcand.recoPtHad (), he3Hadcand.recoEtaHad (), he3Hadcand.recoPhiHad (),
@@ -1072,9 +1106,9 @@ struct he3HadronFemto {
10721106 he3Hadcand.l4PtMC , he3Hadcand.l4MassMC , he3Hadcand.flags );
10731107 }
10741108 outputMultiplicityTable (
1075- collision. globalIndex (), collisionSelectionFlag, collision .posZ () ,
1076- collision. numContrib (), collision .centFT0C (), collision .multFT0C (),
1077- collision. trackOccupancyInTimeRange () );
1109+ collisionInfo. collisionID , collisionInfo. selectionFlags , collisionInfo .posZ ,
1110+ collisionInfo. numContributors , collisionInfo .centFT0C , collisionInfo .multFT0C ,
1111+ collisionInfo. occupancy );
10781112 outputQaTable (
10791113 he3Hadcand.trackIDHe3 , he3Hadcand.trackIDHad , he3Hadcand.massTOFHe3 ,
10801114 he3Hadcand.pidtrkHad , he3Hadcand.sharedClustersHad );
@@ -1125,7 +1159,9 @@ struct he3HadronFemto {
11251159 }
11261160 fillHistograms (he3Hadcand);
11271161 auto collision = collisions.rawIteratorAt (he3Hadcand.collisionID );
1128- fillTable (he3Hadcand, collision, /* isMC*/ false );
1162+ CollisionInfo collisionInfo;
1163+ collisionInfo.fillFromCollision (collision, mCollisionSelectionFlags [he3Hadcand.collisionID ]);
1164+ fillTable (he3Hadcand, collisionInfo, /* isMC*/ false );
11291165 }
11301166 }
11311167
@@ -1219,8 +1255,15 @@ struct he3HadronFemto {
12191255 He3HadCandidate he3Hadcand;
12201256 fillCandidateInfoMC (mcHe3, mcHad, he3Hadcand);
12211257 fillMotherInfoMC (mcHe3, mcHad, mcParticle, he3Hadcand);
1222- auto collision = collisions.rawIteratorAt (he3Hadcand.collisionID );
1223- fillTable (he3Hadcand, collision, /* isMC*/ true );
1258+
1259+ const auto mcCollisionId = mcParticle.mcCollisionId ();
1260+ const auto collisionId = mMcCollisionIdToRecoCollisionId [mcCollisionId];
1261+ CollisionInfo collisionInfo;
1262+ if (collisionId >= 0 ) {
1263+ auto collision = collisions.rawIteratorAt (collisionId);
1264+ collisionInfo.fillFromCollision (collision, mCollisionSelectionFlags [collisionId]);
1265+ }
1266+ fillTable (he3Hadcand, collisionInfo, /* isMC*/ true );
12241267 }
12251268 }
12261269 }
@@ -1287,12 +1330,16 @@ struct he3HadronFemto {
12871330 }
12881331 PROCESS_SWITCH (he3HadronFemto, processMixedEvent, " Process Mixed event" , false );
12891332
1290- void processMC (const CollisionsFullMC& collisions, const aod::BCsWithTimestamps& bcs, const TrackCandidatesMC& tracks, const aod::McParticles& mcParticles)
1333+ void processMC (const CollisionsFullMC& collisions, const aod::McCollisions& mcCollisions, const aod:: BCsWithTimestamps& bcs, const TrackCandidatesMC& tracks, const aod::McParticles& mcParticles)
12911334 {
12921335 std::vector<unsigned int > filledMothers;
12931336
12941337 mGoodCollisions .clear ();
12951338 mGoodCollisions .resize (collisions.size (), false );
1339+ mRecoMcCollisions .clear ();
1340+ mRecoMcCollisions .resize (mcCollisions.size (), false );
1341+ mMcCollisionIdToRecoCollisionId .clear ();
1342+ mMcCollisionIdToRecoCollisionId .resize (mcCollisions.size (), -1 );
12961343 mCollisionSelectionFlags .clear ();
12971344 mCollisionSelectionFlags .resize (collisions.size (), 0 );
12981345
@@ -1383,9 +1430,11 @@ struct he3HadronFemto {
13831430 fillMotherInfoMC (mctrackHe3, mctrackHad, motherParticle, he3Hadcand);
13841431 filledMothers.push_back (motherParticle.globalIndex ());
13851432 }
1386-
13871433 fillHistograms (he3Hadcand, /* isMc*/ true );
1388- fillTable (he3Hadcand, collision, /* isMC*/ true );
1434+
1435+ CollisionInfo collisionInfo;
1436+ collisionInfo.fillFromCollision (collision, collisionSelectionFlag);
1437+ fillTable (he3Hadcand, collisionInfo, /* isMC*/ true );
13891438 }
13901439 }
13911440
@@ -1532,9 +1581,10 @@ struct he3HadronFemto {
15321581 int biggestNContribs = -1 ;
15331582
15341583 for (const auto & col : collisions) {
1535-
1584+
15361585 uint32_t collisionSelectionFlag = 0 ;
1537- if (!selectCollision</* isMC*/ true >(col, bcs, collisionSelectionFlag)) {
1586+ // isMC == true only fills the collision vectors, which are not used in this workflow
1587+ if (!selectCollision</* isMC*/ false >(col, bcs, collisionSelectionFlag)) {
15381588 continue ;
15391589 }
15401590
0 commit comments