From a267543def2b78a69385e41a6ef58d9240e99f12 Mon Sep 17 00:00:00 2001
From: Jovan Mitrevski <Jovan.Mitrevski@cern.ch>
Date: Mon, 29 Jan 2018 16:38:51 +0100
Subject: [PATCH] start adding isolation correction information

---
 .../IsolationAlgs/python/IsoGetter.py         |  4 +-
 .../IsolationAlgs/src/IsolationBuilder.cxx    | 45 ++++++++++++++-----
 .../IsolationAlgs/src/IsolationBuilder.h      |  5 ++-
 3 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/Reconstruction/RecoAlgs/IsolationAlgs/python/IsoGetter.py b/Reconstruction/RecoAlgs/IsolationAlgs/python/IsoGetter.py
index 4a8e4313c6e..8d5590245ff 100644
--- a/Reconstruction/RecoAlgs/IsolationAlgs/python/IsoGetter.py
+++ b/Reconstruction/RecoAlgs/IsolationAlgs/python/IsoGetter.py
@@ -198,13 +198,13 @@ IsoTypesFe =  [
 IsoCorEg = [
   [ isoPar.core57cells, isoPar.ptCorrection ],
   [ isoPar.core57cells, isoPar.ptCorrection, isoPar.pileupCorrection ],
-  [ isoPar.coreTrackPtr ] #still hard-coded
+  [ isoPar.coreTrackPtr ]
   ]
 IsoCorMu = [
   #[ isoPar.coreCone ], 
   [ isoPar.coreMuon ],
   [ isoPar.coreCone, isoPar.pileupCorrection ],
-  [ isoPar.coreTrackPtr ] #still hard-coded
+  [ isoPar.coreTrackPtr ]
   ]
 IsoCorFe = [
   [ isoPar.coreCone, isoPar.pileupCorrection ] 
diff --git a/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.cxx b/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.cxx
index 4d2a28d77d9..b21ca85722a 100644
--- a/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.cxx
+++ b/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.cxx
@@ -12,8 +12,6 @@
 // Isolation includes
 #include "IsolationBuilder.h"
 
-
-
 IsolationBuilder::IsolationBuilder( const std::string& name, 
 				    ISvcLocator* pSvcLocator ) : 
   ::AthAlgorithm( name, pSvcLocator )
@@ -174,14 +172,16 @@ StatusCode IsolationBuilder::execute()
   return StatusCode::SUCCESS;
 }
 
-IsolationBuilder::CaloIsoHelpHandles::CaloIsoHelpHandles(const IsolationBuilder::CaloIsoHelpKey& keys)
+IsolationBuilder::CaloIsoHelpHandles::CaloIsoHelpHandles(const IsolationBuilder::CaloIsoHelpKey& keys) :
+  corrBitsetDeco(keys.corrBitsetDeco)
 {
   for (const auto& key : keys.isoDeco) {
     isoDeco.emplace_back(key);
   }
 }
 
-IsolationBuilder::TrackIsoHelpHandles::TrackIsoHelpHandles(const IsolationBuilder::TrackIsoHelpKey& keys)
+IsolationBuilder::TrackIsoHelpHandles::TrackIsoHelpHandles(const IsolationBuilder::TrackIsoHelpKey& keys) :
+  corrBitsetDeco(keys.corrBitsetDeco)
 {
   for (const auto& key : keys.isoDeco) {
     isoDeco.emplace_back(key);
@@ -258,8 +258,17 @@ StatusCode IsolationBuilder::initializeIso(std::set<xAOD::Iso::IsolationFlavour>
       continue;
     }
 
+    std::string bitsetName = prefix + xAOD::Iso::toString(isoFlav) + "CorrBitset";
+    if (customConfig != "") {
+      bitsetName += "_" + customConfig;
+    }
+
     if (isoFlav == xAOD::Iso::etcone || isoFlav == xAOD::Iso::topoetcone || isoFlav == xAOD::Iso::neflowisol) {
-      
+  
+      cisoH.corrBitsetDeco = bitsetName;
+      ATH_CHECK(cisoH.corrBitsetDeco.initialize());
+ 
+
       for (size_t corrType = 0; corrType < corInts[flavor].size(); corrType++) {
 	const auto cor = static_cast<unsigned int>(corInts[flavor][corrType]);
 	cisoH.CorrList.calobitset.set(cor);
@@ -287,7 +296,15 @@ StatusCode IsolationBuilder::initializeIso(std::set<xAOD::Iso::IsolationFlavour>
 	return StatusCode::FAILURE;
       }
     } else if (isoFlav == xAOD::Iso::ptcone) {
-      tisoH.CorrList.trackbitset.set(static_cast<unsigned int>(xAOD::Iso::coreTrackPtr));
+
+      tisoH.corrBitsetDeco = bitsetName;
+      ATH_CHECK(tisoH.corrBitsetDeco.initialize());
+
+      for (size_t corrType = 0; corrType < corInts[flavor].size(); corrType++) {
+	const auto cor = static_cast<unsigned int>(corInts[flavor][corrType]);
+	tisoH.CorrList.trackbitset.set(cor);
+      }
+
       if (trackIsoMap) {
 	trackIsoMap->push_back(std::make_pair(isoFlav,tisoH));
       } else {
@@ -336,6 +353,10 @@ StatusCode IsolationBuilder::executeCaloIso(const std::vector<std::pair<xAOD::Is
 	  ATH_MSG_DEBUG("custom Iso " << xAOD::Iso::toCString(keys.isoTypes[i]) << " = " << iso/1e3);
 	  (handles.isoDeco[i])(*part) = iso;
 	}
+	// corrections
+	(handles.corrBitsetDeco)(*part) = keys.CorrList.calobitset.to_ulong();
+
+
 	// not that nice. I expect a single core correction (e.g. for topoetcone, not coreMuon and coreCone together...)
 	if (keys.addCoreCorr) {
 	  SG::WriteDecorHandle<xAOD::IParticleContainer, float> coreCorisoDeco(keys.coreCorisoDeco);
@@ -352,15 +373,15 @@ StatusCode IsolationBuilder::executeCaloIso(const std::vector<std::pair<xAOD::Is
 	      if (CaloIsoResult.coreCorrections[icc].find(xAOD::Iso::coreEnergy) != CaloIsoResult.coreCorrections[icc].end()) {
 		coreCorisoDeco(*part) = CaloIsoResult.coreCorrections[icc][xAOD::Iso::coreEnergy];
 	      } else {
-		ATH_MSG_WARNING("Cannot find the core energy correction for custom flavour " << xAOD::Iso::toCString(flav));
+		ATH_MSG_WARNING("Cannot find the core energy correction for flavor " << xAOD::Iso::toCString(flav));
 	      }
 	    } else {
-	      ATH_MSG_WARNING("Cannot find the core correction for custom flavour " << xAOD::Iso::toCString(flav));
+	      ATH_MSG_WARNING("Cannot find the core correction for flavor " << xAOD::Iso::toCString(flav));
 	    }
 	  }
 	}
       } else {
-	ATH_MSG_ERROR("Call to CaloIsolationTool failed for custom flavour " << xAOD::Iso::toCString(flav));
+	ATH_MSG_ERROR("Call to CaloIsolationTool failed for flavor " << xAOD::Iso::toCString(flav));
 	return StatusCode::RECOVERABLE;
       }
     }
@@ -397,8 +418,12 @@ StatusCode IsolationBuilder::executeTrackIso(const std::vector<std::pair<xAOD::I
 	  (handles.isoDeco[i])(*part) = iso;
 	  (handles.isoDecoV[i])(*part) = isoV;
 	}
+
+	// corrections
+	(handles.corrBitsetDeco)(*part) = keys.CorrList.trackbitset.to_ulong();
+
       } else {
-	ATH_MSG_ERROR("Call to TrackIsolationTool failed for custom flavour " << xAOD::Iso::toCString(flav));
+	ATH_MSG_ERROR("Call to TrackIsolationTool failed for flavor " << xAOD::Iso::toCString(flav));
 	return StatusCode::RECOVERABLE;
       }
     }
diff --git a/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.h b/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.h
index de89ad30dd5..b492985b908 100644
--- a/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.h
+++ b/Reconstruction/RecoAlgs/IsolationAlgs/src/IsolationBuilder.h
@@ -163,6 +163,7 @@ class IsolationBuilder
     SG::WriteDecorHandleKey<xAOD::IParticleContainer> coreCorisoDeco;
     std::vector<xAOD::Iso::IsolationType> isoTypes;
     xAOD::CaloCorrection CorrList;
+    SG::WriteDecorHandleKey<xAOD::IParticleContainer> corrBitsetDeco;
   };
 
   std::vector<std::pair<xAOD::Iso::IsolationFlavour,CaloIsoHelpKey> > m_elCaloIso;
@@ -175,6 +176,7 @@ class IsolationBuilder
     std::vector<SG::WriteDecorHandleKey<xAOD::IParticleContainer> > isoDecoV;
     std::vector<xAOD::Iso::IsolationType> isoTypes;
     xAOD::TrackCorrection CorrList;
+    SG::WriteDecorHandleKey<xAOD::IParticleContainer> corrBitsetDeco;
   };
 
   std::vector<std::pair<xAOD::Iso::IsolationFlavour,TrackIsoHelpKey> > m_elTrackIso;
@@ -186,7 +188,7 @@ class IsolationBuilder
     CaloIsoHelpHandles(const CaloIsoHelpKey& keys);
 
     std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float> > isoDeco;
-    // SG::WriteDecorHandle<xAOD::IParticleContainer, float> coreCorisoDeco; // try moving it
+    SG::WriteDecorHandle<xAOD::IParticleContainer, uint32_t> corrBitsetDeco;
   };
 
 
@@ -196,6 +198,7 @@ class IsolationBuilder
 
     std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float> > isoDeco;
     std::vector<SG::WriteDecorHandle<xAOD::IParticleContainer, float> > isoDecoV;
+    SG::WriteDecorHandle<xAOD::IParticleContainer, uint32_t> corrBitsetDeco;
   };
 
 
-- 
GitLab