@@ -400,7 +400,8 @@ struct PseudorapidityDensityMFT {
400400 Configurable<bool > useTriggerTVX{" useTriggerTVX" , true , " Require kIsTriggerTVX in processGenReco" };
401401 Configurable<bool > useNoTimeFrameBorderCut{" useNoTimeFrameBorderCut" , true , " Require kNoTimeFrameBorder in processGenReco" };
402402 Configurable<bool > useNoITSROFrameBorderCut{" useNoITSROFrameBorderCut" , true , " Require kNoITSROFrameBorder in processGenReco" };
403-
403+ AxisSpec multAxisRecoMFT = {multBinning, " N_{ch}^{reco,MFT}" };
404+ AxisSpec multAxisGenMFT = {multBinning, " N_{ch}^{gen,MFT}" };
404405 HistogramRegistry registry{
405406 " registry" ,
406407 {
@@ -630,6 +631,22 @@ struct PseudorapidityDensityMFT {
630631 registry.add ({" Purity/reco/PNchMFT_afterCuts" ,
631632 " ;N_{trk}^{MFT} (selected);events" ,
632633 {HistType::kTH1F , {multAxis}}});
634+ // MC P(Nch) objects for MFT multiplicity unfolding/correction.
635+ // Generator multiplicity: primary charged particles in the MFT acceptance,
636+ // with generated INEL>0 defined from the central estimator.
637+ // Reco multiplicity: selected reassociated MFT tracks for matched accepted reco events.
638+ registry.add ({" PNchMC/gen_inelgt0" ,
639+ " ;N_{ch}^{gen,MFT};events" ,
640+ {HistType::kTH1F , {multAxisGenMFT}}});
641+
642+ registry.add ({" PNchMC/reco_sel8_inelgt0" ,
643+ " ;N_{ch}^{reco,MFT};events" ,
644+ {HistType::kTH1F , {multAxisRecoMFT}}});
645+
646+ registry.add ({" PNchMC/responseMatrix" ,
647+ " ;N_{ch}^{reco,MFT};N_{ch}^{gen,MFT};events" ,
648+ {HistType::kTH2F , {multAxisRecoMFT, multAxisGenMFT}}});
649+
633650 registry.add ({" Purity/DCAyVsDCAx_Right" ,
634651 " ;DCA_{x} (cm);DCA_{y} (cm)" ,
635652 {HistType::kTH2F , {dcaXAxis, dcaYAxis}}});
@@ -1214,6 +1231,27 @@ struct PseudorapidityDensityMFT {
12141231 " ; N_{Trk}^{nonamb}" ,
12151232 {HistType::kTH1F , {{701 , -0.5 , 700.5 }}}}); //
12161233
1234+ // Event-level P(Nch) distributions for reassociated MFT tracks.
1235+ // Fill once per collision after counting selected reassociated MFT tracks.
1236+ registry.add ({" PNch/MFT_sel8" ,
1237+ " ;N_{ch}^{MFT};events" ,
1238+ {HistType::kTH1F , {multAxis}}});
1239+ registry.add ({" PNch/MFT_sel8_inelgt0" ,
1240+ " ;N_{ch}^{MFT};events" ,
1241+ {HistType::kTH1F , {multAxis}}});
1242+ registry.add ({" PNch/MFT_sel8_inelfwdgt0" ,
1243+ " ;N_{ch}^{MFT};events" ,
1244+ {HistType::kTH1F , {multAxis}}});
1245+ registry.add ({" PNch/MFT_sel8_inelgt0_nonamb" ,
1246+ " ;N_{ch}^{MFT, nonamb};events" ,
1247+ {HistType::kTH1F , {multAxis}}});
1248+ registry.add ({" PNch/MFT_sel8_inelgt0_amb" ,
1249+ " ;N_{ch}^{MFT, amb};events" ,
1250+ {HistType::kTH1F , {multAxis}}});
1251+ registry.add ({" PNch/MFTZvtx_sel8_inelgt0" ,
1252+ " ;N_{ch}^{MFT};#it{z}_{vtx} (cm);events" ,
1253+ {HistType::kTH2F , {multAxis, zAxis}}});
1254+
12171255 registry.add ({" Tracks/Control/amb/AmbTracksPhiEta" ,
12181256 " ; #varphi; #eta; tracks" ,
12191257 {HistType::kTH2F , {phiAxis, etaBinning}}}); //
@@ -1542,6 +1580,10 @@ struct PseudorapidityDensityMFT {
15421580 std::unordered_set<int > eventsInelMFT;
15431581 std::unordered_set<int > eventsInel;
15441582
1583+ int64_t nMFTSelected{0 };
1584+ int64_t nMFTSelectedAmb{0 };
1585+ int64_t nMFTSelectedNonAmb{0 };
1586+
15451587 const auto fillDataCut = [&](DataCutBin bin) {
15461588 registry.fill (HIST (" EventSelectionData" ), static_cast <int >(bin));
15471589 };
@@ -1655,6 +1697,13 @@ struct PseudorapidityDensityMFT {
16551697 if (failTrackCuts) {
16561698 continue ;
16571699 }
1700+ ++nMFTSelected;
1701+ if (retrack.ambDegree () > SingleCompatibleCollision) {
1702+ ++nMFTSelectedAmb;
1703+ } else if (retrack.ambDegree () == SingleCompatibleCollision) {
1704+ ++nMFTSelectedNonAmb;
1705+ }
1706+
16581707 registry.fill (HIST (" Tracks/Control/TrackAmbDegree" ),
16591708 retrack.ambDegree ());
16601709 registry.fill (HIST (" Tracks/Control/DCAXY" ), retrack.bestDCAXY ());
@@ -1771,6 +1820,17 @@ struct PseudorapidityDensityMFT {
17711820 registry.fill (HIST (" Tracks/Control/nonamb/nTrkNonAmb" ), j);
17721821 registry.fill (HIST (" Tracks/Control/woOrp/nTrk" ), k);
17731822 registry.fill (HIST (" hNumCollisions_Inel" ), 1 , eventsInel.size ());
1823+
1824+ registry.fill (HIST (" PNch/MFT_sel8" ), nMFTSelected);
1825+ if (midtracks.size () > 0 ) {
1826+ registry.fill (HIST (" PNch/MFT_sel8_inelgt0" ), nMFTSelected);
1827+ registry.fill (HIST (" PNch/MFTZvtx_sel8_inelgt0" ), nMFTSelected, z);
1828+ registry.fill (HIST (" PNch/MFT_sel8_inelgt0_nonamb" ), nMFTSelectedNonAmb);
1829+ registry.fill (HIST (" PNch/MFT_sel8_inelgt0_amb" ), nMFTSelectedAmb);
1830+ if (nMFTSelected > 0 ) {
1831+ registry.fill (HIST (" PNch/MFT_sel8_inelfwdgt0" ), nMFTSelected);
1832+ }
1833+ }
17741834 }
17751835
17761836 void processMultReassoc (CollwEv::iterator const & collision,
@@ -2413,6 +2473,7 @@ struct PseudorapidityDensityMFT {
24132473 bool onlyVzGt0 = false ; // EtaZvtxGen_gt0t
24142474 bool atLeastOneSel8Vz = false ; // EtaZvtxGen
24152475 bool atLeastOneSel8VzGt0 = false ; // EtaZvtxGen_gt0
2476+ bool hasRecoCollisionForPNch{false };
24162477
24172478 const auto fillGenRecoCut = [&](GenRecoCutBin bin) {
24182479 registry.fill (HIST (" EventsRecoCuts_GenReco" ), static_cast <int >(bin));
@@ -2567,6 +2628,7 @@ struct PseudorapidityDensityMFT {
25672628 acceptedRecoCols.insert (recoCol);
25682629 recoCollisionIds.insert (recoCol);
25692630 trueMCCollisionIds.insert (mcCol);
2631+ hasRecoCollisionForPNch = true ;
25702632
25712633 if (mcCol >= 0 ) {
25722634 recoToMc[recoCol] = mcCol;
@@ -2603,7 +2665,9 @@ struct PseudorapidityDensityMFT {
26032665 int64_t woOrpCount = 0 ;
26042666 bool filledRight = false ;
26052667 bool filledWrong = false ;
2606- int nMftSelectedAfterCuts = 0 ;
2668+ int64_t nMftSelectedAfterCuts{0 };
2669+ int64_t nRecoMFTSelectedForPNch{0 };
2670+ int64_t nGenPrimaryChargedMFT{0 };
26072671 std::unordered_set<int > uniqueBestRecoCols;
26082672
26092673 if (tracks.size () > 0 ) {
@@ -2689,6 +2753,11 @@ struct PseudorapidityDensityMFT {
26892753 failDCAzCut = useDCAzCut && (std::abs (dcaZCut) > maxDCAz);
26902754 // std::cout <<" dcaZReco " <<dcaZReco<< " maxDCAz "<<maxDCAz<<std::endl;
26912755 }
2756+ if (failDCAzCut) {
2757+ continue ;
2758+ }
2759+
2760+ ++nRecoMFTSelectedForPNch;
26922761
26932762 const bool hasMcLabel = track.has_mcParticle ();
26942763 const bool isFakeByLabel = hasMcLabel ? (track.mcMask () != 0 ) : false ;
@@ -3227,6 +3296,26 @@ struct PseudorapidityDensityMFT {
32273296 }
32283297 }
32293298 }
3299+ if (particle.isPhysicalPrimary ()) {
3300+
3301+ ++nGenPrimaryChargedMFT;
3302+ }
3303+ }
3304+ }
3305+ if ((mcCollision.posZ () >= cfgVzCut1) && (mcCollision.posZ () <= cfgVzCut2)) {
3306+ if (nChargedCentral > 0 ) {
3307+
3308+ registry.fill (HIST (" PNchMC/gen_inelgt0" ),
3309+ nGenPrimaryChargedMFT);
3310+
3311+ if (hasRecoCollisionForPNch) {
3312+ registry.fill (HIST (" PNchMC/reco_sel8_inelgt0" ),
3313+ nRecoMFTSelectedForPNch);
3314+
3315+ registry.fill (HIST (" PNchMC/responseMatrix" ),
3316+ nRecoMFTSelectedForPNch,
3317+ nGenPrimaryChargedMFT);
3318+ }
32303319 }
32313320 }
32323321 }
0 commit comments