ATLAS Offline Software
Loading...
Searching...
No Matches
CP::MuonCalibTool Class Reference

#include <MuonCalibTool.h>

Inheritance diagram for CP::MuonCalibTool:
Collaboration diagram for CP::MuonCalibTool:

Public Member Functions

 MuonCalibTool (const std::string &name)
virtual ~MuonCalibTool ()=default
virtual StatusCode initialize () override
 Dummy implementation of the initialisation function.
void callSingleEvent (columnar::MuonRange muons, columnar::EventInfoId event) const
void callEvents (columnar::EventContextRange events) const override
virtual void print () const
 Print the state of the tool.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
Additional helper functions, not directly mimicking Athena
template<class T>
const T * getProperty (const std::string &name) const
 Get one of the tool's properties.
const std::string & msg_level_name () const __attribute__((deprecated))
 A deprecated function for getting the message level's name.
const std::string & getName (const void *ptr) const
 Get the name of an object that is / should be in the event store.
SG::sgkey_t getKey (const void *ptr) const
 Get the (hashed) key of an object that is in the event store.

Public Attributes

Gaudi::Property< boolm_skipResolutionCategory {this, "skipResolutionCategory", false, "whether to skip the resolution category variable"}
std::unique_ptr< MCP::MuonCalibToolAccessorsm_acc {std::make_unique<MCP::MuonCalibToolAccessors>(*this)}

Protected Member Functions

MCP::MuonObj convertToMuonObj (columnar::MuonId mu, columnar::EventInfoId evtInfo) const
MCP::MuonObj convertToMuonObj (const xAOD::TrackParticle &inTrk, const int DetType) const
void initializeRandNumbers (MCP::MuonObj &obj, columnar::EventInfoId evtInfo) const
 Decorate all information that's needed to ensure reproducibility of the smearing.
MCP::DataYear getPeriod (bool isData, columnar::EventInfoId evtInfo) const
void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Protected Attributes

SG::ReadHandleKey< xAOD::EventInfom_eventInfo {this, "EventInfoContName", "EventInfo", "event info key"}
Gaudi::Property< boolm_isRun3 {this, "IsRun3Geo", false, "Needed for MuonSelectionTool"}
Gaudi::Property< std::string > m_release {this, "release", "Recs2025_03_26_Run2Run3", "Release"}
Gaudi::Property< std::string > m_sysScheme {this, "systematicScheme", "Corr_Scale", "Systematic scheme to be configured"}
Gaudi::Property< boolm_validationMode {this, "expert_validationMode", false, "Expert only option. Puts the tool in the validation mode setup"}
Gaudi::Property< boolm_expertMode_isData {this, "expertMode_isData", false, "Expert only option. Overwrites the isData Flag"}
Gaudi::Property< intm_expertMode_RunNumber {this, "expertMode_RunNumber", 0, "Expert only option. Overwrites RunNumber"}
Gaudi::Property< unsigned long long > m_expertMode_EvtNumber {this, "expertMode_EvtNumber", 0, "Expert only option. Overwrites EventNumber"}
Gaudi::Property< boolm_useRndRun {this, "useRandomRunNumber", false, "To use the random run number for deciding which calibration to apply"}
Gaudi::Property< intm_calibMode {this, "calibMode", -1, "Calib mode"}
Gaudi::Property< boolm_excludeNSWFromPrecisionLayers {this, "ExcludeNSWFromPrecisionLayers", false, "Cut on the number of precision layers ignores the NSW"}
Gaudi::Property< boolm_doDirectCBCalib {this, "doDirectCBCalib", true, "Do direct calibration of CB tracks, otherwise, do ID+MS"}
Gaudi::Property< boolm_doEtaSagittaSys {this, "doEtaSagittaSys", false, "Do Eta dependant systematic system"}
Gaudi::Property< boolm_applyCorrectionOnData {this, "applyCorrectionOnData", true, "If to apply sagitta corrections on data, or take the full effect as systematic"}
Gaudi::Property< boolm_2stations_highpt_smearing {this, "do2StationsHighPt", false, "Extra smearing to be applied if high pT WP is used"}
Gaudi::Property< boolm_extra_highpt_smearing {this, "doExtraSmearing", false, "Flag provided to test if analysis are sensitive to high pT calibration. NOT TO BE USED FOR RESULTS. Please see twiki"}
Gaudi::Property< floatm_HighPtSystThreshold {this, "HighPtSystThr", 300.0, "Thershold for high pT smearing in GeV"}
asg::AnaToolHandle< CP::IMuonSelectionToolm_MuonSelectionTool {""}
asg::AnaToolHandle< CP::IMuonCalibIntToolm_MuonIntSagittaTool {""}
asg::AnaToolHandle< CP::IMuonCalibIntScaleSmearToolm_MuonIntScaleSmearTool {""}
asg::AnaToolHandle< CP::IMuonCalibIntToolm_MuonIntHighTSmearTool {""}

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

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.
CorrectionCode applyCorrection (columnar::MuonId mu, columnar::EventInfoId evtInfo) const
virtual CorrectionCode correctedCopy (const xAOD::Muon &input, xAOD::Muon *&output) const override
 Create a corrected copy from a constant muon.
virtual bool isAffectedBySystematic (const SystematicVariation &systematic) const override
 Declare the interface that this class provides.
virtual SystematicSet affectingSystematics () const override
 the list of all systematics this tool can be affected by
virtual SystematicSet recommendedSystematics () const override
 the list of all systematics this tool recommends to use
virtual StatusCode applySystematicVariation (const SystematicSet &systConfig) override
 effects: configure this tool for the given list of systematic variations.
virtual double expectedResolution (const std::string &DetType, const xAOD::Muon &mu, const bool addMCCorrectionSmearing) const override
 Get the expected pT resolution.
virtual double expectedResolution (const int &DetType, const xAOD::Muon &mu, const bool addMCCorrectionSmearing) const override
 Get the expected pT resolution - int argument is more efficient.
double expectedResolution (const int &DetType, columnar::MuonId mu, columnar::EventInfoId evtInfo, const bool addMCCorrectionSmearing) const
virtual CorrectionCode applyCorrectionTrkOnly (xAOD::TrackParticle &inTrk, const int DetType) const override
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

bool m_MuonIntHighTSmearToolInitialized {false}
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 36 of file MuonCalibTool.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ MuonCalibTool()

CP::MuonCalibTool::MuonCalibTool ( const std::string & name)

These properties are meant to be expert properties for debugging of the code and shall not touched by the common

Definition at line 21 of file MuonCalibTool.cxx.

21 : asg::AsgTool(name){
22
24 m_MuonSelectionTool.declarePropertyFor(this,"MuonSelectionTool", "Instance of the MuonSelectionTool needed for the HighPt categorization");
25 m_MuonIntSagittaTool.declarePropertyFor(this, "SagittaTool", "Instance of the Sagitta bias corrections sub tool");
26 m_MuonIntScaleSmearTool.declarePropertyFor(this, "ScaleAndSmearTool", "Instance of the tool that applies the smearing & scale corrections");
27 m_MuonIntHighTSmearTool.declarePropertyFor(this, "HighPtSmearingTool", "Extra smearing of the high pt working point");
28 }
asg::AnaToolHandle< CP::IMuonCalibIntScaleSmearTool > m_MuonIntScaleSmearTool
asg::AnaToolHandle< CP::IMuonCalibIntTool > m_MuonIntHighTSmearTool
asg::AnaToolHandle< CP::IMuonSelectionTool > m_MuonSelectionTool
asg::AnaToolHandle< CP::IMuonCalibIntTool > m_MuonIntSagittaTool

◆ ~MuonCalibTool()

virtual CP::MuonCalibTool::~MuonCalibTool ( )
virtualdefault

Member Function Documentation

◆ affectingSystematics()

SystematicSet CP::MuonCalibTool::affectingSystematics ( ) const
overrideprivatevirtual

the list of all systematics this tool can be affected by

Implements CP::IReentrantSystematicsTool.

Definition at line 297 of file MuonCalibTool.cxx.

298 {
299 SystematicSet result = m_MuonIntSagittaTool->affectingSystematics();
300 result.insert(m_MuonIntScaleSmearTool->affectingSystematics());
301 if (m_MuonIntHighTSmearToolInitialized) result.insert(m_MuonIntHighTSmearTool->affectingSystematics());
302 return result;
303 }
bool m_MuonIntHighTSmearToolInitialized

◆ applyCorrection() [1/2]

CorrectionCode CP::MuonCalibTool::applyCorrection ( columnar::MuonId mu,
columnar::EventInfoId evtInfo ) const
private

Definition at line 144 of file MuonCalibTool.cxx.

145 {
146 auto& acc = *m_acc;
147 ATH_MSG_VERBOSE("Muon Type = " << mu(acc.muonTypeAcc) << " ( 0: Combined, 1: StandAlone, 2: SegmentTagged, 3: CaloTagged, 4: SiliconAssociatedForwardMuon)");
148 ATH_MSG_VERBOSE("Muon Author = " << mu(acc.authorAcc));
149
150 // Convert to the internal object
151 MCP::MuonObj muonObj = convertToMuonObj(mu, evtInfo);
152
153 ATH_MSG_VERBOSE("input ID pT "<<muonObj.ID.calib_pt);
154 ATH_MSG_VERBOSE("input ME pT "<<muonObj.ME.calib_pt);
155 ATH_MSG_VERBOSE("input CB pT "<<muonObj.CB.calib_pt);
156 ATH_MSG_VERBOSE("input eta "<<muonObj.CB.eta);
157 ATH_MSG_VERBOSE("input phi "<<muonObj.CB.phi);
158
159 if (muonObj.CB.isData)
160 {
161 ATH_MSG_VERBOSE("Doing data corrections");
162
163 // Sagitta Correction specifics
165 {
166 CorrectionCode sgCode = m_MuonIntSagittaTool->applyCorrection(muonObj);
167 if (sgCode != CorrectionCode::Ok) return sgCode;
168 }
169
170 // Override combined momentum for special cases
171 if (std::abs(muonObj.ME.calib_pt) == 0) muonObj.CB.calib_pt = muonObj.ID.calib_pt;
172 if (std::abs(muonObj.ID.calib_pt) == 0) muonObj.CB.calib_pt = muonObj.ME.calib_pt;
173
174 // Only for combined set it
175 if (mu(acc.muonTypeAcc) == xAOD::Muon::Combined)
176 {
177 acc.ptOutDec (mu) = muonObj.CB.calib_pt * GeVtoMeV;
178 }
179
180
181 acc.dec_idPt(mu) = muonObj.ID.calib_pt * GeVtoMeV;
182 acc.dec_mePt(mu) = muonObj.ME.calib_pt * GeVtoMeV;
183 acc.dec_idCharge(mu) = muonObj.ID.calib_charge;
184 acc.dec_meCharge(mu) = muonObj.ME.calib_charge;
185
186 ATH_MSG_DEBUG("Checking Output Muon Info for data - Pt_ID: " << acc.dec_idPt(mu));
187 ATH_MSG_DEBUG("Checking Output Muon Info for data - Pt_MS: " << acc.dec_mePt(mu));
188 ATH_MSG_DEBUG("Checking Output Muon Info for data - Pt_CB: " << mu(acc.ptAcc));
189
190 return CorrectionCode::Ok;
191 }
192
193 // Do Scale and Smearing corrections
194 CorrectionCode sgCode = m_MuonIntScaleSmearTool->applyCorrection(muonObj);
195 if (sgCode != CorrectionCode::Ok) return sgCode;
196
197 // Systematics for sagitta correction
198 if ((mu(acc.muonTypeAcc) != xAOD::Muon::SiliconAssociatedForwardMuon))
199 {
200 ATH_MSG_VERBOSE("Systematic uncertainties for sagitta bias ");
201 // TODO:: something specific for calo tags
202 CorrectionCode sgCode = m_MuonIntSagittaTool->applyCorrection(muonObj);
203 if (sgCode != CorrectionCode::Ok) return sgCode;
204 }
205
206 // Override combined momentum for special cases
207 if (std::abs(muonObj.ME.calib_pt) == 0) muonObj.CB.calib_pt = muonObj.ID.calib_pt;
208 if (std::abs(muonObj.ID.calib_pt) == 0) muonObj.CB.calib_pt = muonObj.ME.calib_pt;
209
210 // Setting the output object properties right now, so the resolution category get the corrected info
211 acc.ptOutDec(mu) = muonObj.CB.calib_pt * GeVtoMeV;
212 acc.chargeOutDec(mu) = muonObj.CB.calib_charge;
213 acc.dec_idPt(mu) = muonObj.ID.calib_pt * GeVtoMeV;
214 acc.dec_mePt(mu) = muonObj.ME.calib_pt * GeVtoMeV;
215 acc.dec_idCharge(mu) = muonObj.ID.calib_charge;
216 acc.dec_meCharge(mu) = muonObj.ME.calib_charge;
217
219 {
220 muonObj.raw_mst_category = (CP::IMuonSelectionTool::ResolutionCategory) m_MuonSelectionTool->getResolutionCategory(mu.getXAODObject());
221 }
222
223 // Special case: if the proper flags are selected (m_extra_highpt_smearing or m_2stations_highpt_smearing)
224 // an ad-hoc smearing of the combined momentum has to be applied
225 bool extra_smearing = (m_extra_highpt_smearing && (muonObj.raw_mst_category.value() >= 0) && !( muonObj.raw_mst_category.value() & IMuonSelectionTool::CategoryFour)); // Extra smearing, if selected, gets anyway only applied to non-3-station muons!
226 bool highpt_smearing = (m_2stations_highpt_smearing && (muonObj.raw_mst_category.value() >= 0) && ( muonObj.raw_mst_category.value() & IMuonSelectionTool::CategoryThree)); // Special highpt smearing, if selected, gets anyway only applied to missing-inner, 2-station muons only!
227
228 if (((extra_smearing || highpt_smearing)) && (mu(acc.ptAcc) > m_HighPtSystThreshold * GeVtoMeV))
229 {
230 sgCode = m_MuonIntHighTSmearTool->applyCorrection(muonObj);
231 if (sgCode != CorrectionCode::Ok) return sgCode;
232 }
233
234 // Final info to be written to the muon object
235 acc.ptOutDec(mu) = muonObj.CB.calib_pt * GeVtoMeV;
236 acc.dec_idPt(mu) = muonObj.ID.calib_pt * GeVtoMeV;
237 acc.dec_mePt(mu) = muonObj.ME.calib_pt * GeVtoMeV;
238
239
240 ATH_MSG_DEBUG("Checking Output Muon Info - Pt_ID: " << acc.dec_idPt(mu));
241 ATH_MSG_DEBUG("Checking Output Muon Info - Pt_MS: " << acc.dec_mePt(mu));
242 ATH_MSG_DEBUG("Checking Output Muon Info - Pt_CB: " << acc.ptOutDec(mu));
243
244 // If saggita was out of validity, return it here
245 if (sgCode == CorrectionCode::OutOfValidityRange) return sgCode;
246
247 // Return gracefully:
248 return CorrectionCode::Ok;
249 }
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
@ OutOfValidityRange
Input object is out of validity range.
@ Ok
The correction was done successfully.
ResolutionCategory
Declare the interface that the class provides.
Gaudi::Property< bool > m_validationMode
Gaudi::Property< bool > m_extra_highpt_smearing
Gaudi::Property< bool > m_skipResolutionCategory
Gaudi::Property< bool > m_applyCorrectionOnData
Gaudi::Property< float > m_HighPtSystThreshold
MCP::MuonObj convertToMuonObj(columnar::MuonId mu, columnar::EventInfoId evtInfo) const
Gaudi::Property< bool > m_2stations_highpt_smearing
std::unique_ptr< MCP::MuonCalibToolAccessors > m_acc
static const SG::AuxElement::Accessor< ElementLink< IParticleContainer > > acc("originalObjectLink")
Object used for setting/getting the dynamic decoration in question.
TrackCalibObj ID
Definition MuonObj.h:182
std::optional< ResolutionCategory > raw_mst_category
Definition MuonObj.h:198
TrackCalibObj CB
Definition MuonObj.h:184
TrackCalibObj ME
Definition MuonObj.h:183
int calib_charge
Value of the track-charge (after calibration)
Definition MuonObj.h:165
const double eta
Value of the track-eta.
Definition MuonObj.h:157
const double phi
Value of the track-phi.
Definition MuonObj.h:159
const bool isData
Definition MuonObj.h:169
double calib_pt
Smeared track pt.
Definition MuonObj.h:155

◆ applyCorrection() [2/2]

CorrectionCode CP::MuonCalibTool::applyCorrection ( xAOD::Muon & mu) const
overrideprivatevirtual

Declare the interface that the class provides.

Apply the correction on a modifyable object

Implements CP::IMuonCalibrationAndSmearingTool.

Definition at line 137 of file MuonCalibTool.cxx.

138 {
139 // Retrieve the event information:
140 SG::ReadHandle<xAOD::EventInfo> evtInfo(m_eventInfo);
142 }
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.
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfo
ObjectId< ContainerId::muon > MuonId
Definition MuonDef.h:25
ObjectId< ContainerId::eventInfo > EventInfoId

◆ applyCorrectionTrkOnly()

CorrectionCode CP::MuonCalibTool::applyCorrectionTrkOnly ( xAOD::TrackParticle & inTrk,
const int DetType ) const
overrideprivatevirtual

Implements CP::IMuonCalibrationAndSmearingTool.

Definition at line 251 of file MuonCalibTool.cxx.

252 {
253 // Convert to the internal object
254 MCP::MuonObj muonObj = convertToMuonObj(inTrk, DetType);
255
256 // Do Scale and Smearing corrections
257 CorrectionCode sgCode = m_MuonIntScaleSmearTool->applyCorrection(muonObj);
258 if (sgCode != CorrectionCode::Ok) return sgCode;
259
260 double res_pt = (DetType == MCP::DetectorType::MS) ? muonObj.ME.calib_pt*GeVtoMeV : muonObj.ID.calib_pt*GeVtoMeV;
261
262 inTrk.setDefiningParameters(inTrk.d0(), inTrk.z0(), inTrk.phi0(), inTrk.theta(),
263 inTrk.charge() / (res_pt * std::cosh(inTrk.eta())));
264
265 // Return gracefully:
266 return CorrectionCode::Ok;
267 }
std::vector< Identifier > ID
float z0() const
Returns the parameter.
float theta() const
Returns the parameter, which has range 0 to .
float d0() const
Returns the parameter.
void setDefiningParameters(float d0, float z0, float phi0, float theta, float qOverP)
Set the defining parameters.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float charge() const
Returns the charge.
float phi0() const
Returns the parameter, which has range to .

◆ applySystematicVariation()

StatusCode CP::MuonCalibTool::applySystematicVariation ( const SystematicSet & systConfig)
overrideprivatevirtual

effects: configure this tool for the given list of systematic variations.

any requested systematics that are not affecting this tool will be silently ignored (unless they cause other errors). failures: systematic unknown failures: requesting multiple variations on the same systematic (e.g. up & down) failures: requesting an unsupported variation on an otherwise supported systematic (e.g. a 2 sigma variation and the tool only supports 1 sigma variations) failures: unsupported combination of supported systematic failures: other tool specific errors

Implements CP::ISystematicsTool.

Definition at line 307 of file MuonCalibTool.cxx.

308 {
309 // Apply to the underlying tool
310 StatusCode code = m_MuonIntSagittaTool->applySystematicVariation(systConfig);
311 if(code != StatusCode::SUCCESS) return code;
312
313 code = m_MuonIntScaleSmearTool->applySystematicVariation(systConfig);
314 if(code != StatusCode::SUCCESS) return code;
315
317 code = m_MuonIntHighTSmearTool->applySystematicVariation(systConfig);
318 if(code != StatusCode::SUCCESS) return code;
319 }
320 return code;
321 }
::StatusCode StatusCode
StatusCode definition for legacy code.

◆ callEvents()

void CP::MuonCalibTool::callEvents ( columnar::EventContextRange events) const
override

Definition at line 664 of file MuonCalibTool.cxx.

664 {
665 auto& acc = *m_acc;
666 for (columnar::EventContextId event : events)
667 {
668 auto eventInfo = acc.m_eventInfoCol(event);
669 callSingleEvent (acc.m_muons(event), eventInfo);
670 }
671 }
void callSingleEvent(columnar::MuonRange muons, columnar::EventInfoId event) const
ObjectId< ContainerId::eventContext > EventContextId

◆ callSingleEvent()

void CP::MuonCalibTool::callSingleEvent ( columnar::MuonRange muons,
columnar::EventInfoId event ) const

Definition at line 647 of file MuonCalibTool.cxx.

648 {
649 for (columnar::MuonId muon : muons)
650 {
651 switch (applyCorrection(muon, event).code())
652 {
654 break;
656 throw std::runtime_error("OutOfValidityRange in applyCorrection");
657 break;
659 throw std::runtime_error("Error in applyCorrection");
660 }
661 }
662 }
@ Error
Some error happened during the object correction.

◆ convertToMuonObj() [1/2]

MCP::MuonObj CP::MuonCalibTool::convertToMuonObj ( columnar::MuonId mu,
columnar::EventInfoId evtInfo ) const
protected

Definition at line 418 of file MuonCalibTool.cxx.

419 {
420 auto& acc = *m_acc;
421 // Get information about data
422 bool isData = false;
424 else
425 {
426 // Retrieve the event information:
427 isData = !evtInfo(acc.eventTypeAcc, xAOD::EventInfo::IS_SIMULATION);
428 }
429 ATH_MSG_VERBOSE("Checking Simulation flag: " << !isData);
430
431 // Get information about which year it is here
432 auto year = MuonCalibTool::getPeriod(isData, evtInfo);
433
434
435 double Primary_eta = mu(acc.etaAcc);
436 double Primary_phi = mu(acc.phiAcc);
437 int charge = mu(acc.chargeAcc);
439
441 {
442 static const SG::AuxElement::Accessor<float> cb_pt("expert_ptcb");
443 static const SG::AuxElement::Accessor<float> id_pt("expert_ptid");
444 static const SG::AuxElement::Accessor<float> ms_pt("expert_ptms");
445 static const SG::AuxElement::Accessor<AmgVector(5)> CBParam("CBParam");
446 static const SG::AuxElement::Accessor<AmgSymMatrix(5)> CBCov("CBCov");
447 static const SG::AuxElement::Accessor<AmgVector(5)> IDParam("IDParam");
448 static const SG::AuxElement::Accessor<AmgSymMatrix(5)> IDCov("IDCov");
449 static const SG::AuxElement::Accessor<AmgVector(5)> MEParam("MEParam");
450 static const SG::AuxElement::Accessor<AmgSymMatrix(5)> MECov("MECov");
451
452 // Use the constructor where the eta/phi are overwritten to keep it inma line with current recommendations. To be changed in the future
453 auto CB = MCP::TrackCalibObj(MCP::TrackType::CB, charge, cb_pt(mu.getXAODObject()), Primary_eta, Primary_phi, mass, CBParam(mu.getXAODObject()), CBCov(mu.getXAODObject()), year, isData);
454 auto ID = MCP::TrackCalibObj(MCP::TrackType::ID, charge, id_pt(mu.getXAODObject()), Primary_eta, Primary_phi, mass, IDParam(mu.getXAODObject()), IDCov(mu.getXAODObject()), year, isData);
455 auto ME = MCP::TrackCalibObj(MCP::TrackType::ME, charge, ms_pt(mu.getXAODObject()), Primary_eta, Primary_phi, mass, MEParam(mu.getXAODObject()), MECov(mu.getXAODObject()), year, isData);
456
457 MCP::MuonObj muonObj{CB,ID,ME};
458 initializeRandNumbers(muonObj, evtInfo);
459
462 muonObj.expectedResID = expectedResolution(MCP::DetectorType::ID, mu, evtInfo, true) * muonObj.CB.calib_pt;
463 muonObj.expectedResME = expectedResolution(MCP::DetectorType::MS, mu, evtInfo, true) * muonObj.CB.calib_pt;
464
465 return muonObj;
466 }
467
468
469 // Retrieve all the trans
470 auto CB_track = mu(acc.combinedTrackParticleLinkAcc);
471 auto ID_track = mu(acc.inDetTrackParticleLinkAcc).opt_value();
472 auto ME_track = mu(acc.extrapolatedMuonSpectrometerTrackParticleLinkAcc);
473
474 // For SI muons, overwrite the charge from the CB track
475 if (mu(acc.muonTypeAcc) == xAOD::Muon::SiliconAssociatedForwardMuon)
476 {
477 if (CB_track) charge = CB_track.value()(acc.trkChargeAcc);
478 }
479
480 // Use the constructor where the eta/phi are overwritten to keep it inma line with current recommendations. To be changed in the future
481 auto CB = MCP::TrackCalibObj(acc, columnar::OptObjectId<columnar::MuonTrackDef>(CB_track), MCP::TrackType::CB, charge, Primary_eta, Primary_phi, year, isData);
482 auto ID = MCP::TrackCalibObj(acc, columnar::OptObjectId<columnar::MuonTrackDef>(ID_track), MCP::TrackType::ID, charge, Primary_eta, Primary_phi, year, isData);
483 auto ME = MCP::TrackCalibObj(acc, columnar::OptObjectId<columnar::MuonTrackDef>(ME_track), MCP::TrackType::ME, charge, Primary_eta, Primary_phi, year, isData);
484
485 MCP::MuonObj muonObj{CB,ID,ME};
486 initializeRandNumbers(muonObj, evtInfo);
489
490 muonObj.expectedResID = expectedResolution(MCP::DetectorType::ID, mu, evtInfo, true) * muonObj.CB.calib_pt;
491 muonObj.expectedResME = expectedResolution(MCP::DetectorType::MS, mu, evtInfo, true) * muonObj.CB.calib_pt;
492 return muonObj;
493 }
#define AmgSymMatrix(dim)
#define AmgVector(rows)
void initializeRandNumbers(MCP::MuonObj &obj, columnar::EventInfoId evtInfo) const
Decorate all information that's needed to ensure reproducibility of the smearing.
MCP::DataYear getPeriod(bool isData, columnar::EventInfoId evtInfo) const
virtual double expectedResolution(const std::string &DetType, const xAOD::Muon &mu, const bool addMCCorrectionSmearing) const override
Get the expected pT resolution.
Gaudi::Property< bool > m_expertMode_isData
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:572
@ IS_SIMULATION
true: simulation, false: data
constexpr float MeVtoGeV
constexpr double muonMassInMeV
the mass of the muon (in MeV)
double expectedResID
Definition MuonObj.h:201
double expectedPercentResME
Definition MuonObj.h:205
double expectedResME
Definition MuonObj.h:202
double expectedPercentResID
Definition MuonObj.h:204

◆ convertToMuonObj() [2/2]

MCP::MuonObj CP::MuonCalibTool::convertToMuonObj ( const xAOD::TrackParticle & inTrk,
const int DetType ) const
protected

Definition at line 494 of file MuonCalibTool.cxx.

495 {
496 auto& acc = *m_acc;
497 // Get information about data
498 bool isData = false;
499
500 // Retrieve the event information:
501 SG::ReadHandle<xAOD::EventInfo> evtInfo(m_eventInfo);
502 isData = !evtInfo->eventType(xAOD::EventInfo::IS_SIMULATION);
503
504 ATH_MSG_VERBOSE("Checking Simulation flag: " << !isData);
505
506 // Get information about which year it is here
507 auto year = MuonCalibTool::getPeriod(isData, *evtInfo);
508 int charge = inTrk.charge();
509 if (DetType == MCP::DetectorType::ID)
510 {
511 auto CB = MCP::TrackCalibObj(acc, &inTrk, MCP::TrackType::CB, charge, year, isData);
512 auto ID = MCP::TrackCalibObj(acc, &inTrk, MCP::TrackType::ID, charge, year, isData);
513 auto ME = MCP::TrackCalibObj(acc, &inTrk, MCP::TrackType::ME, charge, year, isData);
514
515 MCP::MuonObj muonObj{CB,ID,ME};
516 return muonObj;
517 }
518
519 auto CB = MCP::TrackCalibObj(acc, &inTrk, MCP::TrackType::CB, charge, year, isData);
520 auto ID = MCP::TrackCalibObj(acc, nullptr, MCP::TrackType::ID, charge, year, isData);
521 auto ME = MCP::TrackCalibObj(acc, &inTrk, MCP::TrackType::ME, charge, year, isData);
522
523 MCP::MuonObj muonObj{CB,ID,ME};
524 return muonObj;
525 }

◆ correctedCopy()

CorrectionCode CP::MuonCalibTool::correctedCopy ( const xAOD::Muon & input,
xAOD::Muon *& output ) const
overrideprivatevirtual

Create a corrected copy from a constant muon.

Implements CP::IMuonCalibrationAndSmearingTool.

Definition at line 269 of file MuonCalibTool.cxx.

270 {
271 // A sanity check:
272 if (output)
274 "Non-null pointer received. "
275 "There's a possible memory leak!");
276
277 // Create a new object:
278 ATH_MSG_VERBOSE("Going to create new xAOD::Muon...");
279 output = new xAOD::Muon();
280 ATH_MSG_VERBOSE("Calling makePrivateStore...");
281 output->makePrivateStore(input);
282
283 // Use the other function to modify this object:
284 ATH_MSG_VERBOSE("Calling applyCorrection...");
285
286 CP::CorrectionCode retCode = applyCorrection(*output);
287
288 return retCode;
289 }
#define ATH_MSG_WARNING(x)
output
Definition merge.py:16
Muon_v1 Muon
Reference the current persistent version:

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ expectedResolution() [1/3]

double CP::MuonCalibTool::expectedResolution ( const int & DetType,
columnar::MuonId mu,
columnar::EventInfoId evtInfo,
const bool addMCCorrectionSmearing ) const
private

Definition at line 344 of file MuonCalibTool.cxx.

345 {
346 auto& acc = *m_acc;
347 // Get information about data
348 bool isData = false;
350 else
351 {
352 // Retrieve the event information:
353 isData = !evtInfo(acc.eventTypeAcc, xAOD::EventInfo::IS_SIMULATION);
354 }
355
356 // Get information about which year it is here
357 MCP::DataYear dataYear = MuonCalibTool::getPeriod(isData, evtInfo);
358
359 // get the pt measurements from the xAOD::Muon object
360 double loc_ptid = 0;
361 double loc_ptms = 0;
362 double loc_ptcb = 0;
363
364 double Primary_eta = mu(acc.etaAcc);
365 double Primary_phi = mu(acc.phiAcc);
366
367 if (m_validationMode)
368 {
369 static const SG::AuxElement::Accessor<float> id_pt("expert_ptid");
370 static const SG::AuxElement::Accessor<float> ms_pt("expert_ptms");
371 static const SG::AuxElement::Accessor<float> cb_pt("expert_ptcb");
372
373 loc_ptid = id_pt(mu.getXAODObject()) * MeVtoGeV;
374 loc_ptms = ms_pt(mu.getXAODObject()) * MeVtoGeV;
375 loc_ptcb = cb_pt(mu.getXAODObject()) * MeVtoGeV;
376
377 } else {
378
379 // Retrieve all the trans
380 auto CB_track = mu(acc.combinedTrackParticleLinkAcc);
381 auto ID_track = mu(acc.inDetTrackParticleLinkAcc).opt_value();
382 auto ME_track = mu(acc.extrapolatedMuonSpectrometerTrackParticleLinkAcc);
383
384 if(CB_track) loc_ptcb = acc.trkMomentumAcc.pt(CB_track.value(), ParticleConstants::muonMassInMeV) * MeVtoGeV;
385 if(ID_track) loc_ptid = acc.trkMomentumAcc.pt(ID_track.value(), ParticleConstants::muonMassInMeV) * MeVtoGeV;
386 if(ME_track) loc_ptms = acc.trkMomentumAcc.pt(ME_track.value(), ParticleConstants::muonMassInMeV) * MeVtoGeV;
387 }
388
389 if (DetType == MCP::DetectorType::MS)
390 {
391 return m_MuonIntScaleSmearTool->getExpectedResolution(DetType, loc_ptms, Primary_eta, Primary_phi, dataYear, addMCCorrectionSmearing);
392 }
393 else if (DetType == MCP::DetectorType::ID)
394 {
395 return m_MuonIntScaleSmearTool->getExpectedResolution(DetType, loc_ptid, Primary_eta, Primary_phi, dataYear, addMCCorrectionSmearing);
396 }
397 else if (DetType == MCP::DetectorType::CB)
398 {
399 // Due to complicated maths, the expected combined resolution
400 // is given by this equation (note: all sigmas are fractional uncertainties):
401 // sigma_CB = std::sqrt(2) * sigma_ID * sigma_MS * pTMS * pTID / {pTCB * std::sqrt({sigma_ID*pTID}^2 + {sigma_MS*pTMS}^2)}
402 // Do a little recursive calling to make things easier to read
403 // Turn these into *absolute* uncertainties to make life easier
404 double sigmaID = expectedResolution(MCP::DetectorType::ID, mu, evtInfo, addMCCorrectionSmearing) * loc_ptid;
405 double sigmaMS = expectedResolution(MCP::DetectorType::MS, mu, evtInfo, addMCCorrectionSmearing) * loc_ptms;
406 double denominator = (loc_ptcb)*std::sqrt(sigmaID * sigmaID + sigmaMS * sigmaMS);
407 return denominator ? sigmaID * sigmaMS / denominator : 0.;
408 }
409 else
410 {
411 ATH_MSG_ERROR("wrong DetType in input " << DetType);
412 }
413 return 0.;
414
415 }
#define ATH_MSG_ERROR(x)
DataYear
Definition EnumDef.h:28

◆ expectedResolution() [2/3]

double CP::MuonCalibTool::expectedResolution ( const int & DetType,
const xAOD::Muon & mu,
const bool mc ) const
overrideprivatevirtual

Get the expected pT resolution - int argument is more efficient.

Implements CP::IMuonCalibrationAndSmearingTool.

Definition at line 338 of file MuonCalibTool.cxx.

339 {
340 SG::ReadHandle<xAOD::EventInfo> evtInfo(m_eventInfo);
341 return expectedResolution(DetType, columnar::MuonId(mu), columnar::EventInfoId(*evtInfo), addMCCorrectionSmearing);
342 }

◆ expectedResolution() [3/3]

double CP::MuonCalibTool::expectedResolution ( const std::string & DetType,
const xAOD::Muon & mu,
const bool mc ) const
overrideprivatevirtual

Get the expected pT resolution.

Implements CP::IMuonCalibrationAndSmearingTool.

Definition at line 323 of file MuonCalibTool.cxx.

324 {
325 // Expected resolution in data (or unsmeared MC if second argument is true)
326 if (DetType == "MS") {
327 return expectedResolution(MCP::DetectorType::MS, mu, addMCCorrectionSmearing);
328 } else if (DetType == "ID") {
329 return expectedResolution(MCP::DetectorType::ID, mu, addMCCorrectionSmearing);
330 } else if (DetType == "CB") {
331 return expectedResolution(MCP::DetectorType::CB, mu, addMCCorrectionSmearing);
332 } else {
333 ATH_MSG_ERROR("The DetType that you entered is not allows - DetType = " << DetType);
334 return 0.;
335 }
336 }

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ getKey()

SG::sgkey_t asg::AsgTool::getKey ( const void * ptr) const
inherited

Get the (hashed) key of an object that is in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::TEvent both provide ways for getting the SG::sgkey_t key for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getName
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The hashed key of the object in the store. If not found, an invalid (zero) key.

Definition at line 119 of file AsgTool.cxx.

119 {
120
121#ifdef XAOD_STANDALONE
122 // In case we use @c xAOD::TEvent, we have a direct function call
123 // for this.
124 return evtStore()->event()->getKey( ptr );
125#else
126 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
127 return ( proxy == nullptr ? 0 : proxy->sgkey() );
128#endif // XAOD_STANDALONE
129 }
ServiceHandle< StoreGateSvc > & evtStore()

◆ getName()

const std::string & asg::AsgTool::getName ( const void * ptr) const
inherited

Get the name of an object that is / should be in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::TEvent both provide ways for getting the std::string name for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getKey
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The string name of the object in the store. If not found, an empty string.

Definition at line 106 of file AsgTool.cxx.

106 {
107
108#ifdef XAOD_STANDALONE
109 // In case we use @c xAOD::TEvent, we have a direct function call
110 // for this.
111 return evtStore()->event()->getName( ptr );
112#else
113 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
114 static const std::string dummy = "";
115 return ( proxy == nullptr ? dummy : proxy->name() );
116#endif // XAOD_STANDALONE
117 }

◆ getPeriod()

MCP::DataYear CP::MuonCalibTool::getPeriod ( bool isData,
columnar::EventInfoId evtInfo ) const
protected

Definition at line 551 of file MuonCalibTool.cxx.

552 {
553 // I've copied the run number ranges from SUSYTools (Run2) - Haider
554 // https://gitlab.cern.ch/atlas/athena/blob/21.2/PhysicsAnalysis/SUSYPhys/SUSYTools/Root/SUSYObjDef_xAOD.cxx#L2438
555 // Range for Run3 taken from COMA - Luca
556 // https://atlas-tagservices.cern.ch/tagservices/RunBrowser/runBrowserReport/rBR_Period_Report.php?fnt=data22_13p6TeV
557 // https://atlas-tagservices.cern.ch/tagservices/RunBrowser/runBrowserReport/rBR_Period_Report.php?fnt=data23_13p6TeV
558 // https://atlas-tagservices.cern.ch/tagservices/RunBrowser/runBrowserReport/rBR_Period_Report.php?fnt=data24_13p6TeV
559 constexpr unsigned int last_run_16 = 320000;
560 constexpr unsigned int last_run_17 = 342000;
561 constexpr unsigned int last_run_18 = 370000;
562 constexpr unsigned int last_run_22 = 440614;
563 constexpr unsigned int last_run_23 = 456750;
564 constexpr unsigned int last_run_24 = 999999;
565
566 static const std::set<int> MCperiods1516{284500};
567 static const std::set<int> MCperiods17{300000, 304000, 305000};
568 static const std::set<int> MCperiods18{310000};
569 static const std::set<int> MCperiods22{330000, 410000};
570 static const std::set<int> MCperiods23{450000};
571 static const std::set<int> MCperiods24{470000};
572
573 static const std::set<int> MCperiodsRun4{350000, 350060, 350140, 350200};
574
575 auto& acc = *m_acc;
576 unsigned int run = 0;
578 else run = evtInfo(acc.runNumberAcc);
579 // retrieve the random run number
580 if (!isData && m_useRndRun) {
581 if (acc.acc_rnd.isAvailable(evtInfo))
582 run = acc.acc_rnd(evtInfo);
583 else {
585 "No random runnumber could be found although the tool is configured to assign the years based on it. Please make sure "
586 "to apply the prwTool before-hand or consider to set the property 'useRandomRunNumber' to false.");
588 }
589 }
590 // Check the Monte carlo
591 if (!isData && (!m_useRndRun || !acc.acc_rnd.isAvailable(evtInfo))) {
592 if (MCperiods1516.count(run)) {
593 ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc20a / data15-16");
595 } else if (MCperiods17.count(run)) {
596 ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc20d / data17");
598 } else if (MCperiods18.count(run)) {
599 ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc20e / data18");
601 } else if (MCperiods22.count(run)) {
602 ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc21 / mc23a / data22");
604 } else if (MCperiods23.count(run)) {
605 ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc23c / mc23d / data23");
607 } else if (MCperiods24.count(run)) {
608 ATH_MSG_DEBUG("The current run " << run << " corresponds to data mc23e / data24");
610 } else if (MCperiodsRun4.count(run)) {
611 ATH_MSG_DEBUG("The current run " << run << " corresponds to data Run4");
612 return MCP::DataYear::Run4;
613 }
614
615 }
616 // Check data itself or the random run number is used
617 else if (isData || m_useRndRun) {
618 if (run < last_run_16) {
619 ATH_MSG_DEBUG("The current run " << run << " is taken in data 15-16");
621 } else if (run <= last_run_17) {
622 ATH_MSG_DEBUG("The current run " << run << " is taken in data 17");
624 } else if (run <= last_run_18) {
625 ATH_MSG_DEBUG("The current run " << run << " is taken in data 18");
627 } else if (run <= last_run_22) {
628 ATH_MSG_DEBUG("The current run " << run << " is taken in data 22");
630 } else if (run < last_run_23) {
631 ATH_MSG_DEBUG("The current run " << run << " is taken in data 23");
633 } else if (run < last_run_24) {
634 ATH_MSG_DEBUG("The current run " << run << " is taken in data 24");
636 }
637 }
638 static std::atomic<bool> warningPrinted {false};
639 if (!warningPrinted) {
640 ATH_MSG_WARNING("Could not assign run-number " << run << " to a specific year of data-taking, using default year 24");
641 warningPrinted = true;
642 }
644 }
Gaudi::Property< bool > m_useRndRun
Gaudi::Property< int > m_expertMode_RunNumber

◆ getProperty()

template<class T>
const T * asg::AsgTool::getProperty ( const std::string & name) const
inherited

Get one of the tool's properties.

◆ initialize()

StatusCode CP::MuonCalibTool::initialize ( void )
overridevirtual

Dummy implementation of the initialisation function.

It's here to allow the dual-use tools to skip defining an initialisation function. Since many are doing so...

Create the high pT tool

Reimplemented from asg::AsgTool.

Definition at line 30 of file MuonCalibTool.cxx.

31 {
32 // Greet the user:
33 ATH_MSG_INFO("Initialising...");
34
35 // Get the m_eventinfo container
36 ATH_CHECK(m_eventInfo.initialize());
37
38 // Set the options
39 if (m_calibMode == MuonCalibTool::correctData_CB) {
40 ATH_MSG_INFO("Data will be corrected for sagitta bias with CB calibration");
41 m_doDirectCBCalib = true;
43
44 } else if (m_calibMode == MuonCalibTool::correctData_IDMS) {
45 ATH_MSG_INFO("Data will be corrected for sagitta bias with ID+MS calibration");
46 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");
47 m_doDirectCBCalib = false;
49
50 } else if (m_calibMode == MuonCalibTool::notCorrectData_IDMS) {
51 ATH_MSG_INFO("Data will be untouched. Instead an additional systematic will be added with ID+MS calibration");
52 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");
53 m_doDirectCBCalib = false;
55 }
56 else if (m_calibMode == MuonCalibTool::notCorrectData_CB) {
57 ATH_MSG_INFO("Data will be untouched. Instead an additional systematic will be added with CB calibration");
58 m_doDirectCBCalib = true;
60 }
61 else if (m_calibMode == MuonCalibTool::userDefined) {
62 ATH_MSG_INFO("Using options as provided by the user");
63 }
64 else {
65 ATH_MSG_FATAL("Invalid calibration mode: " << m_calibMode << " Allowed modes are correctData_CB("
66 << MuonCalibTool::correctData_CB << ") correctData_IDMS ("
67 << MuonCalibTool::correctData_IDMS << ") or notCorrectData_IDMS ("
68 << MuonCalibTool::notCorrectData_IDMS << ") or notCorrectData_CB ("
69 << MuonCalibTool::notCorrectData_CB << ")");
70 return StatusCode::FAILURE;
71 }
72
73 if (!m_skipResolutionCategory.value())
74 {
75 // Get the muon selection tool
76 if (m_MuonSelectionTool.empty()) {
77 m_MuonSelectionTool.setTypeAndName("CP::MuonSelectionTool/MCaST_Own_MST");
78 ATH_CHECK(m_MuonSelectionTool.setProperty("MaxEta", 2.7));
79 ATH_CHECK(m_MuonSelectionTool.setProperty("MuQuality", 1));
80 ATH_CHECK(m_MuonSelectionTool.setProperty("TurnOffMomCorr", true));
81 ATH_CHECK(m_MuonSelectionTool.setProperty("IsRun3Geo", m_isRun3.value()));
82 ATH_CHECK(m_MuonSelectionTool.setProperty("OutputLevel", msg().level()));
83 ATH_CHECK(m_MuonSelectionTool.setProperty("ExcludeNSWFromPrecisionLayers", m_excludeNSWFromPrecisionLayers.value()));
84 }
86 if (auto *selectionTool = dynamic_cast<columnar::ColumnarTool<>*>(m_MuonSelectionTool.get()))
87 addSubtool (*selectionTool);
88 }
89
90 // Create the Sagitta tool
91 if (m_MuonIntSagittaTool.empty()) {
92 m_MuonIntSagittaTool.setTypeAndName("CP::MuonCalibIntSagittaTool/MCaST_Sagitta");
93 ATH_CHECK(m_MuonIntSagittaTool.setProperty("release", m_release.value()));
94 ATH_CHECK(m_MuonIntSagittaTool.setProperty("systematicScheme", m_sysScheme.value()));
95 ATH_CHECK(m_MuonIntSagittaTool.setProperty("applyCorrectionOnData", m_applyCorrectionOnData.value()));
96 ATH_CHECK(m_MuonIntSagittaTool.setProperty("doDirectCBCalib", m_doDirectCBCalib.value()));
97 ATH_CHECK(m_MuonIntSagittaTool.setProperty("doEtaSagittaSys", m_doEtaSagittaSys.value()));
98 ATH_CHECK(m_MuonIntSagittaTool.setProperty("OutputLevel", msg().level()));
99 }
101
102 // Create the scale smear tool
103 if (m_MuonIntScaleSmearTool.empty()) {
104 m_MuonIntScaleSmearTool.setTypeAndName("CP::MuonCalibIntScaleSmearTool/MCaST_ScaleSmear");
105 ATH_CHECK(m_MuonIntScaleSmearTool.setProperty("release", m_release.value()));
106 ATH_CHECK(m_MuonIntScaleSmearTool.setProperty("systematicScheme", m_sysScheme.value()));
107 ATH_CHECK(m_MuonIntScaleSmearTool.setProperty("doDirectCBCalib", m_doDirectCBCalib.value()));
108 ATH_CHECK(m_MuonIntScaleSmearTool.setProperty("OutputLevel", msg().level()));
110 }
113 if (m_MuonIntHighTSmearTool.empty()) {
114 m_MuonIntHighTSmearTool.setTypeAndName("CP::MuonCalibIntHighpTSmearTool/MCaST_highPtScaleSmear");
115 ATH_CHECK(m_MuonIntHighTSmearTool.setProperty("release", m_release.value()));
116 ATH_CHECK(m_MuonIntHighTSmearTool.setProperty("OutputLevel", msg().level()));
117 }
120 }
121 if (!applySystematicVariation(SystematicSet()))
122 {
123 ATH_MSG_ERROR("Unable to run with no systematic");
124 return StatusCode::FAILURE;
125 }
126 SystematicRegistry &registry = SystematicRegistry::getInstance();
127 if (registry.registerSystematics(*this) != StatusCode::SUCCESS)
128 {
129 ATH_MSG_ERROR("Unkown systematic list");
130 return StatusCode::FAILURE;
131 }
132 ATH_CHECK (initializeColumns());
133 // Return gracefully:
134 return StatusCode::SUCCESS;
135 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
MsgStream & msg() const
Gaudi::Property< std::string > m_sysScheme
Gaudi::Property< std::string > m_release
Gaudi::Property< bool > m_excludeNSWFromPrecisionLayers
Gaudi::Property< bool > m_doEtaSagittaSys
Gaudi::Property< bool > m_isRun3
virtual StatusCode applySystematicVariation(const SystematicSet &systConfig) override
effects: configure this tool for the given list of systematic variations.
Gaudi::Property< int > m_calibMode
Gaudi::Property< bool > m_doDirectCBCalib
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

◆ initializeRandNumbers()

void CP::MuonCalibTool::initializeRandNumbers ( MCP::MuonObj & obj,
columnar::EventInfoId evtInfo ) const
protected

Decorate all information that's needed to ensure reproducibility of the smearing.

Definition at line 528 of file MuonCalibTool.cxx.

529 {
530 auto& acc = *m_acc;
531 // Random number generation for smearing
532 TRandom3 loc_random3;
533 // Get Event Number, Retrieve the event information:
534 unsigned long long eventNumber = 0;
536 else eventNumber = evtInfo(acc.eventNumberAcc);
537 // Construct a seed for the random number generator:
538 const UInt_t seed = 1 + std::abs(muonObj.CB.phi) * 1E6 + std::abs(muonObj.CB.eta) * 1E3 + eventNumber;
539 loc_random3.SetSeed(seed);
540
541 muonObj.rnd_g0 = loc_random3.Gaus(0, 1);
542 muonObj.rnd_g1 = loc_random3.Gaus(0, 1);
543 muonObj.rnd_g2 = loc_random3.Gaus(0, 1);
544 muonObj.rnd_g3 = loc_random3.Gaus(0, 1);
545 muonObj.rnd_g4 = loc_random3.Gaus(0, 1);
546 muonObj.rnd_g_highPt = loc_random3.Gaus(0, 1);
547
548
549 }
Gaudi::Property< unsigned long long > m_expertMode_EvtNumber

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isAffectedBySystematic()

bool CP::MuonCalibTool::isAffectedBySystematic ( const SystematicVariation & systematic) const
overrideprivatevirtual

Declare the interface that this class provides.

returns: whether this tool is affected by the given systematics

Implements CP::ISystematicsTool.

Definition at line 291 of file MuonCalibTool.cxx.

292 {
293 SystematicSet sys = affectingSystematics();
294 return sys.find(systematic) != sys.end();
295 }
virtual SystematicSet affectingSystematics() const override
the list of all systematics this tool can be affected by

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msg_level_name()

const std::string & asg::AsgTool::msg_level_name ( ) const
inherited

A deprecated function for getting the message level's name.

Instead of using this, weirdly named function, user code should get the string name of the current minimum message level (in case they really need it...), with:

MSG::name( msg().level() )

This function's name doesn't follow the ATLAS coding rules, and as such will be removed in the not too distant future.

Returns
The string name of the current minimum message level that's printed

Definition at line 101 of file AsgTool.cxx.

101 {
102
103 return MSG::name( msg().level() );
104 }
const std::string & name(Level lvl)
Convenience function for translating message levels to strings.
Definition MsgLevel.cxx:19

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ print()

◆ recommendedSystematics()

SystematicSet CP::MuonCalibTool::recommendedSystematics ( ) const
overrideprivatevirtual

the list of all systematics this tool recommends to use

Implements CP::IReentrantSystematicsTool.

Definition at line 305 of file MuonCalibTool.cxx.

305{ return affectingSystematics(); }

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_2stations_highpt_smearing

Gaudi::Property<bool> CP::MuonCalibTool::m_2stations_highpt_smearing {this, "do2StationsHighPt", false, "Extra smearing to be applied if high pT WP is used"}
protected

Definition at line 120 of file MuonCalibTool.h.

120{this, "do2StationsHighPt", false, "Extra smearing to be applied if high pT WP is used"};

◆ m_acc

std::unique_ptr<MCP::MuonCalibToolAccessors> CP::MuonCalibTool::m_acc {std::make_unique<MCP::MuonCalibToolAccessors>(*this)}

Definition at line 151 of file MuonCalibTool.h.

151{std::make_unique<MCP::MuonCalibToolAccessors>(*this)};

◆ m_applyCorrectionOnData

Gaudi::Property<bool> CP::MuonCalibTool::m_applyCorrectionOnData {this, "applyCorrectionOnData", true, "If to apply sagitta corrections on data, or take the full effect as systematic"}
protected

Definition at line 115 of file MuonCalibTool.h.

115{this, "applyCorrectionOnData", true, "If to apply sagitta corrections on data, or take the full effect as systematic"};

◆ m_calibMode

Gaudi::Property<int> CP::MuonCalibTool::m_calibMode {this, "calibMode", -1, "Calib mode"}
protected

Definition at line 102 of file MuonCalibTool.h.

102{this, "calibMode", -1, "Calib mode"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doDirectCBCalib

Gaudi::Property<bool> CP::MuonCalibTool::m_doDirectCBCalib {this, "doDirectCBCalib", true, "Do direct calibration of CB tracks, otherwise, do ID+MS"}
protected

Definition at line 110 of file MuonCalibTool.h.

110{this, "doDirectCBCalib", true, "Do direct calibration of CB tracks, otherwise, do ID+MS"};

◆ m_doEtaSagittaSys

Gaudi::Property<bool> CP::MuonCalibTool::m_doEtaSagittaSys {this, "doEtaSagittaSys", false, "Do Eta dependant systematic system"}
protected

Definition at line 114 of file MuonCalibTool.h.

114{this, "doEtaSagittaSys", false, "Do Eta dependant systematic system"};

◆ m_eventInfo

SG::ReadHandleKey<xAOD::EventInfo> CP::MuonCalibTool::m_eventInfo {this, "EventInfoContName", "EventInfo", "event info key"}
protected

Definition at line 87 of file MuonCalibTool.h.

87{this, "EventInfoContName", "EventInfo", "event info key"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_excludeNSWFromPrecisionLayers

Gaudi::Property<bool> CP::MuonCalibTool::m_excludeNSWFromPrecisionLayers {this, "ExcludeNSWFromPrecisionLayers", false, "Cut on the number of precision layers ignores the NSW"}
protected

Definition at line 106 of file MuonCalibTool.h.

106{this, "ExcludeNSWFromPrecisionLayers", false, "Cut on the number of precision layers ignores the NSW"};

◆ m_expertMode_EvtNumber

Gaudi::Property<unsigned long long> CP::MuonCalibTool::m_expertMode_EvtNumber {this, "expertMode_EvtNumber", 0, "Expert only option. Overwrites EventNumber"}
protected

Definition at line 99 of file MuonCalibTool.h.

99{this, "expertMode_EvtNumber", 0, "Expert only option. Overwrites EventNumber"};

◆ m_expertMode_isData

Gaudi::Property<bool> CP::MuonCalibTool::m_expertMode_isData {this, "expertMode_isData", false, "Expert only option. Overwrites the isData Flag"}
protected

Definition at line 97 of file MuonCalibTool.h.

97{this, "expertMode_isData", false, "Expert only option. Overwrites the isData Flag"};

◆ m_expertMode_RunNumber

Gaudi::Property<int> CP::MuonCalibTool::m_expertMode_RunNumber {this, "expertMode_RunNumber", 0, "Expert only option. Overwrites RunNumber"}
protected

Definition at line 98 of file MuonCalibTool.h.

98{this, "expertMode_RunNumber", 0, "Expert only option. Overwrites RunNumber"};

◆ m_extra_highpt_smearing

Gaudi::Property<bool> CP::MuonCalibTool::m_extra_highpt_smearing {this, "doExtraSmearing", false, "Flag provided to test if analysis are sensitive to high pT calibration. NOT TO BE USED FOR RESULTS. Please see twiki"}
protected

Definition at line 122 of file MuonCalibTool.h.

122{this, "doExtraSmearing", false, "Flag provided to test if analysis are sensitive to high pT calibration. NOT TO BE USED FOR RESULTS. Please see twiki"};

◆ m_HighPtSystThreshold

Gaudi::Property<float> CP::MuonCalibTool::m_HighPtSystThreshold {this, "HighPtSystThr", 300.0, "Thershold for high pT smearing in GeV"}
protected

Definition at line 123 of file MuonCalibTool.h.

123{this, "HighPtSystThr", 300.0, "Thershold for high pT smearing in GeV"};

◆ m_isRun3

Gaudi::Property<bool> CP::MuonCalibTool::m_isRun3 {this, "IsRun3Geo", false, "Needed for MuonSelectionTool"}
protected

Definition at line 89 of file MuonCalibTool.h.

89{this, "IsRun3Geo", false, "Needed for MuonSelectionTool"};

◆ m_MuonIntHighTSmearTool

asg::AnaToolHandle<CP::IMuonCalibIntTool> CP::MuonCalibTool::m_MuonIntHighTSmearTool {""}
protected

Definition at line 130 of file MuonCalibTool.h.

130{""};

◆ m_MuonIntHighTSmearToolInitialized

bool CP::MuonCalibTool::m_MuonIntHighTSmearToolInitialized {false}
private

Definition at line 145 of file MuonCalibTool.h.

145{false};

◆ m_MuonIntSagittaTool

asg::AnaToolHandle<CP::IMuonCalibIntTool> CP::MuonCalibTool::m_MuonIntSagittaTool {""}
protected

Definition at line 127 of file MuonCalibTool.h.

127{""};

◆ m_MuonIntScaleSmearTool

asg::AnaToolHandle<CP::IMuonCalibIntScaleSmearTool> CP::MuonCalibTool::m_MuonIntScaleSmearTool {""}
protected

Definition at line 128 of file MuonCalibTool.h.

128{""};

◆ m_MuonSelectionTool

asg::AnaToolHandle<CP::IMuonSelectionTool> CP::MuonCalibTool::m_MuonSelectionTool {""}
protected

Definition at line 125 of file MuonCalibTool.h.

125{""};

◆ m_release

Gaudi::Property<std::string> CP::MuonCalibTool::m_release {this, "release", "Recs2025_03_26_Run2Run3", "Release"}
protected

Definition at line 92 of file MuonCalibTool.h.

92{this, "release", "Recs2025_03_26_Run2Run3", "Release"};

◆ m_skipResolutionCategory

Gaudi::Property<bool> CP::MuonCalibTool::m_skipResolutionCategory {this, "skipResolutionCategory", false, "whether to skip the resolution category variable"}

Definition at line 149 of file MuonCalibTool.h.

149{this, "skipResolutionCategory", false, "whether to skip the resolution category variable"};

◆ m_sysScheme

Gaudi::Property<std::string> CP::MuonCalibTool::m_sysScheme {this, "systematicScheme", "Corr_Scale", "Systematic scheme to be configured"}
protected

Definition at line 94 of file MuonCalibTool.h.

94{this, "systematicScheme", "Corr_Scale", "Systematic scheme to be configured"};

◆ m_useRndRun

Gaudi::Property<bool> CP::MuonCalibTool::m_useRndRun {this, "useRandomRunNumber", false, "To use the random run number for deciding which calibration to apply"}
protected

Definition at line 100 of file MuonCalibTool.h.

100{this, "useRandomRunNumber", false, "To use the random run number for deciding which calibration to apply"};

◆ m_validationMode

Gaudi::Property<bool> CP::MuonCalibTool::m_validationMode {this, "expert_validationMode", false, "Expert only option. Puts the tool in the validation mode setup"}
protected

Definition at line 96 of file MuonCalibTool.h.

96{this, "expert_validationMode", false, "Expert only option. Puts the tool in the validation mode setup"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: