"""
Functions to check and update the convolution instructions
"""
import voluptuous as vol
from syntheticstellarpopconvolve.default_convolution_instruction import (
default_convolution_instruction_dict,
)
from syntheticstellarpopconvolve.general_functions import check_required, is_time_unit
[docs]
def check_delay_time_data_bin_info_dict(delay_time_data_bin_info_dict):
"""
Function to check data time bin info dict
"""
if "delay_time_data_bin_edges" not in delay_time_data_bin_info_dict:
raise ValueError(
"`delay_time_data_bin_edges` is required in the delay_time_data_bin_info_dict when convolving binned data"
)
if not is_time_unit(delay_time_data_bin_info_dict["delay_time_data_bin_edges"]):
raise ValueError("Please express 'delay_time_data_bin_edges' in units of time")
[docs]
def check_convolution_instruction(convolution_instruction, convolution_config):
"""
Function to check convolution instructions
"""
##########
# from the main dictionary, create a validation scheme
validation_dict = {
key: value["validation"]
for key, value in default_convolution_instruction_dict.items()
if "validation" in value
}
validation_schema = vol.Schema(validation_dict, extra=vol.ALLOW_EXTRA)
##########
# do the basic validation
for parameter, parameter_dict in convolution_config.items():
##########
# Custom rules. we can decide to skip checking the input on some occasions
#
validation_schema({parameter: parameter_dict})
#######
# required for all
check_required(
config=convolution_instruction,
required_list=["input_data_name", "output_data_name"],
)
###################
# checks for particular types of configurations
if convolution_instruction["convolution_type"] == "integrate":
check_required(
config=convolution_instruction,
required_list=[
"data_column_dict",
],
)
#
check_required(
config=convolution_instruction["data_column_dict"],
required_list=[
"normalized_yield",
],
)
# check how metallicity is treated
check_metallicity(
convolution_config=convolution_config,
convolution_instruction=convolution_instruction,
)
check_required(
config=convolution_instruction,
required_list=[
"contains_binned_data",
],
)
#
if convolution_instruction["contains_binned_data"]:
check_required(
config=convolution_instruction,
required_list=[
"delay_time_data_bin_info_dict",
],
)
check_delay_time_data_bin_info_dict(
delay_time_data_bin_info_dict=convolution_instruction[
"delay_time_data_bin_info_dict"
],
)
else:
check_required(
config=convolution_instruction["data_column_dict"],
required_list=[
"delay_time",
],
)
elif convolution_instruction["convolution_type"] == "sample":
check_required(
config=convolution_instruction,
required_list=[
"data_column_dict",
],
)
#
check_required(
config=convolution_instruction["data_column_dict"],
required_list=[
"normalized_yield",
],
)
elif convolution_instruction["convolution_type"] == "on-the-fly":
check_required(
config=convolution_instruction,
required_list=["on_the_fly_function"],
)
else:
raise ValueError(
"convolution type {} unsupported".format(
convolution_instruction["convolution_type"]
)
)
[docs]
def check_and_update_convolution_instruction( # DH0001
convolution_instruction, convolution_config
):
"""
Function to check convolution instructions
"""
# check
check_convolution_instruction(
convolution_instruction=convolution_instruction,
convolution_config=convolution_config,
)
# TODO: add call to update convolution instruction
[docs]
def check_and_update_convolution_instructions(convolution_config):
"""
Main function to check the convolution instructions.
"""
if convolution_config["convolution_instructions"]:
for convolution_instruction in convolution_config["convolution_instructions"]:
check_and_update_convolution_instruction(
convolution_instruction=convolution_instruction,
convolution_config=convolution_config,
)
else:
raise ValueError("Please provide at least one convolution intruction")