diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/semileptonic/HbToTauNu_BTracking.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/semileptonic/HbToTauNu_BTracking.py index fc9cc9de33787e72053f600db4dc316da69a2319..6014afb887410f8fa43c9534a24ee531e7544f40 100644 --- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/semileptonic/HbToTauNu_BTracking.py +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/semileptonic/HbToTauNu_BTracking.py @@ -19,6 +19,8 @@ from Hlt2Conf.algorithms_thor import ParticleFilter, ParticleCombiner, require_a from RecoConf.reconstruction_objects import make_pvs from Hlt2Conf.standard_particles import (make_has_rich_long_pions, make_has_rich_long_kaons) + +from RecoConf.hlt2_tracking import make_veloheavyflavourtracks """ SL lines for the B->taunu decays (and control modes) with purpose of using charged B tracking, hence large transverse flight distance requirements and VELO raw banks @@ -30,15 +32,16 @@ def make_candidate_btracking(name, make_particles, make_pvs=make_pvs, p_min=10 * GeV, - pt_min=1 * GeV, - ip_min=0.1 * mm, + pt_min=0.5 * GeV, + mipchi2_min=4, pid=None): """ base candidates for btracking note: note extra track quality (based) cuts due to possible B hits in tracks """ pvs = make_pvs() - code = require_all(F.P > p_min, F.PT > pt_min, F.MINIP(pvs) > ip_min) + code = require_all(F.P > p_min, F.PT > pt_min, + F.MINIPCHI2(pvs) > mipchi2_min) if pid is not None: code = require_all(code, pid) return ParticleFilter(make_particles(), F.FILTER(code), name=name) @@ -49,18 +52,17 @@ def make_x23prong_btracking(name="SLB_ThreeProng_BTracking", particles=make_has_rich_long_pions, descriptor="[tau+ -> pi- pi+ pi+]cc", make_pvs=make_pvs, - comb_doca_max=0.15 * mm, - pt_min=2.0 * GeV, - mipchi2_min=4, - vchi2_max=16, - m_min=400. * MeV, + pt_min=5.0 * GeV, + comb_doca_max=0.1 * mm, + mipchi2_min=10, + vchi2_max=12, + m_min=500. * MeV, m_max=3500. * MeV, - fdt_min=4. * mm, + fdt_min=5. * mm, mcorr_min=None, twobody_m_max=1670 * MeV): """ 3-prong decay for B tracking purposes, with large transverse flight distance (fdt) - and no track quality (based) requirements """ pvs = make_pvs() @@ -70,8 +72,7 @@ def make_x23prong_btracking(name="SLB_ThreeProng_BTracking", # three-body selection combination_code = require_all( in_range(m_min - 50 * MeV, F.MASS, m_max + 50 * MeV), - F.MAXDOCACUT(comb_doca_max), - F.SUBCOMB(Functor=F.MASS < twobody_m_max, Indices=(1, 3))) + F.MAXDOCACUT(comb_doca_max)) if mipchi2_min is not None: combination_code = require_all( combination_code, 1 < F.SUM(F.MINIPCHI2(pvs) > mipchi2_min)) @@ -82,21 +83,23 @@ def make_x23prong_btracking(name="SLB_ThreeProng_BTracking", if mcorr_min is not None: vertex_code = require_all(vertex_code, F.BPVCORRM(pvs) > mcorr_min) if fdt_min is not None: - vertex_code = require_all(vertex_code, F > F.BPVVDRHO(pvs) > fdt_min) + vertex_code = require_all(vertex_code, F.BPVVDRHO(pvs) > fdt_min) return ParticleCombiner( particles, DecayDescriptor=descriptor, Combination12Cut=twobody_code, CombinationCut=combination_code, - CompositeCut=vertex_code) + CompositeCut=vertex_code, + name=name) def make_twopions(pions, mother_id="rho(770)0", m_max=3.5 * GeV, - comb_doca_max=0.15 * mm, - vchi2_max=16): + comb_doca_max=0.1 * mm, + vchi2_max=12, + name='SLB_BTracking_TwoPions'): """ for pions from B+->D-pi+pi+ dalitz decays, these pions form the B vertex """ @@ -107,7 +110,8 @@ def make_twopions(pions, return ParticleCombiner([pions, pions], DecayDescriptor=f"[{mother_id} -> pi+ pi+]cc", CombinationCut=combination_code, - CompositeCut=vertex_code) + CompositeCut=vertex_code, + name=name) def make_b2taunu_tau2pipipi(process): @@ -118,18 +122,30 @@ def make_b2taunu_tau2pipipi(process): assert process in ['hlt2', 'spruce' ], 'Line must be defined as Hlt2 or Sprucing line!' - pions = make_candidate_btracking() + pions = make_candidate_btracking( + name="SLB_BTracking_Pions", + make_particles=make_has_rich_long_pions, + pid=(F.PID_K < 2)) return make_x23prong_btracking( - name="SLB_TauToThreePion_BTracking", + name="SLB_BTracking_TauToThreePion", particles=[pions, pions, pions], - descriptor="[tau+ -> pi- pi+ pi+]cc") + descriptor="[tau+ -> pi- pi+ pi+]cc", + m_max=1825. * MeV) + + +def make_b2taunu_tau2pipipi_with_tracking(process): + parts = make_b2taunu_tau2pipipi(process) + pvs = make_pvs() + btracks = make_veloheavyflavourtracks(composites=parts, pvs=pvs) + return parts, btracks def make_b2dpipi_d2kpipi(process, vchi2_max=16, m_min=5.0 * GeV, - m_max=5.7 * GeV): + m_max=5.7 * GeV, + name='SLB_BTracking_B2DPiPi'): """ for candidates for B+ -> D- ( -> K+ pi- pi- ) pi+ pi+ with B tracking (control channel) """ @@ -137,20 +153,25 @@ def make_b2dpipi_d2kpipi(process, ], 'Line must be defined as Hlt2 or Sprucing line!' pions = make_candidate_btracking( - name="SLB_Pions_BTracking", particles=make_has_rich_long_pions) + name="SLB_BTracking_Pions", + make_particles=make_has_rich_long_pions, + pid=(F.PID_K < 2)) kaons = make_candidate_btracking( - name="SLB_Kaons_BTracking", particles=make_has_rich_long_kaons) + name="SLB_BTracking_Kaons", + make_particles=make_has_rich_long_kaons, + pid=(F.PID_K > 4)) # input D-, same selection as tau23pi aside from mass window dps = make_x23prong_btracking( - name="SLB_DToKaonTwoPion_BTracking", + name="SLB_BTracking_DToKaonTwoPion", particles=[kaons, pions, pions], descriptor="[D- -> K+ pi- pi-]cc", m_min=1830 * MeV, m_max=1910 * MeV) twopions_id = "rho(770)0" - twopions = make_twopions(pions, mother_id=twopions_id) + twopions = make_twopions( + pions, mother_id=twopions_id, name="SLB_BTracking_TwoPion_For_B") # combine to form full B combination_code = require_all( @@ -162,4 +183,5 @@ def make_b2dpipi_d2kpipi(process, return ParticleCombiner([dps, twopions], DecayDescriptor=f"[B+ -> D- {twopions_id}]cc", CombinationCut=combination_code, - CompositeCut=vertex_code) + CompositeCut=vertex_code, + name=name) diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/semileptonic/hlt2_semileptonic.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/semileptonic/hlt2_semileptonic.py index 67c0f730429ea32d2ba3091e25fc940ed96cefb1..fc93db548222e3f05c8e8787a7e9027af449d1e2 100644 --- a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/semileptonic/hlt2_semileptonic.py +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/semileptonic/hlt2_semileptonic.py @@ -117,7 +117,8 @@ from .HbToLLLNu import ( make_b2emumunu_fakeelectron, make_b2mueenu_fakemuon, make_b2eeenu_trifakeelectron, make_b2eeenu_onefakeelectron) from .HbToTauNu_BTracking import ( - make_x23prong_btracking, make_b2dpipi_d2kpipi, make_b2taunu_tau2pipipi) + make_x23prong_btracking, make_b2dpipi_d2kpipi, make_b2taunu_tau2pipipi, + make_b2taunu_tau2pipipi_with_tracking) from PyConf.application import default_raw_event PROCESS = 'hlt2' @@ -2699,12 +2700,14 @@ def hlt2_btotaunu_tautopipipinu_btracking_line( """ SL Hlt2 line for B+(c)->Tau+(->Pi+Pi+Pi-Nu)Nu + c.c. with ability for B+(c) tracking """ - line_alg = make_b2taunu_tau2pipipi(process=PROCESS) + line_alg, btracking = make_b2taunu_tau2pipipi_with_tracking( + process=PROCESS) return HltLine( name=name, prescale=prescale, - algs=sl_line_prefilter() + [line_alg], - extra_outputs=[("RawBankVP", make_raw(["VP"]))], + algs=sl_line_prefilter() + [line_alg, btracking], + extra_outputs=[("RawBankVP", make_raw(["VP"])), + ("HeavyFlavourTrackingInfo", btracking.OutputLocation)], persistreco=persistreco) @@ -2730,7 +2733,7 @@ def hlt2_btodpipi_dtokpipi_btracking_line( @register_line_builder(hlt2_lines) def hlt2_btodpipi_dtokpipi_btracking_loose_line( name="Hlt2SLB_BToDPiPi_DToKPiPi_BTracking_LooseMinFDT_Line", - prescale=0.1, + prescale=1, make_raw=default_raw_event, persistreco=True): """ diff --git a/Hlt/RecoConf/python/RecoConf/hlt2_tracking.py b/Hlt/RecoConf/python/RecoConf/hlt2_tracking.py index 6d088a8809e20f7b5f274c20c5388f823689712a..f010340fb598b172d89bd8ccb209138ca85a4985 100644 --- a/Hlt/RecoConf/python/RecoConf/hlt2_tracking.py +++ b/Hlt/RecoConf/python/RecoConf/hlt2_tracking.py @@ -39,7 +39,8 @@ from PyConf.Algorithms import ( LHCb__Converters__Track__SOA__fromV1Track as TrackSOAFromV1, LHCb__Converters__Track__SOA__fromSharedV1Track as TrackSOAFromSharedV1, PrKalmanFilter, PrKalmanFilter_noUT, PrKalmanFilter_Seed, - PrKalmanFilter_Velo, PrKalmanFilter_Downstream, PrKalmanFilter_Upstream) + PrKalmanFilter_Velo, PrKalmanFilter_Downstream, PrKalmanFilter_Upstream, + VeloHeavyFlavourTracking) from PyConf.Tools import (PrAddUTHitsTool, PrIgnoreUTHitsTool, UpgradeGhostId, TrackMasterExtrapolator, TrackLinearExtrapolator) @@ -1503,3 +1504,9 @@ def convert_tracks_to_v3_from_v1(tracks_v1, tracks[tracktype] = trackconverter.OutputTracks trackrels[tracktype] = trackconverter.Relations return tracks, trackrels + + +def make_veloheavyflavourtracks(composites, pvs): + vp_hits = make_VeloClusterTrackingSIMD_hits() + return VeloHeavyFlavourTracking( + Composites=composites, PVs=pvs, Hits=vp_hits)