24void NonlinearityHandler::initParams()
26 std::fill(mNonlinearityParam.begin(), mNonlinearityParam.end(), 0);
27 switch (mNonlinearyFunction) {
29 mNonlinearityParam[0] = 1.09357;
30 mNonlinearityParam[1] = 0.0192266;
31 mNonlinearityParam[2] = 0.291993;
32 mNonlinearityParam[3] = 370.927;
33 mNonlinearityParam[4] = 694.656;
36 mNonlinearityParam[0] = 1.014;
37 mNonlinearityParam[1] = -0.03329;
38 mNonlinearityParam[2] = -0.3853;
39 mNonlinearityParam[3] = 0.5423;
40 mNonlinearityParam[4] = -0.4335;
43 mNonlinearityParam[0] = 3.11111e-02;
44 mNonlinearityParam[1] = -5.71666e-02;
45 mNonlinearityParam[2] = 5.67995e-01;
48 mNonlinearityParam[0] = 9.81039e-01;
49 mNonlinearityParam[1] = 1.13508e-01;
50 mNonlinearityParam[2] = 1.00173e+00;
51 mNonlinearityParam[3] = 9.67998e-02;
52 mNonlinearityParam[4] = 2.19381e+02;
53 mNonlinearityParam[5] = 6.31604e+01;
54 mNonlinearityParam[6] = 1;
57 mNonlinearityParam[0] = 1.0;
58 mNonlinearityParam[1] = 6.64778e-02;
59 mNonlinearityParam[2] = 1.570;
60 mNonlinearityParam[3] = 9.67998e-02;
61 mNonlinearityParam[4] = 2.19381e+02;
62 mNonlinearityParam[5] = 6.31604e+01;
63 mNonlinearityParam[6] = 1.01286;
66 mNonlinearityParam[0] = 1.0;
67 mNonlinearityParam[1] = 0.0797873;
68 mNonlinearityParam[2] = 1.68322;
69 mNonlinearityParam[3] = 0.0806098;
70 mNonlinearityParam[4] = 244.586;
71 mNonlinearityParam[5] = 116.938;
72 mNonlinearityParam[6] = 1.00437;
75 mNonlinearityParam[0] = 0.99078;
76 mNonlinearityParam[1] = 0.161499;
77 mNonlinearityParam[2] = 0.655166;
78 mNonlinearityParam[3] = 0.134101;
79 mNonlinearityParam[4] = 163.282;
80 mNonlinearityParam[5] = 23.6904;
81 mNonlinearityParam[6] = 0.978;
85 mNonlinearityParam[0] = 0.983504;
86 mNonlinearityParam[1] = 0.210106;
87 mNonlinearityParam[2] = 0.897274;
88 mNonlinearityParam[3] = 0.0829064;
89 mNonlinearityParam[4] = 152.299;
90 mNonlinearityParam[5] = 31.5028;
91 mNonlinearityParam[6] = 0.968;
98 mNonlinearityParam[0] = 0.976941;
99 mNonlinearityParam[1] = 0.162310;
100 mNonlinearityParam[2] = 1.08689;
101 mNonlinearityParam[3] = 0.0819592;
102 mNonlinearityParam[4] = 152.338;
103 mNonlinearityParam[5] = 30.9594;
104 mNonlinearityParam[6] = 0.9615;
115 mNonlinearityParam[0] = 0.9892;
116 mNonlinearityParam[1] = 0.1976;
117 mNonlinearityParam[2] = 0.865;
118 mNonlinearityParam[3] = 0.06775;
119 mNonlinearityParam[4] = 156.6;
120 mNonlinearityParam[5] = 47.18;
121 mNonlinearityParam[6] = 0.97;
126 mNonlinearityParam[0] = 1.91897;
127 mNonlinearityParam[1] = 0.0264988;
128 mNonlinearityParam[2] = 0.965663;
129 mNonlinearityParam[3] = -187.501;
130 mNonlinearityParam[4] = 2762.51;
137 mApplyScaleCorrection =
true;
142 double correctedEnergy = energy;
143 switch (mNonlinearyFunction) {
145 correctedEnergy = evaluatePi0MC(energy);
148 correctedEnergy = evaluatePi0MCv2(energy);
156 correctedEnergy = evaluateTestbeamCorrected(energy);
161 correctedEnergy = evaluateTestbeamShaper(energy);
166 if (mApplyScaleCorrection) {
167 correctedEnergy /= 1.0505;
169 return correctedEnergy;
172double NonlinearityHandler::evaluateTestbeamShaper(
double energy)
const
174 return energy / (1.00 * (mNonlinearityParam[0] + mNonlinearityParam[1] * std::log(energy)) / (1 + (mNonlinearityParam[2] * std::exp((energy - mNonlinearityParam[3]) / mNonlinearityParam[4]))));
177double NonlinearityHandler::evaluateTestbeamCorrected(
double energy)
const
179 return energy * mNonlinearityParam[6] / (mNonlinearityParam[0] * (1. / (1. + mNonlinearityParam[1] * std::exp(-energy / mNonlinearityParam[2])) * 1. / (1. + mNonlinearityParam[3] * std::exp((energy - mNonlinearityParam[4]) / mNonlinearityParam[5]))));
182double NonlinearityHandler::evaluatePi0MC(
double energy)
const
184 return energy * (mNonlinearityParam[0] * std::exp(-mNonlinearityParam[1] / energy)) +
185 ((mNonlinearityParam[2] / (mNonlinearityParam[3] * 2. * TMath::Pi()) *
186 std::exp(-(energy - mNonlinearityParam[4]) * (energy - mNonlinearityParam[4]) / (2. * mNonlinearityParam[3] * mNonlinearityParam[3]))));
189double NonlinearityHandler::evaluatePi0MCv2(
double energy)
const
191 return energy * mNonlinearityParam[0] / TMath::Power(energy + mNonlinearityParam[1], mNonlinearityParam[2]) + 1;
197 return energy * 16.3 / 16;
199 constexpr std::array<double, 8> par = {{1, 29.8279, 0.607704, 0.00164896, -2.28595e-06, -8.54664e-10, 5.50191e-12, -3.28098e-15}};
200 double x = par[0] * energy / ecalibHG / 16 / 0.0162;
204 res += par[3] *
x *
x;
205 res += par[4] *
x *
x *
x;
210 return ecalibHG * 16.3 *
res * 0.0162;
218 for (
auto&
param : mNonlinearityParam) {
232 if (
name ==
"MC_Pi0") {
233 return NLType::MC_PI0;
235 if (
name ==
"MC_Pi0_v2") {
236 return NLType::MC_PI0_V2;
238 if (
name ==
"MC_Pi0_v3") {
239 return NLType::MC_PI0_V3;
241 if (
name ==
"MC_Pi0_v5") {
242 return NLType::MC_PI0_V5;
244 if (
name ==
"MC_Pi0_v6") {
245 return NLType::MC_PI0_V6;
247 if (
name ==
"MC_TestbeamFinal") {
248 return NLType::MC_TESTBEAM_FINAL;
250 if (
name ==
"DATA_BeamTestCorrected") {
251 return NLType::DATA_TESTBEAM_CORRECTED;
253 if (
name ==
"DATA_BeamTestCorrected_v2") {
254 return NLType::DATA_TESTBEAM_CORRECTED_V2;
256 if (
name ==
"DATA_BeamTestCorrected_v3") {
257 return NLType::DATA_TESTBEAM_CORRECTED_V3;
259 if (
name ==
"DATA_BeamTestCorrected_v4") {
260 return NLType::DATA_TESTBEAM_CORRECTED_V4;
262 if (
name ==
"DATA_TestbeamFinal") {
263 return NLType::DATA_TESTBEAM_SHAPER;
265 if (
name ==
"DATA_TestbeamFinal_NoScale") {
266 return NLType::DATA_TESTBEAM_SHAPER_WOSCALE;
268 return NLType::UNKNOWN;
277 case NLType::MC_PI0_V2:
279 case NLType::MC_PI0_V3:
281 case NLType::MC_PI0_V5:
283 case NLType::MC_PI0_V6:
285 case NLType::MC_TESTBEAM_FINAL:
286 return "MC_TestbeamFinal";
287 case NLType::DATA_TESTBEAM_CORRECTED:
288 return "DATA_BeamTestCorrected";
289 case NLType::DATA_TESTBEAM_CORRECTED_V2:
290 return "DATA_BeamTestCorrected_v2";
291 case NLType::DATA_TESTBEAM_CORRECTED_V3:
292 return "DATA_BeamTestCorrected_v3";
293 case NLType::DATA_TESTBEAM_CORRECTED_V4:
294 return "DATA_BeamTestCorrected_v4";
295 case NLType::DATA_TESTBEAM_SHAPER:
296 return "DATA_TestbeamFinal";
297 case NLType::DATA_TESTBEAM_SHAPER_WOSCALE:
298 return "DATA_TestbeamFinal_NoScale";
299 case NLType::UNKNOWN:
308 auto found = mHandlers.find(nonlintype);
309 if (found != mHandlers.end()) {
310 return found->second;
312 auto [insert_result, insert_status] = mHandlers.try_emplace(nonlintype,
NonlinearityHandler(nonlintype));
314 return insert_result->second;
326 auto found = mNonlinNames.find(
static_cast<std::string
>(nonlinName));
327 if (found != mNonlinNames.end()) {
328 return found->second;
333void NonlinearityFactory::initNonlinNames()
336 constexpr std::array<NLType, 12> nonlintypes = {{NLType::MC_PI0,
341 NLType::MC_TESTBEAM_FINAL,
342 NLType::DATA_TESTBEAM_CORRECTED,
343 NLType::DATA_TESTBEAM_CORRECTED_V2,
344 NLType::DATA_TESTBEAM_CORRECTED_V3,
345 NLType::DATA_TESTBEAM_CORRECTED_V4,
346 NLType::DATA_TESTBEAM_SHAPER,
347 NLType::DATA_TESTBEAM_SHAPER_WOSCALE
350 for (
auto nonlin : nonlintypes) {
Handling request of non-exisiting nonlinearity functions.
Handling errors of initialisation of a certain nonlinearity function.
NonlinearityHandler & getNonlinearity(NonlinearityHandler::NonlinType_t nonlintype)
Get nonlinearity handler for the given nonlinearty type.
Handling missing initialisation of the NonlinearityHanlder.
Nonlinearity functions for energy correction.
NonlinType_t
Types of nonlinearity functions available.
@ MC_PI0
MC, function corresponding to inital testbeam nonlin without shaper correction.
@ MC_PI0_V5
MC, function corresponding to inital testbeam nonlin without shaper correction, version 5.
@ DATA_TESTBEAM_SHAPER_WOSCALE
Data, testbeam nonlin for shaper correction, without energy rescaling.
@ DATA_TESTBEAM_CORRECTED_V4
Data, inital testbeam nonlin without shaper correction, version 4.
@ MC_PI0_V6
MC, function corresponding to inital testbeam nonlin without shaper correction, version 6.
@ MC_TESTBEAM_FINAL
MC, function corresponding to data testbeam nonlin for shaper correction, with energy rescaling.
@ MC_PI0_V3
MC, function corresponding to inital testbeam nonlin without shaper correction, version 3.
@ DATA_TESTBEAM_CORRECTED
Data, inital testbeam nonlin without shaper correction.
@ DATA_TESTBEAM_CORRECTED_V3
Data, inital testbeam nonlin without shaper correction, version 3.
@ DATA_TESTBEAM_CORRECTED_V2
Data, inital testbeam nonlin without shaper correction, version 2.
@ DATA_TESTBEAM_SHAPER
Data, testbeam nonlin for shaper correction, with energy rescaling.
@ MC_PI0_V2
MC, function corresponding to inital testbeam nonlin without shaper correction, version 2.
double getCorrectedClusterEnergy(double energy) const
Get corrected cluster energy for the selected nonlinearity parameterization.
static double evaluateShaperCorrectionCellEnergy(double energy, double ecalibHG=1)
Get corrected energy at cell level for the shaper saturation at high energy.
static NonlinType_t getNonlinType(const std::string_view name)
Get type of a nonlinearity function from its name.
NonlinearityHandler()=default
Dummy constructor.
void printStream(std::ostream &stream) const
Print information about the nonlinearity function.
static const char * getNonlinName(NonlinType_t nonlin)
Get name of the nonlinearity function from the function type.
GLuint const GLchar * name
std::ostream & operator<<(std::ostream &stream, const Cell &cell)
Stream operator for EMCAL cell.