-
Mark Waterlaat authoredMark Waterlaat authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
moore_data.py 7.23 KiB
###############################################################################
# (c) Copyright 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. #
###############################################################################
import argparse
from Moore import run_reconstruction, Options
from Moore.config import Reconstruction
from PyConf.Algorithms import (
fromPrVeloTracksV1TracksMerger,
VPHitEfficiencyMonitor,
VeloRetinaClusterTrackingSIMDFull,
TrackEventFitter,
TrackListRefiner,
TrackSelectionToContainer,
DeterministicPrescaler,
)
from PyConf.Tools import (
TrackMasterFitter,
TrackInterpolator,
TrackLinearExtrapolator,
)
from PyConf.application import(
default_raw_banks,
make_odin,
default_raw_event,
)
from RecoConf.legacy_rec_hlt1_tracking import (
make_reco_pvs,
make_PatPV3DFuture_pvs,
make_RetinaClusters,
get_default_ut_clusters,
get_global_clusters_on_track_tool_only_velo,
)
from RecoConf.hlt2_tracking import (
TrackBestTrackCreator,
make_PrStoreUTHit_empty_hits,
get_global_measurement_provider,
get_track_master_fitter,
)
from RecoConf.decoders import default_VeloCluster_source
from PyConf import configurable
import Functors as F
make_reco_pvs.global_bind(make_pvs_from_velo_tracks=make_PatPV3DFuture_pvs)
velo_clusters_algorithm_light = make_RetinaClusters
velo_tracking_algorithm = VeloRetinaClusterTrackingSIMDFull
bankType = "VPRetinaCluster"
default_VeloCluster_source.global_bind(bank_type="VPRetinaCluster")
# get TMF
def get_my_track_master_fitter():
with TrackMasterFitter.bind(
MaxNumberOutliers=2,
NumberFitIterations=10,
FastMaterialApproximation=True):
return get_track_master_fitter(
clusters_on_track_tool=get_global_clusters_on_track_tool_only_velo)
@configurable
def make_my_sequence(
*,
beginSensor = 0,
endSensor = 1,
):
data = []
filterList = []
prescaler = DeterministicPrescaler(
name="MyEventPrescaler",
AcceptFraction=float(
0.1,
), # make sure prescale is not interpreted as 'int' because it changes the hash computation...
SeedName="KSPrescaler",
ODINLocation=make_odin())
filterList += [prescaler]
with get_default_ut_clusters.bind(disable_ut=True),\
get_global_measurement_provider.bind(
ignoreUT=True,
velo_hits=velo_clusters_algorithm_light,
ignoreFT=True,
ignoreMuon=True,
ut_hits=make_PrStoreUTHit_empty_hits):
for sensor_under_study in range(beginSensor, endSensor + 1):
my_mask = [sensor in [sensor_under_study]
for sensor in range(208)]
vpClustering = velo_tracking_algorithm(
RawBanks=default_raw_banks(bankType),
SensorMasks=tuple(my_mask),
MaxScatterSeeding=0.1,
MaxScatterForwarding=0.1,
MaxScatter3hits=0.02,
SeedingWindow=10,
SkipForward=8)
clusters = vpClustering.HitsLocation
vpTracks = vpClustering.TracksLocation
vpTracks_backwards = vpClustering.TracksBackwardLocation
vpTracks_v1 = fromPrVeloTracksV1TracksMerger( # converts Pr -> v1 tracks and merges forward/backward
InputTracksLocation1=vpTracks,
InputTracksLocation2=vpTracks_backwards,
TrackAddClusterTool=get_global_clusters_on_track_tool_only_velo(),
).OutputTracksLocation
my_TrackMasterFitter = get_my_track_master_fitter()
fittedTracks = TrackEventFitter(
TracksInContainer=vpTracks_v1,
Fitter=(my_TrackMasterFitter),
MaxChi2DoF=2.8,
name="TrackEventFitter_{hash}").TracksOutContainer
bestTracks = TrackBestTrackCreator(
name="TrackBestTrackCreator_{hash}",
TracksInContainers=[fittedTracks],
DoNotRefit=True,
AddGhostProb=False,
FitTracks=False,
MaxChi2DoF=2.8,
).TracksOutContainer
tracks_selection = TrackListRefiner(
inputLocation=bestTracks,
Code=F.require_all(
F.NVPHITS >= 3,
F.ETA >= 1.3,
F.P >= 0, # Here to make it explicit
F.PT >= 0)).outputLocation
filtered_tracks = TrackSelectionToContainer(
name="TrackSelectionToContainer_{hash}",
InputLocation=tracks_selection).OutputLocation
trackExtrapolator = TrackLinearExtrapolator()
trackInterpolator = TrackInterpolator(Extrapolator=trackExtrapolator)
my_vp_efficiency_alg = VPHitEfficiencyMonitor(
name="VPHitEfficiencyMonitorSensor_{0}".format(
sensor_under_study),
TrackLocation=filtered_tracks,
PrVPHitsLocation=clusters,
UseAandCSide=False,
MaxTrackCov=100.0,
SensorUnderStudy=sensor_under_study,
Interpolator=trackInterpolator,
Extrapolator=trackExtrapolator,
ExpertMode=False,
ResidualTolerance=0.4,
)
data += [my_vp_efficiency_alg]
return Reconstruction('hlt2_hit_eff_reco', data, filters = filterList)
from PyConf.application import default_raw_event
def main(options: Options, *args):
parser = argparse.ArgumentParser(description="Moore HLT2 Hit Efficiency")
parser.add_argument("stream", choices=["turcal_rawbanks", "turcal_persistrecorawbanks", "nobias"])
parser.add_argument("begin_sensor", type=int)
parser.add_argument("end_sensor", type=int)
args = parser.parse_args(args)
# DO NOT COPY THIS THIS WITHOUT CONSULTING DPA-WP2 FIRST
# This is a horrible hack to make it so the histograms are written to the
# file that is expected by Analysis Productions. Ideally we should have a
# better way of managing output/ntuples/histograms but it's currently an
# extremely niche use case.
raw_options = options.dict()
raw_options["histo_file"] = raw_options["ntuple_file"]
raw_options["ntuple_file"] = None
options = Options(**raw_options)
# DO NOT COPY THIS THIS WITHOUT CONSULTING DPA-WP2 FIRST
default_raw_event.global_bind(stream=args.stream)
make_my_sequence.global_bind(beginSensor=args.begin_sensor, endSensor=args.end_sensor)
config = run_reconstruction(options, make_my_sequence)
return config