diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/trackeff/Velo2Long_L2PPi_ProtonProbe.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/trackeff/Velo2Long_L2PPi_ProtonProbe.py index 0342de678d30a13473d82344fdf8a8d3df32f7fc..10f34753d32bbe00ad8e615f85b4723fdd59bb11 100644 --- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/trackeff/Velo2Long_L2PPi_ProtonProbe.py +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/trackeff/Velo2Long_L2PPi_ProtonProbe.py @@ -10,14 +10,14 @@ ############################################################################### import Functors as F from Functors.math import in_range -from GaudiKernel.SystemOfUnits import GeV, MeV, mm +from GaudiKernel.SystemOfUnits import GeV, MeV, mm, ns from Moore.config import register_line_builder from Moore.lines import Hlt2Line from PyConf.Algorithms import ( FlattenDecayTree, + L0LongVeloFilter, LHCbIDOverlapRelationTable, SelectionFromWeightedRelationTable, - Velo2Long_L2ProtonPi_TrackEffFilter, ) from PyConf.tonic import configurable from RecoConf.algorithms_thor import ( @@ -26,13 +26,23 @@ from RecoConf.algorithms_thor import ( ParticleFilter, ) from RecoConf.event_filters import require_pvs +from RecoConf.hlt2_probetracks import ( + make_charged_downstream, + make_charged_seed, + make_charged_velo, + make_muonut_particles, + make_VeloMuon_tracks, +) from RecoConf.reconstruction_objects import ( make_pvs, upfront_reconstruction, ) from RecoConf.standard_particles import ( + _make_particles, + get_all_track_selector, make_long_pions, make_long_protons, + make_up_pions, make_up_protons, ) @@ -41,10 +51,12 @@ from Hlt2Conf.lines.ift.builders.smog2_builders import ( bpv_in_smog2, make_smog2_prefilters, ) +from Hlt2Conf.lines.pid.utils import constants +from Hlt2Conf.lines.pid.utils import filters as flt +from Hlt2Conf.probe_muons import make_velo_muons turbo_lines = {} turcal_lines = {} -monitoring_lines = {} hlt1_tis_lines = [ "Hlt1TrackMuonMVADecision", @@ -89,46 +101,44 @@ hlt1_tis_lines_smog2 = [ "Hlt1SMOG2PassThroughLowMult5Decision", ] -from RecoConf.hlt2_probetracks import make_charged_velo -from RecoConf.standard_particles import ( - _make_particles, - get_all_track_selector, - standard_protoparticle_filter, -) - @configurable -def filter_pions(particles, pvs=None, pt_min=0.4 * GeV, fromSMOG2=False): - cut = F.require_all( - F.PT > pt_min, - F.ETA < 5.0, - F.ETA > 1.5, - ) +def filter_pions(particles, pvs=None, pt_min=0 * GeV, fromSMOG2=False): + cut = F.require_all(F.PT > pt_min) if fromSMOG2: cut &= F.P > 2000 else: - cut &= F.P > 5000 - cut &= F.PID_P < 5 - cut &= F.MINIP(pvs) > 0.4 * mm + cut &= F.PID_K < 5 + cut &= F.CHI2DOF < 4 + cut &= F.MINIPCHI2(pvs) < 4000 + cut &= F.OWNPVIPCHI2 > 36 return ParticleFilter(particles, F.FILTER(cut)) -def make_velo_protons(): - """creates LHCb::Particles from LHCb::ProtoParticles of VELO tracks""" - return _make_particles( - species="proton", - get_track_selector=get_all_track_selector, - make_protoparticles=make_charged_velo, +def filter_protons( + particles, + pvs=None, + p_min=2.0 * GeV, + pt_min=0 * GeV, + pt_max=1000 * GeV, + bpvipchi2_min=1.8, + fromSMOG2=False, +): + code = F.require_all( + F.P > p_min, F.PT > pt_min, F.PT < pt_max, F.BPVIPCHI2(pvs) > bpvipchi2_min ) + return ParticleFilter(particles, F.FILTER(code)) @configurable def filter_particles_velo(particles, pvs, fromSMOG2=False): - cut = F.require_all(F.ETA > 1.7) + cut = F.require_all( + F.ETA > 1.5, + ) if fromSMOG2: cut &= F.ETA < 5.2 else: - cut &= F.ETA < 4.7 + cut &= F.ETA < 5.5 cut &= F.MINIP(pvs) > 0.5 * mm return ParticleFilter(particles, F.FILTER(cut)) @@ -154,61 +164,56 @@ def filter_particles_tis_velo(particles, pvs, fromSMOG2=False): @configurable -def make_l0_pion_proton_specific_charge( - probe_tracks, +def make_l0lls( + protons, pions, decay_descriptor, pvs, - comb_m_min=0 * MeV, - comb_m_max=2650 * MeV, - comb_maxdoca=0.15 * mm, - fromSMOG2=False, - name="Velo2Long_L2PiPCombiner_{hash}", + mm_min=600 * MeV, + mm_max=2000 * MeV, + vchi2_max=30, + mipchi2_max=50, + bpvdira=0, + bpvfdchi2=63, + eta_max=5.3, ): - combination_code = F.require_all( - in_range(comb_m_min, F.MASS, comb_m_max), - F.MAXDOCACUT(comb_maxdoca), - ) - vertex_code = F.require_all( - F.END_VRHO < 100 * mm, - F.END_VZ < 600 * mm, + combination_code = F.require_all(in_range(mm_min, F.MASS, mm_max)) + + composite_code = F.require_all( + F.CHI2DOF < vchi2_max, + F.MINIPCHI2(pvs) < mipchi2_max, + F.BPVDIRA(pvs) > bpvdira, + F.BPVFDCHI2(pvs) > bpvfdchi2, + F.ETA < eta_max, ) - if fromSMOG2: - vertex_code &= F.END_VZ > -550 * mm - vertex_code &= bpv_in_smog2(make_pvs) - else: - vertex_code &= F.END_VZ > 18 * mm - - vertex_code &= F.OWNPVFD > 5 * mm - vertex_code &= F.OWNPVVDRHO > 2 * mm return ParticleCombiner( - [pions, probe_tracks], - name=name, + [protons, pions], + name="L0ToPPi_LL_Combiner_{hash}", DecayDescriptor=decay_descriptor, CombinationCut=combination_code, - CompositeCut=vertex_code, + CompositeCut=composite_code, ) -def make_lambda_to_pion_proton(tag_pions, probe_protons, **kwargs): +def make_l0_p_piminus(protons, pions, pvs): l0_particle_combinations = [ - make_l0_pion_proton_specific_charge( - probe_protons, tag_pions, "Lambda0 -> pi- p+", **kwargs - ), - make_l0_pion_proton_specific_charge( - probe_protons, tag_pions, "Lambda0 -> pi- p~-", **kwargs - ), - make_l0_pion_proton_specific_charge( - probe_protons, tag_pions, "Lambda0 -> pi+ p~-", **kwargs - ), - make_l0_pion_proton_specific_charge( - probe_protons, tag_pions, "Lambda0 -> pi+ p+", **kwargs - ), + # make_l0lls(protons, pions, "Lambda0 -> p+ pi+", pvs), + make_l0lls(protons, pions, "[Lambda0 -> p+ pi-]cc", pvs), + # make_l0lls(protons, pions, "Lambda0 -> p- pi-", pvs), + # make_l0lls(protons, pions, "Lambda0 -> p- pi+", pvs), ] return ParticleContainersMerger( - l0_particle_combinations, name="L0_velo2long_combinations_{hash}" + l0_particle_combinations, name="L0_combinations_{hash}" + ) + + +def make_velo_protons(): + return _make_particles( + species="proton", + get_track_selector=get_all_track_selector, + make_protoparticles=make_charged_velo, ) @@ -218,58 +223,51 @@ def construct_hlt2_line( prescale, pt_min, pt_max, - p_min=5000.0, + p_min=2000.0, filter_tis=False, - apply_lambda_veto=False, fromSMOG2=False, ): pvs = make_pvs() - pions = filter_pions(make_long_pions(), pvs, pt_min=0.4 * GeV, fromSMOG2=fromSMOG2) + pions = filter_pions(make_long_pions(), pvs, fromSMOG2=fromSMOG2) turbo_line = name.find("Hlt2Turbo") != -1 if filter_tis: - probe_protons_velo = filter_particles_tis_velo( - make_velo_protons(), pvs, fromSMOG2=fromSMOG2 + protonsVelo = filter_particles_tis_velo( + make_long_protons(), pvs, fromSMOG2=fromSMOG2 ) else: - probe_protons_velo = filter_particles_velo( - make_velo_protons(), pvs, fromSMOG2=fromSMOG2 - ) + protonsVelo = filter_protons(make_velo_protons(), pvs, pt_max=16 * GeV) - lambdas = make_lambda_to_pion_proton( - tag_pions=pions, - probe_protons=probe_protons_velo, + lambda0s = make_l0_p_piminus( + protonsVelo, + pions, pvs=pvs, - comb_m_max=1500, - comb_m_min=0, - fromSMOG2=fromSMOG2, ) # probe should be on index 1 - filtered_lambdas = Velo2Long_L2ProtonPi_TrackEffFilter( - InputParticle=lambdas, + filtered_lambda0s = L0LongVeloFilter( + InputParticle=lambda0s, InputPVs=pvs, - PVConstrainedMassMin=1000.0, # 1115.683 - PVConstrainedMassMax=1220.0, + PVConstrainedMassMin=1000.0, + PVConstrainedMassMax=1200.0, PVConstrainedProbePtMin=pt_min, PVConstrainedProbePtMax=pt_max, PVConstrainedProbePMin=p_min, - IPperpendicularMax=0.01, - IPMax=0.5, - name=f"Velo2Long_L0_TrackEffFilter_{name}", + name=f"TrackEffFilter_{name}", ).OutputParticles + if turbo_line: """ Selective persistence""" - flat_tree = FlattenDecayTree( - InputParticles=filtered_lambdas, name=f"FlattenL0_{name}" + lambda0_flat_tree = FlattenDecayTree( + InputParticles=filtered_lambda0s, name=f"FlattenL0_{name}" ) - flat_daughters = ParticleFilter( - flat_tree.OutputParticles, + lambda0_flat_daughters = ParticleFilter( + lambda0_flat_tree.OutputParticles, F.FILTER(F.require_all(F.ISBASICPARTICLE, (F.TRACKISVELO @ F.TRACK))), ) relation_table_match_by_lhcbid_long = LHCbIDOverlapRelationTable( - MatchFrom=flat_daughters, + MatchFrom=lambda0_flat_daughters, MatchTo=make_long_protons(), IncludeVP=True, IncludeFT=False, @@ -278,7 +276,7 @@ def construct_hlt2_line( ).OutputRelations relation_table_match_by_lhcbid_upstream = LHCbIDOverlapRelationTable( - MatchFrom=flat_daughters, + MatchFrom=lambda0_flat_daughters, MatchTo=make_up_protons(), IncludeVP=True, IncludeFT=False, @@ -294,20 +292,20 @@ def construct_hlt2_line( ).OutputLocation particles_to_match = [ - ("MatchedLong", matched_long_pions), - ("MatchedUpstream", matched_upstream_pions), + ("MatchedLongPions", matched_long_pions), + ("MatchedUpstreamPions", matched_upstream_pions), ] else: particles_to_match = None - algs_list = [require_pvs(pvs), filtered_lambdas] + algs_list = upfront_reconstruction() + [require_pvs(pvs), filtered_lambda0s] + if fromSMOG2: - algs_list = make_smog2_prefilters(pvs=make_pvs) + [filtered_lambdas] + algs_list = make_smog2_prefilters(pvs=make_pvs) + [filtered_lambda0s] return Hlt2Line( name=name, algs=algs_list, - stream="trackeff" if turbo_line else None, prescale=prescale, monitoring_variables=["m"], extra_outputs=particles_to_match, @@ -317,9 +315,19 @@ def construct_hlt2_line( @register_line_builder(turbo_lines) @configurable -def turbo_lambda_velo_long_line_nominal( - name="Hlt2TurboVelo2Long_Lambda_ProtonProbe", prescale=0.2 -): +def turbo_l0_velo_long_line(name="Hlt2TurboVelo2Long_Lambda0", prescale=1.0): + return construct_hlt2_line( + name=name, + prescale=prescale, + pt_min=0.0, + pt_max=20000.0, + p_min=2000.0, + ) + + +@register_line_builder(turcal_lines) +@configurable +def turcal_l0_velo_long_line(name="Hlt2TurCalVelo2Long_Lambda0", prescale=1.0): return construct_hlt2_line( - name=name, prescale=prescale, pt_min=1200.0, pt_max=15000.0, filter_tis=True + name=name, prescale=prescale, pt_min=0.0, pt_max=20000.0, p_min=5000.0 )