diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/dielectron_persist_photons.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/dielectron_persist_photons.py index 504bbefe2386f0bfa46fb34d94ace4a4102765d4..4b44210fd23361c7fb4d57e9aded49dfe79b08e3 100644 --- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/dielectron_persist_photons.py +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/dielectron_persist_photons.py @@ -28,7 +28,6 @@ from RecoConf.standard_particles import ( make_has_rich_long_pions, make_long_electrons_no_brem, make_photons, - make_prompt_dielectron_with_brem, ) full_lines = {} @@ -67,35 +66,16 @@ def charged_pion_filter(pi_minpt): @configurable -def dielectron_maker_prompt(e_minpt, isOS): - return make_prompt_dielectron_with_brem( - electron_maker=make_long_electrons_no_brem, - opposite_sign=isOS, - PIDe_min=0.0, - pt_e=e_minpt, - maxipchi2=2.0, - trghostprob=0.25, - dielectron_ID="J/psi(1S)", - pt_diE=0 * MeV, - m_diE_min=5 * MeV, - m_diE_max=300 * MeV, - adocachi2cut=30, - bpvvdchi2=None, - vfaspfchi2ndof=10, - ) - - -@configurable -def dielectron_maker_displaced(e_minpt, isOS): +def dielectron_maker_displaced(e_minpt, isOS, minipchi2=4.0): return make_detached_dielectron_with_brem( electron_maker=make_long_electrons_no_brem, opposite_sign=isOS, PIDe_min=0.0, pt_e=e_minpt, - minipchi2=2.0, + minipchi2=minipchi2, trghostprob=0.25, dielectron_ID="J/psi(1S)", - pt_diE=0 * MeV, + pt_diE=500 * MeV, # HLT1 cuts on the SumPT > 1000 m_diE_min=5 * MeV, m_diE_max=300 * MeV, adocachi2cut=30, @@ -104,89 +84,138 @@ def dielectron_maker_displaced(e_minpt, isOS): ) -# OS Prompt lines (one to turbo, prescaled to full) -@register_line_builder(turbo_lines) -@configurable -def dielectron_sp_prompt_line( - name="Hlt2QEE_DiElectronPrompt_PersistPhotons", - prescale=1, - persistreco=False, - e_minpt=0.0, - make_pvs=make_pvs, -): - """Aiming for prompt pi0/eta -> gamma e+ e- decays. Label the dielectron - as J/psi(1S) [during brem-recovery-reconstruction of dielectron pair] and - save photons if Pi0/eta in mass range of [5, 700]MeV.""" - pvs = make_pvs() - - dielectrons_prompt = dielectron_maker_prompt(e_minpt, isOS=True) - - photons_table = WeightedRelTableAlg( - InputCandidates=photon_filter(), - ReferenceParticles=dielectrons_prompt, - Cut=in_range(comb_mass_limits[0], F.COMB_MASS(), comb_mass_limits[1]), - ) - - return Hlt2Line( - name=name, - algs=upfront_reconstruction() + [require_pvs(pvs), dielectrons_prompt], - persistreco=persistreco, - extra_outputs=[ - ( - "DiElectronPrompt_Photons", - SelectionFromRelationTable( - InputRelations=photons_table.OutputRelations - ).OutputLocation, - ) - ], - prescale=prescale, - monitoring_variables=_default_monitoring_variables, - hlt1_filter_code=["Hlt1DiElectronLowMass_massSlice.*_promptDecision"], - ) - - -@register_line_builder(full_lines) -@configurable -def dielectron_sp_prompt_line_full( - name="Hlt2QEE_DiElectronPrompt_PersistPhotons_Full", - prescale=0.05, - persistreco=True, - e_minpt=0.0, - make_pvs=make_pvs, -): - """Copy of turbo line, but strongly prescaled, which allows full-event - studies e.g. of brem correction and background template for e+e- pairs - combined with a random photon (4-vector deduced from e+e- in same event - and charged pion momentum)""" - pvs = make_pvs() - - dielectrons_prompt = dielectron_maker_prompt(e_minpt, isOS=True) - - photons_table = WeightedRelTableAlg( - InputCandidates=photon_filter(), - ReferenceParticles=dielectrons_prompt, - Cut=in_range(comb_mass_limits[0], F.COMB_MASS(), comb_mass_limits[1]), - ) - - extra_pions = charged_pion_filter(pi_minpt=75.0 * MeV) - - return Hlt2Line( - name=name, - algs=upfront_reconstruction() + [require_pvs(pvs), dielectrons_prompt], - persistreco=persistreco, - extra_outputs=[ - ( - "DiElectronPrompt_Photons", - SelectionFromRelationTable( - InputRelations=photons_table.OutputRelations - ).OutputLocation, - ), - ("ChargedPions", extra_pions), - ], - prescale=prescale, - monitoring_variables=_default_monitoring_variables, - hlt1_filter_code=["Hlt1DiElectronLowMass_massSlice.*_promptDecision"], - ) +# Add regular and Normalization line to. The Norm line is intended to normalize the displace yield to the prompt +# because of the different PID cuts in HLT1. +for kind in "", "Norm": + e_pt_cut = 0 if kind == "Norm" else 300 + + # OS Prompt lines (one to turbo, prescaled to full) + @register_line_builder(turbo_lines) + @configurable + def dielectron_sp_noip_line( + name=f"Hlt2QEE_DiElectronNoIP{kind}_PersistPhotons", + prescale=0.1 if kind == "Norm" else 1, + persistreco=False, + e_minpt=e_pt_cut, # HLT1 cuts on the PT + make_pvs=make_pvs, + ): + """Aiming for prompt pi0/eta -> gamma e+ e- decays. Label the dielectron + as J/psi(1S) [during brem-recovery-reconstruction of dielectron pair] and + save photons if Pi0/eta in mass range of [5, 700]MeV.""" + pvs = make_pvs() + + dielectrons_prompt = dielectron_maker_displaced( + e_minpt, isOS=True, minipchi2=-1 + ) + + photons_table = WeightedRelTableAlg( + InputCandidates=photon_filter(), + ReferenceParticles=dielectrons_prompt, + Cut=in_range(comb_mass_limits[0], F.COMB_MASS(), comb_mass_limits[1]), + ) + + return Hlt2Line( + name=name, + algs=upfront_reconstruction() + [require_pvs(pvs), dielectrons_prompt], + persistreco=persistreco, + extra_outputs=[ + ( + f"DiElectronPrompt{kind}_Photons", + SelectionFromRelationTable( + InputRelations=photons_table.OutputRelations + ).OutputLocation, + ) + ], + prescale=prescale, + monitoring_variables=_default_monitoring_variables, + hlt1_filter_code=[f"Hlt1DiElectronLowMass_NoIP{kind}Decision"], + ) + + @register_line_builder(full_lines) + @configurable + def dielectron_sp_noip_line_full( + name=f"Hlt2QEE_DiElectronNoIP{kind}_PersistPhotons_Full", + prescale=0.05, + persistreco=True, + e_minpt=e_pt_cut, + make_pvs=make_pvs, + ): + """Copy of turbo line, but strongly prescaled, which allows full-event + studies e.g. of brem correction and background template for e+e- pairs + combined with a random photon (4-vector deduced from e+e- in same event + and charged pion momentum)""" + pvs = make_pvs() + + dielectrons_prompt = dielectron_maker_displaced( + e_minpt, isOS=True, minipchi2=-1 + ) + + photons_table = WeightedRelTableAlg( + InputCandidates=photon_filter(), + ReferenceParticles=dielectrons_prompt, + Cut=in_range(comb_mass_limits[0], F.COMB_MASS(), comb_mass_limits[1]), + ) + + extra_pions = charged_pion_filter(pi_minpt=75.0 * MeV) + + return Hlt2Line( + name=name, + algs=upfront_reconstruction() + [require_pvs(pvs), dielectrons_prompt], + persistreco=persistreco, + extra_outputs=[ + ( + f"DiElectronPrompt{kind}_Photons", + SelectionFromRelationTable( + InputRelations=photons_table.OutputRelations + ).OutputLocation, + ), + ("ChargedPions", extra_pions), + ], + prescale=prescale, + monitoring_variables=_default_monitoring_variables, + hlt1_filter_code=[f"Hlt1DiElectronLowMass_NoIP{kind}Decision"], + ) + + @register_line_builder(turbo_lines) + @configurable + def dielectron_sp_noip_same_sign_line( + name=f"Hlt2QEE_DiElectronNoIP{kind}_PersistPhotonsSS", + prescale=0.1, + persistreco=False, + e_minpt=e_pt_cut, + make_pvs=make_pvs, + ): + """Aiming to normalize prompt pi0/eta -> gamma e+ e+ or gamma e- e- decays. Label + the doubly-charged dielectron as J/psi(1S) and save photons if Pi0/eta in + mass range of [5, 700]MeV.""" + pvs = make_pvs() + + dielectrons_prompt = dielectron_maker_displaced( + e_minpt, isOS=True, minipchi2=-1 + ) + + photons_table = WeightedRelTableAlg( + InputCandidates=photon_filter(), + ReferenceParticles=dielectrons_prompt, + Cut=in_range(comb_mass_limits[0], F.COMB_MASS(), comb_mass_limits[1]), + ) + + return Hlt2Line( + name=name, + algs=upfront_reconstruction() + [require_pvs(pvs), dielectrons_prompt], + persistreco=persistreco, + extra_outputs=[ + ( + f"DiElectronPrompt{kind}_ss_Photons", + SelectionFromRelationTable( + InputRelations=photons_table.OutputRelations + ).OutputLocation, + ) + ], + prescale=prescale, + monitoring_variables=_default_monitoring_variables, + hlt1_filter_code=[f"Hlt1DiElectronLowMass_SS_NoIP{kind}Decision"], + ) # OS displaced lines (one to turbo, prescaled to full) @@ -226,7 +255,10 @@ def dielectron_sp_displaced_line( ], prescale=prescale, monitoring_variables=_default_monitoring_variables, - hlt1_filter_code=["Hlt1DiElectronLowMass_massSlice.*_displacedDecision"], + hlt1_filter_code=[ + "Hlt1DiElectronLowMass_NoIPDecision", + "Hlt1DiElectronLowMass_DisplacedDecision", + ], ) @@ -270,47 +302,10 @@ def dielectron_sp_displaced_line_full( ], prescale=prescale, monitoring_variables=_default_monitoring_variables, - hlt1_filter_code=["Hlt1DiElectronLowMass_massSlice.*_displacedDecision"], - ) - - -@register_line_builder(turbo_lines) -@configurable -def dielectron_sp_prompt_same_sign_line( - name="Hlt2QEE_DiElectronPrompt_PersistPhotonsSS", - prescale=0.1, - persistreco=False, - e_minpt=0.0, - make_pvs=make_pvs, -): - """Aiming for prompt pi0/eta -> gamma e+ e+ or gamma e- e- decays. Label - the doubly-charged dielectron as J/psi(1S) and save photons if Pi0/eta in - mass range of [5, 700]MeV.""" - pvs = make_pvs() - - dielectrons_prompt = dielectron_maker_prompt(e_minpt, isOS=False) - - photons_table = WeightedRelTableAlg( - InputCandidates=photon_filter(), - ReferenceParticles=dielectrons_prompt, - Cut=in_range(comb_mass_limits[0], F.COMB_MASS(), comb_mass_limits[1]), - ) - - return Hlt2Line( - name=name, - algs=upfront_reconstruction() + [require_pvs(pvs), dielectrons_prompt], - persistreco=persistreco, - extra_outputs=[ - ( - "DiElectronPrompt_ss_Photons", - SelectionFromRelationTable( - InputRelations=photons_table.OutputRelations - ).OutputLocation, - ) + hlt1_filter_code=[ + "Hlt1DiElectronLowMass_NoIPDecision", + "Hlt1DiElectronLowMass_DisplacedDecision", ], - prescale=prescale, - monitoring_variables=_default_monitoring_variables, - hlt1_filter_code=["Hlt1DiElectronLowMass_SS_massSlice.*_promptDecision"], ) @@ -349,5 +344,8 @@ def dielectron_sp_displaced_same_sign_line( ], prescale=prescale, monitoring_variables=_default_monitoring_variables, - hlt1_filter_code=["Hlt1DiElectronLowMass_SS_massSlice.*_displacedDecision"], + hlt1_filter_code=[ + "Hlt1DiElectronLowMass_SS_NoIPDecision", + "Hlt1DiElectronLowMass_SS_DisplacedDecision", + ], ) diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/spruce_qee.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/spruce_qee.py index 1de20e0414bffbd5bdc97893c7cff1d4aada88ed..049afb007c1d50ede72b432a7c6394222293c3ab 100644 --- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/spruce_qee.py +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/spruce_qee.py @@ -36,9 +36,8 @@ from Hlt2Conf.lines.qee.diboson import ( from Hlt2Conf.lines.qee.dielectron_persist_photons import ( charged_pion_filter, dielectron_maker_displaced, - dielectron_maker_prompt, dielectron_sp_displaced_line_full, - dielectron_sp_prompt_line_full, + dielectron_sp_noip_line_full, photon_filter, ) from Hlt2Conf.lines.qee.high_mass_dielec import ( @@ -1000,7 +999,7 @@ def TrijetsTwoSVTag_sprucing_line(name="SpruceQEE_TrijetsTwoSVTag", prescale=1): @register_line_builder(sprucing_lines) @configurable -def dielectron_sp_prompt_sprucing_line( +def dielectron_sp_noip_sprucing_line( name="SpruceQEE_DiElectronPrompt_PersistPhotons", prescale=0.1 ): """Sprucing of full stream lines selecting prompt pi0/eta -> e+e-gamma @@ -1010,22 +1009,22 @@ def dielectron_sp_prompt_sprucing_line( pvs = make_pvs() - dielectrons_prompt = dielectron_maker_prompt(e_minpt=0.0, isOS=True) + dielectrons_noip = dielectron_maker_displaced(e_minpt=300, isOS=True, minipchi2=-1) photons_table = WeightedRelTableAlg( InputCandidates=photon_filter(), - ReferenceParticles=dielectrons_prompt, - Cut=in_range(5.0 * MeV, F.COMB_MASS(), 600.0 * MeV), + ReferenceParticles=dielectrons_noip, + Cut=in_range(5.0 * MeV, F.COMB_MASS(), 700.0 * MeV), ) charged_pions = charged_pion_filter(pi_minpt=75.0 * MeV) return SpruceLine( name=name, - algs=upfront_reconstruction() + [require_pvs(pvs), dielectrons_prompt], + algs=upfront_reconstruction() + [require_pvs(pvs), dielectrons_noip], extra_outputs=[ ( - "DiElectronPrompt_Photons", + "DiElectronNoIP_Photons", SelectionFromRelationTable( InputRelations=photons_table.OutputRelations ).OutputLocation, @@ -1033,7 +1032,7 @@ def dielectron_sp_prompt_sprucing_line( ("ChargedPions", charged_pions), ], prescale=prescale, - hlt2_filter_code=_hlt2_decision_regex(dielectron_sp_prompt_line_full), + hlt2_filter_code=_hlt2_decision_regex(dielectron_sp_noip_line_full), ) @@ -1054,7 +1053,7 @@ def dielectron_sp_displaced_sprucing_line( photons_table = WeightedRelTableAlg( InputCandidates=photon_filter(), ReferenceParticles=dielectrons_displaced, - Cut=in_range(5.0 * MeV, F.COMB_MASS(), 600.0 * MeV), + Cut=in_range(5.0 * MeV, F.COMB_MASS(), 700.0 * MeV), ) charged_pions = charged_pion_filter(pi_minpt=75.0 * MeV) diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/spruce_qee_pp_ref_2024.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/spruce_qee_pp_ref_2024.py index 14dfe9635367f871ffb4a560f5749eb4fdac9164..d834a6b759435aa47b7c4d5e85dd5709d9f22e3f 100644 --- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/spruce_qee_pp_ref_2024.py +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/qee/spruce_qee_pp_ref_2024.py @@ -35,9 +35,8 @@ from Hlt2Conf.lines.qee.diboson import ( from Hlt2Conf.lines.qee.dielectron_persist_photons import ( charged_pion_filter, dielectron_maker_displaced, - dielectron_maker_prompt, dielectron_sp_displaced_line_full, - dielectron_sp_prompt_line_full, + dielectron_sp_noip_line_full, photon_filter, ) from Hlt2Conf.lines.qee.high_mass_dielec import ( @@ -995,12 +994,14 @@ def dielectron_sp_prompt_sprucing_line( pvs = make_pvs() - dielectrons_prompt = dielectron_maker_prompt(e_minpt=0.0, isOS=True) + dielectrons_prompt = dielectron_maker_displaced( + e_minpt=300.0, isOS=True, minipchi2=-1 + ) photons_table = WeightedRelTableAlg( InputCandidates=photon_filter(), ReferenceParticles=dielectrons_prompt, - Cut=in_range(5.0 * MeV, F.COMB_MASS(), 600.0 * MeV), + Cut=in_range(5.0 * MeV, F.COMB_MASS(), 700.0 * MeV), ) charged_pions = charged_pion_filter(pi_minpt=75.0 * MeV) @@ -1018,7 +1019,7 @@ def dielectron_sp_prompt_sprucing_line( ("ChargedPions", charged_pions), ], prescale=prescale, - hlt2_filter_code=_hlt2_decision_regex(dielectron_sp_prompt_line_full), + hlt2_filter_code=_hlt2_decision_regex(dielectron_sp_noip_line_full), ) @@ -1039,7 +1040,7 @@ def dielectron_sp_displaced_sprucing_line( photons_table = WeightedRelTableAlg( InputCandidates=photon_filter(), ReferenceParticles=dielectrons_displaced, - Cut=in_range(5.0 * MeV, F.COMB_MASS(), 600.0 * MeV), + Cut=in_range(5.0 * MeV, F.COMB_MASS(), 700.0 * MeV), ) charged_pions = charged_pion_filter(pi_minpt=75.0 * MeV)