From dda8567e9fc183d4f419c2699930ae19ac409c6f Mon Sep 17 00:00:00 2001
From: Baptiste Ravina <baptiste.ravina@cern.ch>
Date: Tue, 19 Mar 2024 17:42:00 +0100
Subject: [PATCH] CPAlgorithms: add truth-b-label to jets for JES uncertainties

CPAlgorithms: add truth-b-label to jets for JES uncertainties
---
 .../JetAnalysisAlgorithms/JetUncertaintiesAlg.h           | 7 +++++++
 .../JetAnalysisAlgorithms/Root/JetUncertaintiesAlg.cxx    | 8 ++++++++
 2 files changed, 15 insertions(+)

diff --git a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/JetAnalysisAlgorithms/JetUncertaintiesAlg.h b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/JetAnalysisAlgorithms/JetUncertaintiesAlg.h
index eb3cf87fa7c2..a1f324570a1a 100644
--- a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/JetAnalysisAlgorithms/JetUncertaintiesAlg.h
+++ b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/JetAnalysisAlgorithms/JetUncertaintiesAlg.h
@@ -15,6 +15,8 @@
 #include <SystematicsHandles/SysCopyHandle.h>
 #include <SystematicsHandles/SysListHandle.h>
 
+#include <optional>
+
 namespace CP
 {
   /// \brief an algorithm for calling \ref ICPJetUncertaintiesTool
@@ -69,6 +71,11 @@ namespace CP
   private:
     std::vector<CP::SystematicSet> m_systematicsVectorOnlyJERPseudoData;
 
+  private:
+    Gaudi::Property<std::string> m_isJESbtag {this, "isJESbtagLabel", "IsBjet", "The label to apply to truth b-tagged jets, for JES flavour uncertainties"};
+    std::optional<SG::AuxElement::Decorator<char>> m_decIsJESbtag;
+    std::optional<SG::AuxElement::Accessor<int>> m_accTruthLabel;
+
   };
 }
 
diff --git a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/Root/JetUncertaintiesAlg.cxx b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/Root/JetUncertaintiesAlg.cxx
index c75a456da353..a489bc249f2f 100644
--- a/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/Root/JetUncertaintiesAlg.cxx
+++ b/PhysicsAnalysis/Algorithms/JetAnalysisAlgorithms/Root/JetUncertaintiesAlg.cxx
@@ -44,6 +44,10 @@ namespace CP
     ANA_CHECK (m_systematicsList.initialize());
     ANA_CHECK (m_outOfValidity.initialize());
 
+    if (!m_isJESbtag.empty()) m_decIsJESbtag.emplace(m_isJESbtag);
+    const std::string labelB = "PartonTruthLabelID";
+    m_accTruthLabel.emplace(labelB);
+
     // CPU-optimisation: differentiate the systematics for the two tools
     // in initialisation rather than execution
     for (const auto&sys : m_systematicsList.systematicsVector())
@@ -70,6 +74,10 @@ namespace CP
 	ANA_CHECK (m_jetHandle.getCopy (jets, sys));
 	for (xAOD::Jet *jet : *jets)
 	  {
+	    // we need to tell the JES flavour uncertainty tool whether each jet is b-tagged at truth-level
+	    if (m_decIsJESbtag) {
+	      (*m_decIsJESbtag)(*jet) =  (*m_accTruthLabel)(*jet) == 5 ;
+	    }
 	    if (m_preselection.getBool (*jet, sys))
 	      {
 		ANA_CHECK_CORRECTION (m_outOfValidity, *jet, m_uncertaintiesTool->applyCorrection (*jet));
-- 
GitLab