From d7e35f1d235fa33410f087bcbf5ad243f4a39647 Mon Sep 17 00:00:00 2001 From: Laurent Dufour Date: Thu, 6 Feb 2025 11:31:48 +0100 Subject: [PATCH 1/7] Add draft offline calibration options --- .../RecoConf/offline_calibration/__init__.py | 65 ++++++++++++++++ .../momentum_scale_calibration.py | 77 +++++++++++++++++++ .../python/RecoConf/track_refitting.py | 2 +- 3 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py create mode 100644 Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py new file mode 100644 index 00000000000..b00d20490b2 --- /dev/null +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py @@ -0,0 +1,65 @@ +from . import momentum_scale_calibration +from .. import track_refitting + +import logging + +log = logging.getLogger(__name__) + +def apply_corrections( input_particles, input_pvs, + refit_tracks=True, update_pvs=True, + refit_pvs=False, apply_momentum_scaling=True, + track_fitter=track_refitting.TRACK_FIT_TYPE_PRKALMAN ): + # first, update the PVs if needed + if refit_pvs and not update_pvs: + log.warning("Asking to refit the PVs, but not update them.") + + if input_pvs is None: + new_pvs = PVsEmptyProducer() + else: + if update_pvs and not refit_pvs: + new_pvs = track_refitting.update_vertex_positions( pvs ) + elif update_pvs and refit_pvs: + new_pvs = track_refitting.refit_pvs( pvs ) + else: + new_pvs = input_pvs # don't update them at all + + # next, update the particles + flat_particles = FlattenDecayTree(InputParticles=input_particles) + basic_particles = ParticleFilter( + flat_particles.OutputParticles, + F.FILTER(F.ISBASICPARTICLE), # ideally swap to some F.HASTRACK functor + name="SelectBasicParticlesForOfflineCalib_{hash}", + ) + + tracks_from_dst = SelectTracksForParticles( + Inputs=[basic_particles] + ).OutputTracks + + if refit_tracks: + tracks_from_dst = track_refitting.refit_tracks( + tracks_from_dst, get_clusters_from_track=True, + track_fitter=track_fitter + ) + + if apply_momentum_scaling: + tracks_from_dst = momentum_scale_calibration.scale_tracks( + input_tracks=tracks_from_dst + ) + + relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( + MatchFrom=basic_particles, + MatchTo=tracks_from_dst, + IncludeVP=True, + IncludeFT=True, + IncludeUT=True, + ).OutputRelations + + + recombined_trees = RecombineDecayTrees( + InputParticles=input_particles, + InputPVs=input_pvs, + InputTracks=tracks_from_dst, # the refitted tracks + InputTrackRelations=relation_table_match_by_veloid_to_track, + ) # the relation table + + return recombined_trees, new_pvs \ No newline at end of file diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py new file mode 100644 index 00000000000..077c533b36a --- /dev/null +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py @@ -0,0 +1,77 @@ +############################################################################### +# (c) Copyright 2025 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. # +############################################################################### +import Functors as F + +from PyConf.Algorithms import ( + FlattenDecayTree, + LHCbIDOverlapRelationTableParticleToTrack, + LHCbIDOverlapRelationTableTrackToTrack, + RecombineDecayTrees, + TrackScaleState +) + +from RecoConf.algorithms_thor import ParticleFilter + +def scale_tracks( input_tracks ): + return TrackScaleState( InputTracks=input_tracks ) + + +def scale_decay_tree( + input_particles, + input_pvs, + **kwargs, +): + """Takes an input DataHandle that contains LHCb::Particles (such as the + output of a trigger line), and: + (1) finds out which particles are basic particles, and calls the + momentum scaling on those + (2) takes the scaled tracks, along with the relation table, + to then call the DecayTree recombiner which re-combines the + particles together, and fits again the decay vertices. + + The output contains particles, the new vertices, the new protoparticles, + and again a relation table between the old particles and the new ones. + """ + + flat_particles = FlattenDecayTree(InputParticles=input_particles) + basic_particles = ParticleFilter( + flat_particles.OutputParticles, + F.FILTER(F.ISBASICPARTICLE), # ideally swap to some F.HASTRACK functor + name="SelectBasicParticlesForScaling_{hash}", + ) + + tracks_from_particles = SelectTracksForParticles( + Inputs=[basic_particles] + ).OutputTracks + + tracks_from_dst = scale_tracks( + tracks_from_particles + ) + + relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( + MatchFrom=basic_particles, + MatchTo=tracks_from_dst, + IncludeVP=True, + IncludeFT=True, + IncludeUT=True, + ).OutputRelations + + if input_pvs is None: + input_pvs = PVsEmptyProducer() + + recombined_trees = RecombineDecayTrees( + InputParticles=input_particles, + InputPVs=input_pvs, + InputTracks=tracks_from_dst, # the refitted tracks + InputTrackRelations=relation_table_match_by_veloid_to_track, + ) # the relation table + + return recombined_trees \ No newline at end of file diff --git a/Hlt/RecoConf/python/RecoConf/track_refitting.py b/Hlt/RecoConf/python/RecoConf/track_refitting.py index 62925665060..854ffd8dede 100644 --- a/Hlt/RecoConf/python/RecoConf/track_refitting.py +++ b/Hlt/RecoConf/python/RecoConf/track_refitting.py @@ -65,7 +65,7 @@ TRACK_FIT_TYPE_PRKALMAN = "PrKalman" TRACK_FIT_TYPE_VELOKALMAN = "VeloKalman" TRACK_FIT_TYPE_TRACKMASTERFITTER = "TrackMasterFitter" - +@configurable def refit_tracks(tracks, get_clusters_from_track, track_fitter): if get_clusters_from_track: velo_micro_clusters_on_tracks = SelectVPMicroClustersFromTracks(Inputs=[tracks]) -- GitLab From d6c84add6994256bd91e7a99df51f3e4d3201c03 Mon Sep 17 00:00:00 2001 From: Laurent Dufour Date: Thu, 6 Feb 2025 14:05:36 +0100 Subject: [PATCH 2/7] Changes --- .../RecoConf/offline_calibration/__init__.py | 89 ++++++------------- .../python/RecoConf/track_refitting.py | 2 +- 2 files changed, 26 insertions(+), 65 deletions(-) diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py index b00d20490b2..6e92407039b 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py @@ -1,65 +1,26 @@ -from . import momentum_scale_calibration -from .. import track_refitting - -import logging - -log = logging.getLogger(__name__) - -def apply_corrections( input_particles, input_pvs, - refit_tracks=True, update_pvs=True, - refit_pvs=False, apply_momentum_scaling=True, - track_fitter=track_refitting.TRACK_FIT_TYPE_PRKALMAN ): - # first, update the PVs if needed - if refit_pvs and not update_pvs: - log.warning("Asking to refit the PVs, but not update them.") - - if input_pvs is None: - new_pvs = PVsEmptyProducer() +############################################################################### +# (c) Copyright 2025 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. # +############################################################################### + +from combined_corrections import apply_corrections + +SIMULATION = "simulation" +SPRUCING_24c1 = "sprucing24c1" +SPRUCING_24c2 = "sprucing24c2" +SPRUCING_24c3 = "sprucing24c3" +SPRUCING_24c4 = "sprucing24c4" +SPRUCING_24c5 = "sprucing24c5" + + +def get_default_configuration( dataset ): + if dataset == SPRUCING_24c2: + return {"refit_tracks": True, "update_pvs": True, "apply_momentum_scaling": True} else: - if update_pvs and not refit_pvs: - new_pvs = track_refitting.update_vertex_positions( pvs ) - elif update_pvs and refit_pvs: - new_pvs = track_refitting.refit_pvs( pvs ) - else: - new_pvs = input_pvs # don't update them at all - - # next, update the particles - flat_particles = FlattenDecayTree(InputParticles=input_particles) - basic_particles = ParticleFilter( - flat_particles.OutputParticles, - F.FILTER(F.ISBASICPARTICLE), # ideally swap to some F.HASTRACK functor - name="SelectBasicParticlesForOfflineCalib_{hash}", - ) - - tracks_from_dst = SelectTracksForParticles( - Inputs=[basic_particles] - ).OutputTracks - - if refit_tracks: - tracks_from_dst = track_refitting.refit_tracks( - tracks_from_dst, get_clusters_from_track=True, - track_fitter=track_fitter - ) - - if apply_momentum_scaling: - tracks_from_dst = momentum_scale_calibration.scale_tracks( - input_tracks=tracks_from_dst - ) - - relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( - MatchFrom=basic_particles, - MatchTo=tracks_from_dst, - IncludeVP=True, - IncludeFT=True, - IncludeUT=True, - ).OutputRelations - - - recombined_trees = RecombineDecayTrees( - InputParticles=input_particles, - InputPVs=input_pvs, - InputTracks=tracks_from_dst, # the refitted tracks - InputTrackRelations=relation_table_match_by_veloid_to_track, - ) # the relation table - - return recombined_trees, new_pvs \ No newline at end of file + return {"refit_tracks": False, "apply_momentum_scaling": False, "update_pvs": False} \ No newline at end of file diff --git a/Hlt/RecoConf/python/RecoConf/track_refitting.py b/Hlt/RecoConf/python/RecoConf/track_refitting.py index 854ffd8dede..62925665060 100644 --- a/Hlt/RecoConf/python/RecoConf/track_refitting.py +++ b/Hlt/RecoConf/python/RecoConf/track_refitting.py @@ -65,7 +65,7 @@ TRACK_FIT_TYPE_PRKALMAN = "PrKalman" TRACK_FIT_TYPE_VELOKALMAN = "VeloKalman" TRACK_FIT_TYPE_TRACKMASTERFITTER = "TrackMasterFitter" -@configurable + def refit_tracks(tracks, get_clusters_from_track, track_fitter): if get_clusters_from_track: velo_micro_clusters_on_tracks = SelectVPMicroClustersFromTracks(Inputs=[tracks]) -- GitLab From 885791bff6e6809d034ff211cc2476be2b96e1af Mon Sep 17 00:00:00 2001 From: Laurent Dufour Date: Thu, 6 Feb 2025 15:00:34 +0100 Subject: [PATCH 3/7] Changes --- .../RecoConf/offline_calibration/__init__.py | 2 +- .../combined_corrections.py | 87 +++++++++++++++++++ .../momentum_scale_calibration.py | 3 +- 3 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py index 6e92407039b..15a72135ba5 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py @@ -9,7 +9,7 @@ # or submit itself to any jurisdiction. # ############################################################################### -from combined_corrections import apply_corrections +from .combined_corrections import apply_corrections SIMULATION = "simulation" SPRUCING_24c1 = "sprucing24c1" diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py new file mode 100644 index 00000000000..9a2b6f39492 --- /dev/null +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py @@ -0,0 +1,87 @@ +############################################################################### +# (c) Copyright 2025 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. # +############################################################################### + +import logging + +from . import momentum_scale_calibration +from .. import track_refitting + +import Functors as F + +from PyConf.Algorithms import ( + FlattenDecayTree, + LHCbIDOverlapRelationTableParticleToTrack, + SelectTracksForParticles, + RecombineDecayTrees +) + +from RecoConf.algorithms_thor import ParticleFilter + +log = logging.getLogger(__name__) + +def apply_corrections( input_particles, input_pvs, + refit_tracks=True, update_pvs=True, + refit_pvs=False, apply_momentum_scaling=True, + track_fitter=track_refitting.TRACK_FIT_TYPE_PRKALMAN ): + # first, update the PVs if needed + if refit_pvs and not update_pvs: + log.warning("Asking to refit the PVs, but not update them.") + + if input_pvs is None: + new_pvs = PVsEmptyProducer() + else: + if update_pvs and not refit_pvs: + new_pvs = track_refitting.update_vertex_positions( input_pvs=input_pvs ).OutputVertices + elif update_pvs and refit_pvs: + new_pvs = track_refitting.refit_pvs( input_pvs=input_pvs ).OutputVertices + else: + new_pvs = input_pvs # don't update them at all + + # next, update the particles + flat_particles = FlattenDecayTree(InputParticles=input_particles) + basic_particles = ParticleFilter( + flat_particles.OutputParticles, + F.FILTER(F.ISBASICPARTICLE), # ideally swap to some F.HASTRACK functor + name="SelectBasicParticlesForOfflineCalib_{hash}", + ) + + tracks_from_dst = SelectTracksForParticles( + Inputs=[basic_particles] + ).OutputTracks + + if refit_tracks: + tracks_from_dst = track_refitting.refit_tracks( + tracks_from_dst, get_clusters_from_track=True, + track_fitter=track_fitter + ) + + if apply_momentum_scaling: + tracks_from_dst = momentum_scale_calibration.scale_tracks( + input_tracks=tracks_from_dst + ).OutputTracks + + relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( + MatchFrom=basic_particles, + MatchTo=tracks_from_dst, + IncludeVP=True, + IncludeFT=True, + IncludeUT=True, + ).OutputRelations + + recombined_trees = RecombineDecayTrees( + InputParticles=input_particles, + InputPVs=input_pvs, + InputTracks=tracks_from_dst, # the refitted tracks + InputTrackRelations=relation_table_match_by_veloid_to_track, + ) # the relation table + + return recombined_trees, new_pvs + diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py index 077c533b36a..e045a1a2e11 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py @@ -15,6 +15,7 @@ from PyConf.Algorithms import ( LHCbIDOverlapRelationTableParticleToTrack, LHCbIDOverlapRelationTableTrackToTrack, RecombineDecayTrees, + SelectTracksForParticles, TrackScaleState ) @@ -54,7 +55,7 @@ def scale_decay_tree( tracks_from_dst = scale_tracks( tracks_from_particles - ) + ).OutputTracks relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( MatchFrom=basic_particles, -- GitLab From 795c8b3bee1dc79d6712633ca14b67f82e5aa726 Mon Sep 17 00:00:00 2001 From: Laurent Dufour Date: Fri, 7 Mar 2025 21:58:31 +0100 Subject: [PATCH 4/7] Allow for re-calculation of GhostProb --- .../combined_corrections.py | 15 +++++++-- .../momentum_scale_calibration.py | 8 +++-- .../python/RecoConf/track_refitting.py | 33 +++++++++++++++++-- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py index 9a2b6f39492..ea488c1da6c 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py @@ -25,16 +25,23 @@ from PyConf.Algorithms import ( from RecoConf.algorithms_thor import ParticleFilter +from PyConf.reading import get_odin + log = logging.getLogger(__name__) def apply_corrections( input_particles, input_pvs, refit_tracks=True, update_pvs=True, refit_pvs=False, apply_momentum_scaling=True, - track_fitter=track_refitting.TRACK_FIT_TYPE_PRKALMAN ): + update_ghost_prob=True, disable_UT=False, + track_fitter=track_refitting.TRACK_FIT_TYPE_PRKALMAN, + odin=None ): # first, update the PVs if needed if refit_pvs and not update_pvs: log.warning("Asking to refit the PVs, but not update them.") + if odin is None: + odin = get_odin() + if input_pvs is None: new_pvs = PVsEmptyProducer() else: @@ -60,12 +67,14 @@ def apply_corrections( input_particles, input_pvs, if refit_tracks: tracks_from_dst = track_refitting.refit_tracks( tracks_from_dst, get_clusters_from_track=True, - track_fitter=track_fitter + track_fitter=track_fitter, + update_ghost_prob=update_ghost_prob, + disable_UT=disable_UT ) if apply_momentum_scaling: tracks_from_dst = momentum_scale_calibration.scale_tracks( - input_tracks=tracks_from_dst + input_tracks=tracks_from_dst, odin=odin ).OutputTracks relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py index e045a1a2e11..cb55e616cd3 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py @@ -21,13 +21,14 @@ from PyConf.Algorithms import ( from RecoConf.algorithms_thor import ParticleFilter -def scale_tracks( input_tracks ): - return TrackScaleState( InputTracks=input_tracks ) +def scale_tracks( input_tracks, odin ): + return TrackScaleState( InputTracks=input_tracks, ODIN=odin ) def scale_decay_tree( input_particles, input_pvs, + odin, **kwargs, ): """Takes an input DataHandle that contains LHCb::Particles (such as the @@ -54,7 +55,8 @@ def scale_decay_tree( ).OutputTracks tracks_from_dst = scale_tracks( - tracks_from_particles + tracks_from_particles, + odin ).OutputTracks relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( diff --git a/Hlt/RecoConf/python/RecoConf/track_refitting.py b/Hlt/RecoConf/python/RecoConf/track_refitting.py index 62925665060..e89852466f6 100644 --- a/Hlt/RecoConf/python/RecoConf/track_refitting.py +++ b/Hlt/RecoConf/python/RecoConf/track_refitting.py @@ -38,8 +38,12 @@ from PyConf.Algorithms import ( V1V1PrKalmanFilter, VPLightClustersToVPHitsConverter, VPMicroClustersToVPLightClustersConverter, + TrackBestTrackCreator ) +# to add ghost probability again after refit +from RecoConf.hlt2_tracking import get_GhostProbabilityTools + from RecoConf.algorithms_thor import ParticleFilter # Uncomment when Rec!587 is merged @@ -66,7 +70,7 @@ TRACK_FIT_TYPE_VELOKALMAN = "VeloKalman" TRACK_FIT_TYPE_TRACKMASTERFITTER = "TrackMasterFitter" -def refit_tracks(tracks, get_clusters_from_track, track_fitter): +def refit_tracks(tracks, get_clusters_from_track, track_fitter, update_ghost_prob=False, disable_UT=False): if get_clusters_from_track: velo_micro_clusters_on_tracks = SelectVPMicroClustersFromTracks(Inputs=[tracks]) scifi_clusters_on_tracks = SelectFTClustersFromTracks(Inputs=[tracks]) @@ -161,6 +165,25 @@ def refit_tracks(tracks, get_clusters_from_track, track_fitter): # TracksLocation=tracks).OutputTracksLocation refitted_tracks = None + if update_ghost_prob and refitted_tracks: + print([ + tool() + for tool in get_GhostProbabilityTools(without_UT=disable_UT) + ]) + refitted_tracks = TrackBestTrackCreator( + TracksInContainers=[refitted_tracks], + GhostProbTools=[ + tool() + for tool in get_GhostProbabilityTools(without_UT=disable_UT) + ], + MaxChi2DoF=9999999., # do not apply any chi2 cut + MaxOverlapFracVelo=1.0, # do not clone kill + MaxOverlapFracT=1.0, # do not clone kill + MaxOverlapFracUT=1.0, # do not clone kill + DoNotRefit=True, # also don't refit + AddGhostProb=True, # but just add the ghost prob + FitTracks=False).TracksOutContainer + return refitted_tracks @@ -168,6 +191,8 @@ def refit_decay_tree( input_particles, input_pvs, get_clusters_from_track=True, + update_ghost_prob=True, + disable_UT=False, track_fitter=TRACK_FIT_TYPE_PRKALMAN, **kwargs, ): @@ -216,7 +241,8 @@ def refit_decay_tree( ).OutputTracks tracks_from_dst = refit_tracks( - tracks_from_particles, get_clusters_from_track, track_fitter=track_fitter + tracks_from_particles, get_clusters_from_track, track_fitter=track_fitter, + disable_UT=disable_UT, update_ghost_prob=update_ghost_prob ) relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( @@ -264,7 +290,8 @@ def refit_pvs( pv_tracks = SelectTracksForRecVertices(Inputs=[input_pvs]) refitted_pv_tracks = refit_tracks( - tracks=pv_tracks, track_fitter=track_fitter, get_clusters_from_track=True + tracks=pv_tracks, track_fitter=track_fitter, get_clusters_from_track=True, + update_ghost_prob=False ) relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableTrackToTrack( -- GitLab From f8ff207b5a428b1f0a5ceeb5bd7198904a370bef Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Fri, 7 Mar 2025 20:59:09 +0000 Subject: [PATCH 5/7] pre-commit fixes patch generated by https://gitlab.cern.ch/lhcb/Moore/-/jobs/52432960 --- .../RecoConf/offline_calibration/__init__.py | 14 +++-- .../combined_corrections.py | 49 ++++++++++-------- .../momentum_scale_calibration.py | 15 +++--- .../python/RecoConf/track_refitting.py | 51 +++++++++++-------- 4 files changed, 73 insertions(+), 56 deletions(-) diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py index 15a72135ba5..5f0dad8b696 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/__init__.py @@ -19,8 +19,16 @@ SPRUCING_24c4 = "sprucing24c4" SPRUCING_24c5 = "sprucing24c5" -def get_default_configuration( dataset ): +def get_default_configuration(dataset): if dataset == SPRUCING_24c2: - return {"refit_tracks": True, "update_pvs": True, "apply_momentum_scaling": True} + return { + "refit_tracks": True, + "update_pvs": True, + "apply_momentum_scaling": True, + } else: - return {"refit_tracks": False, "apply_momentum_scaling": False, "update_pvs": False} \ No newline at end of file + return { + "refit_tracks": False, + "apply_momentum_scaling": False, + "update_pvs": False, + } diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py index ea488c1da6c..45a49cda502 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py @@ -11,30 +11,35 @@ import logging -from . import momentum_scale_calibration -from .. import track_refitting - import Functors as F - from PyConf.Algorithms import ( FlattenDecayTree, LHCbIDOverlapRelationTableParticleToTrack, + RecombineDecayTrees, SelectTracksForParticles, - RecombineDecayTrees ) +from PyConf.reading import get_odin from RecoConf.algorithms_thor import ParticleFilter -from PyConf.reading import get_odin +from .. import track_refitting +from . import momentum_scale_calibration log = logging.getLogger(__name__) -def apply_corrections( input_particles, input_pvs, - refit_tracks=True, update_pvs=True, - refit_pvs=False, apply_momentum_scaling=True, - update_ghost_prob=True, disable_UT=False, - track_fitter=track_refitting.TRACK_FIT_TYPE_PRKALMAN, - odin=None ): + +def apply_corrections( + input_particles, + input_pvs, + refit_tracks=True, + update_pvs=True, + refit_pvs=False, + apply_momentum_scaling=True, + update_ghost_prob=True, + disable_UT=False, + track_fitter=track_refitting.TRACK_FIT_TYPE_PRKALMAN, + odin=None, +): # first, update the PVs if needed if refit_pvs and not update_pvs: log.warning("Asking to refit the PVs, but not update them.") @@ -46,11 +51,13 @@ def apply_corrections( input_particles, input_pvs, new_pvs = PVsEmptyProducer() else: if update_pvs and not refit_pvs: - new_pvs = track_refitting.update_vertex_positions( input_pvs=input_pvs ).OutputVertices + new_pvs = track_refitting.update_vertex_positions( + input_pvs=input_pvs + ).OutputVertices elif update_pvs and refit_pvs: - new_pvs = track_refitting.refit_pvs( input_pvs=input_pvs ).OutputVertices + new_pvs = track_refitting.refit_pvs(input_pvs=input_pvs).OutputVertices else: - new_pvs = input_pvs # don't update them at all + new_pvs = input_pvs # don't update them at all # next, update the particles flat_particles = FlattenDecayTree(InputParticles=input_particles) @@ -60,16 +67,15 @@ def apply_corrections( input_particles, input_pvs, name="SelectBasicParticlesForOfflineCalib_{hash}", ) - tracks_from_dst = SelectTracksForParticles( - Inputs=[basic_particles] - ).OutputTracks + tracks_from_dst = SelectTracksForParticles(Inputs=[basic_particles]).OutputTracks if refit_tracks: tracks_from_dst = track_refitting.refit_tracks( - tracks_from_dst, get_clusters_from_track=True, + tracks_from_dst, + get_clusters_from_track=True, track_fitter=track_fitter, - update_ghost_prob=update_ghost_prob, - disable_UT=disable_UT + update_ghost_prob=update_ghost_prob, + disable_UT=disable_UT, ) if apply_momentum_scaling: @@ -93,4 +99,3 @@ def apply_corrections( input_particles, input_pvs, ) # the relation table return recombined_trees, new_pvs - diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py index cb55e616cd3..4d628c37493 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py @@ -9,20 +9,20 @@ # or submit itself to any jurisdiction. # ############################################################################### import Functors as F - from PyConf.Algorithms import ( FlattenDecayTree, LHCbIDOverlapRelationTableParticleToTrack, LHCbIDOverlapRelationTableTrackToTrack, RecombineDecayTrees, SelectTracksForParticles, - TrackScaleState + TrackScaleState, ) from RecoConf.algorithms_thor import ParticleFilter -def scale_tracks( input_tracks, odin ): - return TrackScaleState( InputTracks=input_tracks, ODIN=odin ) + +def scale_tracks(input_tracks, odin): + return TrackScaleState(InputTracks=input_tracks, ODIN=odin) def scale_decay_tree( @@ -54,10 +54,7 @@ def scale_decay_tree( Inputs=[basic_particles] ).OutputTracks - tracks_from_dst = scale_tracks( - tracks_from_particles, - odin - ).OutputTracks + tracks_from_dst = scale_tracks(tracks_from_particles, odin).OutputTracks relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( MatchFrom=basic_particles, @@ -77,4 +74,4 @@ def scale_decay_tree( InputTrackRelations=relation_table_match_by_veloid_to_track, ) # the relation table - return recombined_trees \ No newline at end of file + return recombined_trees diff --git a/Hlt/RecoConf/python/RecoConf/track_refitting.py b/Hlt/RecoConf/python/RecoConf/track_refitting.py index e89852466f6..b6e5ae17bc7 100644 --- a/Hlt/RecoConf/python/RecoConf/track_refitting.py +++ b/Hlt/RecoConf/python/RecoConf/track_refitting.py @@ -32,24 +32,23 @@ from PyConf.Algorithms import ( SelectUTClustersFromTracks, SelectVPMicroClustersFromTracks, SharedTrackEventFitter, + TrackBestTrackCreator, UpdateVertexCoordinatesOffline, UTHitClustersToPrUTHitsConverter, UTHitClustersToUTHitHandlerConverter, V1V1PrKalmanFilter, VPLightClustersToVPHitsConverter, VPMicroClustersToVPLightClustersConverter, - TrackBestTrackCreator ) -# to add ghost probability again after refit -from RecoConf.hlt2_tracking import get_GhostProbabilityTools - from RecoConf.algorithms_thor import ParticleFilter +# to add ghost probability again after refit # Uncomment when Rec!587 is merged # from PyConf.Algorithms import VeloKalmanTrackV1 # Algotihms to perform the fit from RecoConf.hlt2_tracking import ( + get_GhostProbabilityTools, get_global_measurement_provider, get_track_master_fitter, ) @@ -70,7 +69,13 @@ TRACK_FIT_TYPE_VELOKALMAN = "VeloKalman" TRACK_FIT_TYPE_TRACKMASTERFITTER = "TrackMasterFitter" -def refit_tracks(tracks, get_clusters_from_track, track_fitter, update_ghost_prob=False, disable_UT=False): +def refit_tracks( + tracks, + get_clusters_from_track, + track_fitter, + update_ghost_prob=False, + disable_UT=False, +): if get_clusters_from_track: velo_micro_clusters_on_tracks = SelectVPMicroClustersFromTracks(Inputs=[tracks]) scifi_clusters_on_tracks = SelectFTClustersFromTracks(Inputs=[tracks]) @@ -166,23 +171,20 @@ def refit_tracks(tracks, get_clusters_from_track, track_fitter, update_ghost_pro refitted_tracks = None if update_ghost_prob and refitted_tracks: - print([ - tool() - for tool in get_GhostProbabilityTools(without_UT=disable_UT) - ]) + print([tool() for tool in get_GhostProbabilityTools(without_UT=disable_UT)]) refitted_tracks = TrackBestTrackCreator( TracksInContainers=[refitted_tracks], GhostProbTools=[ - tool() - for tool in get_GhostProbabilityTools(without_UT=disable_UT) + tool() for tool in get_GhostProbabilityTools(without_UT=disable_UT) ], - MaxChi2DoF=9999999., # do not apply any chi2 cut - MaxOverlapFracVelo=1.0, # do not clone kill - MaxOverlapFracT=1.0, # do not clone kill - MaxOverlapFracUT=1.0, # do not clone kill - DoNotRefit=True, # also don't refit - AddGhostProb=True, # but just add the ghost prob - FitTracks=False).TracksOutContainer + MaxChi2DoF=9999999.0, # do not apply any chi2 cut + MaxOverlapFracVelo=1.0, # do not clone kill + MaxOverlapFracT=1.0, # do not clone kill + MaxOverlapFracUT=1.0, # do not clone kill + DoNotRefit=True, # also don't refit + AddGhostProb=True, # but just add the ghost prob + FitTracks=False, + ).TracksOutContainer return refitted_tracks @@ -241,8 +243,11 @@ def refit_decay_tree( ).OutputTracks tracks_from_dst = refit_tracks( - tracks_from_particles, get_clusters_from_track, track_fitter=track_fitter, - disable_UT=disable_UT, update_ghost_prob=update_ghost_prob + tracks_from_particles, + get_clusters_from_track, + track_fitter=track_fitter, + disable_UT=disable_UT, + update_ghost_prob=update_ghost_prob, ) relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableParticleToTrack( @@ -290,8 +295,10 @@ def refit_pvs( pv_tracks = SelectTracksForRecVertices(Inputs=[input_pvs]) refitted_pv_tracks = refit_tracks( - tracks=pv_tracks, track_fitter=track_fitter, get_clusters_from_track=True, - update_ghost_prob=False + tracks=pv_tracks, + track_fitter=track_fitter, + get_clusters_from_track=True, + update_ghost_prob=False, ) relation_table_match_by_veloid_to_track = LHCbIDOverlapRelationTableTrackToTrack( -- GitLab From ff1e6a458ad98b8b3bec78eaad96d48e114a8127 Mon Sep 17 00:00:00 2001 From: Laurent Dufour Date: Fri, 7 Mar 2025 22:23:37 +0100 Subject: [PATCH 6/7] Fix missing import --- .../python/RecoConf/offline_calibration/combined_corrections.py | 1 + .../RecoConf/offline_calibration/momentum_scale_calibration.py | 1 + 2 files changed, 2 insertions(+) diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py index 45a49cda502..f647d6b40b5 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py @@ -16,6 +16,7 @@ from PyConf.Algorithms import ( FlattenDecayTree, LHCbIDOverlapRelationTableParticleToTrack, RecombineDecayTrees, + PVsEmptyProducer, SelectTracksForParticles, ) from PyConf.reading import get_odin diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py index 4d628c37493..e95c6d5c39d 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py @@ -14,6 +14,7 @@ from PyConf.Algorithms import ( LHCbIDOverlapRelationTableParticleToTrack, LHCbIDOverlapRelationTableTrackToTrack, RecombineDecayTrees, + PVsEmptyProducer, SelectTracksForParticles, TrackScaleState, ) -- GitLab From 3bbbd04b25349955e4714c4c74e960ef4ff854b3 Mon Sep 17 00:00:00 2001 From: Gitlab CI Date: Fri, 7 Mar 2025 21:24:24 +0000 Subject: [PATCH 7/7] pre-commit fixes patch generated by https://gitlab.cern.ch/lhcb/Moore/-/jobs/52433925 --- .../python/RecoConf/offline_calibration/combined_corrections.py | 2 +- .../RecoConf/offline_calibration/momentum_scale_calibration.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py index f647d6b40b5..3841ca9a824 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/combined_corrections.py @@ -15,8 +15,8 @@ import Functors as F from PyConf.Algorithms import ( FlattenDecayTree, LHCbIDOverlapRelationTableParticleToTrack, - RecombineDecayTrees, PVsEmptyProducer, + RecombineDecayTrees, SelectTracksForParticles, ) from PyConf.reading import get_odin diff --git a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py index e95c6d5c39d..bfe1893c0eb 100644 --- a/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py +++ b/Hlt/RecoConf/python/RecoConf/offline_calibration/momentum_scale_calibration.py @@ -13,8 +13,8 @@ from PyConf.Algorithms import ( FlattenDecayTree, LHCbIDOverlapRelationTableParticleToTrack, LHCbIDOverlapRelationTableTrackToTrack, - RecombineDecayTrees, PVsEmptyProducer, + RecombineDecayTrees, SelectTracksForParticles, TrackScaleState, ) -- GitLab