Skip to content

Commit dabead6

Browse files
fmazzascFrancesco Mazzaschialibuild
authored
[Common,PWGLF] Fix PID parametrisations and add pid to qa task (#8518)
Co-authored-by: Francesco Mazzaschi <fmazzasc@alipap1.cern.ch> Co-authored-by: ALICE Action Bot <alibuild@cern.ch>
1 parent 6292a2e commit dabead6

File tree

3 files changed

+98
-50
lines changed

3 files changed

+98
-50
lines changed

Common/DataModel/PIDResponseITS.h

Lines changed: 59 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
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};
92112
bool ITSResponse::mIsInitialized = false;
93113

94114
namespace pidits
95115
{
96116
DECLARE_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

101121
DECLARE_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

106126
DECLARE_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

111131
DECLARE_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

116136
DECLARE_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

121141
DECLARE_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

126146
DECLARE_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

131151
DECLARE_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

136156
DECLARE_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

Common/TableProducer/PID/pidITS.cxx

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
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 Task to produce PID tables for ITS split for each particle.
1819
/// Only the tables for the mass hypotheses requested are filled, the others are sent empty.
1920
///
@@ -42,14 +43,21 @@ using namespace o2::track;
4243
MetadataHelper metadataInfo;
4344

4445
static constexpr int nCases = 2;
45-
static constexpr int nParameters = 5;
46+
static constexpr int nParameters = 9;
4647
static const std::vector<std::string> casesNames{"Data", "MC"};
47-
static const std::vector<std::string> parameterNames{"bb1", "bb2", "bb3", "Charge exponent", "Resolution"};
48-
static constexpr float defaultParameters[nCases][nParameters]{{0.903, 2.014, 2.440, 2.299999952316284f, 0.15f},
49-
{0.903, 2.014, 2.440, 2.299999952316284f, 0.15f}};
48+
static const std::vector<std::string> parameterNames{"RespITSPar1", "RespITSPar2", "RespITSPar3",
49+
"RespITSPar1_Z2", "RespITSPar2_Z2", "RespITSPar3_Z2",
50+
"ResolutionPar1", "ResolutionPar2", "ResolutionPar3"};
51+
static constexpr float defaultParameters[nCases][nParameters]{{0.903, 2.014, 2.440,
52+
2.8752, 1.1246, 5.0259,
53+
0.2431, -0.3293, 1.533},
54+
{0.903, 2.014, 2.440,
55+
2.8752, 1.1246, 5.0259,
56+
0.2431, -0.3293, 1.533}};
5057

5158
/// Task to produce the ITS PID information for each particle species
52-
/// The parametrization is: [p0/(bg)**p1 + p2] * pow(q, p3), being bg = p/m and q the charge
59+
/// The parametrization is: [p0/(bg)**p1 + p2] being bg = p/m. Different parametrizations are used for He3 and Alpha particles.
60+
/// The resolution depends on the bg and is modelled with an erf function: p0*TMath::Erf((bg-p1)/p2)
5361
struct itsPid {
5462

5563
Configurable<LabeledArray<float>> itsParams{"itsParams",
@@ -74,11 +82,15 @@ struct itsPid {
7482
LOG(fatal) << "Not implemented yet";
7583
} else {
7684
const char* key = metadataInfo.isMC() ? "MC" : "Data";
77-
o2::aod::ITSResponse::setParameters(itsParams->get(key, "bb1"),
78-
itsParams->get(key, "bb2"),
79-
itsParams->get(key, "bb3"),
80-
itsParams->get(key, "Charge exponent"),
81-
itsParams->get(key, "Resolution"));
85+
o2::aod::ITSResponse::setParameters(itsParams->get(key, "RespITSPar1"),
86+
itsParams->get(key, "RespITSPar2"),
87+
itsParams->get(key, "RespITSPar3"),
88+
itsParams->get(key, "RespITSPar1_Z2"),
89+
itsParams->get(key, "RespITSPar2_Z2"),
90+
itsParams->get(key, "RespITSPar3_Z2"),
91+
itsParams->get(key, "ResolutionPar1"),
92+
itsParams->get(key, "ResolutionPar2"),
93+
itsParams->get(key, "ResolutionPar3"));
8294
}
8395
}
8496

0 commit comments

Comments
 (0)