ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
TrigADComboHypoTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "TrigADComboHypoTool.h"
6 #include "xAODJet/JetContainer.h"
7 #include "xAODJet/Jet.h"
9 #include "xAODMuon/Muon.h"
11 #include "xAODEgamma/Electron.h"
13 #include "xAODEgamma/Photon.h"
15 #include "xAODTau/TauJet.h"
19 #include <Math/Vector2D.h>
20 #include <Math/Vector2Dfwd.h>
21 
22 #include <cmath>
23 
24 TrigADComboHypoTool::TrigADComboHypoTool(const std::string& type, const std::string& name, const IInterface* parent): ComboHypoToolBase(type, name, parent) {}
25 
27 
28  ATH_CHECK( m_svc.retrieve() );
29  std::string model_file_name = PathResolverFindCalibFile(m_modelFileName);
30 
31  if (m_modelFileName.empty() || model_file_name.empty()) {
32  ATH_MSG_ERROR("Could not find the requested ONNX model file: " << m_modelFileName);
33  ATH_MSG_ERROR("Please make sure it exists in the ATLAS calibration area (https://atlas-groupdata.web.cern.ch/atlas-groupdata/), and provide a model file name relative to the root of the calibration area.");
34 
35  return StatusCode::FAILURE;
36  }
37 
38  // initialise session
39  Ort::SessionOptions session_options;
40  Ort::AllocatorWithDefaultOptions allocator;
41  session_options.SetIntraOpNumThreads(1);
42  session_options.SetGraphOptimizationLevel(ORT_ENABLE_BASIC);
43 
44  m_session = std::make_unique<Ort::Session>(m_svc->env(), model_file_name.c_str(), session_options);
45 
46  ATH_MSG_INFO("Created ONNX runtime session with model " << model_file_name);
47 
48  size_t num_input_nodes = m_session->GetInputCount();
49  m_input_node_names.resize(num_input_nodes);
50 
51  for (std::size_t i = 0; i < num_input_nodes; i++) {
52  char* input_name = m_session->GetInputNameAllocated(i, allocator).release();
53  ATH_MSG_DEBUG("Input " << i << " : " << " name= " << input_name);
54  m_input_node_names[i] = input_name;
55 
56  Ort::TypeInfo type_info = m_session->GetInputTypeInfo(i);
57  auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
58  ONNXTensorElementDataType type = tensor_info.GetElementType();
59  ATH_MSG_DEBUG("Input " << i << " : " << " type= " << type);
60 
61  m_input_node_dims = tensor_info.GetShape();
62  ATH_MSG_DEBUG("Input " << i << " : num_dims= " << m_input_node_dims.size());
63  for (std::size_t j = 0; j < m_input_node_dims.size(); j++) {
64  if (m_input_node_dims[j] < 0) m_input_node_dims[j] = 1;
65  ATH_MSG_DEBUG("Input " << i << " : dim " << j << "= " << m_input_node_dims[j]);
66  }
67  }
68 
69  std::vector<int64_t> output_node_dims;
70  size_t num_output_nodes = m_session->GetOutputCount();
71  ATH_MSG_DEBUG("Have output nodes " << num_output_nodes);
72  m_output_node_names.resize(num_output_nodes);
73 
74  for (std::size_t i = 0; i < num_output_nodes; i++) {
75  char* output_name = m_session->GetOutputNameAllocated(i, allocator).release();
76  ATH_MSG_DEBUG("Output " << i << " : " << " name= " << output_name);
77  m_output_node_names[i] = output_name;
78 
79  Ort::TypeInfo type_info = m_session->GetOutputTypeInfo(i);
80  auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
81  ONNXTensorElementDataType type = tensor_info.GetElementType();
82  ATH_MSG_DEBUG("Output " << i << " : " << " type= " << type);
83 
84  output_node_dims = tensor_info.GetShape();
85  ATH_MSG_DEBUG("Output " << i << " : num_dims= " << output_node_dims.size());
86  for (std::size_t j = 0; j < output_node_dims.size(); j++) {
87  if (output_node_dims[j] < 0) output_node_dims[j] = 1;
88  ATH_MSG_DEBUG("Output" << i << " : dim " << j << "= " << output_node_dims[j]);
89  }
90  }
91 
92 
93  return StatusCode::SUCCESS;
94 }
95 
96 StatusCode TrigADComboHypoTool::decide(Combo::LegDecisionsMap& passingLegs, const EventContext& /*context*/) const{
97 
98  ATH_MSG_DEBUG("Size of passingLegs = " << passingLegs.size());
99 
100  if (passingLegs.size() == 0) { // if no combinations passed, then exit
101  return StatusCode::SUCCESS;
102  }
103 
104  std::vector<std::vector<Combo::LegDecision>> legDecisions;
105  ATH_CHECK(selectLegs(passingLegs, legDecisions));
106 
107  // get the lists of each object
108  ATH_MSG_DEBUG("Have "<<passingLegs.size()<<" passing legs in AD");
109 
110  std::vector<const xAOD::Jet*> input_jets;
111  std::map<const xAOD::Jet*, std::vector<Combo::LegDecision>> jet_decisions;
112  std::vector<const xAOD::Electron*> input_electrons;
113  std::map<const xAOD::Electron*, std::vector<Combo::LegDecision>> ele_decisions;
114  std::vector<const xAOD::Muon*> input_muons;
115  std::map<const xAOD::Muon*, std::vector<Combo::LegDecision>> muon_decisions;
116  std::vector<const xAOD::Photon*> input_photons;
117  std::map<const xAOD::Photon*, std::vector<Combo::LegDecision>> gam_decisions;
118  std::vector<const xAOD::TauJet*> input_taus;
119  std::map<const xAOD::TauJet*, std::vector<Combo::LegDecision>> taujet_decisions;
120  std::vector<const xAOD::TrigMissingET*> input_mets;
121  std::map<const xAOD::TrigMissingET*, std::vector<Combo::LegDecision>> met_decisions;
122 
123  for(const auto &leg_decs : legDecisions){ // loop over each leg
124  for(const auto &dec_pair : leg_decs){ // loop over each object in a leg
125  const TrigCompositeUtils::Decision* decision(*(dec_pair.second));
126  std::vector<TrigCompositeUtils::LinkInfo<xAOD::JetContainer>> jet_feature_links = TrigCompositeUtils::findLinks<xAOD::JetContainer>(decision, TrigCompositeUtils::featureString(), TrigDefs::lastFeatureOfType);
127  std::vector<TrigCompositeUtils::LinkInfo<xAOD::ElectronContainer>> ele_feature_links = TrigCompositeUtils::findLinks<xAOD::ElectronContainer>(decision, TrigCompositeUtils::featureString(), TrigDefs::lastFeatureOfType);
128  std::vector<TrigCompositeUtils::LinkInfo<xAOD::MuonContainer>> muon_feature_links = TrigCompositeUtils::findLinks<xAOD::MuonContainer>(decision, TrigCompositeUtils::featureString(), TrigDefs::lastFeatureOfType);
129  std::vector<TrigCompositeUtils::LinkInfo<xAOD::PhotonContainer>> gam_feature_links = TrigCompositeUtils::findLinks<xAOD::PhotonContainer>(decision, TrigCompositeUtils::featureString(), TrigDefs::lastFeatureOfType);
130  std::vector<TrigCompositeUtils::LinkInfo<xAOD::TauJetContainer>> taujet_feature_links = TrigCompositeUtils::findLinks<xAOD::TauJetContainer>(decision, TrigCompositeUtils::featureString(), TrigDefs::lastFeatureOfType);
131  std::vector<TrigCompositeUtils::LinkInfo<xAOD::TrigMissingETContainer>> met_feature_links = TrigCompositeUtils::findLinks<xAOD::TrigMissingETContainer>(decision, TrigCompositeUtils::featureString(), TrigDefs::lastFeatureOfType);
132  if(jet_feature_links.size()==1){
133  const TrigCompositeUtils::LinkInfo<xAOD::JetContainer> jet_feature_link = jet_feature_links.at(0);
134  ATH_CHECK(jet_feature_link.isValid());
135  const xAOD::Jet* jet = *(jet_feature_link.link);
136  jet_decisions[jet].push_back(dec_pair);
137  }
138  if(ele_feature_links.size()==1){
139  const TrigCompositeUtils::LinkInfo<xAOD::ElectronContainer> ele_feature_link = ele_feature_links.at(0);
140  ATH_CHECK(ele_feature_link.isValid());
141  const xAOD::Electron* electron = *(ele_feature_link.link);
142  ele_decisions[electron].push_back(dec_pair);
143  }
144  if(muon_feature_links.size()==1){
145  const TrigCompositeUtils::LinkInfo<xAOD::MuonContainer> muon_feature_link = muon_feature_links.at(0);
146  ATH_CHECK(muon_feature_link.isValid());
147  const xAOD::Muon* muon = *(muon_feature_link.link);
148  muon_decisions[muon].push_back(dec_pair);
149  }
150  if(gam_feature_links.size()==1){
151  const TrigCompositeUtils::LinkInfo<xAOD::PhotonContainer> gam_feature_link = gam_feature_links.at(0);
152  ATH_CHECK(gam_feature_link.isValid());
153  const xAOD::Photon* photon = *(gam_feature_link.link);
154  gam_decisions[photon].push_back(dec_pair);
155  }
156  if(taujet_feature_links.size()==1){
157  const TrigCompositeUtils::LinkInfo<xAOD::TauJetContainer> taujet_feature_link = taujet_feature_links.at(0);
158  ATH_CHECK(taujet_feature_link.isValid());
159  const xAOD::TauJet* taujet = *(taujet_feature_link.link);
160  taujet_decisions[taujet].push_back(dec_pair);
161  }
162  if(met_feature_links.size()==1){
163  const TrigCompositeUtils::LinkInfo<xAOD::TrigMissingETContainer> met_feature_link = met_feature_links.at(0);
164  ATH_CHECK(met_feature_link.isValid());
165  const xAOD::TrigMissingET* met = *(met_feature_link.link);
166  met_decisions[met].push_back(dec_pair);
167  }
168  }
169  }
170 
171  for(const auto &pair : jet_decisions){
172  input_jets.push_back(pair.first);
173  }
174  if(input_jets.size()>1){
175  std::sort(input_jets.begin(), input_jets.end(),
176  [](const auto a, const auto b){
177  return a->pt() > b->pt();
178  });
179  }
180 
181  for(const auto &pair : ele_decisions){
182  input_electrons.push_back(pair.first);
183  }
184  if(input_electrons.size()>1){
185  std::sort(input_electrons.begin(), input_electrons.end(),
186  [](const auto a, const auto b){
187  return a->pt() > b->pt();
188  });
189  }
190 
191  for(const auto &pair : muon_decisions){
192  input_muons.push_back(pair.first);
193  }
194  if(input_muons.size()>1){
195  std::sort(input_muons.begin(), input_muons.end(),
196  [](const auto a, const auto b){
197  return a->pt() > b->pt();
198  });
199  }
200 
201  for(const auto &pair : gam_decisions){
202  input_photons.push_back(pair.first);
203  }
204  if(input_photons.size()>1){
205  std::sort(input_photons.begin(), input_photons.end(),
206  [](const auto a, const auto b){
207  return a->pt() > b->pt();
208  });
209  }
210 
211  for(const auto &pair : taujet_decisions){
212  input_taus.push_back(pair.first);
213  }
214  if(input_taus.size()>1){
215  std::sort(input_taus.begin(), input_taus.end(),
216  [](const auto a, const auto b){
217  return a->pt() > b->pt();
218  });
219  }
220 
221  for(const auto &pair : met_decisions){
222  input_mets.push_back(pair.first);
223  }
224 
225  bool trigPass = this->getAdDecision(input_jets, input_muons, input_electrons, input_photons, input_taus, input_mets);
226 
227  if(!trigPass){
228  eraseFromLegDecisionsMap(passingLegs);
229  }
230 
231  return StatusCode::SUCCESS;
232 }
233 
235  const std::vector<const xAOD::Jet*> &input_jets,
236  const std::vector<const xAOD::Muon*> &input_muons,
237  const std::vector<const xAOD::Electron*> &input_electrons,
238  const std::vector<const xAOD::Photon*> &input_photons,
239  const std::vector<const xAOD::TauJet*> &input_taus,
240  const std::vector<const xAOD::TrigMissingET*> &input_mets) const{
241 
242  ATH_MSG_DEBUG( "Counting AD input objects in the event ... "
243  << "Jets: " << input_jets.size() << ", "
244  << "Muons: " << input_muons.size() << ", "
245  << "Electrons: " << input_electrons.size() << ", "
246  << "Photons: " << input_photons.size() << ", "
247  << "TauJets: " << input_taus.size() << ", "
248  << "METs: " << input_mets.size());
249 
250  // pt1 eta1 phi1 pt2 eta2 phi2 ... for 6 jets, 3 electrons, 3 muons, 3 photons, and MET
251  unsigned int metind = (m_maxjs.value()+m_maxes.value()+m_maxms.value()+m_maxgs.value())*3;
252  std::vector<float> inputTensor;
253 
254  unsigned int jet_count = 0;
255  for(const auto &jet : input_jets){
256  ATH_MSG_DEBUG( std::setprecision(3) << std::fixed
257  << "jet[" << jet_count << "] = ("
258  << jet->pt()/1000 << ", "
259  << jet->eta() << ", "
260  << jet->phi() << ", "
261  << jet->m()/1000 << ")");
262  if (jet_count<m_maxjs.value()) {
263  inputTensor.insert(inputTensor.end(), {static_cast<float>(jet->pt()/1000), static_cast<float>(jet->eta()), static_cast<float>(jet->phi())});
264  jet_count++;
265  }
266  }
267  inputTensor.insert(inputTensor.end(), 3*(m_maxjs.value()-jet_count), 0.);
268 
269  unsigned int ele_count = 0;
270  for(const auto &ele : input_electrons){
271  ATH_MSG_DEBUG( std::setprecision(3) << std::fixed
272  << "ele[" << ele_count << "] = ("
273  << ele->pt()/1000 << ", "
274  << ele->eta() << ", "
275  << ele->phi() << ", "
276  << ele->m()/1000 << ")");
277  if (ele_count<m_maxes.value()) {
278  inputTensor.insert(inputTensor.end(), {static_cast<float>(ele->pt()/1000), static_cast<float>(ele->eta()), static_cast<float>(ele->phi())});
279  ele_count++;
280  }
281  }
282  inputTensor.insert(inputTensor.end(), 3*(m_maxes.value()-ele_count), 0.);
283 
284  unsigned int muon_count = 0;
285  for(const auto &muon : input_muons){
286  ATH_MSG_DEBUG( std::setprecision(3) << std::fixed
287  << "muon[" << muon_count << "] = ("
288  << muon->pt()/1000 << ", "
289  << muon->eta() << ", "
290  << muon->phi() << ", "
291  << muon->m()/1000 << ")");
292  if (muon_count<m_maxms.value()) {
293  inputTensor.insert(inputTensor.end(), {static_cast<float>(muon->pt()/1000), static_cast<float>(muon->eta()), static_cast<float>(muon->phi())});
294  muon_count++;
295  }
296  }
297  inputTensor.insert(inputTensor.end(), 3*(m_maxms.value()-muon_count), 0.);
298 
299  unsigned int gam_count = 0;
300  for(const auto &gam : input_photons){
301  ATH_MSG_DEBUG( std::setprecision(3) << std::fixed
302  << "gam[" << gam_count << "] = ("
303  << gam->pt()/1000 << ", "
304  << gam->eta() << ", "
305  << gam->phi() << ", "
306  << gam->m()/1000 << ")");
307  if (gam_count<m_maxgs.value()) {
308  inputTensor.insert(inputTensor.end(), {static_cast<float>(gam->pt()/1000), static_cast<float>(gam->eta()), static_cast<float>(gam->phi())});
309  gam_count++;
310  }
311  }
312  inputTensor.insert(inputTensor.end(), 3*(m_maxgs.value()-gam_count), 0.);
313 
314  inputTensor.insert(inputTensor.end(), {0., 0., 0.});
315  for(const auto &met : input_mets){
316  ROOT::Math::XYVectorF metv(met->ex(),met->ey());
317  float met_phi = metv.phi();
318  float met_et = metv.r();
319 
320  ATH_MSG_DEBUG( std::setprecision(3) << std::fixed
321  << "MET = ("
322  << met_et/1000 << ", "
323  << met_phi << ")");
324  inputTensor[metind] = met_et/1000;
325  inputTensor[metind+2] = met_phi;
326  }
327 
328  ATH_MSG_DEBUG("inputTensor size = " << inputTensor.size());
329  if(msgLvl(MSG::DEBUG)){
330  for (unsigned int i=0; i<inputTensor.size(); i++){
331  ATH_MSG_DEBUG("inputTensor[" << i << "] = " << inputTensor[i]);
332  }
333  }
334 
335  float outputScore = runInference(inputTensor);
336  ATH_MSG_DEBUG("Computed TrigADScore: " << outputScore);
337 
338  bool trigPass = (outputScore > m_adScoreThres);
339 
340  return trigPass;
341 }
342 
343 float TrigADComboHypoTool::runInference(std::vector<float> &tensor) const {
344 
345  ATH_MSG_DEBUG("in TrigADComboHypoTool::runInference()");
346 
347  auto memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
348  int input_tensor_size = (m_maxjs.value()+m_maxes.value()+m_maxms.value()+m_maxgs.value()+1)*3;
349  Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, tensor.data(), input_tensor_size, m_input_node_dims.data(), m_input_node_dims.size());
350 
351  // Ort::Session::Run is non-const.
352  // However, the onnx authors claim that it is safe to call from multiple threads:
353  // https://github.com/Microsoft/onnxruntime/issues/114
354  Ort::Session* session ATLAS_THREAD_SAFE = m_session.get();
355  auto output_tensors = session->Run(Ort::RunOptions{nullptr}, m_input_node_names.data(), &input_tensor, m_input_node_names.size(), m_output_node_names.data(), m_output_node_names.size());
356 
357  float *output_score_array = output_tensors.front().GetTensorMutableData<float>();
358  unsigned int output_size = output_tensors.front().GetTensorTypeAndShapeInfo().GetElementCount();
359 
360  float output_score = 0.;
361  if(output_size!=1){
362  ATH_MSG_ERROR("Invalid output tensor size: " << output_size);
363  }else{
364  output_score = output_score_array[0];
365  }
366 
367  return output_score;
368 }
TrigADComboHypoTool::m_maxes
Gaudi::Property< unsigned int > m_maxes
Definition: TrigADComboHypoTool.h:34
TrigADComboHypoTool::m_maxjs
Gaudi::Property< unsigned int > m_maxjs
Definition: TrigADComboHypoTool.h:33
TrigMissingET.h
xAOD::muon
@ muon
Definition: TrackingPrimitives.h:196
Jet.h
TrigCompositeUtils::LinkInfo::link
ElementLink< T > link
Link to the feature.
Definition: LinkInfo.h:61
ComboHypoToolBase::eraseFromLegDecisionsMap
void eraseFromLegDecisionsMap(Combo::LegDecisionsMap &passingLegs) const
For when the tool rejects all combinations.
Definition: ComboHypoToolBase.cxx:253
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TrigCompositeUtils::LinkInfo::isValid
bool isValid() const
Definition: LinkInfo.h:43
Muon.h
TrigADComboHypoTool::m_input_node_names
std::vector< const char * > m_input_node_names
Definition: TrigADComboHypoTool.h:54
TrigADComboHypoTool::m_session
std::unique_ptr< Ort::Session > m_session
Definition: TrigADComboHypoTool.h:52
TrigADComboHypoTool::decide
virtual StatusCode decide(Combo::LegDecisionsMap &passingLegs, const EventContext &ctx) const override
retrieves the decisions associated to this decId, make their combinations and apply the algorithm
Definition: TrigADComboHypoTool.cxx:96
ComboHypoToolBase
Base class for tools which cut on properties of multi-object or multi-leg chains. User should derive ...
Definition: ComboHypoToolBase.h:26
Combo::LegDecisionsMap
std::map< TrigCompositeUtils::DecisionID, std::vector< ElementLink< TrigCompositeUtils::DecisionContainer > > > LegDecisionsMap
LegDecisionsMap For a given chain leg key, this map holds all Decision Objects which are active on th...
Definition: IComboHypoTool.h:28
python.oracle.Session
Session
Definition: oracle.py:78
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
TrigADComboHypoTool::m_maxgs
Gaudi::Property< unsigned int > m_maxgs
Definition: TrigADComboHypoTool.h:36
met
Definition: IMETSignificance.h:24
TrigADComboHypoTool.h
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ElectronContainer.h
lumiFormat.i
int i
Definition: lumiFormat.py:85
TrigADComboHypoTool::TrigADComboHypoTool
TrigADComboHypoTool(const std::string &type, const std::string &name, const IInterface *parent)
Definition: TrigADComboHypoTool.cxx:24
Photon.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
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
TrigADComboHypoTool::m_svc
ServiceHandle< AthOnnx::IOnnxRuntimeSvc > m_svc
Definition: TrigADComboHypoTool.h:50
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TrigMissingETContainer.h
xAOD::TrigComposite_v1
Class used to describe composite objects in the HLT.
Definition: TrigComposite_v1.h:52
TauJetContainer.h
TrigCompositeUtils::featureString
const std::string & featureString()
Definition: TrigCompositeUtilsRoot.cxx:884
ComboHypoToolBase::selectLegs
StatusCode selectLegs(const Combo::LegDecisionsMap &IDCombMap, std::vector< std::vector< Combo::LegDecision >> &leg_decisions) const
Creates the per-leg vectors of Decision objects starting from the initial LegDecision map,...
Definition: ComboHypoToolBase.cxx:172
PathResolver.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
TrigADComboHypoTool::m_maxms
Gaudi::Property< unsigned int > m_maxms
Definition: TrigADComboHypoTool.h:35
xAOD::Electron_v1
Definition: Electron_v1.h:34
MuonContainer.h
TrigADComboHypoTool::initialize
virtual StatusCode initialize() override
Definition: TrigADComboHypoTool.cxx:26
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
TrigADComboHypoTool::runInference
float runInference(std::vector< float > &tensor) const
Definition: TrigADComboHypoTool.cxx:343
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
TrigCompositeUtils::LinkInfo
Helper to keep a Decision object, ElementLink and ActiveState (with respect to some requested ChainGr...
Definition: LinkInfo.h:28
TrigADComboHypoTool::m_input_node_dims
std::vector< int64_t > m_input_node_dims
Definition: TrigADComboHypoTool.h:58
xAOD::photon
@ photon
Definition: TrackingPrimitives.h:200
a
TList * a
Definition: liststreamerinfos.cxx:10
JetContainer.h
xAOD::Photon_v1
Definition: Photon_v1.h:37
xAOD::TrigMissingET_v1
Class holding the Missing ET trigger fex results.
Definition: TrigMissingET_v1.h:32
TauJet.h
DEBUG
#define DEBUG
Definition: page_access.h:11
xAOD::EgammaParameters::electron
@ electron
Definition: EgammaEnums.h:18
TrigADComboHypoTool::m_output_node_names
std::vector< const char * > m_output_node_names
Definition: TrigADComboHypoTool.h:56
Electron.h
TrigADComboHypoTool::m_adScoreThres
Gaudi::Property< double > m_adScoreThres
Definition: TrigADComboHypoTool.h:38
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
TrigADComboHypoTool::m_modelFileName
Gaudi::Property< std::string > m_modelFileName
Definition: TrigADComboHypoTool.h:61
PhotonContainer.h
TrigADComboHypoTool::getAdDecision
bool getAdDecision(const std::vector< const xAOD::Jet * > &input_jets, const std::vector< const xAOD::Muon * > &input_muons, const std::vector< const xAOD::Electron * > &input_electrons, const std::vector< const xAOD::Photon * > &input_photons, const std::vector< const xAOD::TauJet * > &input_taus, const std::vector< const xAOD::TrigMissingET * > &input_mets) const
Definition: TrigADComboHypoTool.cxx:234