12namespace ADD_CMODE(TauAnalysisTools)
15TauResolutionTool::TauResolutionTool(
const std::string& sName )
19TauResolutionTool::~TauResolutionTool()
22StatusCode TauResolutionTool::initialize()
28 std::unique_ptr<TFile> calFile(TFile::Open(calFilePath.c_str(),
"READ"));
32 TGraph* graph =
nullptr;
33 std::string graphName=
"";
34 for (
size_t decayModeIndex = 0; decayModeIndex < DecayModeBinning; ++decayModeIndex) {
35 for (
size_t etaIndex = 0; etaIndex < EtaBinning; ++etaIndex) {
38 graphName =
"tauRec/Graph_from_ResolutionEt_tauRec_" + m_decayModeNames[decayModeIndex] +
"_" + m_etaBinNames[etaIndex];
39 graph =
dynamic_cast<TGraph*
> (calFile->Get(graphName.c_str()));
41 m_caloResMaxEt[decayModeIndex][etaIndex] = TMath::MaxElement(graph->GetN(), graph->GetX());
42 m_caloRes[decayModeIndex][etaIndex] = std::unique_ptr<TGraph>(graph);
46 ATH_MSG_FATAL(
"Failed to get an object with name " << graphName);
47 return StatusCode::FAILURE;
50 graphName =
"FinalCalib/Graph_from_ResolutionEt_FinalCalib_" + m_decayModeNames[decayModeIndex] +
"_" + m_etaBinNames.at(etaIndex);
51 graph =
dynamic_cast<TGraph*
> (calFile->Get(graphName.c_str()));
53 m_mvaResMaxEt.at(decayModeIndex).at(etaIndex) = TMath::MaxElement(graph->GetN(), graph->GetX());
54 m_mvaRes.at(decayModeIndex).at(etaIndex) = std::unique_ptr<TGraph>(graph);
58 ATH_MSG_FATAL(
"Failed to get an object with name " << graphName);
59 return StatusCode::FAILURE;
65 return StatusCode::SUCCESS;
69bool TauResolutionTool::isValid(
const xAOD::TauJet& tau)
const {
76 int etaIndex = getEtaIndex(tau.etaTauEnergyScale());
85int TauResolutionTool::getEtaIndex(
float eta)
const {
86 float abseta = std::abs(
eta);
115 return static_cast<int>(decayMode);
118double TauResolutionTool::getMvaEnergyResolution(
const xAOD::TauJet& tau)
const {
124 int decayModeIndex = getDecayModeIndex(decayMode);
126 int etaIndex = getEtaIndex(tau.etaFinalCalib());
128 double pt = std::min(tau.ptFinalCalib(), m_mvaResMaxEt.at(decayModeIndex).at(etaIndex));
129 double resolution = m_mvaRes.at(decayModeIndex).at(etaIndex)->Eval(pt);
134double TauResolutionTool::getCaloResolution(
double et,
int decayModeIndex,
int etaIndex)
const {
135 double x = std::min(
et, m_caloResMaxEt.at(decayModeIndex).at(etaIndex));
136 double resolution = m_caloRes.at(decayModeIndex).at(etaIndex)->Eval(
x);
141bool TauResolutionTool::getTESCompatibility(
const xAOD::TauJet& tau)
const {
142 if (!
isValid(tau))
return false;
145 int decayModeIndex = getDecayModeIndex(decayMode);
147 int etaIndex = getEtaIndex(tau.etaTauEnergyScale());
149 double caloSigma = tau.ptTauEnergyScale() * getCaloResolution(tau.ptTauEnergyScale(), decayModeIndex, etaIndex);
150 double deltaEt = tau.ptFinalCalib() - tau.ptTauEnergyScale();
152 bool compatibility =
true;
154 if (std::abs(deltaEt) > 5 * caloSigma) {
155 compatibility =
false;
158 return compatibility;