diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/builders/qqbar_to_ll_builders.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/builders/qqbar_to_ll_builders.py
new file mode 100644
index 0000000000000000000000000000000000000000..b6bd5b0ec1a501b506cc408b3b98f3106f38faa5
--- /dev/null
+++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/builders/qqbar_to_ll_builders.py
@@ -0,0 +1,267 @@
+###############################################################################
+# (c) Copyright 2021 CERN for the benefit of the LHCb Collaboration           #
+#                                                                             #
+# This software is distributed under the terms of the GNU General Public      #
+# Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING".   #
+#                                                                             #
+# In applying this licence, CERN does not waive the privileges and immunities #
+# granted to it by virtue of its status as an Intergovernmental Organization  #
+# or submit itself to any jurisdiction.                                       #
+###############################################################################
+"""                                                                                               
+Author: Raja Nandakumar, Fergus Wilson
+Contact: raja.nandakumar@cern.ch
+Date: 29/03/2022
+
+Extra builders :
+make_prompt_tautau : For Upsilon(1S) -> tau+ tau-
+    - Invariant mass : [7500, 13000] MeV
+    - Cos(opening angle) > 0.95
+    - PT > 1.5 GeV
+    - Tau cuts :
+      - Invariant MAss : [1200, 2000] MeV
+      - PID_K < -1.0
+
+make_prompt_etau : For Upsilon(1S) -> e+ tau-
+    - Invariant mass : [8000, 12000] MeV
+    - Cos(opening angle) > 0.95
+    - PT > 2.5 GeV
+    - Tau cuts :
+      - Invariant MAss : [1200, 2000] MeV
+      - PID_K < -1.0
+    - electron cuts:
+      - PID_E > 2.5
+      - PT > 1.5 GeV
+
+make_prompt_mutau: For Upsilon(1S) -> mu+ tau-
+    - Invariant mass : [7000, 13000] MeV
+    - PT > 1 GeV
+    - Tau cuts :
+      - Invariant MAss : [1000, 2000] MeV
+      - PID_K < 0.0
+    - muon cuts:
+      - PID_MU > 2.0
+
+make_upsilons_to_upsilons : For Upsilon(2S) -> Upsilon(1S) pi+ pi-
+    - Invariant mass : [7000, 13000] MeV
+    - PT > 1 GeV
+    - Pion cuts :
+      - PID_K < 0.0
+      - PT > 250 MeV
+"""
+
+from __future__ import absolute_import, division, print_function
+from PyConf import configurable
+from GaudiKernel.SystemOfUnits import GeV, MeV
+from RecoConf.reconstruction_objects import make_pvs
+
+from Hlt2Conf.lines.rd.builders.rdbuilder_thor import (
+    make_rd_prompt_muons,
+    make_rd_detached_pions,
+)
+from Hlt2Conf.lines.rd.builders.rdbuilder_thor import (
+    make_rd_tauons_hadronic_decay,
+    make_rd_prompt_electrons,
+)
+from Hlt2Conf.algorithms_thor import ParticleCombiner
+
+import Functors as F
+from Functors.math import in_range
+
+
+@configurable
+def make_prompt_tautau(
+        name="prompt_tautau_builder_{hash}",
+        min_dilepton_mass=7500.0 * MeV,
+        max_dilepton_mass=13000.0 * MeV,
+        min_dilepton_pt=1.5 * GeV,
+        max_ipchi2_tautau=10,
+        max_adocachi2=30.0,
+        parent_id="Upsilon(1S)",
+        min_bpvvdchi2=0.0,  # must be 0 for a prompt builder
+        cos_tautauangle=0.95,
+):
+    pvs = make_pvs()
+    descriptor = "{} -> tau+ tau-".format(parent_id)
+    taus = make_rd_tauons_hadronic_decay(
+        pi_pt_min=300 * MeV,
+        pi_ipchi2_min=3.0,
+        best_pi_pt_min=800 * MeV,
+        best_pi_ipchi2_min=5.0,
+        pi_pid=F.PID_K < -1.0,
+        am_min=1200 * MeV,
+        am_max=2000 * MeV,
+        vchi2pdof_max=12.0,
+    )
+
+    combination_code = F.require_all(
+        F.MAXDOCACHI2CUT(max_adocachi2),
+        F.ALV(1, 2) > cos_tautauangle,
+    )
+    vertex_code = F.require_all(
+        F.BPVFDCHI2(pvs) > min_bpvvdchi2,
+        in_range(min_dilepton_mass, F.MASS, max_dilepton_mass),
+        F.PT > min_dilepton_pt,
+        F.BPVIPCHI2(pvs) < max_ipchi2_tautau,
+    )
+    tautau = ParticleCombiner(
+        name=name,
+        Inputs=[taus, taus],
+        DecayDescriptor=descriptor,
+        CombinationCut=combination_code,
+        CompositeCut=vertex_code,
+    )
+    return tautau
+
+
+#####
+
+
+@configurable
+def make_prompt_etau(
+        name="prompt_etau_builder",
+        min_dilepton_mass=8000.0 * MeV,
+        max_dilepton_mass=12000.0 * MeV,
+        min_dilepton_pt=2.5 * GeV,
+        max_ipchi2_etau=9,
+        parent_id="Upsilon(1S)",
+        min_pid_e=2.5,
+        min_pt_e=1.5 * GeV,
+        max_adocachi2=20.0,
+        min_bpvvdchi2=0.0,  # must be 0 for a prompt builder
+        cos_etauangle=0.95,
+):
+    """
+    Make the detached electron-tau pair, opposite-sign for now.
+    """
+    pvs = make_pvs()
+    descriptor = "[{} -> tau- e+]cc".format(parent_id)
+    # taus = make_upsilon_taus()
+    taus = make_rd_tauons_hadronic_decay(
+        pi_pt_min=350 * MeV,
+        pi_ipchi2_min=3.0,
+        best_pi_pt_min=800 * MeV,
+        best_pi_ipchi2_min=5.0,
+        pi_pid=F.PID_K < -1.0,
+        am_min=1200 * MeV,
+        am_max=2000 * MeV,
+        vchi2pdof_max=12.0,
+    )
+    electrons = make_rd_prompt_electrons(
+        pt_min=min_pt_e, pid=(F.PID_E > min_pid_e))
+    combination_code = F.require_all(
+        F.MAXDOCACHI2CUT(max_adocachi2),
+        F.ALV(1, 2) > cos_etauangle,
+    )
+    vertex_code = F.require_all(
+        F.BPVFDCHI2(pvs) > min_bpvvdchi2,
+        in_range(min_dilepton_mass, F.MASS, max_dilepton_mass),
+        F.PT > min_dilepton_pt,
+        F.BPVIPCHI2(pvs) < max_ipchi2_etau,
+    )
+    etau = ParticleCombiner(
+        name=name,
+        Inputs=[taus, electrons],
+        DecayDescriptor=descriptor,
+        CombinationCut=combination_code,
+        CompositeCut=vertex_code,
+    )
+    return etau
+
+
+#####
+
+
+@configurable
+def make_prompt_mutau(
+        name="prompt_mutau_builder",
+        min_dilepton_mass=7000.0 * MeV,
+        max_dilepton_mass=13000.0 * MeV,
+        min_dilepton_pt=1.0 * GeV,
+        max_ipchi2_mutau=50,
+        parent_id="Upsilon(1S)",
+        min_PIDmu=2.0,
+        IsMuon=True,
+        min_pt_mu=0.0 * GeV,
+        max_adocachi2=30.0,
+        min_bpvvdchi2=0.0,  # must be 0 for a prompt builder
+):
+    """
+    Make the detached muon-tau pair, opposite-sign for now.
+    """
+    pvs = make_pvs()
+    descriptor = "[{} -> mu+ tau-]cc".format(parent_id)
+    taus = make_rd_tauons_hadronic_decay(
+        pi_pt_min=250 * MeV,
+        pi_ipchi2_min=6.0,
+        best_pi_pt_min=800 * MeV,
+        best_pi_ipchi2_min=9.0,
+        pi_pid=F.PID_K < 0.0,
+        am_min=1000 * MeV,
+        am_max=2000 * MeV,
+        vchi2pdof_max=16.0,
+    )
+
+    if IsMuon:
+        muons = make_rd_prompt_muons(
+            pt_min=min_pt_mu,
+            pid=F.require_all(F.PID_MU > min_PIDmu, F.ISMUON))
+    else:
+        muons = make_rd_prompt_muons(
+            pt_min=min_pt_mu, pid=(F.PID_MU > min_PIDmu))
+    combination_code = F.MAXDOCACHI2CUT(max_adocachi2)
+    vertex_code = F.require_all(
+        F.BPVFDCHI2(pvs) > min_bpvvdchi2,
+        in_range(min_dilepton_mass, F.MASS, max_dilepton_mass),
+        F.PT > min_dilepton_pt,
+        F.BPVIPCHI2(pvs) < max_ipchi2_mutau,
+    )
+    mutau = ParticleCombiner(
+        name=name,
+        Inputs=[muons, taus],
+        DecayDescriptor=descriptor,
+        CombinationCut=combination_code,
+        CompositeCut=vertex_code,
+    )
+    return mutau
+
+
+#####
+@configurable
+def make_upsilons_to_upsilons(
+        upsilon1s,
+        name="upsilon_ll_builder_{hash}",
+        min_dilepton_mass=7000.0 * MeV,
+        max_dilepton_mass=13000.0 * MeV,
+        min_dilepton_pt=1.0 * GeV,
+        min_bpvvdchi2=0.0,  # must be 0 for a prompt builder
+        max_adocachi2=30.0,
+        minipchi2=0,  # must be 0 for a prompt builder
+        # pion cut
+        pi_pt_min=250 * MeV,
+        pi_ipchi2_min=0.0,  # check if you want to filter on MINIPCHI2(pvs) < 0. or MINIPCHI2(pvs) < 1.
+        pi_pid=F.PID_K < 0.0,
+):
+    pion = make_rd_detached_pions(
+        pt_min=pi_pt_min, mipchi2dvprimary_min=pi_ipchi2_min, pid=pi_pid)
+
+    pvs = make_pvs()
+    combination_code = F.require_all(
+        in_range(min_dilepton_mass, F.MASS, max_dilepton_mass),
+        F.MAXDOCACHI2CUT(max_adocachi2),
+    )
+
+    vertex_code = F.require_all(
+        in_range(min_dilepton_mass, F.MASS, max_dilepton_mass),
+        F.PT > min_dilepton_pt,
+        F.BPVFDCHI2(pvs) > min_bpvvdchi2,
+    )
+
+    upsilon2s = ParticleCombiner(
+        [upsilon1s, pion, pion],
+        name=name,
+        DecayDescriptor="[Upsilon(2S) -> Upsilon(1S) pi+ pi-]cc",
+        CombinationCut=combination_code,
+        CompositeCut=vertex_code,
+    )
+    return upsilon2s
diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/builders/rdbuilder_thor.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/builders/rdbuilder_thor.py
index ea3f827e229218e2139c6452a062aab4ed87a3ae..e5a58693d24cb85b8271cbd7b242ca41723cb6c6 100644
--- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/builders/rdbuilder_thor.py
+++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/builders/rdbuilder_thor.py
@@ -987,7 +987,7 @@ def make_rd_prompt_mue(
         pt_min=pt_muon_min, p_min=p_muon_min, pid=pid_muon)
 
     electrons = make_rd_prompt_electrons(
-        name="rd_prompt_electrons_for" + name,
+        # name="rd_prompt_electrons_for" + name,
         pt_min=pt_electron_min,
         p_min=p_electron_min,
         pid=pid_electron)
diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/qqbar_to_ll.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/qqbar_to_ll.py
old mode 100644
new mode 100755
index db0fafc51e64e23beb0ac99ce2e5da25296e5ef8..bbc3f58b7c32eb8417110100dd52ae5fa497e61f
--- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/qqbar_to_ll.py
+++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/rd/qqbar_to_ll.py
@@ -24,14 +24,38 @@ Control channels:
 author: Miroslav Saur
 date: 27.12.2021
 
+- Upsilon(1S) -> tau+ tau-
+- Upsilon(1S) -> e+ tau-
+- Upsilon(1S) -> mu+ tau-
+- Upsilon(1S) -> mu+ mu-
+- Upsilon(2S) -> (Upsilon(1S) ->tau+ tau-) pi+ pi-
+- Upsilon(2S) -> (Upsilon(1S) ->mu+ mu-) pi+ pi-
+- Upsilon(2S) -> (Upsilon(1S) ->e+ e-) pi+ pi-
+
+author: Raja Nandakumar
+date: 27.05.2023
 """
 
 from GaudiKernel.SystemOfUnits import MeV, GeV
 from PyConf import configurable
 from Moore.config import register_line_builder
 from Moore.lines import Hlt2Line
-from Hlt2Conf.lines.rd.builders.rdbuilder_thor import make_rd_detached_mue, make_rd_prompt_mue, make_rd_prompt_dielectrons  #make_rd_prompt_dimuons
-from Hlt2Conf.lines.rd.builders.rd_prefilters import rd_prefilter, _VRD_MONITORING_VARIABLES
+from Hlt2Conf.lines.rd.builders.rdbuilder_thor import (
+    make_rd_detached_mue,
+    make_rd_prompt_mue,
+    make_rd_prompt_dielectrons,
+    make_rd_prompt_dimuons,
+)
+from Hlt2Conf.lines.rd.builders.qqbar_to_ll_builders import (
+    make_prompt_tautau,
+    make_prompt_etau,
+    make_prompt_mutau,
+    make_upsilons_to_upsilons,
+)
+from Hlt2Conf.lines.rd.builders.rd_prefilters import (
+    rd_prefilter,
+    _VRD_MONITORING_VARIABLES,
+)
 import Functors as F
 
 all_lines = {}
@@ -46,18 +70,20 @@ def phi_to_mue_line(name="Hlt2RD_PhiToMuE", prescale=0.01, persistreco=False):
     Definiton of [phi(1020) -> mu- e+]CC
     """
     emu = make_rd_prompt_mue(
-        parent_id='phi(1020)',
-        am_min=850. * MeV,  #850
-        am_max=1170. * MeV,  #1220
+        parent_id="phi(1020)",
+        am_min=850.0 * MeV,  # 850
+        am_max=1170.0 * MeV,  # 1220
         pt_dilepton_min=0.5 * GeV,
-        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.),
-        same_sign=False)
+        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.0),
+        same_sign=False,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
@@ -66,38 +92,41 @@ def phi_to_mue_ss_line(name="Hlt2RD_PhiToMuE_SS",
                        prescale=0.001,
                        persistreco=False):
     emu_SS = make_rd_prompt_mue(
-        parent_id='phi(1020)',
-        am_min=850. * MeV,
-        am_max=1170. * MeV,
+        parent_id="phi(1020)",
+        am_min=850.0 * MeV,
+        am_max=1170.0 * MeV,
         pt_dilepton_min=0.5 * GeV,
-        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.),
-        same_sign=True)
+        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.0),
+        same_sign=True,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu_SS],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
 @configurable
 def jpsi_to_mue_line(name="Hlt2RD_JpsiToMuE", prescale=1, persistreco=False):
-
     emu = make_rd_prompt_mue(
-        parent_id='J/psi(1S)',
-        am_min=2700. * MeV,
-        am_max=3400. * MeV,
+        parent_id="J/psi(1S)",
+        am_min=2700.0 * MeV,
+        am_max=3400.0 * MeV,
         pt_dilepton_min=2.5 * GeV,
         pt_electron_min=1.0 * GeV,
         pt_muon_min=1.0 * GeV,
-        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.))
+        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.0),
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
@@ -105,22 +134,23 @@ def jpsi_to_mue_line(name="Hlt2RD_JpsiToMuE", prescale=1, persistreco=False):
 def jpsi_to_mue_ss_line(name="Hlt2RD_JpsiToMuE_SS",
                         prescale=0.1,
                         persistreco=False):
-
     emu = make_rd_prompt_mue(
-        parent_id='J/psi(1S)',
-        am_min=2700. * MeV,
-        am_max=3400. * MeV,
+        parent_id="J/psi(1S)",
+        am_min=2700.0 * MeV,
+        am_max=3400.0 * MeV,
         pt_dilepton_min=2.5 * GeV,
         pt_electron_min=1.0 * GeV,
         pt_muon_min=1.0 * GeV,
-        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.),
-        same_sign=True)
+        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.0),
+        same_sign=True,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
@@ -128,22 +158,23 @@ def jpsi_to_mue_ss_line(name="Hlt2RD_JpsiToMuE_SS",
 def upsilon_to_mue_line(name="Hlt2RD_UpsilonToMuE",
                         prescale=1,
                         persistreco=False):
-
     emu = make_rd_prompt_mue(
-        parent_id='Upsilon(1S)',
-        am_min=8000. * MeV,
-        am_max=12000. * MeV,
+        parent_id="Upsilon(1S)",
+        am_min=8000.0 * MeV,
+        am_max=12000.0 * MeV,
         pt_dilepton_min=2.0 * GeV,
         pt_electron_min=1.0 * GeV,
         pt_muon_min=1.0 * GeV,
-        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.),
-        same_sign=False)
+        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.0),
+        same_sign=False,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
@@ -151,22 +182,92 @@ def upsilon_to_mue_line(name="Hlt2RD_UpsilonToMuE",
 def upsilon_to_mue_ss_line(name="Hlt2RD_UpsilonToMuE_SS",
                            prescale=1,
                            persistreco=False):
-
     emu = make_rd_prompt_mue(
-        parent_id='Upsilon(1S)',
-        am_min=8000. * MeV,
-        am_max=12000. * MeV,
+        parent_id="Upsilon(1S)",
+        am_min=8000.0 * MeV,
+        am_max=12000.0 * MeV,
         pt_dilepton_min=2.0 * GeV,
         pt_electron_min=1.0 * GeV,
         pt_muon_min=1.0 * GeV,
-        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.),
-        same_sign=True)
+        pid_muon=F.require_all(F.ISMUON, F.PID_MU > 3.0),
+        same_sign=True,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
+
+
+@register_line_builder(all_lines)
+@configurable
+def upsilonToTauTau_Line(name="Hlt2RD_UpsilonToTauTau",
+                         prescale=1,
+                         persistreco=False):
+    """
+    Definiton of [Upsilon(1S) -> tau- tau+]CC
+    """
+
+    tautau = make_prompt_tautau(
+        parent_id="Upsilon(1S)",
+        min_dilepton_mass=8000.0 * MeV,
+        max_dilepton_mass=12000.0 * MeV,
+        min_dilepton_pt=1.0 * GeV,
+        # pi_pt_min=150 * MeV,
+    )
+
+    return Hlt2Line(
+        name=name,
+        algs=rd_prefilter() + [tautau],
+        prescale=prescale,
+        persistreco=persistreco,
+    )
+
+
+@register_line_builder(all_lines)
+@configurable
+def upsilonToeTau_Line(name="Hlt2RD_UpsilonToTauE",
+                       prescale=1,
+                       persistreco=False):
+    etau = make_prompt_etau(
+        # name="Hlt2RD_UpsilonToTauE_Builder",
+        parent_id="Upsilon(1S)",
+        min_dilepton_mass=8000.0 * MeV,
+        max_dilepton_mass=12000.0 * MeV,
+    )
+
+    return Hlt2Line(
+        name=name,
+        algs=rd_prefilter() + [etau],
+        prescale=prescale,
+        persistreco=persistreco,
+    )
+
+
+@register_line_builder(all_lines)
+@configurable
+def upsilonTomuTau_Line(name="Hlt2RD_UpsilonToTauMu",
+                        prescale=1,
+                        persistreco=False):
+    mutau = make_prompt_mutau(
+        # name="Hlt2RD_UpsilonToTauMu_Builder",
+        parent_id="Upsilon(1S)",
+        min_dilepton_mass=7000.0 * MeV,
+        max_dilepton_mass=12000.0 * MeV,
+        min_dilepton_pt=1.0 * GeV,
+        min_pt_mu=1000 * MeV,
+        # pi_pt_min=150 * MeV,
+        IsMuon=True,
+    )
+
+    return Hlt2Line(
+        name=name,
+        algs=rd_prefilter() + [mutau],
+        prescale=prescale,
+        persistreco=persistreco,
+    )
 
 
 ##### DETACHED LINES #####
@@ -181,15 +282,15 @@ def phi_to_mue_detached_line(name="Hlt2RD_PhiToMuE_Detached",
     Definiton of [phi(1020) -> mu- e+]CC
     """
     emu = make_rd_detached_mue(
-        parent_id='phi(1020)',
-        min_dilepton_mass=800. * MeV,
-        max_dilepton_mass=1170. * MeV,
+        parent_id="phi(1020)",
+        min_dilepton_mass=800.0 * MeV,
+        max_dilepton_mass=1170.0 * MeV,
         min_probnn_mu=None,
         min_pt_e=0.4 * GeV,
         min_pt_mu=0.4 * GeV,
-        min_bpvvdchi2=30.,
-        max_vchi2ndof=4.,
-        min_PIDmu=3,
+        min_bpvvdchi2=30.0,
+        max_vchi2ndof=4.0,
+        min_PIDmu=2,
         IsMuon=True,
     )
     return Hlt2Line(
@@ -197,7 +298,8 @@ def phi_to_mue_detached_line(name="Hlt2RD_PhiToMuE_Detached",
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
@@ -209,23 +311,25 @@ def phi_to_mue_ss_detached_line(name="Hlt2RD_PhiToMuE_SS_Detached",
     Definiton of [phi(1020) -> mu+ e+]CC
     """
     emu = make_rd_detached_mue(
-        parent_id='phi(1020)',
-        min_dilepton_mass=800. * MeV,
-        max_dilepton_mass=1170. * MeV,
+        parent_id="phi(1020)",
+        min_dilepton_mass=800.0 * MeV,
+        max_dilepton_mass=1170.0 * MeV,
         min_probnn_mu=None,
         min_pt_e=0.4 * GeV,
         min_pt_mu=0.4 * GeV,
-        min_bpvvdchi2=30.,
-        max_vchi2ndof=4.,
-        min_PIDmu=3,
+        min_bpvvdchi2=30.0,
+        max_vchi2ndof=4.0,
+        min_PIDmu=2,
         IsMuon=True,
-        same_sign=True)
+        same_sign=True,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
@@ -237,15 +341,15 @@ def jpsi_to_mue_detached_line(name="Hlt2RD_JpsiToMuE_Detached",
     Definiton of [J/psi(1S) -> mu- e+]CC
     """
     emu = make_rd_detached_mue(
-        parent_id='J/psi(1S)',
-        min_dilepton_mass=2700. * MeV,
-        max_dilepton_mass=2400. * MeV,
+        parent_id="J/psi(1S)",
+        min_dilepton_mass=2700.0 * MeV,
+        max_dilepton_mass=3400.0 * MeV,
         min_probnn_mu=None,
-        min_pt_e=1. * GeV,
-        min_pt_mu=1. * GeV,
-        min_bpvvdchi2=30.,
-        max_vchi2ndof=4.,
-        min_PIDmu=3,
+        min_pt_e=1.0 * GeV,
+        min_pt_mu=1.0 * GeV,
+        min_bpvvdchi2=30.0,
+        max_vchi2ndof=4.0,
+        min_PIDmu=2,
         IsMuon=True,
     )
     return Hlt2Line(
@@ -253,7 +357,8 @@ def jpsi_to_mue_detached_line(name="Hlt2RD_JpsiToMuE_Detached",
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
@@ -265,23 +370,25 @@ def jpsi_to_mue_ss_detached_line(name="Hlt2RD_JpsiToMuE_SS_Detached",
     Definiton of [J/psi(1S) -> mu+ e+]CC
     """
     emu = make_rd_detached_mue(
-        parent_id='J/psi(1S)',
-        min_dilepton_mass=2700. * MeV,
-        max_dilepton_mass=3400. * MeV,
+        parent_id="J/psi(1S)",
+        min_dilepton_mass=2700.0 * MeV,
+        max_dilepton_mass=3400.0 * MeV,
         min_probnn_mu=None,
         min_pt_e=0.5 * GeV,
         min_pt_mu=0.5 * GeV,
-        min_bpvvdchi2=30.,
-        max_vchi2ndof=4.,
-        min_PIDmu=3,
+        min_bpvvdchi2=30.0,
+        max_vchi2ndof=4.0,
+        min_PIDmu=2,
         IsMuon=True,
-        same_sign=True)
+        same_sign=True,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 ##### CONTROL ee LINES #####
@@ -291,38 +398,42 @@ def jpsi_to_mue_ss_detached_line(name="Hlt2RD_JpsiToMuE_SS_Detached",
 @configurable
 def phi_to_ee_line(name="Hlt2RD_PhiToEE", prescale=0.01, persistreco=False):
     emu = make_rd_prompt_dielectrons(
-        parent_id='phi(1020)',
+        parent_id="phi(1020)",
         same_sign=False,
-        PIDe_min=2.,
+        PIDe_min=2.0,
         pt_e_min=1.5 * GeV,
         min_dilepton_pt=2.0 * GeV,
         min_dilepton_mass=850 * MeV,
-        max_dilepton_mass=1170 * MeV)
+        max_dilepton_mass=1170 * MeV,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
 @configurable
 def jpsi_to_ee_line(name="Hlt2RD_JpsiToEE", prescale=0.001, persistreco=False):
     emu = make_rd_prompt_dielectrons(
-        parent_id='J/psi(1S)',
+        parent_id="J/psi(1S)",
         same_sign=False,
-        PIDe_min=2.,
+        PIDe_min=2.0,
         pt_e_min=0.5 * GeV,
         min_dilepton_pt=1.0 * GeV,
         min_dilepton_mass=2700 * MeV,
-        max_dilepton_mass=3400 * MeV)
+        max_dilepton_mass=3400 * MeV,
+    )
     return Hlt2Line(
         name=name,
         algs=rd_prefilter() + [emu],
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
 
 
 @register_line_builder(all_lines)
@@ -330,20 +441,106 @@ def jpsi_to_ee_line(name="Hlt2RD_JpsiToEE", prescale=0.001, persistreco=False):
 def upsilon_to_ee_line(name="Hlt2RD_UpsilonToEE",
                        prescale=0.1,
                        persistreco=False):
-    emu = make_rd_prompt_dielectrons(
-        parent_id='Upsilon(1S)',
+    ee = make_rd_prompt_dielectrons(
+        parent_id="Upsilon(1S)",
         same_sign=False,
-        PIDe_min=2.,
-        pt_e_min=1. * GeV,
-        min_dilepton_pt=2.5 * GeV,
+        PIDe_min=2.0,
+        pt_e_min=1.0 * GeV,
+        min_dilepton_pt=1.0 * GeV,
         min_dilepton_mass=8000 * MeV,
-        max_dilepton_mass=12000 * MeV)
+        max_dilepton_mass=12000 * MeV,
+    )
     return Hlt2Line(
         name=name,
-        algs=rd_prefilter() + [emu],
+        algs=rd_prefilter() + [ee],
+        prescale=prescale,
+        persistreco=persistreco,
+        monitoring_variables=_VRD_MONITORING_VARIABLES,
+    )
+
+
+@register_line_builder(all_lines)
+@configurable
+def upsilon_to_mumu_line(name="Hlt2RD_UpsilonToMuMu",
+                         prescale=1,
+                         persistreco=False):
+    # From rdbuilder_thor - promptness is defined there. The variable mipchi2dvprimary_min is cut on for detached muons. So, if we want detached dimuons use
+    # make_rd_detached_dimuons instead of make_rd_prompt_dimuons
+    # in the line just below
+    mumu = make_rd_prompt_dimuons(
+        name="Hlt2RD_UpsilonToMuMu_Builder",
+        parent_id="Upsilon(1S)",
+        same_sign=False,
+        pid=F.require_all(F.PID_MU > 3.0, F.ISMUON),
+        pt_dimuon_min=1000.0 * MeV,
+        pt_muon_min=1000.0 * MeV,
+        p_muon_min=1000.0 * MeV,
+        adocachi2cut_max=30.0,
+        vchi2pdof_max=16.0,
+        am_min=7000.0 * MeV,
+        am_max=12000.0 * MeV,
+    )
+
+    return Hlt2Line(
+        name=name,
+        algs=rd_prefilter() + [mumu],
+        prescale=prescale,
+        persistreco=persistreco,
+    )
+
+
+##### Cascade upsilon decays #####
+
+
+@register_line_builder(all_lines)
+@configurable
+def upsilon2_to_upsilon1pipi_tautau_line(
+        name="Hlt2RD_Upsilon2ToUpsilon1PiPi_Upsilon1ToTauTau",
+        prescale=1,
+        persistreco=False):
+    upsilons1s = make_prompt_tautau()
+    upsilons2s = make_upsilons_to_upsilons(upsilons1s)
+    return Hlt2Line(
+        name=name,
+        algs=rd_prefilter() + [upsilons1s, upsilons2s
+                               ],  # this helps the control flow
         prescale=prescale,
         persistreco=persistreco,
-        monitoring_variables=_VRD_MONITORING_VARIABLES)
+    )
+
+
+@register_line_builder(all_lines)
+@configurable
+def upsilon2_to_upsilon1pipi_mumu_line(
+        name="Hlt2RD_Upsilon2ToUpsilon1PiPi_Upsilon1ToMuMu",
+        prescale=1,
+        persistreco=False):
+    upsilons1s = make_rd_prompt_dimuons()
+    upsilons2s = make_upsilons_to_upsilons(upsilons1s)
+    return Hlt2Line(
+        name=name,
+        algs=rd_prefilter() + [upsilons1s, upsilons2s
+                               ],  # this helps the control flow
+        prescale=prescale,
+        persistreco=persistreco,
+    )
+
+
+@register_line_builder(all_lines)
+@configurable
+def upsilon2_to_upsilon1pipi_ee_line(
+        name="Hlt2RD_Upsilon2ToUpsilon1PiPi_Upsilon1ToEE",
+        prescale=1,
+        persistreco=False):
+    upsilons1s = make_rd_prompt_dielectrons()
+    upsilons2s = make_upsilons_to_upsilons(upsilons1s)
+    return Hlt2Line(
+        name=name,
+        algs=rd_prefilter() + [upsilons1s, upsilons2s
+                               ],  # this helps the control flow
+        prescale=prescale,
+        persistreco=persistreco,
+    )
 
 
 #################