Skip to content

Commit 74a54a7

Browse files
tutripatalibuild
andauthored
[PWGLF] Adding event and track level qa histograms for MFT analysis (#16717)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 70406db commit 74a54a7

1 file changed

Lines changed: 91 additions & 2 deletions

File tree

PWGLF/Tasks/GlobalEventProperties/PseudorapidityDensityMFT.cxx

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)