@@ -116,20 +116,30 @@ struct TwoParticleCorrelationsMpi {
116116 Configurable<bool > cfgDropStepRECO{" cfgDropStepRECO" , false , " choice to drop step RECO if efficiency correction is used" };
117117 Configurable<int > cfgCentBinsForMC{" cfgCentBinsForMC" , 0 , " 0 = generated multiplicity; 1 = reconstructed multiplicity and all associated collisions" };
118118 } cfgGeneral;
119+ struct : ConfigurableGroup {
120+ Configurable<float > dcaxymax{" dcaxymax" , 999 .f , " maximum dcaxy of tracks" };
121+ Configurable<float > dcazmax{" dcazmax" , 999 .f , " maximum dcaz of tracks" };
122+ Configurable<bool > enablePtDepDCAxy{" enablePtDepDCAxy" , false , " Enable pT-dependent DCAxy cut: |DCAxy| < a + b/pT" };
123+ Configurable<float > dcaXyConst{" dcaXyConst" , 0 .004f , " Constant term 'a' for pT-dependent DCAxy cut: |DCAxy| < a + b/pT (cm)" };
124+ Configurable<float > dcaXySlope{" dcaXySlope" , 0 .013f , " Slope term 'b' for pT-dependent DCAxy cut: |DCAxy| < a + b/pT (cm x GeV/c)" };
125+ } cfgDCA;
119126 Configurable<uint16_t > cfgTrackBitMask{" cfgTrackBitMask" , 0 , " BitMask for track selection systematics; refer to the enum TrackSelectionCuts in filtering task" };
120127 Configurable<uint16_t > cfgMultCorrelationsMask{" cfgMultCorrelationsMask" , 0 , " Selection bitmask for the multiplicity correlations. This should match the filter selection cfgEstimatorBitMask." };
121128 Configurable<std::string> cfgMultCutFormula{" cfgMultCutFormula" , " " , " Multiplicity correlations cut formula. A result greater than zero results in accepted event. Parameters: [cFT0C] FT0C centrality, [mFV0A] V0A multiplicity, [mGlob] global track multiplicity, [mPV] PV track multiplicity, [cFT0M] FT0M centrality" };
122129
123130 // Suggested values: Photon: 0.004; K0 and Lambda: 0.005
124131 Configurable<LabeledArray<float >> cfgPairCut{" cfgPairCut" , {CfgPairCutDefaults.front ().data (), 5 , {" Photon" , " K0" , " Lambda" , " Phi" , " Rho" }}, " Pair cuts on various particles" };
125132
126- Configurable<std::string> cfgEfficiencyTrigger{" cfgEfficiencyTrigger" , " " , " CCDB path to efficiency object for trigger particles" };
127- Configurable<std::string> cfgEfficiencyAssociated{" cfgEfficiencyAssociated" , " " , " CCDB path to efficiency object for associated particles" };
128- Configurable<std::string> cfgAcceptance{" cfgAcceptance" , " " , " CCDB path to the GFW acceptance object" };
129- Configurable<bool > cfgFillAcceptanceWeights{" cfgFillAcceptanceWeights" , false , " Fill acceptance maps instead of physics outputs" };
130- Configurable<bool > cfgAcceptanceRunByRun{" cfgAcceptanceRunByRun" , false , " Fill or load run-by-run acceptance weights" };
131- Configurable<int > cfgAcceptancePhiBins{" cfgAcceptancePhiBins" , int {DefaultAcceptancePhiBins}, " Number of phi bins in acceptance maps" };
132- Configurable<int > cfgAcceptanceEtaBins{" cfgAcceptanceEtaBins" , int {DefaultAcceptanceEtaBins}, " Number of eta bins in acceptance maps" };
133+ struct : ConfigurableGroup {
134+ Configurable<std::string> cfgEfficiencyTrigger{" cfgEfficiencyTrigger" , " " , " CCDB path to efficiency object for trigger particles" };
135+ Configurable<std::string> cfgEfficiencyAssociated{" cfgEfficiencyAssociated" , " " , " CCDB path to efficiency object for associated particles" };
136+ Configurable<std::string> cfgAcceptance{" cfgAcceptance" , " " , " CCDB path to the GFW acceptance object" };
137+ Configurable<bool > cfgFillAcceptanceWeights{" cfgFillAcceptanceWeights" , false , " Fill acceptance maps instead of physics outputs" };
138+ Configurable<bool > cfgAcceptanceRunByRun{" cfgAcceptanceRunByRun" , false , " Fill or load run-by-run acceptance weights" };
139+ Configurable<int > cfgAcceptancePhiBins{" cfgAcceptancePhiBins" , int {DefaultAcceptancePhiBins}, " Number of phi bins in acceptance maps" };
140+ Configurable<int > cfgAcceptanceEtaBins{" cfgAcceptanceEtaBins" , int {DefaultAcceptanceEtaBins}, " Number of eta bins in acceptance maps" };
141+ } cfgCorrections;
142+
133143 Configurable<std::string> cfgNuncSeedsTemplateFile{" cfgNuncSeedsTemplateFile" , " " , " Local ROOT file containing ensembleYieldTemplates" };
134144 Configurable<std::string> cfgNuncSeedsTemplate{" cfgNuncSeedsTemplate" , " " , " CCDB path to the ensemble-yield template ccdb_object" };
135145 Configurable<float > cfgMinPairAcceptance{" cfgMinPairAcceptance" , 0 .05f , " Minimum pair acceptance used by the event seed estimator" };
@@ -182,7 +192,11 @@ struct TwoParticleCorrelationsMpi {
182192 Filter collisionVertexTypeFilter = (aod::collision::flags & static_cast <uint16_t >(aod::collision::CollisionFlagsRun2::Run2VertexerTracks)) == static_cast <uint16_t >(aod::collision::CollisionFlagsRun2::Run2VertexerTracks);
183193
184194 // Track filters
185- Filter trackFilter = (nabs(aod::track::eta) < cfgGeneral.cfgCutEta) && (aod::track::pt > cfgGeneral.cfgCutPt) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t )true ));
195+ Filter trackFilter = (nabs(aod::track::eta) < cfgGeneral.cfgCutEta) && (aod::track::pt > cfgGeneral.cfgCutPt) && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t )true )) &&
196+ (nabs(aod::track::dcaZ) < cfgDCA.dcazmax) &&
197+ ifnode (cfgDCA.enablePtDepDCAxy.node() == true,
198+ nabs(aod::track::dcaXY) < (cfgDCA.dcaXyConst + cfgDCA.dcaXySlope / aod::track::pt),
199+ nabs(aod::track::dcaXY) < cfgDCA.dcaxymax);
186200 Filter cfTrackFilter = (nabs(aod::cftrack::eta) < cfgGeneral.cfgCutEta) && (aod::cftrack::pt > cfgGeneral.cfgCutPt) && ncheckbit(aod::track::trackType, as<uint8_t >(cfgTrackBitMask));
187201
188202 // MC filters
@@ -327,7 +341,7 @@ struct TwoParticleCorrelationsMpi {
327341 Service<o2::framework::O2DatabasePDG> pdg{};
328342
329343 using AodCollisions = soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CentRun2V0Ms>>;
330- using AodTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection>>;
344+ using AodTracks = soa::Filtered<soa::Join<aod::Tracks, aod::TrackSelection, aod::TracksDCA >>;
331345
332346 using DerivedCollisions = soa::Filtered<aod::CFCollisions>;
333347 using DerivedCollisionsCorrected = soa::Filtered<aod::CFCollisionsWithExtra>;
@@ -361,16 +375,16 @@ struct TwoParticleCorrelationsMpi {
361375 (!(doprocessSameGenMC || doprocessMCSameDerived) ||
362376 doprocessSameAOD || enabledDerivedSameProcesses > 0 ||
363377 doprocessMixedAOD || enabledDerivedMixedProcesses > 0 || doprocessMCMixedDerived ||
364- cfgGeneral.cfgCentBinsForMC != 0 || cfgFillAcceptanceWeights)) {
378+ cfgGeneral.cfgCentBinsForMC != 0 || cfgCorrections. cfgFillAcceptanceWeights )) {
365379 LOGF (fatal, " cfgUserAxis=3 supports generated MC same events only: enable processSameGenMC or processMCSameDerived and disable all other same/mixed processes" );
366380 }
367- if (cfgFillAcceptanceWeights && !cfgAcceptance.value .empty ()) {
381+ if (cfgCorrections. cfgFillAcceptanceWeights && !cfgCorrections. cfgAcceptance .value .empty ()) {
368382 LOGF (fatal, " cfgFillAcceptanceWeights and cfgAcceptance are mutually exclusive: produce and apply acceptance weights in separate jobs" );
369383 }
370- if (cfgFillAcceptanceWeights && !(doprocessSameDerived || doprocessSameDerivedCorrected || doprocessSameDerivedMultSet || doprocessSameDerivedMultSetCorrected || doprocessMCSameDerived)) {
384+ if (cfgCorrections. cfgFillAcceptanceWeights && !(doprocessSameDerived || doprocessSameDerivedCorrected || doprocessSameDerivedMultSet || doprocessSameDerivedMultSetCorrected || doprocessMCSameDerived)) {
371385 LOGF (fatal, " cfgFillAcceptanceWeights requires a reconstructed derived same-event process" );
372386 }
373- if (cfgAcceptancePhiBins < 1 || cfgAcceptanceEtaBins < 1 ) {
387+ if (cfgCorrections. cfgAcceptancePhiBins < 1 || cfgCorrections. cfgAcceptanceEtaBins < 1 ) {
374388 LOGF (fatal, " Acceptance-map bin counts must be positive" );
375389 }
376390 if (!cfgNuncSeedsTemplateFile.value .empty () && !cfgNuncSeedsTemplate.value .empty ()) {
@@ -531,9 +545,9 @@ struct TwoParticleCorrelationsMpi {
531545 registry.add (" eventcount_mixed" , " bin" , {HistType::kTH1F , {{maxMixBin + 2 , -2.5 , -0.5 + maxMixBin, " bin" }}});
532546 registry.add (" trackcount_same" , " bin" , {HistType::kTH2F , {{maxMixBin + 2 , -2.5 , -0.5 + maxMixBin, " bin" }, {10 , -0.5 , 9.5 }}});
533547 registry.add (" trackcount_mixed" , " bin" , {HistType::kTH3F , {{maxMixBin + 2 , -2.5 , -0.5 + maxMixBin, " bin" }, {10 , -0.5 , 9.5 }, {10 , -0.5 , 9.5 }}});
534- if (cfgFillAcceptanceWeights && !cfgAcceptanceRunByRun) {
535- AxisSpec phiAxis{cfgAcceptancePhiBins, 0 ., o2::constants::math::TwoPI, " #varphi" };
536- AxisSpec etaAxis{cfgAcceptanceEtaBins, -cfgGeneral.cfgCutEta .value , cfgGeneral.cfgCutEta .value , " #eta" };
548+ if (cfgCorrections. cfgFillAcceptanceWeights && !cfgCorrections. cfgAcceptanceRunByRun ) {
549+ AxisSpec phiAxis{cfgCorrections. cfgAcceptancePhiBins , 0 ., o2::constants::math::TwoPI, " #varphi" };
550+ AxisSpec etaAxis{cfgCorrections. cfgAcceptanceEtaBins , -cfgGeneral.cfgCutEta .value , cfgGeneral.cfgCutEta .value , " #eta" };
537551 mAcceptanceWeights = registry.add <TH3 >(" phi_eta_vtxz_ref" , " Reference-track acceptance;#varphi;#eta;z_{vtx} (cm)" , {HistType::kTH3D , {phiAxis, etaAxis, axisVertex}});
538552 }
539553
@@ -606,7 +620,7 @@ struct TwoParticleCorrelationsMpi {
606620 same->setTrackEtaCut (cfgGeneral.cfgCutEta );
607621 mixed->setTrackEtaCut (cfgGeneral.cfgCutEta );
608622
609- if (!cfgEfficiencyAssociated.value .empty ()) {
623+ if (!cfgCorrections. cfgEfficiencyAssociated .value .empty ()) {
610624 efficiencyAssociatedCache.reserve (512 );
611625 }
612626
@@ -655,7 +669,7 @@ struct TwoParticleCorrelationsMpi {
655669 ++nPtPtSubevents;
656670 }
657671
658- if (!cfgFillAcceptanceWeights && (doprocessMCSameDerived || doprocessSameDerived || doprocessSameDerivedCorrected || doprocessSameDerivedMultSet || doprocessSameDerivedMultSetCorrected)) {
672+ if (!cfgCorrections. cfgFillAcceptanceWeights && (doprocessMCSameDerived || doprocessSameDerived || doprocessSameDerivedCorrected || doprocessSameDerivedMultSet || doprocessSameDerivedMultSetCorrected)) {
659673 auto recoProfiles = std::make_unique<TObjArray>();
660674 addConfigObjectsToObjArray (recoProfiles.get (), mCorrConfigs , cfgUserAxis == EventSeedAxis && eventClassifierPercentileAxisEnabled);
661675 fFC .setObject (new FlowContainer (" FlowContainer" ));
@@ -669,7 +683,7 @@ struct TwoParticleCorrelationsMpi {
669683 fFCpt ->initialise (axisMultiplicity, MaxPtCorrelationOrder, cfgCorrConfig.value , FlowNBootstrap);
670684 fFCpt ->initialiseSubevent (axisMultiplicity, MaxPtCorrelationOrder, nPtPtSubevents, FlowNBootstrap);
671685 }
672- if (!cfgFillAcceptanceWeights && (doprocessMCSameDerived || doprocessSameGenMC)) {
686+ if (!cfgCorrections. cfgFillAcceptanceWeights && (doprocessMCSameDerived || doprocessSameGenMC)) {
673687 auto generatedProfiles = std::make_unique<TObjArray>();
674688 addConfigObjectsToObjArray (generatedProfiles.get (), mCorrConfigs , cfgUserAxis == NMPIAxis && eventClassifierPercentileAxisEnabled);
675689 fFCGen .setObject (new FlowContainer (" FlowContainer_gen" ));
@@ -862,8 +876,8 @@ struct TwoParticleCorrelationsMpi {
862876 return existing->second ;
863877 }
864878
865- AxisSpec phiAxis{cfgAcceptancePhiBins, 0 ., o2::constants::math::TwoPI, " #varphi" };
866- AxisSpec etaAxis{cfgAcceptanceEtaBins, -cfgGeneral.cfgCutEta .value , cfgGeneral.cfgCutEta .value , " #eta" };
879+ AxisSpec phiAxis{cfgCorrections. cfgAcceptancePhiBins , 0 ., o2::constants::math::TwoPI, " #varphi" };
880+ AxisSpec etaAxis{cfgCorrections. cfgAcceptanceEtaBins , -cfgGeneral.cfgCutEta .value , cfgGeneral.cfgCutEta .value , " #eta" };
867881 const std::string histogramName = Form (" %d/phi_eta_vtxz_ref" , runNumber);
868882 const auto histogram = registry.add <TH3 >(histogramName.c_str (), " Reference-track acceptance;#varphi;#eta;z_{vtx} (cm)" , {HistType::kTH3D , {phiAxis, etaAxis, axisVertex}});
869883 mAcceptanceWeightsByRun .emplace (runNumber, histogram);
@@ -876,7 +890,7 @@ struct TwoParticleCorrelationsMpi {
876890 if (track.pt () <= fPtAxis ->GetXmin () || track.pt () >= fPtAxis ->GetXmax ()) {
877891 return ;
878892 }
879- const auto histogram = cfgAcceptanceRunByRun ? getAcceptanceWeightsForRun (runNumber) : mAcceptanceWeights ;
893+ const auto histogram = cfgCorrections. cfgAcceptanceRunByRun ? getAcceptanceWeightsForRun (runNumber) : mAcceptanceWeights ;
880894 histogram->Fill (track.phi (), track.eta (), posZ);
881895 }
882896
@@ -1983,46 +1997,46 @@ struct TwoParticleCorrelationsMpi {
19831997 if (cfg.efficiencyLoaded ) {
19841998 return ;
19851999 }
1986- if (!cfgEfficiencyTrigger.value .empty ()) {
2000+ if (!cfgCorrections. cfgEfficiencyTrigger .value .empty ()) {
19872001 if (cfgGeneral.cfgLocalEfficiency > 0 ) {
1988- TFile* fEfficiencyTrigger = TFile::Open (cfgEfficiencyTrigger.value .c_str (), " READ" );
2002+ TFile* fEfficiencyTrigger = TFile::Open (cfgCorrections. cfgEfficiencyTrigger .value .c_str (), " READ" );
19892003 cfg.mEfficiencyTrigger = dynamic_cast <THn*>(fEfficiencyTrigger ->Get (" ccdb_object" ));
19902004 } else {
1991- cfg.mEfficiencyTrigger = ccdb->getForTimeStamp <THnT<float >>(cfgEfficiencyTrigger, timestamp);
2005+ cfg.mEfficiencyTrigger = ccdb->getForTimeStamp <THnT<float >>(cfgCorrections. cfgEfficiencyTrigger , timestamp);
19922006 }
19932007 if (cfg.mEfficiencyTrigger == nullptr ) {
1994- LOGF (fatal, " Could not load efficiency histogram for trigger particles from %s" , cfgEfficiencyTrigger.value .c_str ());
2008+ LOGF (fatal, " Could not load efficiency histogram for trigger particles from %s" , cfgCorrections. cfgEfficiencyTrigger .value .c_str ());
19952009 }
1996- LOGF (info, " Loaded efficiency histogram for trigger particles from %s" , cfgEfficiencyTrigger.value .c_str ());
2010+ LOGF (info, " Loaded efficiency histogram for trigger particles from %s" , cfgCorrections. cfgEfficiencyTrigger .value .c_str ());
19972011 }
1998- if (!cfgEfficiencyAssociated.value .empty ()) {
2012+ if (!cfgCorrections. cfgEfficiencyAssociated .value .empty ()) {
19992013 if (cfgGeneral.cfgLocalEfficiency > 0 ) {
2000- TFile* fEfficiencyAssociated = TFile::Open (cfgEfficiencyAssociated.value .c_str (), " READ" );
2014+ TFile* fEfficiencyAssociated = TFile::Open (cfgCorrections. cfgEfficiencyAssociated .value .c_str (), " READ" );
20012015 cfg.mEfficiencyAssociated = dynamic_cast <THn*>(fEfficiencyAssociated ->Get (" ccdb_object" ));
20022016 } else {
2003- cfg.mEfficiencyAssociated = ccdb->getForTimeStamp <THnT<float >>(cfgEfficiencyAssociated, timestamp);
2017+ cfg.mEfficiencyAssociated = ccdb->getForTimeStamp <THnT<float >>(cfgCorrections. cfgEfficiencyAssociated , timestamp);
20042018 }
20052019 if (cfg.mEfficiencyAssociated == nullptr ) {
2006- LOGF (fatal, " Could not load efficiency histogram for associated particles from %s" , cfgEfficiencyAssociated.value .c_str ());
2020+ LOGF (fatal, " Could not load efficiency histogram for associated particles from %s" , cfgCorrections. cfgEfficiencyAssociated .value .c_str ());
20072021 }
2008- LOGF (info, " Loaded efficiency histogram for associated particles from %s" , cfgEfficiencyAssociated.value .c_str ());
2022+ LOGF (info, " Loaded efficiency histogram for associated particles from %s" , cfgCorrections. cfgEfficiencyAssociated .value .c_str ());
20092023 }
20102024 cfg.efficiencyLoaded = true ;
20112025 }
20122026
20132027 void loadAcceptance (const uint64_t timestamp, const int runNumber)
20142028 {
2015- if (cfgFillAcceptanceWeights || cfgAcceptance.value .empty ()) {
2029+ if (cfgCorrections. cfgFillAcceptanceWeights || cfgCorrections. cfgAcceptance .value .empty ()) {
20162030 cfg.mAcceptance = nullptr ;
20172031 cfg.acceptanceLoaded = true ;
20182032 return ;
20192033 }
2020- if (cfg.acceptanceLoaded && (!cfgAcceptanceRunByRun || cfg.acceptanceRunNumber == runNumber)) {
2034+ if (cfg.acceptanceLoaded && (!cfgCorrections. cfgAcceptanceRunByRun || cfg.acceptanceRunNumber == runNumber)) {
20212035 return ;
20222036 }
20232037
2024- std::string path = cfgAcceptance.value ;
2025- if (cfgAcceptanceRunByRun) {
2038+ std::string path = cfgCorrections. cfgAcceptance .value ;
2039+ if (cfgCorrections. cfgAcceptanceRunByRun ) {
20262040 if (path.back () != ' /' ) {
20272041 path += ' /' ;
20282042 }
@@ -2099,7 +2113,7 @@ struct TwoParticleCorrelationsMpi {
20992113 soa::Filtered<aod::CFMcParticles> const & mcParticles,
21002114 soa::SmallGroups<aod::CFCollisionsWithLabel> const & collisions)
21012115 {
2102- if (cfgFillAcceptanceWeights) {
2116+ if (cfgCorrections. cfgFillAcceptanceWeights ) {
21032117 return ;
21042118 }
21052119 if (cfgUserAxis == NMPIAxis && mcCollision.nMPI () < 0 ) {
@@ -2168,7 +2182,7 @@ struct TwoParticleCorrelationsMpi {
21682182 if (cfgVerbosity > 0 ) {
21692183 LOGF (info, " processSameDerivedT: Tracks for collision: %d/%d | Vertex: %.1f | Multiplicity/Centrality: %.1f" , tracks1.size (), tracks2.size (), collision.posZ (), multiplicity);
21702184 }
2171- if (cfgFillAcceptanceWeights) {
2185+ if (cfgCorrections. cfgFillAcceptanceWeights ) {
21722186 for (const auto & track : tracks2) {
21732187 fillAcceptanceWeights (track, collision.posZ (), collision.runNumber ());
21742188 }
@@ -2433,7 +2447,7 @@ struct TwoParticleCorrelationsMpi {
24332447 template <class McCollision , class Particles1 , class Particles2 >
24342448 void processMCSameDerivedT (McCollision const & mcCollision, Particles1 const & mcParticles1, Particles2 const & mcParticles2, soa::SmallGroups<aod::CFCollisionsWithLabel> const & collisions)
24352449 {
2436- if (cfgFillAcceptanceWeights) {
2450+ if (cfgCorrections. cfgFillAcceptanceWeights ) {
24372451 return ;
24382452 }
24392453 if (cfgUserAxis == NMPIAxis && mcCollision.nMPI () < 0 ) {
0 commit comments