19{
20
21 MuonCalibIntScaleSmearTool::MuonCalibIntScaleSmearTool(
const std::string &name) :
asg::AsgTool(
name)
22 {}
23
24 StatusCode MuonCalibIntScaleSmearTool::initialize()
25 {
26
28
29
31
32
33
35 {
36 for(const auto & param: m_paramList)
37 {
41 }
42
45 }
46
47
48 m_currentParameters = nullptr;
49
50 m_Parameters.initialize(affectingSystematics(), [
this](
const CP::SystematicSet &systConfig, ParameterSetScaleSmear ¶m)
51 { return calcSystematicVariation(systConfig, param); });
53 {
55 return StatusCode::FAILURE;
56 }
58 if (
registry.registerSystematics(*
this) != StatusCode::SUCCESS)
59 {
61 return StatusCode::FAILURE;
62 }
63
64 return StatusCode::SUCCESS;
65 }
66
68 {
69
71
72
73 auto IDcorrConstants = getConstants(
mu.ID, m_IDparams.at(
mu.ID.year), m_currentParameters->m_IDparams);
74 auto MEcorrConstants = getConstants(
mu.ME, m_MEparams.at(
mu.ME.year), m_currentParameters->m_MEparams);
75 auto CBcorrConstants = getConstants(
mu.CB, m_CBparams.at(
mu.CB.year), m_currentParameters->m_CBparams);
76
77 double corrIDpT = getCorrectedPt(mu,
mu.ID, IDcorrConstants);
78 double corrMEpT = getCorrectedPt(mu,
mu.ME, MEcorrConstants);
79 double corrCBpT = getCorrectedPt(mu,
mu.CB, CBcorrConstants);
80
81
82
83
84
85
86
87
88 double corrCBpTWithIDME = getCorrectedCBPtWithIDMSComb(mu, IDcorrConstants, MEcorrConstants);
89
90
91
92 mu.ID.calib_pt = corrIDpT * ((corrIDpT < -0.1) ? -1 : 1);
93 mu.ME.calib_pt = corrMEpT * ((corrMEpT < -0.1) ? -1 : 1);
94 mu.CB.calib_pt = corrCBpT * ((corrCBpT < -0.1) ? -1 : 1);
95
96 mu.ID.calib_charge =
mu.ID.uncalib_charge * ((corrIDpT < -0.1) ? -1 : 1);
97 mu.ME.calib_charge =
mu.ME.uncalib_charge * ((corrMEpT < -0.1) ? -1 : 1);
98 mu.CB.calib_charge =
mu.CB.uncalib_charge * ((corrCBpT < -0.1) ? -1 : 1);
99
100 if(m_calibMode == MuonCalibTool::correctData_IDMS || m_calibMode == MuonCalibTool::notCorrectData_IDMS) {
101 mu.CB.calib_pt = corrCBpTWithIDME * ((corrCBpTWithIDME < -0.1) ? -1 : 1);
102 mu.CB.calib_charge =
mu.CB.uncalib_charge * ((corrCBpTWithIDME < -0.1) ? -1 : 1);
103 }
104 else if(m_calibMode == MuonCalibTool::correctData_IDonly) {
105 mu.CB.calib_pt =
mu.ID.calib_pt;
106 mu.CB.calib_charge =
mu.ID.calib_charge;
107 }
108 else if(m_calibMode == MuonCalibTool::correctData_MSonly) {
109 mu.CB.calib_pt =
mu.ME.calib_pt;
110 mu.CB.calib_charge =
mu.ME.calib_charge;
111 }
112
113
115 }
116
117 std::map<MCP::ScaleSmearParam, double> MuonCalibIntScaleSmearTool::getConstants(
const MCP::TrackCalibObj& trk,
const std::map<MCP::ScaleSmearParam, ScaleSmearCorrConstMap>&
constants,
const std::map<MCP::ScaleSmearParam, double>& direction)
const
118 {
119
120 std::map<MCP::ScaleSmearParam, double> calibConstants;
121
122
123 for(const auto& param: m_paramList)
124 {
125 const auto & contantList =
constants.at(param);
126
129 {
131 }
133 {
135 }
136
137
139 {
140 val = std::max(0.0, val);
141 }
142
143 calibConstants[param] =
val;
144 }
145
146 return calibConstants;
147 }
148
149
150 double MuonCalibIntScaleSmearTool::getCorrectedPt(
const MCP::MuonObj& mu,
const MCP::TrackCalibObj& trk,
const std::map<MCP::ScaleSmearParam, double>& calibConstant)
const
151 {
153
154
157
159
160
163
164
166
167 return corrpT;
168 }
169
171 {
173
176 {
177
178 double additional_weight = 1.;
179 if (std::abs(trk.
eta) > 2) additional_weight = sinh(trk.
eta);
180
181 return r1 *
mu.rnd_g3 +
r2 *
mu.rnd_g4 *
pT * additional_weight;
182 }
184 }
185
186
187 double MuonCalibIntScaleSmearTool::getCorrectedCBPtWithIDMSComb(
const MCP::MuonObj& mu,
const std::map<MCP::ScaleSmearParam, double>& calibIDConstant,
const std::map<MCP::ScaleSmearParam, double>& calibMEConstant)
const
188 {
189
190 double weightID = 0.5;
191 double weightME = 0.5;
192
193 double deltaCBME =
mu.CB.calib_pt -
mu.ME.calib_pt;
194 double deltaCBID =
mu.CB.calib_pt -
mu.ID.calib_pt;
195
196 if (
mu.ME.calib_pt == 0)
197 {
198 weightID = 1.0;
199 weightME = 0.0;
200 }
201 else if (
mu.ID.calib_pt == 0)
202 {
203 weightID = 0.0;
204 weightME = 1.0;
205 }
206 else if (
mu.CB.calib_pt != 0)
207 {
208 if (std::abs(deltaCBME) > 0 || std::abs(deltaCBID) > 0)
209 {
210 double R = 1, Rplus = 1;
211 if (std::abs(deltaCBME) == std::abs(deltaCBID))
212 {
213
214 }
215 else if (std::abs(deltaCBME) != 0 &&
216 std::abs(deltaCBME) > std::abs(deltaCBID)) {
217 R = (-deltaCBID) / deltaCBME;
219 if (Rplus != 0 && R > 0) {
220 weightID = 1 / Rplus;
221 weightME =
R / Rplus;
222 }
223 }
224 else if (std::abs(deltaCBID) != 0 &&
225 std::abs(deltaCBME) < std::abs(deltaCBID)) {
226 R = (-deltaCBME) / (deltaCBID);
228 if (Rplus != 0 && R > 0) {
229 weightID =
R / Rplus;
230 weightME = 1 / Rplus;
231 }
232 }
233 }
234 }
235
236 if(weightID == 0.5 && weightME == 0.5)
237 {
238 if(
mu.expectedPercentResME<std::numeric_limits<double>::epsilon() ||
239 mu.CB.calib_pt<std::numeric_limits<double>::epsilon() ||
mu.expectedPercentResID<std::numeric_limits<double>::epsilon() ){
240 ATH_MSG_VERBOSE(
"Potential FPE caught! Continue with averaging ID+MS");
244 } else {
245 double wME =
mu.ME.calib_pt /
mu.CB.calib_pt / std::pow(
mu.expectedPercentResME, 2);
246 double wID =
mu.ID.calib_pt /
mu.CB.calib_pt / std::pow(
mu.expectedPercentResID, 2);
247 weightID = wID / (wME + wID);
248 weightME = wME / (wME + wID);
249 }
250 }
251
252
253
256 double smearCorr = weightID * smearIDCorr + weightME * smearMECorr;
257 double scaleCB = 0;
258
259
263
269
276
277 double pT =
mu.CB.calib_pt;
278 double corrpT = (
pT +
pT * scaleCB)/(1 + smearCorr);
279
280 return corrpT;
281 }
282
283
285 {
287 return sys.find(systematic) !=
sys.end();
288 }
289
291 {
294
296 if (m_calibMode == MuonCalibTool::correctData_CB || m_calibMode == MuonCalibTool::notCorrectData_CB || m_sysScheme == "AllSys") {
297
300 }
301 if (m_calibMode == MuonCalibTool::correctData_IDMS || m_calibMode == MuonCalibTool::notCorrectData_IDMS || m_calibMode == MuonCalibTool::correctData_IDonly || m_sysScheme == "AllSys") {
302
305 }
306 if (m_calibMode == MuonCalibTool::correctData_IDMS || m_calibMode == MuonCalibTool::notCorrectData_IDMS || m_calibMode == MuonCalibTool::correctData_MSonly || m_sysScheme == "AllSys") {
307
310 }
311
315 if (m_sysScheme == "Corr_Scale") {
318 }
319 else if (m_sysScheme == "Decorr_Scale" || m_sysScheme == "AllSys") {
320
321 if (m_calibMode == MuonCalibTool::correctData_CB || m_calibMode == MuonCalibTool::notCorrectData_CB || m_sysScheme == "AllSys") {
324
327 }
328
329
330 if (m_calibMode == MuonCalibTool::correctData_IDMS || m_calibMode == MuonCalibTool::notCorrectData_IDMS || m_calibMode == MuonCalibTool::correctData_IDonly || m_sysScheme == "AllSys") {
333 }
334
335
336 if (m_calibMode == MuonCalibTool::correctData_IDMS || m_calibMode == MuonCalibTool::notCorrectData_IDMS || m_calibMode == MuonCalibTool::correctData_MSonly || m_sysScheme == "AllSys") {
339
342 }
343 }
344
345
346
347
349 }
350
351 CP::SystematicSet MuonCalibIntScaleSmearTool::recommendedSystematics()
const {
return affectingSystematics(); }
352
353 StatusCode MuonCalibIntScaleSmearTool::calcSystematicVariation(
const CP::SystematicSet &systConfig, ParameterSetScaleSmear ¶m)
const
354 {
360
366
372
373
374
376
385 }
else if (!syst.
empty())
return StatusCode::FAILURE;
386
387
389
398 }
else if (!syst.
empty())
return StatusCode::FAILURE;
399
400
402
411 }
else if (!syst.
empty())
return StatusCode::FAILURE;
412
413
415
419
422
425
429
432
435 }
else if (!syst.
empty())
return StatusCode::FAILURE;
436
437
439
446 }
else if (!syst.
empty())
return StatusCode::FAILURE;
447
449
454 }
else if (!syst.
empty())
return StatusCode::FAILURE;
455
457
462 }
else if (!syst.
empty())
return StatusCode::FAILURE;
463
465
470 }
else if (!syst.
empty())
return StatusCode::FAILURE;
471
473
478 }
else if (!syst.
empty())
return StatusCode::FAILURE;
479
480 return StatusCode::SUCCESS;
481 }
482
484 {
485 return m_Parameters.get(systConfig, m_currentParameters);
486 }
487
488
489 double MuonCalibIntScaleSmearTool::getExpectedResolution(
const int &
DetType,
double pT,
double eta,
double phi,
MCP::DataYear year,
bool addMCCorrectionSmearing)
const
490 {
491
492 const auto & IDcorrConstants = m_IDparams.at(year);
493 const auto & MEcorrConstants = m_MEparams.at(year);
494 const auto & IDExpectedResConstants = m_IDExpectedResparams.at(year);
495 const auto & MEExpectedResConstants = m_MEExpectedResparams.at(year);
496
499
501
502
503 double expRes = 0.;
505 {
506 if (pT == 0) return 1e12;
507
511
512 if(!addMCCorrectionSmearing)
513 {
517 }
518 else
519 {
523
527
528 p0 = std::sqrt(std::pow(expectedP0, 2) + std::pow(r0, 2));
529 p1 = std::sqrt(std::pow(expectedP1, 2) + std::pow(r1, 2));
530 p2 = std::sqrt(std::pow(expectedP2, 2) + std::pow(r2, 2));
531 }
532
533 expRes = std::sqrt(std::pow(p0 / pT, 2) + std::pow(p1, 2) + std::pow(p2 * pT, 2));
534
535 }
537 {
538 if (pT == 0) return 1e12;
539
542
543 if(!addMCCorrectionSmearing)
544 {
548 if(p2Tan)
p2 = p2Tan;
549 }
550 else
551 {
555 if(p2Tan) expectedP2 = p2Tan;
556
559
560 p1 = std::sqrt(std::pow(expectedP1, 2) + std::pow(r1, 2));
561 p2 = std::sqrt(std::pow(expectedP2, 2) + std::pow(r2, 2));
562
563 if(p2Tan)
p2 =
p2 * std::sinh(
eta) * std::sinh(
eta);
564 }
565
566 expRes = std::sqrt(std::pow(p1, 2) + std::pow(p2 * pT, 2));
567 return expRes;
568 }
569 else
570 {
572 return 0.;
573 }
574
575 return expRes;
576 }
577
578
579}
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
Return value from object correction CP tools.
@ Ok
The correction was done successfully.
This module implements the central registry for handling systematic uncertainties with CP tools.
static SystematicRegistry & getInstance()
Get the singleton instance of the registry for the curren thread.
Class to wrap a set of SystematicVariations.
SystematicVariation getSystematicByBaseName(const std::string &basename) const
description: get the first systematic matching basename
bool empty() const
returns: whether this is an empty systematic, i.e.
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
::StatusCode StatusCode
StatusCode definition for legacy code.
std::map< ExpectedResParam, std::shared_ptr< CalibContainer > > createExpectedResMap(DataYear dataYear, TrackType type, const std::string &recommendationPath)
std::map< ScaleResCorrection, std::shared_ptr< CalibContainer > > createScaleResCorrMap(DataYear dataYear, TrackType type, const std::string &recommendationPath, ScaleSmearParam param)
static constexpr std::array< MCP::DataYear, 8 > dataYearList
std::string toString(TrackType trkType)
const double r0
electron radius{cm}
const Amg::Vector3D & direction() const
Method to retrieve the direction at the Intersection.
Basic object to cache all relevant information from the track.
const double eta
Value of the track-eta.
double calib_pt
Smeared track pt.
const TrackType type
Flag telling the code whether this is CB/ME/ID.