From a4e71eb8f4d816cc06ce42cc0ecb6f3daa318c1e Mon Sep 17 00:00:00 2001
From: Mikael Martensson <mikael.martensson@cern.ch>
Date: Fri, 14 Jun 2019 07:23:18 +0200
Subject: [PATCH] Changed TauSelectionTool in tau physics validation to
 ToolHandles

---
 .../share/PhysValTau_jobOptions.py            | 41 +++++++++++++++
 .../TauAnalysisTools/TauAnalysisTools/Enums.h |  2 +
 .../TauAnalysisTools/selection.xml            |  2 +
 .../TauID/TauDQA/share/PhysValTau.h           | 10 ++--
 .../TauID/TauDQA/src/PhysValTau.cxx           | 51 +++++++------------
 5 files changed, 68 insertions(+), 38 deletions(-)

diff --git a/PhysicsAnalysis/PhysicsValidation/PhysValMonitoring/share/PhysValTau_jobOptions.py b/PhysicsAnalysis/PhysicsValidation/PhysValMonitoring/share/PhysValTau_jobOptions.py
index 00e0c47bd5af..4ac0e676c34b 100644
--- a/PhysicsAnalysis/PhysicsValidation/PhysValMonitoring/share/PhysValTau_jobOptions.py
+++ b/PhysicsAnalysis/PhysicsValidation/PhysValMonitoring/share/PhysValTau_jobOptions.py
@@ -10,6 +10,47 @@ if recFlags.doTruth():
 tool1.TauContainerName = "TauJets"
 tool1.TruthParticleContainerName = "TruthParticles"
 
+# configuration of the truth matching tool
+tool1.TauTruthMatchingTool.TruthElectronContainerName = "TruthElectrons"
+tool1.TauTruthMatchingTool.TruthMuonContainerName = "MuonTruthParticles"
+tool1.TauTruthMatchingTool.WriteTruthTaus = True
+
+# Trigger loading of TauAnalysisTools to make ID enums visible
+import cppyy
+try:
+    print("Successfully loaded TauAnalysisToolsDict")
+    cppyy.loadDictionary('TauAnalysisToolsDict')
+except:
+    print("Could not load TauAnalysisToolsDict")
+    pass
+from ROOT import TauAnalysisTools
+
+# configuration of the 'primitive' tau selection
+tool1.PrimitiveTauSelectionTool.ConfigPath = ""
+tool1.PrimitiveTauSelectionTool.SelectionCuts \
+    = int(TauAnalysisTools.CutAbsEta | TauAnalysisTools.CutAbsCharge | 
+          TauAnalysisTools.CutNTrack)
+tool1.PrimitiveTauSelectionTool.PtMin = 0.0
+tool1.PrimitiveTauSelectionTool.JetIDWP = TauAnalysisTools.JETIDNONE
+tool1.PrimitiveTauSelectionTool.EleOLR = False
+tool1.PrimitiveTauSelectionTool.NTracks = (0, 1, 2, 3, 4, 5)
+tool1.PrimitiveTauSelectionTool.AbsCharges = (0, 1, 2, 3)
+tool1.PrimitiveTauSelectionTool.AbsEtaRegion = (0.0, 10.0)
+tool1.PrimitiveTauSelectionTool.OutputLevel = DEBUG
+
+# configuration of the 'nominal' tau selection
+tool1.NominalTauSelectionTool.ConfigPath = ""
+tool1.NominalTauSelectionTool.SelectionCuts \
+    = int(TauAnalysisTools.CutPt | TauAnalysisTools.CutAbsEta | 
+          TauAnalysisTools.CutAbsCharge | TauAnalysisTools.CutNTrack)
+tool1.NominalTauSelectionTool.PtMin = 2000000.0
+tool1.NominalTauSelectionTool.JetIDWP = TauAnalysisTools.JETIDNONE
+tool1.NominalTauSelectionTool.EleOLR = False
+tool1.NominalTauSelectionTool.NTracks = (0, 1, 2, 3, 4, 5)
+tool1.NominalTauSelectionTool.AbsCharges = (0, 1, 2, 3)
+tool1.NominalTauSelectionTool.AbsEtaRegion = (0.0, 1.37, 1.52, 2.5)
+tool1.NominalTauSelectionTool.OutputLevel = DEBUG
+
 monMan = CfgMgr.AthenaMonManager("PhysValMonManager")
 monMan.AthenaMonTools += [ tool1 ]
 
diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h
index a8d852ad5d26..b703ba55f12d 100644
--- a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h
+++ b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h
@@ -157,6 +157,8 @@ typedef enum e_DataPeriodBinning
   PeriodBinningD_EFH23J_G = 3
 } DataPeriodBinning;
 
+struct ROOT6_NamespaceAutoloadHook{};
+
 }
 
 #endif // TAUANALYSISTOOLS_ENUMS_H
diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/selection.xml b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/selection.xml
index 769f6ff55d5b..c839cb9dd670 100644
--- a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/selection.xml
+++ b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/selection.xml
@@ -13,6 +13,8 @@
   <class name="TauAnalysisTools::DiTauTruthMatchingTool" />
   <function pattern="TauAnalysisTools::split*"/>
   <function pattern="TauAnalysisTools::testFileForEOFContainsCharacters*"/>
+  <enum name="TauAnalysisTools::e_JETID" />
+  <enum name="TauAnalysisTools::SelectionCuts" />
 
   <!-- Suppress the unwanted classes found by ROOT 6. -->
   <!-- Hopefully we can remove these extra lines at one point... -->
diff --git a/PhysicsAnalysis/TauID/TauDQA/share/PhysValTau.h b/PhysicsAnalysis/TauID/TauDQA/share/PhysValTau.h
index a54e7a905bc4..fc1606954626 100644
--- a/PhysicsAnalysis/TauID/TauDQA/share/PhysValTau.h
+++ b/PhysicsAnalysis/TauID/TauDQA/share/PhysValTau.h
@@ -17,8 +17,8 @@
 // Local includes
 #include "AthenaMonitoring/ManagedMonitorToolBase.h"
 #include "TauValidationPlots.h"
-#include "TauAnalysisTools/TauTruthMatchingTool.h"
-#include "TauAnalysisTools/TauSelectionTool.h"
+#include "TauAnalysisTools/ITauTruthMatchingTool.h"
+#include "TauAnalysisTools/ITauSelectionTool.h"
 #include <TLorentzVector.h>
 
 //Additional includes
@@ -84,10 +84,10 @@ class PhysValTau
     std::vector<size_t> m_matched_itr;
 
    // Tool used for truth-matching
-   TauAnalysisTools::TauTruthMatchingTool m_truthTool;
+   ToolHandle<TauAnalysisTools::ITauTruthMatchingTool> m_truthTool;
    // Tool used to select "primitive" and "nominal" taus
-   TauAnalysisTools::TauSelectionTool m_primTauSel;
-   TauAnalysisTools::TauSelectionTool m_nomiTauSel;
+   ToolHandle<TauAnalysisTools::ITauSelectionTool> m_primTauSel;
+   ToolHandle<TauAnalysisTools::ITauSelectionTool> m_nomiTauSel;
 
   //Histograms
   // general tau all prongs plots
diff --git a/PhysicsAnalysis/TauID/TauDQA/src/PhysValTau.cxx b/PhysicsAnalysis/TauID/TauDQA/src/PhysValTau.cxx
index 8188c5f3d9d9..8202cb349522 100644
--- a/PhysicsAnalysis/TauID/TauDQA/src/PhysValTau.cxx
+++ b/PhysicsAnalysis/TauID/TauDQA/src/PhysValTau.cxx
@@ -37,14 +37,20 @@ PhysValTau::PhysValTau(const std::string& type,
 		       const std::string& name, 
                        const IInterface* parent) : 
    ManagedMonitorToolBase(type, name, parent),
-   m_truthTool("TauTruthMatchingTool"),
-   m_primTauSel("PrimitiveTauSelectionTool"),
-   m_nomiTauSel("NominalTauSelectionTool")
+   m_truthTool("TauAnalysisTools::TauTruthMatchingTool/"
+	       "TauTruthMatchingTool", this),
+   m_primTauSel("TauAnalysisTools::TauSelectionTool/"
+		"PrimitiveTauSelectionTool", this),
+   m_nomiTauSel("TauAnalysisTools::TauSelectionTool/"
+		"NominalTauSelectionTool", this)
 {
    declareProperty("TauContainerName", m_TauJetContainerName = "TauRecContainer");
    declareProperty("TruthParticleContainerName", m_TruthParticleContainerName = "TruthParticle");
    declareProperty("TauDetailsContainerName", m_TauDetailsContainerName = "TauRecDetailsContainer");
    declareProperty("isMC", m_isMC = false);
+   declareProperty("TauTruthMatchingTool", m_truthTool);
+   declareProperty("PrimitiveTauSelectionTool", m_primTauSel);
+   declareProperty("NominalTauSelectionTool", m_nomiTauSel);
 }
 
 // Destructor
@@ -60,30 +66,11 @@ StatusCode PhysValTau::initialize()
    ATH_CHECK(ManagedMonitorToolBase::initialize());
 
    if ( m_isMC ) {
-      CHECK(m_truthTool.setProperty("TruthElectronContainerName",
-      				    "TruthElectrons"));
-      CHECK(m_truthTool.setProperty("TruthMuonContainerName",
-      				    "MuonTruthParticles"));
-      CHECK(m_truthTool.setProperty("WriteTruthTaus", true));
-      CHECK(m_truthTool.sysInitialize());
+      ATH_CHECK(m_truthTool.retrieve());
    }
-   // setup a "primitive" tau selection tool with basically no cuts
-   CHECK(m_primTauSel.setProperty("PtMin",0.0));
-   CHECK(m_primTauSel.setProperty("JetIDWP",int(TauAnalysisTools::JETIDNONE)));
-   CHECK(m_primTauSel.setProperty("EleOLR",false));
-   CHECK(m_primTauSel.setProperty("NTracks",std::vector<int>{0,1,2,3,4,5}));
-   CHECK(m_primTauSel.setProperty("AbsCharges",std::vector<int>{0,1,2,3}));
-   CHECK(m_primTauSel.setProperty("AbsEtaRegion",std::vector<double>{0.0,10.0}));
-   m_primTauSel.msg().setLevel(MSG::DEBUG);
-   CHECK(m_primTauSel.initialize());
-   // setup a "nominal" tau selection tool (just eta and pt cuts)
-   CHECK(m_nomiTauSel.setProperty("PtMin",20.0));
-   CHECK(m_nomiTauSel.setProperty("JetIDWP",int(TauAnalysisTools::JETIDNONE)));
-   CHECK(m_nomiTauSel.setProperty("EleOLR",false));
-   CHECK(m_nomiTauSel.setProperty("NTracks",std::vector<int>{0,1,2,3,4,5}));
-   CHECK(m_nomiTauSel.setProperty("AbsCharges",std::vector<int>{0,1,2,3}));
-   m_nomiTauSel.msg().setLevel(MSG::DEBUG);
-   CHECK(m_nomiTauSel.initialize());
+   // selections are configured in PhysicsValidation job options
+   ATH_CHECK(m_primTauSel.retrieve());
+   ATH_CHECK(m_nomiTauSel.retrieve());
    
    return StatusCode::SUCCESS;
 }
@@ -107,7 +94,7 @@ StatusCode PhysValTau::bookHistograms()
 
 StatusCode PhysValTau::fillHistograms()
 {
-    
+
    ATH_MSG_INFO ("Filling hists " << name() << "...");
 
    // Retrieve tau container:
@@ -135,8 +122,8 @@ StatusCode PhysValTau::fillHistograms()
    // Loop through reco tau jet container
    for (auto tau : *taus) {
       if ( m_detailLevel < 10 ) continue;
-      if ( m_primTauSel.accept(*tau) ) continue;
-      asg::AcceptData nominal = m_nomiTauSel.accept(*tau);
+      if ( !static_cast<bool>(m_primTauSel->accept(*tau)) ) continue;
+      bool nominal = static_cast<bool>(m_nomiTauSel->accept(*tau));
       
       // fill histograms for reconstructed taus
       m_oTauValidationPlots->m_oRecoTauAllProngsPlots.fill(*tau);
@@ -171,12 +158,11 @@ StatusCode PhysValTau::fillHistograms()
       if ( !m_isMC ) continue;
       
       ATH_MSG_DEBUG("Trying to truth-match tau");
-      auto trueTau = m_truthTool.getTruth(*tau);
+      auto trueTau = m_truthTool->getTruth(*tau);
 
       // Fill truth and fake histograms
       if ( (bool)tau->auxdata<char>("IsTruthMatched") ) {
       	 ATH_MSG_DEBUG("Tau is truth-matched");
-	 // std::cout << "Truth pdgId = " << trueTau->pdgId() << std::endl; 
 	 if ( trueTau->isTau() ) {
 	    if ( (bool)trueTau->auxdata<char>("IsHadronicTau") ) {
 	       ATH_MSG_DEBUG("Tau is hadronic tau");
@@ -209,7 +195,7 @@ StatusCode PhysValTau::fillHistograms()
 	       }
 
 	       xAOD::TauJetParameters::DecayMode trueMode
-		  = m_truthTool.getDecayMode(*trueTau);
+		  = m_truthTool->getDecayMode(*trueTau);
 	       m_oTauValidationPlots->m_oMigrationPlots.fill(*tau, trueMode);
 	       if ( nominal ) {
 		  m_oTauValidationPlots->m_oMigrationPlotsNom.fill(*tau, trueMode);
@@ -226,7 +212,6 @@ StatusCode PhysValTau::fillHistograms()
 	    if ( truth->status() != 1 ) continue;
 	    if ( truth->pt() < 10000.0 ) continue;
 	    if ( tau->p4().DeltaR(truth->p4()) > 0.2 ) continue;
-	    std::cout << "Found electron!" << std::endl;
 	    // OK, now it probably is an electron
 	    isElectron = true;
 	    break;
-- 
GitLab