Skip to content

Commit 98cfb1e

Browse files
committed
Adding event and track level qa histograms for MFT analysis
1 parent 3d54be1 commit 98cfb1e

1 file changed

Lines changed: 97 additions & 3 deletions

File tree

PWGLF/Tasks/GlobalEventProperties/PseudorapidityDensityMFT.cxx

Lines changed: 97 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ AxisSpec recoTruthStatusAxis = {2, 0.5, 2.5, "status"};
102102
AxisSpec deltaVxAxis = {400, -0.5, 0.5, "#DeltaV_{x} = V_{x}^{rec}-V_{x}^{true} (cm)"};
103103
AxisSpec deltaVyAxis = {400, -0.5, 0.5, "#DeltaV_{y} = V_{y}^{rec}-V_{y}^{true} (cm)"};
104104

105+
106+
105107
static 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 {
32593353
WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)
32603354
{
32613355
return WorkflowSpec{adaptAnalysisTask<PseudorapidityDensityMFT>(cfgc)};
3262-
}
3356+
}

0 commit comments

Comments
 (0)