Skip to content
Snippets Groups Projects
Commit 9e2fa072 authored by Christopher Rob Jones's avatar Christopher Rob Jones
Browse files

Merge branch 'AM_process' into 'master'

Remove default values of process such that it is configured once via a required user input

See merge request !3806
parents cf0cd6ec c9dfa485
No related branches found
Tags v45r4
1 merge request!3806Remove default values of process such that it is configured once via a required user input
Pipeline #4686659 passed
......@@ -8,7 +8,8 @@
# granted to it by virtue of its status as an Intergovernmental Organization #
# or submit itself to any jurisdiction. #
###############################################################################
__all__ = ("DataTypeEnum", "FileFormats", "EventStores", "Options", "main")
__all__ = ("ProcessTypes", "DataTypeEnum", "FileFormats", "EventStores",
"Options", "main")
import os
import sys
......@@ -16,7 +17,7 @@ import sys
import click
from .configurables import config2opts, do_export
from .options import DataTypeEnum, FileFormats, EventStores, Options
from .options import ProcessTypes, DataTypeEnum, FileFormats, EventStores, Options
def main(function,
......
......@@ -24,6 +24,12 @@ from Gaudi.Configuration import INFO
from DDDB.CheckDD4Hep import UseDD4Hep
class ProcessTypes(str, Enum):
Turbo = "Turbo"
Hlt2 = "Hlt2"
Spruce = "Spruce"
class DataTypeEnum(Enum):
Upgrade = 'Upgrade'
......
......@@ -13,13 +13,31 @@ from PyConf.packing import reco_locations, unpackers_map
from PyConf.components import force_location
from PyConf.tonic import configurable
from PyConf.Algorithms import UnpackMCParticle, UnpackMCVertex
from PyConf.application import make_data_with_FetchDataFromFile
from GaudiConf.reading import bank_location
from typing import OrderedDict
from GaudiConf.LbExec import ProcessTypes
from GaudiConf.reading import hlt_decisions
from PyConf.application import (default_raw_event, make_odin,
make_data_with_FetchDataFromFile)
@configurable
def upfront_decoder(process='Spruce'):
def get_tes_root(*, process: ProcessTypes):
"""
Get the ROOT_TES location from the process type
"""
if process == ProcessTypes.Spruce:
return '/Event/Spruce/HLT2'
elif process in [ProcessTypes.Hlt2, ProcessTypes.Turbo]:
return '/Event/HLT2'
else:
raise NotImplementedError(
f"The specified 'process' {process} is not recognised. Can only be 'Hlt2' or 'Spruce' or 'Turbo'. Please check!"
)
@configurable
def upfront_decoder(*, process: ProcessTypes):
"""Return a DataHandle for HltPackedBufferDecoder output
This is input to all unpacking algorithms except MC and old unpacker
"""
......@@ -50,41 +68,41 @@ def upfront_decoder(process='Spruce'):
RawBanks=dst_data).OutputBuffers
def get_particles(location, process="Spruce"):
def get_particles(location):
"""
Unpacking of particles. This will also unpack the decay vertices associated with these particles implicitely
"""
unpacker = unpackers_map()["Particles"]
return unpacker(
InputName=upfront_decoder(process),
InputName=upfront_decoder(),
outputs={
"OutputName": force_location(location)
}).OutputName
def get_pp2mcp_relations(location, process="Spruce", extra_inputs=[]):
def get_pp2mcp_relations(location, extra_inputs=[]):
"""
Unpacking of ProtoParticle to MCParticle relations. These are needed for truth matching
"""
unpacker_pp2mcp = unpackers_map()["PP2MCPRelations"]
return unpacker_pp2mcp(
InputName=upfront_decoder(process),
InputName=upfront_decoder(),
ExtraInputs=extra_inputs,
outputs={
"OutputName": force_location(location)
}).OutputName
def get_p2v_relations(location, process="Spruce"):
def get_p2v_relations(location):
"""
Unpacking of P2V relations. Make sure particles are unpacked
"""
unpacker_p2v = unpackers_map()["P2VPRelations"]
return unpacker_p2v(
InputName=upfront_decoder(process),
InputName=upfront_decoder(),
outputs={
"OutputName": force_location(location)
}).OutputName
......@@ -126,48 +144,123 @@ def get_mc_vertices(location):
}).OutputName
def reconstruction(process='Spruce', obj="", reco=""):
stream = '/Event/Spruce/HLT2'
if process in ['Hlt2', 'Turbo']:
stream = '/Event/HLT2'
@configurable
def reconstruction(*, process: ProcessTypes, obj: str, reco: str):
stream = get_tes_root(process=process)
location = reco_locations(stream)[obj][0]
unpacker = unpackers_map()[reco]
return unpacker(
InputName=upfront_decoder(process),
InputName=upfront_decoder(),
outputs={
"OutputName": force_location(location)
}).OutputName
def get_rich_pids(process='Spruce'):
return reconstruction(process=process, obj='RichPIDs', reco="RichPIDs")
def get_rich_pids():
return reconstruction(obj='RichPIDs', reco="RichPIDs")
def get_muon_pids(process='Spruce'):
return reconstruction(process=process, obj='MuonPIDs', reco="MuonPIDs")
def get_muon_pids():
return reconstruction(obj='MuonPIDs', reco="MuonPIDs")
def get_charged_protoparticles(process='Spruce'):
return reconstruction(
process=process, obj="ChargedProtos", reco="ProtoParticles")
def get_charged_protoparticles():
return reconstruction(obj="ChargedProtos", reco="ProtoParticles")
def get_neutral_protoparticles(process='Spruce'):
return reconstruction(
process=process, obj="NeutralProtos", reco="ProtoParticles")
def get_neutral_protoparticles():
return reconstruction(obj="NeutralProtos", reco="ProtoParticles")
def get_pvs_v1(process='Spruce'):
return reconstruction(process=process, obj="PVs", reco="PVs")
def get_pvs_v1():
return reconstruction(obj="PVs", reco="PVs")
def get_pvs(process='Spruce'):
def get_pvs():
### Temporary: as long as we persist v1, we need to insert a converter for the new PVs
from PyConf.Algorithms import RecV1ToPVConverter
return RecV1ToPVConverter(InputVertices=get_pvs_v1(process)).OutputVertices
return RecV1ToPVConverter(InputVertices=get_pvs_v1()).OutputVertices
def get_rec_summary():
return reconstruction(obj="RecSummary", reco="RecSummary")
@configurable
def get_mc_track_info(*, process: ProcessTypes):
if process in {'Spruce', 'Turbo'}:
raise NotImplementedError(
"MCTrackInfo is not persisted in Spruce/Turbo at the moment, this will be fixed in the future, see: "
"https://gitlab.cern.ch/lhcb/Moore/-/issues/440")
elif process != 'Hlt2':
raise NotImplementedError(
f"The specified 'process' {process} is not recognised. Can only be 'Hlt2' or 'Spruce' or 'Turbo'."
)
mc_track_info = make_data_with_FetchDataFromFile('/Event/MC/TrackInfo')
mc_track_info.force_type('LHCb::MCProperty')
return mc_track_info
@configurable
def get_odin(*, process: ProcessTypes, stream: str, input_raw_format: float):
"""
Function to get the LHCb::ODIN location
Args:
options (DaVinci.Options): lbexec provided options object
Returns:
odin_loc: Location of the LHCb::ODIN
"""
#Stream has to be empty for Hlt2
# Even the "default" in DV is overridden for Hlt2 process to be empty
if process == 'Hlt2':
stream = ""
with default_raw_event.bind(raw_event_format=input_raw_format):
odin_loc = make_odin(stream=stream)
return odin_loc
@configurable
def get_hlt_reports(source, *, process: ProcessTypes, stream: str):
"""
Set the Hlt service and algorithms.
Args:
source (str): source ID or selection stage. It can be "Hlt1" or "Hlt2" or "Spruce".
Returns:
HltDecReportsDecoder containing the configuration for Hlt1, Hlt2 and Spruce lines.
"""
if source == 'Hlt1' or source == 'Hlt2':
dec_reports = hlt_decisions(
process=process,
stream=stream,
output_loc="/Event/%s/DecReports" % source,
configurables=False,
source=source)
elif source == 'Spruce':
dec_reports = hlt_decisions(
process=process, stream=stream, configurables=False, source=source)
return dec_reports
def get_decreports(source):
"""
Function to get the LHCb::DecReports for HLT1, HLT2 or Sprucing.
Args:
source (str): Selection stage can be "Hlt1" or "Hlt2" or "Spruce"
Returns:
dec_loc: Location of the LHCb::DecReports for HLT1 or Hlt2 or Spruce
"""
assert source in ['Hlt1', 'Hlt2',
'Spruce'], "Source has to be Hlt1 or Hlt2 or Spruce"
def get_rec_summary(process="Spruce"):
return reconstruction(process=process, obj="RecSummary", reco="RecSummary")
dec_loc = get_hlt_reports(source).OutputHltDecReportsLocation
return dec_loc
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment