ATLAS Offline Software
MuonCalibTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Framework include(s):
8 
9 // Local include(s):
10 #include <cmath>
11 #include "TRandom3.h"
12 
14 
15 namespace CP
16 {
17 
18  MuonCalibTool::MuonCalibTool(const std::string &name) : asg::AsgTool(name){
19 
21  m_MuonSelectionTool.declarePropertyFor(this,"MuonSelectionTool", "Instance of the MuonSelectionTool needed for the HighPt categorization");
22  m_MuonIntSagittaTool.declarePropertyFor(this, "SagittaTool", "Instance of the Sagitta bias corrections sub tool");
23  m_MuonIntScaleSmearTool.declarePropertyFor(this, "ScaleAndSmearTool", "Instance of the tool that applies the smearing & scale corrections");
24  m_MuonIntHighTSmearTool.declarePropertyFor(this, "HighPtSmearingTool", "Extra smearing of the high pt working point");
25  }
26 
28  {
29  // Greet the user:
30  ATH_MSG_INFO("Initialising...");
31 
32  // Get the m_eventinfo container
34 
35  // Set the options
36  if (m_calibMode == MuonCalibTool::correctData_CB) {
37  ATH_MSG_INFO("Data will be corrected for sagitta bias with CB calibration");
38  m_doDirectCBCalib = true;
40 
41  } else if (m_calibMode == MuonCalibTool::correctData_IDMS) {
42  ATH_MSG_INFO("Data will be corrected for sagitta bias with ID+MS calibration");
43  if (m_isRun3.value()) ATH_MSG_WARNING("You are using the ID+MS calibration which is currenlty not recommended from the MCP group in Run3. Please refer to the MCP documentation page");
44  m_doDirectCBCalib = false;
46 
47  } else if (m_calibMode == MuonCalibTool::notCorrectData_IDMS) {
48  ATH_MSG_INFO("Data will be untouched. Instead an additional systematic will be added with ID+MS calibration");
49  if (m_isRun3.value()) ATH_MSG_WARNING("You are using the ID+MS calibration which is currenlty not recommended from the MCP group in Run3. Please refer to the MCP documentation page");
50  m_doDirectCBCalib = false;
52  }
53  else if (m_calibMode == MuonCalibTool::notCorrectData_CB) {
54  ATH_MSG_INFO("Data will be untouched. Instead an additional systematic will be added with CB calibration");
55  m_doDirectCBCalib = true;
57  }
58  else if (m_calibMode == MuonCalibTool::userDefined) {
59  ATH_MSG_INFO("Using options as provided by the user");
60  }
61  else {
62  ATH_MSG_FATAL("Invalid calibration mode: " << m_calibMode << " Allowed modes are correctData_CB("
63  << MuonCalibTool::correctData_CB << ") correctData_IDMS ("
64  << MuonCalibTool::correctData_IDMS << ") or notCorrectData_IDMS ("
65  << MuonCalibTool::notCorrectData_IDMS << ") or notCorrectData_CB ("
66  << MuonCalibTool::notCorrectData_CB << ")");
67  return StatusCode::FAILURE;
68  }
69 
70  // Get the muon selection tool
71  if (m_MuonSelectionTool.empty()) {
72  m_MuonSelectionTool.setTypeAndName("CP::MuonSelectionTool/MCaST_Own_MST");
74  ATH_CHECK(m_MuonSelectionTool.setProperty("MuQuality", 1));
75  ATH_CHECK(m_MuonSelectionTool.setProperty("TurnOffMomCorr", true));
76  ATH_CHECK(m_MuonSelectionTool.setProperty("IsRun3Geo", m_isRun3.value()));
77  ATH_CHECK(m_MuonSelectionTool.setProperty("OutputLevel", msg().level()));
78  ATH_CHECK(m_MuonSelectionTool.setProperty("ExcludeNSWFromPrecisionLayers", m_excludeNSWFromPrecisionLayers.value()));
79  }
81 
82 
83  // Create the Sagitta tool
85  m_MuonIntSagittaTool.setTypeAndName("CP::MuonCalibIntSagittaTool/MCaST_Sagitta");
87  ATH_CHECK(m_MuonIntSagittaTool.setProperty("systematicScheme", m_sysScheme.value()));
88  ATH_CHECK(m_MuonIntSagittaTool.setProperty("applyCorrectionOnData", m_applyCorrectionOnData.value()));
89  ATH_CHECK(m_MuonIntSagittaTool.setProperty("doDirectCBCalib", m_doDirectCBCalib.value()));
90  ATH_CHECK(m_MuonIntSagittaTool.setProperty("doEtaSagittaSys", m_doEtaSagittaSys.value()));
91  ATH_CHECK(m_MuonIntSagittaTool.setProperty("OutputLevel", msg().level()));
92  }
94 
95  // Create the scale smear tool
97  m_MuonIntScaleSmearTool.setTypeAndName("CP::MuonCalibIntScaleSmearTool/MCaST_ScaleSmear");
99  ATH_CHECK(m_MuonIntScaleSmearTool.setProperty("systematicScheme", m_sysScheme.value()));
100  ATH_CHECK(m_MuonIntScaleSmearTool.setProperty("doDirectCBCalib", m_doDirectCBCalib.value()));
103  }
107  m_MuonIntHighTSmearTool.setTypeAndName("CP::MuonCalibIntHighpTSmearTool/MCaST_highPtScaleSmear");
110  }
113  }
115  {
116  ATH_MSG_ERROR("Unable to run with no systematic");
117  return StatusCode::FAILURE;
118  }
120  if (registry.registerSystematics(*this) != StatusCode::SUCCESS)
121  {
122  ATH_MSG_ERROR("Unkown systematic list");
123  return StatusCode::FAILURE;
124  }
125  // Return gracefully:
126  return StatusCode::SUCCESS;
127  }
128 
130  {
131  ATH_MSG_VERBOSE("Muon Type = " << mu.muonType() << " ( 0: Combined, 1: StandAlone, 2: SegmentTagged, 3: CaloTagged, 4: SiliconAssociatedForwardMuon)");
132  ATH_MSG_VERBOSE("Muon Author = " << mu.author());
133 
134  // Convert to the internal object
135  MCP::MuonObj muonObj = convertToMuonObj(mu);
136  static const SG::AuxElement::Decorator<float> dec_idPt("InnerDetectorPt");
137  static const SG::AuxElement::Decorator<float> dec_mePt("MuonSpectrometerPt");
138  static const SG::AuxElement::Accessor<float> acc_id_pt("InnerDetectorPt");
139  static const SG::AuxElement::Accessor<float> acc_me_pt("MuonSpectrometerPt");
140  static const SG::AuxElement::Decorator<float> dec_idCharge("InnerDetectorCharge");
141  static const SG::AuxElement::Decorator<float> dec_meCharge("MuonSpectrometerCharge");
142  static const SG::AuxElement::Accessor<float> acc_id_charge("InnerDetectorCharge");
143  static const SG::AuxElement::Accessor<float> acc_me_charge("MuonSpectrometerCharge");
144 
145  ATH_MSG_VERBOSE("input ID pT "<<muonObj.ID.calib_pt);
146  ATH_MSG_VERBOSE("input ME pT "<<muonObj.ME.calib_pt);
147  ATH_MSG_VERBOSE("input CB pT "<<muonObj.CB.calib_pt);
148  ATH_MSG_VERBOSE("input eta "<<muonObj.CB.eta);
149  ATH_MSG_VERBOSE("input phi "<<muonObj.CB.phi);
150 
151  if (muonObj.CB.isData)
152  {
153  ATH_MSG_VERBOSE("Doing data corrections");
154 
155  // Sagitta Correction specifics
157  {
159  if (sgCode != CorrectionCode::Ok) return sgCode;
160  }
161 
162  // Override combined momentum for special cases
163  if (std::abs(muonObj.ME.calib_pt) == 0) muonObj.CB.calib_pt = muonObj.ID.calib_pt;
164  if (std::abs(muonObj.ID.calib_pt) == 0) muonObj.CB.calib_pt = muonObj.ME.calib_pt;
165 
166  // Only for combined set it
167  if (mu.muonType() == xAOD::Muon::Combined)
168  {
169  mu.setP4(muonObj.CB.calib_pt * GeVtoMeV, muonObj.CB.eta, muonObj.CB.phi);
170  }
171 
172 
173  dec_idPt(mu) = muonObj.ID.calib_pt * GeVtoMeV;
174  dec_mePt(mu) = muonObj.ME.calib_pt * GeVtoMeV;
175  dec_idCharge(mu) = muonObj.ID.calib_charge;
176  dec_meCharge(mu) = muonObj.ME.calib_charge;
177 
178  ATH_MSG_DEBUG("Checking Output Muon Info for data - Pt_ID: " << acc_id_pt(mu));
179  ATH_MSG_DEBUG("Checking Output Muon Info for data - Pt_MS: " << acc_me_pt(mu));
180  ATH_MSG_DEBUG("Checking Output Muon Info for data - Pt_CB: " << mu.pt());
181 
182  return CorrectionCode::Ok;
183  }
184 
185  // Do Scale and Smearing corrections
187  if (sgCode != CorrectionCode::Ok) return sgCode;
188 
189  // Systematics for sagitta correction
190  if ((mu.muonType() != xAOD::Muon::SiliconAssociatedForwardMuon))
191  {
192  ATH_MSG_VERBOSE("Systematic uncertainties for sagitta bias ");
193  // TODO:: something specific for calo tags
195  if (sgCode != CorrectionCode::Ok) return sgCode;
196  }
197 
198  // Override combined momentum for special cases
199  if (std::abs(muonObj.ME.calib_pt) == 0) muonObj.CB.calib_pt = muonObj.ID.calib_pt;
200  if (std::abs(muonObj.ID.calib_pt) == 0) muonObj.CB.calib_pt = muonObj.ME.calib_pt;
201 
202  // Setting the output object properties right now, so the resolution category get the corrected info
203  mu.setP4(muonObj.CB.calib_pt * GeVtoMeV, muonObj.CB.eta, muonObj.CB.phi);
204  mu.setCharge(muonObj.CB.calib_charge);
205  dec_idPt(mu) = muonObj.ID.calib_pt * GeVtoMeV;
206  dec_mePt(mu) = muonObj.ME.calib_pt * GeVtoMeV;
207  dec_idCharge(mu) = muonObj.ID.calib_charge;
208  dec_meCharge(mu) = muonObj.ME.calib_charge;
209 
210  if(!m_validationMode)
211  {
213  }
214 
215  // Special case: if the proper flags are selected (m_extra_highpt_smearing or m_2stations_highpt_smearing)
216  // an ad-hoc smearing of the combined momentum has to be applied
217  bool extra_smearing = (m_extra_highpt_smearing && (muonObj.raw_mst_category >= 0) && !( muonObj.raw_mst_category & IMuonSelectionTool::CategoryFour)); // Extra smearing, if selected, gets anyway only applied to non-3-station muons!
218  bool highpt_smearing = (m_2stations_highpt_smearing && (muonObj.raw_mst_category >= 0) && ( muonObj.raw_mst_category & IMuonSelectionTool::CategoryThree)); // Special highpt smearing, if selected, gets anyway only applied to missing-inner, 2-station muons only!
219 
220  if (((extra_smearing || highpt_smearing)) && (mu.pt() > m_HighPtSystThreshold * GeVtoMeV))
221  {
222  sgCode = m_MuonIntHighTSmearTool->applyCorrection(muonObj);
223  if (sgCode != CorrectionCode::Ok) return sgCode;
224  }
225 
226  // Final info to be written to the muon object
227  mu.setP4(muonObj.CB.calib_pt * GeVtoMeV, muonObj.CB.eta, muonObj.CB.phi);
228  dec_idPt(mu) = muonObj.ID.calib_pt * GeVtoMeV;
229  dec_mePt(mu) = muonObj.ME.calib_pt * GeVtoMeV;
230 
231 
232  ATH_MSG_DEBUG("Checking Output Muon Info - Pt_ID: " << acc_id_pt(mu));
233  ATH_MSG_DEBUG("Checking Output Muon Info - Pt_MS: " << acc_me_pt(mu));
234  ATH_MSG_DEBUG("Checking Output Muon Info - Pt_CB: " << mu.pt());
235 
236  // If saggita was out of validity, return it here
237  if (sgCode == CorrectionCode::OutOfValidityRange) return sgCode;
238 
239  // Return gracefully:
240  return CorrectionCode::Ok;
241  }
242 
244  {
245  // Convert to the internal object
246  MCP::MuonObj muonObj = convertToMuonObj(inTrk, DetType);
247 
248  // Do Scale and Smearing corrections
250  if (sgCode != CorrectionCode::Ok) return sgCode;
251 
252  double res_pt = (DetType == MCP::DetectorType::MS) ? muonObj.ME.calib_pt*GeVtoMeV : muonObj.ID.calib_pt*GeVtoMeV;
253 
254  inTrk.setDefiningParameters(inTrk.d0(), inTrk.z0(), inTrk.phi0(), inTrk.theta(),
255  inTrk.charge() / (res_pt * std::cosh(inTrk.eta())));
256 
257  // Return gracefully:
258  return CorrectionCode::Ok;
259  }
260 
262  {
263  // A sanity check:
264  if (output)
266  "Non-null pointer received. "
267  "There's a possible memory leak!");
268 
269  // Create a new object:
270  ATH_MSG_VERBOSE("Going to create new xAOD::Muon...");
271  output = new xAOD::Muon();
272  ATH_MSG_VERBOSE("Calling makePrivateStore...");
273  output->makePrivateStore(input);
274 
275  // Use the other function to modify this object:
276  ATH_MSG_VERBOSE("Calling applyCorrection...");
277 
279 
280  return retCode;
281  }
282 
284  {
286  return sys.find(systematic) != sys.end();
287  }
288 
290  {
294  return result;
295  }
296 
298 
300  {
301  // Apply to the underlying tool
303  if(code != StatusCode::SUCCESS) return code;
304 
306  if(code != StatusCode::SUCCESS) return code;
307 
310  if(code != StatusCode::SUCCESS) return code;
311  }
312  return code;
313  }
314 
315  double MuonCalibTool::expectedResolution(const std::string &DetType, const xAOD::Muon &mu, const bool addMCCorrectionSmearing) const
316  {
317  // Expected resolution in data (or unsmeared MC if second argument is true)
318  if (DetType == "MS") {
319  return expectedResolution(MCP::DetectorType::MS, mu, addMCCorrectionSmearing);
320  } else if (DetType == "ID") {
321  return expectedResolution(MCP::DetectorType::ID, mu, addMCCorrectionSmearing);
322  } else if (DetType == "CB") {
323  return expectedResolution(MCP::DetectorType::CB, mu, addMCCorrectionSmearing);
324  } else {
325  ATH_MSG_ERROR("The DetType that you entered is not allows - DetType = " << DetType);
326  return 0.;
327  }
328  }
329 
330  double MuonCalibTool::expectedResolution(const int &DetType, const xAOD::Muon &mu, const bool addMCCorrectionSmearing) const
331  {
332  // Get information about data
333  bool isData = false;
335  else
336  {
337  // Retrieve the event information:
339  isData = !evtInfo->eventType(xAOD::EventInfo::IS_SIMULATION);
340  }
341 
342  // Get information about which year it is here
343  MCP::DataYear dataYear = MuonCalibTool::getPeriod(isData);
344 
345  // get the pt measurements from the xAOD::Muon object
346  double loc_ptid = 0;
347  double loc_ptms = 0;
348  double loc_ptcb = 0;
349 
350  double Primary_eta = mu.eta();
351  double Primary_phi = mu.phi();
352 
353  if (m_validationMode)
354  {
355  static const SG::AuxElement::Accessor<float> id_pt("expert_ptid");
356  static const SG::AuxElement::Accessor<float> ms_pt("expert_ptms");
357  static const SG::AuxElement::Accessor<float> cb_pt("expert_ptcb");
358 
359  loc_ptid = id_pt(mu) * MeVtoGeV;
360  loc_ptms = ms_pt(mu) * MeVtoGeV;
361  loc_ptcb = cb_pt(mu) * MeVtoGeV;
362 
363  } else {
364 
365  // Retrieve all the trans
366  const xAOD::TrackParticle* CB_track = mu.trackParticle(xAOD::Muon::CombinedTrackParticle);
367  const xAOD::TrackParticle* ID_track = mu.trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
368  const xAOD::TrackParticle* ME_track = mu.trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle);
369 
370  if(CB_track) loc_ptcb = CB_track->pt() * MeVtoGeV;
371  if(ID_track) loc_ptid = ID_track->pt() * MeVtoGeV;
372  if(ME_track) loc_ptms = ME_track->pt() * MeVtoGeV;
373  }
374 
376  {
377  return m_MuonIntScaleSmearTool->getExpectedResolution(DetType, loc_ptms, Primary_eta, Primary_phi, dataYear, addMCCorrectionSmearing);
378  }
379  else if (DetType == MCP::DetectorType::ID)
380  {
381  return m_MuonIntScaleSmearTool->getExpectedResolution(DetType, loc_ptid, Primary_eta, Primary_phi, dataYear, addMCCorrectionSmearing);
382  }
383  else if (DetType == MCP::DetectorType::CB)
384  {
385  // Due to complicated maths, the expected combined resolution
386  // is given by this equation (note: all sigmas are fractional uncertainties):
387  // sigma_CB = std::sqrt(2) * sigma_ID * sigma_MS * pTMS * pTID / {pTCB * std::sqrt({sigma_ID*pTID}^2 + {sigma_MS*pTMS}^2)}
388  // Do a little recursive calling to make things easier to read
389  // Turn these into *absolute* uncertainties to make life easier
390  double sigmaID = expectedResolution(MCP::DetectorType::ID, mu, addMCCorrectionSmearing) * loc_ptid;
391  double sigmaMS = expectedResolution(MCP::DetectorType::MS, mu, addMCCorrectionSmearing) * loc_ptms;
392  double denominator = (loc_ptcb)*std::sqrt(sigmaID * sigmaID + sigmaMS * sigmaMS);
393  return denominator ? sigmaID * sigmaMS / denominator : 0.;
394  }
395  else
396  {
397  ATH_MSG_ERROR("wrong DetType in input " << DetType);
398  }
399  return 0.;
400 
401  }
402 
403  // Internal tool function
405  {
406 
407  // Get information about data
408  bool isData = false;
410  else
411  {
412  // Retrieve the event information:
414  isData = !evtInfo->eventType(xAOD::EventInfo::IS_SIMULATION);
415  }
416  ATH_MSG_VERBOSE("Checking Simulation flag: " << !isData);
417 
418  // Get information about which year it is here
419  auto year = MuonCalibTool::getPeriod(isData);
420 
421 
422  double Primary_eta = mu.eta();
423  double Primary_phi = mu.phi();
424  int charge = mu.charge();
425  double mass = mu.m() * MeVtoGeV;
426 
427  if (m_validationMode)
428  {
429  static const SG::AuxElement::Accessor<float> cb_pt("expert_ptcb");
430  static const SG::AuxElement::Accessor<float> id_pt("expert_ptid");
431  static const SG::AuxElement::Accessor<float> ms_pt("expert_ptms");
432  static const SG::AuxElement::Accessor<AmgVector(5)> CBParam("CBParam");
433  static const SG::AuxElement::Accessor<AmgSymMatrix(5)> CBCov("CBCov");
434  static const SG::AuxElement::Accessor<AmgVector(5)> IDParam("IDParam");
435  static const SG::AuxElement::Accessor<AmgSymMatrix(5)> IDCov("IDCov");
436  static const SG::AuxElement::Accessor<AmgVector(5)> MEParam("MEParam");
437  static const SG::AuxElement::Accessor<AmgSymMatrix(5)> MECov("MECov");
438 
439  // Use the constructor where the eta/phi are overwritten to keep it inma line with current recommendations. To be changed in the future
440  auto CB = MCP::TrackCalibObj(MCP::TrackType::CB, charge, cb_pt(mu), Primary_eta, Primary_phi, mass, CBParam(mu), CBCov(mu), year, isData);
441  auto ID = MCP::TrackCalibObj(MCP::TrackType::ID, charge, id_pt(mu), Primary_eta, Primary_phi, mass, IDParam(mu), IDCov(mu), year, isData);
442  auto ME = MCP::TrackCalibObj(MCP::TrackType::ME, charge, ms_pt(mu), Primary_eta, Primary_phi, mass, MEParam(mu), MECov(mu), year, isData);
443 
444  MCP::MuonObj muonObj{CB,ID,ME};
445  initializeRandNumbers(muonObj);
446 
447  muonObj.expectedPercentResID = expectedResolution(MCP::DetectorType::ID, mu, false);
448  muonObj.expectedPercentResME = expectedResolution(MCP::DetectorType::MS, mu, false);
449  muonObj.expectedResID = expectedResolution(MCP::DetectorType::ID, mu, true) * muonObj.CB.calib_pt;
450  muonObj.expectedResME = expectedResolution(MCP::DetectorType::MS, mu, true) * muonObj.CB.calib_pt;
451 
452  return muonObj;
453  }
454 
455 
456  // Retrieve all the trans
457  const xAOD::TrackParticle *CB_track = mu.trackParticle(xAOD::Muon::CombinedTrackParticle);
458  const xAOD::TrackParticle *ID_track = mu.trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
459  const xAOD::TrackParticle *ME_track = mu.trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle);
460 
461  // For SI muons, overwrite the charge from the CB track
462  if (mu.muonType() == xAOD::Muon::SiliconAssociatedForwardMuon)
463  {
464  if (CB_track) charge = CB_track->charge();
465  }
466 
467  // Use the constructor where the eta/phi are overwritten to keep it inma line with current recommendations. To be changed in the future
468  auto CB = MCP::TrackCalibObj(CB_track, MCP::TrackType::CB, charge, Primary_eta, Primary_phi, year, isData);
469  auto ID = MCP::TrackCalibObj(ID_track, MCP::TrackType::ID, charge, Primary_eta, Primary_phi, year, isData);
470  auto ME = MCP::TrackCalibObj(ME_track, MCP::TrackType::ME, charge, Primary_eta, Primary_phi, year, isData);
471 
472  MCP::MuonObj muonObj{CB,ID,ME};
473  initializeRandNumbers(muonObj);
474  muonObj.expectedPercentResID = expectedResolution(MCP::DetectorType::ID, mu, false);
475  muonObj.expectedPercentResME = expectedResolution(MCP::DetectorType::MS, mu, false);
476 
477  muonObj.expectedResID = expectedResolution(MCP::DetectorType::ID, mu, true) * muonObj.CB.calib_pt;
478  muonObj.expectedResME = expectedResolution(MCP::DetectorType::MS, mu, true) * muonObj.CB.calib_pt;
479  return muonObj;
480  }
482  {
483  // Get information about data
484  bool isData = false;
485 
486  // Retrieve the event information:
488  isData = !evtInfo->eventType(xAOD::EventInfo::IS_SIMULATION);
489 
490  ATH_MSG_VERBOSE("Checking Simulation flag: " << !isData);
491 
492  // Get information about which year it is here
493  auto year = MuonCalibTool::getPeriod(isData);
494  int charge = inTrk.charge();
496  {
497  auto CB = MCP::TrackCalibObj(&inTrk, MCP::TrackType::CB, charge, year, isData);
498  auto ID = MCP::TrackCalibObj(&inTrk, MCP::TrackType::ID, charge, year, isData);
499  auto ME = MCP::TrackCalibObj(nullptr, MCP::TrackType::ME, charge, year, isData);
500 
501  MCP::MuonObj muonObj{CB,ID,ME};
502  return muonObj;
503  }
504 
505  auto CB = MCP::TrackCalibObj(&inTrk, MCP::TrackType::CB, charge, year, isData);
506  auto ID = MCP::TrackCalibObj(nullptr, MCP::TrackType::ID, charge, year, isData);
507  auto ME = MCP::TrackCalibObj(&inTrk, MCP::TrackType::ME, charge, year, isData);
508 
509  MCP::MuonObj muonObj{CB,ID,ME};
510  return muonObj;
511  }
512 
513 
515  {
516  // Random number generation for smearing
517  TRandom3 loc_random3;
518  // Get Event Number, Retrieve the event information:
520  unsigned long long eventNumber = 0;
522  else eventNumber = evtInfo->eventNumber();
523  // Construct a seed for the random number generator:
524  const UInt_t seed = 1 + std::abs(muonObj.CB.phi) * 1E6 + std::abs(muonObj.CB.eta) * 1E3 + eventNumber;
525  loc_random3.SetSeed(seed);
526 
527  muonObj.rnd_g0 = loc_random3.Gaus(0, 1);
528  muonObj.rnd_g1 = loc_random3.Gaus(0, 1);
529  muonObj.rnd_g2 = loc_random3.Gaus(0, 1);
530  muonObj.rnd_g3 = loc_random3.Gaus(0, 1);
531  muonObj.rnd_g4 = loc_random3.Gaus(0, 1);
532  muonObj.rnd_g_highPt = loc_random3.Gaus(0, 1);
533 
534 
535  }
536 
538  {
539  static const SG::AuxElement::ConstAccessor<unsigned int> acc_rnd("RandomRunNumber");
540  // I've copied the run number ranges from SUSYTools (Run2) - Haider
541  // https://gitlab.cern.ch/atlas/athena/blob/21.2/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/SUSYObjDef_xAOD.cxx#L2438
542  // Range for Run3 taken from COMA - Luca
543  // https://atlas-tagservices.cern.ch/tagservices/RunBrowser/runBrowserReport/rBR_Period_Report.php?fnt=data22_13p6TeV
544  // https://atlas-tagservices.cern.ch/tagservices/RunBrowser/runBrowserReport/rBR_Period_Report.php?fnt=data23_13p6TeV
545  // https://atlas-tagservices.cern.ch/tagservices/RunBrowser/runBrowserReport/rBR_Period_Report.php?fnt=data24_13p6TeV
546  constexpr unsigned int last_run_16 = 320000;
547  constexpr unsigned int last_run_17 = 342000;
548  constexpr unsigned int last_run_18 = 370000;
549  constexpr unsigned int last_run_22 = 440614;
550  constexpr unsigned int last_run_23 = 456750;
551  constexpr unsigned int last_run_24 = 999999;
552 
553  static const std::set<int> MCperiods1516{284500};
554  static const std::set<int> MCperiods17{300000, 304000, 305000};
555  static const std::set<int> MCperiods18{310000};
556  static const std::set<int> MCperiods22{330000, 410000};
557  static const std::set<int> MCperiods23{450000};
558  static const std::set<int> MCperiods24{470000};
559 
560  static const std::set<int> MCperiodsRun4{350000, 350060, 350140, 350200};
561 
562 
564  unsigned int run = 0;
565  if(m_expertMode_RunNumber.value()!=0) run=m_expertMode_RunNumber.value();
566  else run = evtInfo->runNumber();
567  // retrieve the random run number
568  if (!isData && m_useRndRun) {
569  if (acc_rnd.isAvailable(*evtInfo))
570  run = acc_rnd(*evtInfo);
571  else {
573  "No random runnumber could be found although the tool is configured to assign the years based on it. Please make sure "
574  "to apply the prwTool before-hand or consider to set the property 'useRandomRunNumber' to false.");
575  return MCP::DataYear::Data16;
576  }
577  }
578  // Check the Monte carlo
579  if (!isData && (!m_useRndRun || !acc_rnd.isAvailable(*evtInfo))) {
580  if (MCperiods1516.count(run)) {
581  ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc20a / data15-16");
582  return MCP::DataYear::Data16;
583  } else if (MCperiods17.count(run)) {
584  ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc20d / data17");
585  return MCP::DataYear::Data17;
586  } else if (MCperiods18.count(run)) {
587  ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc20e / data18");
588  return MCP::DataYear::Data18;
589  } else if (MCperiods22.count(run)) {
590  ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc21 / mc23a / data22");
591  return MCP::DataYear::Data22;
592  } else if (MCperiods23.count(run)) {
593  ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc23c / mc23d / data23");
594  return MCP::DataYear::Data23;
595  } else if (MCperiods24.count(run)) {
596  ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc23e / data24");
597  return MCP::DataYear::Data24;
598  } else if (MCperiodsRun4.count(run)) {
599  ATH_MSG_DEBUG("The current run " << run << " corresponds to data Run4");
600  return MCP::DataYear::Run4;
601  }
602 
603  }
604  // Check data itself or the random run number is used
605  else if (isData || m_useRndRun) {
606  if (run < last_run_16) {
607  ATH_MSG_DEBUG("The current run " << run << " is taken in data 15-16");
608  return MCP::DataYear::Data16;
609  } else if (run <= last_run_17) {
610  ATH_MSG_DEBUG("The current run " << run << " is taken in data 17");
611  return MCP::DataYear::Data17;
612  } else if (run <= last_run_18) {
613  ATH_MSG_DEBUG("The current run " << run << " is taken in data 18");
614  return MCP::DataYear::Data18;
615  } else if (run <= last_run_22) {
616  ATH_MSG_DEBUG("The current run " << run << " is taken in data 22");
617  return MCP::DataYear::Data22;
618  } else if (run < last_run_23) {
619  ATH_MSG_DEBUG("The current run " << run << " is taken in data 23");
620  return MCP::DataYear::Data23;
621  } else if (run < last_run_24) {
622  ATH_MSG_DEBUG("The current run " << run << " is taken in data 24");
623  return MCP::DataYear::Data24;
624  }
625  }
626  static std::atomic<bool> warningPrinted {false};
627  if (!warningPrinted) {
628  ATH_MSG_WARNING("Could not assign run-number " << run << " to a specific year of data-taking, using default year 24");
629  warningPrinted = true;
630  }
631  return MCP::DataYear::Data24;
632  }
633 
634 
635 } // namespace CP
python.Dso.registry
registry
Definition: Control/AthenaServices/python/Dso.py:159
MCP::MuonObj::ME
TrackCalibObj ME
Definition: MuonObj.h:130
CP::MuonCalibTool::affectingSystematics
virtual SystematicSet affectingSystematics() const override
the list of all systematics this tool can be affected by
Definition: MuonCalibTool.cxx:289
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
CP::IMuonSelectionTool::getResolutionCategory
virtual int getResolutionCategory(const xAOD::Muon &) const =0
Returns an integer corresponding to categorization of muons with different resolutions.
CP::MuonCalibTool::applyCorrectionTrkOnly
virtual CorrectionCode applyCorrectionTrkOnly(xAOD::TrackParticle &inTrk, const int DetType) const override
Definition: MuonCalibTool.cxx:243
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
get_generator_info.result
result
Definition: get_generator_info.py:21
CP::IMuonSelectionTool::ResolutionCategory
ResolutionCategory
Declare the interface that the class provides.
Definition: IMuonSelectionTool.h:31
CP::MuonCalibTool::m_applyCorrectionOnData
Gaudi::Property< bool > m_applyCorrectionOnData
Definition: MuonCalibTool.h:101
CP::MuonCalibTool::m_MuonIntScaleSmearTool
asg::AnaToolHandle< CP::IMuonCalibIntScaleSmearTool > m_MuonIntScaleSmearTool
Definition: MuonCalibTool.h:114
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
MCP::DataYear::Data16
@ Data16
ID
std::vector< Identifier > ID
Definition: CalibHitIDCheck.h:24
MCP::DataYear::Data23
@ Data23
xAOD::EventInfo_v1::eventNumber
uint64_t eventNumber() const
The current event's event number.
CP::MuonCalibTool::m_2stations_highpt_smearing
Gaudi::Property< bool > m_2stations_highpt_smearing
Definition: MuonCalibTool.h:106
Base_Fragment.mass
mass
Definition: Sherpa_i/share/common/Base_Fragment.py:59
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
asg::AnaToolHandle::retrieve
StatusCode retrieve()
initialize the tool
CP::MuonCalibTool::convertToMuonObj
MCP::MuonObj convertToMuonObj(const xAOD::Muon &mu) const
Definition: MuonCalibTool.cxx:404
CP::MuonCalibTool::applyCorrection
virtual ASG_TOOL_CLASS3(MuonCalibTool, CP::IMuonCalibrationAndSmearingTool, CP::ISystematicsTool, CP::IReentrantSystematicsTool) public CorrectionCode applyCorrection(xAOD::Muon &mu) const override
Declare the interface that the class provides.
Definition: MuonCalibTool.cxx:129
CP::MuonCalibTool::m_expertMode_EvtNumber
Gaudi::Property< unsigned long long > m_expertMode_EvtNumber
Definition: MuonCalibTool.h:85
xAOD::TrackParticle_v1::charge
float charge() const
Returns the charge.
Definition: TrackParticle_v1.cxx:150
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
CP::MuonCalibTool::m_excludeNSWFromPrecisionLayers
Gaudi::Property< bool > m_excludeNSWFromPrecisionLayers
Definition: MuonCalibTool.h:92
CP::MuonCalibTool::initializeRandNumbers
void initializeRandNumbers(MCP::MuonObj &obj) const
Decorate all information that's needed to ensure reproducibility of the smearing.
Definition: MuonCalibTool.cxx:514
xAOD::TrackParticle_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: TrackParticle_v1.cxx:77
asg::AnaToolHandle::setTypeAndName
void setTypeAndName(const std::string &val_typeAndName)
set the value of type and name
CP::MuonCalibTool::m_extra_highpt_smearing
Gaudi::Property< bool > m_extra_highpt_smearing
Definition: MuonCalibTool.h:108
asg
Definition: DataHandleTestTool.h:28
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
CP::MeVtoGeV
constexpr float MeVtoGeV
Definition: IsolationCloseByCorrectionTool.cxx:33
xAOD::TrackParticle_v1::z0
float z0() const
Returns the parameter.
CP::IMuonSelectionTool::CategoryThree
@ CategoryThree
Definition: IMuonSelectionTool.h:46
xAOD::TrackParticle_v1::setDefiningParameters
void setDefiningParameters(float d0, float z0, float phi0, float theta, float qOverP)
Set the defining parameters.
Definition: TrackParticle_v1.cxx:177
CP::IMuonCalibIntTool::applyCorrection
virtual CorrectionCode applyCorrection(MCP::MuonObj &mu) const =0
Declare the interface that the class provides.
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:55
CP::MuonCalibTool::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: MuonCalibTool.cxx:27
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
CP::SystematicVariation
Definition: SystematicVariation.h:47
python.AtlRunQueryAMI.year
year
Definition: AtlRunQueryAMI.py:226
asg::AnaToolHandle::setProperty
StatusCode setProperty(const std::string &property, const T2 &value)
set the given property of the tool.
xAOD::EventInfo_v1::IS_SIMULATION
@ IS_SIMULATION
true: simulation, false: data
Definition: EventInfo_v1.h:151
CP
Select isolated Photons, Electrons and Muons.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:48
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:50
mapkey::sys
@ sys
Definition: TElectronEfficiencyCorrectionTool.cxx:42
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
xAOD::TrackParticle_v1::d0
float d0() const
Returns the parameter.
xAOD::EventInfo_v1::runNumber
uint32_t runNumber() const
The current event's run number.
asg::AnaToolHandle::declarePropertyFor
void declarePropertyFor(T2 *tool, const std::string &name, const std::string &description="")
declare as property on the given tool
python.iconfTool.models.loaders.level
level
Definition: loaders.py:20
CP::MuonCalibTool::m_isRun3
Gaudi::Property< bool > m_isRun3
Definition: MuonCalibTool.h:75
MCP::TrackCalibObj::calib_charge
int calib_charge
Value of the track-charge (after calibration)
Definition: MuonObj.h:112
CP::MuonCalibTool::m_expertMode_isData
Gaudi::Property< bool > m_expertMode_isData
Definition: MuonCalibTool.h:83
CP::MuonCalibTool::m_sysScheme
Gaudi::Property< std::string > m_sysScheme
Definition: MuonCalibTool.h:80
CP::MuonCalibTool::m_doDirectCBCalib
Gaudi::Property< bool > m_doDirectCBCalib
Definition: MuonCalibTool.h:96
MCP::DataYear::Data24
@ Data24
CP::CorrectionCode::OutOfValidityRange
@ OutOfValidityRange
Input object is out of validity range.
Definition: CorrectionCode.h:37
histSizes.code
code
Definition: histSizes.py:129
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
MCP::MuonObj::rnd_g2
double rnd_g2
Definition: MuonObj.h:136
MCP::MuonObj::rnd_g_highPt
double rnd_g_highPt
Definition: MuonObj.h:139
MCP::DataYear::Data18
@ Data18
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:59
MCP::MuonObj::rnd_g0
double rnd_g0
Random numbers helping for the calibration.
Definition: MuonObj.h:134
CP::MuonCalibTool::m_MuonSelectionTool
asg::AnaToolHandle< CP::IMuonSelectionTool > m_MuonSelectionTool
Definition: MuonCalibTool.h:111
CP::MuonCalibTool::m_doEtaSagittaSys
Gaudi::Property< bool > m_doEtaSagittaSys
Definition: MuonCalibTool.h:100
CP::MuonCalibTool::MuonCalibTool
MuonCalibTool(const std::string &name)
Definition: MuonCalibTool.cxx:18
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
CP::MuonCalibTool::m_expertMode_RunNumber
Gaudi::Property< int > m_expertMode_RunNumber
Definition: MuonCalibTool.h:84
AmgVector
AmgVector(4) T2BSTrackFilterTool
Definition: T2BSTrackFilterTool.cxx:114
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
run
Definition: run.py:1
xAOD::eventNumber
eventNumber
Definition: EventInfo_v1.cxx:124
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
CP::MuonCalibTool::m_calibMode
Gaudi::Property< int > m_calibMode
Definition: MuonCalibTool.h:88
MCP::DetectorType::MS
@ MS
Definition: EnumDef.h:37
ReadTripsProbsFromCool.denominator
denominator
Definition: ReadTripsProbsFromCool.py:96
MCP::TrackCalibObj::eta
const double eta
Value of the track-eta.
Definition: MuonObj.h:104
CP::IReentrantSystematicsTool::affectingSystematics
virtual SystematicSet affectingSystematics() const =0
the list of all systematics this tool can be affected by
MCP::DataYear::Data17
@ Data17
MCP::MuonObj::rnd_g1
double rnd_g1
Definition: MuonObj.h:135
Trk::Combined
@ Combined
Definition: TrackSummaryTool.h:32
merge.output
output
Definition: merge.py:17
CP::MuonCalibTool::m_release
Gaudi::Property< std::string > m_release
Definition: MuonCalibTool.h:78
CP::MuonCalibTool::correctedCopy
virtual CorrectionCode correctedCopy(const xAOD::Muon &input, xAOD::Muon *&output) const override
Create a corrected copy from a constant muon.
Definition: MuonCalibTool.cxx:261
xAOD::TrackParticle_v1::phi0
float phi0() const
Returns the parameter, which has range to .
Definition: TrackParticle_v1.cxx:158
PathResolver.h
MCP::DataYear::Run4
@ Run4
xAOD::Muon
Muon_v1 Muon
Reference the current persistent version:
Definition: Event/xAOD/xAODMuon/xAODMuon/Muon.h:13
MCP::TrackCalibObj::phi
const double phi
Value of the track-phi.
Definition: MuonObj.h:106
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
CP::MuonCalibTool::m_validationMode
Gaudi::Property< bool > m_validationMode
Definition: MuonCalibTool.h:82
MCP::MuonObj::rnd_g3
double rnd_g3
Definition: MuonObj.h:137
ReadHandle.h
Handle class for reading from StoreGate.
charge
double charge(const T &p)
Definition: AtlasPID.h:538
MCP::TrackCalibObj::calib_pt
double calib_pt
Smeared track pt.
Definition: MuonObj.h:102
MCP::MuonObj::rnd_g4
double rnd_g4
Definition: MuonObj.h:138
MCP::MuonObj::ID
TrackCalibObj ID
Definition: MuonObj.h:129
MCP::TrackType::CB
@ CB
CP::IMuonCalibIntScaleSmearTool::getExpectedResolution
virtual double getExpectedResolution(const int &DetType, double pT, double eta, double phi, MCP::DataYear year, bool addMCCorrectionSmearing) const =0
Declare the interface that the class provides.
CP::MuonCalibTool::m_MuonIntHighTSmearToolInitialized
bool m_MuonIntHighTSmearToolInitialized
Definition: MuonCalibTool.h:131
CP::MuonCalibTool::m_HighPtSystThreshold
Gaudi::Property< float > m_HighPtSystThreshold
Definition: MuonCalibTool.h:109
CP::CorrectionCode::Ok
@ Ok
The correction was done successfully.
Definition: CorrectionCode.h:38
MuonCalibTool.h
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CP::SystematicRegistry
This module implements the central registry for handling systematic uncertainties with CP tools.
Definition: SystematicRegistry.h:25
MCP::MuonObj::CB
TrackCalibObj CB
Definition: MuonObj.h:131
CP::MuonCalibTool::applySystematicVariation
virtual StatusCode applySystematicVariation(const SystematicSet &systConfig) override
effects: configure this tool for the given list of systematic variations.
Definition: MuonCalibTool.cxx:299
CP::MuonCalibTool::m_eventInfo
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo
Definition: MuonCalibTool.h:73
CP::MuonCalibTool::isAffectedBySystematic
virtual bool isAffectedBySystematic(const SystematicVariation &systematic) const override
Declare the interface that this class provides.
Definition: MuonCalibTool.cxx:283
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
CP::MuonCalibTool::expectedResolution
virtual double expectedResolution(const std::string &DetType, const xAOD::Muon &mu, const bool addMCCorrectionSmearing) const override
Get the expected pT resolution.
Definition: MuonCalibTool.cxx:315
CP::CorrectionCode
Return value from object correction CP tools.
Definition: CorrectionCode.h:31
MCP::TrackCalibObj::isData
const bool isData
Definition: MuonObj.h:116
MCP::MuonObj::raw_mst_category
ResolutionCategory raw_mst_category
Definition: MuonObj.h:143
CP::MuonCalibTool::m_MuonIntSagittaTool
asg::AnaToolHandle< CP::IMuonCalibIntTool > m_MuonIntSagittaTool
Definition: MuonCalibTool.h:113
CP::IMuonSelectionTool::CategoryFour
@ CategoryFour
Definition: IMuonSelectionTool.h:47
MCP::DataYear
DataYear
Definition: EnumDef.h:28
MCP::MuonObj
Definition: MuonObj.h:126
SG::ConstAccessor::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
CP::MuonCalibTool::m_useRndRun
Gaudi::Property< bool > m_useRndRun
Definition: MuonCalibTool.h:86
CP::MuonCalibTool::getPeriod
MCP::DataYear getPeriod(bool isData) const
Definition: MuonCalibTool.cxx:537
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
DetType
Definition: DetType.h:10
CP::MuonCalibTool::m_MuonIntHighTSmearTool
asg::AnaToolHandle< CP::IMuonCalibIntTool > m_MuonIntHighTSmearTool
Definition: MuonCalibTool.h:116
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
CP::ISystematicsTool::applySystematicVariation
virtual StatusCode applySystematicVariation(const SystematicSet &systConfig)=0
effects: configure this tool for the given list of systematic variations.
MCP::TrackCalibObj
Basic object to cache all relevant information from the track.
Definition: MuonObj.h:21
xAOD::TrackParticle_v1::theta
float theta() const
Returns the parameter, which has range 0 to .
asg::AnaToolHandle::empty
bool empty() const
whether this ToolHandle is completely empty, i.e.
MCP::DetectorType::ID
@ ID
Definition: EnumDef.h:37
CP::MuonCalibTool::recommendedSystematics
virtual SystematicSet recommendedSystematics() const override
the list of all systematics this tool recommends to use
Definition: MuonCalibTool.cxx:297
MCP::DataYear::Data22
@ Data22
MCP::TrackType::ME
@ ME
MCP::DetectorType::CB
@ CB
Definition: EnumDef.h:37
xAOD::EventInfo_v1::eventType
bool eventType(EventType type) const
Check for one particular bitmask value.
CP::SystematicRegistry::getInstance
static SystematicRegistry & getInstance()
Get the singleton instance of the registry for the curren thread.
Definition: SystematicRegistry.cxx:25
MCP::TrackType::ID
@ ID