ATLAS Offline Software
Electrons.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // This source file implements all of the functions related to Electrons
6 // in the SUSYObjDef_xAOD class
7 
8 // Local include(s):
10 
14 
25 
28 //disable #include "IsolationSelection/IIsolationLowPtPLVTool.h"
29 
31 
32 //disable #include "PATCore/TResult.h"
33 
34 // For getting the beam spot information
36 
37 #ifndef XAOD_STANDALONE // For now metadata is Athena-only
39 #endif
40 
41 namespace ST {
42 
43  const static SG::Decorator<char> dec_passSignalID("passSignalID");
44  const static SG::ConstAccessor<char> acc_passSignalID("passSignalID");
45 
46  const static SG::Decorator<char> dec_passChID("passChID");
47  const static SG::ConstAccessor<char> acc_passChID("passChID");
48  const static SG::Decorator<double> dec_ecisBDT("ecisBDT");
49 
50  const static SG::Decorator<float> dec_sfChIDEff("chargeIDEffiSF"); //tools' default
51  const static SG::ConstAccessor<float> acc_sfChIDEff("chargeIDEffiSF"); //tools' default
52 
53  const static SG::Decorator<float> dec_z0sinTheta("z0sinTheta");
54  const static SG::Decorator<float> dec_d0sig("d0sig");
55  const static SG::Decorator<char> dec_isLRT("isLRT");
56  const static SG::ConstAccessor<char> acc_isLRT("isLRT");
57 
58  const static SG::ConstAccessor<char> acc_passECIDS("DFCommonElectronsECIDS"); // Loose 97% WP
59 
60 
61 StatusCode SUSYObjDef_xAOD::MergeElectrons(const xAOD::ElectronContainer & electrons, xAOD::ElectronContainer* outputCol, const std::set<const xAOD::Electron *> &ElectronsToRemove) const{
62 
63  if (electrons.empty()) return StatusCode::SUCCESS;
64  for (const xAOD::Electron* electron: electrons) {
65  if (ElectronsToRemove.find(electron) != ElectronsToRemove.end()){
66  ATH_MSG_DEBUG( "Removing electron from output collection (isLRT?) : ("<< static_cast<int>(acc_isLRT(*electron)) << ")" );
67  ATH_MSG_DEBUG( "ELECTRON cl eta: " << electron->caloCluster()->eta());
68  ATH_MSG_DEBUG( "ELECTRON cl phi: " << electron->caloCluster()->phi());
69  continue;
70  // add electron into output
71  } else {
72  ATH_MSG_DEBUG( "Adding electron to output collection (isLRT?) : (" << static_cast<int>(acc_isLRT(*electron)) << ")" );
73  ATH_MSG_DEBUG( "ELECTRON cl eta: " << electron->caloCluster()->eta());
74  ATH_MSG_DEBUG( "ELECTRON cl phi: " << electron->caloCluster()->phi());
75  auto newElectron = new xAOD::Electron(*electron);
76 
77  if ( getOriginalObject(*electron) != nullptr ) {
79  } else {
80  setOriginalObjectLink(*electron, *newElectron);
81  }
82 
83  outputCol->push_back(newElectron);
84  }
85  }
86  return StatusCode::SUCCESS;
87 }
88 
89 
91  for (const xAOD::Electron *electron: *inElectrons){
92  const xAOD::TrackParticle* idtrack = electron->trackParticle();
93 
94  // Save electron if the id track passes the LRT filter
95  if ( acc_lrtFilter.isAvailable(*idtrack) )
96  {
97  if ( static_cast<int>(acc_lrtFilter(*idtrack) ) ){
98  std::unique_ptr<xAOD::Electron> copyElectron = std::make_unique<xAOD::Electron>(*electron);
99 
100  // transfer original electron link
101 
102  setOriginalObjectLink(*electron, *copyElectron);
103  copy->push_back( std::move(copyElectron) );
104  }
105  }
106  else // Keep electron if flag is not available
107  {
108  std::unique_ptr<xAOD::Electron> copyElectron = std::make_unique<xAOD::Electron>(*electron);
109 
110  setOriginalObjectLink(*electron, *copyElectron);
111  copy->push_back( std::move(copyElectron) );
112  }
113  }
114  return StatusCode::SUCCESS;
115 }
116 
117 
118 StatusCode SUSYObjDef_xAOD::GetElectrons(xAOD::ElectronContainer*& copy, xAOD::ShallowAuxContainer*& copyaux, bool recordSG, const std::string& elekey, const std::string& lrtelekey, const xAOD::ElectronContainer* containerToBeCopied)
119 {
120  if (!m_tool_init) {
121  ATH_MSG_ERROR("SUSYTools was not initialized!!");
122  return StatusCode::FAILURE;
123  }
124 
125  // Initializing prompt/LRT OR procedure
126  auto outputCol = std::make_unique<xAOD::ElectronContainer>();
127  std::unique_ptr<xAOD::ElectronAuxContainer> outputAuxCol;
128  outputAuxCol = std::make_unique<xAOD::ElectronAuxContainer>();
129  outputCol->setStore(outputAuxCol.get());
131 
132  if (bool(m_eleLRT) && !lrtelekey.empty() && evtStore()->contains<xAOD::ElectronContainer>(lrtelekey)){
133  ATH_MSG_DEBUG("Applying prompt/LRT electron OR procedure");
134 
135  // First identify if merged container has already been made (for instances where GetElectrons() is called more than once)
136  if (evtStore()->contains<xAOD::ElectronContainer>("StdWithLRTElectrons")) {
137  ATH_MSG_DEBUG("Merged prompt/LRT container already created in TStore");
138  } else {
139  ATH_MSG_DEBUG("Creating merged prompt/LRT container in TStore");
140 
141  // Retrieve prompt and LRT electrons from TStore
143  ATH_CHECK( evtStore()->retrieve(lrt_electrons, lrtelekey) );
144 
145  // Remove LRT electrons as flagged by filter for uncertainty
146  auto filtered_electrons = std::make_unique<xAOD::ElectronContainer>();
147  std::unique_ptr<xAOD::ElectronAuxContainer> filtered_electrons_aux = std::make_unique<xAOD::ElectronAuxContainer>();
148  filtered_electrons->setStore(filtered_electrons_aux.get());
149  ATH_CHECK(prepareLRTElectrons(lrt_electrons, filtered_electrons.get()));
150 
151  // Check overlap between prompt and LRT collections
152  std::set<const xAOD::Electron *> ElectronsToRemove;
153  m_elecLRTORTool->checkOverlap(*prompt_electrons, *filtered_electrons, ElectronsToRemove);
154 
155  // Decorate electrons with prompt/LRT
156  for (const xAOD::Electron* el : *prompt_electrons) dec_isLRT(*el) = 0;
157  for (const xAOD::Electron* el : *filtered_electrons) dec_isLRT(*el) = 1;
158 
159  // Create merged StdWithLRTElectrons container
160  outputCol->reserve(prompt_electrons->size() + filtered_electrons->size());
161  ATH_CHECK(MergeElectrons(*prompt_electrons, outputCol.get(), ElectronsToRemove ));
162  ATH_CHECK(MergeElectrons(*filtered_electrons, outputCol.get(), ElectronsToRemove ));
163 
164  // Save merged StdWithLRTElectrons container to TStore
165  ATH_CHECK(evtStore()->record(std::move(outputCol), m_outElectronLocation.key()));
166  ATH_CHECK(evtStore()->record(std::move(outputAuxCol), m_outElectronLocation.key() + "Aux.") );
167  }
168  } else if (!lrtelekey.empty()) {
169  if(evtStore()->contains<xAOD::ElectronContainer>(lrtelekey) == false && bool(m_eleLRT) == true) ATH_MSG_WARNING("prompt/LRT OR procedure attempted but " << lrtelekey << " not in ROOT file, check config!");
170  ATH_MSG_DEBUG("Not applying prompt/LRT electron OR procedure");
171  }
172 
173  if (m_isPHYSLITE && elekey.find("AnalysisElectrons")==std::string::npos){
174  ATH_MSG_ERROR("You are running on PHYSLITE derivation. Please change the Electrons container to 'AnalysisElectrons'");
175  return StatusCode::FAILURE;
176  }
177 
178  const xAOD::ElectronContainer* electrons = nullptr;
179  if (bool(m_eleLRT) && evtStore()->contains<xAOD::ElectronContainer>(lrtelekey)){
180  ATH_MSG_DEBUG("Using container: " << m_outElectronLocation.key());
182  }
183  else {
184  if (copy==nullptr) { // empty container provided
185  ATH_MSG_DEBUG("Empty container provided");
186  if (containerToBeCopied != nullptr) {
187  ATH_MSG_DEBUG("Containter to be copied not nullptr");
188  electrons = containerToBeCopied;
189  }
190  else {
191  ATH_MSG_DEBUG("Getting Electrons collection");
192  ATH_CHECK( evtStore()->retrieve(electrons, elekey) );
193  }
194  }
195  }
196 
197  std::pair<xAOD::ElectronContainer*, xAOD::ShallowAuxContainer*> shallowcopy = xAOD::shallowCopyContainer(*electrons);
198  copy = shallowcopy.first;
199  copyaux = shallowcopy.second;
200  bool setLinks = xAOD::setOriginalObjectLink(*electrons, *copy);
201  if (!setLinks) {
202  ATH_MSG_WARNING("Failed to set original object links on " << elekey);
203  } else { // use the user-supplied collection instead
204  ATH_MSG_DEBUG("Not retrieving electron collection, using existing one provided by user");
205  electrons=copy;
206  }
207 
208  for (const auto& electron : *copy) {
211  }
212 
213  if (recordSG) {
214  ATH_CHECK( evtStore()->record(copy, "STCalib" + elekey + m_currentSyst.name()) );
215  ATH_CHECK( evtStore()->record(copyaux, "STCalib" + elekey + m_currentSyst.name() + "Aux.") );
216  }
217  return StatusCode::SUCCESS;
218 }
219 
220 
222 
223  ATH_MSG_VERBOSE( "Starting FillElectron on el with pre-calibration pt=" << input.pt() );
224 
225  // According to https://twiki.cern.ch/twiki/bin/view/AtlasProtected/EGammaIdentificationRun2#Electron_identification:
226  // "Please apply the identification to uncalibrated electron object. ID scale factors are to be applied to calibrated objects."
227  dec_baseline(input) = false;
228  dec_selected(input) = 0;
229  dec_signal(input) = false;
230  dec_isol(input) = false;
231  dec_isolHighPt(input) = false;
232  dec_passSignalID(input) = false;
233  dec_passChID(input) = false;
234  dec_ecisBDT(input) = -999.;
235 
236  const xAOD::EventInfo* evtInfo = nullptr;
237  ATH_CHECK( evtStore()->retrieve( evtInfo, "EventInfo" ) );
238  const xAOD::Vertex* pv = this->GetPrimVtx();
239  const xAOD::TrackParticle* track = input.trackParticle();
240  if (!track) {
241  ATH_MSG_DEBUG("No primary track particle for this electron. Skipping.");
242  return StatusCode::SUCCESS;
243  }
244  double primvertex_z = pv ? pv->z() : 0;
245  double el_z0 = track->z0() + track->vz() - primvertex_z;
246  dec_z0sinTheta(input) = el_z0 * TMath::Sin(input.p4().Theta());
247  //protect against exception thrown for null or negative d0sig
248  try{
249  dec_d0sig(input) = xAOD::TrackingHelpers::d0significance( track , evtInfo->beamPosSigmaX(), evtInfo->beamPosSigmaY(), evtInfo->beamPosSigmaXY() );
250  }
251  catch(...){
252  float d0sigError = -99.;
253  ATH_MSG_WARNING("FillElectron : Exception catched from d0significance() calculation. Setting dummy decoration d0sig=" << d0sigError );
254  dec_d0sig(input) = d0sigError;
255  }
256 
257  // don't bother calibrating or computing WP
258  if ( input.pt() < 4e3 ) return StatusCode::SUCCESS;
259  if ( !input.caloCluster() ) { ATH_MSG_WARNING( "FillElectron: no caloCluster found: " << input.caloCluster() ); return StatusCode::SUCCESS; }
260 
261  //Check DeadHVCellRemoval
262  bool pass_deadHVTool = m_deadHVTool->accept(&input);
263 
264  if (m_debug) {
265  unsigned char el_nPixHits(0), el_nSCTHits(0);
266  input.trackParticle()->summaryValue(el_nPixHits, xAOD::numberOfPixelHits);
267  input.trackParticle()->summaryValue(el_nSCTHits, xAOD::numberOfSCTHits);
268 
269  ATH_MSG_INFO( "ELECTRON eta: " << input.eta());
270  ATH_MSG_INFO( "ELECTRON phi: " << input.phi());
271  ATH_MSG_INFO( "ELECTRON cl eta: " << input.caloCluster()->eta());
272  ATH_MSG_INFO( "ELECTRON cl phi: " << input.caloCluster()->phi());
273  ATH_MSG_INFO( "ELECTRON cl e: " << input.caloCluster()->e());
274  ATH_MSG_INFO( "ELECTRON trk eta: " << input.trackParticle()->eta());
275  ATH_MSG_INFO( "ELECTRON trk phi: " << input.trackParticle()->phi());
276  ATH_MSG_INFO( "ELECTRON author: " << input.author());
277  ATH_MSG_INFO( "ELECTRON OQ: " << acc_OQ(input));
278  ATH_MSG_INFO( "ELECTRON nPixHits: " << static_cast<int>(el_nPixHits));
279  ATH_MSG_INFO( "ELECTRON nSCTHits: " << static_cast<int>(el_nSCTHits));
280  ATH_MSG_INFO( "ELECTRON deadHVTools: " << static_cast<bool>(pass_deadHVTool));
281  }
282 
283  if (!pass_deadHVTool) return StatusCode::SUCCESS;
284  if (!input.isGoodOQ(xAOD::EgammaParameters::BADCLUSELECTRON)) return StatusCode::SUCCESS;
285 
287  ATH_MSG_ERROR("No baseline electron selector defined!");
288  return StatusCode::FAILURE;
289  }
290 
291  bool passBaseID = false;
292  if (m_eleIdExpert) {
293  passBaseID = bool(m_elecSelLikelihoodBaseline->accept(&input));
294  } else {
296  passBaseID = m_acc_eleIdBaseline(input);
297  } else {
298  ATH_MSG_VERBOSE ("DFCommonElectronsLHxxx variables are not found. Calculating the ID from LH tool..");
299  passBaseID = bool(m_elecSelLikelihoodBaseline->accept(&input));
300  }
301  }
302 
303  if ( !passBaseID && !m_force_noElId ) return StatusCode::SUCCESS;
304 
305  //baseline ID decoration for TauEl OR
306  //dec_passBaseID(input) = true;
307 
308  // calibrate the electron 4-vector here only if within eta window
309  if (std::abs(input.caloCluster()->etaBE(2)) >= etacut) return StatusCode::SUCCESS;
310 
312  if ( std::abs( input.caloCluster()->etaBE(2) ) >1.37 && std::abs( input.caloCluster()->etaBE(2) ) <1.52) {
313  return StatusCode::SUCCESS;
314  }
315  }
316 
317  // corrections described in https://twiki.cern.ch/twiki/bin/view/AtlasProtected/EGammaCalibrationRun2
319  ATH_MSG_ERROR( "FillElectron: EgammaCalibTool applyCorrection failed ");
320 
322  ATH_MSG_ERROR("FillElectron: IsolationCorrectionTool applyCorrection failed");
323 
324  ATH_MSG_VERBOSE( "FillElectron: post-calibration pt=" << input.pt() );
325 
326  if (input.pt() < etcut) return StatusCode::SUCCESS;
327 
328  if (m_elebaselinez0>0. && std::abs(acc_z0sinTheta(input))>m_elebaselinez0) return StatusCode::SUCCESS;
329  if (m_elebaselined0sig>0. && std::abs(acc_d0sig(input))>m_elebaselined0sig) return StatusCode::SUCCESS;
330 
331  //--- Do baseline isolation check
332  if ( !( m_eleBaselineIso_WP.empty() ) && !( m_isoBaselineTool->accept(input) ) ) return StatusCode::SUCCESS;
333 
334  dec_baseline(input) = true;
335  dec_selected(input) = 2;
336  //disable if (!m_eleIso_WP.empty() && m_eleIso_WP.find("PLV")!=std::string::npos) ATH_CHECK( ->augmentPLV(input) );
337  if (!m_eleIso_WP.empty()) dec_isol(input) = bool(m_isoTool->accept(input));
338  if (!m_eleIsoHighPt_WP.empty()) dec_isolHighPt(input) = bool(m_isoHighPtTool->accept(input));
339 
340  //ChargeIDSelector
341  if( m_runECIS ){
342  if (acc_passECIDS.isAvailable(input)) {
343  dec_passChID(input) = acc_passECIDS(input); // Loose 97% WP!
344  } else {
345  dec_passChID(input) = bool(m_elecChargeIDSelectorTool->accept(&input));
346  //disable double bdt = m_elecChargeIDSelectorTool->calculate(&input).getResult("bdt");
347  //disable dec_ecisBDT(input) = bdt;
348  }
349  }
350  else{
351  dec_passChID(input) = true;
352  }
353 
354  ATH_MSG_VERBOSE( "FillElectron: passed baseline selection" );
355 
356  return StatusCode::SUCCESS;
357 }
358 
359 
360 bool SUSYObjDef_xAOD::IsSignalElectron(const xAOD::Electron & input, float etcut, float d0sigcut, float z0cut, float etacut) const
361 {
362  if (!acc_baseline(input)) return false;
363 
364  dec_passSignalID(input) = false;
365 
366  if (m_eleIdExpert) {
367  if ( !m_elecSelLikelihood.empty() && m_elecSelLikelihood->accept(&input) ) dec_passSignalID(input) = true;
368  }
369  else {
371  dec_passSignalID(input) = m_acc_eleId(input);
372  } else {
373  ATH_MSG_VERBOSE ("DFCommonElectronsLHxxx variables are not found. Calculating the ID from LH tool..");
374  if ( !m_elecSelLikelihood.empty() && m_elecSelLikelihood->accept(&input) ) dec_passSignalID(input) = true;
375  }
376  }
377 
378  //overwrite ID selection if forced by user
379  if(m_force_noElId) dec_passSignalID(input) = true;
380 
381  if (!acc_passSignalID(input)) return false;
382 
383  if (input.p4().Perp2() <= etcut * etcut || input.p4().Perp2() == 0) return false; // eT cut (might be necessary for leading electron to pass trigger)
384  if ( etacut==DUMMYDEF ){
385  if(std::abs(input.caloCluster()->etaBE(2)) > m_eleEta ) return false;
386  }
387  else if ( std::abs(input.caloCluster()->etaBE(2)) > etacut ) return false;
388 
389  if (m_eleCrackVeto){
390  if ( std::abs( input.caloCluster()->etaBE(2) ) >1.37 && std::abs( input.caloCluster()->etaBE(2) ) <1.52) {
391  return false;
392  }
393  }
394 
395  if (acc_d0sig(input) != 0) {
396  if (d0sigcut > 0.0 && std::abs(acc_d0sig(input)) > d0sigcut) return false; // transverse IP cut
397  }
398 
399  if (z0cut > 0.0 && std::abs(acc_z0sinTheta(input)) > z0cut) return false; // longitudinal IP cut
400 
401 
402  ATH_MSG_VERBOSE( "IsSignalElectron: " << m_eleId << " " << acc_passSignalID(input) << " d0sig " << acc_d0sig(input) << " z0 sin(theta) " << acc_z0sinTheta(input) );
403 
404  if (m_doElIsoSignal) {
405  if ( !( (acc_isol(input) && input.pt()<m_eleIsoHighPtThresh) || (acc_isolHighPt(input) && input.pt()>m_eleIsoHighPtThresh)) ) return false;
406  ATH_MSG_VERBOSE( "IsSignalElectron: passed isolation" );
407  }
408 
409  if(m_eleChID_signal && !acc_passChID(input)) return false; //add charge flip check to signal definition
410 
411  dec_signal(input) = true;
412 
413  ATH_MSG_VERBOSE( "IsSignalElectron: passed selection" );
414  return true;
415 }
416 
417 
419  const bool recoSF,
420  const bool idSF,
421  const bool triggerSF,
422  const bool isoSF,
423  const std::string& trigExpr,
424  const bool ecidsSF,
425  const bool cidSF ) {
426 
427  if ((m_eleId == "VeryLooseLLH" || m_eleId == "LooseLLH" || m_eleId == "Loose" || m_eleId == "Medium" || m_eleId == "Tight") && (idSF || triggerSF || isoSF)) {
428  ATH_MSG_ERROR("No signal electron ID or trigger scale factors provided for the selected working point!");
429  ATH_MSG_ERROR("I will now die messily.");
430  }
431 
432  //shortcut keys for trigger SF config
433  std::string singleLepStr = "singleLepton";
434  std::string diLepStr = "diLepton";
435  std::string multiLepStr = "multiLepton";
436 
437  float sf(1.);
438 
439  if (recoSF) {
440  double reco_sf(1.);
441 
443  switch (result) {
445  sf *= reco_sf;
446  break;
448  ATH_MSG_ERROR( "Failed to retrieve signal electron reco SF");
449  break;
451  ATH_MSG_VERBOSE( "OutOfValidityRange found for signal electron reco SF");
452  break;
453  default:
454  ATH_MSG_WARNING( "Don't know what to do for signal electron reco SF");
455  }
456  }
457 
458  if (idSF) {
459  double id_sf(1.);
460 
462  switch (result) {
464  sf *= id_sf;
465  break;
467  ATH_MSG_ERROR( "Failed to retrieve signal electron id SF");
468  break;
470  ATH_MSG_VERBOSE( "OutOfValidityRange found for signal electron id SF");
471  break;
472  default:
473  ATH_MSG_WARNING( "Don't know what to do for signal electron id SF");
474  }
475  }
476 
477  if (triggerSF) {
478 
479  std::vector<std::string> trigMChains={};
480  std::string theExpr ("");
481  if(trigExpr==singleLepStr) {
482  if (this->treatAsYear()==2015) trigMChains = m_v_trigs15_cache_singleEle;
483  else if (this->treatAsYear()==2016) trigMChains = m_v_trigs16_cache_singleEle;
484  else if (this->treatAsYear()==2017) trigMChains = m_v_trigs17_cache_singleEle;
485  else if (this->treatAsYear()==2018) trigMChains = m_v_trigs18_cache_singleEle;
486  else trigMChains = m_v_trigs22_cache_singleEle;
488  }
489  else{
490  ATH_MSG_WARNING( "Only single lepton trigger SFs are supported in GetSignalElecSF(). Use GetTriggerGlobalEfficiencySF() for dilepton or multilepton triggers!");
491  }
492 
493  //check matching
494  this->TrigMatch({&el}, trigMChains);
495 
496  if(!acc_trigmatched(el)){
497  ATH_MSG_DEBUG( "Electron was not matched to trigger " << theExpr << " - scale factor does not apply (year " << this->treatAsYear() << ") Returning 1." );
498  }
499  else{ //is trig-matched electron, go for it!
500  if (trigExpr==multiLepStr || trigExpr==diLepStr) {
501  ATH_MSG_WARNING( "The dilepton or multilepton trigger SFs are not supported in GetSignalElecSF(). Use GetTriggerGlobalEfficiencySF()!");
502  }
503  else {
504  double trig_sf = GetEleTriggerEfficiencySF( el , theExpr );
505  sf *= trig_sf;
506  }
507  }
508  }
509 
510  if (isoSF) {
511  double iso_sf(1.);
513  if (acc_isolHighPt(el) && el.pt()>m_eleIsoHighPtThresh)
515  else
517 
518  switch (result) {
520  sf *= iso_sf;
521  break;
523  ATH_MSG_ERROR( "Failed to retrieve signal electron iso SF");
524  break;
526  ATH_MSG_VERBOSE( "OutOfValidityRange found for signal electron iso SF");
527  break;
528  default:
529  ATH_MSG_WARNING( "Don't know what to do for signal electron iso SF");
530  }
531  }
532 
533  // Charge flip SF: combined ECIDs & charge ID
534  if ( ecidsSF || cidSF ) {
535  double chf_sf(1.);
536  // 1. ECIDs SF
537  if ( ecidsSF ) {
538  sf *= chf_sf;
539  ATH_MSG_WARNING( "ECID SF ARE NOT YET SUPPORTED IN R22" );
540  }
541  // 2. CID SF
542  if ( cidSF ) {
543  sf *= chf_sf;
544  dec_sfChIDEff(el) = chf_sf;
545  ATH_MSG_WARNING( "CID SF ARE NOT YET SUPPORTED IN R22" );
546  }
547  }
548 
549  dec_effscalefact(el) = sf;
550  return sf;
551 }
552 
553 
554 double SUSYObjDef_xAOD::GetEleTriggerEfficiencySF(const xAOD::Electron& el, const std::string& trigExpr) const {
555 
556  double trig_sf(1.);
557 
558  std::string single_str = "SINGLE_E";
559  std::string single_str_2022 = "2022_";
560  std::string dilep_str = "DI_E";
561  std::string multi_str = "MULTI_L";
562 
564  if ( trigExpr.find(single_str) != std::string::npos || trigExpr.find(single_str_2022) != std::string::npos)
566  else if ( trigExpr.find(dilep_str) != std::string::npos )
567  ATH_MSG_ERROR( "Use GetTriggerGlobalEfficiency for logical OR of lepton triggers");
568  else if ( trigExpr.find(multi_str) != std::string::npos )
569  ATH_MSG_ERROR( "Use GetTriggerGlobalEfficiency for logical OR of lepton triggers");
570  else
571  ATH_MSG_ERROR( "The trigger expression (" << trigExpr << ") is not supported by the electron trigger SF!");
572 
573  switch (result) {
575  ATH_MSG_ERROR( "Failed to retrieve signal electron trigger SF");
576  return 1.;
578  ATH_MSG_VERBOSE( "OutOfValidityRange found for signal electron trigger SF");
579  return 1.;
580  default:
581  break;
582  }
583 
584  return trig_sf;
585 }
586 
587 
588 double SUSYObjDef_xAOD::GetEleTriggerEfficiency(const xAOD::Electron& el, const std::string& trigExpr) const {
589 
590  std::string single_str = "SINGLE_E";
591  std::string single_str_2022 = "2022_";
592  std::string dilep_str = "DI_E";
593  std::string multi_str = "MULTI_L";
594 
595  double trig_eff(1.);
596 
598  if ( trigExpr.find(single_str) != std::string::npos || trigExpr.find(single_str_2022) != std::string::npos)
600  else if ( trigExpr.find(dilep_str) != std::string::npos )
601  ATH_MSG_ERROR( "Use GetTriggerGlobalEfficiency for logical OR of lepton triggers");
602  else if ( trigExpr.find(multi_str) != std::string::npos )
603  ATH_MSG_ERROR( "Use GetTriggerGlobalEfficiency for logical OR of lepton triggers");
604  else
605  ATH_MSG_ERROR( "The trigger expression (" << trigExpr << ") is not supported by the electron trigger efficiency!");
606 
607  switch (result) {
609  ATH_MSG_ERROR( "Failed to retrieve signal electron trigger efficiency");
610  return 1.;
612  ATH_MSG_VERBOSE( "OutOfValidityRange found for signal electron trigger efficiency");
613  return 1.;
614  default:
615  break;
616  }
617 
618  return trig_eff;
619 }
620 
621 
622 
623  float SUSYObjDef_xAOD::GetTotalElectronSF(const xAOD::ElectronContainer& electrons, const bool recoSF, const bool idSF, const bool triggerSF, const bool isoSF, const std::string& trigExpr, const bool ecidsSF, const bool cidSF) {
624  float sf(1.);
625 
626  for (const xAOD::Electron* electron : electrons) {
627  if (!acc_passOR(*electron)) continue;
628  if (acc_signal(*electron)) { sf *= this->GetSignalElecSF(*electron, recoSF, idSF, triggerSF, isoSF, trigExpr, ecidsSF, cidSF); }
629  else { this->GetSignalElecSF(*electron, recoSF, idSF, triggerSF, isoSF, trigExpr, ecidsSF, cidSF); }
630  }
631 
632  return sf;
633 }
634 
635 
636  float SUSYObjDef_xAOD::GetTotalElectronSFsys(const xAOD::ElectronContainer& electrons, const CP::SystematicSet& systConfig, const bool recoSF, const bool idSF, const bool triggerSF, const bool isoSF, const std::string& trigExpr, const bool ecidsSF, const bool cidSF) {
637  float sf(1.);
638 
639  //Set the new systematic variation
641  if (ret != StatusCode::SUCCESS) {
642  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (reco) for systematic var. " << systConfig.name() );
643  }
644 
646  if (ret != StatusCode::SUCCESS) {
647  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (id) for systematic var. " << systConfig.name() );
648  }
649 
651  if (ret != StatusCode::SUCCESS) {
652  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (trigger) for systematic var. " << systConfig.name() );
653  }
654 
656  if (ret != StatusCode::SUCCESS) {
657  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (iso) for systematic var. " << systConfig.name() );
658  }
659 
661  if (ret != StatusCode::SUCCESS) {
662  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (iso high-pt) for systematic var. " << systConfig.name() );
663  }
664 
666  if (ret != StatusCode::SUCCESS) {
667  ATH_MSG_ERROR("Cannot configure ElectronChargeEfficiencyCorrectionTool for systematic var. " << systConfig.name() );
668  }
669 
670 
671  //Get the total SF for new config
672  sf = GetTotalElectronSF(electrons, recoSF, idSF, triggerSF, isoSF, trigExpr, ecidsSF, cidSF);
673 
674  //Roll back to default
676  if (ret != StatusCode::SUCCESS) {
677  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (reco) back to default.");
678  }
679 
681  if (ret != StatusCode::SUCCESS) {
682  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (id) back to default.");
683  }
684 
686  if (ret != StatusCode::SUCCESS) {
687  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (trigger) back to default.");
688  }
689 
691  if (ret != StatusCode::SUCCESS) {
692  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (iso) back to default.");
693  }
694 
696  if (ret != StatusCode::SUCCESS) {
697  ATH_MSG_ERROR("Cannot configure AsgElectronEfficiencyCorrectionTool (iso high-pt) back to default.");
698  }
699 
701  if (ret != StatusCode::SUCCESS) {
702  ATH_MSG_ERROR("Cannot configure ElectronChargeEfficiencyCorrectionTool back to default.");
703  }
704 
705  return sf;
706 }
707 
708 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
ST::SUSYObjDef_xAOD::m_isoHighPtTool
asg::AnaToolHandle< CP::IIsolationSelectionTool > m_isoHighPtTool
Definition: SUSYObjDef_xAOD.h:962
ST::SUSYObjDef_xAOD::m_outElectronLocation
SG::WriteHandleKey< xAOD::ElectronContainer > m_outElectronLocation
Definition: SUSYObjDef_xAOD.h:883
ST::SUSYObjDef_xAOD::MergeElectrons
StatusCode MergeElectrons(const xAOD::ElectronContainer &electrons, xAOD::ElectronContainer *outputCol, const std::set< const xAOD::Electron * > &ElectronsToRemove) const override final
Definition: Electrons.cxx:61
ST::SUSYObjDef_xAOD::m_deadHVTool
asg::AnaToolHandle< IAsgDeadHVCellRemovalTool > m_deadHVTool
Definition: SUSYObjDef_xAOD.h:891
ST::SUSYObjDef_xAOD::m_eleIdExpert
bool m_eleIdExpert
Definition: SUSYObjDef_xAOD.h:642
ST::SUSYObjDef_xAOD::GetEleTriggerEfficiencySF
double GetEleTriggerEfficiencySF(const xAOD::Electron &el, const std::string &trigExpr="SINGLE_E_2015_e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose_2016_2018_e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0") const override final
Definition: Electrons.cxx:554
xAOD::Electron
Electron_v1 Electron
Definition of the current "egamma version".
Definition: Event/xAOD/xAODEgamma/xAODEgamma/Electron.h:17
get_generator_info.result
result
Definition: get_generator_info.py:21
ST::SUSYObjDef_xAOD::IsSignalElectron
bool IsSignalElectron(const xAOD::Electron &input, const float etcut, const float d0sigcut, const float z0cut, const float etacut=DUMMYDEF) const override final
Definition: Electrons.cxx:360
ST::SUSYObjDef_xAOD::m_elecChargeEffCorrTool
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecChargeEffCorrTool
Definition: SUSYObjDef_xAOD.h:903
ST::SUSYObjDef_xAOD::m_acc_eleId
SG::ConstAccessor< char > m_acc_eleId
Definition: SUSYObjDef_xAOD.h:982
TrackParticlexAODHelpers.h
ST::SUSYObjDef_xAOD::m_eleIsoHighPt_WP
std::string m_eleIsoHighPt_WP
Definition: SUSYObjDef_xAOD.h:650
ST::SUSYObjDef_xAOD::m_egammaCalibTool
asg::AnaToolHandle< CP::IEgammaCalibrationAndSmearingTool > m_egammaCalibTool
Combined electron collection.
Definition: SUSYObjDef_xAOD.h:886
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ST::SUSYObjDef_xAOD::m_acc_eleIdBaseline
SG::ConstAccessor< char > m_acc_eleIdBaseline
Definition: SUSYObjDef_xAOD.h:981
ST::SUSYObjDef_xAOD::prompt_electrons
const xAOD::ElectronContainer * prompt_electrons
Definition: SUSYObjDef_xAOD.h:210
CP::IIsolationCorrectionTool::applyCorrection
virtual CP::CorrectionCode applyCorrection(xAOD::Egamma &)=0
IAsgPhotonIsEMSelector.h
IAsgDeadHVCellRemovalTool::accept
virtual bool accept(const xAOD::Egamma *part) const =0
ST::SUSYObjDef_xAOD::GetTotalElectronSFsys
float GetTotalElectronSFsys(const xAOD::ElectronContainer &electrons, const CP::SystematicSet &systConfig, const bool recoSF=true, const bool idSF=true, const bool triggerSF=true, const bool isoSF=true, const std::string &trigExpr="singleLepton", const bool ecidsSF=false, const bool cidSF=false) override final
Definition: Electrons.cxx:636
ST::SUSYObjDef_xAOD::m_elecEfficiencySFTool_reco
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_reco
Combined muon collection.
Definition: SUSYObjDef_xAOD.h:870
IAsgElectronEfficiencyCorrectionTool.h
ST::SUSYObjDef_xAOD::m_elecSelLikelihood
asg::AnaToolHandle< IAsgElectronLikelihoodTool > m_elecSelLikelihood
Definition: SUSYObjDef_xAOD.h:887
ITrigGlobalEfficiencyCorrectionTool.h
ConstDataVector.h
DataVector adapter that acts like it holds const pointers.
ST
Definition: Electrons.cxx:41
ST::SUSYObjDef_xAOD::m_doElIsoSignal
bool m_doElIsoSignal
Definition: SUSYObjDef_xAOD.h:785
ST::SUSYObjDef_xAOD::m_isoBaselineTool
asg::AnaToolHandle< CP::IIsolationSelectionTool > m_isoBaselineTool
Definition: SUSYObjDef_xAOD.h:961
ST::SUSYObjDef_xAOD::m_v_trigs17_cache_singleEle
std::vector< std::string > m_v_trigs17_cache_singleEle
Definition: SUSYObjDef_xAOD.h:454
xAOD::TrackingHelpers::d0significance
double d0significance(const xAOD::TrackParticle *tp, double d0_uncert_beam_spot_2)
Definition: TrackParticlexAODHelpers.cxx:42
xAOD::ShallowAuxContainer
Class creating a shallow copy of an existing auxiliary container.
Definition: ShallowAuxContainer.h:54
ST::SUSYObjDef_xAOD::FillElectron
StatusCode FillElectron(xAOD::Electron &input, const float etcut, const float etacut) override final
Definition: Electrons.cxx:221
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
ST::SUSYObjDef_xAOD::GetTotalElectronSF
float GetTotalElectronSF(const xAOD::ElectronContainer &electrons, const bool recoSF=true, const bool idSF=true, const bool triggerSF=true, const bool isoSF=true, const std::string &trigExpr="singleLepton", const bool ecidsSF=false, const bool cidSF=false) override final
Definition: Electrons.cxx:623
ST::SUSYObjDef_xAOD::m_elePt
double m_elePt
Definition: SUSYObjDef_xAOD.h:683
ST::SUSYObjDef_xAOD::prepareLRTElectrons
StatusCode prepareLRTElectrons(const xAOD::ElectronContainer *inMuons, xAOD::ElectronContainer *copy) const override final
Definition: Electrons.cxx:90
DataVector::get
const T * get(size_type n) const
Access an element, as an rvalue.
CP::SystematicSet::name
std::string name() const
returns: the systematics joined into a single string.
Definition: SystematicSet.cxx:278
ST::SUSYObjDef_xAOD::GetSignalElecSF
float GetSignalElecSF(const xAOD::Electron &el, const bool recoSF=true, const bool idSF=true, const bool triggerSF=true, const bool isoSF=true, const std::string &trigExpr="singleLepton", const bool ecidsSF=false, const bool cidSF=false) override final
Definition: Electrons.cxx:418
xAOD::EventInfo_v1::beamPosSigmaX
float beamPosSigmaX() const
The width of the beam spot in the X direction.
ST::SUSYObjDef_xAOD::m_force_noElId
bool m_force_noElId
Definition: SUSYObjDef_xAOD.h:518
SUSYObjDef_xAOD.h
xAOD::numberOfPixelHits
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:259
CP::IIsolationSelectionTool::accept
virtual asg::AcceptData accept(const xAOD::Photon &x) const =0
Declare the interface that the class provides.
ST::SUSYObjDef_xAOD::m_v_trigs18_cache_singleEle
std::vector< std::string > m_v_trigs18_cache_singleEle
Definition: SUSYObjDef_xAOD.h:455
xAOD::EgammaParameters::BADCLUSELECTRON
const uint32_t BADCLUSELECTRON
Definition: EgammaDefs.h:116
CP::IEgammaCalibrationAndSmearingTool::applyCorrection
virtual CP::CorrectionCode applyCorrection(xAOD::Egamma &) const =0
SG::ConstAccessor< char >
ST::SUSYObjDef_xAOD::GetPrimVtx
const xAOD::Vertex * GetPrimVtx() const override final
Definition: SUSYObjDef_xAOD.cxx:2877
ST::SUSYObjDef_xAOD::m_eled0sig
double m_eled0sig
Definition: SUSYObjDef_xAOD.h:686
ST::SUSYObjDef_xAOD::m_v_trigs22_cache_singleEle
std::vector< std::string > m_v_trigs22_cache_singleEle
Definition: SUSYObjDef_xAOD.h:456
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
ST::SUSYObjDef_xAOD::m_elebaselined0sig
double m_elebaselined0sig
Definition: SUSYObjDef_xAOD.h:688
ST::SUSYObjDef_xAOD::m_debug
bool m_debug
Definition: SUSYObjDef_xAOD.h:533
ST::SUSYObjDef_xAOD::m_elecLRTORTool
asg::AnaToolHandle< CP::IElectronLRTOverlapRemovalTool > m_elecLRTORTool
Definition: SUSYObjDef_xAOD.h:882
ST::SUSYObjDef_xAOD::m_tool_init
bool m_tool_init
Definition: SUSYObjDef_xAOD.h:558
ST::SUSYObjDef_xAOD::m_v_trigs15_cache_singleEle
std::vector< std::string > m_v_trigs15_cache_singleEle
Definition: SUSYObjDef_xAOD.h:452
IEGammaAmbiguityTool.h
ST::SUSYObjDef_xAOD::m_elecEfficiencySFTool_isoHighPt
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_isoHighPt
Definition: SUSYObjDef_xAOD.h:875
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
ST::SUSYObjDef_xAOD::m_isPHYSLITE
bool m_isPHYSLITE
Definition: SUSYObjDef_xAOD.h:796
IEgammaCalibrationAndSmearingTool.h
CP::CorrectionCode::OutOfValidityRange
@ OutOfValidityRange
Input object is out of validity range.
Definition: CorrectionCode.h:37
CP::CorrectionCode::Error
@ Error
Some error happened during the object correction.
Definition: CorrectionCode.h:36
IAsgElectronLikelihoodTool.h
IIsolationCorrectionTool.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ST::SUSYObjDef_xAOD::m_elecEfficiencySFTool_id
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_id
Definition: SUSYObjDef_xAOD.h:871
CheckAppliedSFs.e3
e3
Definition: CheckAppliedSFs.py:264
ST::SUSYObjDef_xAOD::m_elez0
double m_elez0
Definition: SUSYObjDef_xAOD.h:687
ST::SUSYObjDef_xAOD::lrt_electrons
const xAOD::ElectronContainer * lrt_electrons
Definition: SUSYObjDef_xAOD.h:211
SG::Decorator< char >
ElectronAuxContainer.h
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
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
plotIsoValidation.el
el
Definition: plotIsoValidation.py:197
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
ST::SUSYObjDef_xAOD::m_eleChID_signal
bool m_eleChID_signal
Definition: SUSYObjDef_xAOD.h:656
ST::SUSYObjDef_xAOD::m_runECIS
bool m_runECIS
Definition: SUSYObjDef_xAOD.h:657
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
IElectronLRTOverlapRemovalTool.h
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
IAsgDeadHVCellRemovalTool.h
ST::SUSYObjDef_xAOD::m_elecEfficiencySFTool_trigEff_singleLep
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_trigEff_singleLep
Definition: SUSYObjDef_xAOD.h:873
ST::SUSYObjDef_xAOD::m_eleId
std::string m_eleId
Definition: SUSYObjDef_xAOD.h:637
CP::IElectronLRTOverlapRemovalTool::checkOverlap
virtual void checkOverlap(const xAOD::ElectronContainer &promptCollection, const xAOD::ElectronContainer &lrtCollection, std::set< const xAOD::Electron * > &ElectronsToRemove) const =0
Check the overlap between the prompt and LRT electron collections.
ST::SUSYObjDef_xAOD::m_eleIso_WP
std::string m_eleIso_WP
Definition: SUSYObjDef_xAOD.h:649
IAsgElectronEfficiencyCorrectionTool::getEfficiencyScaleFactor
virtual CP::CorrectionCode getEfficiencyScaleFactor(const xAOD::Electron &inputObject, double &efficiencyScaleFactor) const =0
ST::SUSYObjDef_xAOD::m_elecEfficiencySFTool_iso
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_iso
Definition: SUSYObjDef_xAOD.h:874
xAOD::EventInfo_v1::beamPosSigmaY
float beamPosSigmaY() const
The width of the beam spot in the Y direction.
ST::SUSYObjDef_xAOD::m_eleLRT
bool m_eleLRT
Definition: SUSYObjDef_xAOD.h:653
ST::SUSYObjDef_xAOD::m_elecSelLikelihoodBaseline
asg::AnaToolHandle< IAsgElectronLikelihoodTool > m_elecSelLikelihoodBaseline
Definition: SUSYObjDef_xAOD.h:888
ST::SUSYObjDef_xAOD::GetEleTriggerEfficiency
double GetEleTriggerEfficiency(const xAOD::Electron &el, const std::string &trigExpr="SINGLE_E_2015_e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose_2016_2018_e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0") const override final
Definition: Electrons.cxx:588
ST::SUSYObjDef_xAOD::TrigMatch
void TrigMatch(const xAOD::IParticle *p, std::initializer_list< std::string >::iterator, std::initializer_list< std::string >::iterator) override final
Definition: Trigger.cxx:240
IIsolationSelectionTool.h
ST::SUSYObjDef_xAOD::m_elecEfficiencySFTool_trig_singleLep
asg::AnaToolHandle< IAsgElectronEfficiencyCorrectionTool > m_elecEfficiencySFTool_trig_singleLep
Definition: SUSYObjDef_xAOD.h:872
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
xAOD::Electron_v1
Definition: Electron_v1.h:34
xAOD::shallowCopyContainer
std::pair< std::unique_ptr< T >, std::unique_ptr< ShallowAuxContainer > > shallowCopyContainer(const T &cont, [[maybe_unused]] const EventContext &ctx)
Function making a shallow copy of a constant container.
Definition: ShallowCopy.h:110
EventInfo.h
ST::SUSYObjDef_xAOD::m_elebaselinez0
double m_elebaselinez0
Definition: SUSYObjDef_xAOD.h:689
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
AthAnalysisHelper.h
ST::SUSYObjDef_xAOD::m_eleCrackVeto
bool m_eleCrackVeto
Definition: SUSYObjDef_xAOD.h:685
IAsgElectronIsEMSelector.h
CP::CorrectionCode::Ok
@ Ok
The correction was done successfully.
Definition: CorrectionCode.h:38
ST::SUSYObjDef_xAOD::m_elecChargeIDSelectorTool
asg::AnaToolHandle< IAsgElectronLikelihoodTool > m_elecChargeIDSelectorTool
Definition: SUSYObjDef_xAOD.h:902
xAOD::EventInfo_v1::beamPosSigmaXY
float beamPosSigmaXY() const
The beam spot shape's X-Y correlation.
ST::SUSYObjDef_xAOD::m_eleBaselineIso_WP
std::string m_eleBaselineIso_WP
Definition: SUSYObjDef_xAOD.h:641
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
mapkey::sf
@ sf
Definition: TElectronEfficiencyCorrectionTool.cxx:38
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::setOriginalObjectLink
bool setOriginalObjectLink(const IParticle &original, IParticle &copy)
This function should be used by CP tools when they make a deep copy of an object in their correctedCo...
Definition: IParticleHelpers.cxx:30
ST::SUSYObjDef_xAOD::m_eleEta
double m_eleEta
Definition: SUSYObjDef_xAOD.h:684
CP::CorrectionCode
Return value from object correction CP tools.
Definition: CorrectionCode.h:31
ST::SUSYObjDef_xAOD::m_currentSyst
CP::SystematicSet m_currentSyst
Definition: SUSYObjDef_xAOD.h:808
xAOD::EgammaParameters::electron
@ electron
Definition: EgammaEnums.h:18
python.changerun.pv
pv
Definition: changerun.py:81
ST::SUSYObjDef_xAOD::m_electronTriggerSFStringSingle
std::string m_electronTriggerSFStringSingle
Definition: SUSYObjDef_xAOD.h:633
xAOD::numberOfSCTHits
@ numberOfSCTHits
number of hits in SCT [unit8_t].
Definition: TrackingPrimitives.h:268
ST::SUSYObjDef_xAOD::m_eleBaselinePt
double m_eleBaselinePt
Definition: SUSYObjDef_xAOD.h:680
SG::ConstAccessor::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
IParticleHelpers.h
xAOD::track
@ track
Definition: TrackingPrimitives.h:512
calibdata.copy
bool copy
Definition: calibdata.py:27
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
xAOD::getOriginalObject
const IParticle * getOriginalObject(const IParticle &copy)
This function can be used to conveniently get a pointer back to the original object from which a copy...
Definition: IParticleHelpers.cxx:140
IAsgElectronLikelihoodTool::accept
virtual asg::AcceptData accept(const xAOD::IParticle *part) const =0
accept with pointer to IParticle so as to not hide the IAsgSelectionTool one
ST::SUSYObjDef_xAOD::m_eleBaselineCrackVeto
bool m_eleBaselineCrackVeto
Definition: SUSYObjDef_xAOD.h:682
ST::SUSYObjDef_xAOD::GetElectrons
StatusCode GetElectrons(xAOD::ElectronContainer *&copy, xAOD::ShallowAuxContainer *&copyaux, const bool recordSG=true, const std::string &elekey="Electrons", const std::string &lrtelekey="LRTElectrons", const xAOD::ElectronContainer *containerToBeCopied=nullptr) override final
Definition: Electrons.cxx:118
ST::SUSYObjDef_xAOD::treatAsYear
int treatAsYear(const int runNumber=-1) const override final
Definition: SUSYObjDef_xAOD.cxx:3071
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
CP::ISystematicsTool::applySystematicVariation
virtual StatusCode applySystematicVariation(const SystematicSet &systConfig)=0
effects: configure this tool for the given list of systematic variations.
asg::AnaToolHandle::empty
bool empty() const
whether this ToolHandle is completely empty, i.e.
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
ST::SUSYObjDef_xAOD::m_isoCorrTool
asg::AnaToolHandle< CP::IIsolationCorrectionTool > m_isoCorrTool
Definition: SUSYObjDef_xAOD.h:958
ST::SUSYObjDef_xAOD::m_v_trigs16_cache_singleEle
std::vector< std::string > m_v_trigs16_cache_singleEle
Definition: SUSYObjDef_xAOD.h:453
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
IEfficiencyScaleFactorTool.h
ST::SUSYObjDef_xAOD::m_eleBaselineEta
double m_eleBaselineEta
Definition: SUSYObjDef_xAOD.h:681
ST::SUSYObjDef_xAOD::m_eleIsoHighPtThresh
double m_eleIsoHighPtThresh
Definition: SUSYObjDef_xAOD.h:651
ST::SUSYObjDef_xAOD::m_isoTool
asg::AnaToolHandle< CP::IIsolationSelectionTool > m_isoTool
Definition: SUSYObjDef_xAOD.h:959