From e96a5f4174888ce772b8b70fc276b931c2379fda Mon Sep 17 00:00:00 2001
From: Qichen Dong <qichen.dong@cern.ch>
Date: Mon, 17 Mar 2025 15:19:49 +0000
Subject: [PATCH 1/8] picking Trigger part

---
 .../TrigDitauHypo/ATLAS_CHECK_THREAD_SAFETY   |   1 +
 .../TrigDitauHypo/CMakeLists.txt              |  16 ++
 .../TrigDitauHypo/python/TrigDiTauHypoTool.py |  36 ++++
 .../TrigDitauHypo/src/ITrigDiTauHypoTool.h    |  34 ++++
 .../TrigDitauHypo/src/TrigDiTauHypoAlg.cxx    | 103 ++++++++++
 .../TrigDitauHypo/src/TrigDiTauHypoAlg.h      |  28 +++
 .../TrigDitauHypo/src/TrigDiTauHypoTool.cxx   |  70 +++++++
 .../TrigDitauHypo/src/TrigDiTauHypoTool.h     |  29 +++
 .../src/components/TrigDiTauHypo_entries.cxx  |   6 +
 .../TriggerEDMAuxAccessors.h                  |  42 ++++-
 .../TrigOutputHandling/src/HLTEDMCreator.cxx  |   3 +
 .../TrigOutputHandling/src/HLTEDMCreator.h    |   2 +
 .../python/BuildSignatureFlags.py             |  20 ++
 .../test_trig_mc_v1Dev_slice_ditau_build.py   |  31 +++
 .../test_trig_mc_v1Dev_slice_ditau_grid.py    |  44 +++++
 .../TrigEDMConfig/python/TriggerEDMRun3.py    |  20 ++
 .../python/HLT/Config/GenerateMenuMT.py       |   5 +-
 .../HLT/Config/Utility/DictFromChainName.py   |  33 +++-
 .../HLT/Ditau/DitauChainConfiguration.py      |  35 ++++
 .../python/HLT/Ditau/DitauConfigFlagsHLT.py   |  25 +++
 .../python/HLT/Ditau/DitauMenuSequences.py    | 178 ++++++++++++++++++
 .../HLT/Ditau/GenerateDitauChainDefs.py       |  35 ++++
 .../python/HLT/Ditau/__init__.py              |   0
 .../python/HLT/Menu/Dev_pp_run3_v1.py         |  32 ++++
 .../python/HLT/Menu/Physics_pp_run3_v1.py     |   1 +
 .../python/HLT/Menu/SignatureDicts.py         |  20 +-
 26 files changed, 839 insertions(+), 10 deletions(-)
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/ATLAS_CHECK_THREAD_SAFETY
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/CMakeLists.txt
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/python/TrigDiTauHypoTool.py
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/src/ITrigDiTauHypoTool.h
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.h
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.h
 create mode 100644 Trigger/TrigHypothesis/TrigDitauHypo/src/components/TrigDiTauHypo_entries.cxx
 create mode 100755 Trigger/TrigValidation/TriggerTest/test/test_trig_mc_v1Dev_slice_ditau_build.py
 create mode 100755 Trigger/TrigValidation/TriggerTest/test/test_trig_mc_v1Dev_slice_ditau_grid.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauChainConfiguration.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/GenerateDitauChainDefs.py
 create mode 100644 Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/__init__.py

diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/ATLAS_CHECK_THREAD_SAFETY b/Trigger/TrigHypothesis/TrigDitauHypo/ATLAS_CHECK_THREAD_SAFETY
new file mode 100644
index 000000000000..77271e1ef846
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/ATLAS_CHECK_THREAD_SAFETY
@@ -0,0 +1 @@
+Trigger/TrigHypothesis/TrigDitauHypo
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/CMakeLists.txt b/Trigger/TrigHypothesis/TrigDitauHypo/CMakeLists.txt
new file mode 100644
index 000000000000..11fd8c37b893
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/CMakeLists.txt
@@ -0,0 +1,16 @@
+# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+
+# Declare the package name:
+atlas_subdir( TrigDitauHypo )
+
+# External dependencies:
+find_package( ROOT COMPONENTS Core MathCore )
+
+# Component(s) in the package:
+atlas_add_component( TrigDitauHypo
+                     src/*.cxx src/components/*.cxx
+                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} AthViews AthenaBaseComps AthenaMonitoringKernelLib CxxUtils DecisionHandlingLib GaudiKernel TrigCompositeUtilsLib TrigSteeringEvent TrkTrack TrkTrackSummary xAODBase xAODCaloEvent xAODTau xAODTracking xAODTrigger )
+
+# Install files from the package:
+atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} --extend-extensions=ATL900,ATL901 )
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/python/TrigDiTauHypoTool.py b/Trigger/TrigHypothesis/TrigDitauHypo/python/TrigDiTauHypoTool.py
new file mode 100644
index 000000000000..12ca371d3c4a
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/python/TrigDiTauHypoTool.py
@@ -0,0 +1,36 @@
+# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+import re
+from AthenaCommon.SystemOfUnits import GeV
+
+from AthenaCommon.Logging import logging
+log = logging.getLogger('TrigHLTDiTauHypoTool')
+
+
+def TrigDiTauHypoToolFromDict(flags, chainDict):
+    name = chainDict['chainName']
+    chainPart = chainDict['chainParts'][0]
+    cut_pt = float(chainPart['threshold']) * GeV
+    ditau_tag_str = chainPart['ditauTag']
+    pattern = r"ditauOmni([0-9])Trk([0-9]{2})"
+    match = re.match(pattern, ditau_tag_str)
+    if match is None:
+        log.error(f"Invalid ditau tag: {ditau_tag_str}")
+        raise ValueError(f"Invalid ditau tag: {ditau_tag_str}")
+    id_cut = float(match.group(1))/10
+    n_trk_lead = int(match.group(2)[0])
+    n_trk_subl = int(match.group(2)[1])
+    if n_trk_lead < 3 or n_trk_subl < 3:
+        log.error(f"Invalid ditau tag: {ditau_tag_str}")
+        log.error("it doesn't make sense to require less than 3 tracks in a ditau subjet")
+        raise ValueError(f"Invalid ditau tag: {ditau_tag_str}")
+
+    from AthenaConfiguration.ComponentFactory import CompFactory
+    currentHypo = CompFactory.TrigDiTauHypoTool(
+        name,
+        ditau_pt_threshold=cut_pt,
+        ditau_id_score=id_cut,
+        ditau_lead_max_trk=n_trk_lead,
+        ditau_subl_max_trk=n_trk_subl,
+    )
+    
+    return currentHypo
\ No newline at end of file
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/ITrigDiTauHypoTool.h b/Trigger/TrigHypothesis/TrigDitauHypo/src/ITrigDiTauHypoTool.h
new file mode 100644
index 000000000000..a4801be8e2c9
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/ITrigDiTauHypoTool.h
@@ -0,0 +1,34 @@
+/*
+  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
+*/
+#pragma once
+
+#include "AsgTools/IAsgTool.h"
+#include "xAODTau/DiTauJetContainer.h"
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "TrigCompositeUtils/HLTIdentifier.h"
+
+
+class ITrigDiTauHypoTool : virtual public::IAlgTool {
+    
+public:
+    DeclareInterfaceID(ITrigDiTauHypoTool, 1, 0);
+
+
+    virtual ~ITrigDiTauHypoTool(){};
+    struct ToolInfo {
+            TrigCompositeUtils::Decision* decision;
+            const TrigRoiDescriptor* roi;
+            const xAOD::DiTauJetContainer* diTauContainer;
+            const TrigCompositeUtils::DecisionIDContainer previousDecisionIDs;
+            ToolInfo(TrigCompositeUtils::Decision* d, const TrigRoiDescriptor* r, const xAOD::DiTauJetContainer *c, const TrigCompositeUtils::Decision* previousDecision)
+            : previousDecisionIDs(TrigCompositeUtils::decisionIDs(previousDecision).begin(), TrigCompositeUtils::decisionIDs(previousDecision).end())
+            {
+                decision = d;
+                roi = r;
+                diTauContainer = c;
+            }
+};
+  virtual StatusCode decide(std::vector<ToolInfo>& input) const = 0;
+  virtual bool decide(const ToolInfo& i) const = 0;
+};
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.cxx b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.cxx
new file mode 100644
index 000000000000..d836946ab471
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.cxx
@@ -0,0 +1,103 @@
+/*
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "TrigSteeringEvent/TrigRoiDescriptorCollection.h"
+#include "AthViews/ViewHelper.h"
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+
+#include "TrigDiTauHypoAlg.h"
+
+
+using namespace TrigCompositeUtils;
+
+TrigDiTauHypoAlg::TrigDiTauHypoAlg(const std::string& name, ISvcLocator* pSvcLocator)
+    : ::HypoBase(name, pSvcLocator)
+{}
+
+
+StatusCode TrigDiTauHypoAlg::initialize() {
+    ATH_CHECK(m_hypoTools.retrieve());
+    ATH_CHECK(m_DiTauJets_key.initialize());
+
+    // TauJet are made in views, so they are not in the EvtStore: hide them
+    renounce(m_DiTauJets_key);
+
+    return StatusCode::SUCCESS;
+}
+
+
+StatusCode TrigDiTauHypoAlg::execute(const EventContext& context) const
+{
+    ATH_MSG_DEBUG("Executing " << name());
+
+    // Retrieve previous decisions from the previous step
+    SG::ReadHandle<DecisionContainer> previousDecisionsHandle = SG::makeHandle(decisionInput(), context);
+    if(!previousDecisionsHandle.isValid()) {
+        ATH_MSG_DEBUG("No implicit RH for previous decisions " << decisionInput().key() << ": is this expected?");
+        return StatusCode::SUCCESS;
+    }
+
+    ATH_MSG_DEBUG("Running with " << previousDecisionsHandle->size() << " previous decisions");
+
+
+    // Create output decision handle
+    SG::WriteHandle<DecisionContainer> outputHandle = createAndStore(decisionOutput(), context);
+
+
+    // Prepare inputs for the decision tools
+    std::vector<ITrigDiTauHypoTool::ToolInfo> toolInput;
+    int counter = -1;
+    for(const xAOD::TrigComposite* previousDecision : *previousDecisionsHandle) {
+        counter++;
+
+        // Get View
+        const ElementLink<ViewContainer> viewEL = previousDecision->objectLink<ViewContainer>(viewString());
+        ATH_CHECK(viewEL.isValid());
+
+        // Get RoI
+        LinkInfo<TrigRoiDescriptorCollection> roiEL = findLink<TrigRoiDescriptorCollection>(previousDecision, roiString());
+        ATH_CHECK(roiEL.isValid());
+        const TrigRoiDescriptor* roi = *roiEL.link;
+
+        // Get TauJet
+        SG::ReadHandle<xAOD::DiTauJetContainer> diTauHandle = ViewHelper::makeHandle(*viewEL, m_DiTauJets_key, context);
+        if(!diTauHandle.isValid()) {
+            ATH_MSG_WARNING("Something is wrong, missing TauJet container! Continuing anyways skipping view");
+            continue;
+        }
+        ATH_MSG_DEBUG("Tau handle size: " << diTauHandle->size());
+        if(diTauHandle->size() != 1) {
+            ATH_MSG_DEBUG("Something is wrong, an unexpected number of taus was found (expected 1), continuing anyways skipping view");
+            continue;
+        }
+
+
+        // Create new decision
+        Decision* newDecision = newDecisionIn(outputHandle.ptr(), hypoAlgNodeName());
+        TrigCompositeUtils::linkToPrevious(newDecision, decisionInput().key(), counter);
+        newDecision->setObjectLink(roiString(), roiEL.link);
+
+        ElementLink<xAOD::DiTauJetContainer> newDiTauEL = ViewHelper::makeLink(*viewEL, diTauHandle, 0);
+        ATH_CHECK(newDiTauEL.isValid());
+        newDecision->setObjectLink(featureString(), newDiTauEL);
+
+        // Create tool input
+        toolInput.emplace_back(newDecision, roi, diTauHandle.cptr(), previousDecision);
+
+        ATH_MSG_DEBUG("Added view, roi, tau, previous decision to new decision (" << counter << ") for view " << (*viewEL)->name());
+    }
+
+    ATH_MSG_DEBUG("Found " << toolInput.size() << " inputs to tools");
+
+
+    // Execute decisions from all tools
+    for(auto& tool : m_hypoTools) {
+        ATH_CHECK(tool->decide(toolInput));
+    }
+
+ 
+    ATH_CHECK(hypoBaseOutputProcessing(outputHandle));
+
+    return StatusCode::SUCCESS;
+}
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.h b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.h
new file mode 100644
index 000000000000..8af29a173d5a
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.h
@@ -0,0 +1,28 @@
+/*
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+*/
+
+#pragma once
+
+#include "DecisionHandling/HypoBase.h"
+#include "xAODTau/DiTauJetContainer.h"
+
+#include "ITrigDiTauHypoTool.h"
+
+
+/**
+ * @class TrigDiTauHypoAlg
+ * @brief HLT Precision step TauJet selection hypothesis algorithm
+ **/
+class TrigDiTauHypoAlg : public ::HypoBase
+{
+public: 
+    TrigDiTauHypoAlg(const std::string& name, ISvcLocator* pSvcLocator);
+
+    virtual StatusCode initialize() override;
+    virtual StatusCode execute(const EventContext& context) const override;
+
+private: 
+    ToolHandleArray<ITrigDiTauHypoTool> m_hypoTools {this, "HypoTools", {}, "Hypo tools"};
+    SG::ReadHandleKey<xAOD::DiTauJetContainer> m_DiTauJets_key {this, "DiTauJets_key", "", "DiTauJets in view" };
+};
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.cxx b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.cxx
new file mode 100644
index 000000000000..93e24ef42a26
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.cxx
@@ -0,0 +1,70 @@
+/*
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "AthenaMonitoringKernel/Monitored.h"
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "xAODTau/TauJetContainer.h"
+#include "GaudiKernel/SystemOfUnits.h"
+
+#include "TrigDiTauHypoTool.h"
+
+
+using namespace TrigCompositeUtils;
+
+TrigDiTauHypoTool::TrigDiTauHypoTool(const std::string& type, const std::string& name, const IInterface* parent)
+  : base_class(type, name, parent), 
+    m_decisionId(HLT::Identifier::fromToolName(name))
+{}
+
+
+TrigDiTauHypoTool::~TrigDiTauHypoTool()
+{}
+
+
+StatusCode TrigDiTauHypoTool::initialize()
+{
+    ATH_MSG_DEBUG(name() << ": in initialize()");
+
+    ATH_MSG_DEBUG("TrigDiTauHypoTool will cut on:");
+    ATH_MSG_DEBUG(" - PtMin       : " << m_ditau_pt_threshold.value());
+    ATH_MSG_DEBUG(" - ID Score    : " << m_ditau_omni_score.value());
+    ATH_MSG_DEBUG(" - Max Lead Trk: " << m_ditau_lead_max_trk.value());
+    ATH_MSG_DEBUG(" - Max Subl Trk: " << m_ditau_subl_max_trk.value());
+    return StatusCode::SUCCESS;
+}
+
+
+bool TrigDiTauHypoTool::decide(const ITrigDiTauHypoTool::ToolInfo& input) const
+{
+    static const SG::ConstAccessor<     int > n_tracks_leadAcc("n_tracks_lead");
+    static const SG::ConstAccessor<     int > n_tracks_sublAcc("n_tracks_subl");
+    static const SG::ConstAccessor<   float > ditau_ptAcc     ("ditau_pt");
+    static const SG::ConstAccessor<   float > omni_scoreAcc   ("omni_score");
+    ATH_MSG_DEBUG(name() << ": in execute()");
+    // Tau pass flag
+    bool pass = false;
+    for(const xAOD::DiTauJet* diTau : *(input.diTauContainer)) {
+        if(ditau_ptAcc(*diTau) < m_ditau_pt_threshold.value()) continue;
+        if(omni_scoreAcc(*diTau) < m_ditau_omni_score.value()) continue;
+        if(n_tracks_leadAcc(*diTau) > m_ditau_lead_max_trk.value() || n_tracks_leadAcc(*diTau) < 0) continue;
+        if(n_tracks_sublAcc(*diTau) > m_ditau_subl_max_trk.value() || n_tracks_sublAcc(*diTau) < 0) continue;
+        pass = true;
+    }
+    ATH_MSG_DEBUG(" Pass hypo tool: " << pass);
+    return pass;
+}
+
+
+StatusCode TrigDiTauHypoTool::decide(std::vector<ITrigDiTauHypoTool::ToolInfo>& input) const {
+    for(auto& i : input) {
+        if(passed(m_decisionId.numeric(), i.previousDecisionIDs)) {
+            if(decide(i)) {
+	            addDecisionID(m_decisionId, i.decision);
+            }
+        }
+    }
+
+    return StatusCode::SUCCESS;
+}
+
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.h b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.h
new file mode 100644
index 000000000000..2591bc486ed4
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.h
@@ -0,0 +1,29 @@
+/*
+  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
+*/
+
+#pragma once
+
+#include "TrigCompositeUtils/HLTIdentifier.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "TrigCompositeUtils/TrigCompositeUtils.h"
+#include "AthenaMonitoringKernel/GenericMonitoringTool.h"
+
+#include "xAODTau/DiTauJetContainer.h"
+#include "ITrigDiTauHypoTool.h"
+
+class TrigDiTauHypoTool: public extends<AthAlgTool, ITrigDiTauHypoTool>  {
+    public:
+        TrigDiTauHypoTool(const std::string& type, const std::string& name, const IInterface* parent);
+        virtual ~TrigDiTauHypoTool();
+        virtual StatusCode initialize() override;
+        virtual StatusCode decide(std::vector<ITrigDiTauHypoTool::ToolInfo>& input) const override;
+        virtual bool decide(const ITrigDiTauHypoTool::ToolInfo& i) const override;
+    private:
+        HLT::Identifier m_decisionId;
+        Gaudi::Property<float> m_ditau_pt_threshold {this, "ditau_pt_threshold", 200, "ditau pT threshold [GeV]" };
+        Gaudi::Property<float> m_ditau_omni_score   {this, "ditau_id_score",     0.0, "ditau omni id score" };
+        Gaudi::Property<int>   m_ditau_lead_max_trk {this, "ditau_lead_max_trk", 3,   "ditau lead track multiplicity" };
+        Gaudi::Property<int>   m_ditau_subl_max_trk {this, "ditau_subl_max_trk", 3,   "ditau sublead track multiplicity" };
+};
+
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/components/TrigDiTauHypo_entries.cxx b/Trigger/TrigHypothesis/TrigDitauHypo/src/components/TrigDiTauHypo_entries.cxx
new file mode 100644
index 000000000000..006da9d72774
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/components/TrigDiTauHypo_entries.cxx
@@ -0,0 +1,6 @@
+#include "../TrigDiTauHypoAlg.h"
+#include "../TrigDiTauHypoTool.h"
+
+DECLARE_COMPONENT( TrigDiTauHypoAlg )
+DECLARE_COMPONENT( TrigDiTauHypoTool )
+
diff --git a/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h b/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
index 2743222d96c9..c6892b070a11 100644
--- a/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
+++ b/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
@@ -52,7 +52,12 @@ auto intAccessors = initAccessors<int>(
   "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","NumPV", "nRoIs",
-  "l1a_type", "other_type", "beforeafterflag","pass");
+  "l1a_type", "other_type", "beforeafterflag","pass",
+  "n_isotrack",
+  "n_track",
+  "n_tracks_lead",
+  "n_tracks_subl"
+  );
 
 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",
@@ -187,7 +192,40 @@ auto floatAccessors = initAccessors<float>(
   "ClusterEta", "ClusterPhi",
   "d0TJVA", "d0SigTJVA", "z0sinthetaTJVA", "z0sinthetaSigTJVA",
   "GNTau_Score", "GNTau_ScoreSigTrans", 
-  "pixQ2mod"
+  "pixQ2mod",
+  "E_frac_subl",
+  "E_frac_subsubl",
+  "R_core_lead",
+  "R_core_subl",
+  "R_isotrack",
+  "R_max_lead",
+  "R_max_subl",
+  "R_subjets_subl",
+  "R_subjets_subsubl",
+  "R_track",
+  "R_track_all",
+  "R_track_core",
+  "R_tracks_lead",
+  "R_tracks_subl",
+  "d0_leadtrack_lead",
+  "d0_leadtrack_subl",
+  "ditau_pt",
+  "f_core_lead",
+  "f_core_subl",
+  "f_isotracks",
+  "f_subjet_lead",
+  "f_subjet_subl",
+  "f_subjets",
+  "f_track_lead",
+  "f_track_subl",
+  "m_core_lead",
+  "m_core_subl",
+  "m_track",
+  "m_track_all",
+  "m_track_core",
+  "m_tracks_lead",
+  "m_tracks_subl",
+  "omni_score"
   );
 
 auto doubleAccessors = initAccessors<double>("ptcone02", "ptcone03", "JetDensityEMPFlow",
diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx
index 8c10a3990c70..bb6c8847b89c 100644
--- a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx
+++ b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.cxx
@@ -28,6 +28,7 @@
 #include "xAODTrigMuon/L2IsoMuonAuxContainer.h"
 #include "xAODMuon/MuonAuxContainer.h"
 #include "xAODTau/TauJetAuxContainer.h"
+#include "xAODTau/DiTauJetAuxContainer.h"
 #include "xAODTau/TauTrackAuxContainer.h"
 #include "xAODJet/JetAuxContainer.h"
 #include "xAODTracking/VertexAuxContainer.h"
@@ -154,6 +155,7 @@ StatusCode HLTEDMCreator::initialize()
   INIT_XAOD( L2IsoMuonContainer, L2IsoMuonAuxContainer );
   INIT_XAOD( MuonContainer, MuonAuxContainer );
   INIT_XAOD( TauJetContainer, TauJetAuxContainer );
+  INIT_XAOD( DiTauJetContainer, DiTauJetAuxContainer );
   INIT_XAOD( TauTrackContainer, TauTrackAuxContainer );
   INIT_XAOD( JetContainer, JetAuxContainer );
   INIT_XAOD( VertexContainer, VertexAuxContainer );
@@ -496,6 +498,7 @@ StatusCode HLTEDMCreator::createOutput(const EventContext& context) const {
   CREATE_XAOD( L2IsoMuonContainer, L2IsoMuonAuxContainer );
   CREATE_XAOD( MuonContainer, MuonAuxContainer );
   CREATE_XAOD( TauJetContainer, TauJetAuxContainer );
+  CREATE_XAOD( DiTauJetContainer, DiTauJetAuxContainer );
   CREATE_XAOD( TauTrackContainer, TauTrackAuxContainer );
   CREATE_XAOD( CaloClusterContainer, CaloClusterTrigAuxContainer ); // NOTE: Difference in interface and aux
   CREATE_XAOD( JetContainer, JetAuxContainer );
diff --git a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.h b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.h
index 3d4b6740b3ac..5be32de2a4d0 100644
--- a/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.h
+++ b/Trigger/TrigSteer/TrigOutputHandling/src/HLTEDMCreator.h
@@ -35,6 +35,7 @@
 #include "xAODTrigMuon/L2IsoMuonContainer.h"
 #include "xAODMuon/MuonContainer.h"
 #include "xAODTau/TauJetContainer.h"
+#include "xAODTau/DiTauJetContainer.h"
 #include "xAODTau/TauTrackContainer.h"
 #include "xAODJet/JetContainer.h"
 #include "xAODTracking/VertexContainer.h"
@@ -136,6 +137,7 @@ class HLTEDMCreator: public extends<AthAlgTool, IHLTOutputTool>  {
   DEF_XAOD_KEY( L2IsoMuonContainer );
   DEF_XAOD_KEY( MuonContainer );
   DEF_XAOD_KEY( TauJetContainer );
+  DEF_XAOD_KEY( DiTauJetContainer );
   DEF_XAOD_KEY( TauTrackContainer );
   DEF_XAOD_KEY( CaloClusterContainer );
   DEF_XAOD_KEY( JetContainer );
diff --git a/Trigger/TrigTools/TrigInDetConfig/python/BuildSignatureFlags.py b/Trigger/TrigTools/TrigInDetConfig/python/BuildSignatureFlags.py
index 69683e2213e4..3c7e51c0232e 100644
--- a/Trigger/TrigTools/TrigInDetConfig/python/BuildSignatureFlags.py
+++ b/Trigger/TrigTools/TrigInDetConfig/python/BuildSignatureFlags.py
@@ -170,6 +170,8 @@ def signatureTrigTrackingFlags(mode : str) -> AthConfigFlags:
     "tauCore"       : tauCore,
     "tauIso"        : tauIso,
     
+    "ditau"         : ditau,
+    
     "bjet"          : bjet,
     
     "fullScan"      : fullScan,
@@ -331,6 +333,24 @@ def tauIso(flags: AthConfigFlags, instanceName: str, recoMode: str) -> AthConfig
   flags.minPT = tsetter(flags.minPT, flags.pTmin)
   return flags
 
+@signatureActions
+def ditau(flags: AthConfigFlags, instanceName: str, recoMode: str) -> AthConfigFlags:
+  
+  flags.input_name = instanceName
+  flags.name     = "ditau"
+  flags.suffix   = "ditau"
+  flags.roi      = "HLT_Roi_ditau"
+  flags.etaHalfWidth   = 1.0
+  flags.phiHalfWidth   = 1.0
+  flags.zedHalfWidth   = 7.0
+  flags.adaptiveVertex = True
+  flags.addSingleTrackVertices = True
+  flags.vertex         = "HLT_IDVertex_ditau"
+  flags.electronPID    = False
+  flags.pTmin          = 0.8*Units.GeV
+  flags.minPT = tsetter(flags.minPT, flags.pTmin)
+  return flags
+
 @signatureActions
 def bjet(flags: AthConfigFlags, instanceName: str, recoMode: str) -> AthConfigFlags:
 
diff --git a/Trigger/TrigValidation/TriggerTest/test/test_trig_mc_v1Dev_slice_ditau_build.py b/Trigger/TrigValidation/TriggerTest/test/test_trig_mc_v1Dev_slice_ditau_build.py
new file mode 100755
index 000000000000..75e69871320a
--- /dev/null
+++ b/Trigger/TrigValidation/TriggerTest/test/test_trig_mc_v1Dev_slice_ditau_build.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
+
+# art-description: Trigger RDO->RDO_TRIG athena test of the tau slice in Dev_pp_run3_v1 menu
+# art-type: build
+# art-include: main/Athena
+# art-include: 24.0/Athena
+# Skipping art-output which has no effect for build tests.
+# If you create a grid version, check art-output in existing grid tests.
+
+from TrigValTools.TrigValSteering import Test, ExecStep, CheckSteps
+
+from AthenaConfiguration.TestDefaults import defaultConditionsTags
+conditions = defaultConditionsTags.RUN3_MC
+
+ex = ExecStep.ExecStep()
+ex.type = 'athena'
+ex.job_options = 'TriggerJobOpts/runHLT.py'
+ex.input = 'ttbar'
+ex.threads = 1
+ex.flags = ['Trigger.triggerMenuSetup="Dev_pp_run3_v1"',
+            'IOVDb.GlobalTag="' + conditions + '"',
+            'Trigger.enabledSignatures=[\\\"Ditau\\\"]']
+
+test = Test.Test()
+test.art_type = 'build'
+test.exec_steps = [ex]
+test.check_steps = CheckSteps.default_check_steps(test)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TrigValidation/TriggerTest/test/test_trig_mc_v1Dev_slice_ditau_grid.py b/Trigger/TrigValidation/TriggerTest/test/test_trig_mc_v1Dev_slice_ditau_grid.py
new file mode 100755
index 000000000000..0627b5f925c0
--- /dev/null
+++ b/Trigger/TrigValidation/TriggerTest/test/test_trig_mc_v1Dev_slice_ditau_grid.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
+
+# art-description: Trigger RDO->RDO_TRIG athena test of the egamma slice in Dev_pp_run3_v1 menu
+# art-type: grid
+# art-include: main/Athena
+# art-include: 24.0/Athena
+# art-athena-mt: 8
+# art-output: *.txt
+# art-output: *.log
+# art-output: log.*
+# art-output: *.out
+# art-output: *.err
+# art-output: *.log.tar.gz
+# art-output: *.new
+# art-output: *.json
+# art-output: *.root
+# art-output: *.pmon.gz
+# art-output: *perfmon*
+# art-output: prmon*
+# art-output: *.check*
+
+from TrigValTools.TrigValSteering import Test, ExecStep, CheckSteps
+
+from AthenaConfiguration.TestDefaults import defaultConditionsTags
+conditions = defaultConditionsTags.RUN3_MC
+
+ex = ExecStep.ExecStep()
+ex.type = 'athena'
+ex.job_options = 'TriggerJobOpts/runHLT.py'
+ex.input = 'ttbar'
+ex.threads = 8
+ex.concurrent_events = 8
+ex.flags = ['Trigger.triggerMenuSetup="Dev_pp_run3_v1"',
+            'IOVDb.GlobalTag="' + conditions + '"',
+            'Trigger.enabledSignatures=[\\\"Ditau\\\"]']
+
+test = Test.Test()
+test.art_type = 'grid'
+test.exec_steps = [ex]
+test.check_steps = CheckSteps.default_check_steps(test)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
index ecb92f4ddc69..4c3c01c303b1 100644
--- a/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
+++ b/Trigger/TriggerCommon/TrigEDMConfig/python/TriggerEDMRun3.py
@@ -228,6 +228,12 @@ TauJet_vars_str = '.'.join(TauJet_vars)
 TauTrack_vars = ['pt', 'eta', 'phi', 'flagSet', 'trackLinks', 'd0TJVA', 'd0SigTJVA', 'z0sinthetaTJVA', 'z0sinthetaSigTJVA']
 TauTrack_vars_str = '.'.join(TauTrack_vars)
 
+# ===========
+# == ditau ==
+DiTauJet_vars = ['pt', 'eta', 'phi', 'm', 'TauJetVtxFraction', 'subjet_pt', 'subjet_phi', 'subjet_e', 'subjet_f_core', 'subjet_eta', 'isoTrackLinks', 'jetLink', 'vertexLink', 'trackLinks']
+DiTauJet_vars += ["ditau_pt", "f_core_lead", "f_core_subl", "f_subjet_lead", "f_subjet_subl", "f_subjets", "f_track_lead", "f_track_subl", "R_max_lead", "R_max_subl", "n_track", "n_tracks_lead", "n_tracks_subl", "n_isotrack", "R_track", "R_track_core", "R_track_all", "R_isotrack", "R_core_lead", "R_core_subl", "R_tracks_lead", "R_tracks_subl", "m_track", "m_track_core", "m_core_lead", "m_core_subl", "m_track_all", "m_tracks_lead", "m_tracks_subl", "E_frac_subl", "E_frac_subsubl", "R_subjets_subl", "R_subjets_subsubl", "d0_leadtrack_lead", "d0_leadtrack_subl", "f_isotracks", "omni_score"]
+DiTauJet_vars_str = '.'.join(DiTauJet_vars)
+
 # ===========
 # === LLP ===
 MuRoiToKeep = ['ClusterEta','ClusterPhi','nRoIs']
@@ -288,6 +294,7 @@ TriggerHLTListRun3 = [
     ('TrigRoiDescriptorCollection#HLT_METRoI',                   'BS ESD AODFULL AODSLIM',  'Steer'),
     ('TrigRoiDescriptorCollection#HLT_JETRoI',                   'BS ESD AODFULL AODSLIM',  'Steer'),
     ('TrigRoiDescriptorCollection#HLT_TAURoI',                   'BS ESD AODFULL AODSLIM',  'Steer'),
+    ('TrigRoiDescriptorCollection#HLT_DitauRoI',                 'BS ESD AODFULL AODSLIM',  'Steer'),
 
     # xAOD::TrigCompositeContainer#HLTNav_Summary is now transient-only
     ('xAOD::TrigCompositeContainer#HLTNav_Summary_OnlineSlimmed', 'BS ESD', 'Steer'), 
@@ -708,6 +715,12 @@ TriggerHLTListRun3 = [
     ('xAOD::JetContainer#HLT_jet_seed',                         '', 'Tau', [InViews('tauCaloMVAViews')]),
     ('xAOD::JetAuxContainer#HLT_jet_seedAux.',                  '', 'Tau'),
 
+    #ditau
+    ('xAOD::TrackParticleContainer#HLT_IDTrack_ditau_FTF',                      'BS ESD AODFULL AODSLIM', 'Ditau', [InViews('DitauViews')]),
+    ('xAOD::TrackParticleAuxContainer#HLT_IDTrack_ditau_FTFAux.',               'BS ESD AODFULL AODSLIM', 'Ditau'),
+    ('xAOD::TrackParticleContainer#HLT_IDTrack_ditau_IDTrig',                   'BS ESD AODFULL AODSLIM', 'Ditau', [InViews('DitauViews')]),
+    ('xAOD::TrackParticleAuxContainer#HLT_IDTrack_ditau_IDTrigAux.',            'BS ESD AODFULL AODSLIM', 'Ditau'),
+
     # Jet
     ('xAOD::JetContainer#HLT_AntiKt4EMTopoJets_subjesIS',                        'BS ESD AODFULL AODSLIM', 'Jet', [Alias('JetContainerShallowCopy')]),
     ('xAOD::ShallowAuxContainer#HLT_AntiKt4EMTopoJets_subjesISAux.'+JetCopyVars, 'BS ESD AODFULL AODSLIM', 'Jet'),
@@ -814,6 +827,9 @@ TriggerHLTListRun3 = [
     ('xAOD::JetContainer#HLT_AntiKt4EMPFlowCSSKJets_nojcalib_ftf',                '', 'Jet'),
     ('xAOD::JetAuxContainer#HLT_AntiKt4EMPFlowCSSKJets_nojcalib_ftfAux.'+JetVars, '', 'Jet'),
 
+    ('xAOD::JetContainer#HLT_AntiKt10EMPFlowCSSKSoftDropBeta100Zcut10Jets_jes_ftf_Ditau_jets',                        'BS ESD AODFULL', 'Jet'),
+    ('xAOD::JetAuxContainer#HLT_AntiKt10EMPFlowCSSKSoftDropBeta100Zcut10Jets_jes_ftf_Ditau_jetsAux.'+JetVars,         'BS ESD AODFULL', 'Jet'),
+
     ## event info
     ('xAOD::TrigCompositeContainer#HLT_TCEventInfo_jet',                                 'BS ESD AODFULL', 'Jet' ),
     ('xAOD::TrigCompositeAuxContainer#HLT_TCEventInfo_jetAux.JetDensityEMPFlow.AvgMu.NumPV',         'BS ESD AODFULL', 'Jet'    ),
@@ -996,6 +1012,10 @@ TriggerHLTListRun3 = [
     ('xAOD::TauTrackContainer#HLT_tautrack_LRT',                                'BS ESD AODFULL AODSLIM', 'Tau', [InViews('precLRTTauViews'), InViews('tauPrecisionReco_LRTViews')]),
     ('xAOD::TauTrackAuxContainer#HLT_tautrack_LRTAux.'+TauTrack_vars_str,       'BS ESD AODFULL AODSLIM', 'Tau'),
 
+    # ditau
+    ('xAOD::DiTauJetContainer#HLT_DiTauJets',                                   'BS ESD AODFULL AODSLIM', 'Ditau', [InViews('DitauViews')]),
+    ('xAOD::DiTauJetAuxContainer#HLT_DiTauJetsAux.'+DiTauJet_vars_str,          'BS ESD AODFULL AODSLIM', 'Ditau'),
+
     # bjet RoI Descriptor used for EventView creation
     ('TrigRoiDescriptorCollection#HLT_Roi_Bjet',                   'BS ESD AODFULL', 'Bjet'),
 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
index a6e397fe9d2e..ad4f62734940 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
@@ -15,7 +15,7 @@ def calibCosmicMonSignatures():
     return ['Streaming','Monitor','Beamspot','Cosmic', 'Calib', 'EnhancedBias']
 
 def combinedSignatures():
-    return ['MinBias','Electron','Photon','Muon','Tau','Jet', 'Bjet','MET','UnconventionalTracking','HeavyIon']
+    return ['MinBias','Electron','Photon','Muon','Tau', 'Ditau','Jet', 'Bjet','MET','UnconventionalTracking','HeavyIon']
 
 def jointSignatures():
     return ['Bjet', 'Egamma', 'Combined']
@@ -93,6 +93,7 @@ class GenerateMenuMT(metaclass=Singleton):
         signatureDeps.update({
             # Bjet always requires jet
             'Bjet': ['Bjet','Jet'],
+            'Ditau' : ['Ditau','Jet'],
             # Egamma contains two signatures
             'Egamma': ['Electron','Photon'],
             'Combined': combinedSignatures(),
@@ -403,7 +404,7 @@ class GenerateMenuMT(metaclass=Singleton):
             if currentSig in self.availableSignatures:
                 try:
                     log.debug("[__generateChainConfigs] Trying to get chain config for %s", currentSig)
-                    if currentSig in ['Electron', 'Photon', 'Muon', 'Tau', 'Bphysics'] :
+                    if currentSig in ['Electron', 'Photon', 'Muon', 'Tau', 'Bphysics', 'Ditau'] :
                         chainPartConfig, perSig_lengthOfChainConfigs = self.chainDefModule[currentSig].generateChainConfigs(flags, chainPartDict, perSig_lengthOfChainConfigs)
                     else:
                         chainPartConfig = self.chainDefModule[currentSig].generateChainConfigs(flags, chainPartDict)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
index a75ccfc87d01..af4da6dc823b 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
@@ -175,7 +175,7 @@ def unifyJetRecoParts(chainParts):
     jetDefaults, _ = getSignatureInformation('Jet')
     # Extract the jet chainParts, and get the reco specs from the last one
     _jetRecoKeys = JetRecoKeys
-    jetChainParts = [cPart for cPart in chainParts if cPart['signature'] in ['Jet','Bjet']]
+    jetChainParts = [cPart for cPart in chainParts if cPart['signature'] in ['Jet','Bjet', 'Ditau']]
     jetRecoDict = {k:jetChainParts[-1][k] for k in _jetRecoKeys}
 
     # Check consistency of the preceding jet parts
@@ -191,7 +191,7 @@ def unifyJetRecoParts(chainParts):
     newChainParts = []
     for cPart in chainParts:
         newCPart = deepcopy(cPart)
-        if newCPart['signature'] in ['Jet','Bjet']:
+        if newCPart['signature'] in ['Jet','Bjet', 'Ditau']:
             for k in _jetRecoKeys:
                 newCPart[k] = jetRecoDict[k]
         newChainParts.append(newCPart)
@@ -519,6 +519,23 @@ def analyseChainName(chainName, L1thresholds, L1item):
                     if propSet is False:
                         log.debug('Changing %s from %s to %s', prop, str(chainProperties[prop]), str(bJetDefaultValues[prop]))
                         chainProperties[prop] = bJetDefaultValues[prop]
+            
+            
+            if chainProperties['ditauTag'] != '':
+                log.debug('Setting Ditau chain defaults')
+                # b-jet chain, so we now use the bJet defaults if they have not already been overriden
+                ditauJetDefaultValues, allowedDitauJetPropertiesAndValues = getSignatureInformation('Ditau')
+                for prop, value in ditauJetDefaultValues.items():
+                    propSet=False
+                    for value in allowedDitauJetPropertiesAndValues[prop]:
+                        if value in matchedparts:
+                            propSet=True
+                            break
+
+                    # if the property was not set already, then set if according to the ditau-jet defaults
+                    if propSet is False:
+                        log.debug('Changing %s from %s to %s', prop, str(chainProperties[prop]), str(ditauJetDefaultValues[prop]))
+                        chainProperties[prop] = ditauJetDefaultValues[prop]
 
 
             if chainProperties['signature'] == 'Jet' and chainProperties['beamspotChain'] != '':
@@ -600,13 +617,19 @@ def analyseChainName(chainName, L1thresholds, L1item):
                 cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Bjet', cPart['tnpInfo'])
             else:
                 cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Bjet', cPart['extra'])
+        if cPart['signature'] == 'Jet' and cPart['ditauTag'] != '':
+            cPart['signature'] = 'Ditau'
+            if 'tnpInfo' in cPart.keys() and cPart['tnpInfo'] != "":
+                cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Ditau', cPart['tnpInfo'])
+            else:
+                cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Ditau', cPart['extra'])
         genchainDict['signatures'] += [cPart['signature']]
         genchainDict['alignmentGroups'] += [cPart['alignmentGroup']]
 
     # Postprocess chains with multiple jet chainParts 
     # to set them consistently from only one specification
     if len(genchainDict['chainParts'])>1:
-        if 'Jet' in genchainDict['signatures'] or 'Bjet' in genchainDict['signatures']:
+        if 'Jet' in genchainDict['signatures'] or 'Bjet' in genchainDict['signatures'] or 'Ditau' in genchainDict['signatures']:
             genchainDict['chainParts'] = unifyJetRecoParts(genchainDict['chainParts'])
         
     #genchainDict['signature'] = allChainProperties[0]['signature']
@@ -682,7 +705,7 @@ def dictFromChainName(flags, chainInfo):
                 chainDict['sigDicts'][sf].extend(chainPart['subSigs'])                
             else:
                 chainDict['sigDicts'].update({sf:chainPart['subSigs']})
-            if sf == 'Bjet':
+            if sf in ['Bjet', 'Ditau']:
                 chainDict['sigDicts'].update({'Jet':['Jet']})
                 
 
@@ -711,7 +734,7 @@ def dictFromChainName(flags, chainInfo):
                 log.error("Standard tau chains should be seeded from L1_TAU. Check %s seeded from %s (defined L1: %s), signature %s",chainDict['chainName'],thisL1,l1Thresholds,thisSignature)
                 #incorrectL1=True
 
-        if thisSignature in ['Jet','Bjet','MET','UnconventionalTracking']:
+        if thisSignature in ['Jet','Bjet', 'Ditau','MET','UnconventionalTracking']:
             if 'FSNOSEED' not in thisL1:
                 log.error("Jet, b-jet, MET chains should be seeded from FSNOSEED. Check %s seeded from %s (defined L1: %s),  signature %s",chainDict['chainName'],thisL1,l1Thresholds,thisSignature)
                 #incorrectL1=True
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauChainConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauChainConfiguration.py
new file mode 100644
index 000000000000..215be632907f
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauChainConfiguration.py
@@ -0,0 +1,35 @@
+# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+
+from AthenaCommon.Logging import logging
+logging.getLogger().info("Importing %s",__name__)
+log = logging.getLogger(__name__)
+
+from ..Config.ChainConfigurationBase import ChainConfigurationBase
+from .DitauMenuSequences import ditauSequenceGenCfg
+
+
+#----------------------------------------------------------------
+# Class to configure chain
+#----------------------------------------------------------------
+class DitauChainConfiguration(ChainConfigurationBase):
+
+    def __init__(self, chainDict, jet_name):
+        self.jetName = jet_name
+        ChainConfigurationBase.__init__(self, chainDict)
+
+    # ----------------------
+    # Assemble the chain depending on information from chainName
+    # ----------------------
+    def assembleChainImpl(self, flags):
+        log.debug("Assembling chain for %s", self.chainName)
+        chainStep = self.getStep(
+            flags, 
+            'ditau_step', 
+            [ditauSequenceGenCfg],
+            seq_name = 'ditau',
+            jet_name = self.jetName
+        )
+
+        myChain = self.buildChain([chainStep])
+        return myChain
+
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
new file mode 100644
index 000000000000..41db944e8557
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
@@ -0,0 +1,25 @@
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+
+import unittest
+from AthenaConfiguration.AthConfigFlags import AthConfigFlags
+
+def createDiTauConfigFlags():
+    ditau_cfg = AthConfigFlags()
+    ditau_cfg.addFlag("DiTau.DiTauContainer", ["HLT_DiTauJets"]) 
+    ditau_cfg.addFlag("DiTau.JetSeedPt", 50000)
+    ditau_cfg.addFlag("DiTau.doRunDiTauDiscriminant", False)
+    ditau_cfg.addFlag("DiTau.MaxEta", 2.5)
+    ditau_cfg.addFlag("DiTau.Rjet", 1.0)
+    ditau_cfg.addFlag("DiTau.Rsubjet", 0.2)
+    ditau_cfg.addFlag("DiTau.Rcore", 0.1)
+    return ditau_cfg
+
+class DiTestTauRecConfigFlags(unittest.TestCase):
+    def runTest(self):
+        createDiTauConfigFlags()
+
+
+if __name__ == "__main__":
+    unittest.main()
+
+
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
new file mode 100644
index 000000000000..de2be5687141
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
@@ -0,0 +1,178 @@
+#  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+
+from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+from AthenaConfiguration.ComponentFactory import CompFactory
+from TriggerMenuMT.HLT.Config.MenuComponents import MenuSequence, SelectionCA, InViewRecoCA
+from DiTauRec.DiTauToolsConfig import (
+    SeedJetBuilderCfg, SubjetBuilderCfg, 
+    VertexFinderCfg, 
+    DiTauTrackFinderCfg, 
+    DiTauConstituentFinderCfg, 
+    IDVarCalculatorCfg, 
+    TVAToolCfg, 
+    DiTauIDVarDecoratorCfg,
+    DiTauOnnxScoreCalculatorCfg,
+)
+
+
+from TrigEDMConfig.TriggerEDM import recordable
+
+from AthenaCommon.Logging import logging
+log = logging.getLogger(__name__)
+
+
+def ditauTrackingCfg(flags, inputRoI: str, inputVertex: str, inputJets: str) -> ComponentAccumulator:
+    #safety measure to ensure we get the right instance of flags
+    from TrigInDetConfig.utils import getFlagsForActiveConfig
+    trkflags = getFlagsForActiveConfig(flags, "ditau", log)
+
+    from TrigInDetConfig.InnerTrackingTrigSequence import InnerTrackingTrigSequence
+    seq = InnerTrackingTrigSequence.create(trkflags, 
+                                           trkflags.Tracking.ActiveConfig.input_name, 
+                                           rois   = inputRoI,
+                                           inView = "VDVInDetFTF")
+    acc = seq.sequence("FastTrackFinder")
+    acc.merge(seq.sequenceAfterPattern())
+
+    verifier = CompFactory.AthViews.ViewDataVerifier(name = 'VDVsecondStageDitauTracking',
+                                                     DataObjects = {('xAOD::VertexContainer', f'StoreGateSvc+{inputVertex}'),
+                                                                    ('xAOD::JetContainer', f'StoreGateSvc+{inputJets}')} )
+    acc.addEventAlgo(verifier)
+
+    return acc
+
+def JetTVAAlgCfg(flags, inputTracks, inputVertex, name="HLT_DiTauRec_JetAlgorithm"): # Name changed wrt legacy config DiTauRec_TVATool
+    """Configure the JetAlgorithm"""
+    acc = ComponentAccumulator()
+
+    tools = [acc.popToolsAndMerge(
+        TVAToolCfg(
+            flags,
+            TrackParticleContainer = inputTracks,
+            VertexContainer = inputVertex,
+            TrackVertexAssociation = "HLT_JetTrackVtxAssoc_forDiTaus"
+        )
+    )]
+    tools = tools
+
+    acc.addEventAlgo(CompFactory.JetAlgorithm(name, Tools = tools))
+    return acc
+
+def ditauRecoCfg(flags, inputJets: str, inputVertex: str, inputFSTracks: str,  inputTracks: str, inputCells: str, inputClusters: str) -> ComponentAccumulator:
+    from .DitauConfigFlagsHLT import createDiTauConfigFlags
+    flags_ditau = createDiTauConfigFlags()
+
+    acc = ComponentAccumulator()
+    acc.merge(JetTVAAlgCfg(
+        flags,
+        inputTracks=inputFSTracks,
+        inputVertex=inputVertex,
+    )) 
+    tools = [
+        acc.popToolsAndMerge(SeedJetBuilderCfg(flags, JetCollection=inputJets)),
+        acc.popToolsAndMerge(SubjetBuilderCfg(flags)),
+        acc.popToolsAndMerge(VertexFinderCfg(
+            flags,
+            TrackVertexAssociation = "HLT_JetTrackVtxAssoc_forDiTaus",
+            PrimVtxContainerName = inputVertex,
+            AssociatedTracks = "GhostTrack_ftf"
+        )),
+        acc.popToolsAndMerge(DiTauTrackFinderCfg(
+            flags, 
+            TrackParticleContainer=inputTracks
+        )),
+        acc.popToolsAndMerge(DiTauConstituentFinderCfg(
+            flags,
+        )),
+        # acc.popToolsAndMerge(CellFinderCfg(
+        #     flags,
+        #     ClusterContainer = inputClusters,
+        #     CellContainer = inputCells                   
+        # )),
+        acc.popToolsAndMerge(IDVarCalculatorCfg(flags, useCells=False)),
+        acc.popToolsAndMerge(DiTauIDVarDecoratorCfg(flags)),
+        acc.popToolsAndMerge(DiTauOnnxScoreCalculatorCfg(flags)),
+    ]
+
+    acc.addEventAlgo(CompFactory.DiTauBuilder(
+        "HLT_DiTauBuilder",
+        DiTauContainer  = recordable("HLT_DiTauJets"),
+        Tools           = tools,
+        SeedJetName     = inputJets,
+        minPt           = flags_ditau.DiTau.JetSeedPt,
+        maxEta          = flags_ditau.DiTau.MaxEta,
+        Rjet            = flags_ditau.DiTau.Rjet,
+        Rsubjet         = flags_ditau.DiTau.Rsubjet,
+        Rcore           = flags_ditau.DiTau.Rcore,
+    ))
+    return acc
+
+def ditauSequenceGenCfg(flags, seq_name, jet_name):
+    # input maker and ROI tool
+    prmVtxKey = flags.Trigger.InDetTracking.fullScan.vertex
+    roiTool = CompFactory.ViewCreatorCentredOnJetWithPVConstraintROITool(
+        RoisWriteHandleKey  = recordable( 'HLT_DitauRoI' ),
+        VertexReadHandleKey = prmVtxKey,
+        PrmVtxLink  = prmVtxKey.replace( "HLT_","" ),
+        RoIEtaWidth = 1.0,
+        RoIPhiWidth = 1.0,
+        RoIZWidth   = 7.0,
+    )
+    ditauAcc = InViewRecoCA("Ditau", RoITool = roiTool,
+                                    InViewRoIs = "InViewRoIs",
+                                    mergeUsingFeature = True,
+                                    RequireParentView = False,
+                                    ViewFallThrough = True,
+                                    InViewJets = recordable( f'{jet_name}_Ditau_jets' ),
+                                    PlaceJetInView = True)
+    InputMakerAlg = ditauAcc.inputMaker()
+    # Tracking
+    trackingAcc = ditauTrackingCfg(
+        flags,
+        inputRoI=InputMakerAlg.InViewRoIs,
+        inputVertex=prmVtxKey,
+        inputJets=InputMakerAlg.InViewJets
+    )
+    ditauAcc.mergeReco(trackingAcc)
+
+    # ditau reconstruction
+    inputJets = InputMakerAlg.InViewJets
+    inputVertex = prmVtxKey
+    inputFSTracks = flags.Trigger.InDetTracking.fullScan.tracks_FTF
+    inputIDTracks = flags.Trigger.InDetTracking.ditau.tracks_IDTrig
+    inputCells = "CaloCellsFS"
+    inputClusters = "HLT_TopoCaloClustersFS"
+
+    recoAcc = ditauRecoCfg(
+        flags,
+        inputJets=inputJets,
+        inputVertex=inputVertex,
+        inputFSTracks=inputFSTracks,
+        inputTracks=inputIDTracks,
+        inputCells=inputCells,
+        inputClusters=inputClusters
+    )
+
+    ditauAcc.mergeReco(recoAcc)
+
+    ditauAcc.addRecoAlgo(CompFactory.AthViews.ViewDataVerifier(
+        name=f'{ditauAcc.name}RecoVDV',
+        DataObjects={
+            ('CaloCellContainer',                   f'StoreGateSvc+{inputCells}'),
+            ('xAOD::CaloClusterContainer',          f'StoreGateSvc+{inputClusters}'),
+            ('CaloClusterCellLinkContainer',        f'StoreGateSvc+{inputClusters}_links'),
+            ('xAOD::TrackParticleContainer' ,       f'StoreGateSvc+{inputFSTracks}'),
+        }
+    ))
+
+    selAcc = SelectionCA(f'Trig_DitauReco_{seq_name}', isProbe=False)
+    selAcc.mergeReco(ditauAcc)
+    selAcc.addHypoAlgo(CompFactory.TrigDiTauHypoAlg(
+        f'DiTauHypoAlg_{seq_name}',
+        DiTauJets_key='HLT_DiTauJets',
+    ))
+
+    from TrigDitauHypo.TrigDiTauHypoTool import TrigDiTauHypoToolFromDict
+    menuSeq = MenuSequence(flags, selAcc, HypoToolGen=TrigDiTauHypoToolFromDict)
+
+    return menuSeq
\ No newline at end of file
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/GenerateDitauChainDefs.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/GenerateDitauChainDefs.py
new file mode 100644
index 000000000000..5c26362abf16
--- /dev/null
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/GenerateDitauChainDefs.py
@@ -0,0 +1,35 @@
+# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+
+from TriggerMenuMT.HLT.Config.Utility.ChainDictTools import splitChainDict
+from .DitauChainConfiguration import DitauChainConfiguration
+from ..Jet.JetChainConfiguration import JetChainConfiguration
+
+import pprint
+from AthenaCommon.Logging import logging
+log = logging.getLogger(__name__)
+log.debug("Importing %s",__name__)
+
+
+def generateJetChainConfigs(flags, subChainDict):
+    jet_cfg = JetChainConfiguration(subChainDict)
+    jet_cfg.prepareDataDependencies(flags)
+    jet = jet_cfg.assembleChain(flags)
+    jet_name = jet_cfg.jetName
+    return jet, jet_name
+
+
+def generateChainConfigs(flags, chainDict, perSig_lengthOfChainConfigs):
+
+    log.debug('full dictionary is: %s\n', pprint.pformat(chainDict))
+    listOfChainDicts = splitChainDict(chainDict)
+
+    for subChainDict in listOfChainDicts:
+        log.debug('Assembling subChainsDict for chain %s', subChainDict['chainName'] )   
+        Jet, jet_name = generateJetChainConfigs(flags, subChainDict)
+        Ditau = DitauChainConfiguration(subChainDict, jet_name).assembleChain(flags) 
+        Jet.append_step_to_jet(Ditau.steps)
+    theChainDef = Jet
+
+    log.debug("theChainDef: %s" , theChainDef)
+    return theChainDef, perSig_lengthOfChainConfigs
+
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/__init__.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/__init__.py
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
index 2a9e5a2eb1d9..791ec7d4080b 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
@@ -20,6 +20,7 @@ from .Physics_pp_run3_v1 import (PhysicsStream,
                                  SingleBjetGroup,
                                  MultiBjetGroup,
                                  SingleTauGroup,
+                                 DiTauGroup,
                                  MultiTauGroup,
                                  MultiPhotonGroup,
                                  TauPhotonGroup,
@@ -712,6 +713,37 @@ def getDevSignatures():
         ChainProp(name="HLT_tau160_mediumRNN_trackLRT_L1eTAU140", groups=DevGroup, monGroups=['tauMon:t0']),
     ]
 
+
+    chains['Ditau'] = [
+        # no id chains
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        # id chain at 0.5        
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        # varias id chain with ntrk 5, 5 cuts        
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        #alt L1 seed 
+        # no id chains
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        # id chain at 0.5
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        # varias id chain with ntrk 5, 5 cuts
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+    ]
+
     chains['Bphysics'] = [
         #ATR-21003; default dimuon and Bmumux chains from Run2; l2io validation; should not be moved to Physics
         ChainProp(name='HLT_2mu4_noL2Comb_bJpsimumu_L12MU3V', stream=["BphysDelayed"], groups=BphysicsGroup+DevGroup),
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
index 79ec991d717c..e83a9bb16b21 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
@@ -24,6 +24,7 @@ EgammaBjetGroup = ['RATE:EgammaBjet', 'BW:BJet']
 MuonBjetGroup = ['RATE:MuonBjet', 'BW:BJet']
 BjetMETGroup = ['RATE:BjetMET', 'BW:BJet']
 SingleTauGroup = ['RATE:SingleTau', 'BW:Tau']
+DiTauGroup = ['RATE:Ditau', 'BW:Tau']
 MultiTauGroup = ['RATE:MultiTau', 'BW:Tau']
 BphysicsGroup = ['RATE:Bphysics', 'BW:Bphysics']
 BphysElectronGroup = ['RATE:BphysicsElectron', 'BW:BphysicsElectron']
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
index 14bafc2cd2ce..b874ef6a9703 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
@@ -23,6 +23,7 @@ SignatureDict = OrderedDict({
     'Tau'     : ('tau','AllTag'),
     'Jet'     : ('j',  'JetMET'),
     'Bjet'    : ('', 'JetMET'),
+    'Ditau'   : ('', 'JetMET'),
     'MET'     : ('xe', 'JetMET'),
     'XS'      : ('xs', 'JetMET'),
     'TE'      : ('te', 'JetMET'),
@@ -71,7 +72,7 @@ def getListOfSignatures():
 
 class ChainStore(dict):
     """Class to hold list of chains for each signature (dictionary with fixed set of keys)"""
-    _allowedSignatures = ['Egamma', 'Muon', 'Jet', 'Bjet', 'Bphysics', 'MET', 'Tau',
+    _allowedSignatures = ['Egamma', 'Muon', 'Jet', 'Bjet', 'Bphysics', 'MET', 'Tau', 'Ditau',
                           'HeavyIon', 'Beamspot', 'Cosmic', 'EnhancedBias',
                           'Monitor', 'Calib', 'Streaming', 'Combined', 'MinBias',
                           'UnconventionalTracking', 'Test']
@@ -86,6 +87,15 @@ class ChainStore(dict):
         else:
             dict.__setitem__(self, key, value)
 
+# Helper functions
+def getAllDitauTags():
+    # Create a list of all possible ditau tags
+    ditau_tags = []
+    for id_cut in [0,5,6,7,8,9]:
+        for n_trk_lead in range(3, 10):
+            for n_trk_subl in range(3, 10):
+                ditau_tags.append(f'ditauOmni{id_cut}Trk{n_trk_lead}{n_trk_subl}')
+    return ditau_tags
 
 #==========================================================
 # ---- Generic Template for all chains          ----
@@ -477,6 +487,7 @@ JetChainParts = {
                       'bgn260', 'bgn265', 'bgn270', 'bgn272',
                       'bgn275', 'bgn277', 'bgn280', 'bgn282',
                       'bgn285',                       ],
+    'ditauTag'     : getAllDitauTags(),
     'bTracking'    : [],
     'bConfig'      : ['split',],
     'bMatching'    : ['antimatchdr05mu'],
@@ -527,6 +538,7 @@ JetChainParts_Default = {
     'smc'           : 'nosmc',
     #
     'bTag'          : '',
+    'ditauTag'      : '',
     'bTracking'     : '',
     'bConfig'       : [],
     'bMatching'     : [],
@@ -544,6 +556,10 @@ bJetChainParts_Default = {
     'subSigs'       : ['Bjet'],
 }
 
+ditauJetChainParts_Default = {
+    'sigFolder'     : ['Ditau'],
+    'subSigs'       : ['Ditau'],
+}
 # ---- Beamspot Dictionary for chains confiugred through jets
 BeamspotJetChainParts_Default = {
     'signature'      : 'Beamspot',
@@ -1421,6 +1437,8 @@ def getSignatureInformation(signature):
         return [BeamspotJetChainParts_Default, JetChainParts]
     if signature == "Tau":
         return [TauChainParts_Default, TauChainParts]
+    if signature == "Ditau":
+        return [ditauJetChainParts_Default, JetChainParts]
     if (signature == "Muon"):
         return [MuonChainParts_Default, MuonChainParts]
     if  (signature == "Bphysics"):
-- 
GitLab


From 98ef7e382ae79946d421ba9b6f1d224a22977051 Mon Sep 17 00:00:00 2001
From: Qichen Dong <qichen.dong@cern.ch>
Date: Tue, 25 Mar 2025 17:42:58 +0000
Subject: [PATCH 2/8] merge ditau and bjet trigger part

---
 .../python/HLT/Bjet/GenerateBjetChainDefs.py  |  7 +++
 .../python/HLT/Config/GenerateMenuMT.py       |  5 +-
 .../HLT/Config/Utility/DictFromChainName.py   | 37 +++--------
 .../python/HLT/Menu/Dev_pp_run3_v1.py         | 61 +++++++++----------
 .../python/HLT/Menu/Physics_pp_run3_v1.py     |  1 -
 .../python/HLT/Menu/SignatureDicts.py         | 11 +---
 6 files changed, 47 insertions(+), 75 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Bjet/GenerateBjetChainDefs.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Bjet/GenerateBjetChainDefs.py
index 136aa43f6515..f29dfe19019f 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Bjet/GenerateBjetChainDefs.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Bjet/GenerateBjetChainDefs.py
@@ -2,6 +2,7 @@
 
 from TriggerMenuMT.HLT.Config.Utility.ChainDictTools import splitChainDict
 from .BjetChainConfiguration import BjetChainConfiguration
+from ..Ditau.DitauChainConfiguration import DitauChainConfiguration
 from ..Jet.JetChainConfiguration import JetChainConfiguration
 from TriggerMenuMT.HLT.Config.Utility.ChainMerging import mergeChainDefs
 
@@ -29,6 +30,12 @@ def generateChainConfigs(flags,  chainDict ):
         # happens for bjet + normal jet chains
         if subChainDict['chainParts'][0]['signature'] != 'Bjet':
             listOfChainDefs += [jet]
+        # if this chain is a ditau chain, setup ditau tagging instead of btagging
+        elif subChainDict['chainParts'][0]['ditauTag'] != '':
+            log.debug('input jet collection name is: %s\n', jet_name)
+            Ditau = DitauChainConfiguration(subChainDict, jet_name).assembleChain(flags) 
+            jet.append_step_to_jet(Ditau.steps)
+            listOfChainDefs += [ jet ] 
         else:
             log.debug('input jet collection name is: %s\n', jet_name)
             Bjet = BjetChainConfiguration(subChainDict, jet_name).assembleChain(flags) 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
index ad4f62734940..468ead6160ea 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
@@ -15,7 +15,7 @@ def calibCosmicMonSignatures():
     return ['Streaming','Monitor','Beamspot','Cosmic', 'Calib', 'EnhancedBias']
 
 def combinedSignatures():
-    return ['MinBias','Electron','Photon','Muon','Tau', 'Ditau','Jet', 'Bjet','MET','UnconventionalTracking','HeavyIon']
+    return ['MinBias','Electron','Photon','Muon','Tau' ,'Jet', 'Bjet','MET','UnconventionalTracking','HeavyIon']
 
 def jointSignatures():
     return ['Bjet', 'Egamma', 'Combined']
@@ -93,7 +93,6 @@ class GenerateMenuMT(metaclass=Singleton):
         signatureDeps.update({
             # Bjet always requires jet
             'Bjet': ['Bjet','Jet'],
-            'Ditau' : ['Ditau','Jet'],
             # Egamma contains two signatures
             'Egamma': ['Electron','Photon'],
             'Combined': combinedSignatures(),
@@ -404,7 +403,7 @@ class GenerateMenuMT(metaclass=Singleton):
             if currentSig in self.availableSignatures:
                 try:
                     log.debug("[__generateChainConfigs] Trying to get chain config for %s", currentSig)
-                    if currentSig in ['Electron', 'Photon', 'Muon', 'Tau', 'Bphysics', 'Ditau'] :
+                    if currentSig in ['Electron', 'Photon', 'Muon', 'Tau', 'Bphysics'] :
                         chainPartConfig, perSig_lengthOfChainConfigs = self.chainDefModule[currentSig].generateChainConfigs(flags, chainPartDict, perSig_lengthOfChainConfigs)
                     else:
                         chainPartConfig = self.chainDefModule[currentSig].generateChainConfigs(flags, chainPartDict)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
index af4da6dc823b..8fe0a3298681 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
@@ -175,7 +175,7 @@ def unifyJetRecoParts(chainParts):
     jetDefaults, _ = getSignatureInformation('Jet')
     # Extract the jet chainParts, and get the reco specs from the last one
     _jetRecoKeys = JetRecoKeys
-    jetChainParts = [cPart for cPart in chainParts if cPart['signature'] in ['Jet','Bjet', 'Ditau']]
+    jetChainParts = [cPart for cPart in chainParts if cPart['signature'] in ['Jet','Bjet']]
     jetRecoDict = {k:jetChainParts[-1][k] for k in _jetRecoKeys}
 
     # Check consistency of the preceding jet parts
@@ -191,7 +191,7 @@ def unifyJetRecoParts(chainParts):
     newChainParts = []
     for cPart in chainParts:
         newCPart = deepcopy(cPart)
-        if newCPart['signature'] in ['Jet','Bjet', 'Ditau']:
+        if newCPart['signature'] in ['Jet','Bjet']:
             for k in _jetRecoKeys:
                 newCPart[k] = jetRecoDict[k]
         newChainParts.append(newCPart)
@@ -504,7 +504,7 @@ def analyseChainName(chainName, L1thresholds, L1item):
         if chainProperties['signature']=='Jet':
 
         # ----- at this point we can figure out if the chain is a bJet chain and update defaults accordingly
-            if chainProperties['bTag'] != '':
+            if chainProperties['bTag'] != '' or chainProperties['ditauTag'] != '':
                 log.debug('Setting b-jet chain defaults')
                 # b-jet chain, so we now use the bJet defaults if they have not already been overriden
                 bJetDefaultValues, allowedbJetPropertiesAndValues = getSignatureInformation('Bjet')
@@ -519,23 +519,6 @@ def analyseChainName(chainName, L1thresholds, L1item):
                     if propSet is False:
                         log.debug('Changing %s from %s to %s', prop, str(chainProperties[prop]), str(bJetDefaultValues[prop]))
                         chainProperties[prop] = bJetDefaultValues[prop]
-            
-            
-            if chainProperties['ditauTag'] != '':
-                log.debug('Setting Ditau chain defaults')
-                # b-jet chain, so we now use the bJet defaults if they have not already been overriden
-                ditauJetDefaultValues, allowedDitauJetPropertiesAndValues = getSignatureInformation('Ditau')
-                for prop, value in ditauJetDefaultValues.items():
-                    propSet=False
-                    for value in allowedDitauJetPropertiesAndValues[prop]:
-                        if value in matchedparts:
-                            propSet=True
-                            break
-
-                    # if the property was not set already, then set if according to the ditau-jet defaults
-                    if propSet is False:
-                        log.debug('Changing %s from %s to %s', prop, str(chainProperties[prop]), str(ditauJetDefaultValues[prop]))
-                        chainProperties[prop] = ditauJetDefaultValues[prop]
 
 
             if chainProperties['signature'] == 'Jet' and chainProperties['beamspotChain'] != '':
@@ -611,25 +594,19 @@ def analyseChainName(chainName, L1thresholds, L1item):
     # ---- finally also taking care of the signature key ----
     genchainDict['chainParts'] = allChainProperties
     for cPart in allChainProperties:
-        if cPart['signature'] == 'Jet' and cPart['bTag'] != '':
+        if cPart['signature'] == 'Jet' and (cPart['bTag'] != '' or cPart['ditauTag'] != ''):
             cPart['signature'] = 'Bjet'
             if 'tnpInfo' in cPart.keys() and cPart['tnpInfo'] != "":
                 cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Bjet', cPart['tnpInfo'])
             else:
                 cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Bjet', cPart['extra'])
-        if cPart['signature'] == 'Jet' and cPart['ditauTag'] != '':
-            cPart['signature'] = 'Ditau'
-            if 'tnpInfo' in cPart.keys() and cPart['tnpInfo'] != "":
-                cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Ditau', cPart['tnpInfo'])
-            else:
-                cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Ditau', cPart['extra'])
         genchainDict['signatures'] += [cPart['signature']]
         genchainDict['alignmentGroups'] += [cPart['alignmentGroup']]
 
     # Postprocess chains with multiple jet chainParts 
     # to set them consistently from only one specification
     if len(genchainDict['chainParts'])>1:
-        if 'Jet' in genchainDict['signatures'] or 'Bjet' in genchainDict['signatures'] or 'Ditau' in genchainDict['signatures']:
+        if 'Jet' in genchainDict['signatures'] or 'Bjet' in genchainDict['signatures']:
             genchainDict['chainParts'] = unifyJetRecoParts(genchainDict['chainParts'])
         
     #genchainDict['signature'] = allChainProperties[0]['signature']
@@ -705,7 +682,7 @@ def dictFromChainName(flags, chainInfo):
                 chainDict['sigDicts'][sf].extend(chainPart['subSigs'])                
             else:
                 chainDict['sigDicts'].update({sf:chainPart['subSigs']})
-            if sf in ['Bjet', 'Ditau']:
+            if sf == 'Bjet':
                 chainDict['sigDicts'].update({'Jet':['Jet']})
                 
 
@@ -734,7 +711,7 @@ def dictFromChainName(flags, chainInfo):
                 log.error("Standard tau chains should be seeded from L1_TAU. Check %s seeded from %s (defined L1: %s), signature %s",chainDict['chainName'],thisL1,l1Thresholds,thisSignature)
                 #incorrectL1=True
 
-        if thisSignature in ['Jet','Bjet', 'Ditau','MET','UnconventionalTracking']:
+        if thisSignature in ['Jet','Bjet','MET','UnconventionalTracking']:
             if 'FSNOSEED' not in thisL1:
                 log.error("Jet, b-jet, MET chains should be seeded from FSNOSEED. Check %s seeded from %s (defined L1: %s),  signature %s",chainDict['chainName'],thisL1,l1Thresholds,thisSignature)
                 #incorrectL1=True
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
index 791ec7d4080b..0c3b3ae69563 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
@@ -20,7 +20,6 @@ from .Physics_pp_run3_v1 import (PhysicsStream,
                                  SingleBjetGroup,
                                  MultiBjetGroup,
                                  SingleTauGroup,
-                                 DiTauGroup,
                                  MultiTauGroup,
                                  MultiPhotonGroup,
                                  TauPhotonGroup,
@@ -549,6 +548,35 @@ def getDevSignatures():
         ChainProp(name='HLT_2j20_2j20_0eta290_boffperf_pf_ftf_presel2j25XX2j25b85_PhysicsTLA_L14jJ40p0ETA25', l1SeedThresholds=['FSNOSEED']*2, stream=['TLA'], groups=MultiBjetGroup+DevGroup),
         ChainProp(name='HLT_2j20_2j20_0eta290_boffperf_pf_ftf_presel2c20XX2c20b85_PhysicsTLA_L1jJ85p0ETA21_3jJ40p0ETA25', l1SeedThresholds=['FSNOSEED']*2, stream=['TLA'], groups=MultiBjetGroup+DevGroup),
 
+        # ATR-30999 - ditau chains
+        # no id chains
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        # id chain at 0.5        
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        # varias id chain with ntrk 5, 5 cuts        
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        #alt L1 seed 
+        # no id chains
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        # id chain at 0.5
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        # varias id chain with ntrk 5, 5 cuts
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
+
     ]
 
     chains['Tau'] = [
@@ -713,37 +741,6 @@ def getDevSignatures():
         ChainProp(name="HLT_tau160_mediumRNN_trackLRT_L1eTAU140", groups=DevGroup, monGroups=['tauMon:t0']),
     ]
 
-
-    chains['Ditau'] = [
-        # no id chains
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        # id chain at 0.5        
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        # varias id chain with ntrk 5, 5 cuts        
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        #alt L1 seed 
-        # no id chains
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        # id chain at 0.5
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        # varias id chain with ntrk 5, 5 cuts
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
-    ]
-
     chains['Bphysics'] = [
         #ATR-21003; default dimuon and Bmumux chains from Run2; l2io validation; should not be moved to Physics
         ChainProp(name='HLT_2mu4_noL2Comb_bJpsimumu_L12MU3V', stream=["BphysDelayed"], groups=BphysicsGroup+DevGroup),
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
index e83a9bb16b21..79ec991d717c 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
@@ -24,7 +24,6 @@ EgammaBjetGroup = ['RATE:EgammaBjet', 'BW:BJet']
 MuonBjetGroup = ['RATE:MuonBjet', 'BW:BJet']
 BjetMETGroup = ['RATE:BjetMET', 'BW:BJet']
 SingleTauGroup = ['RATE:SingleTau', 'BW:Tau']
-DiTauGroup = ['RATE:Ditau', 'BW:Tau']
 MultiTauGroup = ['RATE:MultiTau', 'BW:Tau']
 BphysicsGroup = ['RATE:Bphysics', 'BW:Bphysics']
 BphysElectronGroup = ['RATE:BphysicsElectron', 'BW:BphysicsElectron']
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
index b874ef6a9703..a30f4ffb974d 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
@@ -23,7 +23,6 @@ SignatureDict = OrderedDict({
     'Tau'     : ('tau','AllTag'),
     'Jet'     : ('j',  'JetMET'),
     'Bjet'    : ('', 'JetMET'),
-    'Ditau'   : ('', 'JetMET'),
     'MET'     : ('xe', 'JetMET'),
     'XS'      : ('xs', 'JetMET'),
     'TE'      : ('te', 'JetMET'),
@@ -72,7 +71,7 @@ def getListOfSignatures():
 
 class ChainStore(dict):
     """Class to hold list of chains for each signature (dictionary with fixed set of keys)"""
-    _allowedSignatures = ['Egamma', 'Muon', 'Jet', 'Bjet', 'Bphysics', 'MET', 'Tau', 'Ditau',
+    _allowedSignatures = ['Egamma', 'Muon', 'Jet', 'Bjet', 'Bphysics', 'MET', 'Tau', 
                           'HeavyIon', 'Beamspot', 'Cosmic', 'EnhancedBias',
                           'Monitor', 'Calib', 'Streaming', 'Combined', 'MinBias',
                           'UnconventionalTracking', 'Test']
@@ -91,7 +90,7 @@ class ChainStore(dict):
 def getAllDitauTags():
     # Create a list of all possible ditau tags
     ditau_tags = []
-    for id_cut in [0,5,6,7,8,9]:
+    for id_cut in [0,1,2,3,4,5,6,7,8,9]:
         for n_trk_lead in range(3, 10):
             for n_trk_subl in range(3, 10):
                 ditau_tags.append(f'ditauOmni{id_cut}Trk{n_trk_lead}{n_trk_subl}')
@@ -556,10 +555,6 @@ bJetChainParts_Default = {
     'subSigs'       : ['Bjet'],
 }
 
-ditauJetChainParts_Default = {
-    'sigFolder'     : ['Ditau'],
-    'subSigs'       : ['Ditau'],
-}
 # ---- Beamspot Dictionary for chains confiugred through jets
 BeamspotJetChainParts_Default = {
     'signature'      : 'Beamspot',
@@ -1437,8 +1432,6 @@ def getSignatureInformation(signature):
         return [BeamspotJetChainParts_Default, JetChainParts]
     if signature == "Tau":
         return [TauChainParts_Default, TauChainParts]
-    if signature == "Ditau":
-        return [ditauJetChainParts_Default, JetChainParts]
     if (signature == "Muon"):
         return [MuonChainParts_Default, MuonChainParts]
     if  (signature == "Bphysics"):
-- 
GitLab


From 3bb60a737913f637ddd71e6fd3e148ee5ba7ffd8 Mon Sep 17 00:00:00 2001
From: Qichen Dong <qichen.dong@cern.ch>
Date: Thu, 27 Mar 2025 13:57:06 +0000
Subject: [PATCH 3/8] Revert "merge ditau and bjet trigger part"

This reverts commit 98ef7e382ae79946d421ba9b6f1d224a22977051.
---
 .../python/HLT/Bjet/GenerateBjetChainDefs.py  |  7 ---
 .../python/HLT/Config/GenerateMenuMT.py       |  5 +-
 .../HLT/Config/Utility/DictFromChainName.py   | 37 ++++++++---
 .../python/HLT/Menu/Dev_pp_run3_v1.py         | 61 ++++++++++---------
 .../python/HLT/Menu/Physics_pp_run3_v1.py     |  1 +
 .../python/HLT/Menu/SignatureDicts.py         | 11 +++-
 6 files changed, 75 insertions(+), 47 deletions(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Bjet/GenerateBjetChainDefs.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Bjet/GenerateBjetChainDefs.py
index f29dfe19019f..136aa43f6515 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Bjet/GenerateBjetChainDefs.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Bjet/GenerateBjetChainDefs.py
@@ -2,7 +2,6 @@
 
 from TriggerMenuMT.HLT.Config.Utility.ChainDictTools import splitChainDict
 from .BjetChainConfiguration import BjetChainConfiguration
-from ..Ditau.DitauChainConfiguration import DitauChainConfiguration
 from ..Jet.JetChainConfiguration import JetChainConfiguration
 from TriggerMenuMT.HLT.Config.Utility.ChainMerging import mergeChainDefs
 
@@ -30,12 +29,6 @@ def generateChainConfigs(flags,  chainDict ):
         # happens for bjet + normal jet chains
         if subChainDict['chainParts'][0]['signature'] != 'Bjet':
             listOfChainDefs += [jet]
-        # if this chain is a ditau chain, setup ditau tagging instead of btagging
-        elif subChainDict['chainParts'][0]['ditauTag'] != '':
-            log.debug('input jet collection name is: %s\n', jet_name)
-            Ditau = DitauChainConfiguration(subChainDict, jet_name).assembleChain(flags) 
-            jet.append_step_to_jet(Ditau.steps)
-            listOfChainDefs += [ jet ] 
         else:
             log.debug('input jet collection name is: %s\n', jet_name)
             Bjet = BjetChainConfiguration(subChainDict, jet_name).assembleChain(flags) 
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
index 468ead6160ea..ad4f62734940 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
@@ -15,7 +15,7 @@ def calibCosmicMonSignatures():
     return ['Streaming','Monitor','Beamspot','Cosmic', 'Calib', 'EnhancedBias']
 
 def combinedSignatures():
-    return ['MinBias','Electron','Photon','Muon','Tau' ,'Jet', 'Bjet','MET','UnconventionalTracking','HeavyIon']
+    return ['MinBias','Electron','Photon','Muon','Tau', 'Ditau','Jet', 'Bjet','MET','UnconventionalTracking','HeavyIon']
 
 def jointSignatures():
     return ['Bjet', 'Egamma', 'Combined']
@@ -93,6 +93,7 @@ class GenerateMenuMT(metaclass=Singleton):
         signatureDeps.update({
             # Bjet always requires jet
             'Bjet': ['Bjet','Jet'],
+            'Ditau' : ['Ditau','Jet'],
             # Egamma contains two signatures
             'Egamma': ['Electron','Photon'],
             'Combined': combinedSignatures(),
@@ -403,7 +404,7 @@ class GenerateMenuMT(metaclass=Singleton):
             if currentSig in self.availableSignatures:
                 try:
                     log.debug("[__generateChainConfigs] Trying to get chain config for %s", currentSig)
-                    if currentSig in ['Electron', 'Photon', 'Muon', 'Tau', 'Bphysics'] :
+                    if currentSig in ['Electron', 'Photon', 'Muon', 'Tau', 'Bphysics', 'Ditau'] :
                         chainPartConfig, perSig_lengthOfChainConfigs = self.chainDefModule[currentSig].generateChainConfigs(flags, chainPartDict, perSig_lengthOfChainConfigs)
                     else:
                         chainPartConfig = self.chainDefModule[currentSig].generateChainConfigs(flags, chainPartDict)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
index 8fe0a3298681..af4da6dc823b 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
@@ -175,7 +175,7 @@ def unifyJetRecoParts(chainParts):
     jetDefaults, _ = getSignatureInformation('Jet')
     # Extract the jet chainParts, and get the reco specs from the last one
     _jetRecoKeys = JetRecoKeys
-    jetChainParts = [cPart for cPart in chainParts if cPart['signature'] in ['Jet','Bjet']]
+    jetChainParts = [cPart for cPart in chainParts if cPart['signature'] in ['Jet','Bjet', 'Ditau']]
     jetRecoDict = {k:jetChainParts[-1][k] for k in _jetRecoKeys}
 
     # Check consistency of the preceding jet parts
@@ -191,7 +191,7 @@ def unifyJetRecoParts(chainParts):
     newChainParts = []
     for cPart in chainParts:
         newCPart = deepcopy(cPart)
-        if newCPart['signature'] in ['Jet','Bjet']:
+        if newCPart['signature'] in ['Jet','Bjet', 'Ditau']:
             for k in _jetRecoKeys:
                 newCPart[k] = jetRecoDict[k]
         newChainParts.append(newCPart)
@@ -504,7 +504,7 @@ def analyseChainName(chainName, L1thresholds, L1item):
         if chainProperties['signature']=='Jet':
 
         # ----- at this point we can figure out if the chain is a bJet chain and update defaults accordingly
-            if chainProperties['bTag'] != '' or chainProperties['ditauTag'] != '':
+            if chainProperties['bTag'] != '':
                 log.debug('Setting b-jet chain defaults')
                 # b-jet chain, so we now use the bJet defaults if they have not already been overriden
                 bJetDefaultValues, allowedbJetPropertiesAndValues = getSignatureInformation('Bjet')
@@ -519,6 +519,23 @@ def analyseChainName(chainName, L1thresholds, L1item):
                     if propSet is False:
                         log.debug('Changing %s from %s to %s', prop, str(chainProperties[prop]), str(bJetDefaultValues[prop]))
                         chainProperties[prop] = bJetDefaultValues[prop]
+            
+            
+            if chainProperties['ditauTag'] != '':
+                log.debug('Setting Ditau chain defaults')
+                # b-jet chain, so we now use the bJet defaults if they have not already been overriden
+                ditauJetDefaultValues, allowedDitauJetPropertiesAndValues = getSignatureInformation('Ditau')
+                for prop, value in ditauJetDefaultValues.items():
+                    propSet=False
+                    for value in allowedDitauJetPropertiesAndValues[prop]:
+                        if value in matchedparts:
+                            propSet=True
+                            break
+
+                    # if the property was not set already, then set if according to the ditau-jet defaults
+                    if propSet is False:
+                        log.debug('Changing %s from %s to %s', prop, str(chainProperties[prop]), str(ditauJetDefaultValues[prop]))
+                        chainProperties[prop] = ditauJetDefaultValues[prop]
 
 
             if chainProperties['signature'] == 'Jet' and chainProperties['beamspotChain'] != '':
@@ -594,19 +611,25 @@ def analyseChainName(chainName, L1thresholds, L1item):
     # ---- finally also taking care of the signature key ----
     genchainDict['chainParts'] = allChainProperties
     for cPart in allChainProperties:
-        if cPart['signature'] == 'Jet' and (cPart['bTag'] != '' or cPart['ditauTag'] != ''):
+        if cPart['signature'] == 'Jet' and cPart['bTag'] != '':
             cPart['signature'] = 'Bjet'
             if 'tnpInfo' in cPart.keys() and cPart['tnpInfo'] != "":
                 cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Bjet', cPart['tnpInfo'])
             else:
                 cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Bjet', cPart['extra'])
+        if cPart['signature'] == 'Jet' and cPart['ditauTag'] != '':
+            cPart['signature'] = 'Ditau'
+            if 'tnpInfo' in cPart.keys() and cPart['tnpInfo'] != "":
+                cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Ditau', cPart['tnpInfo'])
+            else:
+                cPart['alignmentGroup'] = getAlignmentGroupFromPattern('Ditau', cPart['extra'])
         genchainDict['signatures'] += [cPart['signature']]
         genchainDict['alignmentGroups'] += [cPart['alignmentGroup']]
 
     # Postprocess chains with multiple jet chainParts 
     # to set them consistently from only one specification
     if len(genchainDict['chainParts'])>1:
-        if 'Jet' in genchainDict['signatures'] or 'Bjet' in genchainDict['signatures']:
+        if 'Jet' in genchainDict['signatures'] or 'Bjet' in genchainDict['signatures'] or 'Ditau' in genchainDict['signatures']:
             genchainDict['chainParts'] = unifyJetRecoParts(genchainDict['chainParts'])
         
     #genchainDict['signature'] = allChainProperties[0]['signature']
@@ -682,7 +705,7 @@ def dictFromChainName(flags, chainInfo):
                 chainDict['sigDicts'][sf].extend(chainPart['subSigs'])                
             else:
                 chainDict['sigDicts'].update({sf:chainPart['subSigs']})
-            if sf == 'Bjet':
+            if sf in ['Bjet', 'Ditau']:
                 chainDict['sigDicts'].update({'Jet':['Jet']})
                 
 
@@ -711,7 +734,7 @@ def dictFromChainName(flags, chainInfo):
                 log.error("Standard tau chains should be seeded from L1_TAU. Check %s seeded from %s (defined L1: %s), signature %s",chainDict['chainName'],thisL1,l1Thresholds,thisSignature)
                 #incorrectL1=True
 
-        if thisSignature in ['Jet','Bjet','MET','UnconventionalTracking']:
+        if thisSignature in ['Jet','Bjet', 'Ditau','MET','UnconventionalTracking']:
             if 'FSNOSEED' not in thisL1:
                 log.error("Jet, b-jet, MET chains should be seeded from FSNOSEED. Check %s seeded from %s (defined L1: %s),  signature %s",chainDict['chainName'],thisL1,l1Thresholds,thisSignature)
                 #incorrectL1=True
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
index 0c3b3ae69563..791ec7d4080b 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
@@ -20,6 +20,7 @@ from .Physics_pp_run3_v1 import (PhysicsStream,
                                  SingleBjetGroup,
                                  MultiBjetGroup,
                                  SingleTauGroup,
+                                 DiTauGroup,
                                  MultiTauGroup,
                                  MultiPhotonGroup,
                                  TauPhotonGroup,
@@ -548,35 +549,6 @@ def getDevSignatures():
         ChainProp(name='HLT_2j20_2j20_0eta290_boffperf_pf_ftf_presel2j25XX2j25b85_PhysicsTLA_L14jJ40p0ETA25', l1SeedThresholds=['FSNOSEED']*2, stream=['TLA'], groups=MultiBjetGroup+DevGroup),
         ChainProp(name='HLT_2j20_2j20_0eta290_boffperf_pf_ftf_presel2c20XX2c20b85_PhysicsTLA_L1jJ85p0ETA21_3jJ40p0ETA25', l1SeedThresholds=['FSNOSEED']*2, stream=['TLA'], groups=MultiBjetGroup+DevGroup),
 
-        # ATR-30999 - ditau chains
-        # no id chains
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        # id chain at 0.5        
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        # varias id chain with ntrk 5, 5 cuts        
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        #alt L1 seed 
-        # no id chains
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        # id chain at 0.5
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        # varias id chain with ntrk 5, 5 cuts
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=SingleBjetGroup+DevGroup),
-
     ]
 
     chains['Tau'] = [
@@ -741,6 +713,37 @@ def getDevSignatures():
         ChainProp(name="HLT_tau160_mediumRNN_trackLRT_L1eTAU140", groups=DevGroup, monGroups=['tauMon:t0']),
     ]
 
+
+    chains['Ditau'] = [
+        # no id chains
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        # id chain at 0.5        
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        # varias id chain with ntrk 5, 5 cuts        
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1jJ160',              l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        #alt L1 seed 
+        # no id chains
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk99_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni0Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        # id chain at 0.5
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk44_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni5Trk33_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        # varias id chain with ntrk 5, 5 cuts
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni6Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni7Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni8Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+        ChainProp(name='HLT_j250_a10sd_cssk_ditauOmni9Trk55_pf_jes_ftf_preselj200_L1gLJ140p0ETA25',      l1SeedThresholds=['FSNOSEED'], groups=DiTauGroup+DevGroup),
+    ]
+
     chains['Bphysics'] = [
         #ATR-21003; default dimuon and Bmumux chains from Run2; l2io validation; should not be moved to Physics
         ChainProp(name='HLT_2mu4_noL2Comb_bJpsimumu_L12MU3V', stream=["BphysDelayed"], groups=BphysicsGroup+DevGroup),
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
index 79ec991d717c..e83a9bb16b21 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
@@ -24,6 +24,7 @@ EgammaBjetGroup = ['RATE:EgammaBjet', 'BW:BJet']
 MuonBjetGroup = ['RATE:MuonBjet', 'BW:BJet']
 BjetMETGroup = ['RATE:BjetMET', 'BW:BJet']
 SingleTauGroup = ['RATE:SingleTau', 'BW:Tau']
+DiTauGroup = ['RATE:Ditau', 'BW:Tau']
 MultiTauGroup = ['RATE:MultiTau', 'BW:Tau']
 BphysicsGroup = ['RATE:Bphysics', 'BW:Bphysics']
 BphysElectronGroup = ['RATE:BphysicsElectron', 'BW:BphysicsElectron']
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
index a30f4ffb974d..b874ef6a9703 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
@@ -23,6 +23,7 @@ SignatureDict = OrderedDict({
     'Tau'     : ('tau','AllTag'),
     'Jet'     : ('j',  'JetMET'),
     'Bjet'    : ('', 'JetMET'),
+    'Ditau'   : ('', 'JetMET'),
     'MET'     : ('xe', 'JetMET'),
     'XS'      : ('xs', 'JetMET'),
     'TE'      : ('te', 'JetMET'),
@@ -71,7 +72,7 @@ def getListOfSignatures():
 
 class ChainStore(dict):
     """Class to hold list of chains for each signature (dictionary with fixed set of keys)"""
-    _allowedSignatures = ['Egamma', 'Muon', 'Jet', 'Bjet', 'Bphysics', 'MET', 'Tau', 
+    _allowedSignatures = ['Egamma', 'Muon', 'Jet', 'Bjet', 'Bphysics', 'MET', 'Tau', 'Ditau',
                           'HeavyIon', 'Beamspot', 'Cosmic', 'EnhancedBias',
                           'Monitor', 'Calib', 'Streaming', 'Combined', 'MinBias',
                           'UnconventionalTracking', 'Test']
@@ -90,7 +91,7 @@ class ChainStore(dict):
 def getAllDitauTags():
     # Create a list of all possible ditau tags
     ditau_tags = []
-    for id_cut in [0,1,2,3,4,5,6,7,8,9]:
+    for id_cut in [0,5,6,7,8,9]:
         for n_trk_lead in range(3, 10):
             for n_trk_subl in range(3, 10):
                 ditau_tags.append(f'ditauOmni{id_cut}Trk{n_trk_lead}{n_trk_subl}')
@@ -555,6 +556,10 @@ bJetChainParts_Default = {
     'subSigs'       : ['Bjet'],
 }
 
+ditauJetChainParts_Default = {
+    'sigFolder'     : ['Ditau'],
+    'subSigs'       : ['Ditau'],
+}
 # ---- Beamspot Dictionary for chains confiugred through jets
 BeamspotJetChainParts_Default = {
     'signature'      : 'Beamspot',
@@ -1432,6 +1437,8 @@ def getSignatureInformation(signature):
         return [BeamspotJetChainParts_Default, JetChainParts]
     if signature == "Tau":
         return [TauChainParts_Default, TauChainParts]
+    if signature == "Ditau":
+        return [ditauJetChainParts_Default, JetChainParts]
     if (signature == "Muon"):
         return [MuonChainParts_Default, MuonChainParts]
     if  (signature == "Bphysics"):
-- 
GitLab


From 0471d5692268e39acdbfec1163a1d59cd1d7001e Mon Sep 17 00:00:00 2001
From: Qichen Dong <qichen.dong@cern.ch>
Date: Thu, 27 Mar 2025 13:59:09 +0000
Subject: [PATCH 4/8] add finer grain ditau omni cut

---
 .../TriggerMenuMT/python/HLT/Menu/SignatureDicts.py             | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
index b874ef6a9703..85d496566a6e 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
@@ -91,7 +91,7 @@ class ChainStore(dict):
 def getAllDitauTags():
     # Create a list of all possible ditau tags
     ditau_tags = []
-    for id_cut in [0,5,6,7,8,9]:
+    for id_cut in range(0, 10):
         for n_trk_lead in range(3, 10):
             for n_trk_subl in range(3, 10):
                 ditau_tags.append(f'ditauOmni{id_cut}Trk{n_trk_lead}{n_trk_subl}')
-- 
GitLab


From f1685a94af5bd99cb8e1d7a68877397e1662538d Mon Sep 17 00:00:00 2001
From: Qichen Dong <qichen.dong@cern.ch>
Date: Thu, 27 Mar 2025 20:28:42 +0000
Subject: [PATCH 5/8] minor fixes and copyright

---
 .../TrigDitauHypo/CMakeLists.txt              |  2 +-
 .../TrigDitauHypo/python/TrigDiTauHypoTool.py |  2 +-
 .../TrigDitauHypo/src/TrigDiTauHypoAlg.cxx    |  2 +-
 .../TrigDitauHypo/src/TrigDiTauHypoAlg.h      |  2 +-
 .../TrigDitauHypo/src/TrigDiTauHypoTool.cxx   |  2 +-
 .../TriggerEDMAuxAccessors.h                  |  2 +-
 .../python/BuildSignatureFlags.py             |  4 +--
 .../test_trig_data_v1Dev_slice_ditau_build.py | 29 +++++++++++++++++++
 .../python/HLT/Config/GenerateMenuMT.py       |  2 +-
 .../HLT/Config/Utility/DictFromChainName.py   |  2 +-
 .../HLT/Ditau/DitauChainConfiguration.py      |  2 +-
 .../python/HLT/Ditau/DitauConfigFlagsHLT.py   |  5 ++--
 .../python/HLT/Ditau/DitauMenuSequences.py    |  6 ++--
 .../HLT/Ditau/GenerateDitauChainDefs.py       |  2 +-
 .../python/HLT/Menu/Physics_pp_run3_v1.py     |  2 +-
 .../python/HLT/Menu/SignatureDicts.py         |  2 +-
 16 files changed, 48 insertions(+), 20 deletions(-)
 create mode 100755 Trigger/TrigValidation/TriggerTest/test/test_trig_data_v1Dev_slice_ditau_build.py

diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/CMakeLists.txt b/Trigger/TrigHypothesis/TrigDitauHypo/CMakeLists.txt
index 11fd8c37b893..fd0414881ab1 100644
--- a/Trigger/TrigHypothesis/TrigDitauHypo/CMakeLists.txt
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 # Declare the package name:
 atlas_subdir( TrigDitauHypo )
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/python/TrigDiTauHypoTool.py b/Trigger/TrigHypothesis/TrigDitauHypo/python/TrigDiTauHypoTool.py
index 12ca371d3c4a..0631c0d97405 100644
--- a/Trigger/TrigHypothesis/TrigDitauHypo/python/TrigDiTauHypoTool.py
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/python/TrigDiTauHypoTool.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 import re
 from AthenaCommon.SystemOfUnits import GeV
 
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.cxx b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.cxx
index d836946ab471..b19fbf023a1a 100644
--- a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.cxx
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "TrigSteeringEvent/TrigRoiDescriptorCollection.h"
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.h b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.h
index 8af29a173d5a..edc618edafde 100644
--- a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.h
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoAlg.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 */
 
 #pragma once
diff --git a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.cxx b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.cxx
index 93e24ef42a26..485f69d47620 100644
--- a/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.cxx
+++ b/Trigger/TrigHypothesis/TrigDitauHypo/src/TrigDiTauHypoTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "AthenaMonitoringKernel/Monitored.h"
diff --git a/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h b/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
index c6892b070a11..bae16cae3b94 100644
--- a/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
+++ b/Trigger/TrigSteer/TrigOutputHandling/TrigOutputHandling/TriggerEDMAuxAccessors.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "xAODBase/IParticleContainer.h"
diff --git a/Trigger/TrigTools/TrigInDetConfig/python/BuildSignatureFlags.py b/Trigger/TrigTools/TrigInDetConfig/python/BuildSignatureFlags.py
index 3c7e51c0232e..7352347a3b8d 100644
--- a/Trigger/TrigTools/TrigInDetConfig/python/BuildSignatureFlags.py
+++ b/Trigger/TrigTools/TrigInDetConfig/python/BuildSignatureFlags.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.AthConfigFlags import AthConfigFlags
 from TrkConfig.TrackingPassFlags import createTrackingPassFlags,createITkTrackingPassFlags
@@ -339,7 +339,7 @@ def ditau(flags: AthConfigFlags, instanceName: str, recoMode: str) -> AthConfigF
   flags.input_name = instanceName
   flags.name     = "ditau"
   flags.suffix   = "ditau"
-  flags.roi      = "HLT_Roi_ditau"
+  flags.roi      = "HLT_DitauRoI"
   flags.etaHalfWidth   = 1.0
   flags.phiHalfWidth   = 1.0
   flags.zedHalfWidth   = 7.0
diff --git a/Trigger/TrigValidation/TriggerTest/test/test_trig_data_v1Dev_slice_ditau_build.py b/Trigger/TrigValidation/TriggerTest/test/test_trig_data_v1Dev_slice_ditau_build.py
new file mode 100755
index 000000000000..b78b5c420b98
--- /dev/null
+++ b/Trigger/TrigValidation/TriggerTest/test/test_trig_data_v1Dev_slice_ditau_build.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
+
+# art-description: Trigger RDO->RDO_TRIG athena test of the b-jet slice in Dev_pp_run3_v1 menu, data input
+# art-type: build
+# art-include: main/Athena
+# art-include: 24.0/Athena
+# Skipping art-output which has no effect for build tests.
+# If you create a grid version, check art-output in existing grid tests.
+
+from TrigValTools.TrigValSteering import Test, ExecStep, CheckSteps
+
+ex = ExecStep.ExecStep()
+ex.type = 'athena'
+ex.job_options = 'TriggerJobOpts/runHLT.py'
+ex.input = 'data_Main'
+ex.max_events = 150
+ex.threads = 1
+ex.flags = ['Trigger.triggerMenuSetup="Dev_pp_run3_v1"',
+            'Trigger.enabledSignatures=[\\\"Ditau\\\"]',
+            'Trigger.doLVL1=True']
+
+test = Test.Test()
+test.art_type = 'build'
+test.exec_steps = [ex]
+test.check_steps = CheckSteps.default_check_steps(test)
+
+import sys
+sys.exit(test.run())
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
index ad4f62734940..fd40a2add1d1 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/GenerateMenuMT.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 from typing import Optional
 import importlib, re, string
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
index af4da6dc823b..05eeb632b0ae 100755
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Config/Utility/DictFromChainName.py
@@ -1,5 +1,5 @@
 #! /bin/env python
-# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 """
 Class to obtain the chain configuration dictionary from the short or long name
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauChainConfiguration.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauChainConfiguration.py
index 215be632907f..ea934310fef6 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauChainConfiguration.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauChainConfiguration.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 from AthenaCommon.Logging import logging
 logging.getLogger().info("Importing %s",__name__)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
index 41db944e8557..1246ac498660 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 import unittest
 from AthenaConfiguration.AthConfigFlags import AthConfigFlags
@@ -6,8 +6,7 @@ from AthenaConfiguration.AthConfigFlags import AthConfigFlags
 def createDiTauConfigFlags():
     ditau_cfg = AthConfigFlags()
     ditau_cfg.addFlag("DiTau.DiTauContainer", ["HLT_DiTauJets"]) 
-    ditau_cfg.addFlag("DiTau.JetSeedPt", 50000)
-    ditau_cfg.addFlag("DiTau.doRunDiTauDiscriminant", False)
+    ditau_cfg.addFlag("DiTau.JetSeedPt", 200000)
     ditau_cfg.addFlag("DiTau.MaxEta", 2.5)
     ditau_cfg.addFlag("DiTau.Rjet", 1.0)
     ditau_cfg.addFlag("DiTau.Rsubjet", 0.2)
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
index de2be5687141..1f15eef5c1a0 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
@@ -1,4 +1,4 @@
-#  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+#  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
 from AthenaConfiguration.ComponentFactory import CompFactory
@@ -91,7 +91,7 @@ def ditauRecoCfg(flags, inputJets: str, inputVertex: str, inputFSTracks: str,  i
         # )),
         acc.popToolsAndMerge(IDVarCalculatorCfg(flags, useCells=False)),
         acc.popToolsAndMerge(DiTauIDVarDecoratorCfg(flags)),
-        acc.popToolsAndMerge(DiTauOnnxScoreCalculatorCfg(flags)),
+        acc.popToolsAndMerge(DiTauOnnxScoreCalculatorCfg(flags, onnxModelPath='DiTauRec/omni.onnx')),
     ]
 
     acc.addEventAlgo(CompFactory.DiTauBuilder(
@@ -165,7 +165,7 @@ def ditauSequenceGenCfg(flags, seq_name, jet_name):
         }
     ))
 
-    selAcc = SelectionCA(f'Trig_DitauReco_{seq_name}', isProbe=False)
+    selAcc = SelectionCA(f'Trig_DitauReco_{seq_name}')
     selAcc.mergeReco(ditauAcc)
     selAcc.addHypoAlgo(CompFactory.TrigDiTauHypoAlg(
         f'DiTauHypoAlg_{seq_name}',
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/GenerateDitauChainDefs.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/GenerateDitauChainDefs.py
index 5c26362abf16..f8d9210750d4 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/GenerateDitauChainDefs.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/GenerateDitauChainDefs.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 from TriggerMenuMT.HLT.Config.Utility.ChainDictTools import splitChainDict
 from .DitauChainConfiguration import DitauChainConfiguration
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
index 2bf3c19dac03..f670419b087f 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Physics_pp_run3_v1.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 
 #------------------------------------------------------------------------#
 # Physics_pp_run3_v1.py menu -- contains physics chains for MC and data
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
index 3c68643ab91b..cc3534ef0f11 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
 from AthenaCommon.Logging import logging
 log = logging.getLogger( __name__ )
 log.debug("Importing %s",__name__)
-- 
GitLab


From 17b53dee998fa9cc16109c4bb53a6ea11ff5d320 Mon Sep 17 00:00:00 2001
From: Qichen Dong <qichen.dong@cern.ch>
Date: Fri, 28 Mar 2025 13:01:12 +0000
Subject: [PATCH 6/8] fix model path

---
 .../TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py    | 1 +
 .../TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py     | 5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
index 1246ac498660..7d00584927cc 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
@@ -11,6 +11,7 @@ def createDiTauConfigFlags():
     ditau_cfg.addFlag("DiTau.Rjet", 1.0)
     ditau_cfg.addFlag("DiTau.Rsubjet", 0.2)
     ditau_cfg.addFlag("DiTau.Rcore", 0.1)
+    ditau_cfg.addFlag("DiTau.DiTauIDModel", "TrigTauRec/00-11-02/dev/boosted_ditau_omni_model.onnx")
     return ditau_cfg
 
 class DiTestTauRecConfigFlags(unittest.TestCase):
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
index 1f15eef5c1a0..46e29df0c4e8 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
@@ -91,7 +91,10 @@ def ditauRecoCfg(flags, inputJets: str, inputVertex: str, inputFSTracks: str,  i
         # )),
         acc.popToolsAndMerge(IDVarCalculatorCfg(flags, useCells=False)),
         acc.popToolsAndMerge(DiTauIDVarDecoratorCfg(flags)),
-        acc.popToolsAndMerge(DiTauOnnxScoreCalculatorCfg(flags, onnxModelPath='DiTauRec/omni.onnx')),
+        acc.popToolsAndMerge(DiTauOnnxScoreCalculatorCfg(
+            flags, 
+            onnxModelPath=flags_ditau.DiTau.DiTauIDModel,
+        )),
     ]
 
     acc.addEventAlgo(CompFactory.DiTauBuilder(
-- 
GitLab


From 2ba1296cbec20960abf75c74daccd70990ffd7ab Mon Sep 17 00:00:00 2001
From: Qichen Dong <qichen.dong@cern.ch>
Date: Fri, 28 Mar 2025 17:07:56 +0000
Subject: [PATCH 7/8] Fix pathResolver

---
 Reconstruction/DiTauRec/DiTauRec/DiTauOnnxDiscriminantTool.h   | 2 +-
 Reconstruction/DiTauRec/src/DiTauOnnxDiscriminantTool.cxx      | 2 +-
 .../TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py      | 3 ++-
 .../TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py       | 2 +-
 4 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/Reconstruction/DiTauRec/DiTauRec/DiTauOnnxDiscriminantTool.h b/Reconstruction/DiTauRec/DiTauRec/DiTauOnnxDiscriminantTool.h
index 204e62f1297c..87fb2181e310 100644
--- a/Reconstruction/DiTauRec/DiTauRec/DiTauOnnxDiscriminantTool.h
+++ b/Reconstruction/DiTauRec/DiTauRec/DiTauOnnxDiscriminantTool.h
@@ -11,7 +11,7 @@
 #include "xAODTau/DiTauJet.h"
 #include "DiTauToolBase.h"
 #include "GaudiKernel/ToolHandle.h"
-#include "GaudiKernel/PathResolver.h"
+#include "PathResolver/PathResolver.h"
 
 #include "AthContainers/Accessor.h"
 #include "AthContainers/ConstAccessor.h"
diff --git a/Reconstruction/DiTauRec/src/DiTauOnnxDiscriminantTool.cxx b/Reconstruction/DiTauRec/src/DiTauOnnxDiscriminantTool.cxx
index 0a32e9e89ca1..eeb8551aa110 100644
--- a/Reconstruction/DiTauRec/src/DiTauOnnxDiscriminantTool.cxx
+++ b/Reconstruction/DiTauRec/src/DiTauOnnxDiscriminantTool.cxx
@@ -35,7 +35,7 @@ StatusCode DiTauOnnxDiscriminantTool::initialize()
 {
   ATH_MSG_INFO( "Initializing DiTauOnnxDiscriminantTool" );
   ATH_MSG_INFO( "onnxModelPath: " << m_onnxModelPath );
-  auto model_path = System::PathResolver::find_file (m_onnxModelPath, "DATAPATH");
+  auto model_path = PathResolverFindCalibFile (m_onnxModelPath);
   if (model_path.empty()) {
     ATH_MSG_ERROR("Could not find model file: " << m_onnxModelPath);
     return StatusCode::FAILURE;
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
index 7d00584927cc..3f5c35aae103 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauConfigFlagsHLT.py
@@ -11,7 +11,8 @@ def createDiTauConfigFlags():
     ditau_cfg.addFlag("DiTau.Rjet", 1.0)
     ditau_cfg.addFlag("DiTau.Rsubjet", 0.2)
     ditau_cfg.addFlag("DiTau.Rcore", 0.1)
-    ditau_cfg.addFlag("DiTau.DiTauIDModel", "TrigTauRec/00-11-02/dev/boosted_ditau_omni_model.onnx")
+    ditau_cfg.addFlag("DiTau.CalibFolder", 'TrigTauRec/00-11-02/')
+    ditau_cfg.addFlag("DiTau.DiTauIDModel", "dev/boosted_ditau_omni_model.onnx")
     return ditau_cfg
 
 class DiTestTauRecConfigFlags(unittest.TestCase):
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
index 46e29df0c4e8..8c2546f6f680 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Ditau/DitauMenuSequences.py
@@ -93,7 +93,7 @@ def ditauRecoCfg(flags, inputJets: str, inputVertex: str, inputFSTracks: str,  i
         acc.popToolsAndMerge(DiTauIDVarDecoratorCfg(flags)),
         acc.popToolsAndMerge(DiTauOnnxScoreCalculatorCfg(
             flags, 
-            onnxModelPath=flags_ditau.DiTau.DiTauIDModel,
+            onnxModelPath=f"{flags_ditau.DiTau.CalibFolder}{flags_ditau.DiTau.DiTauIDModel}",
         )),
     ]
 
-- 
GitLab


From 799691a007cc693136269fb23710532bf9dd0ffb Mon Sep 17 00:00:00 2001
From: Qichen Dong <qichen.dong@cern.ch>
Date: Fri, 28 Mar 2025 17:08:19 +0000
Subject: [PATCH 8/8] forgot to stage cmakefile

---
 Reconstruction/DiTauRec/CMakeLists.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Reconstruction/DiTauRec/CMakeLists.txt b/Reconstruction/DiTauRec/CMakeLists.txt
index 25d37f5a2233..c57862387806 100644
--- a/Reconstruction/DiTauRec/CMakeLists.txt
+++ b/Reconstruction/DiTauRec/CMakeLists.txt
@@ -11,7 +11,7 @@ atlas_add_component( DiTauRec
                      src/*.cxx
                      src/components/*.cxx
                      INCLUDE_DIRS ${FASTJET_INCLUDE_DIRS}
-                     LINK_LIBRARIES ${FASTJET_LIBRARIES} AthenaBaseComps xAODEgamma xAODJet xAODMuon xAODTau GaudiKernel JetEDM TrkToolInterfaces CaloEvent xAODTracking RecoToolInterfaces StoreGateLib tauRecToolsLib TrkParametersIdentificationHelpers )
+                     LINK_LIBRARIES ${FASTJET_LIBRARIES} AthenaBaseComps xAODEgamma xAODJet xAODMuon xAODTau GaudiKernel JetEDM TrkToolInterfaces CaloEvent xAODTracking RecoToolInterfaces StoreGateLib tauRecToolsLib TrkParametersIdentificationHelpers PathResolver)
 
 # Install files from the package:
 atlas_install_python_modules( python/*.py POST_BUILD_CMD ${ATLAS_FLAKE8} )
-- 
GitLab