Source code for model.legacy_model_parameter

#!/usr/bin/python3
"""
Handling of legacy model parameters for backward compatibility.

Collects routines to convert legacy model parameters to more recent
formats. This is a fine-tuned process and requires to hard wire the
changes. All code related to legacy model parameters should go into
this module.

"""

import logging

logger = logging.getLogger(__name__)


UPDATE_HANDLERS = {}


[docs] def register_update(name): """Register update handler for legacy model parameter.""" def deco(func): UPDATE_HANDLERS[name] = func return func return deco
[docs] def apply_legacy_updates_to_parameters(parameters, legacy_updates): """Apply legacy updates to model parameters. Modifies the parameters dictionary in-place. Parameters ---------- parameters: dict Dictionary of model parameters (all parameters). legacy_updates: dict Dictionary of legacy updates to apply. """ for par_name, legacy_data in legacy_updates.items(): if legacy_data is None or par_name not in parameters: continue for key in parameters[par_name].keys(): if key in legacy_data: parameters[par_name][key] = legacy_data[key] if legacy_data.get("remove_parameter", False): parameters.pop(par_name)
[docs] def update_parameter(par_name, parameters, schema_version): """Update legacy model parameters to recent formats. Parameters ---------- par_name: str Model parameter name. parameters: dict Dictionary of model parameters (all parameters). schema_version: str Target schema version. Returns ------- dict Updated model parameter. """ handler = UPDATE_HANDLERS.get(par_name) if handler is None: raise ValueError(_get_unsupported_update_message(parameters[par_name], schema_version)) return handler(parameters, schema_version)
@register_update("dsum_threshold") def _update_dsum_threshold(parameters, schema_version): """Update legacy dsum_threshold parameter.""" para_data = parameters["dsum_threshold"] if para_data["model_parameter_schema_version"] == "0.1.0" and schema_version == "0.2.0": logger.info( "Updating legacy model parameter dsum_threshold from schema version " f"{para_data['model_parameter_schema_version']} to {schema_version}" ) return { para_data["parameter"]: { "value": int(para_data["value"]), "model_parameter_schema_version": schema_version, } } raise ValueError(_get_unsupported_update_message(para_data, schema_version)) @register_update("corsika_starting_grammage") def _update_corsika_starting_grammage(parameters, schema_version): """Update legacy corsika_starting_grammage parameter (dummy function until model is updated).""" logger.debug(f"No fix applied to corsika_starting_grammage to schema version {schema_version}") return { parameters["corsika_starting_grammage"]["parameter"]: None, } @register_update("flasher_pulse_shape") def _update_flasher_pulse_shape(parameters, schema_version): """Update legacy flasher_pulse_shape parameter.""" para_data = parameters["flasher_pulse_shape"] if para_data["model_parameter_schema_version"] == "0.1.0" and schema_version == "0.2.0": logger.info( f"Updating legacy model parameter flasher_pulse_shape from schema version " f"{para_data['model_parameter_schema_version']} to {schema_version}" ) return { para_data["parameter"]: { "value": [ para_data["value"], parameters.get("flasher_pulse_width", {}).get("value", 0.0), parameters.get("flasher_pulse_exp_decay", {}).get("value", 0.0), ], "model_parameter_schema_version": schema_version, "unit": [None, "ns", "ns"], "type": ["string", "float64", "float64"], }, "flasher_pulse_width": {"remove_parameter": True}, "flasher_pulse_exp_decay": {"remove_parameter": True}, } raise ValueError(_get_unsupported_update_message(para_data, schema_version)) def _get_unsupported_update_message(para_data, schema_version): """Get unsupported update message.""" return ( f"Unsupported update for legacy parameter {para_data['parameter']}: " f"{para_data['model_parameter_schema_version']} to {schema_version}" )