From c2da79d2dc459a8bb0fe024b620f1f6d8bc1b6d1 Mon Sep 17 00:00:00 2001
From: Tomasz Bold <tomasz.bold@gmail.com>
Date: Mon, 4 Jun 2018 21:46:52 +0200
Subject: [PATCH] First version of the MET alg and tool

---
 .../TrigEFMissingET/CMakeLists.txt            |   6 +
 .../TrigEFMissingET/share/testMET.py          |  57 +++++++++
 .../TrigEFMissingET/src/EFMissingETAlgMT.cxx  |  95 ++++++++++++++
 .../TrigEFMissingET/src/EFMissingETAlgMT.h    |  43 +++++++
 .../src/EFMissingETFromCellsMT.cxx            | 117 ++++++++++++++++++
 .../src/EFMissingETFromCellsMT.h              |  59 +++++++++
 .../TrigEFMissingET/src/IMissingETTool.h      |  35 ++++++
 .../components/TrigEFMissingET_entries.cxx    |   4 +
 .../TrigEFMissingET/test/test_met_fexes.sh    |   5 +
 9 files changed, 421 insertions(+)
 create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/share/testMET.py
 create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.cxx
 create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.h
 create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.cxx
 create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.h
 create mode 100644 Trigger/TrigAlgorithms/TrigEFMissingET/src/IMissingETTool.h
 create mode 100755 Trigger/TrigAlgorithms/TrigEFMissingET/test/test_met_fexes.sh

diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/CMakeLists.txt b/Trigger/TrigAlgorithms/TrigEFMissingET/CMakeLists.txt
index 429d944448d..cb8f0088e3b 100644
--- a/Trigger/TrigAlgorithms/TrigEFMissingET/CMakeLists.txt
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/CMakeLists.txt
@@ -65,3 +65,9 @@ atlas_add_component( TrigEFMissingET
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py )
+atlas_install_joboptions( share/*.py )
+
+atlas_add_test( METFexes
+                SCRIPT test/test_met_fexes.sh
+                PROPERTIES TIMEOUT 500
+                )
diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/share/testMET.py b/Trigger/TrigAlgorithms/TrigEFMissingET/share/testMET.py
new file mode 100644
index 00000000000..468ea41cd63
--- /dev/null
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/share/testMET.py
@@ -0,0 +1,57 @@
+#
+#  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+#
+
+include("TrigUpgradeTest/testHLT_MT.py")
+
+from AthenaCommon.AlgSequence import AlgSequence
+topSequence = AlgSequence()
+
+isData = False
+if globalflags.InputFormat.is_bytestream():
+  isData = True
+
+
+
+import math
+from TrigT2CaloCommon.TrigT2CaloCommonConf import TrigCaloDataAccessSvc#, TestCaloDataAccess
+from AthenaMonitoring.GenericMonitoringTool import GenericMonitoringTool, defineHistogram
+
+mon = GenericMonitoringTool("CaloDataAccessSvcMon")
+mon.Histograms += [defineHistogram( "TIME_locking_LAr_RoI", title="Time spent in unlocking the LAr collection", xbins=100, xmin=0, xmax=100 ),
+                   defineHistogram( "roiROBs_LAr", title="Number of ROBs unpacked in RoI requests", xbins=20, xmin=0, xmax=20 ),
+                   defineHistogram( "TIME_locking_LAr_FullDet", title="Time spent in unlocking the LAr collection", xbins=100, xmin=0, xmax=100 ),
+                   defineHistogram( "roiEta_LAr,roiPhi_LAr", type="TH2F", title="Geometric usage", xbins=50, xmin=-5, xmax=5, ybins=64, ymin=-math.pi, ymax=math.pi )]
+
+svcMgr += TrigCaloDataAccessSvc()
+svcMgr.TrigCaloDataAccessSvc.MonTool = mon
+svcMgr.TrigCaloDataAccessSvc.OutputLevel=INFO
+
+from TrigCaloRec.TrigCaloRecConf import HLTCaloCellMaker
+cellMakerAlgo =  HLTCaloCellMaker("CellMakerMT", roiMode=True)
+cellMakerAlgo.RoIs="METRoIs" 
+cellMakerAlgo.OutputLevel=VERBOSE
+cellMakerAlgo.CellsName="cells"
+topSequence += cellMakerAlgo
+
+from TrigEFMissingET.TrigEFMissingETConf import EFMissingETAlgMT, EFMissingETFromCellsMT
+
+cellTool = EFMissingETFromCellsMT( name="METFromCellsTool" )
+cellTool.CellsCollection = "cells"
+
+metAlg = EFMissingETAlgMT( name="EFMET" )
+metAlg.METTools=[ cellTool ]
+metAlg += cellTool
+topSequence += metAlg
+
+#   from TrigCaloRec.TrigCaloRecConfig import TrigCaloClusterMakerMT_topo
+  
+# #  clusterMakerAlgo = TrigCaloClusterMakerMT_topo(name="ClustermakerMT_topo",cells="cells",doMoments=True,doLC=True)
+# #  Get conditions error using TrigLocalCalib tool, so set doLC=False
+#   clusterMakerAlgo = TrigCaloClusterMakerMT_topo(name="ClustermakerMT_topo",cells="cells",doMoments=True,doLC=False)
+#   clusterMakerAlgo.OutputLevel=VERBOSE
+#   topSequence += clusterMakerAlgo
+  
+# print ToolSvc
+
+
diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.cxx b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.cxx
new file mode 100644
index 00000000000..c112085c3e3
--- /dev/null
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.cxx
@@ -0,0 +1,95 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#include <cmath>
+#include "xAODTrigMissingET/TrigMissingETAuxContainer.h"
+#include "TrigEFMissingET/EFMissingETHelper.h"
+#include "AthenaMonitoring/MonitoredScope.h"
+#include "EFMissingETAlgMT.h"
+
+
+
+EFMissingETAlgMT::EFMissingETAlgMT( const std::string& name, 
+				    ISvcLocator* pSvcLocator ) 
+  : AthReentrantAlgorithm( name, pSvcLocator ) {}
+
+EFMissingETAlgMT::~EFMissingETAlgMT() {}
+
+StatusCode EFMissingETAlgMT::initialize() {
+  CHECK( m_metTools.retrieve() );
+  CHECK( m_metContainerKey.initialize() );
+  CHECK( m_monTool.retrieve() );
+  return StatusCode::SUCCESS;
+}
+
+
+//!< Converts from MeV to GeV and them log10, preserving the sign, the minimum dictated by monitoring histograms
+double toLogGeV( double x, double fallback = 0, double epsilon = 1.189 ) {
+  const double absXGeV =  std::fabs( x * 1.e-3 );
+  if ( absXGeV < epsilon ) 
+    return fallback;
+  return std::copysign( std::log10( absXGeV ), x );
+}
+
+//!< converts to from MeV to GeV if above threshold, else falback value
+double toLinGeV( double x, double fallback = 0, double epsilon = 1e-6 ) {
+    const double xGeV = x * 1.e-3;
+  if ( xGeV < epsilon ) 
+    return fallback;
+  return xGeV;
+}
+
+
+StatusCode EFMissingETAlgMT::execute_r( const EventContext& context ) const {  
+  ATH_MSG_DEBUG ( "Executing " << name() << "..." );
+  using namespace Monitored;
+  auto totalTimer = MonitoredTimer::declare( "Total" );
+  auto loopTimer = MonitoredTimer::declare( "Loop" );
+
+  auto metContainer = std::make_unique<xAOD::TrigMissingETContainer>();
+  auto metAuxContainer = std::make_unique<xAOD::TrigMissingETAuxContainer>();
+  metContainer->setStore( metAuxContainer.get() );
+
+  auto met = new xAOD::TrigMissingET();
+  metContainer->push_back( met );
+
+  TrigEFMissingEtHelper metHelper(42);
+  
+  loopTimer.start();
+  for ( auto& t: m_metTools ) {
+    ATH_MSG_DEBUG( "Invoking tool " << t->name() << " to update the MET obejct" );
+    t->update( met, &metHelper );
+  }
+  loopTimer.stop();
+
+  
+  auto EF_MEx_log = MonitoredScalar::declare( "EF_MEx_log", toLogGeV( met->ex() ) );
+  auto EF_MEy_log = MonitoredScalar::declare( "EF_MEy_log", toLogGeV( met->ey() ) );
+  auto EF_MEz_log = MonitoredScalar::declare( "EF_MEz_log", toLogGeV( met->ez() ) );
+  auto EF_MET_log = MonitoredScalar::declare( "EF_MET_log", toLogGeV( std::hypot( met->ex(), met->ey() ) ) );
+  auto EF_ME_log    = MonitoredScalar::declare( "EF_ME_log",  toLogGeV( std::hypot( std::hypot(met->ex(), met->ey()), met->ez() ) ) );
+  auto EF_SumEt_log = MonitoredScalar::declare( "EF_SumEt_log", toLogGeV( met->sumEt() )  );
+  auto EF_SumE_log  = MonitoredScalar::declare( "EF_SumE_log",  toLogGeV( met->sumE(), -9e9 ) );
+  
+  auto EF_MEx_lin = MonitoredScalar::declare( "EF_MEx_lin", toLinGeV( met->ex() ) );
+  auto EF_MEy_lin = MonitoredScalar::declare( "EF_MEy_lin", toLinGeV( met->ey() ) );
+  auto EF_MEz_lin = MonitoredScalar::declare( "EF_MEz_lin", toLinGeV( met->ez() ) );
+  auto EF_MET_lin = MonitoredScalar::declare( "EF_MET_lin", toLinGeV( std::hypot( met->ex(), met->ey() ) ) );			     
+  auto EF_ME_lin  = MonitoredScalar::declare( "EF_ME_lin",  toLinGeV( std::hypot( std::hypot(met->ex(), met->ey()), met->ez() ) ) );
+  auto EF_SumEt_lin =  MonitoredScalar::declare( "EF_SumEt_lin", toLinGeV( met->sumEt() ) );
+  auto EF_SumE_lin  = MonitoredScalar::declare( "EF_SumE_lin",  toLinGeV( met->sumE(), -9e9 ) );
+  auto EF_XS        = MonitoredScalar::declare( "EF_XS", toLinGeV( std::hypot( met->ex(), met->ey() ) ) / toLinGeV( met->sumEt() ) );
+  auto EF_MET_phi   = MonitoredScalar::declare( "EF_MET_phi",   std::atan2( met->ey(), met->ex() ) );
+ 
+  auto monitorIt = MonitoredScope::declare( m_monTool, 
+					    totalTimer, loopTimer,
+					    EF_MEx_log, EF_MEy_log, EF_MEz_log, EF_MET_log, EF_ME_log, EF_ME_log, EF_SumE_log,
+					    EF_MEx_lin, EF_MEy_lin, EF_MEz_lin, EF_MET_lin, EF_ME_lin, EF_SumEt_lin, EF_SumE_lin, 
+					    EF_XS, EF_MET_phi);
+    
+  auto handle = SG::makeHandle( m_metContainerKey, context );
+  CHECK( handle.record( std::move( metContainer ), std::move ( metAuxContainer ) ) );
+  return StatusCode::SUCCESS;
+}
+
+
diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.h b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.h
new file mode 100644
index 00000000000..d281a585ee4
--- /dev/null
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETAlgMT.h
@@ -0,0 +1,43 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGEFMISSINGET_EFMISSINGETALGMT_H
+#define TRIGEFMISSINGET_EFMISSINGETALGMT_H 1
+
+#include <string>
+#include "GaudiKernel/Property.h"
+#include "AthenaBaseComps/AthReentrantAlgorithm.h"
+#include "AthenaMonitoring/GenericMonitoringTool.h"
+#include "xAODTrigMissingET/TrigMissingETContainer.h"
+
+#include "./IMissingETTool.h"
+
+
+/**
+ * @class HLT MET algorithm
+ * @brief It is responsible for creation of the MET object and execution of number of MET tools filling it
+ **/
+
+class EFMissingETAlgMT : public ::AthReentrantAlgorithm
+{ 
+ public: 
+
+  EFMissingETAlgMT( const std::string& name, ISvcLocator* pSvcLocator );
+
+  virtual ~EFMissingETAlgMT(); 
+
+
+  //EFMissingETMT &operator=(const EFMissingETMT &alg); 
+
+  virtual StatusCode  initialize() override;
+  virtual StatusCode  execute_r(const EventContext& context) const override;
+ 
+ private: 
+  
+  SG::WriteHandleKey<xAOD::TrigMissingETContainer> m_metContainerKey { this, "METContainerKey", "HLT_MET", "Name of the output collection" };
+  ToolHandleArray<IMissingETTool> m_metTools { this, "METTools", {}, "Tools to fille MET object" };
+  ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" };
+}; 
+
+
+#endif //> !TRIGEFMISSINGET_EFMISSINGETMT_H
diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.cxx b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.cxx
new file mode 100644
index 00000000000..60c16a34fab
--- /dev/null
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.cxx
@@ -0,0 +1,117 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+// FrameWork includes
+#include "AthenaMonitoring/MonitoredScope.h"
+#include "GaudiKernel/IToolSvc.h"
+
+// TrigEFMissingET includes
+#include "EFMissingETFromCellsMT.h"
+
+
+EFMissingETFromCellsMT::EFMissingETFromCellsMT( const std::string& type, 
+		      const std::string& name, 
+		      const IInterface* parent ) 
+  : base_class( type, name, parent ) {
+  //declareProperty( "Property", m_nProperty );
+}
+
+StatusCode EFMissingETFromCellsMT::initialize()
+{
+  ATH_MSG_INFO ("Initializing " << name() << "...");
+  CHECK( m_cellsKey.initialize() );
+
+  m_maxThreshold = m_rmsOneSided;
+  if ( m_rmsOneSided < fabsf( m_rmsTwoSided ) ) m_maxThreshold = fabsf( m_rmsTwoSided );
+
+  return StatusCode::SUCCESS;
+}
+
+StatusCode EFMissingETFromCellsMT::update( xAOD::TrigMissingET */*met*/,
+					   TrigEFMissingEtHelper *metHelper ) const {
+  using namespace Monitored;
+  auto totalTimer = MonitoredTimer::declare( "Total" );  
+  const EventContext context{ Gaudi::Hive::currentContext() };
+  auto caloCellsHandle = SG::makeHandle( m_cellsKey );
+
+  auto loopTimer = MonitoredTimer::declare( "Loop" );  
+  auto countUsedCells = MonitoredScalar::declare<unsigned>( "UsedCells", 0 );  
+
+  // now it is time to iterate over the cells
+  for ( const CaloCell* cell: *caloCellsHandle ) {
+    const CaloDetDescrElement* cDDE = cell->caloDDE();
+    if (cDDE == 0) {
+      ATH_MSG_WARNING( "cannot get CaloDetDescrElement from cell " << cell->ID() );
+      continue;
+    }
+
+    TrigEFMissingEtComponent *metComp = metHelper->GetComponent( cDDE->getSampling() );
+    if (metComp == 0) {
+      ATH_MSG_FATAL( "Cannot find calo sampling!" );
+      return StatusCode::FAILURE;
+    }
+
+    //TB not sure about skipping logic, looks incorrect in the original code
+    // 
+
+    if ( m_noiseTool ) { // == noise suppression required
+      const bool  noiseCutPassed = true; //  noiseCut( cell  ); 
+      if ( not noiseCutPassed )
+	continue;
+    }
+
+    countUsedCells = countUsedCells + 1;
+    
+    double E = cell->e();
+    double et  = E * cDDE->sinTh();
+    double ez  = E * cDDE->cosTh();
+    double sinPhi = cDDE->sinPhi();
+    double cosPhi = cDDE->cosPhi();
+    metComp->m_ex -= et*cosPhi;
+    metComp->m_ey -= et*sinPhi;
+    metComp->m_ez -= ez;
+    metComp->m_sumEt += et;
+    metComp->m_sumE += E;
+    metComp->m_usedChannels += 1;
+
+    if( cell->quality() > m_MaxLArQ ) metComp->m_sumBadEt += et;
+    //    if (BSerrors) metComp->m_status |= m_maskErrBSconv; // | m_maskCompErrors;
+    metComp->m_sumOfSigns += static_cast<short int>(floor(copysign(1.0,E) + 0.5));
+
+    // 5. auxiliary quantities for robustness checks
+    if ( not m_makeRobustness) continue;
+    if ( not m_doCellNoiseSupp || (m_doCellNoiseSupp &&
+				   m_MinCellSNratio[cDDE->getSampling()] > m_maxThreshold)) {
+       if (fabs(E) < m_MinCellSNratio[cDDE->getSampling()] *
+           m_noiseTool->getNoise( cell, ICalorimeterNoiseTool::TOTALNOISE))
+          continue;
+    }
+
+    float time = cell->time() * 1e-3;  // ns
+    float quality = cell->quality();
+    if (time < metComp->m_minTime) metComp->m_minTime = time;
+    if (time > metComp->m_maxTime) metComp->m_maxTime = time;
+    if (quality > metComp->m_maxQlty) metComp->m_maxQlty = quality;
+    if (E < metComp->m_minE) metComp->m_minE = E;
+    if (E > metComp->m_maxE) metComp->m_maxE = E;
+       
+  }
+      
+  return StatusCode::SUCCESS;
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.h b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.h
new file mode 100644
index 00000000000..eab14e2f0ac
--- /dev/null
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/EFMissingETFromCellsMT.h
@@ -0,0 +1,59 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGEFMISSINGET_EFMISSINGETFROMCELLSMT_H
+#define TRIGEFMISSINGET_EFMISSINGETFROMCELLSMT_H 1
+
+// FrameWork includes
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "GaudiKernel/ServiceHandle.h"
+
+#include "CaloEvent/CaloCellContainer.h"
+#include "CaloInterface/ICalorimeterNoiseTool.h"
+
+// TrigEFMissingET includes
+#include "./IMissingETTool.h"
+
+
+
+/**
+ * @class Tool for calculations of MET from bare cells
+ * @brief 
+ **/
+
+class EFMissingETFromCellsMT: public extends<AthAlgTool, IMissingETTool> { 
+
+ public: 
+
+  EFMissingETFromCellsMT( const std::string& type,
+	     const std::string& name, 
+	     const IInterface* parent );
+
+  virtual ~EFMissingETFromCellsMT(){}
+
+  virtual StatusCode  initialize();
+
+  virtual StatusCode update( xAOD::TrigMissingET *met,
+			     TrigEFMissingEtHelper *metHelper ) const override;
+
+ private: 
+  EFMissingETFromCellsMT();
+  
+  Gaudi::Property<bool>m_doCellNoiseSupp { this, "DoCellNoiseSuppression", false, "switch on/off cell noise suppression" };
+  Gaudi::Property<bool>m_useFullColl     { this, "useFullCollection",      true,  "switch on/off fast access via LoadFullCollection" };
+  Gaudi::Property<bool>m_makeRobustness  { this, "makeRobustness",         true , "switch on/off robustness checks" };
+  Gaudi::Property<float>m_rmsOneSided    { this, "CaloNoiseOneSidedCut",   3.0,   "1-sided noise suppression (unit = rms }" };
+  Gaudi::Property<float>m_rmsTwoSided    { this, "CaloNoiseTwoSidedCut",   2.0,   "2-sided noise suppression (unit = rms }" };
+  float m_maxThreshold;		//<! maximum between the previous ones
+  Gaudi::Property<int>m_MaxLArQ          { this, "MaxLArQ",                4000,  "Max Q LAr Cell value" };
+  Gaudi::Property<int>m_MaxTileQ         { this, "MaxTileQ",               254,   "Max Q Tile Cell value" };
+  Gaudi::Property<std::vector<float> >m_MinCellSNratio { this, "MinCellSNratio", std::vector<float>(24, 3.0), "(vector) min cell |energy|/rms for robustness checks" };
+
+  SG::ReadHandleKey<CaloCellContainer> m_cellsKey      { this, "CellsCollection", "CaloCells", "Collection containg all cels" };
+  
+  ToolHandle<ICalorimeterNoiseTool>  m_noiseTool            { this, "CaloNoiseTool", "", "Tool Handle for noise tool" };
+
+}; 
+
+
+#endif //> !TRIGEFMISSINGET_EFMISSINGETFROMCELLSMT_H
diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/IMissingETTool.h b/Trigger/TrigAlgorithms/TrigEFMissingET/src/IMissingETTool.h
new file mode 100644
index 00000000000..d8bb4431adc
--- /dev/null
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/IMissingETTool.h
@@ -0,0 +1,35 @@
+/*
+  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGEFMISSINGET_IMISSINGETTOOL_H
+#define TRIGEFMISSINGET_IMISSINGETTOOL_H 1
+
+#include "GaudiKernel/IAlgTool.h"
+
+#include "TrigEFMissingET/EFMissingETHelper.h"
+#include "xAODTrigMissingET/TrigMissingET.h"
+
+/**
+ * @class Adds info the the missing ET object
+ * @brief Specific implementations may use various input data types
+ **/
+
+class IMissingETTool : virtual public ::IAlgTool { 
+  
+public: 
+  DeclareInterfaceID( IMissingETTool, 1, 0 );  
+  virtual ~IMissingETTool(){}
+
+  /**
+   * a method to update the met object (and met helper object)
+   * The API deliberately does not include EventContext as it is only needed 
+   * in one implementation when input is not taken from the regular store. 
+   **/
+  virtual StatusCode update( xAOD::TrigMissingET *met,
+			     TrigEFMissingEtHelper *metHelper ) const = 0;
+
+}; 
+
+
+
+#endif //> !TRIGEFMISSINGET_IMISSINGETTOOL_H
diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/src/components/TrigEFMissingET_entries.cxx b/Trigger/TrigAlgorithms/TrigEFMissingET/src/components/TrigEFMissingET_entries.cxx
index 0363d82acd3..40f5811c903 100644
--- a/Trigger/TrigAlgorithms/TrigEFMissingET/src/components/TrigEFMissingET_entries.cxx
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/src/components/TrigEFMissingET_entries.cxx
@@ -10,6 +10,8 @@
 //#include "TrigEFMissingET/EFMissingETFromLvl1Ppr.h"
 #include "TrigEFMissingET/EFMissingETFlags.h"
 #include "TrigEFMissingET/EFMissingETFromHelper.h"
+#include "../EFMissingETAlgMT.h"
+#include "../EFMissingETFromCellsMT.h"
 
 DECLARE_COMPONENT( EFMissingET )
 DECLARE_COMPONENT( EFMissingETBaseTool )
@@ -23,4 +25,6 @@ DECLARE_COMPONENT( EFMissingETFromTrackAndJets )
 //DECLARE_COMPONENT( EFMissingETFromLvl1Ppr )
 DECLARE_COMPONENT( EFMissingETFlags )
 DECLARE_COMPONENT( EFMissingETFromHelper )
+DECLARE_COMPONENT( EFMissingETAlgMT )
+DECLARE_COMPONENT( EFMissingETFromCellsMT )
 
diff --git a/Trigger/TrigAlgorithms/TrigEFMissingET/test/test_met_fexes.sh b/Trigger/TrigAlgorithms/TrigEFMissingET/test/test_met_fexes.sh
new file mode 100755
index 00000000000..56bb5d60845
--- /dev/null
+++ b/Trigger/TrigAlgorithms/TrigEFMissingET/test/test_met_fexes.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+# art-type: build
+# art-ci: master
+
+athena --threads=1 --evtMax=10 --filesInput="/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/TrigP1Test/data17_13TeV.00327265.physics_EnhancedBias.merge.RAW._lb0100._SFO-1._0001.1" TrigEFMissingET/testMET.py
\ No newline at end of file
-- 
GitLab