55 return StatusCode::FAILURE;
61 return StatusCode::FAILURE;
64 return StatusCode::SUCCESS;
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);
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);
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);
104 else if(
m_calibMode == MuonCalibTool::correctData_IDonly) {
105 mu.CB.calib_pt = mu.ME.calib_pt;
106 mu.CB.calib_charge = mu.ME.calib_charge;
108 else if(
m_calibMode == MuonCalibTool::correctData_MSonly) {
109 mu.CB.calib_pt =
mu.ID.calib_pt;
110 mu.CB.calib_charge =
mu.ID.calib_charge;
120 std::map<MCP::ScaleSmearParam, double> calibConstants;
125 const auto & contantList =
constants.at(param);
140 val = std::max(0.0, val);
143 calibConstants[param] = val;
146 return calibConstants;
178 double additional_weight = 1.;
179 if (std::abs(trk.
eta) > 2) additional_weight = sinh(trk.
eta);
181 return r1 * mu.rnd_g3 + r2 * mu.rnd_g4 * pT * additional_weight;
183 return r0 * mu.rnd_g0 / pT + r1 * mu.rnd_g1 + r2 * mu.rnd_g2 * pT;
190 double weightID = 0.5;
191 double weightME = 0.5;
193 double deltaCBME = mu.CB.calib_pt - mu.ME.calib_pt;
194 double deltaCBID = mu.CB.calib_pt - mu.ID.calib_pt;
196 if (mu.ME.calib_pt == 0)
201 else if (mu.ID.calib_pt == 0)
206 else if (mu.CB.calib_pt != 0)
208 if (std::abs(deltaCBME) > 0 || std::abs(deltaCBID) > 0)
210 double R = 1, Rplus = 1;
211 if (std::abs(deltaCBME) == std::abs(deltaCBID))
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;
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;
236 if(weightID == 0.5 && weightME == 0.5)
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");
241 ATH_MSG_VERBOSE(
"mu.expectedPercentResME = "<<mu.expectedPercentResME);
242 ATH_MSG_VERBOSE(
"mu.expectedPercentResID = "<<mu.expectedPercentResID);
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);
256 double smearCorr = weightID * smearIDCorr + weightME * smearMECorr;
277 double pT = mu.CB.calib_pt;
278 double corrpT = (pT + pT * scaleCB)/(1 + smearCorr);
287 return sys.find(systematic) != sys.end();
385 }
else if (!syst.
empty())
return StatusCode::FAILURE;
398 }
else if (!syst.
empty())
return StatusCode::FAILURE;
411 }
else if (!syst.
empty())
return StatusCode::FAILURE;
435 }
else if (!syst.
empty())
return StatusCode::FAILURE;
446 }
else if (!syst.
empty())
return StatusCode::FAILURE;
454 }
else if (!syst.
empty())
return StatusCode::FAILURE;
462 }
else if (!syst.
empty())
return StatusCode::FAILURE;
470 }
else if (!syst.
empty())
return StatusCode::FAILURE;
478 }
else if (!syst.
empty())
return StatusCode::FAILURE;
480 return StatusCode::SUCCESS;
492 const auto & IDcorrConstants =
m_IDparams.at(year);
493 const auto & MEcorrConstants =
m_MEparams.at(year);
506 if (pT == 0)
return 1e12;
512 if(!addMCCorrectionSmearing)
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));
533 expRes = std::sqrt(std::pow(p0 / pT, 2) + std::pow(p1, 2) + std::pow(p2 * pT, 2));
538 if (pT == 0)
return 1e12;
543 if(!addMCCorrectionSmearing)
548 if(p2Tan) p2 = p2Tan;
555 if(p2Tan) expectedP2 = p2Tan;
560 p1 = std::sqrt(std::pow(expectedP1, 2) + std::pow(r1, 2));
561 p2 = std::sqrt(std::pow(expectedP2, 2) + std::pow(r2, 2));
563 if(p2Tan) p2 = p2 * std::sinh(
eta) * std::sinh(
eta);
566 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.
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.