ATLAS Offline Software
TauSelectionTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Local include(s):
9 
10 // Framework include(s):
12 
13 // ROOT include(s)
14 #include "TEnv.h"
15 #include "THashList.h"
16 
17 // System include(s)
18 #include <atomic>
19 
20 using namespace TauAnalysisTools;
21 
22 //=================================PUBLIC-PART==================================
23 //______________________________________________________________________________
25  : asg::AsgMetadataTool( name )
26  , m_sJetIDWP("JETIDNONE")
27  , m_sEleIDWP("ELEIDNONE")
28  , m_fOutFile(nullptr)
29  , m_aAccept( "TauSelection" )
30 {
31  declareProperty( "CreateControlPlots", m_bCreateControlPlots = false);
32  /*
33  Baseline properties declaration:
34  properties containing 'Region' are a vector of lower and upper bounds
35  other properties named in plural are a list of exact values to cut on
36  other properties are single cuts
37  */
38  declareProperty( "ConfigPath", m_sConfigPath = "TauAnalysisTools/"+std::string(sSharedFilesVersion)+"/Selection/recommended_selection_r22.conf");
39  declareProperty( "SelectionCuts", m_iSelectionCuts = NoCut); // initialize with 'no' cuts
40  declareProperty( "PtRegion", m_vPtRegion = {}); // in GeV
41  declareProperty( "PtMin", m_dPtMin = NAN); // in GeV
42  declareProperty( "PtMax", m_dPtMax = NAN); // in GeV
43  declareProperty( "AbsEtaRegion", m_vAbsEtaRegion = {});
44  declareProperty( "AbsEtaMin", m_dAbsEtaMin = NAN);
45  declareProperty( "AbsEtaMax", m_dAbsEtaMax = NAN);
46  declareProperty( "AbsCharges", m_vAbsCharges = {});
47  declareProperty( "AbsCharge", m_iAbsCharge = NAN);
48  declareProperty( "NTracks", m_vNTracks = {});
49  declareProperty( "NTrack", m_iNTrack = NAN);
50  declareProperty( "JetRNNSigTransRegion", m_vJetRNNSigTransRegion = {});
51  declareProperty( "JetRNNSigTransMin", m_dJetRNNSigTransMin = NAN);
52  declareProperty( "JetRNNSigTransMax", m_dJetRNNSigTransMax = NAN);
53  declareProperty( "GNTauSigTransRegion", m_vGNTauSigTransRegion = {});
54  declareProperty( "GNTauSigTransMin", m_dGNTauSigTransMin = NAN);
55  declareProperty( "GNTauSigTransMax", m_dGNTauSigTransMax = NAN);
56  declareProperty( "JetIDWP", m_iJetIDWP = 0);
57  declareProperty( "EleRNNRegion", m_vEleRNNRegion = {});
58  declareProperty( "EleRNNMin", m_dEleRNNMin = NAN);
59  declareProperty( "EleRNNMax", m_dEleRNNMax = NAN);
60  declareProperty( "EleIDWP", m_iEleIDWP = 0);
61  declareProperty( "EleIDVersion", m_iEleIDVersion = 1);
62  declareProperty( "MuonOLR", m_bMuonOLR = false);
63 }
64 
65 //______________________________________________________________________________
67 {
68  m_cMap.clear();
69 }
70 
71 //______________________________________________________________________________
73 {
74  bool bConfigViaConfigFile = !m_sConfigPath.empty();
75  bool bConfigViaProperties = false;
76  if (!bConfigViaProperties and !m_vPtRegion.empty()) bConfigViaProperties = true;
77  if (!bConfigViaProperties and m_dPtMin == m_dPtMin) bConfigViaProperties = true;
78  if (!bConfigViaProperties and m_dPtMax == m_dPtMax) bConfigViaProperties = true;
79  if (!bConfigViaProperties and !m_vAbsEtaRegion.empty()) bConfigViaProperties = true;
80  if (!bConfigViaProperties and m_dAbsEtaMin == m_dAbsEtaMin) bConfigViaProperties = true;
81  if (!bConfigViaProperties and m_dAbsEtaMax == m_dAbsEtaMax) bConfigViaProperties = true;
82  if (!bConfigViaProperties and !m_vAbsCharges.empty()) bConfigViaProperties = true;
83  if (!bConfigViaProperties and m_iAbsCharge == m_iAbsCharge) bConfigViaProperties = true;
84  if (!bConfigViaProperties and !m_vNTracks.empty()) bConfigViaProperties = true;
85  if (!bConfigViaProperties and m_iNTrack == m_iNTrack) bConfigViaProperties = true;
86  if (!bConfigViaProperties and !m_vJetRNNSigTransRegion.empty()) bConfigViaProperties = true;
87  if (!bConfigViaProperties and m_dJetRNNSigTransMin == m_dJetRNNSigTransMin) bConfigViaProperties = true;
88  if (!bConfigViaProperties and m_dJetRNNSigTransMax == m_dJetRNNSigTransMax) bConfigViaProperties = true;
89  if (!bConfigViaProperties and !m_vGNTauSigTransRegion.empty()) bConfigViaProperties = true;
90  if (!bConfigViaProperties and m_dGNTauSigTransMin == m_dGNTauSigTransMin) bConfigViaProperties = true;
91  if (!bConfigViaProperties and m_dGNTauSigTransMax == m_dGNTauSigTransMax) bConfigViaProperties = true;
92  if (!bConfigViaProperties and m_iJetIDWP != 0) bConfigViaProperties = true;
93  if (!bConfigViaProperties and !m_vEleRNNRegion.empty()) bConfigViaProperties = true;
94  if (!bConfigViaProperties and m_dEleRNNMin == m_dEleRNNMin) bConfigViaProperties = true;
95  if (!bConfigViaProperties and m_dEleRNNMax == m_dEleRNNMax) bConfigViaProperties = true;
96  if (!bConfigViaProperties and m_iEleIDWP != 0) bConfigViaProperties = true;
97  if (!bConfigViaProperties and m_bMuonOLR) bConfigViaProperties = true;
98 
99  if (bConfigViaConfigFile and bConfigViaProperties)
100  {
101  ATH_MSG_WARNING("Configured tool via setProperty and configuration file, which may lead to unexpected configuration.");
102  ATH_MSG_WARNING("In doubt check the configuration that is printed when the tool is initialized and the message level is set to debug");
103  ATH_MSG_WARNING("For further details please refer to the documentation:");
104  ATH_MSG_WARNING("https://gitlab.cern.ch/atlas/athena/blob/master/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst");
105  }
106  if (!bConfigViaConfigFile and !bConfigViaProperties)
107  {
108  ATH_MSG_WARNING("No cut configuration provided, the tool will not do anything. For further details please refer to the documentation:");
109  ATH_MSG_WARNING("https://gitlab.cern.ch/atlas/athena/blob/master/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst");
110  }
111 
112  if (bConfigViaConfigFile)
113  {
114  TEnv rEnv;
115  std::string sInputFilePath = PathResolverFindCalibFile(m_sConfigPath);
116 
117  if (!testFileForEOFContainsCharacters(sInputFilePath))
118  ATH_MSG_WARNING("Config file for TauSelectionTool with path "<<sInputFilePath<<" does not contain an empty last line. The tool might not be properly configured!");
119 
120  rEnv.ReadFile(sInputFilePath.c_str(),
121  kEnvAll);
122 
123  std::vector<std::string> vCuts;
124  // if Cuts are specified in the config file take these ones, if not take all
125  // specified in the config
126  if (rEnv.Defined("SelectionCuts"))
127  TauAnalysisTools::split(rEnv, "SelectionCuts", ' ', vCuts);
128  else
129  {
130  auto lList = rEnv.GetTable();
131  for( Int_t i = 0; i < lList->GetEntries(); ++i )
132  {
133  vCuts.push_back( lList->At( i )->GetName() );
134  }
135  }
136 
137  int iSelectionCuts = 0;
138 
139  for (const std::string& sCut : vCuts)
140  {
141  if (sCut == "PtRegion")
142  {
143  iSelectionCuts = iSelectionCuts | CutPt;
144  if (m_vPtRegion.empty())
145  TauAnalysisTools::split(rEnv,"PtRegion", ';', m_vPtRegion);
146  }
147  else if (sCut == "PtMin")
148  {
149  iSelectionCuts = iSelectionCuts | CutPt;
150  if (m_dPtMin != m_dPtMin)
151  m_dPtMin = rEnv.GetValue("PtMin",NAN);
152  }
153  else if (sCut == "PtMax")
154  {
155  iSelectionCuts = iSelectionCuts | CutPt;
156  if (m_dPtMax != m_dPtMax)
157  m_dPtMax = rEnv.GetValue("PtMax",NAN);
158  }
159  else if (sCut == "AbsEtaRegion")
160  {
161  iSelectionCuts = iSelectionCuts | CutAbsEta;
162  if (m_vAbsEtaRegion.empty())
163  TauAnalysisTools::split(rEnv,"AbsEtaRegion", ';', m_vAbsEtaRegion);
164  }
165  else if (sCut == "AbsEtaMin")
166  {
167  iSelectionCuts = iSelectionCuts | CutAbsEta;
168  if (m_dAbsEtaMin != m_dAbsEtaMin)
169  m_dAbsEtaMin = rEnv.GetValue("AbsEtaMin",NAN);
170  }
171  else if (sCut == "AbsEtaMax")
172  {
173  iSelectionCuts = iSelectionCuts | CutAbsEta;
174  if (m_dAbsEtaMax != m_dAbsEtaMax)
175  m_dAbsEtaMax = rEnv.GetValue("AbsEtaMax",NAN);
176  }
177  else if (sCut == "AbsCharges")
178  {
179  iSelectionCuts = iSelectionCuts | CutAbsCharge;
180  if (m_vAbsCharges.empty())
181  TauAnalysisTools::split(rEnv,"AbsCharges", ';', m_vAbsCharges);
182  }
183  else if (sCut == "AbsCharge")
184  {
185  iSelectionCuts = iSelectionCuts | CutAbsCharge;
186  if (m_iAbsCharge != m_iAbsCharge)
187  m_iAbsCharge = rEnv.GetValue("AbsCharge",NAN);
188  }
189  else if (sCut == "NTracks")
190  {
191  iSelectionCuts = iSelectionCuts | CutNTrack;
192  if (m_vNTracks.empty())
193  TauAnalysisTools::split(rEnv,"NTracks", ';', m_vNTracks);
194  }
195  else if (sCut == "NTrack")
196  {
197  iSelectionCuts = iSelectionCuts | CutNTrack;
198  if (m_iNTrack != m_iNTrack)
199  m_iNTrack = rEnv.GetValue("NTrack",NAN);
200  }
201  else if (sCut == "JetRNNSigTransRegion")
202  {
203  iSelectionCuts = iSelectionCuts | CutJetRNNScoreSigTrans;
204  if (m_vJetRNNSigTransRegion.empty())
205  TauAnalysisTools::split(rEnv,"JetRNNSigTransRegion", ';', m_vJetRNNSigTransRegion);
206  }
207  else if (sCut == "JetRNNSigTransMin")
208  {
209  iSelectionCuts = iSelectionCuts | CutJetRNNScoreSigTrans;
211  m_dJetRNNSigTransMin = rEnv.GetValue("JetRNNSigTransMin",NAN);
212  }
213  else if (sCut == "JetRNNSigTransMax")
214  {
215  iSelectionCuts = iSelectionCuts | CutJetRNNScoreSigTrans;
217  m_dJetRNNSigTransMax = rEnv.GetValue("JetRNNSigTransMax",NAN);
218  }
219  else if (sCut == "GNTauSigTransRegion")
220  {
221  iSelectionCuts = iSelectionCuts | CutGNTauScoreSigTrans;
222  if (m_vGNTauSigTransRegion.empty())
223  TauAnalysisTools::split(rEnv,"GNTauSigTransRegion", ';', m_vGNTauSigTransRegion);
224  }
225  else if (sCut == "GNTauSigTransMin")
226  {
227  iSelectionCuts = iSelectionCuts | CutGNTauScoreSigTrans;
229  m_dGNTauSigTransMin = rEnv.GetValue("GNTauSigTransMin",NAN);
230  }
231  else if (sCut == "GNTauSigTransMax")
232  {
233  iSelectionCuts = iSelectionCuts | CutGNTauScoreSigTrans;
235  m_dGNTauSigTransMax = rEnv.GetValue("GNTauSigTransMax",NAN);
236  }
237  else if (sCut == "EleRNNRegion")
238  {
239  iSelectionCuts = iSelectionCuts | CutEleRNNScore;
240  if (m_vEleRNNRegion.empty())
241  TauAnalysisTools::split(rEnv,"EleRNNRegion", ';', m_vEleRNNRegion);
242  }
243  else if (sCut == "EleRNNMin")
244  {
245  iSelectionCuts = iSelectionCuts | CutEleRNNScore;
246  if (m_dEleRNNMin != m_dEleRNNMin)
247  m_dEleRNNMin = rEnv.GetValue("EleRNNMin",NAN);
248  }
249  else if (sCut == "EleRNNMax")
250  {
251  iSelectionCuts = iSelectionCuts | CutEleRNNScore;
252  if (m_dEleRNNMax != m_dEleRNNMax)
253  m_dEleRNNMax = rEnv.GetValue("EleRNNMax",NAN);
254  }
255  else if (sCut == "JetIDWP")
256  {
257  iSelectionCuts = iSelectionCuts | CutJetIDWP;
259  m_iJetIDWP = convertStrToJetIDWP(rEnv.GetValue("JetIDWP","JETIDNONE"));
260  }
261  else if (sCut == "EleIDWP")
262  {
263  iSelectionCuts = iSelectionCuts | CutEleIDWP;
265  m_iEleIDWP = convertStrToEleIDWP(rEnv.GetValue("EleIDWP","ELEIDNONE"));
266  }
267  else if (sCut == "MuonOLR")
268  {
269  iSelectionCuts = iSelectionCuts | CutMuonOLR;
270  if (!m_bMuonOLR)
271  m_bMuonOLR = rEnv.GetValue("MuonOLR",false);
272  }
273  else ATH_MSG_WARNING("Cut " << sCut << " is not available");
274  }
275 
276  if (m_iSelectionCuts == NoCut)
277  m_iSelectionCuts = iSelectionCuts;
278  }
279 
282 
283  // initialise the ReadHandleKey of the muon container when the muon veto is applied
285 
286  ATH_CHECK( m_tauContainerKey.initialize() );
287 
288  // initialise the ReadDecorHandleKey if GNTau is applied
290  ATH_CHECK( m_GNTauDecorKey.assign(m_tauContainerKey.key()+".GNTauScoreSigTrans_v0"));
291  }
293 
294  // initialise the ReadDecorHandleKey if eVeto is applied
296  ATH_CHECK( m_eVetoDecorKey.assign(m_tauContainerKey.key()+".RNNEleScoreSigTrans_v"+std::to_string(m_iEleIDVersion)) );
297  }
299 
300  // specify all available cut descriptions
301  using map_type = std::map<SelectionCuts, std::unique_ptr<TauAnalysisTools::TauSelectionCut>>;
302  using pair_type = map_type::value_type;
303 
304  pair_type elements[] =
305  {
306  {CutPt, std::make_unique<TauAnalysisTools::TauSelectionCutPt>(this)},
307  {CutAbsEta, std::make_unique<TauAnalysisTools::TauSelectionCutAbsEta>(this)},
308  {CutAbsCharge, std::make_unique<TauAnalysisTools::TauSelectionCutAbsCharge>(this)},
309  {CutNTrack, std::make_unique<TauAnalysisTools::TauSelectionCutNTracks>(this)},
310  {CutJetRNNScoreSigTrans, std::make_unique<TauAnalysisTools::TauSelectionCutRNNJetScoreSigTrans>(this)},
311  {CutGNTauScoreSigTrans, std::make_unique<TauAnalysisTools::TauSelectionCutGNTauScoreSigTrans>(this)},
312  {CutJetIDWP, std::make_unique<TauAnalysisTools::TauSelectionCutJetIDWP>(this)},
313  {CutEleRNNScore, std::make_unique<TauAnalysisTools::TauSelectionCutRNNEleScore>(this)},
314  {CutEleIDWP, std::make_unique<TauAnalysisTools::TauSelectionCutEleIDWP>(this)},
315  {CutMuonOLR, std::make_unique<TauAnalysisTools::TauSelectionCutMuonOLR>(this)}
316  };
317 
318  m_cMap = { std::make_move_iterator( begin(elements) ), std::make_move_iterator( end(elements) ) };
319 
320  ATH_MSG_INFO( "Initializing TauSelectionTool" );
328 
331  PrintConfigValue ("AbsCharge", m_vAbsCharges);
332  PrintConfigValue ("NTrack", m_vNTracks);
333  PrintConfigRegion ("RNNJetScoreSigTrans", m_vJetRNNSigTransRegion);
334  PrintConfigRegion ("GNTauScoreSigTrans", m_vGNTauSigTransRegion);
335  PrintConfigRegion ("RNNEleScore", m_vEleRNNRegion);
336  PrintConfigValue ("JetIDWP", m_sJetIDWP);
337  PrintConfigValue ("JetIDWP ENUM",m_iJetIDWP);
338  PrintConfigValue ("EleIDWP", m_sEleIDWP);
339  PrintConfigValue ("EleIDWP ENUM",m_iEleIDWP);
340  PrintConfigValue ("EleIDVersion",m_iEleIDVersion);
341  PrintConfigValue ("MuonOLR", m_bMuonOLR);
342 
343  std::string sCuts = "";
344  if (m_iSelectionCuts & CutPt) sCuts += "Pt ";
345  if (m_iSelectionCuts & CutAbsEta) sCuts += "AbsEta ";
346  if (m_iSelectionCuts & CutAbsCharge) sCuts += "AbsCharge ";
347  if (m_iSelectionCuts & CutNTrack) sCuts += "NTrack ";
348  if (m_iSelectionCuts & CutJetRNNScoreSigTrans) sCuts += "JetRNNScoreSigTrans ";
349  if (m_iSelectionCuts & CutGNTauScoreSigTrans) sCuts += "GNTauScoreSigTrans ";
350  if (m_iSelectionCuts & CutJetIDWP) sCuts += "JetIDWP ";
351  if (m_iSelectionCuts & CutEleRNNScore) sCuts += "EleRNNScore ";
352  if (m_iSelectionCuts & CutEleIDWP) sCuts += "EleIDWP ";
353  if (m_iSelectionCuts & CutMuonOLR) sCuts += "MuonOLR ";
354 
355  ATH_MSG_DEBUG( "cuts: " << sCuts);
356 
359 
360  for ( const auto& entry : m_cMap ) {
361  if ( m_iSelectionCuts &entry.first ) {
362  entry.second->setAcceptInfo(m_aAccept);
363  }
364  }
365 
366  return StatusCode::SUCCESS;
367 }
368 
369 
370 //______________________________________________________________________________
372 {
373  return StatusCode::SUCCESS;
374 }
375 
376 //______________________________________________________________________________
378 {
379  return m_aAccept;
380 }
381 
382 //______________________________________________________________________________
384 {
385  // Check if this is a tau:
386  if( xP->type() != xAOD::Type::Tau )
387  {
388  ATH_MSG_ERROR( "accept(...) Function received a non-tau" );
389  return asg::AcceptData (&m_aAccept);
390  }
391 
392  // Cast it to a tau:
393  const xAOD::TauJet* xTau = dynamic_cast< const xAOD::TauJet* >( xP );
394  if( ! xTau )
395  {
396  ATH_MSG_FATAL( "accept(...) Failed to cast particle to tau" );
397  return asg::AcceptData (&m_aAccept);
398  }
399 
400  // Let the specific function do the work:
401  return accept( *xTau );
402 }
403 
404 //______________________________________________________________________________
406 {
407  asg::AcceptData acceptData (&m_aAccept);
408 
409  int iNBin = 0;
410 
412  {
413  // fill cutflow 'All' bin
414  m_hCutFlow->Fill(iNBin);
415  // fill main distributions before all cuts
416  for (const auto& entry : m_cMap)
417  entry.second->fillHistogramCutPre(xTau);
418  }
419  try
420  {
421  for (const auto& entry : m_cMap)
422  {
423  if (m_iSelectionCuts & entry.first)
424  {
425  if (!entry.second->accept(xTau, acceptData))
426  return acceptData;
427  else
428  {
430  {
431  // fill cutflow after each passed cut
432  iNBin++;
433  m_hCutFlow->Fill(iNBin);
434  }
435  }
436  }
437  }
438  }
439  catch (const std::runtime_error& error)
440  {
441  // LEGACY: In practical terms this should probably just throw, not
442  // print a warning/error and then continue on. However, I leave
443  // that to the experts who probably had a reason not to let the
444  // exception escape. For now I just downgraded it from error to
445  // warning and limited the number of warnings (04 Jan 22).
446  static std::atomic<uint64_t> warning_count (0u);
447  auto mycount = ++ warning_count;
448  if (mycount < 10u)
449  {
450  ATH_MSG_WARNING(error.what());
451  if (mycount == 9u)
452  ATH_MSG_WARNING ("this is your last warning");
453  }
454  }
455 
456  // fill main distributions after all cuts
458  {
459  for (const auto& entry : m_cMap)
460  entry.second->fillHistogramCut(xTau);
461  }
462 
463  // // Return the result:
464  return acceptData;
465 }
466 
467 //______________________________________________________________________________
468 void TauSelectionTool::setOutFile( TFile* fOutFile )
469 {
470  m_fOutFile = fOutFile;
471 }
472 
473 //______________________________________________________________________________
475 {
477  ATH_MSG_WARNING("CreateControlPlots was set to true, but no valid file pointer was provided");
479  {
481  m_fOutFile->mkdir((this->name()+"_control").c_str());
482  m_fOutFile->cd((this->name()+"_control").c_str());
484  m_hCutFlow->Write();
485 
486  for (const auto& entry : m_cMap)
487  entry.second->writeControlHistograms();
488  }
489 }
490 
491 
492 //=================================PRIVATE-PART=================================
494 {
495  // count number of cuts
496  int iNBins = 0;
497  for (const auto& entry : m_cMap)
498  if (m_iSelectionCuts & entry.first)
499  iNBins++;
500  // create cutflow histogram with iNBins+1 bins, where first bin is 'All' bin
501  m_hCutFlow = std::make_shared<TH1F>("hCutFlow","CutFlow;; events",iNBins+1,0,iNBins+1);
502  m_hCutFlow->GetXaxis()->SetBinLabel(1,"All");
503 
504  // reusing this variable to reduce overhead
505  iNBins = 2;
506  // set bin labels
507  for (const auto& entry : m_cMap)
508  if (m_iSelectionCuts & entry.first)
509  {
510  m_hCutFlow->GetXaxis()->SetBinLabel(iNBins, entry.second->getName().c_str());
511  iNBins++;
512  }
513 }
514 
515 //______________________________________________________________________________
516 template<typename T, typename U>
517 void TauSelectionTool::FillRegionVector(std::vector<T>& vRegion, U tMin, U tMax) const
518 {
519  if (!vRegion.empty())
520  return;
521  if (tMin == tMin) // if tMin is NAN, then this assumption fails and -inf is added to the vector
522  vRegion.push_back(tMin);
523  else
524  vRegion.push_back(-std::numeric_limits<T>::infinity());
525 
526  if (tMax == tMax) // if tMax is NAN, then this assumption fails and inf is added to the vector
527  vRegion.push_back(tMax);
528  else
529  vRegion.push_back(std::numeric_limits<T>::infinity());
530 }
531 
532 //______________________________________________________________________________
533 template<typename T, typename U>
534 void TauSelectionTool::FillValueVector(std::vector<T>& vRegion, U tVal) const
535 {
536  if (!vRegion.empty())
537  return;
538  if (tVal == tVal) // if tMax is NAN, then this assumption fails and nothing is added to the vector
539  vRegion.push_back(tVal);
540 }
541 
542 //______________________________________________________________________________
543 template<typename T>
544 void TauSelectionTool::PrintConfigRegion(const std::string& sCutName, std::vector<T>& vRegion) const
545 {
546  unsigned int iNumRegion = vRegion.size()/2;
547  for( unsigned int iRegion = 0; iRegion < iNumRegion; iRegion++ )
548  {
549  ATH_MSG_DEBUG( sCutName<<": " << vRegion.at(iRegion*2) << " to " << vRegion.at(iRegion*2+1) );
550  }
551 }
552 
553 //______________________________________________________________________________
554 template<typename T>
555 void TauSelectionTool::PrintConfigValue(const std::string& sCutName, std::vector<T>& vRegion) const
556 {
557  for (auto tVal : vRegion)
558  ATH_MSG_DEBUG( sCutName<<": " << tVal );
559 }
560 
561 //______________________________________________________________________________
562 template<typename T>
563 void TauSelectionTool::PrintConfigValue(const std::string& sCutName, T& tVal) const
564 {
565  ATH_MSG_DEBUG( sCutName<<": " << tVal );
566 }
567 
568 //______________________________________________________________________________
569 int TauSelectionTool::convertStrToJetIDWP(const std::string& sJetIDWP) const
570 {
571  if (sJetIDWP == "JETIDNONE") return int(JETIDNONE);
572  else if (sJetIDWP == "JETIDRNNVERYLOOSE") return int(JETIDRNNVERYLOOSE);
573  else if (sJetIDWP == "JETIDRNNLOOSE") return int(JETIDRNNLOOSE);
574  else if (sJetIDWP == "JETIDRNNMEDIUM") return int(JETIDRNNMEDIUM);
575  else if (sJetIDWP == "JETIDRNNTIGHT") return int(JETIDRNNTIGHT);
576  else if (sJetIDWP == "JETIDGNTAUVERYLOOSE") return int(JETIDGNTAUVERYLOOSE);
577  else if (sJetIDWP == "JETIDGNTAULOOSE") return int(JETIDGNTAULOOSE);
578  else if (sJetIDWP == "JETIDGNTAUMEDIUM") return int(JETIDGNTAUMEDIUM);
579  else if (sJetIDWP == "JETIDGNTAUTIGHT") return int(JETIDGNTAUTIGHT);
580 
581  ATH_MSG_ERROR( "jet ID working point "<<sJetIDWP<<" is unknown, the JetIDWP cut will not accept any tau!" );
582  return -1;
583 }
584 
585 //______________________________________________________________________________
586 int TauSelectionTool::convertStrToEleIDWP(const std::string& sEleIDWP) const
587 {
588  if (sEleIDWP == "ELEIDNONE") return int(ELEIDNONE);
589  else if (sEleIDWP == "ELEIDRNNLOOSE") return int(ELEIDRNNLOOSE);
590  else if (sEleIDWP == "ELEIDRNNMEDIUM") return int(ELEIDRNNMEDIUM);
591  else if (sEleIDWP == "ELEIDRNNTIGHT") return int(ELEIDRNNTIGHT);
592 
593  ATH_MSG_ERROR( "electron ID working point " << sEleIDWP << " is unknown, the EleIDWP cut will not accept any tau!" );
594  return -1;
595 }
596 
597 //______________________________________________________________________________
598 std::string TauSelectionTool::convertJetIDWPToStr(int iJetIDWP) const
599 {
600  switch (iJetIDWP)
601  {
603  return "JETIDNONE";
604  case JETIDNONE:
605  return "JETIDNONE";
606  case JETIDRNNVERYLOOSE:
607  return "JETIDRNNVERYLOOSE";
608  case JETIDRNNLOOSE:
609  return "JETIDRNNLOOSE";
610  case JETIDRNNMEDIUM:
611  return "JETIDRNNMEDIUM";
612  case JETIDRNNTIGHT:
613  return "JETIDRNNTIGHT";
614  case JETIDGNTAUVERYLOOSE:
615  return "JETIDGNTAUVERYLOOSE";
616  case JETIDGNTAULOOSE:
617  return "JETIDGNTAULOOSE";
618  case JETIDGNTAUMEDIUM:
619  return "JETIDGNTAUMEDIUM";
620  case JETIDGNTAUTIGHT:
621  return "JETIDGNTAUTIGHT";
622 
623  default:
624  ATH_MSG_WARNING( "JetID working point with enum " << iJetIDWP << " is unknown, the JetIDWP cut will not accept any tau!" );
625  return "";
626  }
627 }
628 
629 //______________________________________________________________________________
630 std::string TauSelectionTool::convertEleIDWPToStr(int iEleIDWP) const
631 {
632  switch (iEleIDWP)
633  {
635  return "ELEIDNONE";
636  case ELEIDNONE:
637  return "ELEIDNONE";
638  case ELEIDRNNLOOSE:
639  return "ELEIDRNNLOOSE";
640  case ELEIDRNNMEDIUM:
641  return "ELEIDRNNMEDIUM";
642  case ELEIDRNNTIGHT:
643  return "ELEIDRNNTIGHT";
644  default:
645  ATH_MSG_WARNING( "EleID working point with enum " << iEleIDWP << " is unknown, the EleIDWP cut will not accept any tau!" );
646  return "";
647  }
648 }
TauAnalysisTools::TauSelectionTool::m_vPtRegion
std::vector< float > m_vPtRegion
Definition: TauSelectionTool.h:119
TauAnalysisTools
Definition: TruthCollectionMakerTau.h:16
TauAnalysisTools::CutAbsEta
@ CutAbsEta
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:43
TauAnalysisTools::TauSelectionTool::convertStrToEleIDWP
int convertStrToEleIDWP(const std::string &sEleIDWP) const
Definition: TauSelectionTool.cxx:586
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
TauAnalysisTools::TauSelectionTool::m_dAbsEtaMax
float m_dAbsEtaMax
Definition: TauSelectionTool.h:145
TauAnalysisTools::ELEIDNONEUNCONFIGURED
@ ELEIDNONEUNCONFIGURED
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:31
TauAnalysisTools::TauSelectionTool::m_dEleRNNMin
float m_dEleRNNMin
Definition: TauSelectionTool.h:152
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TauAnalysisTools::CutMuonOLR
@ CutMuonOLR
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:50
TauAnalysisTools::TauSelectionTool::setupCutFlowHistogram
void setupCutFlowHistogram()
Definition: TauSelectionTool.cxx:493
TauAnalysisTools::TauSelectionTool::m_sJetIDWP
std::string m_sJetIDWP
Definition: TauSelectionTool.h:131
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
TauAnalysisTools::JETIDRNNTIGHT
@ JETIDRNNTIGHT
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:22
TauAnalysisTools::TauSelectionTool::m_hCutFlow
std::shared_ptr< TH1F > m_hCutFlow
Definition: TauSelectionTool.h:157
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
TauAnalysisTools::JETIDRNNMEDIUM
@ JETIDRNNMEDIUM
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:21
TauAnalysisTools::TauSelectionTool::m_dPtMin
float m_dPtMin
Definition: TauSelectionTool.h:142
TauAnalysisTools::JETIDGNTAULOOSE
@ JETIDGNTAULOOSE
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:24
PlotCalibFromCool.begin
begin
Definition: PlotCalibFromCool.py:94
TauAnalysisTools::TauSelectionTool::FillRegionVector
void FillRegionVector(std::vector< T > &vRegion, U tMin, U tMax) const
Definition: TauSelectionTool.cxx:517
asg
Definition: DataHandleTestTool.h:28
TauAnalysisTools::TauSelectionTool::m_vJetRNNSigTransRegion
std::vector< float > m_vJetRNNSigTransRegion
Definition: TauSelectionTool.h:127
TauAnalysisTools::TauSelectionTool::m_sConfigPath
std::string m_sConfigPath
Definition: TauSelectionTool.h:160
TauAnalysisTools::TauSelectionTool::setOutFile
virtual void setOutFile(TFile *fOutFile) override
Set output file for control histograms.
Definition: TauSelectionTool.cxx:468
TauAnalysisTools::TauSelectionTool::m_vGNTauSigTransRegion
std::vector< float > m_vGNTauSigTransRegion
Definition: TauSelectionTool.h:129
TauAnalysisTools::JETIDRNNLOOSE
@ JETIDRNNLOOSE
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:20
xAOD::IParticle::type
virtual Type::ObjectType type() const =0
The type of the object as a simple enumeration.
TauAnalysisTools::TauSelectionTool::initialize
virtual StatusCode initialize() override
Function initialising the tool.
Definition: TauSelectionTool.cxx:72
TauAnalysisTools::testFileForEOFContainsCharacters
bool testFileForEOFContainsCharacters(const std::string &sFileName)
returns true if last line in file is empty or the line starts with the number sign
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:279
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:40
TauAnalysisTools::JETIDNONE
@ JETIDNONE
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:14
TauAnalysisTools::CutJetIDWP
@ CutJetIDWP
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:47
TauAnalysisTools::TauSelectionTool::m_dJetRNNSigTransMax
float m_dJetRNNSigTransMax
Definition: TauSelectionTool.h:149
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:83
TauAnalysisTools::TauSelectionTool::PrintConfigValue
void PrintConfigValue(const std::string &sCutName, std::vector< T > &vRegion) const
Definition: TauSelectionTool.cxx:555
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
TauAnalysisTools::ELEIDRNNLOOSE
@ ELEIDRNNLOOSE
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:33
TauAnalysisTools::TauSelectionTool::m_cMap
std::map< SelectionCuts, std::unique_ptr< TauAnalysisTools::TauSelectionCut > > m_cMap
Definition: TauSelectionTool.h:167
TauAnalysisTools::TauSelectionTool::~TauSelectionTool
virtual ~TauSelectionTool()
Definition: TauSelectionTool.cxx:66
TauAnalysisTools::TauSelectionTool::FillValueVector
void FillValueVector(std::vector< T > &vRegion, U tVal) const
Definition: TauSelectionTool.cxx:534
TauAnalysisTools::TauSelectionTool::m_vEleRNNRegion
std::vector< float > m_vEleRNNRegion
Definition: TauSelectionTool.h:134
TauAnalysisTools::TauSelectionTool::m_dGNTauSigTransMin
float m_dGNTauSigTransMin
Definition: TauSelectionTool.h:150
SharedFilesVersion.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
asg::AcceptInfo
Definition: AcceptInfo.h:28
TauSelectionCuts.h
TauAnalysisTools::JETIDGNTAUVERYLOOSE
@ JETIDGNTAUVERYLOOSE
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:23
TauAnalysisTools::TauSelectionTool::m_iEleIDWP
int m_iEleIDWP
Definition: TauSelectionTool.h:137
TauAnalysisTools::ELEIDNONE
@ ELEIDNONE
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:32
lumiFormat.i
int i
Definition: lumiFormat.py:92
TauAnalysisTools::TauSelectionTool::m_dEleRNNMax
float m_dEleRNNMax
Definition: TauSelectionTool.h:153
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
TauAnalysisTools::TauSelectionTool::convertEleIDWPToStr
std::string convertEleIDWPToStr(int iEleIDWP) const
Definition: TauSelectionTool.cxx:630
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
TauAnalysisTools::TauSelectionTool::m_vNTracks
std::vector< unsigned > m_vNTracks
Definition: TauSelectionTool.h:125
TauAnalysisTools::TauSelectionTool::m_fOutFile
TFile * m_fOutFile
Definition: TauSelectionTool.h:156
TauAnalysisTools::TauSelectionTool::beginEvent
virtual StatusCode beginEvent() override
Function called when a new events is loaded.
Definition: TauSelectionTool.cxx:371
TauAnalysisTools::TauSelectionTool::PrintConfigRegion
void PrintConfigRegion(const std::string &sCutName, std::vector< T > &vRegion) const
Definition: TauSelectionTool.cxx:544
TauAnalysisTools::CutGNTauScoreSigTrans
@ CutGNTauScoreSigTrans
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:52
TauAnalysisTools::TauSelectionTool::writeControlHistograms
virtual void writeControlHistograms() override
Write control histograms to output file.
Definition: TauSelectionTool.cxx:474
TauAnalysisTools::TauSelectionTool::m_sEleIDWP
std::string m_sEleIDWP
Definition: TauSelectionTool.h:136
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
TauAnalysisTools::ELEIDRNNMEDIUM
@ ELEIDRNNMEDIUM
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:34
TauAnalysisTools::TauSelectionTool::m_dGNTauSigTransMax
float m_dGNTauSigTransMax
Definition: TauSelectionTool.h:151
TauAnalysisTools::TauSelectionTool::m_dAbsEtaMin
float m_dAbsEtaMin
Definition: TauSelectionTool.h:144
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
TauAnalysisTools::TauSelectionTool::m_vAbsCharges
std::vector< int > m_vAbsCharges
Definition: TauSelectionTool.h:123
TauAnalysisTools::TauSelectionTool::m_iSelectionCuts
int m_iSelectionCuts
Definition: TauSelectionTool.h:117
PathResolver.h
TauAnalysisTools::CutNTrack
@ CutNTrack
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:45
TauAnalysisTools::ELEIDRNNTIGHT
@ ELEIDRNNTIGHT
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:35
TauAnalysisTools::TauSelectionTool::m_eVetoDecorKey
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_eVetoDecorKey
Definition: TauSelectionTool.h:164
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
TauAnalysisTools::CutEleRNNScore
@ CutEleRNNScore
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:48
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
TauAnalysisTools::CutJetRNNScoreSigTrans
@ CutJetRNNScoreSigTrans
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:51
TauAnalysisTools::TauSelectionTool::m_bCreateControlPlots
bool m_bCreateControlPlots
Definition: TauSelectionTool.h:176
TauAnalysisTools::TauSelectionTool::accept
virtual asg::AcceptData accept(const xAOD::IParticle *p) const override
Get the decision using a generic IParticle pointer.
Definition: TauSelectionTool.cxx:383
TauAnalysisTools::TauSelectionTool::m_vAbsEtaRegion
std::vector< float > m_vAbsEtaRegion
Definition: TauSelectionTool.h:121
TauSelectionTool.h
TauAnalysisTools::TauSelectionTool::convertStrToJetIDWP
int convertStrToJetIDWP(const std::string &sJetIDWP) const
Definition: TauSelectionTool.cxx:569
TauAnalysisTools::CutEleIDWP
@ CutEleIDWP
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:49
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
TauAnalysisTools::CutAbsCharge
@ CutAbsCharge
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:46
TauAnalysisTools::TauSelectionTool::getAcceptInfo
virtual const asg::AcceptInfo & getAcceptInfo() const override
Get an object describing the "selection steps" of the tool.
Definition: TauSelectionTool.cxx:377
TauAnalysisTools::TauSelectionTool::m_muonContainerKey
SG::ReadHandleKey< xAOD::MuonContainer > m_muonContainerKey
Definition: TauSelectionTool.h:162
TauAnalysisTools::TauSelectionTool::m_GNTauDecorKey
SG::ReadDecorHandleKey< xAOD::TauJetContainer > m_GNTauDecorKey
Definition: TauSelectionTool.h:165
TauAnalysisTools::TauSelectionTool::TauSelectionTool
TauSelectionTool(const std::string &name)
Constructor for standalone usage.
Definition: TauSelectionTool.cxx:24
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
TauAnalysisTools::TauSelectionTool::m_tauContainerKey
SG::ReadHandleKey< xAOD::TauJetContainer > m_tauContainerKey
Definition: TauSelectionTool.h:163
TauAnalysisTools::TauSelectionTool::m_aAccept
asg::AcceptInfo m_aAccept
Object used to store selection information.
Definition: TauSelectionTool.h:179
TauAnalysisTools::TauSelectionTool::m_iJetIDWP
int m_iJetIDWP
Definition: TauSelectionTool.h:132
xAODType::Tau
@ Tau
The object is a tau (jet)
Definition: ObjectType.h:49
TauAnalysisTools::JETIDGNTAUTIGHT
@ JETIDGNTAUTIGHT
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:26
TauAnalysisTools::TauSelectionTool::m_iEleIDVersion
int m_iEleIDVersion
Definition: TauSelectionTool.h:138
TauAnalysisTools::TauSelectionTool::m_dJetRNNSigTransMin
float m_dJetRNNSigTransMin
Definition: TauSelectionTool.h:148
TauAnalysisTools::JETIDGNTAUMEDIUM
@ JETIDGNTAUMEDIUM
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:25
TauAnalysisTools::NoCut
@ NoCut
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:41
TauAnalysisTools::JETIDRNNVERYLOOSE
@ JETIDRNNVERYLOOSE
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:19
TauAnalysisTools::CutPt
@ CutPt
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:42
TauAnalysisTools::TauSelectionTool::m_iAbsCharge
float m_iAbsCharge
Definition: TauSelectionTool.h:146
TauAnalysisTools::JETIDNONEUNCONFIGURED
@ JETIDNONEUNCONFIGURED
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h:13
asg::AcceptData
Definition: AcceptData.h:30
error
Definition: IImpactPoint3dEstimator.h:70
TauAnalysisTools::TauSelectionTool::m_dPtMax
float m_dPtMax
Definition: TauSelectionTool.h:143
TauAnalysisTools::TauSelectionTool::convertJetIDWPToStr
std::string convertJetIDWPToStr(int iJetIDWP) const
Definition: TauSelectionTool.cxx:598
TauAnalysisTools::TauSelectionTool::m_iNTrack
float m_iNTrack
Definition: TauSelectionTool.h:147
TauAnalysisTools::TauSelectionTool::m_bMuonOLR
bool m_bMuonOLR
Definition: TauSelectionTool.h:140
TauAnalysisTools::split
void split(const std::string &sInput, const char cDelim, std::vector< std::string > &vOut)
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:23