Commit d39fa5d8 authored by Andrea Giannetti's avatar Andrea Giannetti
Browse files

Added missing docstrings and tests; refactored mdl_prepare_radmc_command.py.

parent 5c9cf762
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -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


@@ -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]),
@@ -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

+10 −0
Original line number Diff line number Diff line
@@ -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'
}
+32 −3
Original line number Diff line number Diff line
@@ -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):
@@ -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__':
+47 −1
Original line number Diff line number Diff line
@@ -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


@@ -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)))
+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))