Source code for LbAPCommon.options_parsing

###############################################################################
# (c) Copyright 2021-2022 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 json

import uproot

from LbAPCommon.parsing import is_simulation_job


[docs]def validate_options(json_file: str, ntuple_fn: str, job_name: str, prod_data: dict): """Validate YAML options. Check existence of expected TTrees and ensure at least one DecayTree and MCDecayTree (for MC samples) exist(s) in output files. Args: json_file (str): json_file listing the expected TTrees ntuple_fn (str): Local test output tuple to validate against job_name (str): Name of job to validate prod_data (dict): Entire production information from yaml parsing Returns: tuple[list[str]]: Errors if any expected TTrees are not found in job output, warnings if at least one (MC)DecayTree isn't found in job output """ with open(json_file, "rb") as fp: json_dump = json.load(fp) file = uproot.open(ntuple_fn) tuple_keys = file.keys(cycle=False) errors = [] warnings = [] mc_decay_tree = any({"MCDecayTree" in key for key in tuple_keys}) decay_tree = any( {("DecayTree" in key and "MCDecayTree" not in key) for key in tuple_keys} ) if not decay_tree: warnings.append( "No DecayTree detected in the output file! Is this intentional?" ) # It's not possible to statically check if using transform_ids as input if "transform_ids" not in prod_data[job_name]["input"]: if is_simulation_job(prod_data, job_name) and not mc_decay_tree: warnings.append( "No MCDecayTree detected in the output file! Is this intentional?" ) # Checking DecayTreeTuples for ntuple in json_dump["DecayTreeTuple"]: if ntuple not in tuple_keys: errors.append(f"ERROR: DecayTreeTuple {ntuple} missing in test result") # Checking MCDecayTreeTuples for ntuple in json_dump["MCDecayTreeTuple"]: if ntuple not in tuple_keys: errors.append(f"ERROR: MCDecayTreeTuple {ntuple} missing in test result") # Checking MCDecayTreeTuples for ntuple in json_dump["EventTuple"]: if ntuple not in tuple_keys: errors.append(f"ERROR: EventTuple {ntuple} missing in test result") return errors, warnings