@@ -105,6 +105,7 @@ struct CorrelationTask {
105105 O2_DEFINE_CONFIGURABLE (cfgTwoTrackCut, float , -1 , " Two track cut: -1 = off; >0 otherwise distance value (suggested: 0.02)" );
106106 O2_DEFINE_CONFIGURABLE (cfgTwoTrackCutMinRadius, float , 0 .8f , " Two track cut: radius in m from which two track cuts are applied" );
107107 O2_DEFINE_CONFIGURABLE (cfgLocalEfficiency, int , 0 , " 0 = OFF and 1 = ON for local efficiency" );
108+ O2_DEFINE_CONFIGURABLE (cfgDropStepRECO, bool , false , " choice to drop step RECO if efficiency correction is used" );
108109 O2_DEFINE_CONFIGURABLE (cfgCentBinsForMC, int , 0 , " 0 = OFF and 1 = ON for data like multiplicity/centrality bins for MC steps" );
109110 O2_DEFINE_CONFIGURABLE (cfgRequireRecoCollision, int , 1 , " 0 = all generated collisions; 1 = only generated collisions with exactly 1 reconstructed collision; 2 = select reconstructed collision with largest number of contributors per generated collision" )
110111 O2_DEFINE_CONFIGURABLE (cfgTrackBitMask, uint16_t , 0 , " BitMask for track selection systematics; refer to the enum TrackSelectionCuts in filtering task" );
@@ -161,10 +162,7 @@ struct CorrelationTask {
161162
162163 // Track filters
163164 Filter trackFilter = (nabs(aod::track::eta) < cfgCutEta) && (aod::track::pt > cfgCutPt) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t )true ));
164- // Filter cfTrackFilter = (nabs(aod::cftrack::eta) < cfgCutEta) && (aod::cftrack::pt > cfgCutPt) && ((aod::track::trackType & static_cast<uint8_t>(cfgTrackBitMask)) == static_cast<uint8_t>(cfgTrackBitMask));
165165 Filter cfTrackFilter = (nabs(aod::cftrack::eta) < cfgCutEta) && (aod::cftrack::pt > cfgCutPt) && ncheckbit(aod::track::trackType, as<uint8_t >(cfgTrackBitMask));
166- // Filter cfTrackFilter = (nabs(aod::cftrack::eta) < cfgCutEta) && (aod::cftrack::pt > cfgCutPt);
167- // Filter cfTrackType = (aod::track::trackType & static_cast<uint8_t>(cfgTrackBitMask)) == static_cast<uint8_t>(cfgTrackBitMask);
168166
169167 // MC filters
170168 Filter cfMCCollisionFilter = nabs(aod::mccollision::posZ) < cfgCutVertex;
@@ -217,12 +215,15 @@ struct CorrelationTask {
217215 LOGF (fatal, " Unsupported cfgRequireRecoCollision=%d; use 0 (no reco. collision required), 1 (exactly one reco. collision required), 2 (at least one. reco, and best reco. collision selected)" , cfgRequireRecoCollision.value );
218216 }
219217 if (doprocessSame2ProngDerivedML || doprocessSame2Prong2ProngML || doprocessMixed2ProngDerivedML || doprocessMixed2Prong2ProngML || doprocessMCEfficiency2ProngML || doprocessMCReflection2ProngML) {
220- if (cfgPtDepMLbkg->empty () || cfgPtCentDepMLbkgSel->empty ())
218+ if (cfgPtDepMLbkg->empty () || cfgPtCentDepMLbkgSel->empty ()) {
221219 LOGF (fatal, " cfgPtDepMLbkg or cfgPtCentDepMLbkgSel can not be empty when ML 2-prong selections are used." );
222- if (cfgPtDepMLbkg->size () != cfgPtCentDepMLbkgSel->size ())
220+ }
221+ if (cfgPtDepMLbkg->size () != cfgPtCentDepMLbkgSel->size ()) {
223222 LOGF (fatal, " cfgPtDepMLbkg and cfgPtCentDepMLbkgSel must be same size." );
224- if (!cfgPtCentDepMLpromptSel->empty () && cfgPtCentDepMLpromptSel->size () != cfgPtDepMLbkg->size ())
223+ }
224+ if (!cfgPtCentDepMLpromptSel->empty () && cfgPtCentDepMLpromptSel->size () != cfgPtDepMLbkg->size ()) {
225225 LOGF (fatal, " cfgPtDepMLbkg and cfgPtCentDepMLpromptSel must be same size." );
226+ }
226227 if (!cfgPtCentDepMLnonpromptSel->empty () && cfgPtCentDepMLnonpromptSel->size () != cfgPtDepMLbkg->size ())
227228 LOGF (fatal, " cfgPtDepMLbkg and cfgPtCentDepMLnonpromptSel must be same size." );
228229 if (cfgPtCentDepMLpromptSel->size () > 0 )
@@ -276,9 +277,6 @@ struct CorrelationTask {
276277 registry.add (" multCorrelations" , " Multiplicity correlations" , {HistType::kTHnSparseF , multAxes});
277278 }
278279 registry.add (" multiplicity" , " event multiplicity" , {HistType::kTH1F , {{1000 , 0 , 100 , " /multiplicity/centrality" }}});
279- // One-off QA: number of accepted tracks per event, before and after efficiency correction
280- registry.add (" trackMultiplicity" , " number of accepted tracks per event (before efficiency correction)" , {HistType::kTH2F , {{1000 , 0 , 100 , " /multiplicity/centrality" }, {200 , 0 , 200 , " N_{tracks}" }}});
281- registry.add (" trackMultiplicityCorrected" , " number of accepted tracks per event (after efficiency correction)" , {HistType::kTH2F , {{1000 , 0 , 100 , " /multiplicity/centrality" }, {200 , 0 , 200 , " N_{tracks} (efficiency weighted)" }}});
282280 registry.add (" yvspt" , " y vs pT" , {HistType::kTH2F , {{100 , -1 , 1 , " y" }, {100 , 0 , 20 , " p_{T}" }}}); // y vs pT for all tracks (control histogram)
283281
284282 const int maxMixBin = AxisSpec (axisMultiplicity).getNbins () * AxisSpec (axisVertex).getNbins ();
@@ -470,7 +468,7 @@ struct CorrelationTask {
470468 if (cfg.mEfficiencyTrigger ) {
471469 triggerWeight *= getEfficiencyCorrection (cfg.mEfficiencyTrigger , track1.eta (), track1.pt (), multiplicity, collision.posZ ());
472470 }
473- registry.fill (HIST (" invMass" ), track1.invMass (), track1.pt (), multiplicity, posZ); // , triggerWeight);
471+ registry.fill (HIST (" invMass" ), track1.invMass (), track1.pt (), multiplicity, posZ);
474472 registry.fill (HIST (" invMassCorrected" ), track1.invMass (), track1.pt (), multiplicity, posZ, triggerWeight);
475473 for (const auto & track2 : tracks2) {
476474 if constexpr (std::experimental::is_detected<HasInvMass, typename TTracks2::iterator>::value && std::experimental::is_detected<HasDecay, typename TTracks2::iterator>::value) {
@@ -536,22 +534,6 @@ struct CorrelationTask {
536534 fillQA (collision, multiplicity, tracks2);
537535 }
538536
539- // One-off QA: multiplicity (number of accepted tracks) before and after efficiency correction
540- // The corrected version sums the per-track efficiency (used as fill weight) and fills once per event.
541- template <typename TCollision, typename TTracks>
542- void fillTrackMultiplicity (const TCollision& collision, const TTracks& tracks, float multiplicity)
543- {
544- registry.fill (HIST (" trackMultiplicity" ), multiplicity, float (tracks.size ()));
545- THn* eff = cfg.mEfficiencyAssociated ? cfg.mEfficiencyAssociated : cfg.mEfficiencyTrigger ;
546- if (eff) {
547- float correctedMult = 0 .0f ;
548- for (const auto & track : tracks) {
549- correctedMult += getEfficiencyCorrection (eff, track.eta (), track.pt (), multiplicity, collision.posZ ());
550- }
551- registry.fill (HIST (" trackMultiplicityCorrected" ), multiplicity, correctedMult);
552- }
553- }
554-
555537 template <typename TTarget, typename TCollision>
556538 bool fillCollisionAOD (TTarget target, const TCollision& collision, float multiplicity)
557539 {
@@ -677,12 +659,6 @@ struct CorrelationTask {
677659 duplicates.clear ();
678660
679661 for (const auto & track1 : tracks1) {
680- /* if constexpr (std::experimental::is_detected<HasTrackType, typename TTracks1::iterator>::value) {
681- //registry.fill(HIST("sameDerivedTrackType"), track1.trackType());
682-
683- //if((track1.trackType() & cfgTrackBitMask) == cfgTrackBitMask)
684- LOGF(info, "Track %f | %f | %f %d", track1.eta(), track1.phi(), track1.pt(), track1.trackType());
685- }*/
686662 // LOGF(info, "Track %f | %f | %f %d %d", track1.eta(), track1.phi(), track1.pt(), track1.isGlobalTrack(), track1.isGlobalTrackSDD());
687663
688664 if constexpr (step <= CorrelationContainer::kCFStepTracked && !std::experimental::is_detected<HasDecay, typename TTracks1::iterator>::value) {
@@ -999,7 +975,6 @@ struct CorrelationTask {
999975 if (cfgMultWeight.value .empty () == false ) {
1000976 TFile* pf = TFile::Open (cfgMultWeight.value .c_str (), " READ" );
1001977 cfg.mMultWeight = reinterpret_cast <TH1 *>(pf->Get (" hWeight" ));
1002- //
1003978 LOGF (info, " Loaded multiplicity weight histogram for associated particles from %s (%p)" , cfgMultWeight.value .c_str (), (void *)cfg.mMultWeight );
1004979 }
1005980 cfg.efficiencyLoaded = true ;
@@ -1035,7 +1010,6 @@ struct CorrelationTask {
10351010 }
10361011 registry.fill (HIST (" eventcount_same" ), -2 );
10371012 fillQA (collision, multiplicity, tracks);
1038- fillTrackMultiplicity (collision, tracks, multiplicity);
10391013 fillCorrelations<CorrelationContainer::kCFStepReconstructed >(same, tracks, tracks, multiplicity, collision.posZ (), getMagneticField (bc.runNumber (), bc.timestamp ()), 1 .0f );
10401014 }
10411015 PROCESS_SWITCH (CorrelationTask, processSameAOD, " Process same event on AOD" , true );
@@ -1064,12 +1038,16 @@ struct CorrelationTask {
10641038 } else {
10651039 fillQA (collision, multiplicity, tracks1);
10661040 }
1067- fillTrackMultiplicity (collision, tracks2, multiplicity);
10681041
1069- same->fillEvent (multiplicity, CorrelationContainer::kCFStepReconstructed );
1070- fillCorrelations<CorrelationContainer::kCFStepReconstructed >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f );
1042+ const bool hasEfficiency = (cfg.mEfficiencyAssociated != nullptr || cfg.mEfficiencyTrigger != nullptr );
1043+ const bool fillReco = !(cfgDropStepRECO && hasEfficiency);
1044+
1045+ if (fillReco) {
1046+ same->fillEvent (multiplicity, CorrelationContainer::kCFStepReconstructed );
1047+ fillCorrelations<CorrelationContainer::kCFStepReconstructed >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f );
1048+ }
10711049
1072- if (cfg. mEfficiencyAssociated || cfg. mEfficiencyTrigger ) {
1050+ if (hasEfficiency ) {
10731051 same->fillEvent (multiplicity, CorrelationContainer::kCFStepCorrected );
10741052 fillCorrelations<CorrelationContainer::kCFStepCorrected >(same, tracks1, tracks2, multiplicity, collision.posZ (), field, 1 .0f );
10751053 }
@@ -1194,19 +1172,28 @@ struct CorrelationTask {
11941172 LOGF (info, " processMixedDerived: Mixed collisions bin: %d pair: [%d, %d] %d (%.3f, %.3f), %d (%.3f, %.3f)" , bin, it.isNewWindow (), it.currentWindowNeighbours (), collision1.globalIndex (), collision1.posZ (), collision1.multiplicity (), collision2.globalIndex (), collision2.posZ (), collision2.multiplicity ());
11951173 }
11961174
1175+ bool hasEfficiencyMixed = (cfg.mEfficiencyAssociated != nullptr || cfg.mEfficiencyTrigger != nullptr );
1176+ bool fillRecoMixed = !(cfgDropStepRECO && hasEfficiencyMixed);
1177+
11971178 if (it.isNewWindow ()) {
11981179 loadEfficiency (collision1.timestamp ());
1180+ hasEfficiencyMixed = (cfg.mEfficiencyAssociated != nullptr || cfg.mEfficiencyTrigger != nullptr );
1181+ fillRecoMixed = !(cfgDropStepRECO && hasEfficiencyMixed);
11991182
1200- mixed->fillEvent (collision1.multiplicity (), CorrelationContainer::kCFStepReconstructed );
1183+ if (fillRecoMixed) {
1184+ mixed->fillEvent (collision1.multiplicity (), CorrelationContainer::kCFStepReconstructed );
1185+ }
12011186 }
12021187
12031188 // LOGF(info, "Tracks: %d and %d entries", tracks1.size(), tracks2.size());
12041189
12051190 registry.fill (HIST (" eventcount_mixed" ), bin);
12061191 registry.fill (HIST (" trackcount_mixed" ), bin, tracks1.size (), tracks2.size ());
1207- fillCorrelations<CorrelationContainer::kCFStepReconstructed >(mixed, tracks1, tracks2, collision1.multiplicity (), collision1.posZ (), field, eventWeight);
1192+ if (fillRecoMixed) {
1193+ fillCorrelations<CorrelationContainer::kCFStepReconstructed >(mixed, tracks1, tracks2, collision1.multiplicity (), collision1.posZ (), field, eventWeight);
1194+ }
12081195
1209- if (cfg. mEfficiencyAssociated || cfg. mEfficiencyTrigger ) {
1196+ if (hasEfficiencyMixed ) {
12101197 if (it.isNewWindow ()) {
12111198 mixed->fillEvent (collision1.multiplicity (), CorrelationContainer::kCFStepCorrected );
12121199 }
@@ -1519,8 +1506,7 @@ struct CorrelationTask {
15191506 }
15201507 }
15211508
1522- Preslice<aod::CF2ProngTracks>
1523- perCollision2Prong = aod::cftrack::cfCollisionId;
1509+ Preslice<aod::CF2ProngTracks> perCollision2Prong = aod::cftrack::cfCollisionId;
15241510 void processMCEfficiency2Prong (soa::Filtered<aod::CFMcCollisions>::iterator const & mcCollision, soa::Join<aod::CFMcParticles, aod::CF2ProngMcParts> const & mcParticles, soa::SmallGroups<aod::CFCollisionsWithLabel> const & collisions, aod::CFTracksWithLabel const & tracks, aod::CF2ProngTracks const & p2tracks)
15251511 {
15261512 processMCEfficiency2ProngT<false >(mcCollision, mcParticles, collisions, tracks, p2tracks, perCollision2Prong);
0 commit comments