@@ -125,6 +125,7 @@ struct HStrangeCorrelation {
125125 Configurable<bool > doCorrelationOmegaPlus{" doCorrelationOmegaPlus" , false , " do OmegaPlus correlation" };
126126 Configurable<bool > doCorrelationPion{" doCorrelationPion" , false , " do Pion correlation" };
127127 Configurable<bool > doGenEventSelection{" doGenEventSelection" , true , " use event selections when performing closure test for the gen events" };
128+ Configurable<bool > doClosureTestPureMC{" doClosureTestPureMC" , false , " fill regular ClosureTest histograms without event or reconstructed-trigger selection, using MC vertex z and centrality 0.05; keep truth-particle selections" };
128129 Configurable<bool > selectINELgtZERO{" selectINELgtZERO" , true , " select INEL>0 events" };
129130 Configurable<bool > selectINELgtONE{" selectINELgtONE" , false , " select INEL>1 events (at least 2 charged particles in |eta| < 1)" };
130131 Configurable<float > zVertexCut{" zVertexCut" , 10 , " Cut on PV position" };
@@ -6181,71 +6182,82 @@ struct HStrangeCorrelation {
61816182
61826183 float bestCollisionCentpercentile = -1 ;
61836184 float bestCollisionVtxZ = 0 .0f ;
6184- bool bestCollisionSel8 = false ;
6185- bool bestCollisionINELgtZERO = false ;
6186- bool bestCollisionINELgtONE = false ;
6187- bool bestCollisionNoSameBunchPileup = false ;
6188- bool bestCollisionGoodTriggerTVX = false ;
6189- bool bestCollisionGoodZvtxFT0vsPV = false ;
6190- bool isCollisionSelect = false ;
6191- int biggestNContribs = -1 ;
6192- uint32_t bestCollisionTriggerPresenceMap = 0 ;
6185+ // Pure MC defines an inclusive generated-event reference, independent of
6186+ // reconstructed collisions and triggerPresenceMap. Particle/pair selections
6187+ // below still define the observable. PairLossK0 diagnostics above retain
6188+ // their own event selection.
6189+ if (masterConfigurations.doClosureTestPureMC ) {
6190+ bestCollisionCentpercentile = 0 .05f ;
6191+ bestCollisionVtxZ = mcCollision.posZ ();
6192+ } else {
6193+ bool bestCollisionSel8 = false ;
6194+ bool bestCollisionINELgtZERO = false ;
6195+ bool bestCollisionINELgtONE = false ;
6196+ bool bestCollisionNoSameBunchPileup = false ;
6197+ bool bestCollisionGoodTriggerTVX = false ;
6198+ bool bestCollisionGoodZvtxFT0vsPV = false ;
6199+ bool isCollisionSelect = false ;
6200+ int biggestNContribs = -1 ;
6201+ uint32_t bestCollisionTriggerPresenceMap = 0 ;
61936202
6194- for (auto const & recCollision : recCollisions) {
6195- if (biggestNContribs < recCollision.numContrib ()) {
6196- biggestNContribs = recCollision.numContrib ();
6197- bestCollisionCentpercentile = masterConfigurations.doPPAnalysis ? recCollision.centFT0M () : recCollision.centFT0C ();
6198- if (masterConfigurations.applyNewMCSelection ) {
6199- isCollisionSelect = ((masterConfigurations.doPPAnalysis && isCollisionSelected (recCollision)) || (!masterConfigurations.doPPAnalysis && isCollisionSelectedPbPb (recCollision, false )));
6200- } else {
6201- bestCollisionSel8 = recCollision.sel8 ();
6203+ for (auto const & recCollision : recCollisions) {
6204+ if (biggestNContribs < recCollision.numContrib ()) {
6205+ biggestNContribs = recCollision.numContrib ();
6206+ bestCollisionCentpercentile = masterConfigurations.doPPAnalysis ? recCollision.centFT0M () : recCollision.centFT0C ();
6207+ // Both branches fill the generated-level THns with this vertex position, so it
6208+ // is taken from the best collision regardless of which event selection is used.
62026209 bestCollisionVtxZ = recCollision.posZ ();
6203- bestCollisionINELgtZERO = recCollision.isInelGt0 ();
6204- bestCollisionINELgtONE = recCollision.isInelGt1 ();
6205- bestCollisionNoSameBunchPileup = recCollision.selection_bit (o2::aod::evsel::kNoSameBunchPileup );
6206- bestCollisionGoodTriggerTVX = recCollision.selection_bit (aod::evsel::kIsTriggerTVX );
6207- bestCollisionGoodZvtxFT0vsPV = recCollision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV );
6208- }
6209- if (triggerPresenceMap.size () > 0 ) {
6210- bestCollisionTriggerPresenceMap = triggerPresenceMap[recCollision.globalIndex ()];
6210+ if (masterConfigurations.applyNewMCSelection ) {
6211+ isCollisionSelect = ((masterConfigurations.doPPAnalysis && isCollisionSelected (recCollision)) || (!masterConfigurations.doPPAnalysis && isCollisionSelectedPbPb (recCollision, false )));
6212+ } else {
6213+ bestCollisionSel8 = recCollision.sel8 ();
6214+ bestCollisionINELgtZERO = recCollision.isInelGt0 ();
6215+ bestCollisionINELgtONE = recCollision.isInelGt1 ();
6216+ bestCollisionNoSameBunchPileup = recCollision.selection_bit (o2::aod::evsel::kNoSameBunchPileup );
6217+ bestCollisionGoodTriggerTVX = recCollision.selection_bit (aod::evsel::kIsTriggerTVX );
6218+ bestCollisionGoodZvtxFT0vsPV = recCollision.selection_bit (o2::aod::evsel::kIsGoodZvtxFT0vsPV );
6219+ }
6220+ if (triggerPresenceMap.size () > 0 ) {
6221+ bestCollisionTriggerPresenceMap = triggerPresenceMap[recCollision.globalIndex ()];
6222+ }
62116223 }
62126224 }
6213- }
6214- // ________________________________________________
6215- // skip if desired trigger not found
6216- if (triggerPresenceMap.size () > 0 && !TESTBIT (bestCollisionTriggerPresenceMap, triggerBinToSelect)) {
6217- return ;
6218- }
6219-
6220- if (masterConfigurations.applyNewMCSelection ) {
6221- if (!isCollisionSelect) {
6225+ // ________________________________________________
6226+ // skip if desired trigger not found
6227+ if (triggerPresenceMap.size () > 0 && !TESTBIT (bestCollisionTriggerPresenceMap, triggerBinToSelect)) {
62226228 return ;
62236229 }
6224- } else {
6225- if (masterConfigurations.doGenEventSelection ) {
6226- if (!bestCollisionSel8) {
6227- return ;
6228- }
6229- if (std::abs (bestCollisionVtxZ) > masterConfigurations.zVertexCut ) {
6230- return ;
6231- }
6232- if (!bestCollisionINELgtZERO) {
6233- return ;
6234- }
6235- if (masterConfigurations.selectINELgtONE && !bestCollisionINELgtONE) {
6236- return ;
6237- }
6238- if (masterConfigurations.rejectSameBunchPileup && !bestCollisionNoSameBunchPileup) {
6239- return ;
6240- }
6241- if (masterConfigurations.requireGoodTriggerTVX && !bestCollisionGoodTriggerTVX) {
6242- return ;
6243- }
6244- if (masterConfigurations.requireGoodZvtxFT0vsPV && !bestCollisionGoodZvtxFT0vsPV) {
6230+
6231+ if (masterConfigurations.applyNewMCSelection ) {
6232+ if (!isCollisionSelect) {
62456233 return ;
62466234 }
6247- if (bestCollisionCentpercentile > axisRanges[5 ][1 ] || bestCollisionCentpercentile < axisRanges[5 ][0 ]) {
6248- return ;
6235+ } else {
6236+ if (masterConfigurations.doGenEventSelection ) {
6237+ if (!bestCollisionSel8) {
6238+ return ;
6239+ }
6240+ if (std::abs (bestCollisionVtxZ) > masterConfigurations.zVertexCut ) {
6241+ return ;
6242+ }
6243+ if (!bestCollisionINELgtZERO) {
6244+ return ;
6245+ }
6246+ if (masterConfigurations.selectINELgtONE && !bestCollisionINELgtONE) {
6247+ return ;
6248+ }
6249+ if (masterConfigurations.rejectSameBunchPileup && !bestCollisionNoSameBunchPileup) {
6250+ return ;
6251+ }
6252+ if (masterConfigurations.requireGoodTriggerTVX && !bestCollisionGoodTriggerTVX) {
6253+ return ;
6254+ }
6255+ if (masterConfigurations.requireGoodZvtxFT0vsPV && !bestCollisionGoodZvtxFT0vsPV) {
6256+ return ;
6257+ }
6258+ if (bestCollisionCentpercentile > axisRanges[5 ][1 ] || bestCollisionCentpercentile < axisRanges[5 ][0 ]) {
6259+ return ;
6260+ }
62496261 }
62506262 }
62516263 }
0 commit comments