diff --git a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
index ccb83610c5e551aca9cf62d15bf38d043b16c9e8..9a586d49ec74533af417317db9b0350084ce8007 100644
--- a/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
+++ b/Trigger/TrigAlgorithms/TrigFastTrackFinder/src/TrigFastTrackFinder.cxx
@@ -2096,14 +2096,14 @@ StatusCode TrigFastTrackFinder::finddEdxTrk(const EventContext& ctx, const Track
       xAOD::TrigComposite *dEdxTrk = new xAOD::TrigComposite();
       dEdxTrk->makePrivateStore();
       dEdxTrkContainer->push_back(dEdxTrk);
-      dEdxTrk->setDetail<int>  ("dEdxTrk_id",   i_track);
-      dEdxTrk->setDetail<float>("dEdxTrk_pt",   pt);
+      dEdxTrk->setDetail<int>  ("dEdxTrk_id",     i_track);
+      dEdxTrk->setDetail<float>("dEdxTrk_pt",     pt);
       float eta = -log(tan(0.5*theta));
-      dEdxTrk->setDetail<float>("dEdxTrk_eta",  eta);
-      dEdxTrk->setDetail<float>("dEdxTrk_phi",  phi0);
-      dEdxTrk->setDetail<float>("dEdxTrk_dedx", dedx);
+      dEdxTrk->setDetail<float>("dEdxTrk_eta",    eta);
+      dEdxTrk->setDetail<float>("dEdxTrk_phi",    phi0);
+      dEdxTrk->setDetail<float>("dEdxTrk_a0beam", a0beam);
+      dEdxTrk->setDetail<float>("dEdxTrk_dedx",   dedx);
       dEdxTrk->setDetail<int>  ("dEdxTrk_dedx_n_usedhits",  n_usedhits);
-      dEdxTrk->setDetail<float>("dEdxTrk_a0beam",           a0beam);
       dEdxTrk->setDetail<int>  ("dEdxTrk_n_hits_innermost", n_hits_innermost);
       dEdxTrk->setDetail<int>  ("dEdxTrk_n_hits_inner",     n_hits_inner);
       dEdxTrk->setDetail<int>  ("dEdxTrk_n_hits_pix",       n_hits_pix);
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackTriggerHypoTool.py b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackHypoConfig.py
similarity index 93%
rename from Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackTriggerHypoTool.py
rename to Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackHypoConfig.py
index c315fc5d07351e3346b59f25ead6821404de791a..b2601bf9e3a516c79e1fd8712abda1cfe9a540f3 100644
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackTriggerHypoTool.py
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigDisappearingTrackHypoConfig.py
@@ -1,22 +1,19 @@
 # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 
 from AthenaCommon.Logging import logging
-log = logging.getLogger("TrigLongLivedParticlesHypo.TrigDisapperingTrackTriggerHypoTool")
 from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
 
+def createTrigDisappearingTrackHypoAlg(name):
+    # make the Hypo
+    from TrigLongLivedParticlesHypo.TrigLongLivedParticlesHypoConf import (TrigDisappearingTrackHypoAlg)
 
+    # Setup the hypothesis algorithm
+    theDisTrkHypo = TrigDisappearingTrackHypoAlg(name)
+    
+    from TrigEDMConfig.TriggerEDMRun3 import recordable
+    theDisTrkHypo.DisTrkBDTSel = recordable("HLT_DisTrkBDTSel")
 
-log = logging.getLogger('TrigDisappearingTrackTriggerHypoTool')
-
-def TrigDisappearingTrackTriggerHypoToolFromDict( chainDict ):
-    """ Use menu decoded chain dictionary to configure the tool """
-    cparts = [i for i in chainDict['chainParts'] if i['signature']=='UnconventionalTracking']
-    thresholds = sum([ [cpart['threshold']]*int(cpart['multiplicity']) for cpart in cparts], [])
-
-    name = chainDict['chainName']
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    tool = CompFactory.TrigDisappearingTrackTriggerHypoTool(name)
-
+    # monioring
     monTool = GenericMonitoringTool("IM_MonTool"+name)
     monTool.defineHistogram('category',            type='TH1F', path='EXPERT', title="DisTrk Category;DisTrk Category;Nevents", xbins=5, xmin=-0.5, xmax=4.5) 
     #
@@ -77,8 +74,25 @@ def TrigDisappearingTrackTriggerHypoToolFromDict( chainDict ):
     monTool.defineHistogram('pix3_sct1p_refit_chi2ndof',type='TH1F', path='EXPERT', title="Pix3Sct1p refit #chi^{2}/ndof;refit #chi^{2}/ndof;Nevents", xbins=50, xmin=0, xmax=10) 
     monTool.defineHistogram('pix3_sct1p_bdtscore', type='TH1F', path='EXPERT', title="Pix3lSct1p BDT score;BDT score;Nevents", xbins=50, xmin=-1, xmax=1) 
     #
-    monTool.HistPath = 'disappearingTrackTriggerHypoAlg/'+tool.getName()
-    tool.MonTool = monTool
+    monTool.HistPath = 'disappearingTrackHypoAlg'
+    theDisTrkHypo.MonTool = monTool
+
+    return theDisTrkHypo
+
+
+def TrigDisappearingTrackHypoToolFromDict( chainDict ):
+
+    log = logging.getLogger('TrigDisappearingTrackHypoTool')
+
+    """ Use menu decoded chain dictionary to configure the tool """
+    cparts = [i for i in chainDict['chainParts'] if i['signature']=='UnconventionalTracking']
+    thresholds = sum([ [cpart['threshold']]*int(cpart['multiplicity']) for cpart in cparts], [])
+
+    name = chainDict['chainName']
+    from AthenaConfiguration.ComponentFactory import CompFactory
+    tool = CompFactory.TrigDisappearingTrackHypoTool(name)
+
+    # set thresholds
 
     strThr = ""
 
@@ -122,7 +136,7 @@ def TrigDisappearingTrackTriggerHypoToolFromDict( chainDict ):
     return tool
 
 
-def TrigDisappearingTrackTriggerHypoToolFromName( name, conf ):
+def TrigDisappearingTrackHypoToolFromName( name, conf ):
     """ provides configuration of the hypo tool given the chain name
     The argument will be replaced by "parsed" chain dict. For now it only serves simplest chain HLT_eXYZ.
     """
@@ -130,11 +144,4 @@ def TrigDisappearingTrackTriggerHypoToolFromName( name, conf ):
     
     decodedDict = dictFromChainName(conf)
     
-    return TrigDisappearingTrackTriggerHypoToolFromDict( decodedDict )
-    
-    
-    
-if __name__ == "__main__":
-    tool = TrigDisappearingTrackTriggerHypoToolFromName("HLT_unconvtrk20_dedx_medium_L1XE50", "HLT_unconvtrk20_dedx_medium_L1XE50")
-    assert tool, "Not configured simple tool"
-    log.debug("ALL OK")
+    return TrigDisappearingTrackHypoToolFromDict( decodedDict )
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackTriggerHypoTool.py b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackHypoConfig.py
similarity index 76%
rename from Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackTriggerHypoTool.py
rename to Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackHypoConfig.py
index dfcd44cbfd7740570f0e19cd158bfb4d9572ccb5..93e6a7e14bf365a3af8ab301334c04be21fa13ca 100644
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackTriggerHypoTool.py
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/python/TrigdEdxTrackHypoConfig.py
@@ -1,21 +1,20 @@
 # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 
 from AthenaCommon.Logging import logging
-log = logging.getLogger("TrigLongLivedParticlesHypo.TrigdEdxTrackTriggerHypoTool")
 from AthenaMonitoringKernel.GenericMonitoringTool import GenericMonitoringTool
 
+def createTrigdEdxTrackHypoAlg(name):
 
+    # make the Hypo
+    from TrigLongLivedParticlesHypo.TrigLongLivedParticlesHypoConf import TrigdEdxTrackHypoAlg
+    
+    # Setup the hypothesis algorithm
+    thedEdxTrackHypo = TrigdEdxTrackHypoAlg(name)
+    
+    from TrigEDMConfig.TriggerEDMRun3 import recordable
+    thedEdxTrackHypo.HPtdEdxTrk = recordable("HLT_HPtdEdxTrk")
 
-log = logging.getLogger('TrigdEdxTrackTriggerHypoTool')
-
-def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ):
-    """ Use menu decoded chain dictionary to configure the tool """
-    cparts = [i for i in chainDict['chainParts'] if i['signature']=='UnconventionalTracking']
-    thresholds = sum([ [cpart['threshold']]*int(cpart['multiplicity']) for cpart in cparts], [])
-
-    name = chainDict['chainName']
-    from AthenaConfiguration.ComponentFactory import CompFactory
-    tool = CompFactory.TrigdEdxTrackTriggerHypoTool(name)
+    # monioring
 
     monTool = GenericMonitoringTool("IM_MonTool"+name)
     monTool.defineHistogram('trackPtGeV', type='TH1F', path='EXPERT', title="Hypo p_{T}^{track};p_{T}^{track} [GeV];Nevents", xbins=50, xmin=0, xmax=100) 
@@ -24,8 +23,25 @@ def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ):
     monTool.defineHistogram('trackdEdx',  type='TH1F', path='EXPERT', title="Hypo dE/dx (after a0beam cut);dE/dx;Nevents", xbins=50, xmin=0, xmax=10) 
     monTool.defineHistogram('trackNhighdEdxHits', type='TH1F', path='EXPERT', title="Hypo Nr high dE/dx hits (after dEdx cut);N high dE/dx hits;Nevents", xbins=10, xmin=0, xmax=10) 
 
-    monTool.HistPath = 'dEdxTrackTriggerHypoAlg/'+tool.getName()
-    tool.MonTool = monTool
+    monTool.HistPath = 'dEdxTrackHypoAlg'
+    thedEdxTrackHypo.MonTool = monTool
+
+    return thedEdxTrackHypo
+
+
+def TrigdEdxTrackHypoToolFromDict( chainDict ):
+
+    log = logging.getLogger('TrigdEdxTrackHypoTool')
+
+    """ Use menu decoded chain dictionary to configure the tool """
+    cparts = [i for i in chainDict['chainParts'] if i['signature']=='UnconventionalTracking']
+    thresholds = sum([ [cpart['threshold']]*int(cpart['multiplicity']) for cpart in cparts], [])
+
+    name = chainDict['chainName']
+    from AthenaConfiguration.ComponentFactory import CompFactory
+    tool = CompFactory.TrigdEdxTrackHypoTool(name)
+
+    # set thresholds
 
     strThr = ""
 
@@ -34,7 +50,7 @@ def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ):
     for THR in thresholds:
         strThr += str(THR)+", "
         
-    log.info("UTT: Threshold Values are: %s",strThr)
+    log.info("Threshold Values are: %s",strThr)
 
     tool.cutTrackPtGeV = thresholds
 
@@ -51,21 +67,21 @@ def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ):
             trackdEdx.append(1.5)
             tracka0beam.append(5.0)
             trackNhighdEdxHits.append(1)
-            trackHighdEdxDef.append(1.5)
+            trackHighdEdxDef.append("1p50")
         elif cpart['IDinfo'] =="tight":
             log.info("UTT: Tight ID working point is set")
             trackEta.append(2.5)
             trackdEdx.append(1.8)
             tracka0beam.append(1.5)
             trackNhighdEdxHits.append(2)
-            trackHighdEdxDef.append(1.8)
+            trackHighdEdxDef.append("1p80")
         else:
             log.info("UTT: Medium ID working point is set")
             trackEta.append(2.5)
             trackdEdx.append(1.7)
             tracka0beam.append(2.5)
             trackNhighdEdxHits.append(2)
-            trackHighdEdxDef.append(1.7)
+            trackHighdEdxDef.append("1p70")
 
     tool.cutTrackEta    = trackEta
     tool.cutTrackdEdx   = trackdEdx
@@ -76,7 +92,7 @@ def TrigdEdxTrackTriggerHypoToolFromDict( chainDict ):
     return tool
 
 
-def TrigdEdxTrackTriggerHypoToolFromName( name, conf ):
+def TrigdEdxTrackHypoToolFromName( name, conf ):
     """ provides configuration of the hypo tool given the chain name
     The argument will be replaced by "parsed" chain dict. For now it only serves simplest chain HLT_eXYZ.
     """
@@ -84,11 +100,4 @@ def TrigdEdxTrackTriggerHypoToolFromName( name, conf ):
     
     decodedDict = dictFromChainName(conf)
     
-    return TrigdEdxTrackTriggerHypoToolFromDict( decodedDict )
-    
-    
-    
-if __name__ == "__main__":
-    tool = TrigdEdxTrackTriggerHypoToolFromName("HLT_unconvtrk20_dedx_medium_L1XE50", "HLT_unconvtrk20_dedx_medium_L1XE50")
-    assert tool, "Not configured simple tool"
-    log.debug("ALL OK")
+    return TrigdEdxTrackHypoToolFromDict( decodedDict )
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..47ef2a61576e7c6b9e33062312322a48b009c535
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.cxx
@@ -0,0 +1,632 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+  * Trigger Hypo Tool, that is aimed at triggering disappearing tracks
+  * author Kunihiro Nagano <kunihiro.nagano@cern.ch> 
+*/
+#include "TrigDisappearingTrackHypoAlg.h"
+#include "AthViews/ViewHelper.h"
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "GaudiKernel/SystemOfUnits.h"
+#include "AthenaMonitoringKernel/Monitored.h"
+#include "PathResolver/PathResolver.h"
+
+using TrigCompositeUtils::createAndStore; 
+using TrigCompositeUtils::DecisionContainer;
+using TrigCompositeUtils::DecisionAuxContainer;
+using TrigCompositeUtils::DecisionIDContainer;
+using TrigCompositeUtils::decisionIDs;
+using TrigCompositeUtils::newDecisionIn;
+using TrigCompositeUtils::linkToPrevious;
+using TrigCompositeUtils::viewString;
+using TrigCompositeUtils::featureString;
+using TrigCompositeUtils::hypoAlgNodeName;
+using TrigCompositeUtils::findLink;
+using TrigCompositeUtils::LinkInfo;
+using TrigCompositeUtils::Decision;
+using TrigCompositeUtils::allFailed;
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+TrigDisappearingTrackHypoAlg::TrigDisappearingTrackHypoAlg( const std::string& name, 
+							    ISvcLocator* pSvcLocator ) : 
+   ::HypoBase( name, pSvcLocator ) {}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigDisappearingTrackHypoAlg::initialize()
+{
+   CHECK( m_hypoTools.retrieve() );
+   CHECK( m_DisTrkCandKey.initialize() );
+   CHECK( m_DisTrkBDTSelKey.initialize());
+
+   if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() );
+
+   for (size_t slot = 0; slot < SG::getNSlots(); ++slot) {
+      EventContext dummyContext(/*dummyEventNumber*/0, slot);
+
+      m_tmva_pix4l_sct0_reader.get(dummyContext)->reset( new TMVA::Reader( "!Color:!Silent" ));
+      m_tmva_pix4l_sct1p_reader.get(dummyContext)->reset(new TMVA::Reader( "!Color:!Silent" ));
+      m_tmva_pix3l_sct0_reader.get(dummyContext)->reset( new TMVA::Reader( "!Color:!Silent" ));
+      m_tmva_pix3l_sct1p_reader.get(dummyContext)->reset(new TMVA::Reader( "!Color:!Silent" ));
+
+      // --- declare variables to the reader
+      // pix4l_sct0
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("pt",             m_tmva_pix4l_sct0_pt.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("z0",             m_tmva_pix4l_sct0_z0.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("d0",             m_tmva_pix4l_sct0_d0.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("trkiso3_dr01",   m_tmva_pix4l_sct0_trkiso3_dr01.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("trkiso3_dr0201", m_tmva_pix4l_sct0_trkiso3_dr0201.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("chi2ndof",       m_tmva_pix4l_sct0_chi2ndof.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("chi2ndof_pix",   m_tmva_pix4l_sct0_chi2ndof_pix.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("refit_pt",       m_tmva_pix4l_sct0_refit_pt.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("n_pix",          m_tmva_pix4l_sct0_n_pix.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("refit_ptratio",  m_tmva_pix4l_sct0_refit_ptratio.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("refit_chi2ndof", m_tmva_pix4l_sct0_refit_chi2ndof.get(dummyContext));
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).AddVariable("n_bl",           m_tmva_pix4l_sct0_n_bl.get(dummyContext));
+
+      // pix4l_sct1p
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("pt",                   m_tmva_pix4l_sct1p_pt.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_pt",             m_tmva_pix4l_sct1p_refit_pt.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_z0",             m_tmva_pix4l_sct1p_refit_z0.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_d0",             m_tmva_pix4l_sct1p_refit_d0.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("n_sct",                m_tmva_pix4l_sct1p_n_sct.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_ptratio",        m_tmva_pix4l_sct1p_refit_ptratio.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("refit_chi2ndof_ratio", m_tmva_pix4l_sct1p_refit_chi2ndof_ratio.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("trkiso3_dr01",         m_tmva_pix4l_sct1p_trkiso3_dr01.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("trkiso3_dr0201",       m_tmva_pix4l_sct1p_trkiso3_dr0201.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("is_fail",              m_tmva_pix4l_sct1p_is_fail.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("chi2ndof_pix",         m_tmva_pix4l_sct1p_chi2ndof_pix.get(dummyContext));
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).AddVariable("n_pix",                m_tmva_pix4l_sct1p_n_pix.get(dummyContext));
+
+      // pix3l_sct0
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("pt",             m_tmva_pix3l_sct0_pt.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("z0",             m_tmva_pix3l_sct0_z0.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("d0",             m_tmva_pix3l_sct0_d0.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("chi2ndof",       m_tmva_pix3l_sct0_chi2ndof.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("chi2ndof_pix",   m_tmva_pix3l_sct0_chi2ndof_pix.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("trkiso3_dr01",   m_tmva_pix3l_sct0_trkiso3_dr01.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("trkiso3_dr0201", m_tmva_pix3l_sct0_trkiso3_dr0201.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("refit_pt",       m_tmva_pix3l_sct0_refit_pt.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("refit_z0",       m_tmva_pix3l_sct0_refit_z0.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("refit_d0",       m_tmva_pix3l_sct0_refit_d0.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("n_pix",          m_tmva_pix4l_sct0_n_pix.get(dummyContext));
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).AddVariable("n_bl",           m_tmva_pix3l_sct0_n_bl.get(dummyContext));
+
+      // pix3l_sct1p
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("pt",             m_tmva_pix3l_sct1p_pt.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("z0",             m_tmva_pix3l_sct1p_z0.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("d0",             m_tmva_pix3l_sct1p_d0.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_pt",       m_tmva_pix3l_sct1p_refit_pt.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_z0",       m_tmva_pix3l_sct1p_refit_z0.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_d0",       m_tmva_pix3l_sct1p_refit_d0.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("n_pix",          m_tmva_pix3l_sct1p_n_pix.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("n_sct",          m_tmva_pix3l_sct1p_n_sct.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_ptratio",  m_tmva_pix3l_sct1p_refit_ptratio.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("is_fail",        m_tmva_pix3l_sct1p_is_fail.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("n_bl",           m_tmva_pix3l_sct1p_n_bl.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("chi2ndof",       m_tmva_pix3l_sct1p_chi2ndof.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("trkiso3_dr01",   m_tmva_pix3l_sct1p_trkiso3_dr01.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("trkiso3_dr0201", m_tmva_pix3l_sct1p_trkiso3_dr0201.get(dummyContext));
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).AddVariable("refit_chi2ndof", m_tmva_pix3l_sct1p_refit_chi2ndof.get(dummyContext));
+
+      // --- Book the MVA methods
+      std::string file;
+      std::string weightfile;
+      std::string tuningVer;
+      const std::string methodName = "BDT method";
+      //
+      tuningVer  = "v21a";
+      file = "TrigDisappearingTrackTriggerHypo/pix4l_sct0.BDT.weights." + tuningVer + ".xml";
+      weightfile = PathResolver::find_calib_file(file.c_str());
+      ATH_MSG_INFO( "opening weightfile for Pix4l_SCT0 = " << weightfile );
+      (**m_tmva_pix4l_sct0_reader.get(dummyContext)).BookMVA(methodName, weightfile); 
+      //
+      tuningVer  = "v21b"; // "b" only for this category
+      file = "TrigDisappearingTrackTriggerHypo/pix4l_sct1p.BDT.weights." + tuningVer + ".xml";
+      weightfile = PathResolver::find_calib_file(file.c_str());
+      ATH_MSG_INFO( "opening weightfile for Pix4l_SCT1p = " << weightfile );
+      (**m_tmva_pix4l_sct1p_reader.get(dummyContext)).BookMVA(methodName, weightfile); 
+      //
+      tuningVer  = "v21a";
+      file = "TrigDisappearingTrackTriggerHypo/pix3l_sct0.BDT.weights." + tuningVer + ".xml";
+      weightfile = PathResolver::find_calib_file(file.c_str());
+      ATH_MSG_INFO( "opening weightfile for Pix3l_SCT0 = " << weightfile );
+      (**m_tmva_pix3l_sct0_reader.get(dummyContext)).BookMVA(methodName, weightfile); 
+      //
+      tuningVer  = "v21a";
+      file = "TrigDisappearingTrackTriggerHypo/pix3l_sct1p.BDT.weights." + tuningVer + ".xml";
+      weightfile = PathResolver::find_calib_file(file.c_str());
+      ATH_MSG_INFO( "opening weightfile for Pix3l_SCT1p = " << weightfile );
+      (**m_tmva_pix3l_sct1p_reader.get(dummyContext)).BookMVA(methodName, weightfile); 
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigDisappearingTrackHypoAlg::execute( const EventContext& context ) const
+{
+   // previous decisions
+   ATH_MSG_DEBUG( "Retrieving pervious decision: \"" << decisionInput().key() << "\"" );
+   auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context );
+   ATH_CHECK( previousDecisionsHandle.isValid() );
+
+   ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" ); 
+   if( previousDecisionsHandle->size()!=1 ) {
+      ATH_MSG_ERROR( "Previous decision handle size is not 1. It is" << previousDecisionsHandle->size() );
+      return StatusCode::FAILURE;
+   }
+   const Decision * previousDecision = previousDecisionsHandle->at(0);
+   
+   TrigCompositeUtils::DecisionIDContainer previousDecisionIDs;
+   TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs);
+   ATH_MSG_VERBOSE( "IDs of active legs:" );
+   for(auto decisionID: previousDecisionIDs) { ATH_MSG_VERBOSE( "    " << decisionID ); }
+
+   // new output decisions
+   ATH_MSG_DEBUG( "Creating new output decision handle" ); 
+   SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); 
+   auto outputDecisions = outputHandle.ptr();
+
+   // input disappearing track objects
+   auto DisTrkCandHandle = SG::makeHandle(m_DisTrkCandKey, context );
+   ATH_CHECK( DisTrkCandHandle.isValid() );
+   ATH_MSG_DEBUG( "DisTrkCand handle size: " << DisTrkCandHandle->size() );
+
+   const xAOD::TrigCompositeContainer * disTrkCandContainer = DisTrkCandHandle.get();
+   if( disTrkCandContainer == nullptr ) {
+      ATH_MSG_ERROR( "ERROR Cannot get DisappearingTrks container" );
+      return StatusCode::FAILURE;
+   }
+
+   // output EDM object
+   auto DisTrkBDTSelContainer    = std::make_unique<xAOD::TrigCompositeContainer>();
+   auto DisTrkBDTSelContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
+   DisTrkBDTSelContainer->setStore(DisTrkBDTSelContainerAux.get());
+
+   xAOD::TrigCompositeContainer* disTrkContainer = DisTrkBDTSelContainer.get();
+
+   // Prepare inputs to HypoTool
+   ATH_CHECK( createCandidates(context, disTrkCandContainer, disTrkContainer) );
+
+   std::vector<TrigDisappearingTrackHypoTool::DisTrkHypoInfo> disTrkHypoInputs;
+
+   for ( auto distrk : *disTrkContainer ) {
+      Decision* newDecision = TrigCompositeUtils::newDecisionIn( outputDecisions, previousDecision, TrigCompositeUtils::hypoAlgNodeName(), context);
+
+      ElementLink<xAOD::TrigCompositeContainer> distrkEL = ElementLink<xAOD::TrigCompositeContainer>(*outputHandle, distrk->index());
+      ATH_CHECK( distrkEL.isValid() );
+
+      ATH_CHECK( newDecision->setObjectLink<xAOD::TrigCompositeContainer>(TrigCompositeUtils::featureString(), distrkEL) );
+
+      TrigDisappearingTrackHypoTool::DisTrkHypoInfo hypoInfo{ newDecision, distrk, previousDecisionIDs };
+      disTrkHypoInputs.push_back( hypoInfo );
+   }
+
+   // Loop over all hypoToolinputs and get their decisions
+   for ( auto & tool: m_hypoTools ) {
+      ATH_MSG_VERBOSE( "+++++ Now computing decision for " << tool->name() );
+      ATH_CHECK( tool->decide( disTrkHypoInputs ) );    
+   } 
+   
+   DecisionContainer::iterator it = outputDecisions->begin();
+   while(it != outputDecisions->end()) {
+      ATH_MSG_VERBOSE( "+++++ outputDecision: " << *it << " +++++" );
+      if ( allFailed( *it ) ) {
+	 ATH_MSG_VERBOSE( "---> all failed, erasing" );
+	 it = outputDecisions->erase(it);
+      } else {
+	 ATH_MSG_VERBOSE( "---> not all failed" );
+	 ++it;
+      }
+   }
+
+   // record
+   SG::WriteHandle<xAOD::TrigCompositeContainer> DisTrkBDTSelHandle(m_DisTrkBDTSelKey, context);
+   ATH_CHECK( DisTrkBDTSelHandle.record( std::move( DisTrkBDTSelContainer ), std::move( DisTrkBDTSelContainerAux ) ) );
+   ATH_MSG_VERBOSE( "recorded DisTrkBDTSel object to SG" );
+
+   //
+   ATH_CHECK( hypoBaseOutputProcessing(outputHandle) );
+
+   //
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigDisappearingTrackHypoAlg::createCandidates( const EventContext& context,  const xAOD::TrigCompositeContainer* disTrkCandContainer,
+							   xAOD::TrigCompositeContainer* disTrkBDTSelContainer) const
+{
+   // monitoring
+   std::vector<int>   mnt_category;
+   auto mon_category = Monitored::Collection("category", mnt_category);
+   auto monDisTrk    = Monitored::Group(m_monTool, mon_category);
+
+   std::vector<float> mnt_cat1_pt;
+   std::vector<float> mnt_cat1_z0;
+   std::vector<float> mnt_cat1_d0;
+   std::vector<float> mnt_cat1_iso01;
+   std::vector<float> mnt_cat1_iso0201;
+   std::vector<float> mnt_cat1_chi2ndof;
+   std::vector<float> mnt_cat1_chi2ndof_pix;
+   std::vector<float> mnt_cat1_refit_pt;
+   std::vector<int>   mnt_cat1_n_pix;
+   std::vector<float> mnt_cat1_refit_ptratio;
+   std::vector<float> mnt_cat1_refit_chi2ndof;
+   std::vector<int>   mnt_cat1_n_bl;
+   std::vector<float> mnt_cat1_bdtscore;
+   auto mon_cat1_pt             = Monitored::Collection("pix4_sct0_pt",             mnt_cat1_pt);
+   auto mon_cat1_z0             = Monitored::Collection("pix4_sct0_z0",             mnt_cat1_z0);
+   auto mon_cat1_d0             = Monitored::Collection("pix4_sct0_d0",             mnt_cat1_d0);
+   auto mon_cat1_iso01          = Monitored::Collection("pix4_sct0_iso01",          mnt_cat1_iso01);
+   auto mon_cat1_iso0201        = Monitored::Collection("pix4_sct0_iso0201",        mnt_cat1_iso0201);
+   auto mon_cat1_chi2ndof       = Monitored::Collection("pix4_sct0_chi2ndof",       mnt_cat1_chi2ndof);
+   auto mon_cat1_chi2ndof_pix   = Monitored::Collection("pix4_sct0_chi2ndof_pix",   mnt_cat1_chi2ndof_pix);
+   auto mon_cat1_refit_pt       = Monitored::Collection("pix4_sct0_refit_pt",       mnt_cat1_refit_pt);
+   auto mon_cat1_n_pix          = Monitored::Collection("pix4_sct0_n_pix",          mnt_cat1_n_pix);
+   auto mon_cat1_refit_ptratio  = Monitored::Collection("pix4_sct0_refit_ptratio",  mnt_cat1_refit_ptratio);
+   auto mon_cat1_refit_chi2ndof = Monitored::Collection("pix4_sct0_refit_chi2ndof", mnt_cat1_refit_chi2ndof);
+   auto mon_cat1_n_bl           = Monitored::Collection("pix4_sct0_n_bl",           mnt_cat1_n_bl);
+   auto mon_cat1_bdtscore       = Monitored::Collection("pix4_sct0_bdtscore",       mnt_cat1_bdtscore);
+   auto monDisTrkCat1 = Monitored::Group(m_monTool, mon_cat1_pt, mon_cat1_z0, mon_cat1_d0, mon_cat1_iso01, mon_cat1_iso0201, mon_cat1_chi2ndof,
+					 mon_cat1_chi2ndof_pix, mon_cat1_refit_pt, mon_cat1_n_pix, mon_cat1_refit_ptratio,
+					 mon_cat1_refit_chi2ndof, mon_cat1_n_bl, mon_cat1_bdtscore);
+   //
+   std::vector<float> mnt_cat2_pt;
+   std::vector<float> mnt_cat2_refit_pt;
+   std::vector<float> mnt_cat2_refit_z0;
+   std::vector<float> mnt_cat2_refit_d0;
+   std::vector<int>   mnt_cat2_n_sct;
+   std::vector<float> mnt_cat2_refit_ptratio;
+   std::vector<float> mnt_cat2_refit_chi2ndof_ratio;
+   std::vector<float> mnt_cat2_iso01;
+   std::vector<float> mnt_cat2_iso0201;
+   std::vector<float> mnt_cat2_chi2ndof_pix;
+   std::vector<int>   mnt_cat2_n_pix;
+   std::vector<float> mnt_cat2_bdtscore;
+   auto mon_cat2_pt             = Monitored::Collection("pix4_sct1p_pt",             mnt_cat2_pt);
+   auto mon_cat2_refit_pt       = Monitored::Collection("pix4_sct1p_refit_pt",       mnt_cat2_refit_pt);
+   auto mon_cat2_refit_z0       = Monitored::Collection("pix4_sct1p_refit_z0",       mnt_cat2_refit_z0);
+   auto mon_cat2_refit_d0       = Monitored::Collection("pix4_sct1p_refit_d0",       mnt_cat2_refit_d0);
+   auto mon_cat2_n_sct          = Monitored::Collection("pix4_sct1p_n_sct",          mnt_cat2_n_sct);
+   auto mon_cat2_refit_ptratio  = Monitored::Collection("pix4_sct1p_refit_ptratio",  mnt_cat2_refit_ptratio);
+   auto mon_cat2_refit_chi2ndof_ratio = Monitored::Collection("pix4_sct1p_refit_chi2ndof_ratio", mnt_cat2_refit_chi2ndof_ratio);
+   auto mon_cat2_iso01          = Monitored::Collection("pix4_sct1p_iso01",          mnt_cat2_iso01);
+   auto mon_cat2_iso0201        = Monitored::Collection("pix4_sct1p_iso0201",        mnt_cat2_iso0201);
+   auto mon_cat2_chi2ndof_pix   = Monitored::Collection("pix4_sct1p_chi2ndof_pix",   mnt_cat2_chi2ndof_pix);
+   auto mon_cat2_n_pix          = Monitored::Collection("pix4_sct1p_n_pix",          mnt_cat2_n_pix);
+   auto mon_cat2_bdtscore       = Monitored::Collection("pix4_sct1p_bdtscore",       mnt_cat2_bdtscore);
+   auto monDisTrkCat2 = Monitored::Group(m_monTool, mon_cat2_pt, mon_cat2_refit_pt, mon_cat2_refit_z0, mon_cat2_refit_d0, mon_cat2_n_sct,
+					 mon_cat2_refit_ptratio, mon_cat2_refit_chi2ndof_ratio, mon_cat2_iso01, mon_cat2_iso0201,
+					 mon_cat2_chi2ndof_pix, mon_cat2_n_pix, mon_cat2_bdtscore);
+   //
+   std::vector<float> mnt_cat3_pt;
+   std::vector<float> mnt_cat3_z0;
+   std::vector<float> mnt_cat3_d0;
+   std::vector<float> mnt_cat3_chi2ndof;
+   std::vector<float> mnt_cat3_chi2ndof_pix;
+   std::vector<float> mnt_cat3_iso01;
+   std::vector<float> mnt_cat3_iso0201;
+   std::vector<float> mnt_cat3_refit_pt;
+   std::vector<float> mnt_cat3_refit_z0;
+   std::vector<float> mnt_cat3_refit_d0;
+   std::vector<int>   mnt_cat3_n_pix;
+   std::vector<int>   mnt_cat3_n_bl;
+   std::vector<float> mnt_cat3_bdtscore;
+   auto mon_cat3_pt             = Monitored::Collection("pix3_sct0_pt",             mnt_cat3_pt);
+   auto mon_cat3_z0             = Monitored::Collection("pix3_sct0_z0",             mnt_cat3_z0);
+   auto mon_cat3_d0             = Monitored::Collection("pix3_sct0_d0",             mnt_cat3_d0);
+   auto mon_cat3_chi2ndof       = Monitored::Collection("pix3_sct0_chi2ndof",       mnt_cat3_chi2ndof);
+   auto mon_cat3_chi2ndof_pix   = Monitored::Collection("pix3_sct0_chi2ndof_pix",   mnt_cat3_chi2ndof_pix);
+   auto mon_cat3_iso01          = Monitored::Collection("pix3_sct0_iso01",          mnt_cat3_iso01);
+   auto mon_cat3_iso0201        = Monitored::Collection("pix3_sct0_iso0201",        mnt_cat3_iso0201);
+   auto mon_cat3_refit_pt       = Monitored::Collection("pix3_sct0_refit_pt",       mnt_cat3_refit_pt);
+   auto mon_cat3_refit_z0       = Monitored::Collection("pix3_sct0_refit_z0",       mnt_cat3_refit_z0);
+   auto mon_cat3_refit_d0       = Monitored::Collection("pix3_sct0_refit_d0",       mnt_cat3_refit_d0);
+   auto mon_cat3_n_pix          = Monitored::Collection("pix3_sct0_n_pix",          mnt_cat3_n_pix);
+   auto mon_cat3_n_bl           = Monitored::Collection("pix3_sct0_n_bl",           mnt_cat3_n_bl);
+   auto mon_cat3_bdtscore       = Monitored::Collection("pix3_sct0_bdtscore",       mnt_cat3_bdtscore);
+   auto monDisTrkCat3 = Monitored::Group(m_monTool, mon_cat3_pt, mon_cat3_z0, mon_cat3_d0, mon_cat3_chi2ndof, mon_cat3_chi2ndof_pix, 
+					 mon_cat3_iso01, mon_cat3_iso0201, mon_cat3_refit_pt, mon_cat3_refit_z0, mon_cat3_refit_d0,
+					 mon_cat3_n_pix, mon_cat3_n_bl, mon_cat3_bdtscore);
+   //
+   std::vector<float> mnt_cat4_pt;
+   std::vector<float> mnt_cat4_z0;
+   std::vector<float> mnt_cat4_d0;
+   std::vector<float> mnt_cat4_refit_pt;
+   std::vector<float> mnt_cat4_refit_z0;
+   std::vector<float> mnt_cat4_refit_d0;
+   std::vector<int>   mnt_cat4_n_pix;
+   std::vector<int>   mnt_cat4_n_sct;
+   std::vector<float> mnt_cat4_refit_ptratio;
+   std::vector<int>   mnt_cat4_n_bl;
+   std::vector<float> mnt_cat4_chi2ndof;
+   std::vector<float> mnt_cat4_iso01;
+   std::vector<float> mnt_cat4_iso0201;
+   std::vector<float> mnt_cat4_refit_chi2ndof;
+   std::vector<float> mnt_cat4_bdtscore;
+   auto mon_cat4_pt             = Monitored::Collection("pix3_sct1p_pt",             mnt_cat4_pt);
+   auto mon_cat4_z0             = Monitored::Collection("pix3_sct1p_z0",             mnt_cat4_z0);
+   auto mon_cat4_d0             = Monitored::Collection("pix3_sct1p_d0",             mnt_cat4_d0);
+   auto mon_cat4_refit_pt       = Monitored::Collection("pix3_sct1p_refit_pt",       mnt_cat4_refit_pt);
+   auto mon_cat4_refit_z0       = Monitored::Collection("pix3_sct1p_refit_z0",       mnt_cat4_refit_z0);
+   auto mon_cat4_refit_d0       = Monitored::Collection("pix3_sct1p_refit_d0",       mnt_cat4_refit_d0);
+   auto mon_cat4_n_pix          = Monitored::Collection("pix3_sct1p_n_pix",          mnt_cat4_n_pix);
+   auto mon_cat4_n_sct          = Monitored::Collection("pix3_sct1p_n_sct",          mnt_cat4_n_sct);
+   auto mon_cat4_refit_ptratio  = Monitored::Collection("pix3_sct1p_refit_ptratio",  mnt_cat4_refit_ptratio);
+   auto mon_cat4_n_bl           = Monitored::Collection("pix3_sct1p_n_bl",           mnt_cat4_n_bl);
+   auto mon_cat4_chi2ndof       = Monitored::Collection("pix3_sct1p_chi2ndof",       mnt_cat4_chi2ndof);
+   auto mon_cat4_iso01          = Monitored::Collection("pix3_sct1p_iso01",          mnt_cat4_iso01);
+   auto mon_cat4_iso0201        = Monitored::Collection("pix3_sct1p_iso0201",        mnt_cat4_iso0201);
+   auto mon_cat4_refit_chi2ndof = Monitored::Collection("pix3_sct1p_refit_chi2ndof", mnt_cat4_refit_chi2ndof);
+   auto mon_cat4_bdtscore       = Monitored::Collection("pix3_sct1p_bdtscore",       mnt_cat4_bdtscore);
+   auto monDisTrkCat4 = Monitored::Group(m_monTool, mon_cat4_pt, mon_cat4_z0, mon_cat4_d0, mon_cat4_refit_pt, mon_cat4_refit_z0, mon_cat4_refit_d0,
+					 mon_cat4_n_pix, mon_cat4_n_sct, mon_cat4_refit_ptratio, mon_cat4_n_bl, mon_cat4_chi2ndof,
+					 mon_cat4_iso01, mon_cat4_iso0201, mon_cat4_refit_chi2ndof, mon_cat4_bdtscore);
+
+   //
+
+   const std::string prefixIn  = "disTrkCand";
+   const std::string prefixOut = "disTrk";
+
+   unsigned int i_cand=0;
+
+   for ( const xAOD::TrigComposite* cand : *disTrkCandContainer ) {
+
+      ATH_MSG_VERBOSE("===== i_cand: " << i_cand++ << " =====" );
+
+      // category
+      int category = cand->getDetail<int>(prefixIn+"_category");
+      if( category<=0 || category>=5 ) {
+	 ATH_MSG_VERBOSE("category is out of range = " << category);
+	 continue;
+      }
+      mnt_category.push_back(category);
+      
+      // get values
+      float pt              = cand->getDetail<float>(prefixIn+"_pt");
+      float refit_pt        = cand->getDetail<float>(prefixIn+"_refit_pt");
+      pt       /= 1000.0;
+      refit_pt /= 1000.0;
+      int   is_fail         = cand->getDetail<int>  (prefixIn+"_is_fail");
+      float d0_wrtVtx       = cand->getDetail<float>(prefixIn+"_d0_wrtVtx");
+      float z0_wrtVtx       = cand->getDetail<float>(prefixIn+"_z0_wrtVtx");
+      float chi2            = cand->getDetail<float>(prefixIn+"_chi2");
+      float ndof            = cand->getDetail<float>(prefixIn+"_ndof");
+      float chi2ndof        = ( std::abs(ndof) > 1e-4 ) ? chi2 / ndof : 20;
+      int   n_hits_pix      = cand->getDetail<int>  (prefixIn+"_n_hits_pix");
+      int   n_hits_sct      = cand->getDetail<int>  (prefixIn+"_n_hits_sct");
+      int   n_hits_bl       = cand->getDetail<int>  (prefixIn+"_n_hits_innermost");
+      float iso3_dr01       = cand->getDetail<float>(prefixIn+"_iso3_dr01");
+      iso3_dr01 /= 1000;
+      float iso3_dr02       = cand->getDetail<float>(prefixIn+"_iso3_dr02");
+      iso3_dr02 /= 1000;
+      float refit_ptratio   = ( std::abs(pt) > 1e-4 ) ? refit_pt / pt : 0;
+      float refit_d0_wrtVtx = cand->getDetail<float>(prefixIn+"_refit_d0_wrtVtx");
+      float refit_z0_wrtVtx = cand->getDetail<float>(prefixIn+"_refit_z0_wrtVtx");
+      float refit_chi2      = cand->getDetail<float>(prefixIn+"_refit_chi2");
+      float refit_ndof      = cand->getDetail<float>(prefixIn+"_refit_ndof");
+      float refit_chi2ndof  = ( std::abs(refit_ndof) > 1e-4 ) ? refit_chi2 / refit_ndof : 20;
+      float refit_chi2ndof_ratio = (std::abs(chi2ndof) > 1e-4 ) ? refit_chi2ndof / chi2ndof : 0;
+      float chi2_pix=0; float ndof_pix=0;
+      chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_ibl");
+      chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix1");
+      chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix2");
+      chi2_pix += cand->getDetail<float>(prefixIn+"_chi2sum_br_pix3");
+      ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_ibl");
+      ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix1");
+      ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix2");
+      ndof_pix += cand->getDetail<float>(prefixIn+"_ndofsum_br_pix3");
+      float chi2ndof_pix = ( std::abs(ndof_pix) > 1e-4 ) ? chi2_pix / ndof_pix : 0;
+      
+      // BDT score
+      float bdt_score = 0.0;
+      if( category==1 ) {
+	 bdt_score = bdt_eval_pix4l_sct0(context, pt, z0_wrtVtx, d0_wrtVtx, iso3_dr01, iso3_dr02-iso3_dr01, chi2ndof, chi2ndof_pix,
+					 refit_pt, n_hits_pix, refit_ptratio, refit_chi2ndof, n_hits_bl);
+	 mnt_cat1_pt.push_back(pt);
+	 mnt_cat1_z0.push_back(z0_wrtVtx);
+	 mnt_cat1_d0.push_back(d0_wrtVtx);
+	 mnt_cat1_iso01.push_back(iso3_dr01);
+	 mnt_cat1_iso0201.push_back(iso3_dr02-iso3_dr01);
+	 mnt_cat1_chi2ndof.push_back(chi2ndof);
+	 mnt_cat1_chi2ndof_pix.push_back(chi2ndof_pix);
+	 mnt_cat1_refit_pt.push_back(refit_pt);
+	 mnt_cat1_n_pix.push_back(n_hits_pix);
+	 mnt_cat1_refit_ptratio.push_back(refit_ptratio);
+	 mnt_cat1_refit_chi2ndof.push_back(refit_chi2ndof);
+	 mnt_cat1_n_bl.push_back(n_hits_bl);
+	 mnt_cat1_bdtscore.push_back(bdt_score);
+      }
+      else if( category==2 ) {
+	 bdt_score = bdt_eval_pix4l_sct1p(context, pt, refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_sct, refit_ptratio,
+					  refit_chi2ndof_ratio, iso3_dr01, iso3_dr02-iso3_dr01, is_fail, chi2ndof_pix, n_hits_pix);
+	 mnt_cat2_pt.push_back(pt);
+	 mnt_cat2_refit_pt.push_back(refit_pt);
+	 mnt_cat2_refit_z0.push_back(refit_z0_wrtVtx);
+	 mnt_cat2_refit_d0.push_back(refit_d0_wrtVtx);
+	 mnt_cat2_n_sct.push_back(n_hits_sct);
+	 mnt_cat2_refit_ptratio.push_back(refit_ptratio);
+	 mnt_cat2_refit_chi2ndof_ratio.push_back(refit_chi2ndof_ratio);
+	 mnt_cat2_iso01.push_back(iso3_dr01);
+	 mnt_cat2_iso0201.push_back(iso3_dr02-iso3_dr01);
+	 mnt_cat2_chi2ndof_pix.push_back(chi2ndof_pix);
+	 mnt_cat2_n_pix.push_back(n_hits_pix);
+	 mnt_cat2_bdtscore.push_back(bdt_score);
+      }
+      else if( category==3 ) {
+	 bdt_score = bdt_eval_pix3l_sct0(context, pt, z0_wrtVtx, d0_wrtVtx, chi2ndof, chi2ndof_pix, iso3_dr01, iso3_dr02-iso3_dr01,
+					 refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_bl);
+	 mnt_cat3_pt.push_back(pt);
+	 mnt_cat3_z0.push_back(z0_wrtVtx);
+	 mnt_cat3_d0.push_back(d0_wrtVtx);
+	 mnt_cat3_chi2ndof.push_back(chi2ndof);
+	 mnt_cat3_chi2ndof_pix.push_back(chi2ndof_pix);
+	 mnt_cat3_iso01.push_back(iso3_dr01);
+	 mnt_cat3_iso0201.push_back(iso3_dr02-iso3_dr01);
+	 mnt_cat3_refit_pt.push_back(refit_pt);
+	 mnt_cat3_refit_z0.push_back(refit_z0_wrtVtx);
+	 mnt_cat3_refit_d0.push_back(refit_d0_wrtVtx);
+	 mnt_cat3_n_pix.push_back(n_hits_pix);
+	 mnt_cat3_n_bl.push_back(n_hits_bl);
+	 mnt_cat3_bdtscore.push_back(bdt_score);
+      }
+      else if( category==4 ) {
+	 bdt_score = bdt_eval_pix3l_sct1p(context, pt, z0_wrtVtx, d0_wrtVtx, refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_sct,
+					  refit_ptratio, is_fail, n_hits_bl, chi2ndof, iso3_dr01, iso3_dr02-iso3_dr01, refit_chi2ndof);
+	 mnt_cat4_pt.push_back(pt);
+	 mnt_cat4_z0.push_back(z0_wrtVtx);
+	 mnt_cat4_d0.push_back(d0_wrtVtx);
+	 mnt_cat4_refit_pt.push_back(refit_pt);
+	 mnt_cat4_refit_z0.push_back(refit_z0_wrtVtx);
+	 mnt_cat4_refit_d0.push_back(refit_d0_wrtVtx);
+	 mnt_cat4_n_pix.push_back(n_hits_pix);
+	 mnt_cat4_n_sct.push_back(n_hits_sct);
+	 mnt_cat4_refit_ptratio.push_back(refit_ptratio);
+	 mnt_cat4_n_bl.push_back(n_hits_bl);
+	 mnt_cat4_chi2ndof.push_back(chi2ndof);
+	 mnt_cat4_iso01.push_back(iso3_dr01);
+	 mnt_cat4_iso0201.push_back(iso3_dr02-iso3_dr01);
+	 mnt_cat4_refit_chi2ndof.push_back(refit_chi2ndof);
+	 mnt_cat4_bdtscore.push_back(bdt_score);
+      } 
+      ATH_MSG_VERBOSE("BDT score = " << bdt_score);
+
+      // create EDM object
+      xAOD::TrigComposite *distrk = new xAOD::TrigComposite();
+      distrk->makePrivateStore();
+      disTrkBDTSelContainer->push_back(distrk);
+
+      distrk->setDetail<int>  (prefixOut+"_category",         category);
+      distrk->setDetail<float>(prefixOut+"_pt",               pt*1000.0);
+      float eta = cand->getDetail<float>(prefixIn+"_eta");
+      float phi = cand->getDetail<float>(prefixIn+"_phi");
+      distrk->setDetail<float>(prefixOut+"_eta",              eta);
+      distrk->setDetail<float>(prefixOut+"_phi",              phi);
+      distrk->setDetail<float>(prefixOut+"_refit_pt",         refit_pt*1000.0);
+      distrk->setDetail<int>  (prefixOut+"_is_fail",          is_fail);
+      distrk->setDetail<float>(prefixOut+"_d0_wrtVtx",        d0_wrtVtx);
+      distrk->setDetail<float>(prefixOut+"_z0_wrtVtx",        z0_wrtVtx);
+      distrk->setDetail<float>(prefixOut+"_chi2",             chi2);
+      distrk->setDetail<float>(prefixOut+"_ndof",             ndof);
+      distrk->setDetail<int>  (prefixOut+"_n_hits_pix",       n_hits_pix);
+      distrk->setDetail<int>  (prefixOut+"_n_hits_sct",       n_hits_sct);
+      distrk->setDetail<int>  (prefixOut+"_n_hits_innermost", n_hits_bl);
+      distrk->setDetail<float>(prefixOut+"_iso3_dr01",        iso3_dr01*1000.0);
+      distrk->setDetail<float>(prefixOut+"_iso3_dr02",        iso3_dr02*1000.0);
+      distrk->setDetail<float>(prefixOut+"_refit_d0_wrtVtx",  refit_d0_wrtVtx);
+      distrk->setDetail<float>(prefixOut+"_refit_z0_wrtVtx",  refit_z0_wrtVtx);
+      distrk->setDetail<float>(prefixOut+"_refit_chi2",       refit_chi2);
+      distrk->setDetail<float>(prefixOut+"_refit_ndof",       refit_ndof);
+      distrk->setDetail<float>(prefixOut+"_chi2ndof_pix",     chi2ndof_pix);
+      distrk->setDetail<float>(prefixOut+"_bdtscore",         bdt_score);
+
+      ATH_MSG_VERBOSE("Created a new entry EDM" );
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+inline float TrigDisappearingTrackHypoAlg::BDTinput(float var) const { return ( std::abs(var) < 1e-5 ) ? 1e-5 : var; }
+
+float TrigDisappearingTrackHypoAlg::bdt_eval_pix4l_sct0
+(const EventContext& context,
+ float pt, float z0, float d0, float trkiso3_dr01, float trkiso3_dr0201, float chi2ndof, float chi2ndof_pix,
+ float refit_pt, int n_pix, float refit_ptratio, float refit_chi2ndof, int n_bl) const
+{
+   *m_tmva_pix4l_sct0_pt.get(context)             = BDTinput(pt);
+   *m_tmva_pix4l_sct0_z0.get(context)             = BDTinput(z0);
+   *m_tmva_pix4l_sct0_d0.get(context)             = BDTinput(d0);
+   *m_tmva_pix4l_sct0_trkiso3_dr01.get(context)   = BDTinput(trkiso3_dr01);
+   *m_tmva_pix4l_sct0_trkiso3_dr0201.get(context) = BDTinput(trkiso3_dr0201);
+   *m_tmva_pix4l_sct0_chi2ndof.get(context)       = BDTinput(chi2ndof);
+   *m_tmva_pix4l_sct0_chi2ndof_pix.get(context)   = BDTinput(chi2ndof_pix);
+   *m_tmva_pix4l_sct0_refit_pt.get(context)       = BDTinput(refit_pt);
+   *m_tmva_pix4l_sct0_n_pix.get(context)          = BDTinput((float)n_pix);
+   *m_tmva_pix4l_sct0_refit_ptratio.get(context)  = BDTinput(refit_ptratio);
+   *m_tmva_pix4l_sct0_refit_chi2ndof.get(context) = BDTinput(refit_chi2ndof);
+   *m_tmva_pix4l_sct0_n_bl.get(context)           = BDTinput((float)n_bl);
+   //
+   return (**m_tmva_pix4l_sct0_reader.get(context)).EvaluateMVA("BDT method");
+}
+
+float TrigDisappearingTrackHypoAlg::bdt_eval_pix4l_sct1p
+(const EventContext& context,
+ float pt, float refit_pt, float refit_z0, float refit_d0, int n_sct, float refit_ptratio,
+ float refit_chi2ndof_ratio, float trkiso3_dr01, float trkiso3_dr0201, int is_fail, float chi2ndof_pix, int n_pix) const
+{
+   *m_tmva_pix4l_sct1p_pt.get(context)                   = BDTinput(pt);
+   *m_tmva_pix4l_sct1p_refit_pt.get(context)             = BDTinput(refit_pt);
+   *m_tmva_pix4l_sct1p_refit_z0.get(context)             = BDTinput(refit_z0);
+   *m_tmva_pix4l_sct1p_refit_d0.get(context)             = BDTinput(refit_d0);
+   *m_tmva_pix4l_sct1p_n_sct.get(context)                = BDTinput((float)n_sct);
+   *m_tmva_pix4l_sct1p_refit_ptratio.get(context)        = BDTinput(refit_ptratio);
+   *m_tmva_pix4l_sct1p_refit_chi2ndof_ratio.get(context) = BDTinput(refit_chi2ndof_ratio);
+   *m_tmva_pix4l_sct1p_trkiso3_dr01.get(context)         = BDTinput(trkiso3_dr01);
+   *m_tmva_pix4l_sct1p_trkiso3_dr0201.get(context)       = BDTinput(trkiso3_dr0201);
+   *m_tmva_pix4l_sct1p_is_fail.get(context)              = BDTinput((float)is_fail);
+   *m_tmva_pix4l_sct1p_chi2ndof_pix.get(context)         = BDTinput(chi2ndof_pix);
+   *m_tmva_pix4l_sct1p_n_pix.get(context)                = BDTinput((float)n_pix);
+
+   return (**m_tmva_pix4l_sct1p_reader.get(context)).EvaluateMVA("BDT method");
+}
+
+float TrigDisappearingTrackHypoAlg::bdt_eval_pix3l_sct0
+(const EventContext& context,
+ float pt, float z0, float d0, float chi2ndof, float chi2ndof_pix, float trkiso3_dr01, float trkiso3_dr0201,
+ float refit_pt, float refit_z0, float refit_d0, int n_pix, int n_bl) const
+{
+   *m_tmva_pix3l_sct0_pt.get(context)             = BDTinput(pt);
+   *m_tmva_pix3l_sct0_z0.get(context)             = BDTinput(z0);
+   *m_tmva_pix3l_sct0_d0.get(context)             = BDTinput(d0);
+   *m_tmva_pix3l_sct0_chi2ndof.get(context)       = BDTinput(chi2ndof);
+   *m_tmva_pix3l_sct0_chi2ndof_pix.get(context)   = BDTinput(chi2ndof_pix);
+   *m_tmva_pix3l_sct0_trkiso3_dr01.get(context)   = BDTinput(trkiso3_dr01);
+   *m_tmva_pix3l_sct0_trkiso3_dr0201.get(context) = BDTinput(trkiso3_dr0201);
+   *m_tmva_pix3l_sct0_refit_pt.get(context)       = BDTinput(refit_pt);
+   *m_tmva_pix3l_sct0_refit_z0.get(context)       = BDTinput(refit_z0);
+   *m_tmva_pix3l_sct0_refit_d0.get(context)       = BDTinput(refit_d0);
+   *m_tmva_pix3l_sct0_n_pix.get(context)          = BDTinput((float)n_pix);
+   *m_tmva_pix3l_sct0_n_bl.get(context)           = BDTinput((float)n_bl);
+
+   return (**m_tmva_pix3l_sct0_reader.get(context)).EvaluateMVA("BDT method");
+}
+
+float TrigDisappearingTrackHypoAlg::bdt_eval_pix3l_sct1p
+(const EventContext& context,
+ float pt, float z0, float d0, float refit_pt, float refit_z0, float refit_d0,
+ int n_pix, int n_sct, float refit_ptratio, int is_fail, int n_bl,
+ float chi2ndof, float trkiso3_dr01, float trkiso3_dr0201, float refit_chi2ndof) const
+{
+   *m_tmva_pix3l_sct1p_pt.get(context)             = BDTinput(pt);
+   *m_tmva_pix3l_sct1p_z0.get(context)             = BDTinput(z0);
+   *m_tmva_pix3l_sct1p_d0.get(context)             = BDTinput(d0);
+   *m_tmva_pix3l_sct1p_refit_pt.get(context)       = BDTinput(refit_pt);
+   *m_tmva_pix3l_sct1p_refit_z0.get(context)       = BDTinput(refit_z0);
+   *m_tmva_pix3l_sct1p_refit_d0.get(context)       = BDTinput(refit_d0);
+   *m_tmva_pix3l_sct1p_n_pix.get(context)          = BDTinput((float)n_pix);
+   *m_tmva_pix3l_sct1p_n_sct.get(context)          = BDTinput((float)n_sct);
+   *m_tmva_pix3l_sct1p_refit_ptratio.get(context)  = BDTinput(refit_ptratio);
+   *m_tmva_pix3l_sct1p_is_fail.get(context)        = BDTinput((float)is_fail);
+   *m_tmva_pix3l_sct1p_n_bl.get(context)           = BDTinput((float)n_bl);
+   *m_tmva_pix3l_sct1p_chi2ndof.get(context)       = BDTinput(chi2ndof);
+   *m_tmva_pix3l_sct1p_trkiso3_dr01.get(context)   = BDTinput(trkiso3_dr01);
+   *m_tmva_pix3l_sct1p_trkiso3_dr0201.get(context) = BDTinput(trkiso3_dr0201);
+   *m_tmva_pix3l_sct1p_refit_chi2ndof.get(context) = BDTinput(refit_chi2ndof);
+
+   return (**m_tmva_pix3l_sct1p_reader.get(context)).EvaluateMVA("BDT method");
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.h
new file mode 100644
index 0000000000000000000000000000000000000000..5eaad82dcb4d11de1d4f322e30186477f0325590
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoAlg.h
@@ -0,0 +1,115 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOALG_H
+#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOALG_H
+
+#include <string>
+
+#include "Gaudi/Property.h"
+#include "DecisionHandling/HypoBase.h"
+#include "TrigDisappearingTrackHypoTool.h"
+#include "AthenaMonitoringKernel/GenericMonitoringTool.h"
+#include "AthenaKernel/SlotSpecificObj.h"
+#include "TMVA/Reader.h"
+
+/**
+ * @class TrigDisappearingTrackHypoAlg
+ * @brief Implements Hypo selection on triggering disappearing tracks
+ * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
+ **/
+
+class TrigDisappearingTrackHypoAlg : public ::HypoBase 
+{ 
+public: 
+
+   TrigDisappearingTrackHypoAlg( const std::string& name, ISvcLocator* pSvcLocator );
+   
+   virtual StatusCode  initialize() override;
+   virtual StatusCode  execute(const EventContext& context) const override;
+   
+private: 
+
+   ToolHandleArray< TrigDisappearingTrackHypoTool >  m_hypoTools        {this, "HypoTools", {}, "Tools to perfrom selection"};
+   SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_DisTrkCandKey    {this, "DisTrkCand",  "HLT_DisTrkCand",   ""};
+   SG::WriteHandleKey<xAOD::TrigCompositeContainer>  m_DisTrkBDTSelKey  {this, "DisTrkBDTSel","HLT_DisTrkBDTSel", ""};
+
+   StatusCode createCandidates(const EventContext&, const xAOD::TrigCompositeContainer*, xAOD::TrigCompositeContainer*) const;
+
+   ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" };
+
+   // BDT selection methods
+   float bdt_eval_pix4l_sct0 (const EventContext&, float, float, float, float, float, float, float, float, int,   float, float, int) const;
+   float bdt_eval_pix4l_sct1p(const EventContext&, float, float, float, float, int,   float, float, float, float, int,   float, int) const;
+   float bdt_eval_pix3l_sct0 (const EventContext&, float, float, float, float, float, float, float, float, float, float, int,   int) const;
+   float bdt_eval_pix3l_sct1p(const EventContext&, float, float, float, float, float, float, int,   int,   float, int,   int,   float, float, float, float) const;
+   inline float BDTinput(float) const;
+
+   // TMVA reader
+   mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_pix4l_sct0_reader  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_pix4l_sct1p_reader ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_pix3l_sct0_reader  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_pix3l_sct1p_reader ATLAS_THREAD_SAFE;
+
+   // TMVA variables
+   // pix4l_sct0
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_pt             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_z0             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_d0             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_trkiso3_dr01   ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_trkiso3_dr0201 ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_chi2ndof       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_chi2ndof_pix   ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_refit_pt       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_n_pix          ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_refit_ptratio  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_refit_chi2ndof ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct0_n_bl           ATLAS_THREAD_SAFE;
+
+   // pix4l_sct1p
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_pt                   ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_pt             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_z0             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_d0             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_n_sct                ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_ptratio        ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_refit_chi2ndof_ratio ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_trkiso3_dr01         ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_trkiso3_dr0201       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_is_fail              ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_chi2ndof_pix         ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix4l_sct1p_n_pix                ATLAS_THREAD_SAFE;
+
+   // pix3l_sct0
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_pt             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_z0             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_d0             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_chi2ndof       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_chi2ndof_pix   ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_trkiso3_dr01   ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_trkiso3_dr0201 ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_refit_pt       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_refit_z0       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_refit_d0       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_n_pix          ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct0_n_bl           ATLAS_THREAD_SAFE;
+
+   // pix3l_sct1p
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_pt             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_z0             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_d0             ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_pt       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_z0       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_d0       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_n_pix          ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_n_sct          ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_ptratio  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_is_fail        ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_n_bl           ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_chi2ndof       ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_trkiso3_dr01   ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_trkiso3_dr0201 ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_pix3l_sct1p_refit_chi2ndof ATLAS_THREAD_SAFE;
+}; 
+
+#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOALG_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..68ca254133fcd667736f5668c740a85f0454bba7
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.cxx
@@ -0,0 +1,180 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+  * Trigger Hypo Tool, that is aimed at triggering disappearing track candidates
+  * author Kunihiro Nagano <kunihiro.nagano@cern.ch>
+*/
+
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "TrigCompositeUtils/HLTIdentifier.h"
+#include "TrigCompositeUtils/Combinators.h"
+#include "AthenaMonitoringKernel/Monitored.h"
+#include "TrigDisappearingTrackHypoTool.h"
+#include "GaudiKernel/PhysicalConstants.h"
+
+using namespace TrigCompositeUtils;
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+TrigDisappearingTrackHypoTool::TrigDisappearingTrackHypoTool( const std::string& type, 
+							      const std::string& name, 
+							      const IInterface* parent ) 
+   : AthAlgTool( type, name, parent ),
+     m_decisionId( HLT::Identifier::fromToolName( name ) ) {}
+
+TrigDisappearingTrackHypoTool::~TrigDisappearingTrackHypoTool() {}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigDisappearingTrackHypoTool::initialize()
+{
+   ATH_MSG_INFO( "Initialization completed successfully:" );
+   ATH_MSG_INFO( "  cutTrackPtGeV = " << m_cutTrackPtGeV ); 
+   ATH_MSG_INFO( "Tool configured for chain/id: " << m_decisionId  );
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigDisappearingTrackHypoTool::decide( std::vector<DisTrkHypoInfo>& toolInputs ) const 
+{
+   size_t numTrigger = m_cutTrackPtGeV.size(); 
+   size_t numDisTrks = toolInputs.size();
+   
+   ATH_MSG_VERBOSE( "Number of DisTrks = " << numDisTrks );
+
+   if ( numTrigger == 1 ) {
+      ATH_MSG_VERBOSE( "Applying selection of single for " << m_decisionId );
+      return inclusiveSelection(toolInputs);
+   }
+   else {
+      ATH_MSG_VERBOSE( "Applying selection of multiplicity for " << m_decisionId );
+      return multiplicitySelection(toolInputs);
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigDisappearingTrackHypoTool::inclusiveSelection(std::vector<DisTrkHypoInfo>& toolInputs) const
+{
+   bool isPassed = false;
+   unsigned int iDisTrk=0;
+   for ( auto& input: toolInputs ) {
+      ATH_MSG_VERBOSE( "--- iDisTrk=" << iDisTrk << " ---" );
+      if ( TrigCompositeUtils::passed( m_decisionId.numeric(), input.previousDecisionsIDs ) ) {
+         if ( decideOnSingleObject( input, 0 )==true ) {
+            ATH_MSG_VERBOSE( "   Passed selection --> adding DecisionID" );
+	    isPassed = true;
+            TrigCompositeUtils::addDecisionID(m_decisionId, input.decision);
+         }
+      } else {
+	 ATH_MSG_VERBOSE( "   Not match DecisionID: " << m_decisionId );
+      } 
+      ++iDisTrk;
+   }  
+
+   ATH_MSG_VERBOSE( "Inclusive selection isPassed = " << isPassed );
+   return StatusCode::SUCCESS; 
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigDisappearingTrackHypoTool::multiplicitySelection(std::vector<DisTrkHypoInfo>& toolInputs) const
+{
+   HLT::Index2DVec passingSelection( m_cutTrackPtGeV.size() );
+
+   for ( size_t cutIndex=0; cutIndex < m_cutTrackPtGeV.size(); ++cutIndex ) {
+      size_t elementIndex{ 0 };
+      for ( auto& input: toolInputs ) {
+         if ( TrigCompositeUtils::passed( m_decisionId.numeric(), input.previousDecisionsIDs ) ) {
+            if ( decideOnSingleObject( input, cutIndex ) == true ) {
+               ATH_MSG_VERBOSE( "Pass through selection " << m_decisionId << " : Event[" << elementIndex << "]" );
+               passingSelection[cutIndex].push_back( elementIndex );
+            }
+         }
+	 else {
+            ATH_MSG_VERBOSE( "Not match DecisionID " << m_decisionId );
+         }
+         elementIndex++;
+      }
+      // If no object passes the selection, multipul selection should stop.
+      if ( passingSelection[cutIndex].empty() ) {
+         ATH_MSG_VERBOSE( "No object passed selection " << cutIndex << " rejecting" );
+         return StatusCode::SUCCESS;
+      }
+   }
+
+   std::set<size_t> passingIndices;
+   HLT::elementsInUniqueCombinations( passingSelection, passingIndices );
+
+   if ( passingIndices.empty() ) {
+      ATH_MSG_VERBOSE( "No track passed through selection " << m_decisionId );
+      return StatusCode::SUCCESS;
+   }
+
+   for ( auto idx: passingIndices ) {
+      ATH_MSG_VERBOSE( "track[" << idx << "] passes through Chain/ID " << m_decisionId << " with pT" );
+      TrigCompositeUtils::addDecisionID( m_decisionId.numeric(), toolInputs[idx].decision );
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+bool TrigDisappearingTrackHypoTool::decideOnSingleObject( DisTrkHypoInfo& input, size_t cutIndex ) const
+{
+   // values
+   const std::string prefix = "disTrk";
+
+   auto distrk = input.disTrk;
+
+   int   category  = distrk->getDetail<int>  (prefix+"_category");
+   float pt        = distrk->getDetail<float>(prefix+"_pt");
+   float refit_pt  = distrk->getDetail<float>(prefix+"_refit_pt");
+   float bdt_score = distrk->getDetail<float>(prefix+"_bdtscore");
+   pt       /= 1000.0;
+   refit_pt /= 1000.0;
+
+   // selection
+   bool is_passed = false;
+   if( category==1 ) {
+      float bdt_threshold_pix4l_sct0 = m_cutBDTPix4Sct0[cutIndex];
+      float pt_threshold_pix4l_sct0  = m_cutTrackPtGeV[cutIndex];
+      if( pt >= pt_threshold_pix4l_sct0 && bdt_score >= bdt_threshold_pix4l_sct0 ) is_passed = true;
+   }
+   else if( category==2 ) {
+      float bdt_threshold_pix4l_sct1p      = m_cutBDTPix4Sct1p[cutIndex];
+      float refit_pt_threshold_pix4l_sct1p = m_cutTrackPtGeV[cutIndex];
+      if( refit_pt >= refit_pt_threshold_pix4l_sct1p && bdt_score >= bdt_threshold_pix4l_sct1p ) is_passed = true;
+   }
+   else if( category==3 ) {
+      float bdt_threshold_pix3l_sct0 = m_cutBDTPix3Sct0[cutIndex];
+      float pt_threshold_pix3l_sct0  = m_cutTrackPtGeV[cutIndex];
+      if( pt >= pt_threshold_pix3l_sct0 && bdt_score >= bdt_threshold_pix3l_sct0 ) is_passed = true;
+   }
+   else if( category==4 ) {
+      float bdt_threshold_pix3l_sct1p      = m_cutBDTPix3Sct1p[cutIndex];
+      float refit_pt_threshold_pix3l_sct1p = m_cutTrackPtGeV[cutIndex];
+      if( refit_pt >= refit_pt_threshold_pix3l_sct1p && bdt_score >= bdt_threshold_pix3l_sct1p ) is_passed = true;
+   }
+   else {
+      ATH_MSG_VERBOSE( "   category is out of range = " << category );
+   }
+   ATH_MSG_VERBOSE( "   isPassed = " << is_passed << ", cut index / pT / refitPt / BDT score = " << cutIndex << " / " << pt << " / " << refit_pt << " / " << bdt_score);
+
+   //
+   return is_passed;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..2a43b834d684fc987a75f0d98d0cface1fcca989
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackHypoTool.h
@@ -0,0 +1,56 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOTOOL_H
+#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOTOOL_H
+
+#include "Gaudi/Property.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "xAODTracking/TrackParticlexAODHelpers.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include <string>
+
+/**
+ * @class TrigDisappearingTrackHypoTool
+ * @brief Generated the decision for hypo thats triggers disappearing track
+ * @author Kunihiro Nagano <kunihiro.nagano@cern.ch>
+ **/
+
+class TrigDisappearingTrackHypoTool : virtual public ::AthAlgTool
+{ 
+public: 
+   TrigDisappearingTrackHypoTool( const std::string& type, 
+				  const std::string& name, 
+				  const IInterface* parent );
+   
+   virtual ~TrigDisappearingTrackHypoTool();
+   virtual StatusCode initialize() override;
+   
+   struct DisTrkHypoInfo {
+      TrigCompositeUtils::Decision* decision;
+      const xAOD::TrigComposite*    disTrk;
+      const TrigCompositeUtils::DecisionIDContainer previousDecisionsIDs;
+   };
+   
+   /**
+    * @brief decides upon a collection of tracks
+    **/
+   StatusCode decide( std::vector<DisTrkHypoInfo>& ) const;
+
+private:
+
+   HLT::Identifier m_decisionId;
+   Gaudi::Property< std::vector<float> >  m_cutTrackPtGeV   { this, "cutTrackPtGeV",  { float(10.0) }, "Track pT requirement in GeV" };
+   Gaudi::Property< std::vector<float> >  m_cutBDTPix4Sct0  { this, "cutBDTPix4Sct0", { float(0.05) }, "BDT score thershold for Pix4l_Sct0 category" };
+   Gaudi::Property< std::vector<float> >  m_cutBDTPix4Sct1p { this, "cutBDTPix4Sct1p",{ float(0.04) }, "BDT score thershold for Pix4l_Sct1p category" };
+   Gaudi::Property< std::vector<float> >  m_cutBDTPix3Sct0  { this, "cutBDTPix3Sct0", { float(0.05) }, "BDT score thershold for Pix3l_Sct0 category" };
+   Gaudi::Property< std::vector<float> >  m_cutBDTPix3Sct1p { this, "cutBDTPix3Sct1p",{ float(0.04) }, "BDT score thershold for Pix3l_Sct1p category" };
+
+   //
+   StatusCode inclusiveSelection( std::vector<DisTrkHypoInfo>& ) const;
+   StatusCode multiplicitySelection( std::vector<DisTrkHypoInfo>& ) const;
+   bool decideOnSingleObject( DisTrkHypoInfo&, size_t ) const;
+}; 
+
+#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKHYPOTOOL_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.cxx
deleted file mode 100644
index bbc55e9f769457c7c365f64ac3b79d9c5c881c2f..0000000000000000000000000000000000000000
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.cxx
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-
-  * Trigger Hypo Tool, that is aimed at triggering  large dEdx tracks
-  * author Kunihiro Nagano <kunihiro.nagano@cern.ch> 
-*/
-#include "TrigDisappearingTrackTriggerHypoAlg.h"
-#include "AthViews/ViewHelper.h"
-#include "TrigCompositeUtils/TrigCompositeUtils.h"
-#include "GaudiKernel/SystemOfUnits.h"
-
-using TrigCompositeUtils::createAndStore; 
-using TrigCompositeUtils::DecisionContainer;
-using TrigCompositeUtils::DecisionAuxContainer;
-using TrigCompositeUtils::DecisionIDContainer;
-using TrigCompositeUtils::decisionIDs;
-using TrigCompositeUtils::newDecisionIn;
-using TrigCompositeUtils::linkToPrevious;
-using TrigCompositeUtils::viewString;
-using TrigCompositeUtils::featureString;
-using TrigCompositeUtils::hypoAlgNodeName;
-using TrigCompositeUtils::findLink;
-using TrigCompositeUtils::LinkInfo;
-using TrigCompositeUtils::Decision;
-using TrigCompositeUtils::allFailed;
-
-TrigDisappearingTrackTriggerHypoAlg::TrigDisappearingTrackTriggerHypoAlg( const std::string& name, 
-									  ISvcLocator* pSvcLocator ) : 
-   ::HypoBase( name, pSvcLocator ) {}
-
-
-StatusCode TrigDisappearingTrackTriggerHypoAlg::initialize()
-{
-   CHECK( m_hypoTools.retrieve() );
-   CHECK( m_DisTrkCandKey.initialize() );
-   CHECK( m_DisTrkBDTSelKey.initialize());
-   return StatusCode::SUCCESS;
-}
-
-StatusCode TrigDisappearingTrackTriggerHypoAlg::execute( const EventContext& context ) const
-{
-   ATH_MSG_DEBUG( name() << "..." );
-   auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context );
-   ATH_CHECK( previousDecisionsHandle.isValid() );
-   
-   // new output decisions
-   ATH_MSG_DEBUG( "Creating new output decision handle" ); 
-   SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); 
-   auto decisions = outputHandle.ptr();
-
-   // previous decisions
-   ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" ); 
-   if(previousDecisionsHandle->size()!=1) {
-      ATH_MSG_ERROR( "Previous decision handle size isn't 1. It is" << previousDecisionsHandle->size() );
-      return StatusCode::FAILURE;
-   }
-   const Decision * previousDecision = previousDecisionsHandle->at(0);
-
-   TrigCompositeUtils::DecisionIDContainer previousDecisionIDs;
-   TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs);
-   
-   // input Disappearing objects
-   auto DisTrkCandHandle = SG::makeHandle(m_DisTrkCandKey, context );
-   ATH_CHECK( DisTrkCandHandle.isValid() );
-   ATH_MSG_DEBUG( "DisTrkCand handle size: " << DisTrkCandHandle->size() );
-
-   const xAOD::TrigCompositeContainer * DisTrkCandContainer = DisTrkCandHandle.get();
-
-   if( DisTrkCandContainer == nullptr ) {
-      ATH_MSG_ERROR( "ERROR Cannot get DisappearingTrks container" );
-      return StatusCode::FAILURE;
-   }
-
-   // output EDM object
-   auto DisTrkBDTSelContainer    = std::make_unique<xAOD::TrigCompositeContainer>();
-   auto DisTrkBDTSelContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
-   DisTrkBDTSelContainer->setStore(DisTrkBDTSelContainerAux.get());
-
-   // create decision
-   auto d = newDecisionIn( decisions , previousDecision, hypoAlgNodeName(), context );
-   TrigDisappearingTrackTriggerHypoTool::TrackInfo trkInfo{ d, DisTrkCandContainer, *DisTrkBDTSelContainer, previousDecisionIDs };
-
-   // Loop over all hypoToolinputs and get their decisions
-   for ( auto & tool: m_hypoTools ) {
-      ATH_CHECK( tool->decide( trkInfo ) );    
-   } 
-   
-   DecisionContainer::iterator it = decisions->begin();
-   bool isPassed = false;
-   while(it != decisions->end()) {
-      if (allFailed( *it )) {
-	 it = decisions->erase(it);
-      } else {
-	 isPassed = true;
-	 ++it;
-      }
-   }
-
-   // record link to EDM object if it is passed
-   if( isPassed ) {
-      SG::WriteHandle<xAOD::TrigCompositeContainer> DisTrkBDTSelHandle(m_DisTrkBDTSelKey, context);
-      ATH_CHECK( DisTrkBDTSelHandle.record( std::move( DisTrkBDTSelContainer ), std::move( DisTrkBDTSelContainerAux ) ) );
-      ATH_CHECK( d->setObjectLink( featureString(), ElementLink<xAOD::TrigCompositeContainer>( m_DisTrkBDTSelKey.key(), 0) ) );
-   }
-
-   ATH_CHECK( hypoBaseOutputProcessing(outputHandle) );
-
-   //
-   return StatusCode::SUCCESS;
-}
-
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.h
deleted file mode 100644
index 52658ca3beccf04691a7c922477eea2f21b38018..0000000000000000000000000000000000000000
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoAlg.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-*/
-#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOALG_H
-#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOALG_H
-
-#include "Gaudi/Property.h"
-
-#include <string>
-#include "TrigDisappearingTrackTriggerHypoTool.h"
-#include "DecisionHandling/HypoBase.h"
-
-/**
- * @class TrigDisappearingTrackTriggerHypoAlg
- * @brief Implements Hypo selection on triggering large Disappearing tracks
- * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
- **/
-
-class TrigDisappearingTrackTriggerHypoAlg : public ::HypoBase 
-{ 
-public: 
-
-   TrigDisappearingTrackTriggerHypoAlg( const std::string& name, ISvcLocator* pSvcLocator );
-   
-   virtual StatusCode  initialize() override;
-   virtual StatusCode  execute(const EventContext& context) const override;
-   
-private: 
-   ToolHandleArray< TrigDisappearingTrackTriggerHypoTool > m_hypoTools  {this, "HypoTools", {}, "Tools to perfrom selection"};
-   SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_DisTrkCandKey    {this, "DisTrkCand",  "HLT_DisTrkCand",   ""};
-   //
-   SG::WriteHandleKey<xAOD::TrigCompositeContainer>  m_DisTrkBDTSelKey  {this, "DisTrkBDTSel","HLT_DisTrkBDTSel", ""};
-}; 
-
-#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOALG_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.cxx
deleted file mode 100644
index 363162f4ba918d2555b576f35f3f8126bfad3011..0000000000000000000000000000000000000000
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.cxx
+++ /dev/null
@@ -1,594 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-
-  * Trigger Hypo Tool, that is aimed at triggering disappearing track candidates
-  * author Kunihiro Nagano <kunihiro.nagano@cern.ch>
-*/
-
-#include "TrigCompositeUtils/TrigCompositeUtils.h"
-#include "TrigCompositeUtils/HLTIdentifier.h"
-#include "TrigCompositeUtils/Combinators.h"
-#include "AthenaMonitoringKernel/Monitored.h"
-#include "TrigDisappearingTrackTriggerHypoTool.h"
-#include "GaudiKernel/PhysicalConstants.h"
-
-#include "PathResolver/PathResolver.h"
-
-using namespace TrigCompositeUtils;
-
-// ------------------------------------------------------------------------------------------------
-// ------------------------------------------------------------------------------------------------
-
-TrigDisappearingTrackTriggerHypoTool::TrigDisappearingTrackTriggerHypoTool( const std::string& type, 
-									    const std::string& name, 
-									    const IInterface* parent ) 
-   : AthAlgTool( type, name, parent ),
-     m_decisionId( HLT::Identifier::fromToolName( name ) ) {}
-
-// ------------------------------------------------------------------------------------------------
-// ------------------------------------------------------------------------------------------------
-
-TrigDisappearingTrackTriggerHypoTool::~TrigDisappearingTrackTriggerHypoTool() {}
-
-// ------------------------------------------------------------------------------------------------
-// ------------------------------------------------------------------------------------------------
-
-StatusCode TrigDisappearingTrackTriggerHypoTool::initialize()
-{
-   if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() );
-
-   ATH_MSG_INFO( "Initialization completed successfully:" );
-   ATH_MSG_INFO( "cutTrackPtGeV = " << m_cutTrackPtGeV ); 
-   ATH_MSG_INFO( "Tool configured for chain/id: " << m_decisionId  );
-   
-   TMVA::Reader reader;
-   m_tmva_pix4l_sct0_reader  = new TMVA::Reader( "!Color:!Silent" );
-   m_tmva_pix4l_sct1p_reader = new TMVA::Reader( "!Color:!Silent" );
-   m_tmva_pix3l_sct0_reader  = new TMVA::Reader( "!Color:!Silent" );
-   m_tmva_pix3l_sct1p_reader = new TMVA::Reader( "!Color:!Silent" );
-
-   // --- declare variables to the reader
-   // pix4l_sct0
-   m_tmva_pix4l_sct0_reader->AddVariable("pt",             &m_tmva_pix4l_sct0_pt);
-   m_tmva_pix4l_sct0_reader->AddVariable("z0",             &m_tmva_pix4l_sct0_z0);
-   m_tmva_pix4l_sct0_reader->AddVariable("d0",             &m_tmva_pix4l_sct0_d0);
-   m_tmva_pix4l_sct0_reader->AddVariable("trkiso3_dr01",   &m_tmva_pix4l_sct0_trkiso3_dr01);
-   m_tmva_pix4l_sct0_reader->AddVariable("trkiso3_dr0201", &m_tmva_pix4l_sct0_trkiso3_dr0201);
-   m_tmva_pix4l_sct0_reader->AddVariable("chi2ndof",       &m_tmva_pix4l_sct0_chi2ndof);
-   m_tmva_pix4l_sct0_reader->AddVariable("chi2ndof_pix",   &m_tmva_pix4l_sct0_chi2ndof_pix);
-   m_tmva_pix4l_sct0_reader->AddVariable("refit_pt",       &m_tmva_pix4l_sct0_refit_pt);
-   m_tmva_pix4l_sct0_reader->AddVariable("n_pix",          &m_tmva_pix4l_sct0_n_pix);
-   m_tmva_pix4l_sct0_reader->AddVariable("refit_ptratio",  &m_tmva_pix4l_sct0_refit_ptratio);
-   m_tmva_pix4l_sct0_reader->AddVariable("refit_chi2ndof", &m_tmva_pix4l_sct0_refit_chi2ndof);
-   m_tmva_pix4l_sct0_reader->AddVariable("n_bl",           &m_tmva_pix4l_sct0_n_bl);
-
-   // pix4l_sct1p
-   m_tmva_pix4l_sct1p_reader->AddVariable("pt",                   &m_tmva_pix4l_sct1p_pt);
-   m_tmva_pix4l_sct1p_reader->AddVariable("refit_pt",             &m_tmva_pix4l_sct1p_refit_pt);
-   m_tmva_pix4l_sct1p_reader->AddVariable("refit_z0",             &m_tmva_pix4l_sct1p_refit_z0);
-   m_tmva_pix4l_sct1p_reader->AddVariable("refit_d0",             &m_tmva_pix4l_sct1p_refit_d0);
-   m_tmva_pix4l_sct1p_reader->AddVariable("n_sct",                &m_tmva_pix4l_sct1p_n_sct);
-   m_tmva_pix4l_sct1p_reader->AddVariable("refit_ptratio",        &m_tmva_pix4l_sct1p_refit_ptratio);
-   m_tmva_pix4l_sct1p_reader->AddVariable("refit_chi2ndof_ratio", &m_tmva_pix4l_sct1p_refit_chi2ndof_ratio);
-   m_tmva_pix4l_sct1p_reader->AddVariable("trkiso3_dr01",         &m_tmva_pix4l_sct1p_trkiso3_dr01);
-   m_tmva_pix4l_sct1p_reader->AddVariable("trkiso3_dr0201",       &m_tmva_pix4l_sct1p_trkiso3_dr0201);
-   m_tmva_pix4l_sct1p_reader->AddVariable("is_fail",              &m_tmva_pix4l_sct1p_is_fail);
-   m_tmva_pix4l_sct1p_reader->AddVariable("chi2ndof_pix",         &m_tmva_pix4l_sct1p_chi2ndof_pix);
-   m_tmva_pix4l_sct1p_reader->AddVariable("n_pix",                &m_tmva_pix4l_sct1p_n_pix);
-
-   // pix3l_sct0
-   m_tmva_pix3l_sct0_reader->AddVariable("pt",             &m_tmva_pix3l_sct0_pt);
-   m_tmva_pix3l_sct0_reader->AddVariable("z0",             &m_tmva_pix3l_sct0_z0);
-   m_tmva_pix3l_sct0_reader->AddVariable("d0",             &m_tmva_pix3l_sct0_d0);
-   m_tmva_pix3l_sct0_reader->AddVariable("chi2ndof",       &m_tmva_pix3l_sct0_chi2ndof);
-   m_tmva_pix3l_sct0_reader->AddVariable("chi2ndof_pix",   &m_tmva_pix3l_sct0_chi2ndof_pix);
-   m_tmva_pix3l_sct0_reader->AddVariable("trkiso3_dr01",   &m_tmva_pix3l_sct0_trkiso3_dr01);
-   m_tmva_pix3l_sct0_reader->AddVariable("trkiso3_dr0201", &m_tmva_pix3l_sct0_trkiso3_dr0201);
-   m_tmva_pix3l_sct0_reader->AddVariable("refit_pt",       &m_tmva_pix3l_sct0_refit_pt);
-   m_tmva_pix3l_sct0_reader->AddVariable("refit_z0",       &m_tmva_pix3l_sct0_refit_z0);
-   m_tmva_pix3l_sct0_reader->AddVariable("refit_d0",       &m_tmva_pix3l_sct0_refit_d0);
-   m_tmva_pix3l_sct0_reader->AddVariable("n_pix",          &m_tmva_pix4l_sct0_n_pix);
-   m_tmva_pix3l_sct0_reader->AddVariable("n_bl",           &m_tmva_pix3l_sct0_n_bl);
-
-   // pix3l_sct1p
-   m_tmva_pix3l_sct1p_reader->AddVariable("pt",             &m_tmva_pix3l_sct1p_pt);
-   m_tmva_pix3l_sct1p_reader->AddVariable("z0",             &m_tmva_pix3l_sct1p_z0);
-   m_tmva_pix3l_sct1p_reader->AddVariable("d0",             &m_tmva_pix3l_sct1p_d0);
-   m_tmva_pix3l_sct1p_reader->AddVariable("refit_pt",       &m_tmva_pix3l_sct1p_refit_pt);
-   m_tmva_pix3l_sct1p_reader->AddVariable("refit_z0",       &m_tmva_pix3l_sct1p_refit_z0);
-   m_tmva_pix3l_sct1p_reader->AddVariable("refit_d0",       &m_tmva_pix3l_sct1p_refit_d0);
-   m_tmva_pix3l_sct1p_reader->AddVariable("n_pix",          &m_tmva_pix3l_sct1p_n_pix);
-   m_tmva_pix3l_sct1p_reader->AddVariable("n_sct",          &m_tmva_pix3l_sct1p_n_sct);
-   m_tmva_pix3l_sct1p_reader->AddVariable("refit_ptratio",  &m_tmva_pix3l_sct1p_refit_ptratio);
-   m_tmva_pix3l_sct1p_reader->AddVariable("is_fail",        &m_tmva_pix3l_sct1p_is_fail);
-   m_tmva_pix3l_sct1p_reader->AddVariable("n_bl",           &m_tmva_pix3l_sct1p_n_bl);
-   m_tmva_pix3l_sct1p_reader->AddVariable("chi2ndof",       &m_tmva_pix3l_sct1p_chi2ndof);
-   m_tmva_pix3l_sct1p_reader->AddVariable("trkiso3_dr01",   &m_tmva_pix3l_sct1p_trkiso3_dr01);
-   m_tmva_pix3l_sct1p_reader->AddVariable("trkiso3_dr0201", &m_tmva_pix3l_sct1p_trkiso3_dr0201);
-   m_tmva_pix3l_sct1p_reader->AddVariable("refit_chi2ndof", &m_tmva_pix3l_sct1p_refit_chi2ndof);
-
-   // --- Book the MVA methods
-   std::string file;
-   std::string weightfile;
-   std::string tuningVer;
-   const std::string methodName = "BDT method";
-   //
-   tuningVer  = "v21a";
-   file = "TrigDisappearingTrackTriggerHypo/pix4l_sct0.BDT.weights." + tuningVer + ".xml";
-   weightfile = PathResolver::find_calib_file(file.c_str());
-   ATH_MSG_INFO("opening weightfile for Pix4l_SCT0 = " << weightfile);
-   m_tmva_pix4l_sct0_reader->BookMVA(methodName, weightfile); 
-   //
-   tuningVer  = "v21b"; // "b" only for this category
-   file = "TrigDisappearingTrackTriggerHypo/pix4l_sct1p.BDT.weights." + tuningVer + ".xml";
-   weightfile = PathResolver::find_calib_file(file.c_str());
-   ATH_MSG_INFO("opening weightfile for Pix4l_SCT1p = " << weightfile);
-   m_tmva_pix4l_sct1p_reader->BookMVA(methodName, weightfile); 
-   //
-   tuningVer  = "v21a";
-   file = "TrigDisappearingTrackTriggerHypo/pix3l_sct0.BDT.weights." + tuningVer + ".xml";
-   weightfile = PathResolver::find_calib_file(file.c_str());
-   ATH_MSG_INFO("opening weightfile for Pix3l_SCT0 = " << weightfile);
-   m_tmva_pix3l_sct0_reader->BookMVA(methodName, weightfile); 
-   //
-   tuningVer  = "v21a";
-   file = "TrigDisappearingTrackTriggerHypo/pix3l_sct1p.BDT.weights." + tuningVer + ".xml";
-   weightfile = PathResolver::find_calib_file(file.c_str());
-   ATH_MSG_INFO("opening weightfile for Pix3l_SCT1p = " << weightfile);
-   m_tmva_pix3l_sct1p_reader->BookMVA(methodName, weightfile); 
-
-   //
-   return StatusCode::SUCCESS;
-}
-
-// ------------------------------------------------------------------------------------------------
-// ------------------------------------------------------------------------------------------------
-
-StatusCode TrigDisappearingTrackTriggerHypoTool::decide( TrackInfo& input ) const
-{
-   // monitoring
-   std::vector<int>   mnt_category;
-   auto mon_category = Monitored::Collection("category", mnt_category);
-   auto monDisTrk    = Monitored::Group(m_monTool, mon_category);
-
-   std::vector<float> mnt_cat1_pt;
-   std::vector<float> mnt_cat1_z0;
-   std::vector<float> mnt_cat1_d0;
-   std::vector<float> mnt_cat1_iso01;
-   std::vector<float> mnt_cat1_iso0201;
-   std::vector<float> mnt_cat1_chi2ndof;
-   std::vector<float> mnt_cat1_chi2ndof_pix;
-   std::vector<float> mnt_cat1_refit_pt;
-   std::vector<int>   mnt_cat1_n_pix;
-   std::vector<float> mnt_cat1_refit_ptratio;
-   std::vector<float> mnt_cat1_refit_chi2ndof;
-   std::vector<int>   mnt_cat1_n_bl;
-   std::vector<float> mnt_cat1_bdtscore;
-   auto mon_cat1_pt             = Monitored::Collection("pix4_sct0_pt",             mnt_cat1_pt);
-   auto mon_cat1_z0             = Monitored::Collection("pix4_sct0_z0",             mnt_cat1_z0);
-   auto mon_cat1_d0             = Monitored::Collection("pix4_sct0_d0",             mnt_cat1_d0);
-   auto mon_cat1_iso01          = Monitored::Collection("pix4_sct0_iso01",          mnt_cat1_iso01);
-   auto mon_cat1_iso0201        = Monitored::Collection("pix4_sct0_iso0201",        mnt_cat1_iso0201);
-   auto mon_cat1_chi2ndof       = Monitored::Collection("pix4_sct0_chi2ndof",       mnt_cat1_chi2ndof);
-   auto mon_cat1_chi2ndof_pix   = Monitored::Collection("pix4_sct0_chi2ndof_pix",   mnt_cat1_chi2ndof_pix);
-   auto mon_cat1_refit_pt       = Monitored::Collection("pix4_sct0_refit_pt",       mnt_cat1_refit_pt);
-   auto mon_cat1_n_pix          = Monitored::Collection("pix4_sct0_n_pix",          mnt_cat1_n_pix);
-   auto mon_cat1_refit_ptratio  = Monitored::Collection("pix4_sct0_refit_ptratio",  mnt_cat1_refit_ptratio);
-   auto mon_cat1_refit_chi2ndof = Monitored::Collection("pix4_sct0_refit_chi2ndof", mnt_cat1_refit_chi2ndof);
-   auto mon_cat1_n_bl           = Monitored::Collection("pix4_sct0_n_bl",           mnt_cat1_n_bl);
-   auto mon_cat1_bdtscore       = Monitored::Collection("pix4_sct0_bdtscore",       mnt_cat1_bdtscore);
-   auto monDisTrkCat1 = Monitored::Group(m_monTool, mon_cat1_pt, mon_cat1_z0, mon_cat1_d0, mon_cat1_iso01, mon_cat1_iso0201, mon_cat1_chi2ndof,
-					 mon_cat1_chi2ndof_pix, mon_cat1_refit_pt, mon_cat1_n_pix, mon_cat1_refit_ptratio,
-					 mon_cat1_refit_chi2ndof, mon_cat1_n_bl, mon_cat1_bdtscore);
-   //
-   std::vector<float> mnt_cat2_pt;
-   std::vector<float> mnt_cat2_refit_pt;
-   std::vector<float> mnt_cat2_refit_z0;
-   std::vector<float> mnt_cat2_refit_d0;
-   std::vector<int>   mnt_cat2_n_sct;
-   std::vector<float> mnt_cat2_refit_ptratio;
-   std::vector<float> mnt_cat2_refit_chi2ndof_ratio;
-   std::vector<float> mnt_cat2_iso01;
-   std::vector<float> mnt_cat2_iso0201;
-   std::vector<float> mnt_cat2_chi2ndof_pix;
-   std::vector<int>   mnt_cat2_n_pix;
-   std::vector<float> mnt_cat2_bdtscore;
-   auto mon_cat2_pt             = Monitored::Collection("pix4_sct1p_pt",             mnt_cat2_pt);
-   auto mon_cat2_refit_pt       = Monitored::Collection("pix4_sct1p_refit_pt",       mnt_cat2_refit_pt);
-   auto mon_cat2_refit_z0       = Monitored::Collection("pix4_sct1p_refit_z0",       mnt_cat2_refit_z0);
-   auto mon_cat2_refit_d0       = Monitored::Collection("pix4_sct1p_refit_d0",       mnt_cat2_refit_d0);
-   auto mon_cat2_n_sct          = Monitored::Collection("pix4_sct1p_n_sct",          mnt_cat2_n_sct);
-   auto mon_cat2_refit_ptratio  = Monitored::Collection("pix4_sct1p_refit_ptratio",  mnt_cat2_refit_ptratio);
-   auto mon_cat2_refit_chi2ndof_ratio = Monitored::Collection("pix4_sct1p_refit_chi2ndof_ratio", mnt_cat2_refit_chi2ndof_ratio);
-   auto mon_cat2_iso01          = Monitored::Collection("pix4_sct1p_iso01",          mnt_cat2_iso01);
-   auto mon_cat2_iso0201        = Monitored::Collection("pix4_sct1p_iso0201",        mnt_cat2_iso0201);
-   auto mon_cat2_chi2ndof_pix   = Monitored::Collection("pix4_sct1p_chi2ndof_pix",   mnt_cat2_chi2ndof_pix);
-   auto mon_cat2_n_pix          = Monitored::Collection("pix4_sct1p_n_pix",          mnt_cat2_n_pix);
-   auto mon_cat2_bdtscore       = Monitored::Collection("pix4_sct1p_bdtscore",       mnt_cat2_bdtscore);
-   auto monDisTrkCat2 = Monitored::Group(m_monTool, mon_cat2_pt, mon_cat2_refit_pt, mon_cat2_refit_z0, mon_cat2_refit_d0, mon_cat2_n_sct,
-					 mon_cat2_refit_ptratio, mon_cat2_refit_chi2ndof_ratio, mon_cat2_iso01, mon_cat2_iso0201,
-					 mon_cat2_chi2ndof_pix, mon_cat2_n_pix, mon_cat2_bdtscore);
-   //
-   std::vector<float> mnt_cat3_pt;
-   std::vector<float> mnt_cat3_z0;
-   std::vector<float> mnt_cat3_d0;
-   std::vector<float> mnt_cat3_chi2ndof;
-   std::vector<float> mnt_cat3_chi2ndof_pix;
-   std::vector<float> mnt_cat3_iso01;
-   std::vector<float> mnt_cat3_iso0201;
-   std::vector<float> mnt_cat3_refit_pt;
-   std::vector<float> mnt_cat3_refit_z0;
-   std::vector<float> mnt_cat3_refit_d0;
-   std::vector<int>   mnt_cat3_n_pix;
-   std::vector<int>   mnt_cat3_n_bl;
-   std::vector<float> mnt_cat3_bdtscore;
-   auto mon_cat3_pt             = Monitored::Collection("pix3_sct0_pt",             mnt_cat3_pt);
-   auto mon_cat3_z0             = Monitored::Collection("pix3_sct0_z0",             mnt_cat3_z0);
-   auto mon_cat3_d0             = Monitored::Collection("pix3_sct0_d0",             mnt_cat3_d0);
-   auto mon_cat3_chi2ndof       = Monitored::Collection("pix3_sct0_chi2ndof",       mnt_cat3_chi2ndof);
-   auto mon_cat3_chi2ndof_pix   = Monitored::Collection("pix3_sct0_chi2ndof_pix",   mnt_cat3_chi2ndof_pix);
-   auto mon_cat3_iso01          = Monitored::Collection("pix3_sct0_iso01",          mnt_cat3_iso01);
-   auto mon_cat3_iso0201        = Monitored::Collection("pix3_sct0_iso0201",        mnt_cat3_iso0201);
-   auto mon_cat3_refit_pt       = Monitored::Collection("pix3_sct0_refit_pt",       mnt_cat3_refit_pt);
-   auto mon_cat3_refit_z0       = Monitored::Collection("pix3_sct0_refit_z0",       mnt_cat3_refit_z0);
-   auto mon_cat3_refit_d0       = Monitored::Collection("pix3_sct0_refit_d0",       mnt_cat3_refit_d0);
-   auto mon_cat3_n_pix          = Monitored::Collection("pix3_sct0_n_pix",          mnt_cat3_n_pix);
-   auto mon_cat3_n_bl           = Monitored::Collection("pix3_sct0_n_bl",           mnt_cat3_n_bl);
-   auto mon_cat3_bdtscore       = Monitored::Collection("pix3_sct0_bdtscore",       mnt_cat3_bdtscore);
-   auto monDisTrkCat3 = Monitored::Group(m_monTool, mon_cat3_pt, mon_cat3_z0, mon_cat3_d0, mon_cat3_chi2ndof, mon_cat3_chi2ndof_pix, 
-					 mon_cat3_iso01, mon_cat3_iso0201, mon_cat3_refit_pt, mon_cat3_refit_z0, mon_cat3_refit_d0,
-					 mon_cat3_n_pix, mon_cat3_n_bl, mon_cat3_bdtscore);
-   //
-   std::vector<float> mnt_cat4_pt;
-   std::vector<float> mnt_cat4_z0;
-   std::vector<float> mnt_cat4_d0;
-   std::vector<float> mnt_cat4_refit_pt;
-   std::vector<float> mnt_cat4_refit_z0;
-   std::vector<float> mnt_cat4_refit_d0;
-   std::vector<int>   mnt_cat4_n_pix;
-   std::vector<int>   mnt_cat4_n_sct;
-   std::vector<float> mnt_cat4_refit_ptratio;
-   std::vector<int>   mnt_cat4_n_bl;
-   std::vector<float> mnt_cat4_chi2ndof;
-   std::vector<float> mnt_cat4_iso01;
-   std::vector<float> mnt_cat4_iso0201;
-   std::vector<float> mnt_cat4_refit_chi2ndof;
-   std::vector<float> mnt_cat4_bdtscore;
-   auto mon_cat4_pt             = Monitored::Collection("pix3_sct1p_pt",             mnt_cat4_pt);
-   auto mon_cat4_z0             = Monitored::Collection("pix3_sct1p_z0",             mnt_cat4_z0);
-   auto mon_cat4_d0             = Monitored::Collection("pix3_sct1p_d0",             mnt_cat4_d0);
-   auto mon_cat4_refit_pt       = Monitored::Collection("pix3_sct1p_refit_pt",       mnt_cat4_refit_pt);
-   auto mon_cat4_refit_z0       = Monitored::Collection("pix3_sct1p_refit_z0",       mnt_cat4_refit_z0);
-   auto mon_cat4_refit_d0       = Monitored::Collection("pix3_sct1p_refit_d0",       mnt_cat4_refit_d0);
-   auto mon_cat4_n_pix          = Monitored::Collection("pix3_sct1p_n_pix",          mnt_cat4_n_pix);
-   auto mon_cat4_n_sct          = Monitored::Collection("pix3_sct1p_n_sct",          mnt_cat4_n_sct);
-   auto mon_cat4_refit_ptratio  = Monitored::Collection("pix3_sct1p_refit_ptratio",  mnt_cat4_refit_ptratio);
-   auto mon_cat4_n_bl           = Monitored::Collection("pix3_sct1p_n_bl",           mnt_cat4_n_bl);
-   auto mon_cat4_chi2ndof       = Monitored::Collection("pix3_sct1p_chi2ndof",       mnt_cat4_chi2ndof);
-   auto mon_cat4_iso01          = Monitored::Collection("pix3_sct1p_iso01",          mnt_cat4_iso01);
-   auto mon_cat4_iso0201        = Monitored::Collection("pix3_sct1p_iso0201",        mnt_cat4_iso0201);
-   auto mon_cat4_refit_chi2ndof = Monitored::Collection("pix3_sct1p_refit_chi2ndof", mnt_cat4_refit_chi2ndof);
-   auto mon_cat4_bdtscore       = Monitored::Collection("pix3_sct1p_bdtscore",       mnt_cat4_bdtscore);
-   auto monDisTrkCat4 = Monitored::Group(m_monTool, mon_cat4_pt, mon_cat4_z0, mon_cat4_d0, mon_cat4_refit_pt, mon_cat4_refit_z0, mon_cat4_refit_d0,
-					 mon_cat4_n_pix, mon_cat4_n_sct, mon_cat4_refit_ptratio, mon_cat4_n_bl, mon_cat4_chi2ndof,
-					 mon_cat4_iso01, mon_cat4_iso0201, mon_cat4_refit_chi2ndof, mon_cat4_bdtscore);
-
-   // loop for each DisTrkCand
-   const xAOD::TrigCompositeContainer* disTrkCandContainer   = input.disTrkCandContainer;
-   xAOD::TrigCompositeContainer&       disTrkBDTSelContainer = input.disTrkBDTSelContainer;
-
-   const int cutIndex = 0;
-   const std::string prefix = "disTrkCand";
-
-   float bdt_threshold_pix4l_sct0  = m_cutBDTPix4Sct0[cutIndex];
-   float bdt_threshold_pix4l_sct1p = m_cutBDTPix4Sct1p[cutIndex];
-   float bdt_threshold_pix3l_sct0  = m_cutBDTPix3Sct0[cutIndex];
-   float bdt_threshold_pix3l_sct1p = m_cutBDTPix3Sct1p[cutIndex];
-   
-   // for future, these threshold can be tuned separately for each category
-   float pt_threshold_pix4l_sct0        = m_cutTrackPtGeV[cutIndex];
-   float refit_pt_threshold_pix4l_sct1p = m_cutTrackPtGeV[cutIndex];
-   float pt_threshold_pix3l_sct0        = m_cutTrackPtGeV[cutIndex];
-   float refit_pt_threshold_pix3l_sct1p = m_cutTrackPtGeV[cutIndex];
-
-   unsigned int i_cand=0;
-   unsigned int n_passed_cand=0;
-   for ( const xAOD::TrigComposite* cand : *disTrkCandContainer ) {
-      ATH_MSG_DEBUG("UTT: ===== i_cand: " << i_cand++ << " =====" );
-
-      // category
-      int category = cand->getDetail<int>(prefix+"_category");
-      if( category<=0 || category>=5 ) {
-	 ATH_MSG_DEBUG("UTT: category is out of range = " << category);
-	 continue;
-      }
-      
-      // pt cut
-      float pt       = cand->getDetail<float>(prefix+"_pt");
-      float refit_pt = cand->getDetail<float>(prefix+"_refit_pt");
-      pt       /= 1000;
-      refit_pt /= 1000;
-      if( pt < m_cutTrackPtGeV[cutIndex] || refit_pt < m_cutTrackPtGeV[cutIndex] ) {
-	 ATH_MSG_DEBUG("UTT: Fails pt cut, pt / refit_pt = " << pt << " / " << refit_pt);
-	 continue;
-      }
-      mnt_category.push_back(category);
-
-      // get values
-      int   is_fail         = cand->getDetail<int>  (prefix+"_is_fail");
-      float d0_wrtVtx       = cand->getDetail<float>(prefix+"_d0_wrtVtx");
-      float z0_wrtVtx       = cand->getDetail<float>(prefix+"_z0_wrtVtx");
-      float chi2            = cand->getDetail<float>(prefix+"_chi2");
-      float ndof            = cand->getDetail<float>(prefix+"_ndof");
-      float chi2ndof        = ( std::abs(ndof) > 1e-4 ) ? chi2 / ndof : 20;
-      int   n_hits_pix      = cand->getDetail<int>  (prefix+"_n_hits_pix");
-      int   n_hits_sct      = cand->getDetail<int>  (prefix+"_n_hits_sct");
-      int   n_hits_bl       = cand->getDetail<int>  (prefix+"_n_hits_innermost");
-      float iso3_dr01       = cand->getDetail<float>(prefix+"_iso3_dr01");
-      iso3_dr01 /= 1000;
-      float iso3_dr02       = cand->getDetail<float>(prefix+"_iso3_dr02");
-      iso3_dr02 /= 1000;
-      float refit_ptratio   = ( std::abs(pt) > 1e-4 ) ? refit_pt / pt : 0;
-      float refit_d0_wrtVtx = cand->getDetail<float>(prefix+"_refit_d0_wrtVtx");
-      float refit_z0_wrtVtx = cand->getDetail<float>(prefix+"_refit_z0_wrtVtx");
-      float refit_chi2      = cand->getDetail<float>(prefix+"_refit_chi2");
-      float refit_ndof      = cand->getDetail<float>(prefix+"_refit_ndof");
-      float refit_chi2ndof  = ( std::abs(refit_ndof) > 1e-4 ) ? refit_chi2 / refit_ndof : 20;
-      float refit_chi2ndof_ratio = (std::abs(chi2ndof) > 1e-4 ) ? refit_chi2ndof / chi2ndof : 0;
-      float chi2_pix=0; float ndof_pix=0;
-      chi2_pix += cand->getDetail<float>(prefix+"_chi2sum_br_ibl");
-      chi2_pix += cand->getDetail<float>(prefix+"_chi2sum_br_pix1");
-      chi2_pix += cand->getDetail<float>(prefix+"_chi2sum_br_pix2");
-      chi2_pix += cand->getDetail<float>(prefix+"_chi2sum_br_pix3");
-      ndof_pix += cand->getDetail<float>(prefix+"_ndofsum_br_ibl");
-      ndof_pix += cand->getDetail<float>(prefix+"_ndofsum_br_pix1");
-      ndof_pix += cand->getDetail<float>(prefix+"_ndofsum_br_pix2");
-      ndof_pix += cand->getDetail<float>(prefix+"_ndofsum_br_pix3");
-      float chi2ndof_pix = ( std::abs(ndof_pix) > 1e-4 ) ? chi2_pix / ndof_pix : 0;
-      
-      // BDT score
-      float bdt_score = 0.0;
-      if( category==1 ) {
-	 bdt_score = bdt_eval_pix4l_sct0(pt, z0_wrtVtx, d0_wrtVtx, iso3_dr01, iso3_dr02-iso3_dr01, chi2ndof, chi2ndof_pix,
-					 refit_pt, n_hits_pix, refit_ptratio, refit_chi2ndof, n_hits_bl);
-	 mnt_cat1_pt.push_back(pt);
-	 mnt_cat1_z0.push_back(z0_wrtVtx);
-	 mnt_cat1_d0.push_back(d0_wrtVtx);
-	 mnt_cat1_iso01.push_back(iso3_dr01);
-	 mnt_cat1_iso0201.push_back(iso3_dr02-iso3_dr01);
-	 mnt_cat1_chi2ndof.push_back(chi2ndof);
-	 mnt_cat1_chi2ndof_pix.push_back(chi2ndof_pix);
-	 mnt_cat1_refit_pt.push_back(refit_pt);
-	 mnt_cat1_n_pix.push_back(n_hits_pix);
-	 mnt_cat1_refit_ptratio.push_back(refit_ptratio);
-	 mnt_cat1_refit_chi2ndof.push_back(refit_chi2ndof);
-	 mnt_cat1_n_bl.push_back(n_hits_bl);
-	 mnt_cat1_bdtscore.push_back(bdt_score);
-      }
-      else if( category==2 ) {
-	 bdt_score = bdt_eval_pix4l_sct1p(pt, refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_sct, refit_ptratio,
-					  refit_chi2ndof_ratio, iso3_dr01, iso3_dr02-iso3_dr01, is_fail, chi2ndof_pix, n_hits_pix);
-	 mnt_cat2_pt.push_back(pt);
-	 mnt_cat2_refit_pt.push_back(refit_pt);
-	 mnt_cat2_refit_z0.push_back(refit_z0_wrtVtx);
-	 mnt_cat2_refit_d0.push_back(refit_d0_wrtVtx);
-	 mnt_cat2_n_sct.push_back(n_hits_sct);
-	 mnt_cat2_refit_ptratio.push_back(refit_ptratio);
-	 mnt_cat2_refit_chi2ndof_ratio.push_back(refit_chi2ndof_ratio);
-	 mnt_cat2_iso01.push_back(iso3_dr01);
-	 mnt_cat2_iso0201.push_back(iso3_dr02-iso3_dr01);
-	 mnt_cat2_chi2ndof_pix.push_back(chi2ndof_pix);
-	 mnt_cat2_n_pix.push_back(n_hits_pix);
-	 mnt_cat2_bdtscore.push_back(bdt_score);
-      }
-      else if( category==3 ) {
-	 bdt_score = bdt_eval_pix3l_sct0(pt, z0_wrtVtx, d0_wrtVtx, chi2ndof, chi2ndof_pix, iso3_dr01, iso3_dr02-iso3_dr01,
-					 refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_bl);
-	 mnt_cat3_pt.push_back(pt);
-	 mnt_cat3_z0.push_back(z0_wrtVtx);
-	 mnt_cat3_d0.push_back(d0_wrtVtx);
-	 mnt_cat3_chi2ndof.push_back(chi2ndof);
-	 mnt_cat3_chi2ndof_pix.push_back(chi2ndof_pix);
-	 mnt_cat3_iso01.push_back(iso3_dr01);
-	 mnt_cat3_iso0201.push_back(iso3_dr02-iso3_dr01);
-	 mnt_cat3_refit_pt.push_back(refit_pt);
-	 mnt_cat3_refit_z0.push_back(refit_z0_wrtVtx);
-	 mnt_cat3_refit_d0.push_back(refit_d0_wrtVtx);
-	 mnt_cat3_n_pix.push_back(n_hits_pix);
-	 mnt_cat3_n_bl.push_back(n_hits_bl);
-	 mnt_cat3_bdtscore.push_back(bdt_score);
-      }
-      else if( category==4 ) {
-	 bdt_score = bdt_eval_pix3l_sct1p(pt, z0_wrtVtx, d0_wrtVtx, refit_pt, refit_z0_wrtVtx, refit_d0_wrtVtx, n_hits_pix, n_hits_sct,
-					  refit_ptratio, is_fail, n_hits_bl, chi2ndof, iso3_dr01, iso3_dr02-iso3_dr01, refit_chi2ndof);
-	 mnt_cat4_pt.push_back(pt);
-	 mnt_cat4_z0.push_back(z0_wrtVtx);
-	 mnt_cat4_d0.push_back(d0_wrtVtx);
-	 mnt_cat4_refit_pt.push_back(refit_pt);
-	 mnt_cat4_refit_z0.push_back(refit_z0_wrtVtx);
-	 mnt_cat4_refit_d0.push_back(refit_d0_wrtVtx);
-	 mnt_cat4_n_pix.push_back(n_hits_pix);
-	 mnt_cat4_n_sct.push_back(n_hits_sct);
-	 mnt_cat4_refit_ptratio.push_back(refit_ptratio);
-	 mnt_cat4_n_bl.push_back(n_hits_bl);
-	 mnt_cat4_chi2ndof.push_back(chi2ndof);
-	 mnt_cat4_iso01.push_back(iso3_dr01);
-	 mnt_cat4_iso0201.push_back(iso3_dr02-iso3_dr01);
-	 mnt_cat4_refit_chi2ndof.push_back(refit_chi2ndof);
-	 mnt_cat4_bdtscore.push_back(bdt_score);
-      } 
-      ATH_MSG_DEBUG("UTT: BDT score = " << bdt_score);
-
-      // selection
-      
-      bool is_passed = false;
-      if( category==1 ) {
-	 if( pt >= pt_threshold_pix4l_sct0 && bdt_score >= bdt_threshold_pix4l_sct0 ) is_passed = true;
-      }
-      else if( category==2 ) {
-	 if( refit_pt >= refit_pt_threshold_pix4l_sct1p && bdt_score >= bdt_threshold_pix4l_sct1p ) is_passed = true;
-      }
-      else if( category==3 ) {
-	 if( pt >= pt_threshold_pix3l_sct0 && bdt_score >= bdt_threshold_pix3l_sct0 ) is_passed = true;
-      }
-      else if( category==4 ) {
-	 if( refit_pt >= refit_pt_threshold_pix3l_sct1p && bdt_score >= bdt_threshold_pix3l_sct1p ) is_passed = true;
-      }
-      ATH_MSG_DEBUG("UTT: BDT selection isPassed = " << is_passed);
-      if( ! is_passed ) continue;
-
-      // passed selection
-      ATH_MSG_DEBUG("UTT: Passed selection" );
-      n_passed_cand++;
-
-      // create EDM object
-       xAOD::TrigComposite *distrk = new xAOD::TrigComposite();
-      distrk->makePrivateStore();
-      disTrkBDTSelContainer.push_back(distrk);
-      //
-      const std::string prefixOut = "disTrk";
-      //
-      distrk->setDetail<int>  (prefixOut+"_category",         category);
-      distrk->setDetail<float>(prefixOut+"_pt",               pt*1000.0);
-      float eta = cand->getDetail<float>(prefix+"_eta");
-      float phi = cand->getDetail<float>(prefix+"_phi");
-      distrk->setDetail<float>(prefixOut+"_eta",              eta);
-      distrk->setDetail<float>(prefixOut+"_phi",              phi);
-      distrk->setDetail<float>(prefixOut+"_refit_pt",         refit_pt*1000.0);
-      distrk->setDetail<int>  (prefixOut+"_is_fail",          is_fail);
-      distrk->setDetail<float>(prefixOut+"_d0_wrtVtx",        d0_wrtVtx);
-      distrk->setDetail<float>(prefixOut+"_z0_wrtVtx",        z0_wrtVtx);
-      distrk->setDetail<float>(prefixOut+"_chi2",             chi2);
-      distrk->setDetail<float>(prefixOut+"_ndof",             ndof);
-      distrk->setDetail<int>  (prefixOut+"_n_hits_pix",       n_hits_pix);
-      distrk->setDetail<int>  (prefixOut+"_n_hits_sct",       n_hits_sct);
-      distrk->setDetail<int>  (prefixOut+"_n_hits_innermost", n_hits_bl);
-      distrk->setDetail<float>(prefixOut+"_iso3_dr01",        iso3_dr01*1000.0);
-      distrk->setDetail<float>(prefixOut+"_iso3_dr02",        iso3_dr02*1000.0);
-      distrk->setDetail<float>(prefixOut+"_refit_d0_wrtVtx",  refit_d0_wrtVtx);
-      distrk->setDetail<float>(prefixOut+"_refit_z0_wrtVtx",  refit_z0_wrtVtx);
-      distrk->setDetail<float>(prefixOut+"_refit_chi2",       refit_chi2);
-      distrk->setDetail<float>(prefixOut+"_refit_ndof",       refit_ndof);
-      distrk->setDetail<float>(prefixOut+"_chi2ndof_pix",     chi2ndof_pix);
-      distrk->setDetail<float>(prefixOut+"_bdtscore",         bdt_score);
-      //
-      ATH_MSG_DEBUG("UTT: Created a new entry EDM" );
-   }
-
-   // 
-   if( n_passed_cand > 0 ) {
-      addDecisionID( m_decisionId.numeric(), input.decision );
-      ATH_MSG_DEBUG("UTT: REGTEST event accepted" );
-      return StatusCode::SUCCESS;
-   }
-   else {
-      return StatusCode::SUCCESS;
-   }
-}
-
-// ------------------------------------------------------------------------------------------------
-// ------------------------------------------------------------------------------------------------
-
-inline float TrigDisappearingTrackTriggerHypoTool::BDTinput(float var) const { return ( std::abs(var) < 1e-5 ) ? 1e-5 : var; }
-
-float TrigDisappearingTrackTriggerHypoTool::bdt_eval_pix4l_sct0
-(float pt, float z0, float d0, float trkiso3_dr01, float trkiso3_dr0201, float chi2ndof, float chi2ndof_pix,
- float refit_pt, int n_pix, float refit_ptratio, float refit_chi2ndof, int n_bl) const
-{
-   m_tmva_pix4l_sct0_pt             = BDTinput(pt);
-   m_tmva_pix4l_sct0_z0             = BDTinput(z0);
-   m_tmva_pix4l_sct0_d0             = BDTinput(d0);
-   m_tmva_pix4l_sct0_trkiso3_dr01   = BDTinput(trkiso3_dr01);
-   m_tmva_pix4l_sct0_trkiso3_dr0201 = BDTinput(trkiso3_dr0201);
-   m_tmva_pix4l_sct0_chi2ndof       = BDTinput(chi2ndof);
-   m_tmva_pix4l_sct0_chi2ndof_pix   = BDTinput(chi2ndof_pix);
-   m_tmva_pix4l_sct0_refit_pt       = BDTinput(refit_pt);
-   m_tmva_pix4l_sct0_n_pix          = BDTinput((float)n_pix);
-   m_tmva_pix4l_sct0_refit_ptratio  = BDTinput(refit_ptratio);
-   m_tmva_pix4l_sct0_refit_chi2ndof = BDTinput(refit_chi2ndof);
-   m_tmva_pix4l_sct0_n_bl           = BDTinput((float)n_bl);
-   //
-   return m_tmva_pix4l_sct0_reader->EvaluateMVA("BDT method");
-}
-
-float TrigDisappearingTrackTriggerHypoTool::bdt_eval_pix4l_sct1p
-(float pt, float refit_pt, float refit_z0, float refit_d0, int n_sct, float refit_ptratio,
- float refit_chi2ndof_ratio, float trkiso3_dr01, float trkiso3_dr0201, int is_fail, float chi2ndof_pix, int n_pix) const
-{
-   m_tmva_pix4l_sct1p_pt                   = BDTinput(pt);
-   m_tmva_pix4l_sct1p_refit_pt             = BDTinput(refit_pt);
-   m_tmva_pix4l_sct1p_refit_z0             = BDTinput(refit_z0);
-   m_tmva_pix4l_sct1p_refit_d0             = BDTinput(refit_d0);
-   m_tmva_pix4l_sct1p_n_sct                = BDTinput((float)n_sct);
-   m_tmva_pix4l_sct1p_refit_ptratio        = BDTinput(refit_ptratio);
-   m_tmva_pix4l_sct1p_refit_chi2ndof_ratio = BDTinput(refit_chi2ndof_ratio);
-   m_tmva_pix4l_sct1p_trkiso3_dr01         = BDTinput(trkiso3_dr01);
-   m_tmva_pix4l_sct1p_trkiso3_dr0201       = BDTinput(trkiso3_dr0201);
-   m_tmva_pix4l_sct1p_is_fail              = BDTinput((float)is_fail);
-   m_tmva_pix4l_sct1p_chi2ndof_pix         = BDTinput(chi2ndof_pix);
-   m_tmva_pix4l_sct1p_n_pix                = BDTinput((float)n_pix);
-   //
-   /*
-   ATH_MSG_INFO("UTT: pt=" << pt);
-   ATH_MSG_INFO("UTT: refit_pt=" << refit_pt);
-   ATH_MSG_INFO("UTT: refit_z0=" << refit_z0);
-   ATH_MSG_INFO("UTT: refit_d0=" << refit_d0);
-   ATH_MSG_INFO("UTT: n_sct=" << n_sct);
-   ATH_MSG_INFO("UTT: refit_ptratio=" << refit_ptratio);
-   ATH_MSG_INFO("UTT: refit_chi2ndof_ratio=" << refit_chi2ndof_ratio);
-   ATH_MSG_INFO("UTT: trkiso3_dr01=" << trkiso3_dr01);
-   ATH_MSG_INFO("UTT: trkiso3_dr02dr01=" << trkiso3_dr0201);
-   ATH_MSG_INFO("UTT: is_fail=" << is_fail);
-   ATH_MSG_INFO("UTT: chi2ndof_pix=" << chi2ndof_pix);
-   ATH_MSG_INFO("UTT: n_pix=" << n_pix);
-   */
-   //
-   return m_tmva_pix4l_sct1p_reader->EvaluateMVA("BDT method");
-}
-
-float TrigDisappearingTrackTriggerHypoTool::bdt_eval_pix3l_sct0
-(float pt, float z0, float d0, float chi2ndof, float chi2ndof_pix, float trkiso3_dr01, float trkiso3_dr0201,
- float refit_pt, float refit_z0, float refit_d0, int n_pix, int n_bl) const
-{
-   m_tmva_pix3l_sct0_pt             = BDTinput(pt);
-   m_tmva_pix3l_sct0_z0             = BDTinput(z0);
-   m_tmva_pix3l_sct0_d0             = BDTinput(d0);
-   m_tmva_pix3l_sct0_chi2ndof       = BDTinput(chi2ndof);
-   m_tmva_pix3l_sct0_chi2ndof_pix   = BDTinput(chi2ndof_pix);
-   m_tmva_pix3l_sct0_trkiso3_dr01   = BDTinput(trkiso3_dr01);
-   m_tmva_pix3l_sct0_trkiso3_dr0201 = BDTinput(trkiso3_dr0201);
-   m_tmva_pix3l_sct0_refit_pt       = BDTinput(refit_pt);
-   m_tmva_pix3l_sct0_refit_z0       = BDTinput(refit_z0);
-   m_tmva_pix3l_sct0_refit_d0       = BDTinput(refit_d0);
-   m_tmva_pix3l_sct0_n_pix          = BDTinput((float)n_pix);
-   m_tmva_pix3l_sct0_n_bl           = BDTinput((float)n_bl);
-   //
-   return m_tmva_pix3l_sct0_reader->EvaluateMVA("BDT method");
-}
-
-float TrigDisappearingTrackTriggerHypoTool::bdt_eval_pix3l_sct1p
-(float pt, float z0, float d0, float refit_pt, float refit_z0, float refit_d0,
- int n_pix, int n_sct, float refit_ptratio, int is_fail, int n_bl,
- float chi2ndof, float trkiso3_dr01, float trkiso3_dr0201, float refit_chi2ndof) const
-{
-   m_tmva_pix3l_sct1p_pt             = BDTinput(pt);
-   m_tmva_pix3l_sct1p_z0             = BDTinput(z0);
-   m_tmva_pix3l_sct1p_d0             = BDTinput(d0);
-   m_tmva_pix3l_sct1p_refit_pt       = BDTinput(refit_pt);
-   m_tmva_pix3l_sct1p_refit_z0       = BDTinput(refit_z0);
-   m_tmva_pix3l_sct1p_refit_d0       = BDTinput(refit_d0);
-   m_tmva_pix3l_sct1p_n_pix          = BDTinput((float)n_pix);
-   m_tmva_pix3l_sct1p_n_sct          = BDTinput((float)n_sct);
-   m_tmva_pix3l_sct1p_refit_ptratio  = BDTinput(refit_ptratio);
-   m_tmva_pix3l_sct1p_is_fail        = BDTinput((float)is_fail);
-   m_tmva_pix3l_sct1p_n_bl           = BDTinput((float)n_bl);
-   m_tmva_pix3l_sct1p_chi2ndof       = BDTinput(chi2ndof);
-   m_tmva_pix3l_sct1p_trkiso3_dr01   = BDTinput(trkiso3_dr01);
-   m_tmva_pix3l_sct1p_trkiso3_dr0201 = BDTinput(trkiso3_dr0201);
-   m_tmva_pix3l_sct1p_refit_chi2ndof = BDTinput(refit_chi2ndof);
-   //
-   return m_tmva_pix3l_sct1p_reader->EvaluateMVA("BDT method");
-}
-
-// ------------------------------------------------------------------------------------------------
-// ------------------------------------------------------------------------------------------------
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.h
deleted file mode 100644
index 640532de87ec0165bc6706bd7f6fcb0f126ee9ab..0000000000000000000000000000000000000000
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigDisappearingTrackTriggerHypoTool.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-*/
-#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOTOOL_H
-#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOTOOL_H
-
-#include "Gaudi/Property.h"
-#include "AthenaBaseComps/AthAlgTool.h"
-#include "AthenaMonitoringKernel/GenericMonitoringTool.h"
-#include "TrigCompositeUtils/TrigCompositeUtils.h"
-#include "xAODTracking/TrackParticlexAODHelpers.h"
-#include "xAODTracking/TrackParticleContainer.h"
-#include <string>
-
-#include "TMVA/Reader.h"
-
-/**
- * @class TrigDisappearingTrackTriggerHypoTool
- * @brief Generated the decision for hypo thats triggers disappearing track
- * @author Kunihiro Nagano <kunihiro.nagano@cern.ch>
- **/
-
-class TrigDisappearingTrackTriggerHypoTool : virtual public ::AthAlgTool
-{ 
-public: 
-   TrigDisappearingTrackTriggerHypoTool( const std::string& type, 
-					 const std::string& name, 
-					 const IInterface* parent );
-   
-   virtual ~TrigDisappearingTrackTriggerHypoTool();
-   virtual StatusCode initialize() override;
-   
-   struct TrackInfo {
-      TrigCompositeUtils::Decision*       decision;
-      const xAOD::TrigCompositeContainer* disTrkCandContainer;
-      xAOD::TrigCompositeContainer&       disTrkBDTSelContainer;
-      const TrigCompositeUtils::DecisionIDContainer previousDecisionsIDs;
-   };
-   
-   /**
-    * @brief decides upon a collection of tracks
-    **/
-   StatusCode decide( TrackInfo& input ) const;
-
-private:
-
-   HLT::Identifier m_decisionId;
-   Gaudi::Property< std::vector<float> >  m_cutTrackPtGeV   { this, "cutTrackPtGeV",  { float(10.0) }, "Track pT requirement in GeV" };
-   Gaudi::Property< std::vector<float> >  m_cutBDTPix4Sct0  { this, "cutBDTPix4Sct0", { float(0.05) }, "BDT score thershold for Pix4l_Sct0 category" };
-   Gaudi::Property< std::vector<float> >  m_cutBDTPix4Sct1p { this, "cutBDTPix4Sct1p",{ float(0.04) }, "BDT score thershold for Pix4l_Sct1p category" };
-   Gaudi::Property< std::vector<float> >  m_cutBDTPix3Sct0  { this, "cutBDTPix3Sct0", { float(0.05) }, "BDT score thershold for Pix3l_Sct0 category" };
-   Gaudi::Property< std::vector<float> >  m_cutBDTPix3Sct1p { this, "cutBDTPix3Sct1p",{ float(0.04) }, "BDT score thershold for Pix3l_Sct1p category" };
-   //
-   ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" };
-
-   // BDT selection methods
-   float bdt_eval_pix4l_sct0 (float, float, float, float, float, float, float, float, int,   float, float, int) const;
-   float bdt_eval_pix4l_sct1p(float, float, float, float, int,   float, float, float, float, int,   float, int) const;
-   float bdt_eval_pix3l_sct0 (float, float, float, float, float, float, float, float, float, float, int,   int) const;
-   float bdt_eval_pix3l_sct1p(float, float, float, float, float, float, int,   int,   float, int,   int,   float, float, float, float) const;
-   inline float BDTinput(float) const;
-
-   // TMVA reader
-   TMVA::Reader* m_tmva_pix4l_sct0_reader;
-   TMVA::Reader* m_tmva_pix4l_sct1p_reader;
-   TMVA::Reader* m_tmva_pix3l_sct0_reader;
-   TMVA::Reader* m_tmva_pix3l_sct1p_reader;
-
-   // TMVA variables
-   // pix4l_sct0
-   mutable float m_tmva_pix4l_sct0_pt ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_z0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_d0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_trkiso3_dr01 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_trkiso3_dr0201 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_chi2ndof ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_chi2ndof_pix ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_refit_pt ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_n_pix ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_refit_ptratio ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_refit_chi2ndof ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct0_n_bl ATLAS_THREAD_SAFE;
-
-   // pix4l_sct1p
-   mutable float m_tmva_pix4l_sct1p_pt ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_refit_pt ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_refit_z0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_refit_d0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_n_sct ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_refit_ptratio ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_refit_chi2ndof_ratio ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_trkiso3_dr01 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_trkiso3_dr0201 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_is_fail ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_chi2ndof_pix ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix4l_sct1p_n_pix ATLAS_THREAD_SAFE;
-
-   // pix3l_sct0
-   mutable float m_tmva_pix3l_sct0_pt ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_z0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_d0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_chi2ndof ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_chi2ndof_pix ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_trkiso3_dr01 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_trkiso3_dr0201 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_refit_pt ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_refit_z0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_refit_d0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_n_pix ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct0_n_bl ATLAS_THREAD_SAFE;
-
-   // pix3l_sct1p
-   mutable float m_tmva_pix3l_sct1p_pt ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_z0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_d0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_refit_pt ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_refit_z0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_refit_d0 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_n_pix ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_n_sct ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_refit_ptratio ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_is_fail ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_n_bl ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_chi2ndof ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_trkiso3_dr01 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_trkiso3_dr0201 ATLAS_THREAD_SAFE;
-   mutable float m_tmva_pix3l_sct1p_refit_chi2ndof ATLAS_THREAD_SAFE;
-}; 
-
-#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDISTRACKTRIGGERHYPOTOOL_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.cxx
index dd9f7b15313e3255de4611aeba3986dbcda7f7f1..e7da4addd10f2fa46d808886e4c9cffd97990291 100644
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.cxx
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.cxx
@@ -570,15 +570,15 @@ StatusCode TrigHitDVHypoAlg::calculateBDT(const EventContext& context,
       ATH_MSG_VERBOSE("nr of quality tracks in jet = " << n_qtrk_injet);
 
       // evaluate BDT
-      (*(const_cast<float*>(m_tmva_n_track_qual.get(context)))) = static_cast<float>(n_qtrk_injet);
-      (*(const_cast<float*>(m_tmva_ly0_sp_frac.get(context))))  = v_ly_sp_frac[0];
-      (*(const_cast<float*>(m_tmva_ly1_sp_frac.get(context))))  = v_ly_sp_frac[1];
-      (*(const_cast<float*>(m_tmva_ly2_sp_frac.get(context))))  = v_ly_sp_frac[2];
-      (*(const_cast<float*>(m_tmva_ly3_sp_frac.get(context))))  = v_ly_sp_frac[3];
-      (*(const_cast<float*>(m_tmva_ly4_sp_frac.get(context))))  = v_ly_sp_frac[4];
-      (*(const_cast<float*>(m_tmva_ly5_sp_frac.get(context))))  = v_ly_sp_frac[5];
-      (*(const_cast<float*>(m_tmva_ly6_sp_frac.get(context))))  = v_ly_sp_frac[6];
-      (*(const_cast<float*>(m_tmva_ly7_sp_frac.get(context))))  = v_ly_sp_frac[7];
+      *m_tmva_n_track_qual.get(context) = static_cast<float>(n_qtrk_injet);
+      *m_tmva_ly0_sp_frac.get(context)  = v_ly_sp_frac[0];
+      *m_tmva_ly1_sp_frac.get(context)  = v_ly_sp_frac[1];
+      *m_tmva_ly2_sp_frac.get(context)  = v_ly_sp_frac[2];
+      *m_tmva_ly3_sp_frac.get(context)  = v_ly_sp_frac[3];
+      *m_tmva_ly4_sp_frac.get(context)  = v_ly_sp_frac[4];
+      *m_tmva_ly5_sp_frac.get(context)  = v_ly_sp_frac[5];
+      *m_tmva_ly6_sp_frac.get(context)  = v_ly_sp_frac[6];
+      *m_tmva_ly7_sp_frac.get(context)  = v_ly_sp_frac[7];
       float bdt_score = (**m_tmva_reader.get(context)).EvaluateMVA("BDT method");
 
       // BDT threshold
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.h
index 0babfcf61a314b074d8f9116a561f609c228e7f6..a20da90b3612d521ee894bc35e81f67e00b194f5 100644
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.h
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigHitDVHypoAlg.h
@@ -61,16 +61,16 @@ private:
 			   const float&, const int, xAOD::TrigCompositeContainer*, int&) const;
 
    // BDT
-   SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_reader ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_n_track_qual ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_ly0_sp_frac  ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_ly1_sp_frac  ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_ly2_sp_frac  ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_ly3_sp_frac  ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_ly4_sp_frac  ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_ly5_sp_frac  ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_ly6_sp_frac  ATLAS_THREAD_SAFE;
-   SG::SlotSpecificObj<float> m_tmva_ly7_sp_frac  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<std::unique_ptr<TMVA::Reader> > m_tmva_reader ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_n_track_qual ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_ly0_sp_frac  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_ly1_sp_frac  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_ly2_sp_frac  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_ly3_sp_frac  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_ly4_sp_frac  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_ly5_sp_frac  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_ly6_sp_frac  ATLAS_THREAD_SAFE;
+   mutable SG::SlotSpecificObj<float> m_tmva_ly7_sp_frac  ATLAS_THREAD_SAFE;
 }; 
 
 #endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGHITDVHYPOALG_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..941b324a18d01fee431bb00d6dec2bc7a4c08646
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.cxx
@@ -0,0 +1,264 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+  * Trigger Hypo Tool, that is aimed at triggering large dEdx tracks
+  * author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
+*/
+#include "TrigdEdxTrackHypoAlg.h"
+#include "AthViews/ViewHelper.h"
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "GaudiKernel/SystemOfUnits.h"
+#include "AthenaMonitoringKernel/Monitored.h"
+
+using TrigCompositeUtils::createAndStore; 
+using TrigCompositeUtils::DecisionContainer;
+using TrigCompositeUtils::DecisionAuxContainer;
+using TrigCompositeUtils::DecisionIDContainer;
+using TrigCompositeUtils::decisionIDs;
+using TrigCompositeUtils::newDecisionIn;
+using TrigCompositeUtils::linkToPrevious;
+using TrigCompositeUtils::viewString;
+using TrigCompositeUtils::featureString;
+using TrigCompositeUtils::hypoAlgNodeName;
+using TrigCompositeUtils::findLink;
+using TrigCompositeUtils::LinkInfo;
+using TrigCompositeUtils::Decision;
+using TrigCompositeUtils::allFailed;
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+TrigdEdxTrackHypoAlg::TrigdEdxTrackHypoAlg( const std::string& name, 
+					    ISvcLocator* pSvcLocator ) : 
+   ::HypoBase( name, pSvcLocator ) {}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigdEdxTrackHypoAlg::initialize()
+{
+   CHECK( m_hypoTools.retrieve() );
+   CHECK( m_dEdxTrkKey.initialize() );
+   CHECK( m_dEdxHitKey.initialize() );
+   CHECK( m_HPtdEdxTrkKey.initialize());
+
+   if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() );
+
+   m_highdEdxHitDefThres.clear();         m_highdEdxHitDefNames.clear();
+   m_highdEdxHitDefThres.push_back(1.45); m_highdEdxHitDefNames.push_back("1p45");
+   m_highdEdxHitDefThres.push_back(1.50); m_highdEdxHitDefNames.push_back("1p50");
+   m_highdEdxHitDefThres.push_back(1.55); m_highdEdxHitDefNames.push_back("1p55");
+   m_highdEdxHitDefThres.push_back(1.60); m_highdEdxHitDefNames.push_back("1p60");
+   m_highdEdxHitDefThres.push_back(1.65); m_highdEdxHitDefNames.push_back("1p65");
+   m_highdEdxHitDefThres.push_back(1.70); m_highdEdxHitDefNames.push_back("1p70");
+   m_highdEdxHitDefThres.push_back(1.75); m_highdEdxHitDefNames.push_back("1p75");
+   m_highdEdxHitDefThres.push_back(1.80); m_highdEdxHitDefNames.push_back("1p80");
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigdEdxTrackHypoAlg::execute( const EventContext& context ) const
+{
+   // previous decisions
+   ATH_MSG_DEBUG( "Retrieving pervious decision: \"" << decisionInput().key() << "\"" );
+   auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context );
+   ATH_CHECK( previousDecisionsHandle.isValid() );
+   
+   ATH_MSG_DEBUG( "Running with " << previousDecisionsHandle->size() << " previous decisions" ); 
+   if( previousDecisionsHandle->size()!=1 ) {
+      ATH_MSG_ERROR( "Previous decision handle size is not 1. It is" << previousDecisionsHandle->size() );
+      return StatusCode::FAILURE;
+   }
+   const Decision * previousDecision = previousDecisionsHandle->at(0);
+
+   TrigCompositeUtils::DecisionIDContainer previousDecisionIDs;
+   TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs);
+   ATH_MSG_VERBOSE( "IDs of active legs:" );
+   for(auto decisionID: previousDecisionIDs) { ATH_MSG_VERBOSE( "    " << decisionID ); }
+
+   // new output decisions
+   ATH_MSG_DEBUG( "Creating new output decision handle" ); 
+   SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); 
+   auto outputDecisions = outputHandle.ptr();
+
+   // input objects
+   
+   // tracks
+   auto dEdxTrkHandle = SG::makeHandle(m_dEdxTrkKey, context );
+   ATH_CHECK( dEdxTrkHandle.isValid() );
+   ATH_MSG_DEBUG( "dEdxTrk handle size: " << dEdxTrkHandle->size() );
+
+   // hits
+   auto dEdxHitHandle = SG::makeHandle(m_dEdxHitKey, context );
+   ATH_CHECK( dEdxHitHandle.isValid() );
+   ATH_MSG_DEBUG( "dEdxHit handle size: " << dEdxHitHandle->size() );
+
+   const xAOD::TrigCompositeContainer * dEdxTrksContainer = dEdxTrkHandle.get();
+   const xAOD::TrigCompositeContainer * dEdxHitsContainer = dEdxHitHandle.get();
+
+   if( dEdxTrksContainer == nullptr ) {
+      ATH_MSG_ERROR( "ERROR Cannot get dEdxTrks container");
+      return StatusCode::FAILURE;
+   }
+   if( dEdxHitsContainer == nullptr ) {
+      ATH_MSG_ERROR( "ERROR Cannot get dEdxHits container");
+      return StatusCode::FAILURE;
+   }
+
+   // output EDM object
+   auto HPtdEdxTrkContainer    = std::make_unique<xAOD::TrigCompositeContainer>();
+   auto HPtdEdxTrkContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
+   HPtdEdxTrkContainer->setStore(HPtdEdxTrkContainerAux.get());
+
+   xAOD::TrigCompositeContainer* dedxContainer = HPtdEdxTrkContainer.get();
+
+   // Prepare inputs to HypoTool
+   int n_cands = 0;
+   ATH_CHECK( createCandidates(dEdxTrksContainer, dEdxHitsContainer, dedxContainer, n_cands) );
+   ATH_MSG_DEBUG( "nr of cands by createCandidates = " << n_cands );
+
+   std::vector<TrigdEdxTrackHypoTool::dEdxTrkHypoInfo> dEdxTrkHypoInputs;
+
+   for ( auto dedx : *dedxContainer ) {
+      Decision* newDecision = TrigCompositeUtils::newDecisionIn( outputDecisions, previousDecision, TrigCompositeUtils::hypoAlgNodeName(), context);
+
+      ElementLink<xAOD::TrigCompositeContainer> dedxEL = ElementLink<xAOD::TrigCompositeContainer>(*outputHandle, dedx->index());
+      ATH_CHECK( dedxEL.isValid() );
+
+      ATH_CHECK( newDecision->setObjectLink<xAOD::TrigCompositeContainer>(TrigCompositeUtils::featureString(), dedxEL) );
+
+      TrigdEdxTrackHypoTool::dEdxTrkHypoInfo hypoInfo{ newDecision, dedx, previousDecisionIDs };
+      dEdxTrkHypoInputs.push_back( hypoInfo );
+   }
+
+   // monitor
+   ATH_CHECK( doMonitor(dedxContainer) );
+
+   // Loop over all hypoToolinputs and get their decisions
+   for ( auto & tool: m_hypoTools ) {
+      ATH_MSG_VERBOSE( "+++++ Now computing decision for " << tool->name() );
+      ATH_CHECK( tool->decide( dEdxTrkHypoInputs ) );    
+   } 
+   
+   DecisionContainer::iterator it = outputDecisions->begin();
+   while(it != outputDecisions->end()) {
+      ATH_MSG_VERBOSE( "+++++ outputDecision: " << *it << " +++++" );
+      if ( allFailed( *it ) ) {
+	 ATH_MSG_VERBOSE( "---> all failed, erasing" );
+	 it = outputDecisions->erase(it);
+      } else {
+	 ATH_MSG_VERBOSE( "---> not all failed" );
+	 ++it;
+      }
+   }
+
+   // record 
+   SG::WriteHandle<xAOD::TrigCompositeContainer> HPtdEdxTrkHandle(m_HPtdEdxTrkKey, context);
+   ATH_CHECK( HPtdEdxTrkHandle.record( std::move( HPtdEdxTrkContainer ), std::move( HPtdEdxTrkContainerAux ) ) );
+   ATH_MSG_VERBOSE( "recorded HPtdEdxTrk object to SG" );
+
+   //
+   ATH_CHECK( hypoBaseOutputProcessing(outputHandle) );
+
+   //
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigdEdxTrackHypoAlg::doMonitor(const xAOD::TrigCompositeContainer* dedxContainer ) const
+{
+   auto monTrackPtGeV  = Monitored::Scalar( "trackPtGeV",  -999. );
+   auto monTrackEta    = Monitored::Scalar( "trackEta",    -999. );
+   auto monTracka0beam = Monitored::Scalar( "tracka0beam", -999. );
+   auto monTrackdEdx   = Monitored::Scalar( "trackdEdx",   -999. );
+   auto monTrackNhighdEdxHits = Monitored::Scalar( "trackNhighdEdxHits",  -999. );
+   auto monitorIt = Monitored::Group( m_monTool, monTrackdEdx, monTrackPtGeV, monTrackEta, monTracka0beam, monTrackNhighdEdxHits );
+
+   for ( const xAOD::TrigComposite* trk : *dedxContainer ) {
+      float trackPt     = trk->getDetail<float>("HPtdEdxTrk_pt");
+      float trackEta    = trk->getDetail<float>("HPtdEdxTrk_eta");
+      float tracka0beam = trk->getDetail<float>("HPtdEdxTrk_a0beam");
+      float trackdEdx   = trk->getDetail<float>("HPtdEdxTrk_dedx");
+      int trackNhighdEdxHits = (int)trk->getDetail<int16_t>("HPtdEdxTrk_n_hdedx_hits_1p70");
+      monTrackPtGeV  = trackPt / 1000.0;
+      monTrackEta    = trackEta;
+      monTracka0beam = tracka0beam;
+      monTrackdEdx   = trackdEdx;
+      monTrackNhighdEdxHits = trackNhighdEdxHits;
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigdEdxTrackHypoAlg::createCandidates( const xAOD::TrigCompositeContainer* trksContainer, const xAOD::TrigCompositeContainer* hitsContainer,
+						   xAOD::TrigCompositeContainer* dedxContainer, int& n_trks) const
+{
+   n_trks = 0;
+
+   for ( const xAOD::TrigComposite* trk : *trksContainer ) {
+      
+      ATH_MSG_VERBOSE("+++++ i_trk: " << n_trks << " +++++");
+
+      float trackPt     = trk->getDetail<float>("dEdxTrk_pt");
+      float trackEta    = trk->getDetail<float>("dEdxTrk_eta");
+      float trackPhi    = trk->getDetail<float>("dEdxTrk_phi");
+      float tracka0beam = trk->getDetail<float>("dEdxTrk_a0beam");
+      float trackdEdx   = trk->getDetail<float>("dEdxTrk_dedx");
+      int   trackId     = trk->getDetail<int>  ("dEdxTrk_id");
+      ATH_MSG_VERBOSE( "track pt / eta / a0beam / dEdx / Id = " << trackPt << " / " << trackEta << " / " << tracka0beam << " / " << trackdEdx << " / " << trackId );
+
+      std::vector<int16_t> n_hdedx_hits;
+      for(unsigned int idef=0; idef<m_highdEdxHitDefThres.size(); ++idef) {  n_hdedx_hits.push_back(0); }
+
+      for ( const xAOD::TrigComposite* hit : *hitsContainer ) {
+	 int id = hit->getDetail<int>("dEdxHit_trkid");
+	 if( id != trackId ) continue;
+	 float dedx  = hit->getDetail<float>("dEdxHit_dedx");
+	 for(unsigned int idef=0; idef<m_highdEdxHitDefThres.size(); ++idef) {
+	    if( dedx >= m_highdEdxHitDefThres[idef] ) n_hdedx_hits[idef]++;
+	 }
+      }
+      for(unsigned int idef=0; idef<m_highdEdxHitDefThres.size(); ++idef) {
+	 ATH_MSG_VERBOSE( m_highdEdxHitDefNames[idef] << ", thres=" << m_highdEdxHitDefThres[idef] << ": nr of high dEdx hits=" << n_hdedx_hits[idef] );
+      }
+
+      int16_t n_hits_innermost = (int16_t)trk->getDetail<int>("dEdxTrk_n_hits_innermost");
+      int16_t n_hits_inner     = (int16_t)trk->getDetail<int>("dEdxTrk_n_hits_inner");
+      int16_t n_hits_pix       = (int16_t)trk->getDetail<int>("dEdxTrk_n_hits_pix");
+      int16_t n_hits_sct       = (int16_t)trk->getDetail<int>("dEdxTrk_n_hits_sct");
+
+      // create EDM object
+      ++n_trks;
+      xAOD::TrigComposite *dedx = new xAOD::TrigComposite();
+      dedx->makePrivateStore();
+      dedxContainer->push_back(dedx);
+
+      dedx->setDetail<float>("HPtdEdxTrk_pt",    trackPt);
+      dedx->setDetail<float>("HPtdEdxTrk_eta",   trackEta);
+      dedx->setDetail<float>("HPtdEdxTrk_phi",   trackPhi);
+      dedx->setDetail<float>("HPtdEdxTrk_a0beam",tracka0beam);
+      dedx->setDetail<float>("HPtdEdxTrk_dedx", trackdEdx);
+      for(unsigned int idef=0; idef<m_highdEdxHitDefThres.size(); ++idef) {
+	 std::string name = "HPtdEdxTrk_n_hdedx_hits_" + m_highdEdxHitDefNames[idef];
+	 dedx->setDetail<int16_t>(name, n_hdedx_hits[idef]);
+      }
+      dedx->setDetail<int16_t>("HPtdEdxTrk_n_hits_innermost", n_hits_innermost);
+      dedx->setDetail<int16_t>("HPtdEdxTrk_n_hits_inner",     n_hits_inner);
+      dedx->setDetail<int16_t>("HPtdEdxTrk_n_hits_pix",       n_hits_pix);
+      dedx->setDetail<int16_t>("HPtdEdxTrk_n_hits_sct",       n_hits_sct);
+   }
+
+   //
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.h
new file mode 100644
index 0000000000000000000000000000000000000000..485bacdf141dc51e502f0858e79db3bacd0be5fb
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoAlg.h
@@ -0,0 +1,46 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOALG_H
+#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOALG_H
+
+#include <string>
+
+#include "Gaudi/Property.h"
+#include "DecisionHandling/HypoBase.h"
+#include "TrigdEdxTrackHypoTool.h"
+#include "AthenaMonitoringKernel/GenericMonitoringTool.h"
+
+/**
+ * @class TrigdEdxTrackHypoAlg
+ * @brief Implements Hypo selection on triggering large dEdx tracks
+ * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
+ **/
+
+class TrigdEdxTrackHypoAlg : public ::HypoBase 
+{ 
+public: 
+
+   TrigdEdxTrackHypoAlg( const std::string& name, ISvcLocator* pSvcLocator );
+   
+   virtual StatusCode  initialize() override;
+   virtual StatusCode  execute(const EventContext& context) const override;
+   
+private: 
+
+   ToolHandleArray< TrigdEdxTrackHypoTool >  m_hypoTools {this, "HypoTools", {}, "Tools to perfrom selection"};
+
+   SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_dEdxTrkKey    {this, "dEdxTrk",    "HLT_dEdxTrk", ""};
+   SG::ReadHandleKey< xAOD::TrigCompositeContainer>  m_dEdxHitKey    {this, "dEdxHit",    "HLT_dEdxHit", ""};
+   SG::WriteHandleKey<xAOD::TrigCompositeContainer>  m_HPtdEdxTrkKey {this, "HPtdEdxTrk", "HLT_HPtdEdxTrk", ""};
+
+   StatusCode createCandidates(const xAOD::TrigCompositeContainer*, const xAOD::TrigCompositeContainer*, xAOD::TrigCompositeContainer*, int&) const;
+
+   ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" };
+   StatusCode doMonitor(const xAOD::TrigCompositeContainer*) const;
+
+   std::vector<float>       m_highdEdxHitDefThres;
+   std::vector<std::string> m_highdEdxHitDefNames;
+}; 
+
+#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOALG_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..601b0078ba10a807dfb0ffb63f435ebcbe9fc6fc
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.cxx
@@ -0,0 +1,177 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+  * Trigger Hypo Tool, that is aimed at triggering large dEdx tracks
+  * author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
+*/
+
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "TrigCompositeUtils/HLTIdentifier.h"
+#include "TrigCompositeUtils/Combinators.h"
+#include "AthenaMonitoringKernel/Monitored.h"
+#include "TrigdEdxTrackHypoTool.h"
+#include "GaudiKernel/PhysicalConstants.h"
+
+using namespace TrigCompositeUtils;
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+TrigdEdxTrackHypoTool::TrigdEdxTrackHypoTool( const std::string& type, 
+					      const std::string& name, 
+					      const IInterface* parent ) 
+   : AthAlgTool( type, name, parent ),
+     m_decisionId( HLT::Identifier::fromToolName( name ) ) {}
+
+TrigdEdxTrackHypoTool::~TrigdEdxTrackHypoTool() {}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigdEdxTrackHypoTool::initialize()
+{
+   ATH_MSG_INFO( "Initialization completed successfully:" );
+   ATH_MSG_INFO( "  cutTrackPtGeV         = " << m_cutTrackPtGeV) ; 
+   ATH_MSG_INFO( "  cutTrackEta           = " << m_cutTrackEta );  
+   ATH_MSG_INFO( "  cutTrackdEdx          = " << m_cutTrackdEdx );  
+   ATH_MSG_INFO( "  cutTrackNhighdEdxHits = " << m_cutTrackNhighdEdxHits ); 
+   ATH_MSG_INFO( "  cutTrackHighdEdxDef   = " << m_cutTrackHighdEdxDef ); 
+   ATH_MSG_INFO( "Tool configured for chain/id: " << m_decisionId );
+   
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigdEdxTrackHypoTool::decide( std::vector<dEdxTrkHypoInfo>& toolInputs ) const 
+{
+   size_t numTrigger  = m_cutTrackPtGeV.size(); 
+   size_t numdEdxTrks = toolInputs.size();
+   
+   ATH_MSG_VERBOSE( "Number of dEdxTrks = " << numdEdxTrks );
+
+   if ( numTrigger == 1 ) {
+      ATH_MSG_VERBOSE( "Applying selection of single for " << m_decisionId );
+      return inclusiveSelection(toolInputs);
+   }
+   else {
+      ATH_MSG_VERBOSE( "Applying selection of multiplicity for " << m_decisionId );
+      return multiplicitySelection(toolInputs);
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigdEdxTrackHypoTool::inclusiveSelection(std::vector<dEdxTrkHypoInfo>& toolInputs) const
+{
+   bool isPassed = false;
+   unsigned int idEdxTrk=0;
+   for ( auto& input: toolInputs ) {
+      ATH_MSG_VERBOSE( "--- idEdxTrk=" << idEdxTrk << " ---");
+      if ( TrigCompositeUtils::passed( m_decisionId.numeric(), input.previousDecisionsIDs ) ) {
+         if ( decideOnSingleObject( input, 0 )==true ) {
+            ATH_MSG_VERBOSE( "   Passed selection --> adding DecisionID");
+	    isPassed = true;
+            TrigCompositeUtils::addDecisionID(m_decisionId, input.decision);
+         }
+      } else {
+	 ATH_MSG_VERBOSE( "   Not match DecisionID: " << m_decisionId );
+      } 
+      ++idEdxTrk;
+   }  
+
+   ATH_MSG_VERBOSE( "Inclusive selection isPassed = " << isPassed);
+   return StatusCode::SUCCESS; 
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+StatusCode TrigdEdxTrackHypoTool::multiplicitySelection(std::vector<dEdxTrkHypoInfo>& toolInputs) const
+{
+   HLT::Index2DVec passingSelection( m_cutTrackPtGeV.size() );
+
+   for ( size_t cutIndex=0; cutIndex < m_cutTrackPtGeV.size(); ++cutIndex ) {
+      size_t elementIndex{ 0 };
+      for ( auto& input: toolInputs ) {
+         if ( TrigCompositeUtils::passed( m_decisionId.numeric(), input.previousDecisionsIDs ) ) {
+            if ( decideOnSingleObject( input, cutIndex ) == true ) {
+               ATH_MSG_VERBOSE( "Pass through selection " << m_decisionId << " : Event[" << elementIndex << "]" );
+               passingSelection[cutIndex].push_back( elementIndex );
+            }
+         }
+	 else {
+            ATH_MSG_VERBOSE( "Not match DecisionID " << m_decisionId );
+         }
+         elementIndex++;
+      }
+      // If no object passes the selection, multipul selection should stop.
+      if ( passingSelection[cutIndex].empty() ) {
+         ATH_MSG_VERBOSE( "No object passed selection " << cutIndex << " rejecting" );
+         return StatusCode::SUCCESS;
+      }
+   }
+
+   std::set<size_t> passingIndices;
+   HLT::elementsInUniqueCombinations( passingSelection, passingIndices );
+
+   if ( passingIndices.empty() ) {
+      ATH_MSG_VERBOSE( "No track passed through selection " << m_decisionId );
+      return StatusCode::SUCCESS;
+   }
+
+   for ( auto idx: passingIndices ) {
+      ATH_MSG_VERBOSE( "track[" << idx << "] passes through Chain/ID " << m_decisionId << " with pT" );
+      TrigCompositeUtils::addDecisionID( m_decisionId.numeric(), toolInputs[idx].decision );
+   }
+
+   return StatusCode::SUCCESS;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
+
+bool TrigdEdxTrackHypoTool::decideOnSingleObject( dEdxTrkHypoInfo& input, size_t cutIndex ) const
+{
+   const xAOD::TrigComposite* trk = input.dedxTrk;
+
+   // pT cut
+   float trackPt     = trk->getDetail<float>("HPtdEdxTrk_pt");
+   float trackPtGeV  = trackPt / 1000.0;
+   float ptThreshold = m_cutTrackPtGeV[cutIndex];
+   if( trackPtGeV < ptThreshold ) return false;
+
+   // eta cut
+   float trackEta      = trk->getDetail<float>("HPtdEdxTrk_eta");
+   float etaThreshold  = m_cutTrackEta[cutIndex];
+   if( std::abs(trackEta) > etaThreshold ) return false;
+
+   // a0beam cut
+   float tracka0beam = trk->getDetail<float>("HPtdEdxTrk_a0beam");
+   float a0Threshold = m_cutTracka0beam[cutIndex];
+   if( std::abs(tracka0beam) > a0Threshold ) return false;
+   
+   // dEdx cut
+   float trackdEdx     = trk->getDetail<float>("HPtdEdxTrk_dedx");
+   float dedxThreshold = m_cutTrackdEdx[cutIndex];
+   if( trackdEdx < dedxThreshold ) return false;
+
+   // nr of high dEdx hits
+   std::string name = "HPtdEdxTrk_n_hdedx_hits_" + m_cutTrackHighdEdxDef[cutIndex];
+   if( ! trk->hasDetail<int16_t>(name) ) ATH_MSG_ERROR( "HPtdEdxTrk container does not have entry for " << name );
+   int n_hdedx_hits = (int)trk->getDetail<int16_t>(name);
+   int n_hdedx_hits_threshold = m_cutTrackNhighdEdxHits[cutIndex];
+   if( n_hdedx_hits < n_hdedx_hits_threshold ) return false;
+
+   //
+   ATH_MSG_VERBOSE( "   Selected, cut index / pT / eta / a0 / dEdx / n high dEdx hits = " << cutIndex << " / " << trackPtGeV << " / " << trackEta << " / " << tracka0beam << " / " << trackdEdx << " / " << n_hdedx_hits);
+
+   return true;
+}
+
+// ------------------------------------------------------------------------------------------------
+// ------------------------------------------------------------------------------------------------
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.h
new file mode 100644
index 0000000000000000000000000000000000000000..6ff744238ee22ad339722b10818a0505ade35524
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackHypoTool.h
@@ -0,0 +1,57 @@
+/*
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOTOOL_H
+#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOTOOL_H
+
+#include "Gaudi/Property.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "xAODTracking/TrackParticlexAODHelpers.h"
+#include "xAODTracking/TrackParticleContainer.h"
+#include <string>
+
+/**
+ * @class TrigdEdxTrackHypoTool
+ * @brief Generated the decision for hypo thats triggers on high pt isolated tracks 
+ * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
+ **/
+
+class TrigdEdxTrackHypoTool : virtual public ::AthAlgTool
+{ 
+public: 
+   TrigdEdxTrackHypoTool( const std::string& type, 
+			  const std::string& name, 
+			  const IInterface* parent );
+   
+   virtual ~TrigdEdxTrackHypoTool();
+   virtual StatusCode initialize() override;
+   
+   struct dEdxTrkHypoInfo {
+      TrigCompositeUtils::Decision* decision;
+      const xAOD::TrigComposite*    dedxTrk;
+      const TrigCompositeUtils::DecisionIDContainer previousDecisionsIDs;
+   };
+   
+   /**
+    * @brief decides upon a collection of tracks
+    **/
+   StatusCode decide( std::vector<dEdxTrkHypoInfo>& )  const;
+
+private:
+
+   HLT::Identifier m_decisionId;
+   Gaudi::Property< std::vector<float> >  m_cutTrackPtGeV         { this, "cutTrackPtGeV",         { float(20.0) }, "Track pT requirement in GeV" };
+   Gaudi::Property< std::vector<float> >  m_cutTrackEta           { this, "cutTrackEta",           { float(2.5) },  "Track Eta requirement" };
+   Gaudi::Property< std::vector<float> >  m_cutTracka0beam        { this, "cutTracka0beam",        { float(2.5) },  "Track a0beam requirement" };
+   Gaudi::Property< std::vector<float> >  m_cutTrackdEdx          { this, "cutTrackdEdx",          { float(1.7) },  "Track dE/dx requirement" };
+   Gaudi::Property< std::vector<int> >    m_cutTrackNhighdEdxHits { this, "cutTrackNhighdEdxHits", { int(2) },      "N high dEdx of pixel hits requirement" }; 
+   Gaudi::Property< std::vector<std::string> >  m_cutTrackHighdEdxDef { this, "cutTrackHighdEdxDef", { std::string("1p70") },  "Definition / threshold of high dEdx hits" };
+  
+   //
+   StatusCode inclusiveSelection(std::vector<dEdxTrkHypoInfo>& ) const;
+   StatusCode multiplicitySelection(std::vector<dEdxTrkHypoInfo>& ) const;
+   bool decideOnSingleObject( dEdxTrkHypoInfo&, size_t ) const;
+}; 
+
+#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKHYPOTOOL_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.cxx
deleted file mode 100644
index f866a267a84698e0f81b1c683294004c6aa15bdd..0000000000000000000000000000000000000000
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.cxx
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-
-  * Trigger Hypo Tool, that is aimed at triggering  large dEdx tracks
-  * author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
-*/
-#include "TrigdEdxTrackTriggerHypoAlg.h"
-#include "AthViews/ViewHelper.h"
-#include "TrigCompositeUtils/TrigCompositeUtils.h"
-#include "GaudiKernel/SystemOfUnits.h"
-
-using TrigCompositeUtils::createAndStore; 
-using TrigCompositeUtils::DecisionContainer;
-using TrigCompositeUtils::DecisionAuxContainer;
-using TrigCompositeUtils::DecisionIDContainer;
-using TrigCompositeUtils::decisionIDs;
-using TrigCompositeUtils::newDecisionIn;
-using TrigCompositeUtils::linkToPrevious;
-using TrigCompositeUtils::viewString;
-using TrigCompositeUtils::featureString;
-using TrigCompositeUtils::hypoAlgNodeName;
-using TrigCompositeUtils::findLink;
-using TrigCompositeUtils::LinkInfo;
-using TrigCompositeUtils::Decision;
-using TrigCompositeUtils::allFailed;
-
-TrigdEdxTrackTriggerHypoAlg::TrigdEdxTrackTriggerHypoAlg( const std::string& name, 
-							  ISvcLocator* pSvcLocator ) : 
-   ::HypoBase( name, pSvcLocator ) {}
-
-
-StatusCode TrigdEdxTrackTriggerHypoAlg::initialize()
-{
-   CHECK( m_hypoTools.retrieve() );
-   CHECK( m_dEdxTrkKey.initialize() );
-   CHECK( m_dEdxHitKey.initialize() );
-   CHECK( m_HPtdEdxTrkKey.initialize());
-   return StatusCode::SUCCESS;
-}
-
-StatusCode TrigdEdxTrackTriggerHypoAlg::execute( const EventContext& context ) const
-{
-   const std::string header = "UTT: ";
-
-   ATH_MSG_DEBUG( header << name() << "..." );
-   auto previousDecisionsHandle = SG::makeHandle( decisionInput(), context );
-   ATH_CHECK( previousDecisionsHandle.isValid() );
-   
-   // new output decisions
-   ATH_MSG_DEBUG( header << "Creating new output decision handle" ); 
-   SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context ); 
-   auto decisions = outputHandle.ptr();
-
-   // previous decisions
-   ATH_MSG_DEBUG( header << "Running with " << previousDecisionsHandle->size() << " previous decisions" ); 
-   if(previousDecisionsHandle->size()!=1) {
-      ATH_MSG_ERROR( header << "Previous decision handle size isn't 1. It is" << previousDecisionsHandle->size() );
-      return StatusCode::FAILURE;
-   }
-   const Decision * previousDecision = previousDecisionsHandle->at(0);
-
-   TrigCompositeUtils::DecisionIDContainer previousDecisionIDs;
-   TrigCompositeUtils::decisionIDs(previousDecision, previousDecisionIDs);
-   
-   // input dEdx objects
-   auto dEdxTrkHandle = SG::makeHandle(m_dEdxTrkKey, context );
-   ATH_CHECK( dEdxTrkHandle.isValid() );
-   ATH_MSG_DEBUG( header << "dEdxTrk handle size: " << dEdxTrkHandle->size() );
-
-   auto dEdxHitHandle = SG::makeHandle(m_dEdxHitKey, context );
-   ATH_CHECK( dEdxHitHandle.isValid() );
-   ATH_MSG_DEBUG( header << "dEdxHit handle size: " << dEdxHitHandle->size() );
-
-   const xAOD::TrigCompositeContainer * dEdxTrksContainer = dEdxTrkHandle.get();
-   const xAOD::TrigCompositeContainer * dEdxHitsContainer = dEdxHitHandle.get();
-
-   if( dEdxTrksContainer == nullptr ) {
-      ATH_MSG_ERROR( header << "ERROR Cannot get dEdxTrks container");
-      return StatusCode::FAILURE;
-   }
-   if( dEdxHitsContainer == nullptr ) {
-      ATH_MSG_ERROR( header << "ERROR Cannot get dEdxHits container");
-      return StatusCode::FAILURE;
-   }
-
-   // output EDM object
-   auto HPtdEdxTrkContainer    = std::make_unique<xAOD::TrigCompositeContainer>();
-   auto HPtdEdxTrkContainerAux = std::make_unique<xAOD::TrigCompositeAuxContainer>();
-   HPtdEdxTrkContainer->setStore(HPtdEdxTrkContainerAux.get());
-
-   // create decision
-   auto d = newDecisionIn( decisions , previousDecision, hypoAlgNodeName(), context );
-   TrigdEdxTrackTriggerHypoTool::TrackInfo trkInfo{ d, dEdxTrksContainer, dEdxHitsContainer, *HPtdEdxTrkContainer, previousDecisionIDs };
-
-   // Loop over all hypoToolinputs and get their decisions
-   for ( auto & tool: m_hypoTools ) {
-      ATH_CHECK( tool->decide( trkInfo ) );    
-   } 
-   
-   DecisionContainer::iterator it = decisions->begin();
-   bool isPassed = false;
-   while(it != decisions->end()) {
-      if (allFailed( *it )) {
-	 it = decisions->erase(it);
-      } else {
-	 isPassed = true;
-	 ++it;
-      }
-   }
-
-   // record link to EDM object if it is passed
-   if( isPassed ) {
-      SG::WriteHandle<xAOD::TrigCompositeContainer> HPtdEdxTrkHandle(m_HPtdEdxTrkKey, context);
-      ATH_CHECK( HPtdEdxTrkHandle.record( std::move( HPtdEdxTrkContainer ), std::move( HPtdEdxTrkContainerAux ) ) );
-      ATH_CHECK( d->setObjectLink( featureString(), ElementLink<xAOD::TrigCompositeContainer>( m_HPtdEdxTrkKey.key(), 0) ) );
-   }
-
-   ATH_CHECK( hypoBaseOutputProcessing(outputHandle) );
-
-   //
-   return StatusCode::SUCCESS;
-}
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.h
deleted file mode 100644
index eceecebe0abd6bf10ed6d86308bd06589b23a377..0000000000000000000000000000000000000000
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoAlg.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-*/
-#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOALG_H
-#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOALG_H
-
-#include "Gaudi/Property.h"
-
-#include <string>
-#include "TrigdEdxTrackTriggerHypoTool.h"
-#include "DecisionHandling/HypoBase.h"
-
-/**
- * @class TrigdEdxTrackTriggerHypoAlg
- * @brief Implements Hypo selection on triggering large dEdx tracks
- * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
- **/
-
-class TrigdEdxTrackTriggerHypoAlg : public ::HypoBase 
-{ 
-public: 
-
-   TrigdEdxTrackTriggerHypoAlg( const std::string& name, ISvcLocator* pSvcLocator );
-   
-   virtual StatusCode  initialize() override;
-   virtual StatusCode  execute(const EventContext& context) const override;
-   
-private: 
-   ToolHandleArray< TrigdEdxTrackTriggerHypoTool >   m_hypoTools     {this, "HypoTools", {}, "Tools to perfrom selection"};
-   SG::ReadHandleKey< xAOD::TrigCompositeContainer > m_dEdxTrkKey    {this, "dEdxTrk",    "HLT_dEdxTrk", ""};
-   SG::ReadHandleKey< xAOD::TrigCompositeContainer>  m_dEdxHitKey    {this, "dEdxHit",    "HLT_dEdxHit", ""};
-   SG::WriteHandleKey<xAOD::TrigCompositeContainer>  m_HPtdEdxTrkKey {this, "HPtdEdxTrk", "HLT_HPtdEdxTrk", ""};
-}; 
-
-#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOALG_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.cxx
deleted file mode 100644
index 702ceb8a3dfe68f135c7ad949b46daf2197f1e18..0000000000000000000000000000000000000000
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.cxx
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-
-  * Trigger Hypo Tool, that is aimed at triggering large dEdx tracks
-  * author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
-*/
-
-#include "TrigCompositeUtils/TrigCompositeUtils.h"
-#include "TrigCompositeUtils/HLTIdentifier.h"
-#include "TrigCompositeUtils/Combinators.h"
-#include "AthenaMonitoringKernel/Monitored.h"
-#include "TrigdEdxTrackTriggerHypoTool.h"
-#include "GaudiKernel/PhysicalConstants.h"
-
-using namespace TrigCompositeUtils;
-
-TrigdEdxTrackTriggerHypoTool::TrigdEdxTrackTriggerHypoTool( const std::string& type, 
-							    const std::string& name, 
-							    const IInterface* parent ) 
-   : AthAlgTool( type, name, parent ),
-     m_decisionId( HLT::Identifier::fromToolName( name ) ) {}
-
-StatusCode TrigdEdxTrackTriggerHypoTool::initialize()
-{
-   if ( !m_monTool.empty() ) CHECK( m_monTool.retrieve() );
-
-   ATH_MSG_INFO("Initialization completed successfully:");
-   ATH_MSG_INFO("cutTrackPtGeV         = " << m_cutTrackPtGeV); 
-   ATH_MSG_INFO("cutTrackEta           = " << m_cutTrackEta);  
-   ATH_MSG_INFO("cutTrackdEdx          = " << m_cutTrackdEdx);  
-   ATH_MSG_INFO("cutTrackNhighdEdxHits = " << m_cutTrackNhighdEdxHits); 
-   ATH_MSG_INFO("cutTrackHighdEdxDef   = " << m_cutTrackHighdEdxDef); 
-   ATH_MSG_INFO("Tool configured for chain/id: " << m_decisionId);
-   
-   return StatusCode::SUCCESS;
-}
-
-TrigdEdxTrackTriggerHypoTool::~TrigdEdxTrackTriggerHypoTool() {}
-
-StatusCode TrigdEdxTrackTriggerHypoTool::decide( TrackInfo& input ) const
-{
-   auto monTrackPtGeV  = Monitored::Scalar( "trackPtGeV",  -999. );
-   auto monTrackEta    = Monitored::Scalar( "trackEta",    -999. );
-   auto monTracka0beam = Monitored::Scalar( "tracka0beam", -999. );
-   auto monTrackdEdx   = Monitored::Scalar( "trackdEdx",   -999. );
-   auto monTrackNhighdEdxHits = Monitored::Scalar( "trackNhighdEdxHits",  -999. );
-   auto monitorIt = Monitored::Group( m_monTool, monTrackdEdx, monTrackPtGeV, monTrackEta, monTracka0beam, monTrackNhighdEdxHits );
-   
-   const xAOD::TrigCompositeContainer* trksContainer = input.trksContainer;
-   const xAOD::TrigCompositeContainer* hitsContainer = input.hitsContainer;
-   xAOD::TrigCompositeContainer&       dedxContainer = input.dedxContainer;
-
-   const int cutIndex = 0;
-
-   unsigned int i_trk=0;
-   unsigned int n_passed_trk=0;
-   for ( const xAOD::TrigComposite* trk : *trksContainer ) {
-      ATH_MSG_DEBUG("+++++ i_trk: " << i_trk++ << " +++++");
-
-      // values
-      float trackPt     = trk->getDetail<float>("dEdxTrk_pt");
-      float trackEta    = trk->getDetail<float>("dEdxTrk_eta");
-      float tracka0beam = trk->getDetail<float>("dEdxTrk_a0beam");
-      float trackdEdx   = trk->getDetail<float>("dEdxTrk_dedx");
-      int   trackId     = trk->getDetail<int>  ("dEdxTrk_id");
-      ATH_MSG_DEBUG("track pt / eta / a0beam / dEdx / Id = " << trackPt << " / " << trackEta << " / " << tracka0beam << " / " << trackdEdx << " / " << trackId );
-      
-      // pT cut
-      float trackPtGeV = trackPt / 1000.0;
-      monTrackPtGeV = trackPtGeV;
-      if( trackPtGeV < m_cutTrackPtGeV[cutIndex] ) {
-	 ATH_MSG_DEBUG("Fails pt cut in GeV: " << trackPtGeV << " < " << m_cutTrackPtGeV[cutIndex] );
-	 continue;
-      }
-
-      // eta cut
-      monTrackEta = trackEta;
-      if( std::abs(trackEta) > m_cutTrackEta[cutIndex] ) {
-	 ATH_MSG_DEBUG("Fails eta cut: " << trackEta << " < " << m_cutTrackEta[cutIndex] );
-	 continue;
-      }
-
-      // a0beam cut
-      monTracka0beam = tracka0beam;
-      if( std::abs(tracka0beam) > m_cutTracka0beam[cutIndex] ) {
-	 ATH_MSG_DEBUG("Fails a0beam cut: " << tracka0beam << " < " << m_cutTracka0beam[cutIndex] );
-	 continue;
-      }
-   
-      // dEdx cut
-      monTrackdEdx = trackdEdx;
-      if( trackdEdx < m_cutTrackdEdx[cutIndex] ) {
-	 ATH_MSG_DEBUG("Fails dEdx cut: " << trackdEdx << " < " << m_cutTrackdEdx[cutIndex] );
-	 continue;
-      }
-
-      // nr of high dEdx hits cut
-      int n_hdedx_hits = 0;
-      ATH_MSG_DEBUG("looping hits for trackId=" << trackId);
-      for ( const xAOD::TrigComposite* hit : *hitsContainer ) {
-	 int id = hit->getDetail<int>("dEdxHit_trkid");
-	 if( id != trackId ) continue;
-	 float dedx  = hit->getDetail<float>("dEdxHit_dedx");
-	 ATH_MSG_DEBUG("... dEdx = " << dedx);
-	 if( dedx < m_cutTrackHighdEdxDef[cutIndex] ) continue;
-	 n_hdedx_hits++;
-      }
-      monTrackNhighdEdxHits = n_hdedx_hits;
-      if( n_hdedx_hits < m_cutTrackNhighdEdxHits[cutIndex] ) {
-	 ATH_MSG_DEBUG("Fails nr of high dEdx hits cut" << n_hdedx_hits << " < " << m_cutTrackNhighdEdxHits[cutIndex] );
-	 continue;
-      }
-
-      // passed selection
-      ATH_MSG_DEBUG("Passed selection");
-      n_passed_trk++;
-
-      // create EDM object
-      xAOD::TrigComposite *dedx = new xAOD::TrigComposite();
-      dedx->makePrivateStore();
-      dedxContainer.push_back(dedx);
-      float trackPhi       = trk->getDetail<float>("dEdxTrk_phi");
-      int n_hits_innermost = trk->getDetail<int>  ("dEdxTrk_n_hits_innermost");
-      int n_hits_inner     = trk->getDetail<int>  ("dEdxTrk_n_hits_inner");
-      int n_hits_pix       = trk->getDetail<int>  ("dEdxTrk_n_hits_pix");
-      int n_hits_sct       = trk->getDetail<int>  ("dEdxTrk_n_hits_sct");
-      dedx->setDetail<float>("HPtdEdxTrk_pt",     trackPt);
-      dedx->setDetail<float>("HPtdEdxTrk_eta",    trackEta);
-      dedx->setDetail<float>("HPtdEdxTrk_phi",    trackPhi);
-      dedx->setDetail<float>("HPtdEdxTrk_dedx",   trackdEdx);
-      dedx->setDetail<int>  ("HPtdEdxTrk_n_hdedx_hits", n_hdedx_hits);
-      dedx->setDetail<float>("HPtdEdxTrk_a0beam",       tracka0beam);
-      dedx->setDetail<int>  ("HPtdEdxTrk_n_hits_innermost", n_hits_innermost);
-      dedx->setDetail<int>  ("HPtdEdxTrk_n_hits_inner",     n_hits_inner);
-      dedx->setDetail<int>  ("HPtdEdxTrk_n_hits_pix",       n_hits_pix);
-      dedx->setDetail<int>  ("HPtdEdxTrk_n_hits_sct",       n_hits_sct);
-      ATH_MSG_DEBUG("Created a new entry EDM");
-   }
-
-   // 
-   if( n_passed_trk > 0 ) {
-      addDecisionID( m_decisionId.numeric(), input.decision );
-      ATH_MSG_DEBUG("REGTEST event accepted");
-      return StatusCode::SUCCESS;
-   }
-   else {
-      return StatusCode::SUCCESS;
-   }
-}
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.h b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.h
deleted file mode 100644
index 8a3ce90031141fd818e8c491c48a681c8260bcd3..0000000000000000000000000000000000000000
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/TrigdEdxTrackTriggerHypoTool.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
-*/
-#ifndef TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOTOOL_H
-#define TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOTOOL_H
-
-#include "Gaudi/Property.h"
-#include "AthenaBaseComps/AthAlgTool.h"
-#include "AthenaMonitoringKernel/GenericMonitoringTool.h"
-#include "TrigCompositeUtils/TrigCompositeUtils.h"
-#include "xAODTracking/TrackParticlexAODHelpers.h"
-#include "xAODTracking/TrackParticleContainer.h"
-#include <string>
-
-/**
- * @class TrigdEdxTrackTriggerHypoTool
- * @brief Generated the decision for hypo thats triggers on high pt isolated tracks 
- * @author Kunihiro Nagano <kunihiro.nagano@cern.ch> - KEK
- **/
-
-class TrigdEdxTrackTriggerHypoTool : virtual public ::AthAlgTool
-{ 
-public: 
-   TrigdEdxTrackTriggerHypoTool( const std::string& type, 
-				 const std::string& name, 
-				 const IInterface* parent );
-   
-   virtual ~TrigdEdxTrackTriggerHypoTool();
-   virtual StatusCode initialize() override;
-   
-   struct TrackInfo {
-      TrigCompositeUtils::Decision* decision;
-      const xAOD::TrigCompositeContainer* trksContainer;
-      const xAOD::TrigCompositeContainer* hitsContainer;
-      xAOD::TrigCompositeContainer& dedxContainer;
-      const TrigCompositeUtils::DecisionIDContainer previousDecisionsIDs;
-   };
-   
-   /**
-    * @brief decides upon a collection of tracks
-    **/
-   StatusCode decide( TrackInfo& input )  const;
-
-private:
-   HLT::Identifier m_decisionId;
-   Gaudi::Property< std::vector<float> >  m_cutTrackPtGeV        { this, "cutTrackPtGeV",         { float(20.0) }, "Track pT requirement in GeV" };
-   Gaudi::Property< std::vector<float> >  m_cutTrackEta          { this, "cutTrackEta",           { float(2.5) },  "Track Eta requirement" };
-   Gaudi::Property< std::vector<float> >  m_cutTracka0beam       { this, "cutTracka0beam",        { float(2.5) },  "Track a0beam requirement" };
-   Gaudi::Property< std::vector<float> >  m_cutTrackdEdx         { this, "cutTrackdEdx",          { float(1.7) },  "Track dE/dx requirement" };
-   Gaudi::Property< std::vector<int> >    m_cutTrackNhighdEdxHits{ this, "cutTrackNhighdEdxHits", { int(2) },      "N high dEdx of pixel hits requirement" }; 
-   Gaudi::Property< std::vector<float> >  m_cutTrackHighdEdxDef  { this, "cutTrackHighdEdxDef",   { float(1.7) },  "Definition / threshold of high dEdx hits" };
-  
-   ToolHandle<GenericMonitoringTool> m_monTool{ this, "MonTool", "", "Monitoring tool" };
-}; 
-
-#endif //> !TRIGLONGLIVEDPARTICLESHYPO_TRIGDEDXTRACKTRIGGERHYPOTOOL_H
diff --git a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/components/TrigLongLivedParticlesHypo_entries.cxx b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/components/TrigLongLivedParticlesHypo_entries.cxx
index f73444f60c8f15f924207370c9b459e4c76245de..e2a3d5f207eedd892b49fe2b6e72620a16391c13 100644
--- a/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/components/TrigLongLivedParticlesHypo_entries.cxx
+++ b/Trigger/TrigHypothesis/TrigLongLivedParticlesHypo/src/components/TrigLongLivedParticlesHypo_entries.cxx
@@ -2,19 +2,19 @@
 #include "../FastTrackFinderLRTHypoAlg.h"
 #include "../TrigIsoHPtTrackTriggerHypoAlg.h"
 #include "../TrigIsoHPtTrackTriggerHypoTool.h"
-#include "../TrigdEdxTrackTriggerHypoAlg.h"
-#include "../TrigdEdxTrackTriggerHypoTool.h"
+#include "../TrigdEdxTrackHypoAlg.h"
+#include "../TrigdEdxTrackHypoTool.h"
 #include "../TrigHitDVHypoAlg.h"
 #include "../TrigHitDVHypoTool.h"
-#include "../TrigDisappearingTrackTriggerHypoAlg.h"
-#include "../TrigDisappearingTrackTriggerHypoTool.h"
+#include "../TrigDisappearingTrackHypoAlg.h"
+#include "../TrigDisappearingTrackHypoTool.h"
 
-DECLARE_COMPONENT( TrigDisappearingTrackTriggerHypoAlg )
-DECLARE_COMPONENT( TrigDisappearingTrackTriggerHypoTool )
+DECLARE_COMPONENT( TrigDisappearingTrackHypoAlg )
+DECLARE_COMPONENT( TrigDisappearingTrackHypoTool )
 DECLARE_COMPONENT( TrigHitDVHypoAlg )
 DECLARE_COMPONENT( TrigHitDVHypoTool )
-DECLARE_COMPONENT( TrigdEdxTrackTriggerHypoAlg )
-DECLARE_COMPONENT( TrigdEdxTrackTriggerHypoTool )
+DECLARE_COMPONENT( TrigdEdxTrackHypoAlg )
+DECLARE_COMPONENT( TrigdEdxTrackHypoTool )
 DECLARE_COMPONENT( TrigIsoHPtTrackTriggerHypoAlg )
 DECLARE_COMPONENT( TrigIsoHPtTrackTriggerHypoTool )
 DECLARE_COMPONENT( FastTrackFinderLRTHypoTool )
diff --git a/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h b/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
index 794b34f6a8566ec1676a1b3ec5e1899c9ec4a20f..451f09a28d7c38f722061006cc322b093c4c5c38 100644
--- a/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
+++ b/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
@@ -21,8 +21,7 @@ constexpr auto initAccessors(U... names) {
 
 auto boolAccessors = initAccessors<bool>(
   "hasGenericRoiError", "hasGenericDaqError", "hasCrcTobError", "hasCrcFibreError",
-  "hasCrcDaqError", "hasRoibDaqDifference", "hasRoibCtpDifference", "hasDaqCtpDifference",
-  "hitDVSP_isPix","hitDVSP_isSct");
+  "hasCrcDaqError", "hasRoibDaqDifference", "hasRoibCtpDifference", "hasDaqCtpDifference");
 
 auto charAccessors = initAccessors<char>(
   "IP2D_isDefaults", "IP3D_isDefaults", "SV1_isDefaults", "rnnip_isDefaults",
@@ -39,15 +38,12 @@ auto intAccessors = initAccessors<int>(
   "nCells",
   "sctSP", "sctSPBarrel", "sctSPEndcapA", "sctSPEndcapC",
   "zfinder_tool",
-  "hitDVTrk_id","hitDVTrk_n_hits_innermost","hitDVTrk_n_hits_pix","hitDVTrk_n_hits_sct",
   "hitDV_seed_type","hitDV_n_track_qual",
   "dEdxTrk_id","dEdxTrk_dedx_n_usedhits",
   "dEdxTrk_n_hits_innermost","dEdxTrk_n_hits_inner","dEdxTrk_n_hits_pix","dEdxTrk_n_hits_sct",
   "dEdxHit_trkid","dEdxHit_iblovfl","dEdxHit_loc","dEdxHit_layer",
-  "HPtdEdxTrk_dedx_n_usedhits","HPtdEdxTrk_n_hits_innermost",
-  "HPtdEdxTrk_n_hits_inner","HPtdEdxTrk_n_hits_pix","HPtdEdxTrk_n_hits_sct",
   "disTrk_category","disTrk_is_fail","disTrk_n_hits_pix","disTrk_n_hits_sct","disTrk_n_hits_innermost",
-  "disTrkCand_category","disTrkCand_n_hits_innermost","disTrkCand_n_hits_inner","disTrkCand_n_hits_pix","disTrkCand_n_hits_sct",
+  "disTrkCand_category","disTrkCand_is_fail","disTrkCand_n_hits_innermost","disTrkCand_n_hits_inner","disTrkCand_n_hits_pix","disTrkCand_n_hits_sct",
   "disTrkCand_n_brhits_ibl","disTrkCand_n_brhits_pix1","disTrkCand_n_brhits_pix2","disTrkCand_n_brhits_pix3",
   "disTrkCand_n_brhits_sct1","disTrkCand_n_brhits_sct2","disTrkCand_n_brhits_sct3","disTrkCand_n_brhits_sct4",
   "disTrkCand_n_brhits_good_ibl","disTrkCand_n_brhits_good_pix1","disTrkCand_n_brhits_good_pix2","disTrkCand_n_brhits_good_pix3",
@@ -58,7 +54,10 @@ auto intAccessors = initAccessors<int>(
   "disTrkCand_refit_n_brhits_good_ibl","disTrkCand_refit_n_brhits_good_pix1","disTrkCand_refit_n_brhits_good_pix2","disTrkCand_refit_n_brhits_good_pix3",
   "disTrkCand_refit_n_brhits_good_sct1","disTrkCand_refit_n_brhits_good_sct2","disTrkCand_refit_n_brhits_good_sct3","disTrkCand_refit_n_brhits_good_sct4");
 
-auto int16Accessors = initAccessors<int16_t>("view", "hitDVSP_layer", "hitDVSP_usedTrkId");
+auto int16Accessors = initAccessors<int16_t>("view",
+  "HPtdEdxTrk_n_hdedx_hits_1p45","HPtdEdxTrk_n_hdedx_hits_1p50","HPtdEdxTrk_n_hdedx_hits_1p55","HPtdEdxTrk_n_hdedx_hits_1p60",
+  "HPtdEdxTrk_n_hdedx_hits_1p65","HPtdEdxTrk_n_hdedx_hits_1p70","HPtdEdxTrk_n_hdedx_hits_1p75","HPtdEdxTrk_n_hdedx_hits_1p80",
+  "HPtdEdxTrk_n_hits_innermost","HPtdEdxTrk_n_hits_inner","HPtdEdxTrk_n_hits_pix","HPtdEdxTrk_n_hits_sct");
 
 auto int32Accessors = initAccessors<int32_t>("roi");
 
@@ -102,8 +101,6 @@ auto floatAccessors = initAccessors<float>(
   "btagIp_d0", "btagIp_d0Uncertainty", "btagIp_z0SinTheta", "btagIp_z0SinThetaUncertainty",
   "EOverP", "RErr", "etConeCore", "muonScore", "ptCone20", "trackIso", "trkPtFraction", 
   "zfinder_vtx_z", "zfinder_vtx_weight", "caloIso", "calE", "calEta", "calPhi",
-  "hitDVTrk_pt","hitDVTrk_eta","hitDVTrk_phi","hitDVTrk_a0beam",
-  "hitDVSP_eta","hitDVSP_r","hitDVSP_phi",
   "hitDV_seed_pt","hitDV_seed_eta","hitDV_seed_phi","hitDV_ly0_sp_frac","hitDV_ly1_sp_frac","hitDV_ly2_sp_frac",
   "hitDV_ly3_sp_frac","hitDV_ly4_sp_frac","hitDV_ly5_sp_frac","hitDV_ly6_sp_frac","hitDV_ly7_sp_frac","hitDV_bdt_score",
   "dEdxTrk_pt","dEdxTrk_eta","dEdxTrk_phi","dEdxTrk_dedx","dEdxTrk_a0beam",
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index ea6b84ed7d0c2750c5bc2e253d7ace7f4beefbbf..cd3706579368b2e31db7d5e276a43997a1048051 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -11038,7 +11038,7 @@ HLT_xe80_tcpufit_unconvtrk25_dedx_medium_L1XE50:
   stepFeatures:
     0: 4
     1: 4
-    2: 1
+    2: 3
 HLT_xe80_tcpufit_unconvtrk50_dedx_medium_L1XE50:
   eventCount: 1
   stepCounts:
@@ -11048,4 +11048,4 @@ HLT_xe80_tcpufit_unconvtrk50_dedx_medium_L1XE50:
   stepFeatures:
     0: 4
     1: 4
-    2: 1
+    2: 2
diff --git a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
index cb2c8d83fa45016071dcdf7be773da0113e9ab13..583e1d61ee688d4e9cfb3b4df7c214be12570e3e 100644
--- a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
+++ b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
@@ -110,18 +110,6 @@ BTagVars = '.'.join(BTagOutput)
 BTagJetOutput = ['btaggingLink', 'Jvt', 'JVFCorr', 'SumPtTrkPt500']
 BTagJetVars  ='.'.join(BTagJetOutput)
 
-hitDVTrkToKeepBase = ['id','pt','eta','phi','n_hits_innermost','n_hits_pix','n_hits_sct','a0beam']
-hitDVTrkToKeep = []
-for var in hitDVTrkToKeepBase:
-    hitDVTrkToKeep.append('hitDVTrk_'+var)
-hitDVTrkVars = '.'.join(hitDVTrkToKeep)
-
-hitDVSPToKeepBase = ['eta','r','phi','layer','isPix','isSct','usedTrkId']
-hitDVSPToKeep = []
-for var in hitDVSPToKeepBase:
-    hitDVSPToKeep.append('hitDVSP_'+var)
-hitDVSPVars = '.'.join(hitDVSPToKeep)
-
 hitDVToKeepBase = ['seed_eta','seed_phi','seed_type','n_track_qual','ly0_sp_frac','ly1_sp_frac','ly2_sp_frac','ly3_sp_frac','ly4_sp_frac','ly5_sp_frac','ly6_sp_frac','ly7_sp_frac','bdt_score']
 hitDVToKeep = []
 for var in hitDVToKeepBase:
@@ -140,7 +128,8 @@ for var in dEdxHitToKeepBase:
     dEdxHitToKeep.append('dEdxHit_'+var)
 dEdxHitVars = '.'.join(dEdxHitToKeep)
 
-HPtdEdxTrkToKeepBase = ['pt','eta','phi','dedx','dedx_n_usedhits','a0beam','n_hits_innermost','n_hits_inner','n_hits_pix','n_hits_sct']
+HPtdEdxTrkToKeepBase = ['pt','eta','phi','a0beam','dedx','n_hits_innermost','n_hits_inner','n_hits_pix','n_hits_sct',
+                        'n_hdedx_hits_1p45','n_hdedx_hits_1p50','n_hdedx_hits_1p55','n_hdedx_hits_1p60','n_hdedx_hits_1p65','n_hdedx_hits_1p70','n_hdedx_hits_1p75','n_hdedx_hits_1p80']
 HPtdEdxTrkToKeep = []
 for var in HPtdEdxTrkToKeepBase:
     HPtdEdxTrkToKeep.append('HPtdEdxTrk_'+var)
@@ -153,7 +142,7 @@ DisTrkToKeepNoIso = ['pt','eta','phi','d0','z0','chi2','ndof','n_hits_innermost'
                      'ndofsum_br_ibl','ndofsum_br_pix1','ndofsum_br_pix2','ndofsum_br_pix3','ndofsum_br_sct1','ndofsum_br_sct2','ndofsum_br_sct3','ndofsum_br_sct4',
                      'n_brhits_good_ibl','n_brhits_good_pix1','n_brhits_good_pix2','n_brhits_good_pix3',
                      'n_brhits_good_sct1','n_brhits_good_sct2','n_brhits_good_sct3','n_brhits_good_sct4']
-DisTrkToKeepIso = ['iso1_dr01','iso1_dr02','iso1_dr04','iso2_dr01','iso2_dr02','iso2_dr04','iso3_dr01','iso3_dr02','iso3_dr04']
+DisTrkToKeepIso = ['category','is_fail','iso1_dr01','iso1_dr02','iso1_dr04','iso2_dr01','iso2_dr02','iso2_dr04','iso3_dr01','iso3_dr02','iso3_dr04']
 DisTrkVars = []
 for var in DisTrkToKeepNoIso:
     DisTrkVars.append('disTrkCand_'+var)
@@ -787,11 +776,6 @@ TriggerHLTListRun3 = [
 
     # UTT
     # hit-based displaced vertex
-    # commented out temporarly due to HLT truncation issue (ATR-23958)
-    #('xAOD::TrigCompositeContainer#HLT_HitDVTrk',                          'BS ESD', 'ID'),
-    #('xAOD::TrigCompositeAuxContainer#HLT_HitDVTrkAux.'+hitDVTrkVars,      'BS ESD', 'ID'),
-    #('xAOD::TrigCompositeContainer#HLT_HitDVSP',                           'BS ESD AODFULL', 'ID'),
-    #('xAOD::TrigCompositeAuxContainer#HLT_HitDVSPAux.'+hitDVSPVars,        'BS ESD AODFULL', 'ID'),
     ('xAOD::TrigCompositeContainer#HLT_HitDV',                             'BS ESD AODFULL AODSLIM', 'ID'),
     ('xAOD::TrigCompositeAuxContainer#HLT_HitDVAux.'+hitDVVars,            'BS ESD AODFULL AODSLIM', 'ID'),
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/DisTrkTriggerConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/DisTrkTriggerConfiguration.py
index b4a9736a7bf61ae27898986e09eeb6b9f2ac785c..594823cd1957bb1eec260a1331a92c6c25eeb706 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/DisTrkTriggerConfiguration.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/DisTrkTriggerConfiguration.py
@@ -8,14 +8,11 @@ log = logging.getLogger(__name__)
 
 
 def DisTrkTriggerHypoSequence():
-        from TrigLongLivedParticlesHypo.TrigDisappearingTrackTriggerHypoTool import  TrigDisappearingTrackTriggerHypoToolFromDict
-        from TrigLongLivedParticlesHypo.TrigLongLivedParticlesHypoConf       import (TrigDisappearingTrackTriggerHypoAlg)
 
-        # Setup the hypothesis algorithm
-        theDisTrkTrackTriggerHypo = TrigDisappearingTrackTriggerHypoAlg("DisTrkTrack")
+        from TrigLongLivedParticlesHypo.TrigDisappearingTrackHypoConfig import TrigDisappearingTrackHypoToolFromDict
+        from TrigLongLivedParticlesHypo.TrigDisappearingTrackHypoConfig import createTrigDisappearingTrackHypoAlg
 
-        from TrigEDMConfig.TriggerEDMRun3 import recordable
-        theDisTrkTrackTriggerHypo.DisTrkBDTSel = recordable("HLT_DisTrkBDTSel")
+        theDisTrkHypo = createTrigDisappearingTrackHypoAlg("DisTrkTrack")
 
         from AthenaConfiguration.ComponentAccumulator import conf2toConfigurable
         from AthenaConfiguration.ComponentFactory import CompFactory
@@ -25,6 +22,6 @@ def DisTrkTriggerHypoSequence():
         log.debug("Building the Step dictinary for DisTrk")
         return MenuSequence( Sequence    = seqAND("DisTrkEmptyStep",[DummyInputMakerAlg]),
                              Maker       = DummyInputMakerAlg,
-                             Hypo        = theDisTrkTrackTriggerHypo,
-                             HypoToolGen = TrigDisappearingTrackTriggerHypoToolFromDict,
+                             Hypo        = theDisTrkHypo,
+                             HypoToolGen = TrigDisappearingTrackHypoToolFromDict,
                          )
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/dEdxTriggerConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/dEdxTriggerConfiguration.py
index 2a1ade8c193f0069972b1b741490dfb2484c585a..ab3b3d7617b07678be0e59ec2fba02d24c566ae7 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/dEdxTriggerConfiguration.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/UnconventionalTracking/dEdxTriggerConfiguration.py
@@ -8,23 +8,18 @@ log = logging.getLogger(__name__)
 
 
 def dEdxTriggerHypoSequence():
-        from TrigLongLivedParticlesHypo.TrigdEdxTrackTriggerHypoTool   import TrigdEdxTrackTriggerHypoToolFromDict
-        from TrigLongLivedParticlesHypo.TrigLongLivedParticlesHypoConf import (TrigdEdxTrackTriggerHypoAlg)
-
-        # Setup the hypothesis algorithm
-        thedEdxTrackTriggerHypo = TrigdEdxTrackTriggerHypoAlg("dEdxTrack")
-
-        from TrigEDMConfig.TriggerEDMRun3 import recordable
-        thedEdxTrackTriggerHypo.HPtdEdxTrk = recordable("HLT_HPtdEdxTrk")
+        from TrigLongLivedParticlesHypo.TrigdEdxTrackHypoConfig import TrigdEdxTrackHypoToolFromDict
+        from TrigLongLivedParticlesHypo.TrigdEdxTrackHypoConfig import createTrigdEdxTrackHypoAlg
+        
+        thedEdxTrackHypo = createTrigdEdxTrackHypoAlg("dEdxTrack")
 
         from AthenaConfiguration.ComponentAccumulator import conf2toConfigurable
         from AthenaConfiguration.ComponentFactory import CompFactory
         DummyInputMakerAlg = conf2toConfigurable(CompFactory.InputMakerForRoI( "IM_dEdxTrack_HypoOnlyStep" ))
         DummyInputMakerAlg.RoITool = conf2toConfigurable(CompFactory.ViewCreatorInitialROITool())
 
-        log.debug("Building the Step dictinary for dEdx")
         return MenuSequence( Sequence    = seqAND("dEdxEmptyStep",[DummyInputMakerAlg]),
                              Maker       = DummyInputMakerAlg,
-                             Hypo        = thedEdxTrackTriggerHypo,
-                             HypoToolGen = TrigdEdxTrackTriggerHypoToolFromDict,
-                         )
+                             Hypo        = thedEdxTrackHypo,
+                             HypoToolGen = TrigdEdxTrackHypoToolFromDict,
+                     )