@@ -102,6 +102,8 @@ AxisSpec recoTruthStatusAxis = {2, 0.5, 2.5, "status"};
102102AxisSpec deltaVxAxis = {400 , -0.5 , 0.5 , " #DeltaV_{x} = V_{x}^{rec}-V_{x}^{true} (cm)" };
103103AxisSpec deltaVyAxis = {400 , -0.5 , 0.5 , " #DeltaV_{y} = V_{y}^{rec}-V_{y}^{true} (cm)" };
104104
105+
106+
105107static constexpr TrackSelectionFlags::flagtype TrackSelectionIts =
106108 TrackSelectionFlags::kITSNCls | TrackSelectionFlags::kITSChi2NDF |
107109 TrackSelectionFlags::kITSHits ;
@@ -400,7 +402,8 @@ struct PseudorapidityDensityMFT {
400402 Configurable<bool > useTriggerTVX{" useTriggerTVX" , true , " Require kIsTriggerTVX in processGenReco" };
401403 Configurable<bool > useNoTimeFrameBorderCut{" useNoTimeFrameBorderCut" , true , " Require kNoTimeFrameBorder in processGenReco" };
402404 Configurable<bool > useNoITSROFrameBorderCut{" useNoITSROFrameBorderCut" , true , " Require kNoITSROFrameBorder in processGenReco" };
403-
405+ AxisSpec multAxisRecoMFT = {multBinning, " N_{ch}^{reco,MFT}" };
406+ AxisSpec multAxisGenMFT = {multBinning, " N_{ch}^{gen,MFT}" };
404407 HistogramRegistry registry{
405408 " registry" ,
406409 {
@@ -630,6 +633,22 @@ struct PseudorapidityDensityMFT {
630633 registry.add ({" Purity/reco/PNchMFT_afterCuts" ,
631634 " ;N_{trk}^{MFT} (selected);events" ,
632635 {HistType::kTH1F , {multAxis}}});
636+ // MC P(Nch) objects for MFT multiplicity unfolding/correction.
637+ // Generator multiplicity: primary charged particles in the MFT acceptance,
638+ // with generated INEL>0 defined from the central estimator.
639+ // Reco multiplicity: selected reassociated MFT tracks for matched accepted reco events.
640+ registry.add ({" PNchMC/gen_inelgt0" ,
641+ " ;N_{ch}^{gen,MFT};events" ,
642+ {HistType::kTH1F , {multAxisGenMFT}}});
643+
644+ registry.add ({" PNchMC/reco_sel8_inelgt0" ,
645+ " ;N_{ch}^{reco,MFT};events" ,
646+ {HistType::kTH1F , {multAxisRecoMFT}}});
647+
648+ registry.add ({" PNchMC/responseMatrix" ,
649+ " ;N_{ch}^{reco,MFT};N_{ch}^{gen,MFT};events" ,
650+ {HistType::kTH2F , {multAxisRecoMFT, multAxisGenMFT}}});
651+
633652 registry.add ({" Purity/DCAyVsDCAx_Right" ,
634653 " ;DCA_{x} (cm);DCA_{y} (cm)" ,
635654 {HistType::kTH2F , {dcaXAxis, dcaYAxis}}});
@@ -1214,6 +1233,27 @@ struct PseudorapidityDensityMFT {
12141233 " ; N_{Trk}^{nonamb}" ,
12151234 {HistType::kTH1F , {{701 , -0.5 , 700.5 }}}}); //
12161235
1236+ // Event-level P(Nch) distributions for reassociated MFT tracks.
1237+ // Fill once per collision after counting selected reassociated MFT tracks.
1238+ registry.add ({" PNch/MFT_sel8" ,
1239+ " ;N_{ch}^{MFT};events" ,
1240+ {HistType::kTH1F , {multAxis}}});
1241+ registry.add ({" PNch/MFT_sel8_inelgt0" ,
1242+ " ;N_{ch}^{MFT};events" ,
1243+ {HistType::kTH1F , {multAxis}}});
1244+ registry.add ({" PNch/MFT_sel8_inelfwdgt0" ,
1245+ " ;N_{ch}^{MFT};events" ,
1246+ {HistType::kTH1F , {multAxis}}});
1247+ registry.add ({" PNch/MFT_sel8_inelgt0_nonamb" ,
1248+ " ;N_{ch}^{MFT, nonamb};events" ,
1249+ {HistType::kTH1F , {multAxis}}});
1250+ registry.add ({" PNch/MFT_sel8_inelgt0_amb" ,
1251+ " ;N_{ch}^{MFT, amb};events" ,
1252+ {HistType::kTH1F , {multAxis}}});
1253+ registry.add ({" PNch/MFTZvtx_sel8_inelgt0" ,
1254+ " ;N_{ch}^{MFT};#it{z}_{vtx} (cm);events" ,
1255+ {HistType::kTH2F , {multAxis, zAxis}}});
1256+
12171257 registry.add ({" Tracks/Control/amb/AmbTracksPhiEta" ,
12181258 " ; #varphi; #eta; tracks" ,
12191259 {HistType::kTH2F , {phiAxis, etaBinning}}}); //
@@ -1542,6 +1582,10 @@ struct PseudorapidityDensityMFT {
15421582 std::unordered_set<int > eventsInelMFT;
15431583 std::unordered_set<int > eventsInel;
15441584
1585+ int64_t nMFTSelected{0 };
1586+ int64_t nMFTSelectedAmb{0 };
1587+ int64_t nMFTSelectedNonAmb{0 };
1588+
15451589 const auto fillDataCut = [&](DataCutBin bin) {
15461590 registry.fill (HIST (" EventSelectionData" ), static_cast <int >(bin));
15471591 };
@@ -1655,6 +1699,13 @@ struct PseudorapidityDensityMFT {
16551699 if (failTrackCuts) {
16561700 continue ;
16571701 }
1702+ ++nMFTSelected;
1703+ if (retrack.ambDegree () > SingleCompatibleCollision) {
1704+ ++nMFTSelectedAmb;
1705+ } else if (retrack.ambDegree () == SingleCompatibleCollision) {
1706+ ++nMFTSelectedNonAmb;
1707+ }
1708+
16581709 registry.fill (HIST (" Tracks/Control/TrackAmbDegree" ),
16591710 retrack.ambDegree ());
16601711 registry.fill (HIST (" Tracks/Control/DCAXY" ), retrack.bestDCAXY ());
@@ -1771,6 +1822,17 @@ struct PseudorapidityDensityMFT {
17711822 registry.fill (HIST (" Tracks/Control/nonamb/nTrkNonAmb" ), j);
17721823 registry.fill (HIST (" Tracks/Control/woOrp/nTrk" ), k);
17731824 registry.fill (HIST (" hNumCollisions_Inel" ), 1 , eventsInel.size ());
1825+
1826+ registry.fill (HIST (" PNch/MFT_sel8" ), nMFTSelected);
1827+ if (midtracks.size () > 0 ) {
1828+ registry.fill (HIST (" PNch/MFT_sel8_inelgt0" ), nMFTSelected);
1829+ registry.fill (HIST (" PNch/MFTZvtx_sel8_inelgt0" ), nMFTSelected, z);
1830+ registry.fill (HIST (" PNch/MFT_sel8_inelgt0_nonamb" ), nMFTSelectedNonAmb);
1831+ registry.fill (HIST (" PNch/MFT_sel8_inelgt0_amb" ), nMFTSelectedAmb);
1832+ if (nMFTSelected > 0 ) {
1833+ registry.fill (HIST (" PNch/MFT_sel8_inelfwdgt0" ), nMFTSelected);
1834+ }
1835+ }
17741836 }
17751837
17761838 void processMultReassoc (CollwEv::iterator const & collision,
@@ -2234,6 +2296,7 @@ struct PseudorapidityDensityMFT {
22342296 acceptedRecoCols.insert (recoCol);
22352297 recoCollisionIds.insert (recoCol);
22362298 trueMCCollisionIds.insert (mcCol);
2299+
22372300
22382301 if (mcCol >= 0 ) {
22392302 recoToMc[recoCol] = mcCol;
@@ -2413,6 +2476,8 @@ struct PseudorapidityDensityMFT {
24132476 bool onlyVzGt0 = false ; // EtaZvtxGen_gt0t
24142477 bool atLeastOneSel8Vz = false ; // EtaZvtxGen
24152478 bool atLeastOneSel8VzGt0 = false ; // EtaZvtxGen_gt0
2479+ bool hasRecoCollisionForPNch{false };
2480+
24162481
24172482 const auto fillGenRecoCut = [&](GenRecoCutBin bin) {
24182483 registry.fill (HIST (" EventsRecoCuts_GenReco" ), static_cast <int >(bin));
@@ -2542,6 +2607,7 @@ struct PseudorapidityDensityMFT {
25422607 atLeastOneSel8VzGt0 = true ;
25432608 registry.fill (HIST (" EventsNtrkZvtxGen_gt0" ),
25442609 perCollisionSample.size (), collision.posZ ());
2610+
25452611 }
25462612 registry.fill (HIST (" EventsZposDiff" ),
25472613 collision.posZ () - mcCollision.posZ ());
@@ -2567,6 +2633,7 @@ struct PseudorapidityDensityMFT {
25672633 acceptedRecoCols.insert (recoCol);
25682634 recoCollisionIds.insert (recoCol);
25692635 trueMCCollisionIds.insert (mcCol);
2636+ hasRecoCollisionForPNch = true ;
25702637
25712638 if (mcCol >= 0 ) {
25722639 recoToMc[recoCol] = mcCol;
@@ -2603,7 +2670,9 @@ struct PseudorapidityDensityMFT {
26032670 int64_t woOrpCount = 0 ;
26042671 bool filledRight = false ;
26052672 bool filledWrong = false ;
2606- int nMftSelectedAfterCuts = 0 ;
2673+ int64_t nMftSelectedAfterCuts{0 };
2674+ int64_t nRecoMFTSelectedForPNch{0 };
2675+ int64_t nGenPrimaryChargedMFT{0 };
26072676 std::unordered_set<int > uniqueBestRecoCols;
26082677
26092678 if (tracks.size () > 0 ) {
@@ -2689,6 +2758,11 @@ struct PseudorapidityDensityMFT {
26892758 failDCAzCut = useDCAzCut && (std::abs (dcaZCut) > maxDCAz);
26902759 // std::cout <<" dcaZReco " <<dcaZReco<< " maxDCAz "<<maxDCAz<<std::endl;
26912760 }
2761+ if (failDCAzCut) {
2762+ continue ;
2763+ }
2764+
2765+ ++nRecoMFTSelectedForPNch;
26922766
26932767 const bool hasMcLabel = track.has_mcParticle ();
26942768 const bool isFakeByLabel = hasMcLabel ? (track.mcMask () != 0 ) : false ;
@@ -3227,6 +3301,26 @@ struct PseudorapidityDensityMFT {
32273301 }
32283302 }
32293303 }
3304+ if (particle.isPhysicalPrimary ()) {
3305+
3306+ ++nGenPrimaryChargedMFT;
3307+ }
3308+ }
3309+ }
3310+ if ((mcCollision.posZ () >= cfgVzCut1) && (mcCollision.posZ () <= cfgVzCut2)) {
3311+ if (nChargedCentral > 0 ) {
3312+
3313+ registry.fill (HIST (" PNchMC/gen_inelgt0" ),
3314+ nGenPrimaryChargedMFT);
3315+
3316+ if (hasRecoCollisionForPNch) {
3317+ registry.fill (HIST (" PNchMC/reco_sel8_inelgt0" ),
3318+ nRecoMFTSelectedForPNch);
3319+
3320+ registry.fill (HIST (" PNchMC/responseMatrix" ),
3321+ nRecoMFTSelectedForPNch,
3322+ nGenPrimaryChargedMFT);
3323+ }
32303324 }
32313325 }
32323326 }
@@ -3259,4 +3353,4 @@ struct PseudorapidityDensityMFT {
32593353WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
32603354{
32613355 return WorkflowSpec{adaptAnalysisTask<PseudorapidityDensityMFT>(cfgc)};
3262- }
3356+ }
0 commit comments