24DiTauSelectionTool::DiTauSelectionTool(
const std::string& name )
26 , m_sOmniIDWP(
"OMNIIDNONE")
28 , m_aAccept(
"DiTauSelection" )
32DiTauSelectionTool::~DiTauSelectionTool()
38StatusCode DiTauSelectionTool::initialize()
41 m_vAbsEtaRegion = m_vecAbsEtaRegion.value();
42 m_vAbsCharges = m_vecAbsCharges.value();
44 bool bConfigViaConfigFile = !m_sConfigPath.empty();
45 bool bConfigViaProperties =
false;
46 if (!bConfigViaProperties and !std::isnan(m_dPtMin.value())) bConfigViaProperties =
true;
47 if (!bConfigViaProperties and !m_vAbsEtaRegion.empty()) bConfigViaProperties =
true;
48 if (!bConfigViaProperties and !std::isnan(m_dAbsEtaMin.value())) bConfigViaProperties =
true;
49 if (!bConfigViaProperties and !std::isnan(m_dAbsEtaMax.value())) bConfigViaProperties =
true;
50 if (!bConfigViaProperties and !std::isnan(m_dNSubjetsMin.value())) bConfigViaProperties =
true;
51 if (!bConfigViaProperties and !m_vAbsCharges.empty()) bConfigViaProperties =
true;
52 if (!bConfigViaProperties and !std::isnan(m_iAbsCharge.value())) bConfigViaProperties =
true;
53 if (!bConfigViaProperties and !std::isnan(m_dOmniScoreMin.value())) bConfigViaProperties =
true;
54 if (!bConfigViaProperties and m_iOmniIDWP != 0) bConfigViaProperties =
true;
56 if (bConfigViaConfigFile and bConfigViaProperties)
58 ATH_MSG_ERROR(
"Configured tool via setProperty and configuration file, which may lead to unexpected configuration. Please setup the DiTauSelectionTool 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-DiTauSelectionTool.rst or contact the TauCP group.");
59 return StatusCode::FAILURE;
62 if (!bConfigViaConfigFile and !bConfigViaProperties)
64 ATH_MSG_WARNING(
"No cut configuration provided, the tool will not do anything. For further details please refer to the documentation:");
65 ATH_MSG_WARNING(
"https://gitlab.cern.ch/atlas/athena/blob/main/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-DiTauSelectionTool.rst");
68 if (bConfigViaConfigFile)
73 if (!testFileForEOFContainsCharacters(sInputFilePath))
74 ATH_MSG_WARNING(
"Config file for DiTauSelectionTool with path "<<sInputFilePath<<
" does not contain an empty last line. The tool might not be properly configured!");
76 rEnv.ReadFile(sInputFilePath.c_str(),
79 std::vector<std::string> vCuts;
82 if (rEnv.Defined(
"SelectionCuts"))
86 auto lList = rEnv.GetTable();
87 for( Int_t i = 0;
i < lList->GetEntries(); ++
i )
89 vCuts.push_back( lList->At( i )->GetName() );
93 int iSelectionCuts = 0;
95 for (
const std::string& sCut : vCuts)
100 if (std::isnan(m_dPtMin.value()))
101 m_dPtMin = rEnv.GetValue(
"PtMin",NAN);
103 else if (sCut ==
"AbsEtaRegion")
106 if (m_vAbsEtaRegion.empty())
109 else if (sCut ==
"AbsEtaMin")
112 if (std::isnan(m_dAbsEtaMin.value()))
113 m_dAbsEtaMin = rEnv.GetValue(
"AbsEtaMin",NAN);
115 else if (sCut ==
"AbsEtaMax")
118 if (std::isnan(m_dAbsEtaMax.value()))
119 m_dAbsEtaMax = rEnv.GetValue(
"AbsEtaMax",NAN);
121 else if (sCut ==
"NSubjetsMin")
124 if (std::isnan(m_dNSubjetsMin.value()))
125 m_dNSubjetsMin = rEnv.GetValue(
"NSubjetsMin",NAN);
127 else if (sCut ==
"AbsCharges")
130 if (m_vAbsCharges.empty())
133 else if (sCut ==
"AbsCharge")
136 if (std::isnan(m_iAbsCharge.value()))
137 m_iAbsCharge = rEnv.GetValue(
"AbsCharge",NAN);
139 else if (sCut ==
"OmniScoreMin")
142 if (std::isnan(m_dOmniScoreMin.value()))
143 m_dOmniScoreMin = rEnv.GetValue(
"OmniScoreMin",NAN);
146 for (
const std::string& checkCut : vCuts){
147 if (checkCut.find(
"OmniScoreRegion") != std::string::npos) {
148 ATH_MSG_ERROR(
"Misconfig due to OmniScoreRegion and OmniScoreMin cuts both present in the config file. Please CHECK carefully config file again and choose of the two");
149 return StatusCode::FAILURE;
154 m_useOmniScore =
true;
156 else if (sCut ==
"OmniIDWP")
160 m_sOmniIDWP = rEnv.GetValue(
"OmniIDWP",
"OMNIIDNONE");
161 m_iOmniIDWP = convertStrToOmniIDWP(m_sOmniIDWP);
164 for (
const std::string& checkCut : vCuts){
165 if (checkCut.find(
"OmniScore") != std::string::npos) {
166 ATH_MSG_ERROR(
"Misconfig due to OmniIDWP and OmniScore cuts both present in the config file. Please CHECK carefully config file again");
167 return StatusCode::FAILURE;
175 m_iSelectionCuts = iSelectionCuts;
179 if (m_useOmniScore) {
180 if(m_OmniScoreDecorKey.empty()) {
181 ATH_CHECK( m_OmniScoreDecorKey.assign(
"DiTauJets.omni_score"));
184 ATH_CHECK( m_OmniScoreDecorKey.initialize( m_useOmniScore ) );
187 using map_type = std::map<DiTauSelectionCuts, std::unique_ptr<DiTauSelectionCut>>;
188 using pair_type = map_type::value_type;
190 pair_type elements[] =
192 {
DiTauCutPt, std::make_unique<DiTauSelectionCutPt>(
this)},
193 {
DiTauCutAbsEta, std::make_unique<DiTauSelectionCutAbsEta>(
this)},
200 m_cMap = { std::make_move_iterator(
begin(elements) ), std::make_move_iterator(
end(elements) ) };
203 FillRegionVector(m_vPtRegion, m_dPtMin.value(), NAN);
204 FillRegionVector(m_vAbsEtaRegion, m_dAbsEtaMin.value(), m_dAbsEtaMax.value());
205 FillRegionVector(m_vNSubjetsRegion, m_dNSubjetsMin.value(), NAN);
206 FillValueVector(m_vAbsCharges, m_iAbsCharge.value());
207 FillRegionVector(m_vOmniScoreRegion, m_dOmniScoreMin.value(), NAN );
209 PrintConfigRegion (
"Pt", m_vPtRegion);
210 PrintConfigRegion (
"AbsEta", m_vAbsEtaRegion);
211 PrintConfigRegion (
"NSubjets", m_vNSubjetsRegion);
212 PrintConfigValue (
"AbsCharge", m_vAbsCharges);
213 PrintConfigRegion (
"OmniScore", m_vOmniScoreRegion);
214 PrintConfigValue (
"OmniIDWP", m_sOmniIDWP);
216 std::string sCuts =
"";
217 if (m_iSelectionCuts &
DiTauCutPt) sCuts +=
"Pt ";
226 if (m_bCreateControlPlots)
227 setupCutFlowHistogram();
229 for (
const auto& entry : m_cMap ) {
230 if ( m_iSelectionCuts &
entry.first ) {
231 entry.second->setAcceptInfo(m_aAccept);
235 return StatusCode::SUCCESS;
240StatusCode DiTauSelectionTool::beginEvent()
242 return StatusCode::SUCCESS;
265 ATH_MSG_FATAL(
"accept(...) Failed to cast particle to tau" );
280 if (m_bCreateControlPlots)
283 m_hCutFlow->Fill(iNBin);
285 for (
const auto& entry : m_cMap)
286 entry.second->fillHistogramCutPre(xDiTau);
290 for (
const auto& entry : m_cMap)
292 if (m_iSelectionCuts &
entry.first)
294 if (!
entry.second->accept(xDiTau, acceptData))
298 if (m_bCreateControlPlots)
302 m_hCutFlow->Fill(iNBin);
308 catch (
const std::runtime_error&
error)
315 static std::atomic<uint64_t> warning_count (0u);
316 auto mycount = ++ warning_count;
326 if (m_bCreateControlPlots)
328 for (
const auto& entry : m_cMap)
329 entry.second->fillHistogramCut(xDiTau);
337void DiTauSelectionTool::setOutFile( TFile* fOutFile )
339 m_fOutFile = fOutFile;
343void DiTauSelectionTool::writeControlHistograms()
345 if (m_bCreateControlPlots and !m_fOutFile)
346 ATH_MSG_WARNING(
"CreateControlPlots was set to true, but no valid file pointer was provided");
347 if (m_bCreateControlPlots and m_fOutFile)
350 m_fOutFile->mkdir((this->
name()+
"_control").c_str());
351 m_fOutFile->cd((this->
name()+
"_control").c_str());
355 for (
const auto& entry : m_cMap)
356 entry.second->writeControlHistograms();
362void DiTauSelectionTool::setupCutFlowHistogram()
366 for (
const auto& entry : m_cMap)
367 if (m_iSelectionCuts &
entry.first)
370 m_hCutFlow = std::make_shared<TH1F>(
"hCutFlow",
"CutFlow;; events",iNBins+1,0,iNBins+1);
371 m_hCutFlow->GetXaxis()->SetBinLabel(1,
"All");
376 for (
const auto& entry : m_cMap)
377 if (m_iSelectionCuts &
entry.first)
379 m_hCutFlow->GetXaxis()->SetBinLabel(iNBins,
entry.second->getName().c_str());
385template<
typename T,
typename U>
386void DiTauSelectionTool::FillRegionVector(std::vector<T>& vRegion, U tMin, U tMax)
const
388 if (!vRegion.empty())
390 if (!std::isnan(tMin))
391 vRegion.push_back(tMin);
393 vRegion.push_back(-std::numeric_limits<T>::infinity());
395 if (!std::isnan(tMax))
396 vRegion.push_back(tMax);
398 vRegion.push_back(std::numeric_limits<T>::infinity());
402template<
typename T,
typename U>
403void DiTauSelectionTool::FillValueVector(std::vector<T>& vRegion, U tVal)
const
405 if (!vRegion.empty())
408 vRegion.push_back(tVal);
413void DiTauSelectionTool::PrintConfigRegion(
const std::string& sCutName, std::vector<T>& vRegion)
const
415 unsigned int iNumRegion = vRegion.size()/2;
416 for(
unsigned int iRegion = 0; iRegion < iNumRegion; iRegion++ )
418 ATH_MSG_DEBUG( sCutName<<
": " << vRegion.at(iRegion*2) <<
" to " << vRegion.at(iRegion*2+1) );
424void DiTauSelectionTool::PrintConfigValue(
const std::string& sCutName, std::vector<T>& vRegion)
const
426 for (
auto tVal : vRegion)
432void DiTauSelectionTool::PrintConfigValue(
const std::string& sCutName, T& tVal)
const
438int DiTauSelectionTool::convertStrToOmniIDWP(
const std::string& sOmniIDWP)
const
440 if (sOmniIDWP ==
"OMNIIDNONE")
return int(
OMNIIDNONE);
442 else if (sOmniIDWP ==
"OMNIIDLOOSE")
return int(
OMNIIDLOOSE);
443 else if (sOmniIDWP ==
"OMNIIDMEDIUM")
return int(
OMNIIDMEDIUM);
444 else if (sOmniIDWP ==
"OMNIIDTIGHT")
return int(
OMNIIDTIGHT);
446 ATH_MSG_ERROR(
"omni ID working point "<<sOmniIDWP<<
" is unknown, the OmniIDWP cut will not accept any ditau!" );
#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,...)
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=":")
StatusCode accept(const xAOD::Muon *mu)
@ Jet
The object is a jet.
DiTauJet_v1 DiTauJet
Definition of the current version.