1414// / \since 2024-11-12
1515// / \author Nicolò Jacazio nicolo.jacazio@cern.ch
1616// / \author Francesco Mazzaschi francesco.mazzaschi@cern.ch
17+ // / \author Giorgio Alberto Lucia giorgio.alberto.lucia@cern.ch
1718// / \brief Set of tables, tasks and utilities to provide the interface between
1819// / the analysis data model and the PID response of the ITS
1920// /
@@ -54,19 +55,33 @@ struct ITSResponse {
5455 static constexpr float inverseMass = 1 . / o2::track::pid_constants::sMasses [id];
5556 static constexpr float charge = static_cast <float >(o2::track::pid_constants::sCharges [id]);
5657 const float bg = momentum * inverseMass;
57- return (mITSRespParams [0 ] / (std::pow (bg, mITSRespParams [1 ])) + mITSRespParams [2 ]) * std::pow (charge, mChargeFactor );
58+ if (id == o2::track::PID::Helium3 || id == o2::track::PID::Alpha) {
59+ return (mITSRespParamsZ2 [0 ] / (std::pow (bg, mITSRespParamsZ2 [1 ])) + mITSRespParamsZ2 [2 ]);
60+ }
61+ return (mITSRespParams [0 ] / (std::pow (bg, mITSRespParams [1 ])) + mITSRespParams [2 ]);
62+ }
63+
64+ template <o2::track::PID::ID id>
65+ static float expResolution (const float momentum)
66+ {
67+ static constexpr float inverseMass = 1 . / o2::track::pid_constants::sMasses [id];
68+ static constexpr float charge = static_cast <float >(o2::track::pid_constants::sCharges [id]);
69+ const float bg = momentum * inverseMass;
70+ float relRes = mResolutionParams [0 ] * std::erf ((bg - mResolutionParams [1 ]) / mResolutionParams [2 ]);
71+ return relRes;
5872 }
5973
6074 template <o2::track::PID::ID id>
61- static float nSigmaITS (uint32_t itsClusterSizes, float momentum)
75+ static float nSigmaITS (uint32_t itsClusterSizes, float momentum, float eta )
6276 {
6377 const float exp = expSignal<id>(momentum);
6478 const float average = averageClusterSize (itsClusterSizes);
65- const float resolution = mResolution * exp;
66- return (average - exp) / resolution;
79+ const float coslInv = 1 . / std::cosh (eta);
80+ const float resolution = expResolution<id>(momentum) * exp;
81+ return (average * coslInv - exp) / resolution;
6782 };
6883
69- static void setParameters (float p0, float p1, float p2, float chargeFactor , float resolution )
84+ static void setParameters (float p0, float p1, float p2, float p0_Z2 , float p1_Z2, float p2_Z2, float p0_res, float p1_res, float p2_res )
7085 {
7186 if (mIsInitialized ) {
7287 LOG (fatal) << " ITSResponse parameters already initialized" ;
@@ -75,79 +90,84 @@ struct ITSResponse {
7590 mITSRespParams [0 ] = p0;
7691 mITSRespParams [1 ] = p1;
7792 mITSRespParams [2 ] = p2;
78- mChargeFactor = chargeFactor;
79- mResolution = resolution;
93+ mITSRespParamsZ2 [0 ] = p0_Z2;
94+ mITSRespParamsZ2 [1 ] = p1_Z2;
95+ mITSRespParamsZ2 [2 ] = p2_Z2;
96+ mResolutionParams [0 ] = p0_res;
97+ mResolutionParams [1 ] = p1_res;
98+ mResolutionParams [2 ] = p2_res;
8099 }
81100
82101 private:
83102 static std::array<float , 3 > mITSRespParams ;
84- static float mChargeFactor ;
85- static float mResolution ;
103+ static std::array< float , 3 > mITSRespParamsZ2 ;
104+ static std::array< float , 3 > mResolutionParams ;
86105 static bool mIsInitialized ;
87106};
88107
89- std::array<float , 3 > ITSResponse::mITSRespParams = {0.903 , 2.014 , 2.440 };
90- float ITSResponse::mChargeFactor = 2 .299999952316284f ;
91- float ITSResponse::mResolution = 0 .15f ;
108+ std::array<float , 3 > ITSResponse::mITSRespParams = {1.1576 , 1.684 , 1.9453 };
109+ std::array<float , 3 > ITSResponse::mITSRespParamsZ2 = {2.8752 , 1.1246 , 5.0259 };
110+ // relative resolution is modelled with an erf function: [0]*TMath::Erf((x-[1])/[2])
111+ std::array<float , 3 > ITSResponse::mResolutionParams = {0.2431 , -0.3293 , 1.533 };
92112bool ITSResponse::mIsInitialized = false ;
93113
94114namespace pidits
95115{
96116DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaElImp, itsNSigmaEl, // ! Nsigma separation with the ITS detector for electrons
97- [](uint32_t itsClusterSizes, float momentum) -> float {
98- return ITSResponse::nSigmaITS<o2::track::PID::Electron>(itsClusterSizes, momentum);
117+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
118+ return ITSResponse::nSigmaITS<o2::track::PID::Electron>(itsClusterSizes, momentum, eta );
99119 });
100120
101121DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaMuImp, itsNSigmaMu, // ! Nsigma separation with the ITS detector for muons
102- [](uint32_t itsClusterSizes, float momentum) -> float {
103- return ITSResponse::nSigmaITS<o2::track::PID::Muon>(itsClusterSizes, momentum);
122+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
123+ return ITSResponse::nSigmaITS<o2::track::PID::Muon>(itsClusterSizes, momentum, eta );
104124 });
105125
106126DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaPiImp, itsNSigmaPi, // ! Nsigma separation with the ITS detector for pions
107- [](uint32_t itsClusterSizes, float momentum) -> float {
108- return ITSResponse::nSigmaITS<o2::track::PID::Pion>(itsClusterSizes, momentum);
127+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
128+ return ITSResponse::nSigmaITS<o2::track::PID::Pion>(itsClusterSizes, momentum, eta );
109129 });
110130
111131DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaKaImp, itsNSigmaKa, // ! Nsigma separation with the ITS detector for kaons
112- [](uint32_t itsClusterSizes, float momentum) -> float {
113- return ITSResponse::nSigmaITS<o2::track::PID::Kaon>(itsClusterSizes, momentum);
132+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
133+ return ITSResponse::nSigmaITS<o2::track::PID::Kaon>(itsClusterSizes, momentum, eta );
114134 });
115135
116136DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaPrImp, itsNSigmaPr, // ! Nsigma separation with the ITS detector for protons
117- [](uint32_t itsClusterSizes, float momentum) -> float {
118- return ITSResponse::nSigmaITS<o2::track::PID::Proton>(itsClusterSizes, momentum);
137+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
138+ return ITSResponse::nSigmaITS<o2::track::PID::Proton>(itsClusterSizes, momentum, eta );
119139 });
120140
121141DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaDeImp, itsNSigmaDe, // ! Nsigma separation with the ITS detector for deuterons
122- [](uint32_t itsClusterSizes, float momentum) -> float {
123- return ITSResponse::nSigmaITS<o2::track::PID::Deuteron>(itsClusterSizes, momentum);
142+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
143+ return ITSResponse::nSigmaITS<o2::track::PID::Deuteron>(itsClusterSizes, momentum, eta );
124144 });
125145
126146DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaTrImp, itsNSigmaTr, // ! Nsigma separation with the ITS detector for tritons
127- [](uint32_t itsClusterSizes, float momentum) -> float {
128- return ITSResponse::nSigmaITS<o2::track::PID::Triton>(itsClusterSizes, momentum);
147+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
148+ return ITSResponse::nSigmaITS<o2::track::PID::Triton>(itsClusterSizes, momentum, eta );
129149 });
130150
131151DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaHeImp, itsNSigmaHe, // ! Nsigma separation with the ITS detector for helium3
132- [](uint32_t itsClusterSizes, float momentum) -> float {
133- return ITSResponse::nSigmaITS<o2::track::PID::Helium3>(itsClusterSizes, momentum);
152+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
153+ return ITSResponse::nSigmaITS<o2::track::PID::Helium3>(itsClusterSizes, momentum, eta );
134154 });
135155
136156DECLARE_SOA_DYNAMIC_COLUMN (ITSNSigmaAlImp, itsNSigmaAl, // ! Nsigma separation with the ITS detector for alphas
137- [](uint32_t itsClusterSizes, float momentum) -> float {
138- return ITSResponse::nSigmaITS<o2::track::PID::Alpha>(itsClusterSizes, momentum);
157+ [](uint32_t itsClusterSizes, float momentum, float eta ) -> float {
158+ return ITSResponse::nSigmaITS<o2::track::PID::Alpha>(itsClusterSizes, momentum, eta );
139159 });
140160
141161// Define user friendly names for the columns to join with the tracks
142- using ITSNSigmaEl = ITSNSigmaElImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
143- using ITSNSigmaMu = ITSNSigmaMuImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
144- using ITSNSigmaPi = ITSNSigmaPiImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
145- using ITSNSigmaKa = ITSNSigmaKaImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
146- using ITSNSigmaPr = ITSNSigmaPrImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
147- using ITSNSigmaDe = ITSNSigmaDeImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
148- using ITSNSigmaTr = ITSNSigmaTrImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
149- using ITSNSigmaHe = ITSNSigmaHeImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
150- using ITSNSigmaAl = ITSNSigmaAlImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P>;
162+ using ITSNSigmaEl = ITSNSigmaElImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
163+ using ITSNSigmaMu = ITSNSigmaMuImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
164+ using ITSNSigmaPi = ITSNSigmaPiImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
165+ using ITSNSigmaKa = ITSNSigmaKaImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
166+ using ITSNSigmaPr = ITSNSigmaPrImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
167+ using ITSNSigmaDe = ITSNSigmaDeImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
168+ using ITSNSigmaTr = ITSNSigmaTrImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
169+ using ITSNSigmaHe = ITSNSigmaHeImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
170+ using ITSNSigmaAl = ITSNSigmaAlImp<o2::aod::track::ITSClusterSizes, o2::aod::track::P, o2::aod::track::Eta >;
151171
152172} // namespace pidits
153173} // namespace o2::aod
0 commit comments