@@ -60,6 +60,7 @@ struct LongrangecorrDerived {
6060 Configurable<int > cfgV0Mask{" cfgV0Mask" , 0 , " Selection bitmask for the V0 particle" };
6161 Configurable<float > cfgVtxCut{" cfgVtxCut" , 10 .0f , " Vertex Z range to consider" };
6262 Configurable<bool > isUseCentEst{" isUseCentEst" , false , " Centrality based classification" };
63+ Configurable<int > isUseDataLikeMult{" isUseDataLikeMult" , 0 , " Data like mult/cent classification" };
6364
6465 Configurable<float > cfgFv0Cut{" cfgFv0Cut" , 50 .0f , " FV0A threshold" };
6566 Configurable<float > cfgFt0aCut{" cfgFt0aCut" , 100 .0f , " FT0A threshold" };
@@ -100,6 +101,12 @@ struct LongrangecorrDerived {
100101 using MftbestTrksTable = aod::LRMftBestTracks;
101102 using V0TrksTable = aod::LRV0Tracks;
102103
104+ using McCollsTable = aod::LRMcCollisions;
105+ using McTrksTable = aod::LRMidMcTracks;
106+ using McMftTrksTable = aod::LRMftMcTracks;
107+ using McFt0aTrksTable = aod::LRFt0aMcTracks;
108+ using McFt0cTrksTable = aod::LRFt0cMcTracks;
109+
103110 using UpcCollsTable = soa::Join<aod::UpcLRCollisions, aod::UpcSgLRCollisions, aod::LRZdcs>;
104111 using TrksUpcTable = aod::UpcLRMidTracks;
105112 using MftTrksUpcTable = aod::UpcLRMftTracks;
@@ -122,6 +129,11 @@ struct LongrangecorrDerived {
122129 Preslice<Ft0cTrksUpcTable> perUpcColFt0c = aod::lrcorrtrktable::upcLRCollisionId;
123130 Preslice<V0TrksUpcTable> perUpcColV0 = aod::lrcorrtrktable::upcLRCollisionId;
124131
132+ Preslice<McTrksTable> perMcColTpc = aod::lrcorrmctrktable::lrMcCollisionId;
133+ Preslice<McMftTrksTable> perMcColMft = aod::lrcorrmctrktable::lrMcCollisionId;
134+ Preslice<McFt0aTrksTable> perMcColFt0a = aod::lrcorrmctrktable::lrMcCollisionId;
135+ Preslice<McFt0cTrksTable> perMcColFt0c = aod::lrcorrmctrktable::lrMcCollisionId;
136+
125137 void init (InitContext const &)
126138 {
127139 std::vector<AxisSpec> corrAxis = {{axisVtxZ, " z-vtx (cm)" },
@@ -170,7 +182,7 @@ struct LongrangecorrDerived {
170182 if constexpr (std::experimental::is_detected<HasCent, TCollision>::value) {
171183 histos.fill (HIST (" hCentrality" ), col.centrality ());
172184 }
173- histos.fill (HIST (" hVertexZ" ), col.zvtx ());
185+ histos.fill (HIST (" hVertexZ" ), col.posZ ());
174186 }
175187
176188 template <typename TTrack>
@@ -273,7 +285,7 @@ struct LongrangecorrDerived {
273285 template <typename TCollision, typename TTriggers, typename TAssocs>
274286 void processSame (TCollision const & col, TTriggers const & triggers, TAssocs const & assocs)
275287 {
276- if (std::abs (col.zvtx ()) >= cfgVtxCut) {
288+ if (std::abs (col.posZ ()) >= cfgVtxCut) {
277289 return ;
278290 }
279291 fillCollQA (col);
@@ -286,7 +298,7 @@ struct LongrangecorrDerived {
286298 } else {
287299 multiplicity = col.multiplicity ();
288300 }
289- fillCorrHist<CorrelationContainer::kCFStepReconstructed >(same, triggers, assocs, false , col.zvtx (), multiplicity, 1.0 );
301+ fillCorrHist<CorrelationContainer::kCFStepReconstructed >(same, triggers, assocs, false , col.posZ (), multiplicity, 1.0 );
290302 } // process same
291303
292304 template <typename TCollision, typename ... TrackTypes>
@@ -311,7 +323,7 @@ struct LongrangecorrDerived {
311323 }
312324 return multiplicity;
313325 };
314- using MixedBinning = FlexibleBinningPolicy<std::tuple<decltype (getMultiplicity)>, aod::lrcorrcolltable::Zvtx , decltype (getMultiplicity)>;
326+ using MixedBinning = FlexibleBinningPolicy<std::tuple<decltype (getMultiplicity)>, aod::collision::PosZ , decltype (getMultiplicity)>;
315327 MixedBinning binningOnVtxAndMult{{getMultiplicity}, {axisVtxZME, axisMultME}, true };
316328 auto tracksTuple = std::make_tuple (std::forward<TrackTypes>(tracks)...);
317329 using TupleAtrack = std::tuple_element<0 , decltype (tracksTuple)>::type;
@@ -325,18 +337,60 @@ struct LongrangecorrDerived {
325337 }
326338 }
327339 float eventweight = 1 .0f / it.currentWindowNeighbours ();
328- auto multiplicity = 1 .0f ;
329- if constexpr (std::experimental::is_detected<HasCent, TCollision>::value) {
340+ auto multiplicity = getMultiplicity (col1);
341+ fillCorrHist<CorrelationContainer::kCFStepReconstructed >(mixed, tracks1, tracks2, true , col1.posZ (), multiplicity, eventweight);
342+ } // pair loop
343+ } // process mixed
344+
345+ template <typename TTriggers, typename TAssocs>
346+ void processMcSame (McCollsTable::iterator const & mccollision, soa::SmallGroups<aod::LRCollisionsWithLabel> const & collisions, TTriggers const & triggers, TAssocs const & assocs)
347+ {
348+ if (std::abs (mccollision.posZ ()) >= cfgVtxCut) {
349+ return ;
350+ }
351+ fillCollQA (mccollision);
352+ auto multiplicity = mccollision.multiplicity ();
353+ if (isUseDataLikeMult > 0 ) {
354+ for (const auto & collision : collisions) {
330355 if (isUseCentEst)
331- multiplicity = col1 .centrality ();
356+ multiplicity = collision .centrality ();
332357 else
333- multiplicity = col1.multiplicity ();
334- } else {
335- multiplicity = col1.multiplicity ();
358+ multiplicity = collision.multiplicity ();
336359 }
337- fillCorrHist<CorrelationContainer::kCFStepReconstructed >(mixed, tracks1, tracks2, true , col1.zvtx (), multiplicity, eventweight);
360+ }
361+ fillCorrHist<CorrelationContainer::kCFStepAll >(same, triggers, assocs, false , mccollision.posZ (), multiplicity, 1.0 );
362+ } // process MC same
363+
364+ template <typename ... TrackTypes>
365+ void processMcMixed (McCollsTable const & mccollisions, aod::LRCollisionsWithLabel const & collisions, TrackTypes&&... tracks)
366+ {
367+ bool useMCMultiplicity = (isUseDataLikeMult == 0 );
368+ auto getMultiplicity =
369+ [&collisions, &useMCMultiplicity, this ](auto & col) {
370+ if (useMCMultiplicity)
371+ return col.multiplicity ();
372+ auto groupedCollisions = collisions.sliceByCached (aod::lrcorrcolltable::lrMcCollisionId, col.globalIndex (), this ->cache );
373+ if (groupedCollisions.size () == 0 )
374+ return -1 .0f ;
375+ if (isUseCentEst)
376+ return groupedCollisions.begin ().centrality ();
377+ else
378+ return groupedCollisions.begin ().multiplicity ();
379+ };
380+
381+ using MixedBinning = FlexibleBinningPolicy<std::tuple<decltype (getMultiplicity)>, aod::mccollision::PosZ, decltype (getMultiplicity)>;
382+ MixedBinning binningOnVtxAndMult{{getMultiplicity}, {axisVtxZME, axisMultME}, true };
383+ auto tracksTuple = std::make_tuple (std::forward<TrackTypes>(tracks)...);
384+ using TupleAtrack = std::tuple_element<0 , decltype (tracksTuple)>::type;
385+ using TupleBtrack = std::tuple_element<std::tuple_size_v<decltype (tracksTuple)> - 1 , decltype (tracksTuple)>::type;
386+ Pair<McCollsTable, TupleAtrack, TupleBtrack, MixedBinning> pairs{binningOnVtxAndMult, cfgNmixedevent, -1 , mccollisions, tracksTuple, &cache};
387+ for (auto it = pairs.begin (); it != pairs.end (); it++) {
388+ auto & [col1, tracks1, col2, tracks2] = *it;
389+ float eventweight = 1 .0f / it.currentWindowNeighbours ();
390+ auto multiplicity = getMultiplicity (col1);
391+ fillCorrHist<CorrelationContainer::kCFStepAll >(mixed, tracks1, tracks2, true , col1.posZ (), multiplicity, eventweight);
338392 } // pair loop
339- } // process mixed
393+ } // process MC mixed
340394
341395 void processTpcft0aSE (CollsTable::iterator const & col, TrksTable const & tracks, Ft0aTrksTable const & ft0as)
342396 {
@@ -545,6 +599,46 @@ struct LongrangecorrDerived {
545599 processMixed (cols, tracks, mfts);
546600 }
547601
602+ void processMcTpcft0aSE (McCollsTable::iterator const & mccollision, soa::SmallGroups<aod::LRCollisionsWithLabel> const & collisions, McTrksTable const & tracks, McFt0aTrksTable const & ft0as)
603+ {
604+ processMcSame (mccollision, collisions, tracks, ft0as);
605+ }
606+
607+ void processMcTpcft0cSE (McCollsTable::iterator const & mccollision, soa::SmallGroups<aod::LRCollisionsWithLabel> const & collisions, McTrksTable const & tracks, McFt0cTrksTable const & ft0cs)
608+ {
609+ processMcSame (mccollision, collisions, tracks, ft0cs);
610+ }
611+
612+ void processMcTpcmftSE (McCollsTable::iterator const & mccollision, soa::SmallGroups<aod::LRCollisionsWithLabel> const & collisions, McTrksTable const & tracks, McMftTrksTable const & mfts)
613+ {
614+ processMcSame (mccollision, collisions, tracks, mfts);
615+ }
616+
617+ void processMcMftft0aSE (McCollsTable::iterator const & mccollision, soa::SmallGroups<aod::LRCollisionsWithLabel> const & collisions, McMftTrksTable const & mfts, McFt0aTrksTable const & ft0as)
618+ {
619+ processMcSame (mccollision, collisions, mfts, ft0as);
620+ }
621+
622+ void processMcTpcft0aME (McCollsTable const & mccollisions, aod::LRCollisionsWithLabel const & collisions, McTrksTable const & tracks, McFt0aTrksTable const & ft0as)
623+ {
624+ processMcMixed (mccollisions, collisions, tracks, ft0as);
625+ }
626+
627+ void processMcTpcft0cME (McCollsTable const & mccollisions, aod::LRCollisionsWithLabel const & collisions, McTrksTable const & tracks, McFt0cTrksTable const & ft0cs)
628+ {
629+ processMcMixed (mccollisions, collisions, tracks, ft0cs);
630+ }
631+
632+ void processMcTpcmftME (McCollsTable const & mccollisions, aod::LRCollisionsWithLabel const & collisions, McTrksTable const & tracks, McMftTrksTable const & mfts)
633+ {
634+ processMcMixed (mccollisions, collisions, tracks, mfts);
635+ }
636+
637+ void processMcMftft0aME (McCollsTable const & mccollisions, aod::LRCollisionsWithLabel const & collisions, McMftTrksTable const & mfts, McFt0aTrksTable const & ft0as)
638+ {
639+ processMcMixed (mccollisions, collisions, mfts, ft0as);
640+ }
641+
548642 PROCESS_SWITCH (LongrangecorrDerived, processTpcft0aSE, " same event TPC vs FT0A" , false );
549643 PROCESS_SWITCH (LongrangecorrDerived, processTpcft0aME, " mixed event TPC vs FT0A" , false );
550644 PROCESS_SWITCH (LongrangecorrDerived, processTpcft0cSE, " same event TPC vs FT0C" , false );
@@ -581,6 +675,14 @@ struct LongrangecorrDerived {
581675 PROCESS_SWITCH (LongrangecorrDerived, processUpcMftbestft0aME, " mixed UPC event best MFT vs FT0A" , false );
582676 PROCESS_SWITCH (LongrangecorrDerived, processUpcV0mftbestSE, " same UPC event V0 vs best MFT" , false );
583677 PROCESS_SWITCH (LongrangecorrDerived, processUpcV0mftbestME, " mixed UPC event V0 vs best MFT" , false );
678+ PROCESS_SWITCH (LongrangecorrDerived, processMcTpcft0aSE, " same MC event TPC vs FT0A" , false );
679+ PROCESS_SWITCH (LongrangecorrDerived, processMcTpcft0aME, " mixed MC event TPC vs FT0A" , false );
680+ PROCESS_SWITCH (LongrangecorrDerived, processMcTpcft0cSE, " same MC event TPC vs FT0C" , false );
681+ PROCESS_SWITCH (LongrangecorrDerived, processMcTpcft0cME, " mixed MC event TPC vs FT0C" , false );
682+ PROCESS_SWITCH (LongrangecorrDerived, processMcTpcmftSE, " same MC event TPC vs MFT" , false );
683+ PROCESS_SWITCH (LongrangecorrDerived, processMcTpcmftME, " mixed MC event TPC vs MFT" , false );
684+ PROCESS_SWITCH (LongrangecorrDerived, processMcMftft0aSE, " same MC event MFT vs FT0A" , false );
685+ PROCESS_SWITCH (LongrangecorrDerived, processMcMftft0aME, " mixed MC event MFT vs FT0A" , false );
584686};
585687
586688WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments