4040#include " DataFormatsParameters/GRPMagField.h"
4141#include " CCDB/BasicCCDBManager.h"
4242
43+ #include " Common/Core/PID/PIDTOF.h"
44+ #include " Common/TableProducer/PID/pidTOFBase.h"
4345#include " Common/Core/PID/TPCPIDResponse.h"
4446#include " Common/DataModel/PIDResponse.h"
4547#include " DCAFitter/DCAFitterN.h"
@@ -54,8 +56,8 @@ using namespace o2::framework;
5456using namespace o2 ::framework::expressions;
5557
5658using Track = o2::track::TrackParCov;
57- using TracksFullIU = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCEl, aod::pidTPCPi, aod:: pidTPCKa, aod::pidTPCPr, aod:: pidTPCDe, aod::pidTPCHe , aod::pidTOFEl , aod::pidTOFPi, aod::pidTOFKa, aod::pidTOFPr, aod::pidTOFDe, aod::pidTOFHe >;
58- using TracksFullIUMc = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCEl, aod::pidTPCPi, aod:: pidTPCKa, aod::pidTPCPr, aod:: pidTPCDe, aod::pidTPCHe , aod::pidTOFEl , aod::pidTOFPi, aod::pidTOFKa, aod::pidTOFPr, aod::pidTOFDe, aod::pidTOFHe , aod::McTrackLabels>;
59+ using TracksFullIU = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCEl, aod::pidTPCKa, aod::pidTPCDe, aod::pidTOFDe , aod::TOFSignal , aod::TOFEvTime >;
60+ using TracksFullIUMc = soa::Join<aod::TracksIU, aod::TracksExtra, aod::TracksCovIU, aod::pidTPCEl, aod::pidTPCKa, aod::pidTPCDe, aod::pidTOFDe , aod::TOFSignal , aod::TOFEvTime , aod::McTrackLabels>;
5961using CollisionsCustom = soa::Join<aod::Collisions, aod::EvSels>;
6062
6163namespace BetheBloch
@@ -104,6 +106,7 @@ enum CascSelections {
104106 kCascCosPA ,
105107 kAcceptedOmega ,
106108 kRejectedXi ,
109+ kNSigmaTPC ,
107110 kCascAll
108111};
109112
@@ -167,9 +170,10 @@ struct CandidateK {
167170 uint32_t itsClsize_K = 0xFFFFF ;
168171 uint8_t partID_K = 0 ;
169172 bool isPositive_K = false ;
170- float pTPC_K = -999 .f; // extra
171- uint32_t pidInTrk_K = 0 ; // extra
172- int partIDMc_K = 0 ; // mc
173+ float pTPC_K = -999 .f; // extra
174+ uint32_t pidInTrk_K = 0 ; // extra
175+ float tpcNSigma_K = -999 .f; // extra
176+ int partIDMc_K = 0 ; // mc
173177
174178 float cosPA = -999 .f; // extra
175179 float massOmega = -999 .f; // extra
@@ -200,6 +204,7 @@ struct candidateHe {
200204 uint32_t pidInTrk_he = 0 ; // extra
201205 float tpcNSigma_he = -999 .f; // extra
202206 float tofNSigma_he = -999 .f; // extra
207+ float massTOF_he = -999 .f; // extra
203208 int partIDMc_he = 0 ; // mc
204209};
205210
@@ -246,14 +251,16 @@ struct LfTreeCreatorClusterStudies {
246251 Configurable<float > cascsetting_cosPA{" casc_setting_cosPA" , 0 .99f , " Cosine of the pointing angle of the V0" };
247252 Configurable<float > cascsetting_massWindowOmega{" casc_setting_massWindowOmega" , 0 .01f , " Mass window for the Omega" };
248253 Configurable<float > cascsetting_massWindowXi{" casc_setting_massWindowXi" , 0 .01f , " Mass window for the Xi" };
254+ Configurable<float > cascsetting_nsigmatpc{" casc_setting_nsigmaTPC" , 3 .f , " Number of sigmas for the TPC PID" };
249255
250256 Configurable<int > desetting_nClsIts{" desetting_nClsIts" , 6 , " Minimum number of ITS clusters" };
251257 Configurable<float > desetting_nsigmatpc{" desetting_nsigmaCutTPC" , 2 .f , " Number of sigmas for the TPC PID" };
252258 Configurable<float > desetting_nsigmatof{" desetting_nsigmaCutTOF" , 2 .f , " Number of sigmas for the TOF PID" };
253259 Configurable<int > he3setting_nClsIts{" he3setting_nClsIts" , 6 , " Minimum number of ITS clusters" };
254260 Configurable<bool > he3setting_compensatePIDinTracking{" he3setting_compensatePIDinTracking" , true , " Compensate PID in tracking" };
255261 Configurable<float > he3setting_nsigmatpc{" he3setting_nsigmaCutTPC" , 2 .f , " Number of sigmas for the TPC PID" };
256- Configurable<float > he3setting_nsigmatof{" he3setting_nsigmaCutTOF" , 2 .f , " Number of sigmas for the TOF PID" };
262+ Configurable<float > he3setting_tofmasslow{" he3setting_tofmasslow" , 1 .8f , " Lower limit for the TOF mass" };
263+ Configurable<float > he3setting_tofmasshigh{" he3setting_tofmasshigh" , 4 .2f , " Upper limit for the TOF mass" };
257264
258265 // Bethe Bloch parameters
259266 std::array<float , 6 > m_BBparamsDe, m_BBparamsHe;
@@ -285,11 +292,12 @@ struct LfTreeCreatorClusterStudies {
285292 {" Xi_vs_Omega" , " Mass Xi vs Omega; mass Omega (GeV/#it{c}^{2}); mass Xi (GeV/#it{c}^{2})" , {HistType::kTH2F , {{50 , 1 .f , 2 .f }, {50 , 1 .f , 2 .f }}}},
286293 {" massOmega" , " Mass #Omega; signed #it{p}_{T} (GeV/#it{c}); mass (GeV/#it{c}^{2})" , {HistType::kTH2F , {{100 , -5 .f , 5 .f }, {100 , 1 .62f , 1 .72f }}}},
287294 {" massOmegaWithBkg" , " Mass Omega with Background; mass Omega (GeV/#it{c}^{2}); counts" , {HistType::kTH1F , {{100 , 1 .62f , 1 .72f }}}},
288- {" nSigmaTPCEl" , " nSigma TPC Electron; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC} e" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {60 , -2 .0f , 2 .0f }}}},
289- {" nSigmaTPCDe" , " nSigma TPC Deuteron; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC} d" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -3 .0f , 3 .0f }}}},
290- {" nSigmaTPCHe" , " nSigma TPC He3; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{TPC} ^{3}He" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -3 .0f , 3 .0f }}}},
291- {" nSigmaTOFDe" , " nSigma TOF Deuteron; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF} d" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -3 .0f , 3 .0f }}}},
292- {" nSigmaTOFHe" , " nSigma TOF He3; signed #it{p}_{T} (GeV/#it{c}); n#sigma_{TOF} ^{3}He" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -3 .0f , 3 .0f }}}},
295+ {" nSigmaTPCEl" , " nSigma TPC Electron; signed #it{p} (GeV/#it{c}); n#sigma_{TPC} e" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {60 , -2 .0f , 2 .0f }}}},
296+ {" nSigmaTPCKa" , " nSigma TPC Kaon; signed #it{p} (GeV/#it{c}); n#sigma_{TPC} e" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {60 , -4 .0f , 4 .0f }}}},
297+ {" nSigmaTPCDe" , " nSigma TPC Deuteron; signed #it{p} (GeV/#it{c}); n#sigma_{TPC} d" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -3 .0f , 3 .0f }}}},
298+ {" nSigmaTPCHe" , " nSigma TPC He3; signed #it{p} (GeV/#it{c}); n#sigma_{TPC} ^{3}He" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -3 .0f , 3 .0f }}}},
299+ {" nSigmaTOFDe" , " nSigma TOF Deuteron; signed #it{p} (GeV/#it{c}); n#sigma_{TOF} d" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -3 .0f , 3 .0f }}}},
300+ {" TOFmassHe" , " TOF mass He3; signed #it{p}_{T} (GeV/#it{c}); mass_{TOF} ^{3}He (GeV/#it{c}^2)" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , 1 .0f , 5 .0f }}}},
293301 {" pmatchingEl" , " #it{p} matching e; signed #it{p}_{TPC} (GeV/#it{c}); #it{p}_{TPC} - #it{p} (GeV/#it{c})" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -0 .5f , 0 .5f }}}},
294302 {" pmatchingPi" , " #it{p} matching #pi; signed #it{p}_{TPC} (GeV/#it{c}); #it{p}_{TPC} - #it{p} (GeV/#it{c})" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -0 .5f , 0 .5f }}}},
295303 {" pmatchingKa" , " #it{p} matching K; signed #it{p}_{TPC} (GeV/#it{c}); #it{p}_{TPC} - #it{p} (GeV/#it{c})" , {HistType::kTH2F , {{100 , -5 .0f , 5 .0f }, {100 , -0 .5f , 0 .5f }}}},
@@ -314,6 +322,8 @@ struct LfTreeCreatorClusterStudies {
314322 std::vector<V0TrackParCov> m_v0TrackParCovs;
315323
316324 o2::vertexing::DCAFitterN<2 > m_fitter;
325+ o2::pid::tof::Beta<TracksFullIU::iterator> m_responseBeta;
326+ o2::pid::tof::Beta<TracksFullIUMc::iterator> m_responseBetaMc;
317327
318328 template <typename T>
319329 bool initializeFitter (const T& trackParCovA, const T& trackParCovB)
@@ -504,6 +514,26 @@ struct LfTreeCreatorClusterStudies {
504514 return false ;
505515 }
506516
517+ template <typename T>
518+ float computeTOFmassHe3 (const T& candidate)
519+ {
520+ float beta = m_responseBeta.GetBeta (candidate);
521+ beta = std::min (1 .f - 1 .e -6f , std::max (1 .e -4f , beta)); // / sometimes beta > 1 or < 0, to be checked
522+ bool heliumPID = candidate.pidForTracking () == o2::track::PID::Helium3 || candidate.pidForTracking () == o2::track::PID::Alpha;
523+ float correctedTPCinnerParamHe3 = (heliumPID && he3setting_compensatePIDinTracking) ? candidate.tpcInnerParam () / 2 .f : candidate.tpcInnerParam ();
524+ return correctedTPCinnerParamHe3 * 2 .f * std::sqrt (1 .f / (beta * beta) - 1 .f );
525+ }
526+
527+ template <typename T>
528+ float computeTOFmassHe3Mc (const T& candidate)
529+ {
530+ float beta = m_responseBetaMc.GetBeta (candidate);
531+ beta = std::min (1 .f - 1 .e -6f , std::max (1 .e -4f , beta)); // / sometimes beta > 1 or < 0, to be checked
532+ bool heliumPID = candidate.pidForTracking () == o2::track::PID::Helium3 || candidate.pidForTracking () == o2::track::PID::Alpha;
533+ float correctedTPCinnerParamHe3 = (heliumPID && he3setting_compensatePIDinTracking) ? candidate.tpcInnerParam () / 2 .f : candidate.tpcInnerParam ();
534+ return correctedTPCinnerParamHe3 * 2 .f * std::sqrt (1 .f / (beta * beta) - 1 .f );
535+ }
536+
507537 // =========================================================================================================
508538
509539 template <class Bc >
@@ -798,6 +828,7 @@ struct LfTreeCreatorClusterStudies {
798828 candV0.pidInTrk_pos , // pidInTrk_pos
799829 -999 .f , // TpcNSigma_pos
800830 -999 .f , // TofNSigma_pos
831+ -999 .f , // TofMass_pos
801832 candV0.cosPA , // cosPA
802833 candV0.massV0 ); // massV0
803834 m_ClusterStudiesTableExtra (
@@ -811,6 +842,7 @@ struct LfTreeCreatorClusterStudies {
811842 candV0.pidInTrk_neg , // pidInTrk_neg
812843 -999 .f , // TpcNSigma_neg
813844 -999 .f , // TofNSigma_neg
845+ -999 .f , // TofMass_neg
814846 candV0.cosPA , // cosPA
815847 candV0.massV0 ); // massV0
816848 }
@@ -851,6 +883,7 @@ struct LfTreeCreatorClusterStudies {
851883 candV0.pidInTrk_pos , // pidInTrk_pos
852884 -999 .f , // TpcNSigma_pos
853885 -999 .f , // TofNSigma_pos
886+ -999 .f , // TofMass_pos
854887 candV0.cosPA , // cosPA
855888 candV0.massV0 ); // massV0
856889 m_ClusterStudiesTableMcExtra (
@@ -865,6 +898,7 @@ struct LfTreeCreatorClusterStudies {
865898 candV0.pidInTrk_neg , // pidInTrk_neg
866899 -999 .f , // TpcNSigma_neg
867900 -999 .f , // TofNSigma_neg
901+ -999 .f , // TofMass_neg
868902 candV0.cosPA , // cosPA
869903 candV0.massV0 ); // massV0
870904 }
@@ -919,9 +953,14 @@ struct LfTreeCreatorClusterStudies {
919953 if (std::abs (massXi - o2::constants::physics::MassXiMinus) < cascsetting_massWindowXi) {
920954 return false ;
921955 } // enhance purity by rejecting Xi background
922- m_hAnalysis.fill (HIST (" massOmega" ), std::hypot (momMother[0 ], momMother[1 ]) * bachelorTrack.sign (), massOmega);
923956 m_hAnalysis.fill (HIST (" casc_selections" ), CascSelections::kRejectedXi );
957+ if (std::abs (bachelorTrack.tpcNSigmaKa ()) > cascsetting_nsigmatpc) {
958+ return false ;
959+ }
960+ m_hAnalysis.fill (HIST (" casc_selections" ), CascSelections::kNSigmaTPC );
961+ m_hAnalysis.fill (HIST (" massOmega" ), std::hypot (momMother[0 ], momMother[1 ]) * bachelorTrack.sign (), massOmega);
924962 m_hAnalysis.fill (HIST (" pmatchingKa" ), bachelorTrack.sign () * bachelorTrack.tpcInnerParam (), bachelorTrack.tpcInnerParam () - bachelorTrack.p ());
963+ m_hAnalysis.fill (HIST (" nSigmaTPCKa" ), bachelorTrack.sign () * std::hypot (momBachelor[0 ], momBachelor[1 ], momBachelor[2 ]), bachelorTrack.tpcNSigmaKa ());
925964
926965 uint8_t partID_bachelor = PartID::ka;
927966
@@ -974,6 +1013,7 @@ struct LfTreeCreatorClusterStudies {
9741013 candK.pidInTrk_K , // PIDinTrk_K
9751014 -999 .f , // TpcNSigma_K
9761015 -999 .f , // TofNSigma_K
1016+ -999 .f , // TofMass_K
9771017 candK.cosPA , // cosPA
9781018 candK.massOmega ); // massMother
9791019 }
@@ -1005,6 +1045,7 @@ struct LfTreeCreatorClusterStudies {
10051045 candK.pidInTrk_K , // PIDinTrk_K
10061046 -999 .f , // TpcNSigma_K
10071047 -999 .f , // TofNSigma_K
1048+ -999 .f , // TofMass_K
10081049 candK.cosPA , // cosPA
10091050 candK.massOmega ); // massMother
10101051 }
@@ -1034,8 +1075,8 @@ struct LfTreeCreatorClusterStudies {
10341075 return ;
10351076 }
10361077 m_hAnalysis.fill (HIST (" de_selections" ), DeSelections::kDePIDtof );
1037- m_hAnalysis.fill (HIST (" nSigmaTPCDe" ), track.pt () * track.sign (), computeNSigmaDe (track));
1038- m_hAnalysis.fill (HIST (" nSigmaTOFDe" ), track.pt () * track.sign (), track.tofNSigmaDe ());
1078+ m_hAnalysis.fill (HIST (" nSigmaTPCDe" ), track.p () * track.sign (), computeNSigmaDe (track));
1079+ m_hAnalysis.fill (HIST (" nSigmaTOFDe" ), track.p () * track.sign (), track.tofNSigmaDe ());
10391080 m_hAnalysis.fill (HIST (" pmatchingDe" ), track.sign () * track.tpcInnerParam (), track.tpcInnerParam () - track.p ());
10401081
10411082 uint8_t partID = PartID::de;
@@ -1060,6 +1101,7 @@ struct LfTreeCreatorClusterStudies {
10601101 track.pidForTracking (), // PIDinTrk_De,
10611102 computeNSigmaDe (track), // TpcNSigma_De,
10621103 track.tofNSigmaDe (), // TofNSigma_De,
1104+ -999 .f , // TofMass_De,
10631105 -999 .f , // cosPA,
10641106 -999 .f ); // massMother
10651107 }
@@ -1090,8 +1132,8 @@ struct LfTreeCreatorClusterStudies {
10901132 return ;
10911133 }
10921134 m_hAnalysis.fill (HIST (" de_selections" ), DeSelections::kDePIDtof );
1093- m_hAnalysis.fill (HIST (" nSigmaTPCDe" ), track.pt () * track.sign (), computeNSigmaDe (track));
1094- m_hAnalysis.fill (HIST (" nSigmaTOFDe" ), track.pt () * track.sign (), track.tofNSigmaDe ());
1135+ m_hAnalysis.fill (HIST (" nSigmaTPCDe" ), track.p () * track.sign (), computeNSigmaDe (track));
1136+ m_hAnalysis.fill (HIST (" nSigmaTOFDe" ), track.p () * track.sign (), track.tofNSigmaDe ());
10951137 m_hAnalysis.fill (HIST (" pmatchingDe" ), track.sign () * track.tpcInnerParam (), track.tpcInnerParam () - track.p ());
10961138
10971139 uint8_t partID = PartID::de;
@@ -1118,6 +1160,7 @@ struct LfTreeCreatorClusterStudies {
11181160 track.pidForTracking (), // PIDinTrk_De,
11191161 computeNSigmaDe (track), // TpcNSigma_De,
11201162 track.tofNSigmaDe (), // TofNSigma_De,
1163+ -999 .f , // TofMass_De,
11211164 -999 .f , // cosPA,
11221165 -999 .f ); // massMother
11231166 }
@@ -1139,12 +1182,13 @@ struct LfTreeCreatorClusterStudies {
11391182 return ;
11401183 }
11411184 m_hAnalysis.fill (HIST (" he3_selections" ), He3Selections::kHe3PIDtpc );
1142- if (track.hasTOF () && std::abs (track.tofNSigmaHe ()) > he3setting_nsigmatof) {
1185+ float tofMass = track.hasTOF () ? computeTOFmassHe3 (track) : -999 .f ;
1186+ if (track.hasTOF () && (tofMass < he3setting_tofmasslow || tofMass > he3setting_tofmasshigh)) {
11431187 return ;
11441188 }
11451189 m_hAnalysis.fill (HIST (" he3_selections" ), He3Selections::kHe3PIDtof );
1146- m_hAnalysis.fill (HIST (" nSigmaTPCHe" ), track.pt () * track.sign (), computeNSigmaHe3 (track));
1147- m_hAnalysis.fill (HIST (" nSigmaTOFHe " ), track.pt () * track.sign (), track. tofNSigmaHe () );
1190+ m_hAnalysis.fill (HIST (" nSigmaTPCHe" ), track.p () * track.sign (), computeNSigmaHe3 (track));
1191+ m_hAnalysis.fill (HIST (" TOFmassHe " ), track.p () * track.sign (), tofMass );
11481192 m_hAnalysis.fill (HIST (" pmatchingHe" ), track.sign () * track.tpcInnerParam (), track.tpcInnerParam () - track.p ());
11491193
11501194 uint8_t partID = PartID::he;
@@ -1170,7 +1214,8 @@ struct LfTreeCreatorClusterStudies {
11701214 correctedTPCinnerParam * track.sign (), // pTPC_He3,
11711215 track.pidForTracking (), // PIDinTrk_He3,
11721216 computeNSigmaHe3 (track), // TpcNSigma_He3,
1173- track.tofNSigmaHe (), // TofNSigma_He3,
1217+ -999 .f , // TofNSigma_He3,
1218+ tofMass, // TofMass_He3,
11741219 -999 .f , // cosPA,
11751220 -999 .f ); // massMother
11761221 }
@@ -1198,12 +1243,13 @@ struct LfTreeCreatorClusterStudies {
11981243 return ;
11991244 }
12001245 m_hAnalysis.fill (HIST (" he3_selections" ), He3Selections::kHe3PIDtpc );
1201- if (track.hasTOF () && std::abs (track.tofNSigmaHe ()) > he3setting_nsigmatof) {
1246+ float tofMass = track.hasTOF () ? computeTOFmassHe3Mc (track) : -999 .f ;
1247+ if (track.hasTOF () && (tofMass < he3setting_tofmasslow || tofMass > he3setting_tofmasshigh)) {
12021248 return ;
12031249 }
12041250 m_hAnalysis.fill (HIST (" he3_selections" ), He3Selections::kHe3PIDtof );
1205- m_hAnalysis.fill (HIST (" nSigmaTPCHe" ), track.pt () * track.sign (), computeNSigmaHe3 (track));
1206- m_hAnalysis.fill (HIST (" nSigmaTOFHe " ), track.pt () * track.sign (), track. tofNSigmaHe () );
1251+ m_hAnalysis.fill (HIST (" nSigmaTPCHe" ), track.p () * track.sign (), computeNSigmaHe3 (track));
1252+ m_hAnalysis.fill (HIST (" TOFmassHe " ), track.p () * track.sign (), tofMass );
12071253 m_hAnalysis.fill (HIST (" pmatchingHe" ), track.sign () * track.tpcInnerParam (), track.tpcInnerParam () - track.p ());
12081254
12091255 uint8_t partID = PartID::he;
@@ -1231,7 +1277,8 @@ struct LfTreeCreatorClusterStudies {
12311277 correctedTPCinnerParam * track.sign (), // pTPC_He3
12321278 track.pidForTracking (), // PIDinTrk_He3
12331279 computeNSigmaHe3 (track), // TpcNSigma_He3
1234- track.tofNSigmaHe (), // TofNSigma _He3
1280+ -999 .f , // TofNSigma_He3
1281+ tofMass, // TofMass_He3
12351282 -999 .f , // cosPA_He3
12361283 -999 .f ); // massMother_He3
12371284 }
0 commit comments