@@ -153,6 +153,12 @@ TH2F* fhAmbiguousTrackPt = nullptr;
153153TH2F* fhAmbiguityDegree = nullptr ;
154154TH2F* fhCompatibleCollisionsZVtxRms = nullptr ;
155155
156+ TH2S* fhTruePIDMismatch = nullptr ;
157+ TH1S* fhTruePIDCorrect = nullptr ;
158+
159+ TH2F* fhTrueNSigmaTPC[kIdBfNoOfSpecies ] = {nullptr };
160+ TH2F* fhTrueNSigmaTOF[kIdBfNoOfSpecies ] = {nullptr };
161+
156162TH1F* fhTrueCentMultB = nullptr ;
157163TH1F* fhTrueCentMultA = nullptr ;
158164TH1F* 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+
13111380template <typename TrackObject>
13121381void 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