ATLAS Offline Software
OverlapRemovalGenUseAlg.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 // EDM includes
6 
7 // Local includes
12 
13 namespace
14 {
16  const float GeV = 1000.;
17  const float invGeV = 1./GeV;
18 }
19 
20 //-----------------------------------------------------------------------------
21 // Constructor
22 //-----------------------------------------------------------------------------
24  ISvcLocator* svcLoc)
25  : EL::AnaAlgorithm(name, svcLoc) { }
26 
27 
28 //-----------------------------------------------------------------------------
29 // Initialize
30 //-----------------------------------------------------------------------------
32 {
33  ATH_MSG_INFO("Initialize");
34 
35  // Try to retrieve the tool
36  ATH_CHECK( m_orTool.retrieve() );
37 
38  if (!m_bJetLabel.empty()){
39  m_jetKey.declareDependency(m_bJetLabel);
40  }
41  if (!m_electronLabel.empty()){
42  m_electronKey.declareDependency(m_electronLabel);
43  }
44  if (!m_photonLabel.empty()){
45  m_photonKey.declareDependency(m_photonLabel);
46  }
47  if (!m_muonLabel.empty()){
48  m_muonKey.declareDependency(m_muonLabel);
49  }
50  if (!m_tauLabel.empty()){
51  m_tauKey.declareDependency(m_tauLabel);
52  }
53 
54  m_jetKey.declareOutput(m_overlapLabel);
55  m_electronKey.declareOutput(m_overlapLabel);
56  m_photonKey.declareOutput(m_overlapLabel);
57  m_muonKey.declareOutput(m_overlapLabel);
58  m_tauKey.declareOutput(m_overlapLabel);
59  ATH_CHECK(m_jetKey.initialize());
60  ATH_CHECK(m_electronKey.initialize());
61  ATH_CHECK(m_muonKey.initialize());
62  ATH_CHECK(m_vtxKey.initialize());
63  ATH_CHECK(m_photonKey.initialize(m_photonKey.empty()));
64  ATH_CHECK(m_tauKey.initialize(m_tauKey.empty()));
65 
66  return StatusCode::SUCCESS;
67 }
68 
69 //-----------------------------------------------------------------------------
70 // Execute
71 //-----------------------------------------------------------------------------
73 {
74  const EventContext& ctx = Gaudi::Hive::currentContext();
75  // Electrons
77  if (!electrons.isValid()) {
78  ATH_MSG_FATAL("Failed to retrieve electron container "<<m_electronKey.key());
79  return StatusCode::FAILURE;
80  }
82  // Muons
84  if (!muons.isValid()) {
85  ATH_MSG_FATAL("Failed to retrieve muon container "<<m_muonKey.key());
86  return StatusCode::FAILURE;
87  }
88  applySelection(*muons);
89  // Jets
91  if (!jets.isValid()) {
92  ATH_MSG_FATAL("Failed to retrieve jet container "<<m_jetKey.key());
93  return StatusCode::FAILURE;
94  }
96  // Taus
97  const xAOD::TauJetContainer* taus{nullptr};
98  if(!m_tauKey.empty()) {
100  if (!readHandle.isValid()) {
101  ATH_MSG_FATAL("Failed to retrieve TauJetContainer "<<m_tauKey.key());
102  return StatusCode::FAILURE;
103  }
104  taus = readHandle.cptr();
105  applySelection(*taus);
106  }
107  const xAOD::PhotonContainer* photons{nullptr};
108  if(!m_photonKey.empty()) {
110  if (!readHandle.isValid()) {
111  ATH_MSG_FATAL("Failed to retrieve PhotonContainer "<<m_photonKey.key());
112  return StatusCode::FAILURE;
113  }
114  photons = readHandle.cptr();
115  applySelection(*photons);
116  }
117 
118  // Primary Vertices
120  if (!vertices.isValid()) {
121  ATH_MSG_FATAL("Failed to retrieve primary vertex container "<<m_vtxKey.key());
122  return StatusCode::FAILURE;
123  }
124  bool checkVtx = false;
125  for(const xAOD::Vertex* vtx : *vertices) {
126  if(vtx->vertexType() == xAOD::VxType::PriVtx)
127  checkVtx = true;
128  }
129 
130 
131  if(checkVtx) {
132  // Apply the overlap removal
133  ATH_CHECK( m_orTool->removeOverlaps(electrons.cptr(), muons.cptr(), jets.cptr(), taus, photons) );}
134  else{
135  // Reset all decorations to failing
136  ATH_MSG_DEBUG("No primary vertices found, cannot do overlap removal! Will return all fails.");
139  setDefaultDecorations(*muons);
140  if(taus) setDefaultDecorations(*taus);
141  if(photons) setDefaultDecorations(*photons);
142  }
143 
144  // Dump the objects
145  ATH_MSG_VERBOSE("Dumping results");
146 #ifdef XAOD_STANDALONE
147  auto msglvl = msg().level();
148 #else
149  auto msglvl = msgLevel();
150 #endif
151  if(msglvl >= MSG::VERBOSE){
152  printObjects(*electrons, "ele");
153  printObjects(*muons, "muo");
154  printObjects(*jets, "jet");
155  if(taus) printObjects(*taus, "tau");
156  if(photons) printObjects(*photons, "pho");
157  }
158 
159  return StatusCode::SUCCESS;
160 }
161 
162 //---------------------------------------------------------------------------
163 // Reset output decoration
164 //---------------------------------------------------------------------------
165  template<class ContainerType>
166 void OverlapRemovalGenUseAlg::setDefaultDecorations(const ContainerType& container) {
167  const static ort::inputDecorator_t defaultDec(m_overlapLabel);
168  for(auto obj : container){
169  defaultDec(*obj) = m_defaultValue; //default to all objects being overlaps if we can't get primary vertices. Ensures the event cleaning decision fails.
170  }
171 }
172 
173 
174 //-----------------------------------------------------------------------------
175 // Apply selection to a container
176 //-----------------------------------------------------------------------------
177  template<class ContainerType>
178 void OverlapRemovalGenUseAlg::applySelection(const ContainerType& container)
179 {
181  for(auto obj : container){
182  selDec(*obj) = selectObject(*obj);
183  ATH_MSG_VERBOSE(" Obj " << obj->index() << " of type " << obj->type()
184  << " selected? " << int(selDec(*obj)));
185  }
186 }
187 //-----------------------------------------------------------------------------
188 template<class ObjType>
190 {
191  if(obj.pt() < m_ptCut*GeV || std::abs(obj.eta()) > m_etaCut) return false;
192  return true;
193 }
194 //-----------------------------------------------------------------------------
195 template<>
196 bool OverlapRemovalGenUseAlg::selectObject<xAOD::Jet>(const xAOD::Jet& obj)
197 {
198  // Label bjets
199  //const static SG::AuxElement::ConstAccessor<float> acc_applyBTag("DFCommonJets_FixedCutBEff_85_MV2c10");
200  //static ort::inputDecorator_t bJetDec(m_bJetLabel);
201  //bJetDec(obj) = acc_applyBTag(obj);
202  // Selection
203  if(obj.pt() < m_ptCut*GeV || std::abs(obj.eta()) > m_etaCut) return false;
204  return true;
205 }
206 
207 //-----------------------------------------------------------------------------
208 template<>
209 bool OverlapRemovalGenUseAlg::selectObject<xAOD::Electron>(const xAOD::Electron& obj)
210 {
211  if(m_electronLabel.empty()) return true; //disable selection for objects with empty labels
212  const static SG::AuxElement::ConstAccessor<char> acc_ElectronPass(m_electronLabel);
213  if(obj.pt() < m_ptCut*GeV || std::abs(obj.eta()) > m_etaCut) return false;
214  if(!acc_ElectronPass(obj)) return false;
215  return true;
216 }
217 
218 //-----------------------------------------------------------------------------
219 template<>
220 bool OverlapRemovalGenUseAlg::selectObject<xAOD::Photon>(const xAOD::Photon& obj)
221 {
222  if(m_photonLabel.empty()) return true; //disable selection for objects with empty labels
223  const static SG::AuxElement::ConstAccessor<char> acc_PhotonPass(m_photonLabel);
224  if(obj.pt() < m_ptCut*GeV || std::abs(obj.eta()) > m_etaCut) return false;
225  if(!acc_PhotonPass(obj)) return false;
226  return true;
227 }
228 
229 //-----------------------------------------------------------------------------
230 template<>
231 bool OverlapRemovalGenUseAlg::selectObject<xAOD::Muon>(const xAOD::Muon& obj)
232 {
233  if(m_muonLabel.empty()) return true; //disable selection for objects with empty labels
234  const static SG::AuxElement::ConstAccessor<char> acc_MuonPass(m_muonLabel);
235  if(obj.pt() < m_ptCut*GeV || std::abs(obj.eta()) > m_etaCut) return false;
236  if(!acc_MuonPass(obj)) return false;
237  return true;
238 }
239 
240 //-----------------------------------------------------------------------------
241 template<>
242 bool OverlapRemovalGenUseAlg::selectObject<xAOD::TauJet>(const xAOD::TauJet& obj)
243 {
244  if(m_tauLabel.empty()) return true; //disable selection for objects with empty labels
245  const static SG::AuxElement::ConstAccessor<char> acc_TauPass(m_tauLabel);
246  if(obj.pt() < m_ptCut*GeV || std::abs(obj.eta()) > m_etaCut) return false;
247  if(!acc_TauPass(obj)) return false;
248  return true;
249 }
250 
251 
252 //-----------------------------------------------------------------------------
253 // Print object
254 //-----------------------------------------------------------------------------
256  const std::string& type)
257 {
260  for(auto obj : container){
261  if(selectAcc(*obj)){
262  bool overlaps = overlapAcc(*obj);
263  ATH_MSG_VERBOSE(" " << type << " pt " << obj->pt()*invGeV
264  << " eta " << obj->eta() << " phi " << obj->phi()
265  << " overlaps " << overlaps);
266  }
267  }
268 }
OverlapRemovalGenUseAlg::m_etaCut
Gaudi::Property< float > m_etaCut
Definition: OverlapRemovalGenUseAlg.h:125
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
OverlapRemovalGenUseAlg::m_jetKey
DataKeyHandler< xAOD::JetContainer > m_jetKey
Definition: OverlapRemovalGenUseAlg.h:88
OverlapRemovalGenUseAlg::m_muonLabel
Gaudi::Property< std::string > m_muonLabel
Definition: OverlapRemovalGenUseAlg.h:111
CurrentContext.h
OverlapRemovalGenUseAlg::initialize
virtual StatusCode initialize()
Initialize the algorithm.
Definition: OverlapRemovalGenUseAlg.cxx:31
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
OverlapRemovalGenUseAlg::m_photonKey
DataKeyHandler< xAOD::PhotonContainer > m_photonKey
Definition: OverlapRemovalGenUseAlg.h:94
OverlapRemovalGenUseAlg::m_orTool
ToolHandle< ORUtils::IOverlapRemovalTool > m_orTool
Handle to the tool.
Definition: OverlapRemovalGenUseAlg.h:60
OverlapRemovalGenUseAlg::m_ptCut
Gaudi::Property< float > m_ptCut
Definition: OverlapRemovalGenUseAlg.h:124
OverlapRemovalGenUseAlg.h
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
OverlapRemovalGenUseAlg::m_tauLabel
Gaudi::Property< std::string > m_tauLabel
Definition: OverlapRemovalGenUseAlg.h:113
selectAcc
const ort::inputAccessor_t selectAcc(inputLabel)
OverlapRemovalGenUseAlg::m_selectionLabel
Gaudi::Property< std::string > m_selectionLabel
Label configuration --> Internal usage no data dependency needed.
Definition: OverlapRemovalGenUseAlg.h:117
OverlapRemovalGenUseAlg::m_electronKey
DataKeyHandler< xAOD::ElectronContainer > m_electronKey
Definition: OverlapRemovalGenUseAlg.h:91
OverlapRemovalGenUseAlg::m_overlapLabel
Gaudi::Property< std::string > m_overlapLabel
Definition: OverlapRemovalGenUseAlg.h:120
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:58
OverlapRemovalGenUseAlg::m_photonLabel
Gaudi::Property< std::string > m_photonLabel
Definition: OverlapRemovalGenUseAlg.h:109
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
OverlapRemovalGenUseAlg::OverlapRemovalGenUseAlg
OverlapRemovalGenUseAlg(const std::string &name, ISvcLocator *svcLoc)
Standard algorithm constructor.
Definition: OverlapRemovalGenUseAlg.cxx:23
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:571
OverlapRemovalGenUseAlg::m_defaultValue
Gaudi::Property< bool > m_defaultValue
Definition: OverlapRemovalGenUseAlg.h:123
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
EL
This module defines the arguments passed from the BATCH driver to the BATCH worker.
Definition: AlgorithmWorkerData.h:24
OverlapRemovalGenUseAlg::printObjects
void printObjects(const xAOD::IParticleContainer &container, const std::string &type)
Print object info.
Definition: OverlapRemovalGenUseAlg.cxx:255
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
OverlapRemovalGenUseAlg::selectObject
bool selectObject(const ObjType &obj)
Simple object selection.
Definition: OverlapRemovalGenUseAlg.cxx:189
OverlapRemovalGenUseAlg::setDefaultDecorations
void setDefaultDecorations(const ContainerType &container)
Definition: OverlapRemovalGenUseAlg.cxx:166
OverlapRemovalGenUseAlg::m_tauKey
DataKeyHandler< xAOD::TauJetContainer > m_tauKey
Definition: OverlapRemovalGenUseAlg.h:100
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
ReadHandle.h
Handle class for reading from StoreGate.
xAOD::Electron_v1
Definition: Electron_v1.h:34
OverlapRemovalGenUseAlg::m_muonKey
DataKeyHandler< xAOD::MuonContainer > m_muonKey
Definition: OverlapRemovalGenUseAlg.h:97
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
xAOD::Photon_v1
Definition: Photon_v1.h:37
OverlapRemovalGenUseAlg::applySelection
void applySelection(const ContainerType &container)
Simple object selection.
Definition: OverlapRemovalGenUseAlg.cxx:178
OverlapRemovalGenUseAlg::m_vtxKey
SG::ReadHandleKey< xAOD::VertexContainer > m_vtxKey
Definition: OverlapRemovalGenUseAlg.h:103
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
AthCommonMsg< Algorithm >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
OverlapRemovalGenUseAlg::execute
virtual StatusCode execute()
Execute the algorithm.
Definition: OverlapRemovalGenUseAlg.cxx:72
OverlapRemovalDefs.h
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
OverlapRemovalGenUseAlg::m_electronLabel
Gaudi::Property< std::string > m_electronLabel
Definition: OverlapRemovalGenUseAlg.h:107
python.PyAthena.obj
obj
Definition: PyAthena.py:135
GeV
#define GeV
Definition: CaloTransverseBalanceVecMon.cxx:30
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
OverlapRemovalGenUseAlg::m_bJetLabel
Gaudi::Property< std::string > m_bJetLabel
Definition: OverlapRemovalGenUseAlg.h:106
invGeV
constexpr float invGeV
Definition: PFTrackSelector.cxx:10
overlapAcc
const ort::outputAccessor_t overlapAcc(outputLabel)