ATLAS Offline Software
Loading...
Searching...
No Matches
TauSelectionTool.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// Local include(s):
8
9// Framework include(s):
11
12// ROOT include(s)
13#include "TEnv.h"
14#include "THashList.h"
15
16using namespace TauAnalysisTools;
17using namespace ADD_CMODE(TauAnalysisTools);
18
19//=================================PUBLIC-PART==================================
20//______________________________________________________________________________
21TauSelectionTool::TauSelectionTool( const std::string& name )
22 : asg::AsgMetadataTool( name )
23 , m_sJetIDWP("JETIDNONE")
24 , m_sEleIDWP("ELEIDNONE")
25 , m_fOutFile(nullptr)
26 , m_aAccept( "TauSelection" )
27{}
28
29//______________________________________________________________________________
30TauSelectionTool::~TauSelectionTool()
31{
32 m_cMap.clear();
33}
34
35//______________________________________________________________________________
36StatusCode TauSelectionTool::initialize()
37{
38
39 m_vAbsEtaRegion = m_vecAbsEtaRegion.value();
40 m_vAbsCharges = m_vecAbsCharges.value();
41 m_vNTracks = m_vecNTracks.value();
42
43 bool bConfigViaConfigFile = !m_sConfigPath.empty();
44 bool bConfigViaProperties = false;
45 if (!bConfigViaProperties and !std::isnan(m_dPtMin.value())) bConfigViaProperties = true;
46 if (!bConfigViaProperties and !m_vAbsEtaRegion.empty()) bConfigViaProperties = true;
47 if (!bConfigViaProperties and !std::isnan(m_dAbsEtaMin.value())) bConfigViaProperties = true;
48 if (!bConfigViaProperties and !std::isnan(m_dAbsEtaMax.value())) bConfigViaProperties = true;
49 if (!bConfigViaProperties and !m_vAbsCharges.empty()) bConfigViaProperties = true;
50 if (!bConfigViaProperties and !std::isnan(m_iAbsCharge.value())) bConfigViaProperties = true;
51 if (!bConfigViaProperties and !m_vNTracks.empty()) bConfigViaProperties = true;
52 if (!bConfigViaProperties and !std::isnan(m_iNTrack.value())) bConfigViaProperties = true;
53 if (!bConfigViaProperties and !std::isnan(m_dJetRNNSigTransMin.value())) bConfigViaProperties = true;
54 if (!bConfigViaProperties and !std::isnan(m_dGNTauSigTransMin.value())) bConfigViaProperties = true;
55 if (!bConfigViaProperties and m_iJetIDWP != TauAnalysisTools::JetID::JETIDNONE) bConfigViaProperties = true;
56 if (!bConfigViaProperties and !std::isnan(m_dEleRNNSigTransMin.value())) bConfigViaProperties = true;
57 if (!bConfigViaProperties and m_iEleIDWP != 0) bConfigViaProperties = true;
58 if (!bConfigViaProperties and m_bMuonOLR) bConfigViaProperties = true;
59
60 if (bConfigViaConfigFile and bConfigViaProperties)
61 {
62 ATH_MSG_ERROR("Configured tool via setProperty and configuration file, which may lead to unexpected configuration. Please setup the TauSelectionTool using only one of the two methods. For further details please refer to the documentation https://gitlab.cern.ch/atlas/athena/blob/main/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst or contact the TauCP group.");
63 return StatusCode::FAILURE;
64 }
65 if (!bConfigViaConfigFile and !bConfigViaProperties)
66 {
67 ATH_MSG_WARNING("No cut configuration provided, the tool will not do anything. For further details please refer to the documentation:");
68 ATH_MSG_WARNING("https://gitlab.cern.ch/atlas/athena/blob/main/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst");
69 return StatusCode::SUCCESS;
70 }
71
72 if (bConfigViaConfigFile)
73 {
74 TEnv rEnv;
75 std::string sInputFilePath = PathResolverFindCalibFile(m_sConfigPath);
76
77 if (!testFileForEOFContainsCharacters(sInputFilePath))
78 ATH_MSG_WARNING("Config file for TauSelectionTool with path "<<sInputFilePath<<" does not contain an empty last line. The tool might not be properly configured!");
79
80 rEnv.ReadFile(sInputFilePath.c_str(),
81 kEnvAll);
82
83 std::vector<std::string> vCuts;
84 // if Cuts are specified in the config file take these ones, if not take all
85 // specified in the config
86 if (rEnv.Defined("SelectionCuts"))
87 ADD_CMODE(TauAnalysisTools)::split(rEnv, "SelectionCuts", ' ', vCuts);
88 else
89 {
90 auto lList = rEnv.GetTable();
91 for( Int_t i = 0; i < lList->GetEntries(); ++i )
92 {
93 vCuts.push_back( lList->At( i )->GetName() );
94 }
95 }
96
97 int iSelectionCuts = 0;
98
99 for (const std::string& sCut : vCuts)
100 {
101 if (sCut == "PtMin")
102 {
103 iSelectionCuts = iSelectionCuts | CutPt;
104 if (std::isnan(m_dPtMin.value()))
105 m_dPtMin = rEnv.GetValue("PtMin",NAN);
106 }
107 else if (sCut == "AbsEtaRegion")
108 {
109 iSelectionCuts = iSelectionCuts | CutAbsEta;
110 if (m_vAbsEtaRegion.empty())
111 ADD_CMODE(TauAnalysisTools)::split(rEnv,"AbsEtaRegion", ';', m_vAbsEtaRegion);
112 }
113 else if (sCut == "AbsEtaMin")
114 {
115 iSelectionCuts = iSelectionCuts | CutAbsEta;
116 if (std::isnan(m_dAbsEtaMin.value()))
117 m_dAbsEtaMin = rEnv.GetValue("AbsEtaMin",NAN);
118 }
119 else if (sCut == "AbsEtaMax")
120 {
121 iSelectionCuts = iSelectionCuts | CutAbsEta;
122 if (std::isnan(m_dAbsEtaMax.value()))
123 m_dAbsEtaMax = rEnv.GetValue("AbsEtaMax",NAN);
124 }
125 else if (sCut == "AbsCharges")
126 {
127 iSelectionCuts = iSelectionCuts | CutAbsCharge;
128 if (m_vAbsCharges.empty())
129 ADD_CMODE(TauAnalysisTools)::split(rEnv,"AbsCharges", ';', m_vAbsCharges);
130 }
131 else if (sCut == "AbsCharge")
132 {
133 iSelectionCuts = iSelectionCuts | CutAbsCharge;
134 if (std::isnan(m_iAbsCharge.value()))
135 m_iAbsCharge = rEnv.GetValue("AbsCharge",NAN);
136 }
137 else if (sCut == "NTracks")
138 {
139 iSelectionCuts = iSelectionCuts | CutNTrack;
140 if (m_vNTracks.empty())
141 ADD_CMODE(TauAnalysisTools)::split(rEnv,"NTracks", ';', m_vNTracks);
142 }
143 else if (sCut == "NTrack")
144 {
145 iSelectionCuts = iSelectionCuts | CutNTrack;
146 if (std::isnan(m_iNTrack.value()))
147 m_iNTrack = rEnv.GetValue("NTrack",NAN);
148 }
149 else if (sCut == "JetRNNSigTransMin")
150 {
151 iSelectionCuts = iSelectionCuts | CutJetRNNScoreSigTrans;
152 if (std::isnan(m_dJetRNNSigTransMin.value()))
153 m_dJetRNNSigTransMin = rEnv.GetValue("JetRNNSigTransMin",NAN);
154 }
155 else if (sCut == "GNTauSigTransMin")
156 {
157 iSelectionCuts = iSelectionCuts | CutGNTauScoreSigTrans;
158 if (std::isnan(m_dGNTauSigTransMin.value()))
159 m_dGNTauSigTransMin = rEnv.GetValue("GNTauSigTransMin",NAN);
160
161 // check if using GNTau
162 m_useGNTau = true;
163 }
164 else if (sCut == "EleRNNSigTransMin")
165 {
166 iSelectionCuts = iSelectionCuts | CutEleRNNScoreSigTrans;
167 if (std::isnan(m_dEleRNNSigTransMin.value()))
168 m_dEleRNNSigTransMin = rEnv.GetValue("EleRNNSigTransMin",NAN);
169 }
170 else if (sCut == "JetIDWP")
171 {
172 iSelectionCuts = iSelectionCuts | CutJetIDWP;
173 if (m_iJetIDWP == JETIDNONE){
174 m_sJetIDWP = rEnv.GetValue("JetIDWP","JETIDNONE");
175 m_iJetIDWP = convertStrToJetIDWP(m_sJetIDWP);
176 }
177 // check for possible mis-config in Tau selection
178 for (const std::string& checkCut : vCuts){
179 if (checkCut.find("SigTrans") != std::string::npos) {
180 ATH_MSG_ERROR("Misconfig due to JetIDWP and SigTrans cuts both present in the config file. Please CHECK carefully config file again");
181 return StatusCode::FAILURE;
182 }
183 }
184 }
185 else if (sCut == "EleIDWP")
186 {
187 iSelectionCuts = iSelectionCuts | CutEleIDWP;
188 if (m_iEleIDWP == ELEIDNONEUNCONFIGURED){
189 m_sEleIDWP = rEnv.GetValue("EleIDWP","ELEIDNONE");
190 m_iEleIDWP = convertStrToEleIDWP(m_sEleIDWP);
191 }
192 }
193 else if (sCut == "MuonOLR")
194 {
195 iSelectionCuts = iSelectionCuts | CutMuonOLR;
196 if (!m_bMuonOLR)
197 m_bMuonOLR = rEnv.GetValue("MuonOLR",false);
198 }
199 else ATH_MSG_WARNING("Cut " << sCut << " is not available");
200 }
201
202 if (m_iSelectionCuts == NoCut)
203 m_iSelectionCuts = iSelectionCuts;
204 }
205
206 // check if using GNTau
207 if(m_sJetIDWP.find("GNTAU") != std::string::npos)
208 m_useGNTau = true;
209
210 // initialise the ReadHandleKey of the muon container when the muon veto is applied
211 ATH_CHECK( m_muonContainerKey.initialize( m_iSelectionCuts & CutMuonOLR ) );
212
213 ATH_CHECK( m_tauContainerKey.initialize() );
214
215 // initialise the ReadDecorHandleKey if GNTau is applied
216 if (m_useGNTau) {
217 ATH_CHECK( m_GNTauDecorKey.assign(m_tauContainerKey.key()+".GNTauScoreSigTrans_v0prune"));
218 }
219 ATH_CHECK( m_GNTauDecorKey.initialize( m_useGNTau ) );
220
221 // initialise the ReadDecorHandleKey if eVeto is applied
222 if (m_iSelectionCuts & CutEleIDWP) {
223 ATH_CHECK( m_eVetoDecorKey.assign(m_tauContainerKey.key()+".RNNEleScoreSigTrans_v"+std::to_string(m_iEleIDVersion)) );
224 }
225 ATH_CHECK( m_eVetoDecorKey.initialize( m_iSelectionCuts & CutEleIDWP ) );
226
227 // specify all available cut descriptions
228 using map_type = std::map<SelectionCuts, std::unique_ptr<TauSelectionCut>>;
229 using pair_type = map_type::value_type;
230
231 pair_type elements[] =
232 {
233 {CutPt, std::make_unique<TauSelectionCutPt>(this)},
234 {CutAbsEta, std::make_unique<TauSelectionCutAbsEta>(this)},
235 {CutAbsCharge, std::make_unique<TauSelectionCutAbsCharge>(this)},
236 {CutNTrack, std::make_unique<TauSelectionCutNTracks>(this)},
237 {CutJetRNNScoreSigTrans, std::make_unique<TauSelectionCutRNNJetScoreSigTrans>(this)},
238 {CutGNTauScoreSigTrans, std::make_unique<TauSelectionCutGNTauScoreSigTrans>(this)},
239 {CutJetIDWP, std::make_unique<TauSelectionCutJetIDWP>(this)},
240 {CutEleRNNScoreSigTrans, std::make_unique<TauSelectionCutRNNEleScoreSigTrans>(this)},
241 {CutEleIDWP, std::make_unique<TauSelectionCutEleIDWP>(this)},
242 {CutMuonOLR, std::make_unique<TauSelectionCutMuonOLR>(this)}
243 };
244
245 m_cMap = { std::make_move_iterator( begin(elements) ), std::make_move_iterator( end(elements) ) };
246
247 ATH_MSG_INFO( "Initializing TauSelectionTool" );
248 FillRegionVector(m_vPtRegion, m_dPtMin.value(), NAN);
249 FillRegionVector(m_vAbsEtaRegion, m_dAbsEtaMin.value(), m_dAbsEtaMax.value());
250 FillRegionVector(m_vJetRNNSigTransRegion, m_dJetRNNSigTransMin.value(), NAN );
251 FillRegionVector(m_vGNTauSigTransRegion, m_dGNTauSigTransMin.value(), NAN );
252 FillRegionVector(m_vEleRNNSigTransRegion, m_dEleRNNSigTransMin.value(), NAN );
253 FillValueVector(m_vAbsCharges, m_iAbsCharge.value());
254 FillValueVector(m_vNTracks, m_iNTrack.value());
255
256 PrintConfigRegion ("Pt", m_vPtRegion);
257 PrintConfigRegion ("AbsEta", m_vAbsEtaRegion);
258 PrintConfigValue ("AbsCharge", m_vAbsCharges);
259 PrintConfigValue ("NTrack", m_vNTracks);
260 PrintConfigRegion ("RNNJetScoreSigTrans", m_vJetRNNSigTransRegion);
261 PrintConfigRegion ("GNTauScoreSigTrans", m_vGNTauSigTransRegion);
262 PrintConfigRegion ("RNNEleScoreSigTrans", m_vEleRNNSigTransRegion);
263 PrintConfigValue ("JetIDWP", m_sJetIDWP);
264 PrintConfigValue ("JetIDWP ENUM",m_iJetIDWP);
265 PrintConfigValue ("EleIDWP", m_sEleIDWP);
266 PrintConfigValue ("EleIDWP ENUM",m_iEleIDWP);
267 PrintConfigValue ("EleIDVersion",m_iEleIDVersion);
268 PrintConfigValue ("MuonOLR", m_bMuonOLR);
269
270 std::string sCuts = "";
271 if (m_iSelectionCuts & CutPt) sCuts += "Pt ";
272 if (m_iSelectionCuts & CutAbsEta) sCuts += "AbsEta ";
273 if (m_iSelectionCuts & CutAbsCharge) sCuts += "AbsCharge ";
274 if (m_iSelectionCuts & CutNTrack) sCuts += "NTrack ";
275 if (m_iSelectionCuts & CutJetRNNScoreSigTrans) sCuts += "JetRNNScoreSigTrans ";
276 if (m_iSelectionCuts & CutGNTauScoreSigTrans) sCuts += "GNTauScoreSigTrans ";
277 if (m_iSelectionCuts & CutJetIDWP) sCuts += "JetIDWP ";
278 if (m_iSelectionCuts & CutEleRNNScoreSigTrans) sCuts += "EleRNNScoreSigTrans ";
279 if (m_iSelectionCuts & CutEleIDWP) sCuts += "EleIDWP ";
280 if (m_iSelectionCuts & CutMuonOLR) sCuts += "MuonOLR ";
281
282 ATH_MSG_DEBUG( "cuts: " << sCuts);
283
284 if (m_bCreateControlPlots)
285 setupCutFlowHistogram();
286
287 for ( const auto& entry : m_cMap ) {
288 if ( m_iSelectionCuts &entry.first ) {
289 entry.second->setAcceptInfo(m_aAccept);
290 }
291 }
292
293 return StatusCode::SUCCESS;
294}
295
296
297//______________________________________________________________________________
298StatusCode TauSelectionTool::beginEvent()
299{
300 return StatusCode::SUCCESS;
301}
302
303//______________________________________________________________________________
304const asg::AcceptInfo& TauSelectionTool::getAcceptInfo() const
305{
306 return m_aAccept;
307}
308
309//______________________________________________________________________________
310asg::AcceptData TauSelectionTool::accept( const xAOD::IParticle* xP ) const
311{
312 // Check if this is a tau:
313 if( xP->type() != xAOD::Type::Tau )
314 {
315 ATH_MSG_ERROR( "accept(...) Function received a non-tau" );
316 return asg::AcceptData (&m_aAccept);
317 }
318
319 // Cast it to a tau:
320 const xAOD::TauJet* xTau = dynamic_cast< const xAOD::TauJet* >( xP );
321 if( ! xTau )
322 {
323 ATH_MSG_FATAL( "accept(...) Failed to cast particle to tau" );
324 return asg::AcceptData (&m_aAccept);
325 }
326
327 // Let the specific function do the work:
328 return accept( *xTau );
329}
330
331//______________________________________________________________________________
332asg::AcceptData TauSelectionTool::accept( const xAOD::TauJet& xTau ) const
333{
334 asg::AcceptData acceptData (&m_aAccept);
335
336 int iNBin = 0;
337
338 if (m_bCreateControlPlots)
339 {
340 // fill cutflow 'All' bin
341 m_hCutFlow->Fill(iNBin);
342 // fill main distributions before all cuts
343 for (const auto& entry : m_cMap)
344 entry.second->fillHistogramCutPre(xTau);
345 }
346 try
347 {
348 for (const auto& entry : m_cMap)
349 {
350 if (m_iSelectionCuts & entry.first)
351 {
352 if (!entry.second->accept(xTau, acceptData))
353 return acceptData;
354 else
355 {
356 if (m_bCreateControlPlots)
357 {
358 // fill cutflow after each passed cut
359 iNBin++;
360 m_hCutFlow->Fill(iNBin);
361 }
362 }
363 }
364 }
365 }
366 catch (const std::runtime_error& error)
367 {
368 // LEGACY: In practical terms this should probably just throw, not
369 // print a warning/error and then continue on. However, I leave
370 // that to the experts who probably had a reason not to let the
371 // exception escape. For now I just downgraded it from error to
372 // warning and limited the number of warnings (04 Jan 22).
373 static std::atomic<uint64_t> warning_count (0u);
374 auto mycount = ++ warning_count;
375 if (mycount < 10u)
376 {
377 ATH_MSG_WARNING(error.what());
378 if (mycount == 9u)
379 ATH_MSG_WARNING ("this is your last warning");
380 }
381 }
382
383 // fill main distributions after all cuts
384 if (m_bCreateControlPlots)
385 {
386 for (const auto& entry : m_cMap)
387 entry.second->fillHistogramCut(xTau);
388 }
389
390 // // Return the result:
391 return acceptData;
392}
393
394//______________________________________________________________________________
395void TauSelectionTool::setOutFile( TFile* fOutFile )
396{
397 m_fOutFile = fOutFile;
398}
399
400//______________________________________________________________________________
401void TauSelectionTool::writeControlHistograms()
402{
403 if (m_bCreateControlPlots and !m_fOutFile)
404 ATH_MSG_WARNING("CreateControlPlots was set to true, but no valid file pointer was provided");
405 if (m_bCreateControlPlots and m_fOutFile)
406 {
408 m_fOutFile->mkdir((this->name()+"_control").c_str());
409 m_fOutFile->cd((this->name()+"_control").c_str());
411 m_hCutFlow->Write();
412
413 for (const auto& entry : m_cMap)
414 entry.second->writeControlHistograms();
415 }
416}
417
418
419//=================================PRIVATE-PART=================================
420void TauSelectionTool::setupCutFlowHistogram()
421{
422 // count number of cuts
423 int iNBins = 0;
424 for (const auto& entry : m_cMap)
425 if (m_iSelectionCuts & entry.first)
426 iNBins++;
427 // create cutflow histogram with iNBins+1 bins, where first bin is 'All' bin
428 m_hCutFlow = std::make_shared<TH1F>("hCutFlow","CutFlow;; events",iNBins+1,0,iNBins+1);
429 m_hCutFlow->GetXaxis()->SetBinLabel(1,"All");
430
431 // reusing this variable to reduce overhead
432 iNBins = 2;
433 // set bin labels
434 for (const auto& entry : m_cMap)
435 if (m_iSelectionCuts & entry.first)
436 {
437 m_hCutFlow->GetXaxis()->SetBinLabel(iNBins, entry.second->getName().c_str());
438 iNBins++;
439 }
440}
441
442//______________________________________________________________________________
443template<typename T, typename U>
444void TauSelectionTool::FillRegionVector(std::vector<T>& vRegion, U tMin, U tMax) const
445{
446 if (!vRegion.empty())
447 return;
448 if (tMin == tMin) // if tMin is NAN, then this assumption fails and -inf is added to the vector
449 vRegion.push_back(tMin);
450 else
451 vRegion.push_back(-std::numeric_limits<T>::infinity());
452
453 if (tMax == tMax) // if tMax is NAN, then this assumption fails and inf is added to the vector
454 vRegion.push_back(tMax);
455 else
456 vRegion.push_back(std::numeric_limits<T>::infinity());
457}
458
459//______________________________________________________________________________
460template<typename T, typename U>
461void TauSelectionTool::FillValueVector(std::vector<T>& vRegion, U tVal) const
462{
463 if (!vRegion.empty())
464 return;
465 if (tVal == tVal) // if tMax is NAN, then this assumption fails and nothing is added to the vector
466 vRegion.push_back(tVal);
467}
468
469//______________________________________________________________________________
470template<typename T>
471void TauSelectionTool::PrintConfigRegion(const std::string& sCutName, std::vector<T>& vRegion) const
472{
473 unsigned int iNumRegion = vRegion.size()/2;
474 for( unsigned int iRegion = 0; iRegion < iNumRegion; iRegion++ )
475 {
476 ATH_MSG_DEBUG( sCutName<<": " << vRegion.at(iRegion*2) << " to " << vRegion.at(iRegion*2+1) );
477 }
478}
479
480//______________________________________________________________________________
481template<typename T>
482void TauSelectionTool::PrintConfigValue(const std::string& sCutName, std::vector<T>& vRegion) const
483{
484 for (auto tVal : vRegion)
485 ATH_MSG_DEBUG( sCutName<<": " << tVal );
486}
487
488//______________________________________________________________________________
489template<typename T>
490void TauSelectionTool::PrintConfigValue(const std::string& sCutName, T& tVal) const
491{
492 ATH_MSG_DEBUG( sCutName<<": " << tVal );
493}
494
495//______________________________________________________________________________
496int TauSelectionTool::convertStrToJetIDWP(const std::string& sJetIDWP) const
497{
498 if (sJetIDWP == "JETIDNONE") return int(JETIDNONE);
499 else if (sJetIDWP == "JETIDRNNVERYLOOSE") return int(JETIDRNNVERYLOOSE);
500 else if (sJetIDWP == "JETIDRNNLOOSE") return int(JETIDRNNLOOSE);
501 else if (sJetIDWP == "JETIDRNNMEDIUM") return int(JETIDRNNMEDIUM);
502 else if (sJetIDWP == "JETIDRNNTIGHT") return int(JETIDRNNTIGHT);
503 else if (sJetIDWP == "JETIDGNTAUVERYLOOSE") return int(JETIDGNTAUVERYLOOSE);
504 else if (sJetIDWP == "JETIDGNTAULOOSE") return int(JETIDGNTAULOOSE);
505 else if (sJetIDWP == "JETIDGNTAUMEDIUM") return int(JETIDGNTAUMEDIUM);
506 else if (sJetIDWP == "JETIDGNTAUTIGHT") return int(JETIDGNTAUTIGHT);
507
508 ATH_MSG_ERROR( "jet ID working point "<<sJetIDWP<<" is unknown, the JetIDWP cut will not accept any tau!" );
509 return -1;
510}
511
512//______________________________________________________________________________
513int TauSelectionTool::convertStrToEleIDWP(const std::string& sEleIDWP) const
514{
515 if (sEleIDWP == "ELEIDNONE") return int(ELEIDNONE);
516 else if (sEleIDWP == "ELEIDRNNLOOSE") return int(ELEIDRNNLOOSE);
517 else if (sEleIDWP == "ELEIDRNNMEDIUM") return int(ELEIDRNNMEDIUM);
518 else if (sEleIDWP == "ELEIDRNNTIGHT") return int(ELEIDRNNTIGHT);
519
520 ATH_MSG_ERROR( "electron ID working point " << sEleIDWP << " is unknown, the EleIDWP cut will not accept any tau!" );
521 return -1;
522}
523
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
#define ADD_CMODE(name)
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Class providing the definition of the 4-vector interface.
virtual Type::ObjectType type() const =0
The type of the object as a simple enumeration.
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:179
StatusCode accept(const xAOD::Muon *mu)
@ Tau
The object is a tau (jet).
Definition ObjectType.h:49
TauJet_v3 TauJet
Definition of the current "tau version".
Definition TauJet.h:17