@@ -1432,7 +1432,7 @@ struct derivedlambdakzeroanalysis {
14321432 }
14331433
14341434 template <typename TV0 , typename TCollision>
1435- uint64_t computeReconstructionBitmap (TV0 const & v0, TCollision const & collision, float rapidityLambda, float rapidityK0Short, float /* pT */ )
1435+ uint64_t computeReconstructionBitmap (TV0 const & v0, TCollision const & collision, float rapidityLambda, float rapidityK0Short)
14361436 // precalculate this information so that a check is one mask operation, not many
14371437 {
14381438 uint64_t bitMap = 0 ;
@@ -2926,9 +2926,9 @@ struct derivedlambdakzeroanalysis {
29262926 }
29272927
29282928 // ______________________________________________________
2929- // Real data processing - no MC subscription
2930- template <typename TCollision, typename TV0s>
2931- void analyzeRecoedV0sInRealData (TCollision const & collision, TV0s const & fullV0s)
2929+ // Recoed data and MC processing (can use MC info if subscribed to it)
2930+ template <typename TCollision, typename TV0s, typename TMCCollisions >
2931+ void analyzeRecoedV0s (TCollision const & collision, TV0s const & fullV0s, TMCCollisions const & /* mcCollisions */ )
29322932 {
29332933 // Fire up CCDB
29342934 if ((mlConfigurations.useK0ShortScores && mlConfigurations.calculateK0ShortScores ) ||
@@ -2951,8 +2951,6 @@ struct derivedlambdakzeroanalysis {
29512951 // Fill recoed event properties
29522952 fillReconstructedEventProperties (collision, centrality, collisionOccupancy, interactionRate, gapSide, selGapSide);
29532953
2954- histos.fill (HIST (" hInteractionRateVsOccupancy" ), interactionRate, collisionOccupancy);
2955-
29562954 // __________________________________________
29572955 // perform main analysis
29582956 int nK0Shorts = 0 ;
@@ -2965,96 +2963,51 @@ struct derivedlambdakzeroanalysis {
29652963 if (v0.v0Type () != v0Selections.v0TypeSelection && v0Selections.v0TypeSelection > -1 )
29662964 continue ; // skip V0s that are not standard
29672965
2968- // fill AP plot for all V0s
2969- histos.fill (HIST (" GeneralQA/h2dArmenterosAll" ), v0.alpha (), v0.qtarm ());
2970-
2971- uint64_t selMap = computeReconstructionBitmap (v0, collision, v0.yLambda (), v0.yK0Short (), v0.pt ());
2972-
2973- // consider for histograms for all species
2974- BITSET (selMap, selConsiderK0Short);
2975- BITSET (selMap, selConsiderLambda);
2976- BITSET (selMap, selConsiderAntiLambda);
2977-
2978- BITSET (selMap, selPhysPrimK0Short);
2979- BITSET (selMap, selPhysPrimLambda);
2980- BITSET (selMap, selPhysPrimAntiLambda);
2981-
2982- analyseCandidate (v0, v0.pt (), v0.yLambda (), v0.yK0Short (), centrality, selMap, selGapSide, nK0Shorts, nLambdas, nAntiLambdas);
2983- } // end v0 loop
2984-
2985- // fill the histograms with the number of reconstructed K0s/Lambda/antiLambda per collision
2986- if (analyseK0Short) {
2987- histos.fill (HIST (" h2dNbrOfK0ShortVsCentrality" ), centrality, nK0Shorts);
2988- }
2989- if (analyseLambda) {
2990- histos.fill (HIST (" h2dNbrOfLambdaVsCentrality" ), centrality, nLambdas);
2991- }
2992- if (analyseAntiLambda) {
2993- histos.fill (HIST (" h2dNbrOfAntiLambdaVsCentrality" ), centrality, nAntiLambdas);
2994- }
2995- }
2996-
2997- // ______________________________________________________
2998- // Simulated processing (subscribes to MC information too)
2999- template <typename TCollision, typename TV0s, typename TMCCollisions>
3000- void analyzeRecoedV0sInMonteCarlo (TCollision const & collision, TV0s const & fullV0s, TMCCollisions const & /* mcCollisions*/ )
3001- {
3002- // Fire up CCDB
3003- if ((mlConfigurations.useK0ShortScores && mlConfigurations.calculateK0ShortScores ) ||
3004- (mlConfigurations.useLambdaScores && mlConfigurations.calculateLambdaScores ) ||
3005- (mlConfigurations.useAntiLambdaScores && mlConfigurations.calculateAntiLambdaScores ) ||
3006- v0Selections.rejectTPCsectorBoundary ) {
3007- initCCDB (collision);
3008- }
3009-
3010- if (!isEventAccepted (collision, true )) {
3011- return ;
3012- }
3013-
3014- float centrality = -1 ;
3015- float collisionOccupancy = -2 ; // -1 already taken for the case where occupancy cannot be evaluated
3016- double interactionRate = -1 ;
3017- // gap side
3018- int gapSide = -1 ;
3019- int selGapSide = -1 ; // -1 --> Hadronic ; 0 --> Single Gap - A side ; 1 --> Single Gap - C side ; 2 --> Double Gap - both A & C sides
3020- // Fill recoed event properties
3021- fillReconstructedEventProperties (collision, centrality, collisionOccupancy, interactionRate, gapSide, selGapSide);
3022-
3023- histos.fill (HIST (" hInteractionRateVsOccupancy" ), interactionRate, collisionOccupancy);
2966+ float pt = v0.pt ();
2967+ float ptMC = -1 .f ;
2968+ float yK0Short = v0.yK0Short ();
2969+ float yLambda = v0.yLambda ();
2970+ bool correctCollision = false ;
2971+ int mcNch = -1 ;
2972+ uint64_t selMapMCassociation = 0 ;
2973+
2974+ if constexpr (requires { v0.v0MCCoreId (); }) {
2975+ if (doMCAssociation) {
2976+ if (!v0.has_v0MCCore ())
2977+ continue ;
30242978
3025- // __________________________________________
3026- // perform main analysis
3027- int nK0Shorts = 0 ;
3028- int nLambdas = 0 ;
3029- int nAntiLambdas = 0 ;
3030- for (auto const & v0 : fullV0s) {
3031- if (std::abs (v0.negativeeta ()) > v0Selections.daughterEtaCut || std::abs (v0.positiveeta ()) > v0Selections.daughterEtaCut )
3032- continue ; // remove acceptance that's badly reproduced by MC / superfluous in future
2979+ auto v0MC = v0.template v0MCCore_as <soa::Join<aod::V0MCCores, aod::V0MCCollRefs>>();
30332980
3034- if (v0.v0Type () != v0Selections.v0TypeSelection && v0Selections.v0TypeSelection > -1 )
3035- continue ; // skip V0s that are not standard
2981+ ptMC = RecoDecay::sqrtSumOfSquares (v0MC.pxPosMC () + v0MC.pxNegMC (), v0MC.pyPosMC () + v0MC.pyNegMC ());
2982+ pt = ptMC;
2983+ yK0Short = RecoDecay::y (std::array{v0MC.pxPosMC () + v0MC.pxNegMC (), v0MC.pyPosMC () + v0MC.pyNegMC (), v0MC.pzPosMC () + v0MC.pzNegMC ()}, o2::constants::physics::MassKaonNeutral);
2984+ yLambda = RecoDecay::y (std::array{v0MC.pxPosMC () + v0MC.pxNegMC (), v0MC.pyPosMC () + v0MC.pyNegMC (), v0MC.pzPosMC () + v0MC.pzNegMC ()}, o2::constants::physics::MassLambda);
30362985
3037- if (!v0.has_v0MCCore ())
3038- continue ;
2986+ selMapMCassociation = computeMCAssociation (v0MC);
30392987
3040- auto v0MC = v0.template v0MCCore_as <soa::Join<aod::V0MCCores, aod::V0MCCollRefs>>();
2988+ if constexpr (requires { collision.straMCCollisionId (); }) {
2989+ // check collision association explicitly
2990+ if (collision.has_straMCCollision ()) {
2991+ auto mcCollision = collision.template straMCCollision_as <TMCCollisions>();
2992+ mcNch = mcCollision.multMCNParticlesEta05 ();
2993+ correctCollision = (v0MC.straMCCollisionId () == mcCollision.globalIndex ());
2994+ }
2995+ }
2996+ }
2997+ }
30412998
30422999 // fill AP plot for all V0s
30433000 histos.fill (HIST (" GeneralQA/h2dArmenterosAll" ), v0.alpha (), v0.qtarm ());
30443001
3045- float ptmc = RecoDecay::sqrtSumOfSquares (v0MC.pxPosMC () + v0MC.pxNegMC (), v0MC.pyPosMC () + v0MC.pyNegMC ());
3046- float ymc = 1e3 ;
3047- if (v0MC.pdgCode () == PDG_t::kK0Short )
3048- ymc = RecoDecay::y (std::array{v0MC.pxPosMC () + v0MC.pxNegMC (), v0MC.pyPosMC () + v0MC.pyNegMC (), v0MC.pzPosMC () + v0MC.pzNegMC ()}, o2::constants::physics::MassKaonNeutral);
3049- else if (std::abs (v0MC.pdgCode ()) == PDG_t::kLambda0 )
3050- ymc = RecoDecay::y (std::array{v0MC.pxPosMC () + v0MC.pxNegMC (), v0MC.pyPosMC () + v0MC.pyNegMC (), v0MC.pzPosMC () + v0MC.pzNegMC ()}, o2::constants::physics::MassLambda);
3051-
3052- uint64_t selMap = computeReconstructionBitmap (v0, collision, ymc, ymc, ptmc);
3053- selMap = selMap | computeMCAssociation (v0MC);
3002+ uint64_t selMap = computeReconstructionBitmap (v0, collision, yK0Short, yLambda);
3003+ BITSET (selMap, selMapMCassociation);
30543004
30553005 // feeddown matrix always with association
3056- if (calculateFeeddownMatrix)
3057- fillFeeddownMatrix (v0, ptmc, centrality, selMap);
3006+ if constexpr (requires { v0.motherMCPartId (); }) {
3007+ if (calculateFeeddownMatrix) {
3008+ fillFeeddownMatrix (v0, ptMC, centrality, selMap);
3009+ }
3010+ }
30583011
30593012 // consider only associated candidates if asked to do so, disregard association
30603013 if (!doMCAssociation) {
@@ -3067,18 +3020,13 @@ struct derivedlambdakzeroanalysis {
30673020 BITSET (selMap, selPhysPrimAntiLambda);
30683021 }
30693022
3070- analyseCandidate (v0, ptmc, ymc, ymc , centrality, selMap, selGapSide, nK0Shorts, nLambdas, nAntiLambdas);
3023+ analyseCandidate (v0, pt, yLambda, yK0Short , centrality, selMap, selGapSide, nK0Shorts, nLambdas, nAntiLambdas);
30713024
3072- if (doCollisionAssociationQA) {
3073- // check collision association explicitly
3074- bool correctCollision = false ;
3075- int mcNch = -1 ;
3076- if (collision.has_straMCCollision ()) {
3077- auto mcCollision = collision.template straMCCollision_as <TMCCollisions>();
3078- mcNch = mcCollision.multMCNParticlesEta05 ();
3079- correctCollision = (v0MC.straMCCollisionId () == mcCollision.globalIndex ());
3025+ if constexpr (requires { collision.straMCCollisionId (); }) {
3026+ if (doCollisionAssociationQA) {
3027+ // check collision association explicitly
3028+ analyseCollisionAssociation (v0, ptMC, mcNch, correctCollision, selMap);
30803029 }
3081- analyseCollisionAssociation (v0, ptmc, mcNch, correctCollision, selMap);
30823030 }
30833031
30843032 } // end v0 loop
@@ -3535,28 +3483,28 @@ struct derivedlambdakzeroanalysis {
35353483 // Real data processing in Run 3 - no MC subscription
35363484 void processRealDataRun3 (soa::Join<aod::StraCollisions, aod::StraCents, aod::StraEvSels, aod::StraEvSelExtras, aod::StraStamps, aod::StraEvTimes>::iterator const & collision, V0Candidates const & fullV0s, DauTracks const &)
35373485 {
3538- analyzeRecoedV0sInRealData (collision, fullV0s);
3486+ analyzeRecoedV0s (collision, fullV0s, static_cast <TObject*>( nullptr ) );
35393487 }
35403488
35413489 // ______________________________________________________
35423490 // Real data processing in Run 2 - no MC subscription
35433491 void processRealDataRun2 (soa::Join<aod::StraCollisions, aod::StraCentsRun2, aod::StraEvSelsRun2, aod::StraStamps, aod::StraEvTimes>::iterator const & collision, V0Candidates const & fullV0s, DauTracks const &)
35443492 {
3545- analyzeRecoedV0sInRealData (collision, fullV0s);
3493+ analyzeRecoedV0s (collision, fullV0s, static_cast <TObject*>( nullptr ) );
35463494 }
35473495
35483496 // ______________________________________________________
35493497 // Simulated processing in Run 3 (subscribes to MC information too)
35503498 void processMonteCarloRun3 (soa::Join<aod::StraCollisions, aod::StraCents, aod::StraEvSels, aod::StraEvSelExtras, aod::StraStamps, aod::StraEvTimes, aod::StraCollLabels>::iterator const & collision, V0McCandidates const & fullV0s, DauTracks const &, aod::MotherMCParts const &, soa::Join<aod::StraMCCollisions, aod::StraMCCollMults, aod::McCentFV0As, aod::McCentFT0Ms, aod::McCentFT0Cs, aod::McCentFT0CVariant1s, aod::McCentNGlobals> const & mccollisions, soa::Join<aod::V0MCCores, aod::V0MCCollRefs> const &)
35513499 {
3552- analyzeRecoedV0sInMonteCarlo (collision, fullV0s, mccollisions);
3500+ analyzeRecoedV0s (collision, fullV0s, mccollisions);
35533501 }
35543502
35553503 // ______________________________________________________
35563504 // Simulated processing in Run 2 (subscribes to MC information too)
35573505 void processMonteCarloRun2 (soa::Join<aod::StraCollisions, aod::StraCentsRun2, aod::StraEvSelsRun2, aod::StraStamps, aod::StraEvTimes, aod::StraCollLabels>::iterator const & collision, V0McCandidates const & fullV0s, DauTracks const &, aod::MotherMCParts const &, soa::Join<aod::StraMCCollisions, aod::StraMCCollMults> const & mccollisions, soa::Join<aod::V0MCCores, aod::V0MCCollRefs> const &)
35583506 {
3559- analyzeRecoedV0sInMonteCarlo (collision, fullV0s, mccollisions);
3507+ analyzeRecoedV0s (collision, fullV0s, mccollisions);
35603508 }
35613509
35623510 // ______________________________________________________
0 commit comments