Skip to content

Commit 6a210ce

Browse files
[PWGCF] IdentifiedBfFilter.cxx Added checks for PID for MC tracks (#10490)
Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent a5fb760 commit 6a210ce

File tree

1 file changed

+108
-45
lines changed

1 file changed

+108
-45
lines changed

PWGCF/TwoParticleCorrelations/TableProducer/identifiedBfFilter.cxx

Lines changed: 108 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,12 @@ TH2F* fhAmbiguousTrackPt = nullptr;
153153
TH2F* fhAmbiguityDegree = nullptr;
154154
TH2F* fhCompatibleCollisionsZVtxRms = nullptr;
155155

156+
TH2S* fhTruePIDMismatch = nullptr;
157+
TH1S* fhTruePIDCorrect = nullptr;
158+
159+
TH2F* fhTrueNSigmaTPC[kIdBfNoOfSpecies] = {nullptr};
160+
TH2F* fhTrueNSigmaTOF[kIdBfNoOfSpecies] = {nullptr};
161+
156162
TH1F* fhTrueCentMultB = nullptr;
157163
TH1F* fhTrueCentMultA = nullptr;
158164
TH1F* fhTrueVertexZB = nullptr;
@@ -959,6 +965,9 @@ struct IdentifiedBfFilterTracks {
959965
if ((fDataType != kData) && (fDataType != kDataNoEvtSel)) {
960966
/* create the true data histograms */
961967

968+
fhTruePIDMismatch = new TH2S("fHistTruePIDMismatch", "Mismatched Generated and Reconstructed PID;Generated Species;Reconstructed Species", kIdBfNoOfSpecies, 0, kIdBfNoOfSpecies, kIdBfNoOfSpecies, 0, kIdBfNoOfSpecies);
969+
fhTruePIDCorrect = new TH1S("fHistTruePIDCorrect", "Correct PID between Generated and Reconstructed PID;Species", kIdBfNoOfSpecies, 0, kIdBfNoOfSpecies);
970+
962971
fhTruePB = new TH1F("fTrueHistPB", "p distribution before (truth);p (GeV/c);dN/dp (c/GeV)", 100, 0.0, 15.0);
963972
fhTrueCharge = new TH1F("fTrueHistCharge", "Charge distribution before (truth);charge;count", 3, -1.0, 1.0);
964973

@@ -1016,7 +1025,21 @@ struct IdentifiedBfFilterTracks {
10161025
79, -39.5, 39.5);
10171026
}
10181027

1028+
for (int sp = 0; sp < kIdBfNoOfSpecies; ++sp) {
1029+
fhTrueNSigmaTPC[sp] = new TH2F(TString::Format("fhTrueNSigmaTPC_%s", speciesName[sp]).Data(),
1030+
TString::Format("N #sigma from TPC vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(),
1031+
48, -6, 6,
1032+
ptbins, ptlow, ptup);
1033+
1034+
fhTrueNSigmaTOF[sp] = new TH2F(TString::Format("fhTrueNSigmaTOF_%s", speciesName[sp]).Data(),
1035+
TString::Format("N #sigma from TOF vs P for generated %s;N #sigma;p (GeV/c)", speciesTitle[sp]).Data(),
1036+
48, -6, 6,
1037+
ptbins, ptlow, ptup);
1038+
}
1039+
10191040
/* add the hstograms to the output list */
1041+
fOutputList->Add(fhTruePIDMismatch);
1042+
fOutputList->Add(fhTruePIDCorrect);
10201043
fOutputList->Add(fhTruePhiYB);
10211044
fOutputList->Add(fhTruePtYB);
10221045
fOutputList->Add(fhTruePhiYA);
@@ -1050,6 +1073,10 @@ struct IdentifiedBfFilterTracks {
10501073
fOutputList->Add(fhTrueNPosNegA[sp]);
10511074
fOutputList->Add(fhTrueDeltaNA[sp]);
10521075
}
1076+
for (int sp = 0; sp < kIdBfNoOfSpecies; ++sp) {
1077+
fOutputList->Add(fhTrueNSigmaTPC[sp]);
1078+
fOutputList->Add(fhTrueNSigmaTOF[sp]);
1079+
}
10531080
}
10541081
/* initialize access to the CCDB */
10551082
}
@@ -1063,6 +1090,8 @@ struct IdentifiedBfFilterTracks {
10631090
template <typename CollisionObjects, typename TrackObject>
10641091
int8_t selectTrackAmbiguousCheck(CollisionObjects const& collisions, TrackObject const& track);
10651092
template <typename ParticleObject>
1093+
inline void identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId, float tpcNSigma[kIdBfNoOfSpecies], float tofNSigma[kIdBfNoOfSpecies], float tpcInnerParam);
1094+
template <typename ParticleObject>
10661095
inline MatchRecoGenSpecies identifyParticle(ParticleObject const& particle);
10671096
template <typename TrackObject>
10681097
void fillTrackHistosBeforeSelection(TrackObject const& track);
@@ -1210,19 +1239,19 @@ struct IdentifiedBfFilterTracks {
12101239
}
12111240
PROCESS_SWITCH(IdentifiedBfFilterTracks, filterRecoWithPIDAmbiguous, "Not stored derived data track filtering with ambiguous tracks check", false)
12121241

1213-
void filterDetectorLevelWithPID(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksPIDDetLevel const& tracks)
1242+
void filterDetectorLevelWithPID(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksPIDDetLevel const& tracks, aod::McParticles const&)
12141243
{
12151244
filterTracks(collisions, tracks);
12161245
}
12171246
PROCESS_SWITCH(IdentifiedBfFilterTracks, filterDetectorLevelWithPID, "Not stored derived data detector level track filtering", false)
12181247

1219-
void filterDetectorLevelWithPIDAmbiguous(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksPIDDetLevelAmbiguous const& tracks)
1248+
void filterDetectorLevelWithPIDAmbiguous(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksPIDDetLevelAmbiguous const& tracks, aod::McParticles const&)
12201249
{
12211250
filterTracks(collisions, tracks);
12221251
}
12231252
PROCESS_SWITCH(IdentifiedBfFilterTracks, filterDetectorLevelWithPIDAmbiguous, "Not stored derived data detector level track filtering with ambiguous tracks check", false)
12241253

1225-
void filterRecoWithFullPID(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksFullPID const& tracks)
1254+
void filterRecoWithFullPID(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksFullPID const& tracks, aod::McParticles const&)
12261255
{
12271256
filterTracks(collisions, tracks);
12281257
}
@@ -1234,13 +1263,13 @@ struct IdentifiedBfFilterTracks {
12341263
}
12351264
PROCESS_SWITCH(IdentifiedBfFilterTracks, filterRecoWithFullPIDAmbiguous, "Not stored derived data track filtering with ambiguous tracks check", false)
12361265

1237-
void filterDetectorLevelWithFullPID(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksFullPIDDetLevel const& tracks)
1266+
void filterDetectorLevelWithFullPID(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksFullPIDDetLevel const& tracks, aod::McParticles const&)
12381267
{
12391268
filterTracks(collisions, tracks);
12401269
}
12411270
PROCESS_SWITCH(IdentifiedBfFilterTracks, filterDetectorLevelWithFullPID, "Not stored derived data detector level track filtering", false)
12421271

1243-
void filterDetectorLevelWithFullPIDAmbiguous(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksFullPIDDetLevelAmbiguous const& tracks)
1272+
void filterDetectorLevelWithFullPIDAmbiguous(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo>& collisions, IdBfFullTracksFullPIDDetLevelAmbiguous const& tracks, aod::McParticles const&)
12441273
{
12451274
filterTracks(collisions, tracks);
12461275
}
@@ -1264,7 +1293,7 @@ struct IdentifiedBfFilterTracks {
12641293
}
12651294
PROCESS_SWITCH(IdentifiedBfFilterTracks, filterDetectorLevelWithoutPID, "Detector level track filtering without PID information", false)
12661295

1267-
void filterDetectorLevelWithoutPIDAmbiguous(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo> const& collisions, IdBfFullTracksDetLevelAmbiguous const& tracks)
1296+
void filterDetectorLevelWithoutPIDAmbiguous(soa::Join<aod::Collisions, aod::IdentifiedBfCFCollisionsInfo> const& collisions, IdBfFullTracksDetLevelAmbiguous const& tracks, aod::McParticles const&)
12681297
{
12691298
filterTracks(collisions, tracks);
12701299
}
@@ -1308,6 +1337,46 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyParticle(ParticleOb
13081337
}
13091338
}
13101339

1340+
template <typename ParticleObject>
1341+
inline void IdentifiedBfFilterTracks::identifyPIDMismatch(ParticleObject const& particle, MatchRecoGenSpecies const& trkId, float tpcNSigma[kIdBfNoOfSpecies], float tofNSigma[kIdBfNoOfSpecies], float tpcInnerParam)
1342+
{
1343+
MatchRecoGenSpecies realPID = kWrongSpecies;
1344+
int pdgcode = std::fabs(particle.pdgCode());
1345+
1346+
switch (pdgcode) {
1347+
case pdgcodeEl:
1348+
realPID = kIdBfElectron;
1349+
break;
1350+
case pdgcodePi:
1351+
realPID = kIdBfPion;
1352+
break;
1353+
case pdgcodeKa:
1354+
realPID = kIdBfKaon;
1355+
break;
1356+
case pdgcodePr:
1357+
realPID = kIdBfProton;
1358+
break;
1359+
default:
1360+
if (traceOutOfSpeciesParticles) {
1361+
LOGF(info, "Wrong particle passed selection cuts. PDG code: %d", pdgcode);
1362+
}
1363+
realPID = kWrongSpecies;
1364+
break;
1365+
}
1366+
if (!(realPID < 0)) {
1367+
if (realPID == trkId) {
1368+
fhTruePIDCorrect->Fill(realPID);
1369+
} else {
1370+
fhTruePIDMismatch->Fill(realPID, trkId);
1371+
}
1372+
1373+
fhTrueNSigmaTPC[realPID]->Fill(tpcNSigma[realPID], tpcInnerParam);
1374+
fhTrueNSigmaTOF[realPID]->Fill(tofNSigma[realPID], tpcInnerParam);
1375+
1376+
// fill histo based on realTPC and tpcNSigma value for center align
1377+
}
1378+
}
1379+
13111380
template <typename TrackObject>
13121381
void fillNSigmaHistos(TrackObject const& track)
13131382
{
@@ -1347,46 +1416,49 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c
13471416

13481417
fillNSigmaHistos(track);
13491418

1350-
float actualTPCNSigmaEl = track.tpcNSigmaEl();
1351-
float actualTPCNSigmaPi = track.tpcNSigmaPi();
1352-
float actualTPCNSigmaKa = track.tpcNSigmaKa();
1353-
float actualTPCNSigmaPr = track.tpcNSigmaPr();
1419+
float actualTPCNSigma[kIdBfNoOfSpecies];
1420+
1421+
actualTPCNSigma[kIdBfElectron] = track.tpcNSigmaEl();
1422+
actualTPCNSigma[kIdBfPion] = track.tpcNSigmaPi();
1423+
actualTPCNSigma[kIdBfKaon] = track.tpcNSigmaKa();
1424+
actualTPCNSigma[kIdBfProton] = track.tpcNSigmaPr();
1425+
1426+
float actualTOFNSigma[kIdBfNoOfSpecies];
1427+
1428+
actualTOFNSigma[kIdBfElectron] = track.tofNSigmaEl();
1429+
actualTOFNSigma[kIdBfPion] = track.tofNSigmaPi();
1430+
actualTOFNSigma[kIdBfKaon] = track.tofNSigmaKa();
1431+
actualTOFNSigma[kIdBfProton] = track.tofNSigmaPr();
13541432

13551433
float nsigmas[kIdBfNoOfSpecies];
13561434

13571435
if (loadfromccdb) {
1358-
actualTPCNSigmaEl = actualTPCNSigmaEl - fhNSigmaCorrection[kIdBfElectron]->GetBinContent(fhNSigmaCorrection[kIdBfElectron]->FindBin(track.tpcInnerParam()));
1359-
actualTPCNSigmaPi = actualTPCNSigmaPi - fhNSigmaCorrection[kIdBfPion]->GetBinContent(fhNSigmaCorrection[kIdBfPion]->FindBin(track.tpcInnerParam()));
1360-
actualTPCNSigmaKa = actualTPCNSigmaKa - fhNSigmaCorrection[kIdBfKaon]->GetBinContent(fhNSigmaCorrection[kIdBfKaon]->FindBin(track.tpcInnerParam()));
1361-
actualTPCNSigmaPr = actualTPCNSigmaPr - fhNSigmaCorrection[kIdBfProton]->GetBinContent(fhNSigmaCorrection[kIdBfProton]->FindBin(track.tpcInnerParam()));
1436+
for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) {
1437+
actualTPCNSigma[iSp] = actualTPCNSigma[iSp] - fhNSigmaCorrection[iSp]->GetBinContent(fhNSigmaCorrection[iSp]->FindBin(track.tpcInnerParam()));
1438+
}
13621439
}
13631440

13641441
if (track.tpcInnerParam() < tofCut && !reqTOF && !onlyTOF) {
13651442

1366-
nsigmas[kIdBfElectron] = actualTPCNSigmaEl;
1367-
nsigmas[kIdBfPion] = actualTPCNSigmaPi;
1368-
nsigmas[kIdBfKaon] = actualTPCNSigmaKa;
1369-
nsigmas[kIdBfProton] = actualTPCNSigmaPr;
1370-
1443+
for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) {
1444+
nsigmas[iSp] = actualTPCNSigma[iSp];
1445+
}
13711446
} else {
13721447
/* introduce require TOF flag */
13731448
if (track.hasTOF() && !onlyTOF) {
1374-
nsigmas[kIdBfElectron] = sqrtf(actualTPCNSigmaEl * actualTPCNSigmaEl + track.tofNSigmaEl() * track.tofNSigmaEl());
1375-
nsigmas[kIdBfPion] = sqrtf(actualTPCNSigmaPi * actualTPCNSigmaPi + track.tofNSigmaPi() * track.tofNSigmaPi());
1376-
nsigmas[kIdBfKaon] = sqrtf(actualTPCNSigmaKa * actualTPCNSigmaKa + track.tofNSigmaKa() * track.tofNSigmaKa());
1377-
nsigmas[kIdBfProton] = sqrtf(actualTPCNSigmaPr * actualTPCNSigmaPr + track.tofNSigmaPr() * track.tofNSigmaPr());
1378-
1449+
// TODO: Add an output that tells if TOF was used for PID and at what momentum
1450+
for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) {
1451+
nsigmas[iSp] = sqrtf(actualTPCNSigma[iSp] * actualTPCNSigma[iSp] + actualTOFNSigma[iSp] * actualTOFNSigma[iSp]);
1452+
}
13791453
} else if (!reqTOF || !onlyTOF) {
1380-
nsigmas[kIdBfElectron] = actualTPCNSigmaEl;
1381-
nsigmas[kIdBfPion] = actualTPCNSigmaPi;
1382-
nsigmas[kIdBfKaon] = actualTPCNSigmaKa;
1383-
nsigmas[kIdBfProton] = actualTPCNSigmaPr;
1454+
for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) {
1455+
nsigmas[iSp] = actualTPCNSigma[iSp];
1456+
}
13841457

13851458
} else if (track.hasTOF() && onlyTOF) {
1386-
nsigmas[kIdBfElectron] = track.tofNSigmaEl();
1387-
nsigmas[kIdBfPion] = track.tofNSigmaPi();
1388-
nsigmas[kIdBfKaon] = track.tofNSigmaKa();
1389-
nsigmas[kIdBfProton] = track.tofNSigmaPr();
1459+
for (int iSp = 0; iSp < kIdBfNoOfSpecies; iSp++) {
1460+
nsigmas[iSp] = actualTOFNSigma[iSp];
1461+
}
13901462
} else {
13911463
return kWrongSpecies;
13921464
}
@@ -1431,19 +1503,11 @@ inline MatchRecoGenSpecies IdentifiedBfFilterTracks::identifyTrack(TrackObject c
14311503
fhDoublePID->Fill(spMinNSigma, spDouble);
14321504
return kWrongSpecies; // Return wrong species value
14331505
} else {
1434-
if (spMinNSigma == 0) {
1435-
fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaEl, track.tpcInnerParam());
1436-
}
1437-
if (spMinNSigma == 1) {
1438-
fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaPi, track.tpcInnerParam());
1439-
}
1440-
if (spMinNSigma == 2) {
1441-
fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaKa, track.tpcInnerParam());
1442-
}
1443-
if (spMinNSigma == 3) {
1444-
fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigmaPr, track.tpcInnerParam());
1445-
}
1506+
fhNSigmaTPCIdTrks[spMinNSigma]->Fill(actualTPCNSigma[spMinNSigma], track.tpcInnerParam());
14461507

1508+
if constexpr (framework::has_type_v<aod::mctracklabel::McParticleId, typename TrackObject::all_columns>) {
1509+
identifyPIDMismatch(track.template mcParticle_as<aod::McParticles>(), spMinNSigma, actualTPCNSigma, actualTOFNSigma, track.tpcInnerParam());
1510+
}
14471511
return spMinNSigma;
14481512
}
14491513
} else {
@@ -1477,7 +1541,6 @@ inline int8_t IdentifiedBfFilterTracks::acceptTrack(TrackObject const& track)
14771541
if (recoIdMethod == 0) {
14781542
sp = kIdBfCharged;
14791543
} else if (recoIdMethod == 1) {
1480-
14811544
if constexpr (framework::has_type_v<aod::pidtpc_tiny::TPCNSigmaStorePi, typename TrackObject::all_columns> || framework::has_type_v<aod::pidtpc::TPCNSigmaPi, typename TrackObject::all_columns>) {
14821545
sp = identifyTrack(track);
14831546
} else {

0 commit comments

Comments
 (0)