From c0bec59918555675a77a2714fb81464dfd0767b0 Mon Sep 17 00:00:00 2001
From: Peter Onyisi <ponyisi@utexas.edu>
Date: Sat, 14 Nov 2020 19:20:40 +0100
Subject: [PATCH] Declare HighLevelBTag decorations for AthenaMT monitoring
 scheduling

---
 .../BTagAugmenterTool.h                       |  2 ++
 .../BTagMuonAugmenter.h                       |  1 +
 .../BTagMuonAugmenterTool.h                   |  2 ++
 .../FlavorTagDiscriminants/DL2Tool.h          |  2 ++
 .../ISingleJetDecorator.h                     |  2 ++
 .../Root/BTagAugmenterTool.cxx                |  5 ++++
 .../Root/BTagMuonAugmenter.cxx                | 25 +++++++++++++++++++
 .../Root/BTagMuonAugmenterTool.cxx            |  4 +++
 .../FlavorTagDiscriminants/Root/DL2Tool.cxx   |  4 +++
 .../BTagging/BTagging/HighLevelBTagAlg.h      |  1 +
 .../BTagging/src/HighLevelBTagAlg.cxx         |  8 ++++++
 .../src/JetTagMonitorAlgorithm.cxx            | 24 ++++++++++++++++--
 .../src/JetTagMonitorAlgorithm.h              |  2 ++
 13 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagAugmenterTool.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagAugmenterTool.h
index 2dccea71731..9539b074c43 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagAugmenterTool.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagAugmenterTool.h
@@ -24,6 +24,8 @@ namespace FlavorTagDiscriminants {
     StatusCode initialize() override;
 
     virtual void decorate(const xAOD::Jet& jet) const override;
+
+    virtual std::set<std::string> getDecoratorKeys() const override;
   private:
     std::string m_flipTagConfig;
     std::unique_ptr<BTagJetAugmenter> m_aug; //!
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenter.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenter.h
index fe60ee7d813..e52024bf1aa 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenter.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenter.h
@@ -29,6 +29,7 @@ namespace FlavorTagDiscriminants {
     ~BTagMuonAugmenter();
     BTagMuonAugmenter(BTagMuonAugmenter&&);
     void augment(const xAOD::Jet& jet) const;
+    std::set<std::string> getDecoratorKeys() const;
   private:
     // You'll probably have to add some accessors here
     BTagTrackIpAccessor m_btag_track_aug;
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenterTool.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenterTool.h
index 3ac936f4d8a..b31a8a74c0e 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenterTool.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/BTagMuonAugmenterTool.h
@@ -24,6 +24,8 @@ namespace FlavorTagDiscriminants {
 
     // returns 0 for success
     virtual void decorate(const xAOD::Jet& jet) const override;
+
+    virtual std::set<std::string> getDecoratorKeys() const override;
   private:
     std::unique_ptr<BTagMuonAugmenter> m_aug;
     std::string m_muonAssociationName;
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/DL2Tool.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/DL2Tool.h
index ca12cdadd51..cbf746fefa3 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/DL2Tool.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/DL2Tool.h
@@ -29,6 +29,8 @@ namespace FlavorTagDiscriminants {
 
     // returns 0 for success
     virtual void decorate(const xAOD::Jet& jet) const override;
+
+    virtual std::set<std::string> getDecoratorKeys() const override;
   private:
     DL2Properties m_props; //!
     std::unique_ptr<DL2HighLevel> m_dl2; //!
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/ISingleJetDecorator.h b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/ISingleJetDecorator.h
index 2d13b4b32b5..a90885a9b44 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/ISingleJetDecorator.h
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/FlavorTagDiscriminants/ISingleJetDecorator.h
@@ -20,6 +20,8 @@ public:
   /// Method to decorate a jet.
   virtual void decorate(const xAOD::Jet& jet) const = 0;
 
+  // Names of the decorations being added
+  virtual std::set<std::string> getDecoratorKeys() const = 0;
 };
 
 
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagAugmenterTool.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagAugmenterTool.cxx
index 5daf2dbcdad..ec0bea99966 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagAugmenterTool.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagAugmenterTool.cxx
@@ -27,4 +27,9 @@ namespace FlavorTagDiscriminants {
     m_aug->augment(jet);
   }
 
+  std::set<std::string> BTagAugmenterTool::getDecoratorKeys() const {
+    const auto keys{m_aug->getDecoratorKeys()};
+    return std::set<std::string>(keys.begin(), keys.end());
+  }
+
 }
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenter.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenter.cxx
index 81a2fb69963..1c20b56e699 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenter.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenter.cxx
@@ -163,4 +163,29 @@ namespace FlavorTagDiscriminants {
 
   }
 
+std::set<std::string> BTagMuonAugmenter::getDecoratorKeys() const {
+  const auto& type_registry = SG::AuxTypeRegistry::instance();
+  std::set<std::string> keys;
+  for (const auto& auxid: {
+    m_dec_muon_isDefaults.auxid(),
+    m_dec_muon_pt.auxid(),
+    m_dec_muon_dR.auxid(),
+    m_dec_muon_eta.auxid(),
+    m_dec_muon_phi.auxid(),
+    m_dec_muon_qOverPratio.auxid(),
+    m_dec_muon_mombalsignif.auxid(),
+    m_dec_muon_scatneighsignif.auxid(),
+    m_dec_muon_pTrel.auxid(),
+    m_dec_muon_ip3d_d0.auxid(),
+    m_dec_muon_ip3d_z0.auxid(),
+    m_dec_muon_ip3d_d0_significance.auxid(),
+    m_dec_muon_ip3d_z0_significance.auxid(),
+    m_dec_muon_ip3d_sigma_d0.auxid(),
+    m_dec_muon_ip3d_sigma_z0.auxid(),
+    m_dec_muon_link.auxid()}) {
+    keys.insert(type_registry.getName(auxid));
+  }
+  return keys;
+}
+
 }
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenterTool.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenterTool.cxx
index 8616b719b49..0b1926fd919 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenterTool.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/BTagMuonAugmenterTool.cxx
@@ -31,4 +31,8 @@ namespace FlavorTagDiscriminants {
     m_aug->augment(jet);
   }
 
+  std::set<std::string> BTagMuonAugmenterTool::getDecoratorKeys() const {
+    return m_aug->getDecoratorKeys();
+  }
+
 }
diff --git a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/DL2Tool.cxx b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/DL2Tool.cxx
index 818ab6c1dc4..32f219f8a82 100644
--- a/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/DL2Tool.cxx
+++ b/PhysicsAnalysis/JetTagging/FlavorTagDiscriminants/Root/DL2Tool.cxx
@@ -32,4 +32,8 @@ namespace FlavorTagDiscriminants {
     m_dl2->decorate(jet);
   }
 
+  std::set<std::string> DL2Tool::getDecoratorKeys() const {
+    return m_dl2->getDataDependencyNames().bTagOutputs;
+  }
+
 }
diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/HighLevelBTagAlg.h b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/HighLevelBTagAlg.h
index eec3d81b75b..8c23a51e79b 100644
--- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/HighLevelBTagAlg.h
+++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/BTagging/HighLevelBTagAlg.h
@@ -55,6 +55,7 @@ namespace Analysis
 
         SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_dec_track_pos {this, "trackDisplacement","trackDisplacement","trackDisplacement of tracks" };
         SG::ReadDecorHandleKey< xAOD::TrackParticleContainer > m_dec_track_mom {this, "trackMomentum","trackMomentum","trackMomentum of tracks" };
+        std::vector<std::unique_ptr<SG::WriteDecorHandleKey<xAOD::BTaggingContainer>>> m_outputKeys;
 
   }; // End class
 
diff --git a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
index 0f88f4e5737..9aca1b66364 100644
--- a/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagAlgs/BTagging/src/HighLevelBTagAlg.cxx
@@ -61,6 +61,14 @@ namespace Analysis {
     CHECK( m_dec_track_pos.initialize() );
     CHECK( m_dec_track_mom.initialize() );
 
+    // create and initialize write handles
+    for (const std::string key: m_jetDecorator->getDecoratorKeys()) {
+      std::string full_key = m_BTagCollectionName.key() + "." + key;
+      ATH_MSG_DEBUG("Adding " << full_key);
+      m_outputKeys.emplace_back(std::make_unique<SG::WriteDecorHandleKey<xAOD::BTaggingContainer>>(this, key, full_key, ""));
+      ATH_MSG_DEBUG("Initializing " << full_key);
+      ATH_CHECK(m_outputKeys.back()->initialize());
+    }
     return StatusCode::SUCCESS;
   }
 
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
index bffb1d02ae0..e1b1bd77bfd 100755
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.cxx
@@ -80,6 +80,7 @@ JetTagMonitorAlgorithm::~JetTagMonitorAlgorithm() {}
 
 StatusCode JetTagMonitorAlgorithm::initialize() {
 
+  ATH_CHECK(AthMonitorAlgorithm::initialize());
   ATH_CHECK(m_jetContainerKey.initialize());
   ATH_CHECK(m_muonContainerKey.initialize());
   ATH_CHECK(m_electronContainerKey.initialize());
@@ -87,7 +88,24 @@ StatusCode JetTagMonitorAlgorithm::initialize() {
   ATH_CHECK(m_vertContainerKey.initialize());
   ATH_CHECK(m_trackContainerKey.initialize());
 
-  return AthMonitorAlgorithm::initialize();
+  if (m_btagLinkKey.empty()) {
+    m_btagLinkKey = m_jetContainerKey.key() + ".btaggingLink";
+  }
+  ATH_CHECK(m_btagLinkKey.initialize());
+
+  if (m_btagResultKey.empty()) {
+    if (m_mv_algorithmName=="DL1" || m_mv_algorithmName=="DL1r" || m_mv_algorithmName=="DL1rnn") {
+      std::string rawJetContainerName = m_jetContainerKey.key();
+      const size_t jetStringItr = rawJetContainerName.find("Jets");
+      if (jetStringItr != std::string::npos) {
+        rawJetContainerName = rawJetContainerName.replace(jetStringItr, std::string::npos, "");
+      }
+      m_btagResultKey = "BTagging_" + rawJetContainerName + "." + m_mv_algorithmName + "_pb";
+    }
+  }
+  ATH_CHECK(m_btagResultKey.initialize(SG::AllowEmpty));
+
+  return StatusCode::SUCCESS;
 }
 
 
@@ -745,7 +763,9 @@ double JetTagMonitorAlgorithm::getMVweight(const xAOD::Jet *jet) const {
     bTaggingObject->pc(m_mv_algorithmName,mv_pc);
     bTaggingObject->pb(m_mv_algorithmName,mv_pb);
     //DL1* formula (standard)
-    mv = log( mv_pb / ( mv_pu * ( 1 - m_mv_cFraction ) + mv_pc * m_mv_cFraction ) );
+    if ( mv_pb != 0 && (mv_pu != 0 || mv_pc || 0)) {
+      mv = log( mv_pb / ( mv_pu * ( 1 - m_mv_cFraction ) + mv_pc * m_mv_cFraction ) );
+    }
     //DL1*c formula (for DL1c)
     //mv = log( mv_pb / ( mv_pu * ( 1 - m_mv_bFraction ) + mv_pc * m_mv_bFraction ) );
   }
diff --git a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h
index 9864bd41640..d8e8ea76969 100755
--- a/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h
+++ b/PhysicsAnalysis/JetTagging/JetTagMonitoring/src/JetTagMonitorAlgorithm.h
@@ -42,6 +42,8 @@ class JetTagMonitorAlgorithm : public AthMonitorAlgorithm {
   SG::ReadHandleKey<xAOD::JetContainer> m_jetContainerKey;
   SG::ReadHandleKey<xAOD::MuonContainer> m_muonContainerKey;
   SG::ReadHandleKey<xAOD::ElectronContainer> m_electronContainerKey;
+  SG::ReadDecorHandleKey<xAOD::JetContainer> m_btagLinkKey{this,"BTagLinkKey","","RDHK for btag links"};
+  SG::ReadDecorHandleKey<xAOD::BTaggingContainer> m_btagResultKey{this,"BTagResultKey","","RDHK for monitored BTag variables"};
   
   bool m_skipJetFilter; //true for HI/HI-p collisions, false for pp collisions
   std::string m_trackParticleName;
-- 
GitLab