From ca86ee6575a37aa4a94e8727a074dd09979aa62e Mon Sep 17 00:00:00 2001
From: Jason Robert Veatch <jason.veatch@cern.ch>
Date: Mon, 18 Feb 2019 19:53:08 +0000
Subject: [PATCH] Adding generalized energy correlation tools

---
 .../python/JetRecStandardToolManager.py       |  4 +-
 .../Jet/JetRec/python/JetRecStandardTools.py  | 10 +-
 .../EnergyCorrelatorGeneralizedRatiosTool.h   | 23 +++++
 .../EnergyCorrelatorGeneralizedTool.h         | 25 +++++
 .../JetSubStructureMomentToolsDict.h          |  4 +-
 .../EnergyCorrelatorGeneralizedRatiosTool.cxx | 95 +++++++++++++++++++
 .../Root/EnergyCorrelatorGeneralizedTool.cxx  | 76 +++++++++++++++
 .../JetSubStructureMomentTools/Root/LinkDef.h |  6 +-
 .../python/DefaultTools.py                    |  9 +-
 .../JetSubStructureMomentTools/share/run.py   | 12 ++-
 .../components/JetSubStructure_entries.cxx    |  4 +
 .../EnergyCorrelatorGeneralized.h             | 30 ++++++
 12 files changed, 292 insertions(+), 6 deletions(-)
 create mode 100644 Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/EnergyCorrelatorGeneralizedRatiosTool.h
 create mode 100644 Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/EnergyCorrelatorGeneralizedTool.h
 create mode 100644 Reconstruction/Jet/JetSubStructureMomentTools/Root/EnergyCorrelatorGeneralizedRatiosTool.cxx
 create mode 100644 Reconstruction/Jet/JetSubStructureMomentTools/Root/EnergyCorrelatorGeneralizedTool.cxx
 create mode 100644 Reconstruction/Jet/JetSubStructureUtils/JetSubStructureUtils/EnergyCorrelatorGeneralized.h

diff --git a/Reconstruction/Jet/JetRec/python/JetRecStandardToolManager.py b/Reconstruction/Jet/JetRec/python/JetRecStandardToolManager.py
index 4953194d4af..9a78390f956 100644
--- a/Reconstruction/Jet/JetRec/python/JetRecStandardToolManager.py
+++ b/Reconstruction/Jet/JetRec/python/JetRecStandardToolManager.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 # JetRecStandardToolManager.py
 #
@@ -222,6 +222,8 @@ groomed_modifiers = [
     jtm.ktdr,
     jtm.ktsplitter,
     jtm.encorr,
+    jtm.energycorrelatorgeneralized,
+    jtm.energycorrelatorgeneralizedratios,
     jtm.charge,
     jtm.angularity,
     jtm.comshapes,
diff --git a/Reconstruction/Jet/JetRec/python/JetRecStandardTools.py b/Reconstruction/Jet/JetRec/python/JetRecStandardTools.py
index 8f3dd70a0eb..15fbb4d7ffe 100644
--- a/Reconstruction/Jet/JetRec/python/JetRecStandardTools.py
+++ b/Reconstruction/Jet/JetRec/python/JetRecStandardTools.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 # JetRecStandardTools.py
 #
@@ -89,6 +89,8 @@ from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import Dipolarity
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import PlanarFlowTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import KtMassDropTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import EnergyCorrelatorTool
+from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import EnergyCorrelatorGeneralizedTool
+from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import EnergyCorrelatorGeneralizedRatiosTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import CenterOfMassShapesTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import JetPullTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import JetChargeTool
@@ -786,6 +788,12 @@ jtm += KtMassDropTool("ktmassdrop")
 # Energy correlations.
 jtm += EnergyCorrelatorTool("encorr", Beta = 1.0)
 
+# Generalized energy correlations
+jtm += EnergyCorrelatorGeneralizedTool("energycorrelatorgeneralized")
+
+# ... & their ratios
+jtm += EnergyCorrelatorGeneralizedRatiosTool("energycorrelatorgeneralizedratios")
+
 # COM shapes.
 jtm += CenterOfMassShapesTool("comshapes")
 
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/EnergyCorrelatorGeneralizedRatiosTool.h b/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/EnergyCorrelatorGeneralizedRatiosTool.h
new file mode 100644
index 00000000000..7eb332e2cf1
--- /dev/null
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/EnergyCorrelatorGeneralizedRatiosTool.h
@@ -0,0 +1,23 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef jetsubstructuremomenttools_energycorrelatorgeneralizedratiostool_header
+#define jetsubstructuremomenttools_energycorrelatorgeneralizedratiostool_header
+
+#include "JetSubStructureMomentTools/JetSubStructureMomentToolsBase.h"
+
+class EnergyCorrelatorGeneralizedRatiosTool :
+  public JetSubStructureMomentToolsBase {
+    ASG_TOOL_CLASS(EnergyCorrelatorGeneralizedRatiosTool, IJetModifier)
+    
+    public:
+      // Constructor and destructor
+      EnergyCorrelatorGeneralizedRatiosTool(std::string name);
+
+      int modifyJet(xAOD::Jet &jet) const;
+
+    private:
+};
+
+#endif
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/EnergyCorrelatorGeneralizedTool.h b/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/EnergyCorrelatorGeneralizedTool.h
new file mode 100644
index 00000000000..3834ad912ee
--- /dev/null
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/EnergyCorrelatorGeneralizedTool.h
@@ -0,0 +1,25 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef jetsubstructuremomenttools_energycorrelatorgeneralizedtool_header
+#define jetsubstructuremomenttools_energycorrelatorgeneralizedtool_header
+
+#include "JetSubStructureMomentTools/JetSubStructureMomentToolsBase.h"
+
+class EnergyCorrelatorGeneralizedTool :
+  public JetSubStructureMomentToolsBase {
+    ASG_TOOL_CLASS(EnergyCorrelatorGeneralizedTool, IJetModifier)
+    
+    public:
+      // Constructor and destructor
+      EnergyCorrelatorGeneralizedTool(std::string name);
+
+      int modifyJet(xAOD::Jet &jet) const;
+
+    private:
+      float m_Beta;
+};
+
+
+#endif
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/JetSubStructureMomentToolsDict.h b/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/JetSubStructureMomentToolsDict.h
index c2ae287a189..f34f681efac 100644
--- a/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/JetSubStructureMomentToolsDict.h
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/JetSubStructureMomentTools/JetSubStructureMomentToolsDict.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef JETSUBSTRUCTUREMOMENTTOOLS_JETSUBSTRUCTUREMOMENTTOOLSDICT_H
@@ -12,6 +12,7 @@
 #include "JetSubStructureMomentTools/ShowerDeconstructionTool.h"
 #include "JetSubStructureMomentTools/BoostedXbbTagTool.h"
 #include "JetSubStructureMomentTools/EnergyCorrelatorRatiosTool.h"
+#include "JetSubStructureMomentTools/EnergyCorrelatorGeneralizedRatiosTool.h"
 #include "JetSubStructureMomentTools/JetPullTool.h"
 #include "JetSubStructureMomentTools/KTSplittingScaleTool.h"
 #include "JetSubStructureMomentTools/NSubjettinessTool.h"
@@ -19,6 +20,7 @@
 #include "JetSubStructureMomentTools/VolatilityTool.h"
 #include "JetSubStructureMomentTools/BosonTagTool.h"
 #include "JetSubStructureMomentTools/EnergyCorrelatorTool.h"
+#include "JetSubStructureMomentTools/EnergyCorrelatorGeneralizedTool.h"
 #include "JetSubStructureMomentTools/JetSubStructureMomentToolsBase.h"
 #include "JetSubStructureMomentTools/KtDeltaRTool.h"
 #include "JetSubStructureMomentTools/PlanarFlowTool.h"
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/Root/EnergyCorrelatorGeneralizedRatiosTool.cxx b/Reconstruction/Jet/JetSubStructureMomentTools/Root/EnergyCorrelatorGeneralizedRatiosTool.cxx
new file mode 100644
index 00000000000..e0a2fe425ff
--- /dev/null
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/Root/EnergyCorrelatorGeneralizedRatiosTool.cxx
@@ -0,0 +1,95 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "JetSubStructureMomentTools/EnergyCorrelatorGeneralizedRatiosTool.h"
+#include "JetSubStructureUtils/EnergyCorrelatorGeneralized.h" 
+#include <math.h>
+
+using namespace std;
+using fastjet::PseudoJet;
+
+EnergyCorrelatorGeneralizedRatiosTool::EnergyCorrelatorGeneralizedRatiosTool(std::string name) : 
+  JetSubStructureMomentToolsBase(name)
+{
+}
+
+int EnergyCorrelatorGeneralizedRatiosTool::modifyJet(xAOD::Jet &jet) const {
+  float ecfg_2_1 = jet.getAttribute<float>("ECFG_2_1");
+  float ecfg_3_2 = jet.getAttribute<float>("ECFG_3_2");
+
+  float ecfg_4_2 = jet.getAttribute<float>("ECFG_4_2");
+  float ecfg_3_1 = jet.getAttribute<float>("ECFG_3_1");
+
+  // these ones for t/H discrimination
+  float ecfg_2_1_2 = jet.getAttribute<float>("ECFG_2_1_2");
+  float ecfg_3_1_1 = jet.getAttribute<float>("ECFG_3_1_1");
+  float ecfg_3_2_1 = jet.getAttribute<float>("ECFG_3_2_1");  
+  float ecfg_3_2_2 = jet.getAttribute<float>("ECFG_3_2_2");
+  float ecfg_4_2_2 = jet.getAttribute<float>("ECFG_4_2_2");
+  float ecfg_3_3_1 = jet.getAttribute<float>("ECFG_3_3_1");
+  float ecfg_4_4_1 = jet.getAttribute<float>("ECFG_4_4_1");
+
+  // N2
+  if(fabs(ecfg_2_1) > 1e-8) // Prevent div-0
+    jet.setAttribute("N2", ecfg_3_2  / (pow(ecfg_2_1, 2.0)));
+  else
+    jet.setAttribute("N2", -999.0);
+
+  // N3
+  if(fabs(ecfg_3_1) > 1e-8) // Prevent div-0
+    jet.setAttribute("N3", ecfg_4_2  / (pow(ecfg_3_1, 2.0)));
+  else
+    jet.setAttribute("N3", -999.0);
+
+  // M2
+  if(fabs(ecfg_2_1) > 1e-8) // Prevent div-0
+    jet.setAttribute("M2", ecfg_3_2  / ecfg_2_1);
+  else
+    jet.setAttribute("M2", -999.0);
+
+  // L-series variables
+  // (experimental for ttH t/H discrimination)
+
+  /*
+    The exponents are determined in order to make 
+    the whole thing dimensionless
+    
+    E = (a*n) / (b*m)
+    for an ECFG_X_Y_Z, a=Y, n=Z
+
+    e.g. for L1
+    
+    ecfg_3_3_1 / ecfg_2_1_2
+    E = (3*1) / (1*2) = 3./2.
+  */
+
+  if(fabs(ecfg_2_1_2) > 1e-8)
+    {
+      jet.setAttribute("L1", ecfg_3_2_1 / (pow(ecfg_2_1_2, (1.) )));
+      jet.setAttribute("L2", ecfg_3_3_1 / (pow(ecfg_2_1_2, (3./2.) )));
+    }
+  else
+    {
+      jet.setAttribute("L1",-999.0);
+      jet.setAttribute("L2",-999.0);
+    }
+
+  if(fabs(ecfg_3_3_1) > 1e-8)
+    {  
+      jet.setAttribute("L3", ecfg_3_1_1 / (pow(ecfg_3_3_1, (1./3.) )) );
+      jet.setAttribute("L4", ecfg_3_2_2 / (pow(ecfg_3_3_1, (4./3.) )) );
+    }
+  else
+    {
+      jet.setAttribute("L3",-999.0);
+      jet.setAttribute("L4",-999.0);
+    }
+
+  if(fabs(ecfg_4_4_1) > 1e-8)
+    jet.setAttribute("L5", ecfg_4_2_2 / (pow(ecfg_4_4_1, (1.) )) );
+  else
+    jet.setAttribute("L5",-999.0);
+  
+  return 0;
+}
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/Root/EnergyCorrelatorGeneralizedTool.cxx b/Reconstruction/Jet/JetSubStructureMomentTools/Root/EnergyCorrelatorGeneralizedTool.cxx
new file mode 100644
index 00000000000..05a8d7bced5
--- /dev/null
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/Root/EnergyCorrelatorGeneralizedTool.cxx
@@ -0,0 +1,76 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "JetSubStructureMomentTools/EnergyCorrelatorGeneralizedTool.h"
+#include "JetSubStructureUtils/EnergyCorrelatorGeneralized.h" 
+#include "fastjet/contrib/EnergyCorrelator.hh" 
+#include "JetSubStructureUtils/EnergyCorrelator.h" 
+
+using namespace std;
+using fastjet::PseudoJet;
+
+EnergyCorrelatorGeneralizedTool::EnergyCorrelatorGeneralizedTool(std::string name) : 
+  JetSubStructureMomentToolsBase(name)
+{
+  ATH_MSG_DEBUG("Initializing EnergyCorrelator tool.");
+  declareProperty("Beta", m_Beta = 1.0);
+}
+
+int EnergyCorrelatorGeneralizedTool::modifyJet(xAOD::Jet &jet) const {
+  if(checkForConstituents(jet) == false) return 1;
+
+  // N.B. here _angles, _n, _beta !!
+
+  // These ones are necessary for N2, M2, etc.
+
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_3_2(2, 3, m_Beta, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_2_1(1, 2, m_Beta, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_4_2(2, 4, m_Beta, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_3_1(1, 3, m_Beta, JetSubStructureUtils::EnergyCorrelator::pt_R);
+
+  jet.setAttribute("ECFG_2_1", ECFG_2_1.result(jet));
+  jet.setAttribute("ECFG_3_2", ECFG_3_2.result(jet));
+  jet.setAttribute("ECFG_3_1", ECFG_3_1.result(jet));
+  jet.setAttribute("ECFG_4_2", ECFG_4_2.result(jet));
+
+  // these ones for t/H discrimination
+
+  // 332
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_3_3_2(3, 3, 2, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_3_3_2", ECFG_3_3_2.result(jet));
+ 
+  // 461
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_4_6_1(6, 4, 1, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_4_6_1", ECFG_4_6_1.result(jet));
+
+  // 322
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_3_2_2(2, 3, 2, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_3_2_2", ECFG_3_2_2.result(jet));
+
+  // 331
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_3_3_1(3, 3, 1, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_3_3_1", ECFG_3_3_1.result(jet));
+
+  // 422
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_4_2_2(2, 4, 2, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_4_2_2", ECFG_4_2_2.result(jet));
+
+  // 441
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_4_4_1(4, 4, 1, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_4_4_1", ECFG_4_4_1.result(jet));
+
+  // 212
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_2_1_2(1, 2, 2, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_2_1_2", ECFG_2_1_2.result(jet));
+
+  // 321
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_3_2_1(2, 3, 1, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_3_2_1", ECFG_3_2_1.result(jet));
+
+  // 311
+  JetSubStructureUtils::EnergyCorrelatorGeneralized ECFG_3_1_1(1, 3, 1, JetSubStructureUtils::EnergyCorrelator::pt_R);
+  jet.setAttribute("ECFG_3_1_1", ECFG_3_1_1.result(jet));
+  
+  return 0;
+}
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/Root/LinkDef.h b/Reconstruction/Jet/JetSubStructureMomentTools/Root/LinkDef.h
index f0e745e3885..adec55f992c 100644
--- a/Reconstruction/Jet/JetSubStructureMomentTools/Root/LinkDef.h
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/Root/LinkDef.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "JetSubStructureMomentTools/AngularityTool.h"
@@ -9,6 +9,7 @@
 #include "JetSubStructureMomentTools/ShowerDeconstructionTool.h"
 #include "JetSubStructureMomentTools/BoostedXbbTagTool.h"
 #include "JetSubStructureMomentTools/EnergyCorrelatorRatiosTool.h"
+#include "JetSubStructureMomentTools/EnergyCorrelatorGeneralizedRatiosTool.h"
 #include "JetSubStructureMomentTools/JetPullTool.h"
 #include "JetSubStructureMomentTools/KTSplittingScaleTool.h"
 #include "JetSubStructureMomentTools/NSubjettinessTool.h"
@@ -16,6 +17,7 @@
 #include "JetSubStructureMomentTools/VolatilityTool.h"
 #include "JetSubStructureMomentTools/BosonTagTool.h"
 #include "JetSubStructureMomentTools/EnergyCorrelatorTool.h"
+#include "JetSubStructureMomentTools/EnergyCorrelatorGeneralizedTool.h"
 #include "JetSubStructureMomentTools/JetSubStructureMomentToolsBase.h"
 #include "JetSubStructureMomentTools/KtDeltaRTool.h"
 #include "JetSubStructureMomentTools/PlanarFlowTool.h"
@@ -40,6 +42,8 @@
 #pragma link C++ class DipolarityTool+;
 #pragma link C++ class EnergyCorrelatorRatiosTool+;
 #pragma link C++ class EnergyCorrelatorTool+;
+#pragma link C++ class EnergyCorrelatorGeneralizedRatiosTool+;
+#pragma link C++ class EnergyCorrelatorGeneralizedTool+;
 #pragma link C++ class ISubjetRecorderTool+;
 #pragma link C++ class JetChargeTool+;
 #pragma link C++ class JetPullTool+;
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/python/DefaultTools.py b/Reconstruction/Jet/JetSubStructureMomentTools/python/DefaultTools.py
index 8280a38974a..dc049402ab4 100644
--- a/Reconstruction/Jet/JetSubStructureMomentTools/python/DefaultTools.py
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/python/DefaultTools.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 
 
@@ -10,6 +10,7 @@ from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import Dipolarity
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import PlanarFlowTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import KtMassDropTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import EnergyCorrelatorTool
+from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import EnergyCorrelatorGeneralizedRatiosTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import CenterOfMassShapesTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import JetPullTool
 from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import JetChargeTool
@@ -69,6 +70,12 @@ def declareDefaultTools():
   # Jet charge
   jtm += JetChargeTool("charge", K=1.0)
 
+  # generalized ECFs
+  jtm += EnergyCorrelatorGeneralizedTool("energycorrelatorgeneralized")
+
+  # ... & their ratios
+  jtm += EnergyCorrelatorGeneralizedRatiosTool("energycorrelatorgeneralizedratios")
+
   # Shower deconstruction.
   if jtm.haveShowerDeconstructionTool:
     jtm += ShowerDeconstructionTool("showerdec")
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/share/run.py b/Reconstruction/Jet/JetSubStructureMomentTools/share/run.py
index 4f480347f6d..3fb228597b1 100644
--- a/Reconstruction/Jet/JetSubStructureMomentTools/share/run.py
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/share/run.py
@@ -187,6 +187,16 @@ if 1:
   #energycorrelatorratios.IncludeBeta2 = True
   #energycorrelatorratios.IncludeECF4 = True
   jetrec2.JetModifiers += [energycorrelatorratios]
+  
+  from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import EnergyCorrelatorGeneralizedTool
+  ToolSvc += EnergyCorrelatorGeneralizedTool("energycorrelatorgeneralized")
+  energycorrelatorgeneralized = ToolSvc.energycorrelatorgeneralized
+  jetrec2.JetModifiers += [energycorrelatorgeneralized]
+
+  from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import EnergyCorrelatorGeneralizedRatiosTool
+  ToolSvc += EnergyCorrelatorGeneralizedRatiosTool("energycorrelatorgeneralizedratios")
+  energycorrelatorgeneralizedratios = ToolSvc.energycorrelatorgeneralizedratios
+  jetrec2.JetModifiers += [energycorrelatorgeneralizedratios]
 
   from JetSubStructureMomentTools.JetSubStructureMomentToolsConf import JetPullTool
   ToolSvc += JetPullTool("pull")
@@ -267,7 +277,7 @@ if 1:
   jdmp2.FloatMoments += ["FoxWolfram0", "FoxWolfram1", "FoxWolfram2", "FoxWolfram3", "FoxWolfram4"]
   jdmp2.FloatMoments += ["Sphericity", "Aplanarity"]
   jdmp2.FloatMoments += ["ECF1", "ECF2", "ECF3"]#, "ECF4"]#, "ECF1_Beta2", "ECF2_Beta2", "ECF3_Beta2", "ECF4_Beta2"]
-  jdmp2.FloatMoments += ["D2", "C1", "C2"]#, "C3"]#, "D2_Beta2", "C1_Beta2", "C2_Beta2", "C3_Beta2"]
+  jdmp2.FloatMoments += ["D2", "C1", "C2", "N2", "N3", "M2", "L1", "L2", "L3", "L4", "L5"]#, "C3"]#, "D2_Beta2", "C1_Beta2", "C2_Beta2", "C3_Beta2"]
   jdmp2.FloatMoments += ["PullMag", "PullPhi"]#, "Pull_C00", "Pull_C01", "Pull_C10", "Pull_C11"]
   jdmp2.FloatMoments += ["Charge"]
   #jdmp2.FloatMoments += ["Volatility"]
diff --git a/Reconstruction/Jet/JetSubStructureMomentTools/src/components/JetSubStructure_entries.cxx b/Reconstruction/Jet/JetSubStructureMomentTools/src/components/JetSubStructure_entries.cxx
index 62ccbeddd54..a0845d2dc50 100644
--- a/Reconstruction/Jet/JetSubStructureMomentTools/src/components/JetSubStructure_entries.cxx
+++ b/Reconstruction/Jet/JetSubStructureMomentTools/src/components/JetSubStructure_entries.cxx
@@ -11,6 +11,8 @@
 #include "JetSubStructureMomentTools/CenterOfMassShapesTool.h"
 #include "JetSubStructureMomentTools/EnergyCorrelatorTool.h"
 #include "JetSubStructureMomentTools/EnergyCorrelatorRatiosTool.h"
+#include "JetSubStructureMomentTools/EnergyCorrelatorGeneralizedTool.h"
+#include "JetSubStructureMomentTools/EnergyCorrelatorGeneralizedRatiosTool.h"
 #include "JetSubStructureMomentTools/JetPullTool.h"
 #include "JetSubStructureMomentTools/JetChargeTool.h"
 #include "JetSubStructureMomentTools/VolatilityTool.h"
@@ -35,6 +37,8 @@ DECLARE_COMPONENT( PlanarFlowTool )
 DECLARE_COMPONENT( CenterOfMassShapesTool )
 DECLARE_COMPONENT( EnergyCorrelatorTool )
 DECLARE_COMPONENT( EnergyCorrelatorRatiosTool )
+DECLARE_COMPONENT( EnergyCorrelatorGeneralizedTool )
+DECLARE_COMPONENT( EnergyCorrelatorGeneralizedRatiosTool )
 DECLARE_COMPONENT( JetPullTool )
 DECLARE_COMPONENT( JetChargeTool )
 DECLARE_COMPONENT( VolatilityTool )
diff --git a/Reconstruction/Jet/JetSubStructureUtils/JetSubStructureUtils/EnergyCorrelatorGeneralized.h b/Reconstruction/Jet/JetSubStructureUtils/JetSubStructureUtils/EnergyCorrelatorGeneralized.h
new file mode 100644
index 00000000000..cacb65d5acb
--- /dev/null
+++ b/Reconstruction/Jet/JetSubStructureUtils/JetSubStructureUtils/EnergyCorrelatorGeneralized.h
@@ -0,0 +1,30 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef jetsubstructureutils_energycorrelatorgeneralized_header
+#define jetsubstructureutils_energycorrelatorgeneralized_header
+
+#include "JetSubStructureUtils/SubstructureCalculator.h"
+#include "fastjet/contrib/EnergyCorrelator.hh"
+
+namespace JetSubStructureUtils {
+
+  class EnergyCorrelatorGeneralized : public SubstructureCalculator<double>,
+                           public fastjet::contrib::EnergyCorrelatorGeneralized { 
+    public:
+      EnergyCorrelatorGeneralized(int v_angles, int N, double beta, fastjet::contrib::EnergyCorrelator::Measure measure = fastjet::contrib::EnergyCorrelator::pt_R, fastjet::contrib::EnergyCorrelator::Strategy strategy = fastjet::contrib::EnergyCorrelator::storage_array) :
+        fastjet::contrib::EnergyCorrelatorGeneralized(v_angles, N, beta, measure, strategy) {};
+
+      using SubstructureCalculator::result;
+      virtual double result(const fastjet::PseudoJet &jet) const {
+        return fastjet::contrib::EnergyCorrelatorGeneralized::result(jet);
+      };
+
+      virtual std::string description() const{
+        return fastjet::contrib::EnergyCorrelatorGeneralized::description();
+      };
+  };
+}
+
+#endif
-- 
GitLab