Loading etl/assets/commons/__init__.py +6 −1 Original line number Diff line number Diff line Loading @@ -93,8 +93,13 @@ def load_config_file(config_file_path: str, with open(config_file_path) as config_file: config = yaml.load(config_file, Loader=yaml.FullLoader) for key in _override_config: if key not in config.keys(): config[key] = {} for subkey in _override_config[key]: try: config[key][subkey] = _override_config[key][subkey] except KeyError: config[key] = {subkey: _override_config[key][subkey]} return config Loading etl/assets/constants/__init__.py +6 −0 Original line number Diff line number Diff line import numpy as np from .physical_constants import mean_molecular_mass polaris_grid_map = { Loading Loading @@ -57,3 +58,8 @@ radmc_options_mapping = { 'npix': 'npix' } aggregation_function_mapping = { 'mean': np.nanmean, 'median': np.nanmedian } etl/main.py +11 −9 Original line number Diff line number Diff line Loading @@ -26,17 +26,19 @@ def build_model_grid(): } } tarfile_filename = stg_main(override_config=overrides) cube_fits = [] for line in lines: line_overrides = { 'radmc': { mdl_overrides = { 'lines': {}, 'model': { 'radmc_observation': { 'iline': line } } execute_radmc_script(grid_tarfile=tarfile_filename, override_config=line_overrides) prs_main(cube_fits1=f'td_{tdust}_nh2_{nh2}_line_{lines[0]}.fits', cube_fits2=f'td_{tdust}_nh2_{nh2}_line_{lines[1]}.fits', ratio_fits_name=f'ratio_td_{tdust}_nh2_{nh2}_lines_{lines[0]}-{lines[1]}.fits') } cube_fits.append(execute_radmc_script(grid_tarfile=tarfile_filename, override_config=mdl_overrides)) prs_main(cube_fits_list=cube_fits) if __name__ == '__main__': Loading etl/mdl/mdl_execute_radmc_command.py +74 −28 Original line number Diff line number Diff line Loading @@ -2,7 +2,10 @@ import os import sys from itertools import product from typing import Union import sqlalchemy from astropy import units as u from datetime import datetime from radmc3dPy import image from stg.stg_build_db_structure import (LinePars, SpeciesAndPartners, Loading @@ -21,6 +24,12 @@ from assets.constants import (radmc_options_mapping, def write_radmc_main_input_file(config_mdl: dict, config_lines: dict, path: Union[None, str] = None): """ Creates the main input file for RADMC, which is later used for execution :param config_mdl: the model configuration :param config_lines: te line configuration, from the STG layer :param path: the path where to put the input file """ _path = validate_parameter(path, default='.') with open(os.path.join(_path, 'radmc3d.inp'), "w") as outfile: outfile.write(f'nphot = {config_mdl["radmc_postprocessing"]["nphotons"]}\n') Loading @@ -32,6 +41,11 @@ def write_radmc_main_input_file(config_mdl: dict, def save_cube_as_fits(cube_out_name: Union[str, None] = None, cube_out_path: Union[str, None] = None): """ Convert the RADMC output to fits :param cube_out_name: outfile name :param cube_out_path: outfile path """ _cube_out_name = validate_parameter(cube_out_name, default='test_cube.fits') _cube_out_path = validate_parameter(cube_out_path, default=os.path.join('prs', 'fits', 'cubes')) imdata = image.readImage(fname=os.path.join('mdl', 'radmc_files', 'image.out')) Loading Loading @@ -75,10 +89,12 @@ def main(grid_tarfile: str, # The reason for splitting the main input file from the rest is that some parameters can be changed # independently of the grid for the modeling. The mdl hash should depend on all the mdl parameters, not a subset logger = setup_logger(name='MDL') config_lines = load_config_file(os.path.join('stg', 'config', 'config.yml'), override_config=override_config)['lines'] executed_on = datetime.now() config_stg = load_config_file(os.path.join('stg', 'config', 'config.yml'), override_config=override_config['lines']) config_lines = config_stg['lines'] config_mdl = load_config_file(os.path.join('mdl', 'config', 'config.yml'), override_config=override_config) override_config=override_config['model']) write_radmc_main_input_file(config_mdl=config_mdl, config_lines=config_lines, path=os.path.join('mdl', 'radmc_files')) Loading @@ -93,29 +109,57 @@ def main(grid_tarfile: str, os.chdir(os.path.join('mdl', 'radmc_files')) os.system(radmc_command) os.chdir(os.path.join('..', '..')) cube_filename = f'{compute_unique_hash_filename(config=config_mdl)}.fits' config_full = config_mdl.copy() config_full.update(config_stg) cube_filename = f'{compute_unique_hash_filename(config=config_full)}.fits' save_cube_as_fits(cube_out_name=cube_filename, cube_out_path=os.path.join('prs', 'fits', 'cubes')) line_pars_dict = { 'zipped_grid_name': f'{grid_tarfile}', 'lines_mode': config_lines['lines_mode'] populate_line_table(config_lines=config_lines, engine=engine, executed_on=executed_on, grid_tarfile=grid_tarfile) populate_species_and_partner_table(config_lines, engine, executed_on, grid_tarfile) populate_model_table(config_mdl, cube_filename, engine, executed_on) return cube_filename def populate_model_table(config_mdl, cube_filename, engine, executed_on): model_pars_dict = { 'fits_cube_name': cube_filename, 'nphotons': config_mdl['radmc_postprocessing']['nphotons'], 'scattering_mode_max': int(config_mdl['radmc_postprocessing']['scattering_mode_max']), 'iranfreqmode': config_mdl['radmc_postprocessing']['iranfreqmode'], 'tgas_eq_tdust': config_mdl['radmc_postprocessing']['tgas_eq_tdust'], 'inclination': config_mdl['radmc_observation']['inclination'], 'position_angle': config_mdl['radmc_observation']['position_angle'], 'imolspec': get_value_if_specified(config_mdl['radmc_observation'], 'imolspec'), 'iline': get_value_if_specified(config_mdl['radmc_observation'], 'iline'), 'width_kms': get_value_if_specified(config_mdl['radmc_observation'], 'width_kms'), 'nchannels': get_value_if_specified(config_mdl['radmc_observation'], 'nchannels'), 'npix': get_value_if_specified(config_mdl['radmc_observation'], 'npix'), 'created_on': executed_on } upsert( table_object=LinePars, row_dict=line_pars_dict, conflict_keys=[LinePars.zipped_grid_name], table_object=ModelPars, row_dict=model_pars_dict, conflict_keys=[ModelPars.fits_cube_name], engine=engine ) def populate_species_and_partner_table(config_lines, engine, executed_on, grid_tarfile): for (species, collision_partner) in product(config_lines['species_to_include'], config_lines['collision_partners']): species_partner_dict = { 'zipped_grid_name': f'{grid_tarfile}', 'species_to_include': species, 'molecular_abundance': config_lines['molecular_abundances'][species], 'collision_partner': collision_partner, 'molecular_abundance_collision_partner': config_lines['molecular_abundances'][collision_partner] 'molecular_abundance_collision_partner': config_lines['molecular_abundances'][collision_partner], 'created_on': executed_on } upsert( table_object=SpeciesAndPartners, Loading @@ -126,27 +170,29 @@ def main(grid_tarfile: str, engine=engine ) model_pars_dict = { 'fits_cube_name': cube_filename, 'nphotons': config_mdl['radmc_postprocessing']['nphotons'], 'scattering_mode_max': int(config_mdl['radmc_postprocessing']['scattering_mode_max']), 'iranfreqmode': config_mdl['radmc_postprocessing']['iranfreqmode'], 'tgas_eq_tdust': config_mdl['radmc_postprocessing']['tgas_eq_tdust'], 'inclination': config_mdl['radmc_observation']['inclination'], 'position_angle': config_mdl['radmc_observation']['position_angle'], 'imolspec': get_value_if_specified(config_mdl['radmc_observation'], 'imolspec'), 'iline': get_value_if_specified(config_mdl['radmc_observation'], 'iline'), 'width_kms': get_value_if_specified(config_mdl['radmc_observation'], 'width_kms'), 'nchannels': get_value_if_specified(config_mdl['radmc_observation'], 'nchannels'), 'npix': get_value_if_specified(config_mdl['radmc_observation'], 'npix'), def populate_line_table(config_lines: dict, engine: sqlalchemy.engine, executed_on: datetime.timestamp, grid_tarfile: str): """ Populate the lines table in the DB :param config_lines: the dictionary containing the line configuration :param engine: the SQLAlchemy engine to use :param executed_on: the timestamp of execution, to add to the record :param grid_tarfile: the grid tarfile name, to be used as key """ line_pars_dict = { 'zipped_grid_name': f'{grid_tarfile}', 'lines_mode': config_lines['lines_mode'], 'created_on': executed_on } upsert( table_object=ModelPars, row_dict=model_pars_dict, conflict_keys=[ModelPars.fits_cube_name], table_object=LinePars, row_dict=line_pars_dict, conflict_keys=[LinePars.zipped_grid_name], engine=engine ) return cube_filename if __name__ == '__main__': Loading etl/prs/config/config.yml +2 −1 Original line number Diff line number Diff line Loading @@ -2,3 +2,4 @@ flux_computation: central_frequency: 230.000 central_frequency_units: "GHz" integration_limits: "all" aggregation_function: 'mean' No newline at end of file Loading
etl/assets/commons/__init__.py +6 −1 Original line number Diff line number Diff line Loading @@ -93,8 +93,13 @@ def load_config_file(config_file_path: str, with open(config_file_path) as config_file: config = yaml.load(config_file, Loader=yaml.FullLoader) for key in _override_config: if key not in config.keys(): config[key] = {} for subkey in _override_config[key]: try: config[key][subkey] = _override_config[key][subkey] except KeyError: config[key] = {subkey: _override_config[key][subkey]} return config Loading
etl/assets/constants/__init__.py +6 −0 Original line number Diff line number Diff line import numpy as np from .physical_constants import mean_molecular_mass polaris_grid_map = { Loading Loading @@ -57,3 +58,8 @@ radmc_options_mapping = { 'npix': 'npix' } aggregation_function_mapping = { 'mean': np.nanmean, 'median': np.nanmedian }
etl/main.py +11 −9 Original line number Diff line number Diff line Loading @@ -26,17 +26,19 @@ def build_model_grid(): } } tarfile_filename = stg_main(override_config=overrides) cube_fits = [] for line in lines: line_overrides = { 'radmc': { mdl_overrides = { 'lines': {}, 'model': { 'radmc_observation': { 'iline': line } } execute_radmc_script(grid_tarfile=tarfile_filename, override_config=line_overrides) prs_main(cube_fits1=f'td_{tdust}_nh2_{nh2}_line_{lines[0]}.fits', cube_fits2=f'td_{tdust}_nh2_{nh2}_line_{lines[1]}.fits', ratio_fits_name=f'ratio_td_{tdust}_nh2_{nh2}_lines_{lines[0]}-{lines[1]}.fits') } cube_fits.append(execute_radmc_script(grid_tarfile=tarfile_filename, override_config=mdl_overrides)) prs_main(cube_fits_list=cube_fits) if __name__ == '__main__': Loading
etl/mdl/mdl_execute_radmc_command.py +74 −28 Original line number Diff line number Diff line Loading @@ -2,7 +2,10 @@ import os import sys from itertools import product from typing import Union import sqlalchemy from astropy import units as u from datetime import datetime from radmc3dPy import image from stg.stg_build_db_structure import (LinePars, SpeciesAndPartners, Loading @@ -21,6 +24,12 @@ from assets.constants import (radmc_options_mapping, def write_radmc_main_input_file(config_mdl: dict, config_lines: dict, path: Union[None, str] = None): """ Creates the main input file for RADMC, which is later used for execution :param config_mdl: the model configuration :param config_lines: te line configuration, from the STG layer :param path: the path where to put the input file """ _path = validate_parameter(path, default='.') with open(os.path.join(_path, 'radmc3d.inp'), "w") as outfile: outfile.write(f'nphot = {config_mdl["radmc_postprocessing"]["nphotons"]}\n') Loading @@ -32,6 +41,11 @@ def write_radmc_main_input_file(config_mdl: dict, def save_cube_as_fits(cube_out_name: Union[str, None] = None, cube_out_path: Union[str, None] = None): """ Convert the RADMC output to fits :param cube_out_name: outfile name :param cube_out_path: outfile path """ _cube_out_name = validate_parameter(cube_out_name, default='test_cube.fits') _cube_out_path = validate_parameter(cube_out_path, default=os.path.join('prs', 'fits', 'cubes')) imdata = image.readImage(fname=os.path.join('mdl', 'radmc_files', 'image.out')) Loading Loading @@ -75,10 +89,12 @@ def main(grid_tarfile: str, # The reason for splitting the main input file from the rest is that some parameters can be changed # independently of the grid for the modeling. The mdl hash should depend on all the mdl parameters, not a subset logger = setup_logger(name='MDL') config_lines = load_config_file(os.path.join('stg', 'config', 'config.yml'), override_config=override_config)['lines'] executed_on = datetime.now() config_stg = load_config_file(os.path.join('stg', 'config', 'config.yml'), override_config=override_config['lines']) config_lines = config_stg['lines'] config_mdl = load_config_file(os.path.join('mdl', 'config', 'config.yml'), override_config=override_config) override_config=override_config['model']) write_radmc_main_input_file(config_mdl=config_mdl, config_lines=config_lines, path=os.path.join('mdl', 'radmc_files')) Loading @@ -93,29 +109,57 @@ def main(grid_tarfile: str, os.chdir(os.path.join('mdl', 'radmc_files')) os.system(radmc_command) os.chdir(os.path.join('..', '..')) cube_filename = f'{compute_unique_hash_filename(config=config_mdl)}.fits' config_full = config_mdl.copy() config_full.update(config_stg) cube_filename = f'{compute_unique_hash_filename(config=config_full)}.fits' save_cube_as_fits(cube_out_name=cube_filename, cube_out_path=os.path.join('prs', 'fits', 'cubes')) line_pars_dict = { 'zipped_grid_name': f'{grid_tarfile}', 'lines_mode': config_lines['lines_mode'] populate_line_table(config_lines=config_lines, engine=engine, executed_on=executed_on, grid_tarfile=grid_tarfile) populate_species_and_partner_table(config_lines, engine, executed_on, grid_tarfile) populate_model_table(config_mdl, cube_filename, engine, executed_on) return cube_filename def populate_model_table(config_mdl, cube_filename, engine, executed_on): model_pars_dict = { 'fits_cube_name': cube_filename, 'nphotons': config_mdl['radmc_postprocessing']['nphotons'], 'scattering_mode_max': int(config_mdl['radmc_postprocessing']['scattering_mode_max']), 'iranfreqmode': config_mdl['radmc_postprocessing']['iranfreqmode'], 'tgas_eq_tdust': config_mdl['radmc_postprocessing']['tgas_eq_tdust'], 'inclination': config_mdl['radmc_observation']['inclination'], 'position_angle': config_mdl['radmc_observation']['position_angle'], 'imolspec': get_value_if_specified(config_mdl['radmc_observation'], 'imolspec'), 'iline': get_value_if_specified(config_mdl['radmc_observation'], 'iline'), 'width_kms': get_value_if_specified(config_mdl['radmc_observation'], 'width_kms'), 'nchannels': get_value_if_specified(config_mdl['radmc_observation'], 'nchannels'), 'npix': get_value_if_specified(config_mdl['radmc_observation'], 'npix'), 'created_on': executed_on } upsert( table_object=LinePars, row_dict=line_pars_dict, conflict_keys=[LinePars.zipped_grid_name], table_object=ModelPars, row_dict=model_pars_dict, conflict_keys=[ModelPars.fits_cube_name], engine=engine ) def populate_species_and_partner_table(config_lines, engine, executed_on, grid_tarfile): for (species, collision_partner) in product(config_lines['species_to_include'], config_lines['collision_partners']): species_partner_dict = { 'zipped_grid_name': f'{grid_tarfile}', 'species_to_include': species, 'molecular_abundance': config_lines['molecular_abundances'][species], 'collision_partner': collision_partner, 'molecular_abundance_collision_partner': config_lines['molecular_abundances'][collision_partner] 'molecular_abundance_collision_partner': config_lines['molecular_abundances'][collision_partner], 'created_on': executed_on } upsert( table_object=SpeciesAndPartners, Loading @@ -126,27 +170,29 @@ def main(grid_tarfile: str, engine=engine ) model_pars_dict = { 'fits_cube_name': cube_filename, 'nphotons': config_mdl['radmc_postprocessing']['nphotons'], 'scattering_mode_max': int(config_mdl['radmc_postprocessing']['scattering_mode_max']), 'iranfreqmode': config_mdl['radmc_postprocessing']['iranfreqmode'], 'tgas_eq_tdust': config_mdl['radmc_postprocessing']['tgas_eq_tdust'], 'inclination': config_mdl['radmc_observation']['inclination'], 'position_angle': config_mdl['radmc_observation']['position_angle'], 'imolspec': get_value_if_specified(config_mdl['radmc_observation'], 'imolspec'), 'iline': get_value_if_specified(config_mdl['radmc_observation'], 'iline'), 'width_kms': get_value_if_specified(config_mdl['radmc_observation'], 'width_kms'), 'nchannels': get_value_if_specified(config_mdl['radmc_observation'], 'nchannels'), 'npix': get_value_if_specified(config_mdl['radmc_observation'], 'npix'), def populate_line_table(config_lines: dict, engine: sqlalchemy.engine, executed_on: datetime.timestamp, grid_tarfile: str): """ Populate the lines table in the DB :param config_lines: the dictionary containing the line configuration :param engine: the SQLAlchemy engine to use :param executed_on: the timestamp of execution, to add to the record :param grid_tarfile: the grid tarfile name, to be used as key """ line_pars_dict = { 'zipped_grid_name': f'{grid_tarfile}', 'lines_mode': config_lines['lines_mode'], 'created_on': executed_on } upsert( table_object=ModelPars, row_dict=model_pars_dict, conflict_keys=[ModelPars.fits_cube_name], table_object=LinePars, row_dict=line_pars_dict, conflict_keys=[LinePars.zipped_grid_name], engine=engine ) return cube_filename if __name__ == '__main__': Loading
etl/prs/config/config.yml +2 −1 Original line number Diff line number Diff line Loading @@ -2,3 +2,4 @@ flux_computation: central_frequency: 230.000 central_frequency_units: "GHz" integration_limits: "all" aggregation_function: 'mean' No newline at end of file