###############################################################################
# (c) Copyright 2022-2023 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. #
###############################################################################
"""
Definition of the W/Z rare decay HLT2 lines, including W/Z -> photon + hadron.
"""
import Functors as F
from Functors.math import in_range
from GaudiKernel.SystemOfUnits import GeV, picosecond
from PyConf import configurable
from Moore.config import register_line_builder
from Moore.lines import Hlt2Line
from RecoConf.reconstruction_objects import make_pvs, upfront_reconstruction
from RecoConf.event_filters import require_pvs
from Hlt2Conf.algorithms_thor import ParticleFilter, ParticleCombiner
from Hlt2Conf.standard_particles import make_has_rich_long_pions, make_has_rich_long_kaons, make_has_rich_long_protons
from Hlt2Conf.lines.charmonium_to_dimuon import make_charmonium_dimuon as make_dimuon
from Hlt2Conf.lines.qee.qee_builders import make_photons
from Hlt2Conf.standard_jets import make_jets
all_lines = {}
@configurable
def make_EW_pions(pvs,
p_min=1 * GeV,
min_pt=1 * GeV,
p_pidk_max=5.,
mipchi2_min=0):
code = F.require_all(F.P > p_min, F.PT > min_pt, F.PID_K < p_pidk_max,
F.MINIPCHI2(pvs) > mipchi2_min)
particles = make_has_rich_long_pions()
return ParticleFilter(particles, F.FILTER(code))
@configurable
def make_EW_kaons(pvs,
p_min=1 * GeV,
min_pt=1 * GeV,
p_pidk_min=-5,
mipchi2_min=0):
code = F.require_all(F.P > p_min, F.PT > min_pt, F.PID_K > p_pidk_min,
F.MINIPCHI2(pvs) > mipchi2_min)
particles = make_has_rich_long_kaons()
return ParticleFilter(particles, F.FILTER(code))
@configurable
def make_EW_protons(pvs,
p_min=1 * GeV,
min_pt=1 * GeV,
p_pidp_min=-5,
mipchi2_min=0):
code = F.require_all(F.P > p_min, F.PT > min_pt, F.PID_P > p_pidp_min,
F.MINIPCHI2(pvs) > mipchi2_min)
particles = make_has_rich_long_protons()
return ParticleFilter(particles, F.FILTER(code))
@configurable
def make_EW_detached_Jpsi(pvs,
name='EW_Detached_Jpsi_{hash}',
minIPChi2_muon=4,
bpvdls_min=9.,
minMass_dimuon=3.0 * GeV,
maxMass_dimuon=3.2 * GeV):
make_particles = make_dimuon(
minIPChi2_muon=minIPChi2_muon,
minMass_dimuon=minMass_dimuon,
maxMass_dimuon=maxMass_dimuon)
code = (F.BPVDLS(pvs) > bpvdls_min)
return ParticleFilter(make_particles, name=name, Cut=F.FILTER(code))
@configurable
def make_EW_Prompt_Jpsi(name='EW_Prompt_Jpsi_{hash}',
minMass_dimuon=3. * GeV,
maxMass_dimuon=4. * GeV,
min_pt=0.5 * GeV,
maxVertexChi2=20.):
return make_dimuon(
name=name,
minMass_dimuon=minMass_dimuon,
maxMass_dimuon=maxMass_dimuon,
minPt_dimuon=min_pt,
maxVertexChi2=maxVertexChi2)
@configurable
def make_EW_Upsilon(name='EW_Upsilon_{hash}',
minMass_dimuon=9. * GeV,
maxMass_dimuon=11. * GeV,
min_pt=0.5 * GeV,
maxVertexChi2=20.):
return make_dimuon(
name=name,
DecayDescriptor='Upsilon(1S) -> mu+ mu-',
minMass_dimuon=minMass_dimuon,
maxMass_dimuon=maxMass_dimuon,
minPt_dimuon=min_pt,
maxVertexChi2=maxVertexChi2)
@configurable
def make_EW_DiMuon(name='EW_DiMuon_{hash}',
minMass_dimuon=15. * GeV,
maxMass_dimuon=75. * GeV,
min_pt=5.0 * GeV,
maxVertexChi2=20.):
return make_dimuon(
name=name,
minMass_dimuon=minMass_dimuon,
maxMass_dimuon=maxMass_dimuon,
minPt_dimuon=min_pt,
maxVertexChi2=maxVertexChi2)
@configurable
def make_EW_PhiToKK(pvs,
name='EW_PhiToKK_{hash}',
min_pt=0.5 * GeV,
comb_m_min=0.98 * GeV,
comb_m_max=1.06 * GeV,
max_docachi2=30.,
max_vchi2pdof=10,
mipchi2_min=4.):
kaons = make_EW_kaons(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(
in_range(comb_m_min, F.MASS, comb_m_max),
F.MAXSDOCACHI2CUT(max_docachi2))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof)
return ParticleCombiner(
name=name,
Inputs=[kaons, kaons],
DecayDescriptor='phi(1020) -> K+ K-',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_KstToKPi(pvs,
name='EW_KstToKPi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=0.826 * GeV,
comb_m_max=0.966 * GeV,
max_docachi2=30.,
max_vchi2pdof=10,
mipchi2_min=4.):
pions = make_EW_pions(pvs, mipchi2_min=mipchi2_min)
kaons = make_EW_kaons(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(
in_range(comb_m_min, F.MASS, comb_m_max),
F.MAXSDOCACHI2CUT(max_docachi2))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof)
return ParticleCombiner(
name=name,
Inputs=[kaons, pions],
DecayDescriptor='[K*(892)0 -> K+ pi-]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_LcToPKPi(pvs,
name='EW_LcToPKPi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=2.22 * GeV,
comb_m_max=2.35 * GeV,
max_docachi2=30.,
max_vchi2pdof=10,
mipchi2_min=3,
DecayDescriptor='[Lambda_c+ -> p+ K- pi+]cc'):
pions = make_EW_pions(pvs, mipchi2_min=mipchi2_min)
kaons = make_EW_kaons(pvs, mipchi2_min=mipchi2_min)
protons = make_EW_protons(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(
in_range(comb_m_min, F.MASS, comb_m_max),
F.MAXSDOCACHI2CUT(max_docachi2))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof)
return ParticleCombiner(
name=name,
Inputs=[protons, kaons, pions],
DecayDescriptor=DecayDescriptor,
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_Xic0ToPKKPi(pvs,
name='EW_Xic0ToPKKPi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=2.4 * GeV,
comb_m_max=2.53 * GeV,
max_docachi2=30.,
max_vchi2pdof=10,
mipchi2_min=3):
pions = make_EW_pions(pvs, mipchi2_min=mipchi2_min)
kaons = make_EW_kaons(pvs, mipchi2_min=mipchi2_min)
protons = make_EW_protons(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(
in_range(comb_m_min, F.MASS, comb_m_max),
F.MAXSDOCACHI2CUT(max_docachi2))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof)
return ParticleCombiner(
name=name,
Inputs=[protons, kaons, kaons, pions],
DecayDescriptor='[Xi_c0 -> p+ K- K- pi+]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_DpToKPiPi(pvs,
name='EW_DpToKPiPi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=1.80 * GeV,
comb_m_max=1.93 * GeV,
max_vchi2pdof=9,
mipchi2_min=4,
bpvltime_min=0.2 * picosecond,
bpvfdchi2_min=100.):
pions = make_EW_pions(pvs, mipchi2_min=mipchi2_min)
kaons = make_EW_kaons(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(in_range(comb_m_min, F.MASS, comb_m_max))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof,
F.BPVLTIME(pvs) > bpvltime_min,
F.BPVFDCHI2(pvs) > bpvfdchi2_min)
return ParticleCombiner(
name=name,
Inputs=[kaons, pions, pions],
DecayDescriptor='[D+ -> K- pi+ pi+]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_DspToKKPi(pvs,
name='EW_DspToKKPi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=1.91 * GeV,
comb_m_max=2.03 * GeV,
max_vchi2pdof=9,
mipchi2_min=4,
bpvltime_min=0.2 * picosecond,
bpvfdchi2_min=100.):
pions = make_EW_pions(pvs, mipchi2_min=mipchi2_min)
kaons = make_EW_kaons(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(in_range(comb_m_min, F.MASS, comb_m_max))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof,
F.BPVLTIME(pvs) > bpvltime_min,
F.BPVFDCHI2(pvs) > bpvfdchi2_min)
return ParticleCombiner(
name=name,
Inputs=[kaons, kaons, pions],
DecayDescriptor='[D_s+ -> K- K+ pi+]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_D0ToKPi(pvs,
name='EW_D0ToKPi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=1.80 * GeV,
comb_m_max=1.93 * GeV,
max_vchi2pdof=9,
mipchi2_min=4,
bpvfdchi2_min=25.):
pions = make_EW_pions(pvs, mipchi2_min=mipchi2_min)
kaons = make_EW_kaons(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(in_range(comb_m_min, F.MASS, comb_m_max))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof,
F.BPVFDCHI2(pvs) > bpvfdchi2_min)
return ParticleCombiner(
name=name,
Inputs=[kaons, pions],
DecayDescriptor='[D0 -> K- pi+]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_B0ToJPsiKst(pvs,
name='EW_B0ToJPsiKst_{hash}',
min_pt=0.5 * GeV,
comb_m_min=5.0 * GeV,
comb_m_max=5.6 * GeV,
max_vchi2pdof=9,
mipchi2_min=4,
bpvfdchi2_min=10.,
lifetime=0.2 * picosecond):
jpsi = make_EW_detached_Jpsi(pvs, minIPChi2_muon=mipchi2_min)
kst = make_EW_KstToKPi(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(in_range(comb_m_min, F.MASS, comb_m_max))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof,
F.BPVFDCHI2(pvs) > bpvfdchi2_min,
F.BPVLTIME(pvs) > lifetime)
return ParticleCombiner(
name=name,
Inputs=[jpsi, kst],
DecayDescriptor='[B0 -> J/psi(1S) K*(892)0]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_BsToJPsiPhi(pvs,
name='EW_BsToJPsiPhi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=5.0 * GeV,
comb_m_max=5.6 * GeV,
max_vchi2pdof=9,
mipchi2_min=4,
bpvfdchi2_min=10.,
lifetime=0.2 * picosecond):
jpsi = make_EW_detached_Jpsi(pvs, minIPChi2_muon=mipchi2_min)
phi = make_EW_PhiToKK(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(in_range(comb_m_min, F.MASS, comb_m_max))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof,
F.BPVFDCHI2(pvs) > bpvfdchi2_min,
F.BPVLTIME(pvs) > lifetime)
return ParticleCombiner(
name=name,
Inputs=[jpsi, phi],
DecayDescriptor='B_s0 -> J/psi(1S) phi(1020)',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_BpToJPsiK(pvs,
name='EW_BpToJPsiK_{hash}',
min_pt=0.5 * GeV,
comb_m_min=5.0 * GeV,
comb_m_max=5.6 * GeV,
max_vchi2pdof=9,
mipchi2_min=4,
bpvfdchi2_min=10.,
lifetime=0.2 * picosecond):
jpsi = make_EW_detached_Jpsi(pvs, minIPChi2_muon=mipchi2_min)
kaons = make_EW_kaons(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(in_range(comb_m_min, F.MASS, comb_m_max))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof,
F.BPVFDCHI2(pvs) > bpvfdchi2_min,
F.BPVLTIME(pvs) > lifetime)
return ParticleCombiner(
name=name,
Inputs=[jpsi, kaons],
DecayDescriptor='[B+ -> J/psi(1S) K+]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_BcToJPsiPi(pvs,
name='EW_BcToJPsiPi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=6.09 * GeV,
comb_m_max=6.51 * GeV,
max_vchi2pdof=9,
mipchi2_min=4,
bpvfdchi2_min=10.,
lifetime=0.1 * picosecond):
jpsi = make_EW_detached_Jpsi(pvs, minIPChi2_muon=mipchi2_min)
pions = make_EW_pions(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(in_range(comb_m_min, F.MASS, comb_m_max))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof,
F.BPVFDCHI2(pvs) > bpvfdchi2_min,
F.BPVLTIME(pvs) > lifetime)
return ParticleCombiner(
name=name,
Inputs=[jpsi, pions],
DecayDescriptor='[B_c+ -> J/psi(1S) pi+]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_EW_LbToLcPi(pvs,
name='EW_LbToLcPi_{hash}',
min_pt=0.5 * GeV,
comb_m_min=5.35 * GeV,
comb_m_max=5.85 * GeV,
max_vchi2pdof=9,
mipchi2_min=4,
bpvfdchi2_min=10.,
lifetime=0.2 * picosecond):
lc = make_EW_LcToPKPi(pvs, mipchi2_min=mipchi2_min)
pions = make_EW_pions(pvs, mipchi2_min=mipchi2_min)
combination_code = F.require_all(in_range(comb_m_min, F.MASS, comb_m_max))
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof,
F.BPVFDCHI2(pvs) > bpvfdchi2_min,
F.BPVLTIME(pvs) > lifetime)
return ParticleCombiner(
name=name,
Inputs=[lc, pions],
DecayDescriptor='[Lambda_b0 -> Lambda_c+ pi-]cc',
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def make_PhotonHadron(particles,
min_mass=40. * GeV,
decay_descriptor='H_10 -> mu+ mu-'):
combination_code = F.require_all(F.MASS > min_mass)
return ParticleCombiner(
particles,
ParticleCombiner="ParticleAdder",
DecayDescriptor=decay_descriptor,
CombinationCut=combination_code)
@configurable
def make_HadHadMuMu(particles,
min_mass=40. * GeV,
min_pt=0. * GeV,
max_vchi2pdof=10,
decay_descriptor='[W+ -> J/psi(1S) phi(1020) D_s+]cc'):
combination_code = F.require_all(F.MASS > min_mass)
vertex_code = F.require_all(F.PT > min_pt, F.CHI2 < max_vchi2pdof)
return ParticleCombiner(
particles,
DecayDescriptor=decay_descriptor,
CombinationCut=combination_code,
CompositeCut=vertex_code)
@configurable
def Get_HadronFuns(decay_type="DpGamma"):
dict_fun = {
"JetGamma": make_jets,
"DpGamma": make_EW_DpToKPiPi,
"DspGamma": make_EW_DspToKKPi,
"LcpGamma": make_EW_LcToPKPi,
"XicpGamma": make_EW_LcToPKPi,
"BpGamma": make_EW_BpToJPsiK,
"BcpGamma": make_EW_BcToJPsiPi,
"JPsiGamma": make_EW_Prompt_Jpsi,
"UpsilonGamma": make_EW_Upsilon,
"DzGamma": make_EW_D0ToKPi,
"Xic0Gamma": make_EW_Xic0ToPKKPi,
"B0Gamma": make_EW_B0ToJPsiKst,
"BsGamma": make_EW_BsToJPsiPhi,
"LbGamma": make_EW_LbToLcPi,
"JPsi": make_EW_Prompt_Jpsi,
"DiMuon": make_EW_DiMuon,
"Dsp": make_EW_DspToKKPi,
"Pion": make_EW_pions,
}
hadron_fun = dict_fun.get(decay_type)
return hadron_fun
@configurable
def Get_DecayDescriptor(decay_type="DpGamma"):
dict_decay = {
"JetGamma": "Z0 -> CELLjet gamma",
"DpGamma": "[W+ -> D+ gamma]cc",
"DspGamma": "[W+ -> D_s+ gamma]cc",
"LcpGamma": "[W+ -> Lambda_c+ gamma]cc",
"XicpGamma": "[W+ -> Xi_c+ gamma]cc",
"BpGamma": "[W+ -> B+ gamma]cc",
"BcpGamma": "[W+ -> B_c+ gamma]cc",
"JPsiGamma": "Z0 -> J/psi(1S) gamma",
"UpsilonGamma": "Z0 -> Upsilon(1S) gamma",
"DzGamma": "[Z0 -> D0 gamma]cc",
"Xic0Gamma": "[Z0 -> Xi_c0 gamma]cc",
"B0Gamma": "[Z0 -> B0 gamma]cc",
"BsGamma": "[Z0 -> B_s0 gamma]cc",
"LbGamma": "[Z0 -> Lambda_b0 gamma]cc",
"JPsiDsp": "[W+ -> J/psi(1S) D_s+]cc",
"DiMuonDsp": "[W+ -> J/psi(1S) D_s+]cc",
"DiMuonPion": "[W+ -> J/psi(1S) pi+]cc",
}
DecayDescriptor = dict_decay.get(decay_type)
return DecayDescriptor
@configurable
def make_WRareDecay_DiMuonPhiDsp_cand(pvs):
dimuon = make_EW_Prompt_Jpsi(min_pt=5. * GeV)
phi = make_EW_PhiToKK(pvs, min_pt=5. * GeV)
dsplus = make_EW_DspToKKPi(pvs, min_pt=5. * GeV)
decay_gammahadron = '[W+ -> J/psi(1S) phi(1020) D_s+]cc'
min_mass = 30. * GeV
line_alg = make_HadHadMuMu(
particles=[dimuon, phi, dsplus],
min_mass=min_mass,
decay_descriptor=decay_gammahadron)
return line_alg
@configurable
def make_WZRareDecay_HadronGamma_cand(pvs,
photon_type="DD",
decay_type="DpGamma"):
hadron_fun = Get_HadronFuns(decay_type=decay_type)
min_mass = 3. * GeV
if decay_type == "XicpGamma":
hadron = hadron_fun(
pvs,
min_pt=5. * GeV,
comb_m_min=2.4 * GeV,
comb_m_max=2.53 * GeV,
DecayDescriptor='[Xi_c+ -> p+ K- pi+]cc')
elif decay_type == "JetGamma":
hadron = hadron_fun(pt_min=20. * GeV)
min_mass = 10. * GeV
elif decay_type in ["UpsilonGamma", "JPsiGamma"]:
hadron = hadron_fun(min_pt=5. * GeV)
else:
hadron = hadron_fun(pvs, min_pt=5. * GeV)
if photon_type == "All" or decay_type == "JetGamma":
gamma = make_photons(photon_type=photon_type, pt_min=15. * GeV)
else:
gamma = make_photons(photon_type=photon_type, pt_min=10. * GeV)
decay_gammahadron = Get_DecayDescriptor(decay_type=decay_type)
line_alg = make_PhotonHadron(
particles=[hadron, gamma],
min_mass=min_mass,
decay_descriptor=decay_gammahadron)
return line_alg
@configurable
def make_WZRareDecay_DiMuonMeson_cand(pvs, decay_type="JPsiDsp"):
if "JPsi" in decay_type:
hadron_fun1 = Get_HadronFuns(decay_type="JPsi")
elif "DiMuon" in decay_type:
hadron_fun1 = Get_HadronFuns(decay_type="DiMuon")
if "Dsp" in decay_type:
hadron_fun2 = Get_HadronFuns(decay_type="Dsp")
elif "Pion" in decay_type:
hadron_fun2 = Get_HadronFuns(decay_type="Pion")
min_mass = 3. * GeV
hadron1 = hadron_fun1(min_pt=10. * GeV)
hadron2 = hadron_fun2(pvs, min_pt=10. * GeV)
decay_gammahadron = Get_DecayDescriptor(decay_type=decay_type)
line_alg = make_PhotonHadron(
particles=[hadron1, hadron2],
min_mass=min_mass,
decay_descriptor=decay_gammahadron)
return line_alg
[docs]@register_line_builder(all_lines)
@configurable
def Dimuon_PhiDsp_line(name='Hlt2QEE_WZRareJPsiPhiDsp',
prescale=1,
persistreco=False):
"""W+ -> Jpsi phi(1020) Ds+ line"""
pvs = make_pvs()
had_gamma = make_WRareDecay_DiMuonPhiDsp_cand(pvs)
return Hlt2Line(
name=name,
algs=upfront_reconstruction() + [require_pvs(pvs), had_gamma],
prescale=prescale,
persistreco=persistreco,
calo_digits=True,
calo_clusters=True)
for decay_type in ["JPsiDsp", "DiMuonDsp", "DiMuonPion"]:
[docs] @register_line_builder(all_lines)
@configurable
def Dimuon_Meson_line(name=f'Hlt2QEE_WZRare{decay_type}',
decay_type=f'{decay_type}',
prescale=1,
persistreco=False):
f"""{decay_type} line"""
pvs = make_pvs()
had_gamma = make_WZRareDecay_DiMuonMeson_cand(
pvs, decay_type=decay_type)
return Hlt2Line(
name=name,
algs=upfront_reconstruction() + [require_pvs(pvs), had_gamma],
prescale=prescale,
persistreco=persistreco,
calo_digits=True,
calo_clusters=True)
for decay_type in [
"JetGamma", "DpGamma", "DspGamma", "LcpGamma", "XicpGamma", "BpGamma",
"BcpGamma", "JPsiGamma", "UpsilonGamma", "DzGamma", "Xic0Gamma",
"B0Gamma", "BsGamma", "LbGamma"
]:
for photon_type, line_suffix in zip(["LL", "DD", "All"], ["LL", "DD", ""]):
[docs] @register_line_builder(all_lines)
@configurable
def WZRareDecay_HadronGamma_line(
name=f'Hlt2QEE_WZRare{decay_type}{line_suffix}',
decay_type=f'{decay_type}',
photon_type=f'{photon_type}',
prescale=1,
persistreco=False):
f"""{decay_type} ({photon_type} photons) line"""
pvs = make_pvs()
had_gamma = make_WZRareDecay_HadronGamma_cand(
pvs, photon_type=photon_type, decay_type=decay_type)
return Hlt2Line(
name=name,
algs=upfront_reconstruction() + [require_pvs(pvs), had_gamma],
prescale=prescale,
persistreco=persistreco,
calo_digits=True,
calo_clusters=True)