4848#include < cmath>
4949#include < cstdint>
5050#include < cstdlib>
51+ #include < tuple>
5152#include < type_traits>
5253#include < unordered_map>
5354#include < utility>
@@ -127,7 +128,8 @@ struct DeltaAnalysis {
127128 Configurable<bool > applyTPCChi2NClCut{" applyTPCChi2NClCut" , true , " Enable/disable maximum TPC chi2/NCl cut" };
128129 Configurable<bool > applyITSChi2NClCut{" applyITSChi2NClCut" , true , " Enable/disable maximum ITS chi2/NCl cut" };
129130 Configurable<bool > requirePrimaryTrack{" requirePrimaryTrack" , true , " Require isPrimaryTrack flag" };
130- Configurable<bool > requireGlobalTrack{" requireGlobalTrack" , true , " Require global track" };
131+ Configurable<bool > requireGlobalTrack{" requireGlobalTrack" , true , " Require global track (includes the DCA cuts of the standard global-track selection)" };
132+ Configurable<bool > requireGlobalTrackWoDCA{" requireGlobalTrackWoDCA" , false , " Require global track without DCA cuts (isGlobalTrackWoDCA). Mutually exclusive with requireGlobalTrack" };
131133 Configurable<bool > requirePVContributor{" requirePVContributor" , true , " Require PV-contributor flag" };
132134 } trackCuts;
133135
@@ -226,6 +228,11 @@ struct DeltaAnalysis {
226228 << " , bins=" << binsVec.size () << " )" ;
227229 }
228230 };
231+ if (trackCuts.requireGlobalTrack && trackCuts.requireGlobalTrackWoDCA ) {
232+ LOG (fatal) << " requireGlobalTrack and requireGlobalTrackWoDCA are mutually exclusive: "
233+ << " enable only one of them (or neither)." ;
234+ }
235+
229236 chkSz (protonPID.protonTPCNSigmaCutPerBin , protonPID.protonTPCPIDMomentumBins , " proton TPC PID" );
230237 chkSz (protonPID.protonTOFNSigmaCutPerBin , protonPID.protonTOFPIDMomentumBins , " proton TOF PID" );
231238 chkSz (pionPID.pionTPCNSigmaCutPerBin , pionPID.pionTPCPIDMomentumBins , " pion TPC PID" );
@@ -246,15 +253,15 @@ struct DeltaAnalysis {
246253 mPionDCAPtEdges = dcaCuts.pionDCAPtBinEdges .value ;
247254 mPionMaxDCAxy = dcaCuts.pionMaxDCAxyPerPtBin .value ;
248255
249- const AxisSpec ptAxis{50 , 0 ., 20 ., " p_{T} (GeV/c)" };
256+ const AxisSpec ptAxis{50 , 0 ., 12 ., " p_{T} (GeV/c)" };
250257 const AxisSpec massAxis{trackCuts.numberOfInvMassBins , 1.0 , 6.0 , " M_{inv} (GeV/#it{c}^{2})" };
251258 const AxisSpec centAxis{axes.cfgCentAxis , " Centrality (%)" };
252259 const AxisSpec vtxAxis{axes.cfgVtxAxis , " Vertex z [cm]" };
253260 const AxisSpec rapAxis{axes.cfgRapAxis , " Rapidity y" };
254261 const AxisSpec nSigmaTPCaxis{100 , -5 ., 5 ., " n#sigma^{TPC}" };
255262 const AxisSpec nSigmaTOFaxis{100 , -5 ., 5 ., " n#sigma^{TOF}" };
256- const AxisSpec momentumAxis{50 , 0 ., 20 ., " p (GeV/#it{c})" };
257- const AxisSpec ptForPIDAxis{50 , 0 ., 20 ., " p_{T} (GeV/#it{c})" };
263+ const AxisSpec momentumAxis{50 , 0 ., 12 ., " p (GeV/#it{c})" };
264+ const AxisSpec ptForPIDAxis{50 , 0 ., 12 ., " p_{T} (GeV/#it{c})" };
258265 const AxisSpec dcaXYaxis{200 , -0 .2f , 0 .2f , " DCA_{xy} (cm)" };
259266 const AxisSpec dcaZaxis{200 , -1 .2f , 1 .2f , " DCA_{z} (cm)" };
260267 const AxisSpec tpcClusAxis{200 , 0 , 200 , " N_{clusters}^{TPC}" };
@@ -757,6 +764,9 @@ struct DeltaAnalysis {
757764 if (trackCuts.requireGlobalTrack && !track.isGlobalTrack ()) {
758765 return false ;
759766 }
767+ if (trackCuts.requireGlobalTrackWoDCA && !track.isGlobalTrackWoDCA ()) {
768+ return false ;
769+ }
760770 if (trackCuts.requirePVContributor && !track.isPVContributor ()) {
761771 return false ;
762772 }
@@ -1429,18 +1439,6 @@ struct DeltaAnalysis {
14291439 using BinningTypeFV0A = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentFV0A>;
14301440 using BinningTypeNTPV = ColumnBinningPolicy<aod::collision::PosZ, aod::cent::CentNTPV>;
14311441
1432- BinningTypeFT0M binningFT0M{{axes.cfgVtxAxis , axes.cfgCentAxis }};
1433- BinningTypeFT0A binningFT0A{{axes.cfgVtxAxis , axes.cfgCentAxis }};
1434- BinningTypeFT0C binningFT0C{{axes.cfgVtxAxis , axes.cfgCentAxis }};
1435- BinningTypeFV0A binningFV0A{{axes.cfgVtxAxis , axes.cfgCentAxis }};
1436- BinningTypeNTPV binningNTPV{{axes.cfgVtxAxis , axes.cfgCentAxis }};
1437-
1438- SameKindPair<EventCandidates, TrackCandidates, BinningTypeFT0M> pairFT0M{binningFT0M, mixingCfg.cfgNoMixedEvents , -1 , &cache};
1439- SameKindPair<EventCandidates, TrackCandidates, BinningTypeFT0A> pairFT0A{binningFT0A, mixingCfg.cfgNoMixedEvents , -1 , &cache};
1440- SameKindPair<EventCandidates, TrackCandidates, BinningTypeFT0C> pairFT0C{binningFT0C, mixingCfg.cfgNoMixedEvents , -1 , &cache};
1441- SameKindPair<EventCandidates, TrackCandidates, BinningTypeFV0A> pairFV0A{binningFV0A, mixingCfg.cfgNoMixedEvents , -1 , &cache};
1442- SameKindPair<EventCandidates, TrackCandidates, BinningTypeNTPV> pairNTPV{binningNTPV, mixingCfg.cfgNoMixedEvents , -1 , &cache};
1443-
14441442 std::vector<TrackCandidate> mProtonPool ;
14451443 std::vector<TrackCandidate> mPionPool ;
14461444
@@ -1524,31 +1522,6 @@ struct DeltaAnalysis {
15241522 }
15251523 }
15261524
1527- void processMixedEvent (EventCandidates const &, TrackCandidates const &)
1528- {
1529- switch (evSel.cfgCentralityEstimator ) {
1530- case delta_analysis::kFT0M :
1531- runMixedEvent (pairFT0M);
1532- break ;
1533- case delta_analysis::kFT0A :
1534- runMixedEvent (pairFT0A);
1535- break ;
1536- case delta_analysis::kFT0C :
1537- runMixedEvent (pairFT0C);
1538- break ;
1539- case delta_analysis::kFV0A :
1540- runMixedEvent (pairFV0A);
1541- break ;
1542- case delta_analysis::kNTPV :
1543- runMixedEvent (pairNTPV);
1544- break ;
1545- default :
1546- runMixedEvent (pairFT0M);
1547- break ;
1548- }
1549- }
1550- PROCESS_SWITCH (DeltaAnalysis, processMixedEvent, " Process mixed event" , true );
1551-
15521525 // ── MC reconstructed event mixing ────────────────────────────────────────────────────────
15531526 // Mirrors runMixedEvent()/processMixedEvent() above exactly (same event-selection call, same
15541527 // "protons1+pions2" / "protons2+pions1" combinatorics, same centrality-estimator dispatch),
@@ -1574,32 +1547,57 @@ struct DeltaAnalysis {
15741547 }
15751548 }
15761549
1577- void processMCEventMixing (EventCandidates const &, TrackCandidates const &)
1550+ template <typename BinningType>
1551+ void runMixingWithBinning (EventCandidates const & collisions, TrackCandidates const & tracks, bool isMC)
15781552 {
1579- if (!mixingCfg.enableMCEventMixing ) {
1580- return ;
1553+ BinningType binning{{axes.cfgVtxAxis , axes.cfgCentAxis }, true };
1554+ const int nMixedEvents = mixingCfg.cfgNoMixedEvents ;
1555+ auto tracksTuple = std::make_tuple (tracks);
1556+ SameKindPair<EventCandidates, TrackCandidates, BinningType> mixingPair{binning, nMixedEvents, -1 , collisions, tracksTuple, &cache};
1557+ if (isMC) {
1558+ runMixedEventMC (mixingPair);
1559+ } else {
1560+ runMixedEvent (mixingPair);
15811561 }
1562+ }
1563+
1564+ void dispatchMixing (EventCandidates const & collisions, TrackCandidates const & tracks, bool isMC)
1565+ {
15821566 switch (evSel.cfgCentralityEstimator ) {
15831567 case delta_analysis::kFT0M :
1584- runMixedEventMC (pairFT0M );
1568+ runMixingWithBinning<BinningTypeFT0M>(collisions, tracks, isMC );
15851569 break ;
15861570 case delta_analysis::kFT0A :
1587- runMixedEventMC (pairFT0A );
1571+ runMixingWithBinning<BinningTypeFT0A>(collisions, tracks, isMC );
15881572 break ;
15891573 case delta_analysis::kFT0C :
1590- runMixedEventMC (pairFT0C );
1574+ runMixingWithBinning<BinningTypeFT0C>(collisions, tracks, isMC );
15911575 break ;
15921576 case delta_analysis::kFV0A :
1593- runMixedEventMC (pairFV0A );
1577+ runMixingWithBinning<BinningTypeFV0A>(collisions, tracks, isMC );
15941578 break ;
15951579 case delta_analysis::kNTPV :
1596- runMixedEventMC (pairNTPV );
1580+ runMixingWithBinning<BinningTypeNTPV>(collisions, tracks, isMC );
15971581 break ;
15981582 default :
1599- runMixedEventMC (pairFT0M );
1583+ runMixingWithBinning<BinningTypeFT0M>(collisions, tracks, isMC );
16001584 break ;
16011585 }
16021586 }
1587+
1588+ void processMixedEvent (EventCandidates const & collisions, TrackCandidates const & tracks)
1589+ {
1590+ dispatchMixing (collisions, tracks, false );
1591+ }
1592+ PROCESS_SWITCH (DeltaAnalysis, processMixedEvent, " Process mixed event" , true );
1593+
1594+ void processMCEventMixing (EventCandidates const & collisions, TrackCandidates const & tracks)
1595+ {
1596+ if (!mixingCfg.enableMCEventMixing ) {
1597+ return ;
1598+ }
1599+ dispatchMixing (collisions, tracks, true );
1600+ }
16031601 PROCESS_SWITCH (DeltaAnalysis, processMCEventMixing, " Process MC reconstructed event mixing (reuses DATA mixing pairs; no truth matching)" , false );
16041602
16051603 // =====================================================================================
0 commit comments