54 return StatusCode::FAILURE;
60 return StatusCode::FAILURE;
63 return StatusCode::SUCCESS;
91 mu.ID.calib_pt = corrIDpT * ((corrIDpT < -0.1) ? -1 : 1);
92 mu.ME.calib_pt = corrMEpT * ((corrMEpT < -0.1) ? -1 : 1);
93 mu.CB.calib_pt = corrCBpT * ((corrCBpT < -0.1) ? -1 : 1);
95 mu.ID.calib_charge = mu.ID.uncalib_charge * ((corrIDpT < -0.1) ? -1 : 1);
96 mu.ME.calib_charge = mu.ME.uncalib_charge * ((corrMEpT < -0.1) ? -1 : 1);
97 mu.CB.calib_charge = mu.CB.uncalib_charge * ((corrCBpT < -0.1) ? -1 : 1);
100 mu.CB.calib_pt = corrCBpTWithIDME * ((corrCBpTWithIDME < -0.1) ? -1 : 1);
101 mu.CB.calib_charge = mu.CB.uncalib_charge * ((corrCBpTWithIDME < -0.1) ? -1 : 1);
111 std::map<MCP::ScaleSmearParam, double> calibConstants;
116 const auto & contantList =
constants.at(param);
131 val = std::max(0.0, val);
134 calibConstants[param] = val;
137 return calibConstants;
169 double additional_weight = 1.;
170 if (std::abs(trk.
eta) > 2) additional_weight = sinh(trk.
eta);
172 return r1 * mu.rnd_g3 + r2 * mu.rnd_g4 * pT * additional_weight;
174 return r0 * mu.rnd_g0 / pT + r1 * mu.rnd_g1 + r2 * mu.rnd_g2 * pT;
181 double weightID = 0.5;
182 double weightME = 0.5;
184 double deltaCBME = mu.CB.calib_pt - mu.ME.calib_pt;
185 double deltaCBID = mu.CB.calib_pt - mu.ID.calib_pt;
187 if (mu.ME.calib_pt == 0)
192 else if (mu.ID.calib_pt == 0)
197 else if (mu.CB.calib_pt != 0)
199 if (std::abs(deltaCBME) > 0 || std::abs(deltaCBID) > 0)
201 double R = 1, Rplus = 1;
202 if (std::abs(deltaCBME) == std::abs(deltaCBID))
206 else if (std::abs(deltaCBME) != 0 &&
207 std::abs(deltaCBME) > std::abs(deltaCBID)) {
208 R = (-deltaCBID) / deltaCBME;
210 if (Rplus != 0 && R > 0) {
211 weightID = 1 / Rplus;
212 weightME = R / Rplus;
215 else if (std::abs(deltaCBID) != 0 &&
216 std::abs(deltaCBME) < std::abs(deltaCBID)) {
217 R = (-deltaCBME) / (deltaCBID);
219 if (Rplus != 0 && R > 0) {
220 weightID = R / Rplus;
221 weightME = 1 / Rplus;
227 if(weightID == 0.5 && weightME == 0.5)
229 if(mu.expectedPercentResME<std::numeric_limits<double>::epsilon() ||
230 mu.CB.calib_pt<std::numeric_limits<double>::epsilon() || mu.expectedPercentResID<std::numeric_limits<double>::epsilon() ){
231 ATH_MSG_VERBOSE(
"Potential FPE caught! Continue with averaging ID+MS");
232 ATH_MSG_VERBOSE(
"mu.expectedPercentResME = "<<mu.expectedPercentResME);
233 ATH_MSG_VERBOSE(
"mu.expectedPercentResID = "<<mu.expectedPercentResID);
236 double wME = mu.ME.calib_pt / mu.CB.calib_pt / std::pow(mu.expectedPercentResME, 2);
237 double wID = mu.ID.calib_pt / mu.CB.calib_pt / std::pow(mu.expectedPercentResID, 2);
238 weightID = wID / (wME + wID);
239 weightME = wME / (wME + wID);
247 double smearCorr = weightID * smearIDCorr + weightME * smearMECorr;
268 double pT = mu.CB.calib_pt;
269 double corrpT = (pT + pT * scaleCB)/(1 + smearCorr);
278 return sys.find(systematic) != sys.end();
372 }
else if (!syst.
empty())
return StatusCode::FAILURE;
385 }
else if (!syst.
empty())
return StatusCode::FAILURE;
398 }
else if (!syst.
empty())
return StatusCode::FAILURE;
422 }
else if (!syst.
empty())
return StatusCode::FAILURE;
433 }
else if (!syst.
empty())
return StatusCode::FAILURE;
441 }
else if (!syst.
empty())
return StatusCode::FAILURE;
449 }
else if (!syst.
empty())
return StatusCode::FAILURE;
457 }
else if (!syst.
empty())
return StatusCode::FAILURE;
465 }
else if (!syst.
empty())
return StatusCode::FAILURE;
467 return StatusCode::SUCCESS;
479 const auto & IDcorrConstants =
m_IDparams.at(year);
480 const auto & MEcorrConstants =
m_MEparams.at(year);
493 if (pT == 0)
return 1e12;
499 if(!addMCCorrectionSmearing)
515 p0 = std::sqrt(std::pow(expectedP0, 2) + std::pow(r0, 2));
516 p1 = std::sqrt(std::pow(expectedP1, 2) + std::pow(r1, 2));
517 p2 = std::sqrt(std::pow(expectedP2, 2) + std::pow(r2, 2));
520 expRes = std::sqrt(std::pow(p0 / pT, 2) + std::pow(p1, 2) + std::pow(p2 * pT, 2));
525 if (pT == 0)
return 1e12;
530 if(!addMCCorrectionSmearing)
535 if(p2Tan) p2 = p2Tan;
542 if(p2Tan) expectedP2 = p2Tan;
547 p1 = std::sqrt(std::pow(expectedP1, 2) + std::pow(r1, 2));
548 p2 = std::sqrt(std::pow(expectedP2, 2) + std::pow(r2, 2));
550 if(p2Tan) p2 = p2 * std::sinh(
eta) * std::sinh(
eta);
553 expRes = std::sqrt(std::pow(p1, 2) + std::pow(p2 * pT, 2));
Scalar eta() const
pseudorapidity method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(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.
StatusCode registerSystematics(const IReentrantSystematicsTool &tool)
effects: register all the systematics from the tool
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.
@ Ok
The correction was done successfully.
Select isolated Photons, Electrons and Muons.
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)
std::string toString(TrackType trkType)
static constexpr std::array< MCP::DataYear, 7 > dataYearList
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.