ATLAS Offline Software
TauEfficiencyTriggerTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Framework include(s):
7 
8 // local include(s)
11 
12 // ROOT include(s)
13 #include "TFile.h"
14 
15 using namespace TauAnalysisTools;
16 
17 //______________________________________________________________________________
18 TauEfficiencyTriggerTool::TauEfficiencyTriggerTool(const std::string& sName)
19  : CommonEfficiencyTool ( sName )
20 {
21  m_mSystematics = {};
22  declareProperty( "MinRunNumber", m_iMinRunNumber = 0 );
23  declareProperty( "MaxRunNumber", m_iMaxRunNumber = 0 );
24 }
25 
26 //______________________________________________________________________________
28 {
29  ATH_MSG_INFO( "Initializing TauEfficiencyTriggerTool" );
30  // only read in histograms once
31  if (m_mSF==nullptr)
32  {
33  std::string sInputFilePath = PathResolverFindCalibFile(m_sInputFilePath);
34 
35  m_mSF = std::make_unique< tSFMAP >();
36  std::unique_ptr< TFile > fSF( TFile::Open( sInputFilePath.c_str(), "READ" ) );
37  if(!fSF)
38  {
39  ATH_MSG_FATAL("Could not open file " << sInputFilePath.c_str());
40  return StatusCode::FAILURE;
41  }
42  ReadInputs(*fSF);
43  fSF->Close();
44  }
45 
46  std::vector<std::string> vInputFilePath;
47  split(m_sInputFilePath,'/',vInputFilePath);
48  m_sInputFileName = vInputFilePath.back();
50 
51  // load empty systematic variation by default
52  if (applySystematicVariation(CP::SystematicSet()) != StatusCode::SUCCESS )
53  return StatusCode::FAILURE;
54 
55  return StatusCode::SUCCESS;
56 }
57 
58 //______________________________________________________________________________
60  double& dEfficiencyScaleFactor, unsigned int /*iRunNumber*/, unsigned int /*iMu*/)
61 {
62  // check which true state is requested
64  {
65  dEfficiencyScaleFactor = 1.;
67  }
68 
69  // check if 1 prong
70  if (m_bNoMultiprong && xTau.nTracks() != 1)
71  {
72  dEfficiencyScaleFactor = 1.;
74  }
75 
76  // get prong extension for histogram name
77  std::string sProng = ConvertProngToString(xTau.nTracks());
78 
79  // get standard scale factor
80  CP::CorrectionCode tmpCorrectionCode;
81  tmpCorrectionCode = getValue(m_sSFHistName+"_all_"+m_sWP+sProng,
82  xTau,
83  dEfficiencyScaleFactor);
84  // return correction code if histogram is not available
85  if (tmpCorrectionCode != CP::CorrectionCode::Ok)
86  return tmpCorrectionCode;
87 
88  // skip further process if systematic set is empty
89  if (m_sSystematicSet->empty())
91 
92  // get uncertainties summed in quadrature
93  double dTotalSystematic2 = 0.;
94  double dDirection = 0.;
95  for (auto syst : *m_sSystematicSet)
96  {
97  // check if systematic is available
98  auto it = m_mSystematicsHistNames.find(syst.basename());
99 
100  // dirty hack, replace urgently
101  std::string sDirection = (syst.parameter() > 0) ? "_up" : "_down";
102 
103  // get uncertainty value
104  double dUncertaintySyst = 0.;
105  tmpCorrectionCode = getValue(it->second+sDirection+"_all_"+m_sWP+sProng,
106  xTau,
107  dUncertaintySyst);
108 
109  // return correction code if histogram is not available
110  if (tmpCorrectionCode != CP::CorrectionCode::Ok)
111  return tmpCorrectionCode;
112 
113  // needed for up/down decision
114  dDirection = syst.parameter();
115 
116  // scale uncertainty with direction, i.e. +/- n*sigma
117  dUncertaintySyst *= dDirection;
118 
119  // square uncertainty and add to total uncertainty
120  dTotalSystematic2 += dUncertaintySyst * dUncertaintySyst;
121  }
122 
123  // now use dDirection to use up/down uncertainty
124  dDirection = (dDirection > 0.) ? 1. : -1.;
125 
126  // finally apply uncertainty (eff * ( 1 +/- \sum )
127  dEfficiencyScaleFactor *= 1. + dDirection * std::sqrt(dTotalSystematic2);
128 
129  return CP::CorrectionCode::Ok;
130 }
131 
132 //______________________________________________________________________________
134 {
135  // first check if we already know this systematic configuration
136  auto itSystematicSet = m_mSystematicSets.find(sSystematicSet);
137  if (itSystematicSet != m_mSystematicSets.end())
138  {
139  m_sSystematicSet = &itSystematicSet->first;
140  return StatusCode::SUCCESS;
141  }
142 
143  // sanity checks if systematic set is supported
144  // double dDirection = 0;
145  CP::SystematicSet sSystematicSetAvailable;
146  for (auto sSyst : sSystematicSet)
147  {
148  // check if systematic is available
149  auto it = m_mSystematicsHistNames.find(sSyst.basename());
150  if (it == m_mSystematicsHistNames.end())
151  {
152  ATH_MSG_VERBOSE("unsupported systematic variation: "<< sSyst.basename()<<"; skipping this one");
153  continue;
154  }
155 
156  // if (sSyst.parameter() * dDirection < 0)
157  // {
158  // ATH_MSG_ERROR("unsupported set of systematic variations, you should either use only \"UP\" or only \"DOWN\" systematics in one set!");
159  // ATH_MSG_ERROR("systematic set will not be applied");
160  // return StatusCode::FAILURE;
161  // }
162  // dDirection = sSyst.parameter();
163 
164  if ((m_sRecommendedSystematics.find(sSyst.basename()) != m_sRecommendedSystematics.end()) and sSystematicSet.size() > 1)
165  {
166  ATH_MSG_ERROR("unsupported set of systematic variations, you should not combine \"TAUS_{TRUE|FAKE}_EFF_*_TOTAL\" with other systematic variations!");
167  ATH_MSG_ERROR("systematic set will not be applied");
168  return StatusCode::FAILURE;
169  }
170 
171  // finally add the systematic to the set of systematics to process
172  sSystematicSetAvailable.insert(sSyst);
173  }
174 
175  // store this calibration for future use, and make it current
176  m_sSystematicSet = &m_mSystematicSets.insert(std::pair<CP::SystematicSet,std::string>(sSystematicSetAvailable, sSystematicSet.name())).first->first;
177 
178  return StatusCode::SUCCESS;
179 }
180 
181 //______________________________________________________________________________
183 {
184  if ( m_iMinRunNumber != 0 and m_iMinRunNumber > iRunNumber)
185  return false;
186  if ( m_iMaxRunNumber != 0 and m_iMaxRunNumber < iRunNumber)
187  return false;
188  return true;
189 }
190 
TauAnalysisTools
Definition: TruthCollectionMakerTau.h:16
TauAnalysisTools::CommonEfficiencyTool::m_eCheckTruth
TruthMatchedParticleType m_eCheckTruth
Definition: CommonEfficiencyTool.h:150
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
TauAnalysisTools::CommonEfficiencyTool::ReadInputs
void ReadInputs(const TFile &fFile)
Definition: CommonEfficiencyTool.cxx:470
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
TauAnalysisTools::CommonEfficiencyTool::m_bSkipTruthMatchCheck
bool m_bSkipTruthMatchCheck
Definition: CommonEfficiencyTool.h:143
TauAnalysisTools::TauEfficiencyTriggerTool::applySystematicVariation
virtual StatusCode applySystematicVariation(const CP::SystematicSet &sSystematicSet)
configure this tool for the given list of systematic variations.
Definition: TauEfficiencyTriggerTool.cxx:133
TauEfficiencyTriggerTool.h
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
TauAnalysisTools::CommonEfficiencyTool::m_sSystematicSet
const CP::SystematicSet * m_sSystematicSet
Definition: CommonEfficiencyTool.h:100
CP::SystematicSet::empty
bool empty() const
returns: whether the set is empty
Definition: SystematicSet.h:67
xAOD::TauJet_v3::nTracks
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
Definition: TauJet_v3.cxx:526
skel.it
it
Definition: skel.GENtoEVGEN.py:423
TauAnalysisTools::CommonEfficiencyTool::ConvertProngToString
std::string ConvertProngToString(const int iProngness) const
Definition: CommonEfficiencyTool.cxx:397
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
CP::SystematicSet::name
std::string name() const
returns: the systematics joined into a single string.
Definition: SystematicSet.cxx:278
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
TauAnalysisTools::CommonEfficiencyTool::m_mSystematicSets
std::unordered_map< CP::SystematicSet, std::string > m_mSystematicSets
Definition: CommonEfficiencyTool.h:99
TauAnalysisTools::CommonEfficiencyTool::getValue
virtual CP::CorrectionCode getValue(const std::string &sHistName, const xAOD::TauJet &xTau, double &dEfficiencyScaleFactor) const
Definition: CommonEfficiencyTool.cxx:695
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
TauEfficiencyCorrectionsTool.h
TauAnalysisTools::CommonEfficiencyTool::m_sWP
std::string m_sWP
Definition: CommonEfficiencyTool.h:140
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
TauAnalysisTools::CommonEfficiencyTool::m_mSF
std::unique_ptr< tSFMAP > m_mSF
Definition: CommonEfficiencyTool.h:96
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
TauAnalysisTools::CommonEfficiencyTool
Definition: CommonEfficiencyTool.h:39
CP::SystematicSet::end
const_iterator end() const
description: const iterator to the end of the set
Definition: SystematicSet.h:59
TauAnalysisTools::CommonEfficiencyTool::m_sSFHistName
std::string m_sSFHistName
Definition: CommonEfficiencyTool.h:142
TauAnalysisTools::CommonEfficiencyTool::m_sInputFilePath
std::string m_sInputFilePath
Definition: CommonEfficiencyTool.h:138
TauAnalysisTools::CommonEfficiencyTool::generateSystematicSets
void generateSystematicSets()
Definition: CommonEfficiencyTool.cxx:632
PathResolver.h
CP::SystematicSet::insert
void insert(const SystematicVariation &systematic)
description: insert a systematic into the set
Definition: SystematicSet.cxx:88
TauAnalysisTools::CommonEfficiencyTool::initialize
virtual StatusCode initialize()
Dummy implementation of the initialisation function.
Definition: CommonEfficiencyTool.cxx:116
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
CP::SystematicSet::find
iterator find(const SystematicVariation &sys) const
description: find an element in the set
Definition: SystematicSet.h:63
CP::CorrectionCode::Ok
@ Ok
The correction was done successfully.
Definition: CorrectionCode.h:38
TauAnalysisTools::getTruthParticleType
TruthMatchedParticleType getTruthParticleType(const xAOD::TauJet &xTau)
return TauJet match type
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:572
CP::CorrectionCode
Return value from object correction CP tools.
Definition: CorrectionCode.h:31
TauAnalysisTools::TauEfficiencyTriggerTool::m_iMaxRunNumber
int m_iMaxRunNumber
Definition: TauEfficiencyTriggerTool.h:53
TauAnalysisTools::CommonEfficiencyTool::m_bNoMultiprong
bool m_bNoMultiprong
Definition: CommonEfficiencyTool.h:145
TauAnalysisTools::CommonEfficiencyTool::m_sInputFileName
std::string m_sInputFileName
Definition: CommonEfficiencyTool.h:139
TauAnalysisTools::CommonEfficiencyTool::m_mSystematicsHistNames
std::map< std::string, std::string > m_mSystematicsHistNames
Definition: CommonEfficiencyTool.h:102
TauAnalysisTools::CommonEfficiencyTool::m_sRecommendedSystematics
CP::SystematicSet m_sRecommendedSystematics
Definition: CommonEfficiencyTool.h:136
TauAnalysisTools::TauEfficiencyTriggerTool::m_iMinRunNumber
int m_iMinRunNumber
Definition: TauEfficiencyTriggerTool.h:52
TauAnalysisTools::TauEfficiencyTriggerTool::getEfficiencyScaleFactor
virtual CP::CorrectionCode getEfficiencyScaleFactor(const xAOD::TauJet &tau, double &dEfficiencyScaleFactor, unsigned int iRunNumber=0, unsigned int iMu=0)
Declare the interface that the class provides.
Definition: TauEfficiencyTriggerTool.cxx:59
TauAnalysisTools::split
void split(const std::string &sInput, const char cDelim, std::vector< std::string > &vOut)
Definition: PhysicsAnalysis/TauID/TauAnalysisTools/Root/HelperFunctions.cxx:23
TauAnalysisTools::TauEfficiencyTriggerTool::isSupportedRunNumber
bool isSupportedRunNumber(int iRunNumber) const
check if run number is supported in recommendations
Definition: TauEfficiencyTriggerTool.cxx:182