Loading etl/assets/commons/__init__.py +16 −2 Original line number Diff line number Diff line Loading @@ -35,6 +35,12 @@ def setup_logger(name: str, def validate_parameter(param_to_validate, default): """ Substitute default value if the parameter is set to None :param param_to_validate: input to validate :param default: default value :return: default value if parameter is set to None, else the passed value """ return param_to_validate if param_to_validate is not None else default Loading @@ -57,6 +63,13 @@ def load_config_file(config_file_path: str, def parse_grid_overrides(par_name: str, config: dict) -> np.array: """ Parse the global configuration for constructing the grid, computing the parameter values for which the grid has to be computed. :param par_name: parameter to parse :param config: configuration dictionary to extract the grid properties :return: the array of values to be considered in the grid """ config_overrides = config['overrides'] if config_overrides[f'{par_name}_grid_type'] == 'linear': grid_values = np.arange(float(config_overrides[f'{par_name}_limits'][0]), Loading Loading @@ -184,7 +197,8 @@ def get_grid_edges(grid_metadata: dict) -> np.array: indices = np.arange(grid_metadata['grid_shape'][axis_idx] + 1) - grid_metadata['grid_refpix'][axis_idx] - 0.5 # valid for regular grid grid_edges.append(compute_cartesian_coordinate_grid(indices=indices, physical_px_size=grid_metadata['physical_px_size'][axis_idx])) physical_px_size=grid_metadata['physical_px_size'][ axis_idx])) # Transposed for consistent flattening return np.array(grid_edges).T Loading etl/assets/constants/__init__.py +10 −0 Original line number Diff line number Diff line Loading @@ -46,3 +46,13 @@ radmc_lines_mode_mapping = { 'lvg': 3, 'optically_thin_non_lte': 4, } radmc_options_mapping = { 'inclination': 'incl', 'position_angle': 'phi', 'imolspec': 'imolspec', 'iline': 'iline', 'width_kms': 'widthkms', 'nchannels': 'linenlam', 'npix': 'npix' } etl/mdl/mdl_prepare_radmc_command.py +32 −3 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ from typing import Union from astropy import units as u from assets.commons import (load_config_file, convert_frequency_to_wavelength) from assets.constants import radmc_options_mapping def main(override_config: Union[dict, None] = None): Loading @@ -11,11 +12,39 @@ def main(override_config: Union[dict, None] = None): central_frequency = convert_frequency_to_wavelength( frequency=float(config['radmc']['central_frequency']) * u.Unit(config['radmc']['frequency_units']), output_units=u.Unit("micron")) assert check_config(config=config) with open(os.path.join('mdl', 'radmc3d_postprocessing.sh'), 'w') as outfile: outfile.write('cd mdl/radmc_files\n') outfile.write(f'radmc3d image incl {config["radmc"]["inclination"]} phi {config["radmc"]["position_angle"]}' f' iline {config["radmc"]["iline"]} widthkms {config["radmc"]["width_kms"]} ' f'linenlam {config["radmc"]["nchannels"]} npix {config["radmc"]["npix"]}') options_set = get_command_options(config) outfile.write(f'radmc3d image {" ".join(options_set)}') def check_config(config: dict) -> bool: """ Check if all mandatory keys are present in the configuration dictionary. :param config: the configuration dictionary :return: True is all keys are present, False otherwise """ mandatory_keys = { 'inclination', 'position_angle', } return set(mandatory_keys).difference(set(config.keys())) == set() def get_command_options(config: dict) -> set: """ Parse the radmc3d command options from the configuration dictionary :param config: the configuration dictionary :return: a set of string to postpone to the radmc3d image command """ options_list = [] for key in config["radmc"]: try: options_list.append(f'{radmc_options_mapping[key]} {config["radmc"][key]}') except KeyError: pass return set(options_list) if __name__ == '__main__': Loading etl/tests/test_commons.py +47 −1 Original line number Diff line number Diff line Loading @@ -7,7 +7,11 @@ from assets.commons import (compute_power_law_radial_profile, get_grid_edges, extract_grid_metadata, get_physical_px_size, compute_cartesian_coordinate_grid, get_distance_matrix, get_centered_indices) compute_cartesian_coordinate_grid, get_distance_matrix, get_centered_indices, validate_parameter, parse_grid_overrides) from unittest import TestCase Loading Loading @@ -173,3 +177,45 @@ class Test(TestCase): [-1, 0, 1]]] indices = get_centered_indices(grid_metadata=grid_metadata) self.assertTrue(np.array_equal(np.array(expected_indices), indices)) def test_validate_parameter_none(self): parameter = None default = 10 result = validate_parameter(param_to_validate=parameter, default=default) self.assertEqual(default, result) def test_validate_parameter(self): parameter = 100 default = 10 result = validate_parameter(param_to_validate=parameter, default=default) self.assertEqual(parameter, result) def test_parse_grid_overrides_linear(self): config = { 'overrides': { 'dust_temperature_grid_type': 'linear', 'dust_temperature_limits': [10, 30], 'dust_temperature_step': 1, } } expected_results = np.arange(config['overrides']['dust_temperature_limits'][0], config['overrides']['dust_temperature_limits'][1], config['overrides']['dust_temperature_step']) grid_values = parse_grid_overrides(par_name='dust_temperature', config=config) self.assertTrue(np.array_equal(expected_results, grid_values)) def test_parse_grid_overrides_log(self): config = { 'overrides': { 'dust_temperature_grid_type': 'log', 'dust_temperature_limits': [10, 200], 'dust_temperature_step': 2, } } expected_results = np.array([10, 20, 40, 80, 160]) grid_values = parse_grid_overrides(par_name='dust_temperature', config=config) self.assertTrue(np.array_equal(expected_results, grid_values.astype(int))) etl/tests/test_mdl_prepare_radmc_command.py 0 → 100644 +37 −0 Original line number Diff line number Diff line from mdl.mdl_prepare_radmc_command import (get_command_options, check_config) from unittest import TestCase class Test(TestCase): def test_get_command_options(self): config = { 'radmc': { 'inclination': 30, 'position_angle': 45, 'imolspec': 1, 'iline': 3 } } options_set = get_command_options(config=config) expected_result = { 'incl 30', 'phi 45', 'imolspec 1', 'iline 3' } self.assertSetEqual(options_set, expected_result) def test_check_config_pass(self): config = { 'inclination': 0, 'position_angle': 0 } self.assertTrue(check_config(config)) def test_check_config_fail(self): config = { 'inclination': 0, 'imolspec': 1 } self.assertFalse(check_config(config)) Loading
etl/assets/commons/__init__.py +16 −2 Original line number Diff line number Diff line Loading @@ -35,6 +35,12 @@ def setup_logger(name: str, def validate_parameter(param_to_validate, default): """ Substitute default value if the parameter is set to None :param param_to_validate: input to validate :param default: default value :return: default value if parameter is set to None, else the passed value """ return param_to_validate if param_to_validate is not None else default Loading @@ -57,6 +63,13 @@ def load_config_file(config_file_path: str, def parse_grid_overrides(par_name: str, config: dict) -> np.array: """ Parse the global configuration for constructing the grid, computing the parameter values for which the grid has to be computed. :param par_name: parameter to parse :param config: configuration dictionary to extract the grid properties :return: the array of values to be considered in the grid """ config_overrides = config['overrides'] if config_overrides[f'{par_name}_grid_type'] == 'linear': grid_values = np.arange(float(config_overrides[f'{par_name}_limits'][0]), Loading Loading @@ -184,7 +197,8 @@ def get_grid_edges(grid_metadata: dict) -> np.array: indices = np.arange(grid_metadata['grid_shape'][axis_idx] + 1) - grid_metadata['grid_refpix'][axis_idx] - 0.5 # valid for regular grid grid_edges.append(compute_cartesian_coordinate_grid(indices=indices, physical_px_size=grid_metadata['physical_px_size'][axis_idx])) physical_px_size=grid_metadata['physical_px_size'][ axis_idx])) # Transposed for consistent flattening return np.array(grid_edges).T Loading
etl/assets/constants/__init__.py +10 −0 Original line number Diff line number Diff line Loading @@ -46,3 +46,13 @@ radmc_lines_mode_mapping = { 'lvg': 3, 'optically_thin_non_lte': 4, } radmc_options_mapping = { 'inclination': 'incl', 'position_angle': 'phi', 'imolspec': 'imolspec', 'iline': 'iline', 'width_kms': 'widthkms', 'nchannels': 'linenlam', 'npix': 'npix' }
etl/mdl/mdl_prepare_radmc_command.py +32 −3 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ from typing import Union from astropy import units as u from assets.commons import (load_config_file, convert_frequency_to_wavelength) from assets.constants import radmc_options_mapping def main(override_config: Union[dict, None] = None): Loading @@ -11,11 +12,39 @@ def main(override_config: Union[dict, None] = None): central_frequency = convert_frequency_to_wavelength( frequency=float(config['radmc']['central_frequency']) * u.Unit(config['radmc']['frequency_units']), output_units=u.Unit("micron")) assert check_config(config=config) with open(os.path.join('mdl', 'radmc3d_postprocessing.sh'), 'w') as outfile: outfile.write('cd mdl/radmc_files\n') outfile.write(f'radmc3d image incl {config["radmc"]["inclination"]} phi {config["radmc"]["position_angle"]}' f' iline {config["radmc"]["iline"]} widthkms {config["radmc"]["width_kms"]} ' f'linenlam {config["radmc"]["nchannels"]} npix {config["radmc"]["npix"]}') options_set = get_command_options(config) outfile.write(f'radmc3d image {" ".join(options_set)}') def check_config(config: dict) -> bool: """ Check if all mandatory keys are present in the configuration dictionary. :param config: the configuration dictionary :return: True is all keys are present, False otherwise """ mandatory_keys = { 'inclination', 'position_angle', } return set(mandatory_keys).difference(set(config.keys())) == set() def get_command_options(config: dict) -> set: """ Parse the radmc3d command options from the configuration dictionary :param config: the configuration dictionary :return: a set of string to postpone to the radmc3d image command """ options_list = [] for key in config["radmc"]: try: options_list.append(f'{radmc_options_mapping[key]} {config["radmc"][key]}') except KeyError: pass return set(options_list) if __name__ == '__main__': Loading
etl/tests/test_commons.py +47 −1 Original line number Diff line number Diff line Loading @@ -7,7 +7,11 @@ from assets.commons import (compute_power_law_radial_profile, get_grid_edges, extract_grid_metadata, get_physical_px_size, compute_cartesian_coordinate_grid, get_distance_matrix, get_centered_indices) compute_cartesian_coordinate_grid, get_distance_matrix, get_centered_indices, validate_parameter, parse_grid_overrides) from unittest import TestCase Loading Loading @@ -173,3 +177,45 @@ class Test(TestCase): [-1, 0, 1]]] indices = get_centered_indices(grid_metadata=grid_metadata) self.assertTrue(np.array_equal(np.array(expected_indices), indices)) def test_validate_parameter_none(self): parameter = None default = 10 result = validate_parameter(param_to_validate=parameter, default=default) self.assertEqual(default, result) def test_validate_parameter(self): parameter = 100 default = 10 result = validate_parameter(param_to_validate=parameter, default=default) self.assertEqual(parameter, result) def test_parse_grid_overrides_linear(self): config = { 'overrides': { 'dust_temperature_grid_type': 'linear', 'dust_temperature_limits': [10, 30], 'dust_temperature_step': 1, } } expected_results = np.arange(config['overrides']['dust_temperature_limits'][0], config['overrides']['dust_temperature_limits'][1], config['overrides']['dust_temperature_step']) grid_values = parse_grid_overrides(par_name='dust_temperature', config=config) self.assertTrue(np.array_equal(expected_results, grid_values)) def test_parse_grid_overrides_log(self): config = { 'overrides': { 'dust_temperature_grid_type': 'log', 'dust_temperature_limits': [10, 200], 'dust_temperature_step': 2, } } expected_results = np.array([10, 20, 40, 80, 160]) grid_values = parse_grid_overrides(par_name='dust_temperature', config=config) self.assertTrue(np.array_equal(expected_results, grid_values.astype(int)))
etl/tests/test_mdl_prepare_radmc_command.py 0 → 100644 +37 −0 Original line number Diff line number Diff line from mdl.mdl_prepare_radmc_command import (get_command_options, check_config) from unittest import TestCase class Test(TestCase): def test_get_command_options(self): config = { 'radmc': { 'inclination': 30, 'position_angle': 45, 'imolspec': 1, 'iline': 3 } } options_set = get_command_options(config=config) expected_result = { 'incl 30', 'phi 45', 'imolspec 1', 'iline 3' } self.assertSetEqual(options_set, expected_result) def test_check_config_pass(self): config = { 'inclination': 0, 'position_angle': 0 } self.assertTrue(check_config(config)) def test_check_config_fail(self): config = { 'inclination': 0, 'imolspec': 1 } self.assertFalse(check_config(config))