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, + ) #################