From 0c3f8d2cf83a9ca79d7aaf219752209a9bfb6d95 Mon Sep 17 00:00:00 2001 From: Niklas Nolte Date: Thu, 3 Oct 2019 20:02:55 +0200 Subject: [PATCH] lolz --- Hlt/Hlt2Conf/options/generic_example.py | 50 +++ Hlt/Hlt2Conf/python/Hlt2Conf/algorithms.py | 43 ++- Hlt/Hlt2Conf/python/Hlt2Conf/lines/generic.py | 329 ++++++++++++++++++ .../python/Hlt2Conf/standard_particles.py | 19 + PyConf/python/PyConf/application.py | 8 + 5 files changed, 434 insertions(+), 15 deletions(-) create mode 100644 Hlt/Hlt2Conf/options/generic_example.py create mode 100644 Hlt/Hlt2Conf/python/Hlt2Conf/lines/generic.py diff --git a/Hlt/Hlt2Conf/options/generic_example.py b/Hlt/Hlt2Conf/options/generic_example.py new file mode 100644 index 00000000000..43802a57c3f --- /dev/null +++ b/Hlt/Hlt2Conf/options/generic_example.py @@ -0,0 +1,50 @@ +############################################################################### +# (c) Copyright 2019 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. # +############################################################################### +"""Options for running HLT2 lines. + +Run like any other options file: + + ./Moore/run gaudirun.py hlt2_example.py +""" +from Moore import options, run_moore + +from Hlt2Conf.lines.generic import all_lines +from RecoConf.reco_objects_from_file import stateProvider_with_simplified_geom +# TODO stateProvider_with_simplified_geom must go away from option files + +input_files = [ + # MinBias 30000000 + # sim+std://MC/Upgrade/Beam7000GeV-Upgrade-MagDown-Nu7.6-25ns-Pythia8/Sim09c-Up02/Reco-Up01/30000000/LDST + # 'root://xrootd.echo.stfc.ac.uk/lhcb:prod/lhcb/MC/Upgrade/LDST/00069155/0000/00069155_00000878_2.ldst' + # D*-tagged D0 to KK, 27163002 + # sim+std://MC/Upgrade/Beam7000GeV-Upgrade-MagDown-Nu7.6-25ns-Pythia8/Sim09c-Up02/Reco-Up01/27163002/LDST + 'root://lhcbxrootd-kit.gridka.de//pnfs/gridka.de/lhcb/MC/Upgrade/LDST/00070317/0000/00070317_00000012_2.ldst' +] + +options.input_files = input_files +options.input_type = 'ROOT' +options.input_raw_format = 4.3 +# When running from Upgrade MC, must use the post-juggling locations of the raw +# event + +options.evt_max = 100 +options.simulation = True +options.data_type = 'Upgrade' +options.dddb_tag = 'dddb-20171126' +options.conddb_tag = 'sim-20171127-vc-md100' + + +def make_lines(): + return [builder() for builder in all_lines.values()] + + +public_tools = [stateProvider_with_simplified_geom()] +run_moore(options, make_lines, public_tools) diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/algorithms.py b/Hlt/Hlt2Conf/python/Hlt2Conf/algorithms.py index eed5bedfd92..a509d760fe8 100644 --- a/Hlt/Hlt2Conf/python/Hlt2Conf/algorithms.py +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/algorithms.py @@ -20,18 +20,14 @@ functional algorithms. from __future__ import absolute_import, division, print_function import string -from Configurables import CombineParticles, FilterDesktop +from Configurables import CombineParticles, FilterDesktop, DaVinci__N3BodyDecays as ThreeBodyDecays, DaVinci__N4BodyDecays as FourBodyDecays from RecoConf.hlt1_tracking import EmptyFilter from PyConf.components import make_algorithm __all__ = [ - 'EmptyFilter', - 'ParticleFilter', - 'ParticleCombiner', - 'ParticleFilterWithPVs', - 'ParticleCombinerWithPVs', - 'require_all', + 'EmptyFilter', 'ParticleFilter', 'ParticleCombiner' + 'ParticleFilterWithPVs', 'ParticleCombinerWithPVs', 'require_all' ] @@ -105,13 +101,26 @@ def make_dvalgorithm(configurable, ninputs=1): filter_desktop = make_dvalgorithm(FilterDesktop) # Map number of inputs to the combiner that should be used -combiners = { +generic_combiners = { 1: make_dvalgorithm(CombineParticles), 2: make_dvalgorithm(CombineParticles, ninputs=2), 3: make_dvalgorithm(CombineParticles, ninputs=3), 4: make_dvalgorithm(CombineParticles, ninputs=4) } +n3bodycombiners = { + 1: make_dvalgorithm(ThreeBodyDecays), + 2: make_dvalgorithm(ThreeBodyDecays, ninputs=2), + 3: make_dvalgorithm(ThreeBodyDecays, ninputs=3), +} + +n4bodycombiners = { + 1: make_dvalgorithm(FourBodyDecays), + 2: make_dvalgorithm(FourBodyDecays, ninputs=2), + 3: make_dvalgorithm(FourBodyDecays, ninputs=3), + 4: make_dvalgorithm(FourBodyDecays, ninputs=4), +} + def ParticleFilter(particles, **kwargs): """Return a filter algorithm that takes `particles` as inputs. @@ -129,19 +138,15 @@ def ParticleFilterWithPVs(particles, pvs, **kwargs): return ParticleFilter(particles=particles, PrimaryVertices=pvs, **kwargs) -def ParticleCombiner(particles, **kwargs): - """Return a combiner algorithm that takes `particles` as inputs. - - Additional keyword arguments are forwarded to CombineParticles. - """ +def ParticleCombiner(particles, __combiners=generic_combiners, **kwargs): particles = particles if isinstance(particles, list) else [particles] ninputs = len(particles) # Need to dispatch to the right combiner, based on the number of inputs assert len( - combiners) >= ninputs, 'Do not have a combiner for {} inputs'.format( + __combiners) >= ninputs, 'Do not have a combiner for {} inputs'.format( ninputs) - combiner = combiners[ninputs] + combiner = __combiners[ninputs] # Map each input container to an input property name inputs = { @@ -162,3 +167,11 @@ def ParticleCombinerWithPVs(particles, pvs, **kwargs): Additional keyword arguments are forwarded to CombineParticles. """ return ParticleCombiner(particles=particles, PrimaryVertices=pvs, **kwargs) + + +def N3BodyCombiner(particles, **kwargs): + return ParticleCombiner(particles, __combiners=n3bodycombiners, **kwargs) + + +def N4BodyCombiner(particles, **kwargs): + return ParticleCombiner(particles, __combiners=n4bodycombiners, **kwargs) diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/lines/generic.py b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/generic.py new file mode 100644 index 00000000000..b59080d17ad --- /dev/null +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/lines/generic.py @@ -0,0 +1,329 @@ +############################################################################### +# (c) Copyright 2019 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. # +############################################################################### +""" +Some generic lines + +mainly to test consistency combiners and filters and estimate timing +""" + +from __future__ import absolute_import, division, print_function +import math + +from Moore.config import HltLine, register_line_builder + +from GaudiKernel.SystemOfUnits import GeV, MeV, mm, mrad + +from RecoConf.hlt1_tracking import require_pvs, require_gec +from RecoConf.reco_objects_from_file import make_pvs, upfront_reconstruction + +from ..algorithms import require_all, ParticleCombiner, ParticleFilterWithPVs, N3BodyCombiner, N4BodyCombiner +from PyConf.Algorithms import TwoBodyCombiner, ThreeBodyCombiner, FourBodyCombiner + +from ..framework import configurable +from ..standard_particles import make_all_pions, make_all_kaons + +from Functors import ALL, DOCACHI2, NONE, MAXDOCACHI2CUT, PT + +all_lines = {} + + +@configurable +def make_selected_particles(make_particles=make_all_pions, + make_pvs=make_pvs, + mipchi2_min=8, + pt_min=500 * MeV): + """ + Parameters + ---------- + make_particles + Particle maker function. + make_pvs : callable + Primary vertex maker function. + mipchi2_min: int, float + The minimum ip cut + + Remaining parameters define thresholds for the selection. """ + code = require_all('PT > {pt_min}', + 'MIPCHI2DV(PRIMARY) > {mipchi2_min}').format( + pt_min=pt_min, mipchi2_min=mipchi2_min) + return ParticleFilterWithPVs(make_particles(), make_pvs(), Code=code) + + +def prefilters(): + return [require_gec(), require_pvs(make_pvs())] + + +@register_line_builder(all_lines) +def Hlt2Generic2BodyLine(name='Hlt2Generic2BodyLine', prescale=1): + my_triggered_particles = make_selected_particles( + make_particles=make_all_kaons, mipchi2_min=9) + my_loose_particles = make_selected_particles(make_particles=make_all_pions) + my_combined_particles = ParticleCombiner( + particles=[my_loose_particles, my_triggered_particles], + DecayDescriptors=[ + 'D0 -> K+ pi+', + 'D0 -> K+ pi-', + 'D0 -> K- pi+', + 'D0 -> K- pi-', + ], + DaughtersCuts={"K+": "PT > 1 * GeV"}, + CombinationCut="ADOCACHI2CUT(12., '')", + MotherCut="ALL", + # VertexFitters = { "": "TrgVertexFitter" }, + # DistanceCalculators = { "": "LoKi::TrgDistanceCalculator" }, + ) + return HltLine( + name=name, + algs=upfront_reconstruction() + prefilters() + [my_combined_particles], + prescale=prescale) + + +@register_line_builder(all_lines) +def Hlt2GenericNew2BodyLine(name='Hlt2GenericNew2BodyLine', prescale=1): + my_triggered_particles = make_selected_particles( + make_particles=make_all_kaons, mipchi2_min=9) + my_loose_particles = make_selected_particles(make_particles=make_all_pions) + + K_cut = PT > 1 * GeV + comb_cut = MAXDOCACHI2CUT(12.) + _comb = comb_cut.code() + _comb_headers = comb_cut.headers() + + from PyConf.Tools import DecodeSimpleDecayString + + my_combined_particles = TwoBodyCombiner( + DecayDecoder=DecodeSimpleDecayString(), + Inputs=[my_triggered_particles, my_loose_particles], + DecayDescriptors=[ + 'D0 -> K+ pi+', + 'D0 -> K+ pi-', + 'D0 -> K- pi+', + 'D0 -> K- pi-', + ], + Combination12Cut_Headers=_comb_headers, + Combination12Cut=_comb, + DaughterCuts={"K+": K_cut.code()}, + DaughterCuts_Headers=K_cut.headers(), + # DistanceCalculator = "LoKi::TrgDistanceCalculator", + # ParticleCombiner = "TrgVertexFitter", + # OutputLevel=2, + ) + return HltLine( + name=name, + algs=upfront_reconstruction() + prefilters() + [my_combined_particles], + prescale=prescale) + + +@register_line_builder(all_lines) +def Hlt2GenericNBody3BodyLine(name='Hlt2GenericNBody3BodyLine', prescale=1): + my_triggered_particles = make_selected_particles( + make_particles=make_all_kaons, mipchi2_min=9, pt_min=1 * GeV) + my_loose_particles = make_selected_particles(make_particles=make_all_pions) + my_combined_particles = N3BodyCombiner( + particles=[my_loose_particles, my_triggered_particles], + DecayDescriptors=[ + 'D0 -> K+ pi+ pi+', + 'D0 -> K+ pi- pi+', + 'D0 -> K+ pi- pi-', + 'D0 -> K- pi+ pi+', + 'D0 -> K- pi- pi+', + 'D0 -> K- pi- pi-', + ], + Combination12Cut="ADOCACHI2CUT(12, '')", + CombinationCut="ADOCACHI2CUT(12, '')", + MotherCut="ALL", + # VertexFitters = { "": "TrgVertexFitter" }, + # DistanceCalculators = { "": "LoKi::TrgDistanceCalculator" }, + # OutputLevel=2, + ) + return HltLine( + name=name, + algs=upfront_reconstruction() + prefilters() + [my_combined_particles], + prescale=prescale) + + +@register_line_builder(all_lines) +def Hlt2Generic3BodyLine(name='Hlt2Generic3BodyLine', prescale=1): + my_triggered_particles = make_selected_particles( + make_particles=make_all_kaons, mipchi2_min=9, pt_min=1 * GeV) + my_loose_particles = make_selected_particles(make_particles=make_all_pions) + my_combined_particles = ParticleCombiner( + particles=[my_loose_particles, my_triggered_particles], + DecayDescriptors=[ + 'D0 -> K+ pi+ pi+', + 'D0 -> K+ pi- pi+', + 'D0 -> K+ pi- pi-', + 'D0 -> K- pi+ pi+', + 'D0 -> K- pi- pi+', + 'D0 -> K- pi- pi-', + ], + CombinationCut="ADOCACHI2CUT(12, '')", + MotherCut="ALL", + # VertexFitters = { "": "TrgVertexFitter" }, + # DistanceCalculators = { "": "LoKi::TrgDistanceCalculator" }, + # OutputLevel=2, + ) + return HltLine( + name=name, + algs=upfront_reconstruction() + prefilters() + [my_combined_particles], + prescale=prescale) + + +@register_line_builder(all_lines) +def Hlt2GenericNew3BodyLine(name='Hlt2GenericNew3BodyLine', prescale=1): + my_triggered_particles = make_selected_particles( + make_particles=make_all_kaons, mipchi2_min=9, pt_min=1 * GeV) + my_loose_particles = make_selected_particles(make_particles=make_all_pions) + comb_cut = MAXDOCACHI2CUT(12.) + sub_comb1_cut = MAXDOCACHI2CUT(12.) + sub_comb2_cut = MAXDOCACHI2CUT(12.) + _comb = comb_cut.code() + _comb_headers = comb_cut.headers() + _sub_comb1 = sub_comb1_cut.code() + _sub_comb1_headers = sub_comb1_cut.headers() + _sub_comb2 = sub_comb2_cut.code() + _sub_comb2_headers = sub_comb2_cut.headers() + + from PyConf.Tools import DecodeSimpleDecayString + + my_combined_particles = ThreeBodyCombiner( + DecayDecoder=DecodeSimpleDecayString(), + Inputs=[my_triggered_particles, my_loose_particles], + DecayDescriptors=[ + 'D0 -> K+ pi+ pi+', + 'D0 -> K+ pi- pi+', + 'D0 -> K+ pi- pi-', + 'D0 -> K- pi+ pi+', + 'D0 -> K- pi- pi+', + 'D0 -> K- pi- pi-', + ], + Combination123Cut_Headers=_comb_headers, + Combination12Cut_Headers=_sub_comb1_headers, + Combination13Cut_Headers=_sub_comb2_headers, + Combination123Cut=_comb, + Combination12Cut=_sub_comb1, + Combination13Cut=_sub_comb2, + # OutputLevel=2, + # DistanceCalculator="LoKi::TrgDistanceCalculator", + # ParticleCombiner="TrgVertexFitter", + ) + return HltLine( + name=name, + algs=upfront_reconstruction() + prefilters() + [my_combined_particles], + prescale=prescale) + + +@register_line_builder(all_lines) +def Hlt2GenericNBody4BodyLine(name='Hlt2GenericNBody4BodyLine', prescale=1): + my_triggered_particles = make_selected_particles( + make_particles=make_all_kaons, mipchi2_min=9, pt_min=1 * GeV) + my_loose_particles = make_selected_particles(make_particles=make_all_pions) + my_combined_particles = N4BodyCombiner( + particles=[my_loose_particles, my_triggered_particles], + DecayDescriptors=[ + 'D0 -> K+ pi+ pi+ pi+', + 'D0 -> K+ pi+ pi+ pi-', + 'D0 -> K+ pi+ pi- pi-', + 'D0 -> K+ pi- pi- pi-', + 'D0 -> K- pi+ pi+ pi+', + 'D0 -> K- pi+ pi+ pi-', + 'D0 -> K- pi+ pi- pi-', + 'D0 -> K- pi- pi- pi-', + ], + CombinationCut="ADOCACHI2CUT(12, '')", + Combination12Cut="ADOCACHI2CUT(12, '')", + Combination123Cut="ADOCACHI2CUT(12, '')", + # VertexFitters = { "": "TrgVertexFitter" }, + # DistanceCalculators = { "": "LoKi::TrgDistanceCalculator" }, + MotherCut="ALL") + return HltLine( + name=name, + algs=upfront_reconstruction() + prefilters() + [my_combined_particles], + prescale=prescale) + + +@register_line_builder(all_lines) +def Hlt2Generic4BodyLine(name='Hlt2Generic4BodyLine', prescale=1): + my_triggered_particles = make_selected_particles( + make_particles=make_all_kaons, mipchi2_min=9, pt_min=1 * GeV) + my_loose_particles = make_selected_particles(make_particles=make_all_pions) + my_combined_particles = ParticleCombiner( + particles=[my_loose_particles, my_triggered_particles], + DecayDescriptors=[ + 'D0 -> K+ pi+ pi+ pi+', + 'D0 -> K+ pi+ pi+ pi-', + 'D0 -> K+ pi+ pi- pi-', + 'D0 -> K+ pi- pi- pi-', + 'D0 -> K- pi+ pi+ pi+', + 'D0 -> K- pi+ pi+ pi-', + 'D0 -> K- pi+ pi- pi-', + 'D0 -> K- pi- pi- pi-', + ], + CombinationCut="ADOCACHI2CUT(12, '')", + MotherCut="ALL", + # VertexFitters = { "": "TrgVertexFitter" }, + # DistanceCalculators = { "": "LoKi::TrgDistanceCalculator" }, + # OutputLevel=2, + ) + return HltLine( + name=name, + algs=upfront_reconstruction() + prefilters() + [my_combined_particles], + prescale=prescale) + + +@register_line_builder(all_lines) +def Hlt2GenericNew4BodyLine(name='Hlt2GenericNew4BodyLine', prescale=1): + my_triggered_particles = make_selected_particles( + make_particles=make_all_kaons, mipchi2_min=9, pt_min=1 * GeV) + my_loose_particles = make_selected_particles(make_particles=make_all_pions) + comb_cut = MAXDOCACHI2CUT(12.) + sub_comb1_cut = MAXDOCACHI2CUT(12.) + sub_comb2_cut = MAXDOCACHI2CUT(12.) + _comb = comb_cut.code() + _comb_headers = comb_cut.headers() + _sub_comb1 = sub_comb1_cut.code() + _sub_comb1_headers = sub_comb1_cut.headers() + _sub_comb2 = sub_comb2_cut.code() + _sub_comb2_headers = sub_comb2_cut.headers() + + # from PyConf.Tools import DecodeSimpleDecayString + + my_combined_particles = FourBodyCombiner( + # DecayDecoder=DecodeSimpleDecayString(), + Inputs=[my_loose_particles, my_triggered_particles], + DecayDescriptors=[ + 'D0 -> K+ pi+ pi+ pi+', + 'D0 -> K+ pi+ pi+ pi-', + 'D0 -> K+ pi+ pi- pi-', + 'D0 -> K+ pi- pi- pi-', + 'D0 -> K- pi+ pi+ pi+', + 'D0 -> K- pi+ pi+ pi-', + 'D0 -> K- pi+ pi- pi-', + 'D0 -> K- pi- pi- pi-', + ], + Combination123Cut_Headers=_comb_headers, + Combination1234Cut_Headers=_sub_comb1_headers, + Combination12Cut_Headers=_sub_comb1_headers, + Combination13Cut_Headers=_sub_comb2_headers, + Combination14Cut_Headers=_sub_comb2_headers, + Combination123Cut=_sub_comb1, + Combination1234Cut=_comb, + Combination12Cut=_sub_comb1, + Combination13Cut=_sub_comb2, + Combination14Cut=_sub_comb2, + # DistanceCalculator="LoKi::TrgDistanceCalculator", + # ParticleCombiner="TrgVertexFitter", + # OutputLevel=2, + ) + return HltLine( + name=name, + algs=upfront_reconstruction() + prefilters() + [my_combined_particles], + prescale=prescale) diff --git a/Hlt/Hlt2Conf/python/Hlt2Conf/standard_particles.py b/Hlt/Hlt2Conf/python/Hlt2Conf/standard_particles.py index 9d39b47468f..ed6b4316fbc 100644 --- a/Hlt/Hlt2Conf/python/Hlt2Conf/standard_particles.py +++ b/Hlt/Hlt2Conf/python/Hlt2Conf/standard_particles.py @@ -31,6 +31,11 @@ from .hacks import patched_hybrid_tool from RecoConf.reco_objects_from_file import make_protoparticles +@configurable +def all_track_selector(Code='TrALL', **kwargs): + return TrackSelector(Code=Code, **kwargs) + + @configurable def get_long_track_selector(Code='TrALL', **kwargs): return TrackSelector(Code=require_all('TrLONG', Code), **kwargs) @@ -65,6 +70,13 @@ def make_particles(species='pion', return particles +def make_all_pions(): + return make_particles( + species="pion", + get_track_selector=all_track_selector, + make_protoparticle_filter=standard_protoparticle_filter) + + #Long particles def make_long_pions(): return make_particles( @@ -80,6 +92,13 @@ def make_long_kaons(): make_protoparticle_filter=standard_protoparticle_filter) +def make_all_kaons(): + return make_particles( + species="kaon", + get_track_selector=all_track_selector, + make_protoparticle_filter=standard_protoparticle_filter) + + def make_long_protons(): return make_particles( species="proton", diff --git a/PyConf/python/PyConf/application.py b/PyConf/python/PyConf/application.py index 8244e98095c..8427630f526 100644 --- a/PyConf/python/PyConf/application.py +++ b/PyConf/python/PyConf/application.py @@ -156,6 +156,7 @@ class ApplicationOptions(ConfigurableUser): # debugging 'control_flow_file': 'control_flow.gv', 'data_flow_file': 'data_flow.gv', + 'timeline_file': '', } _propertyDocDct = { @@ -467,6 +468,13 @@ def configure(options, control_flow_node, public_tools=[]): config.add(setup_component('HistogramPersistencySvc', OutputLevel=5)) config.add( setup_component('EventClockSvc', InitialTime=int(INITIAL_TIME * 1e9))) + if options.timeline_file: + config.add( + setup_component( + 'TimeLineSvc', + RecordTimeLine=True, + DumpTimeLine=True, + TimeLineFile=options.timeline_file)) if options.histo_file: config.add( -- GitLab