Commit 98736fe8 authored by Andrea Giannetti's avatar Andrea Giannetti
Browse files

Persisted moment zero and ratio parameters.

parent 8368c70a
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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


+6 −0
Original line number Diff line number Diff line
import numpy as np
from .physical_constants import mean_molecular_mass

polaris_grid_map = {
@@ -57,3 +58,8 @@ radmc_options_mapping = {
    'npix': 'npix'
}

aggregation_function_mapping = {
    'mean': np.nanmean,
    'median': np.nanmedian
}
+11 −9
Original line number Diff line number Diff line
@@ -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__':
+74 −28
Original line number Diff line number Diff line
@@ -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,
@@ -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')
@@ -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'))
@@ -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'))
@@ -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,
@@ -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__':
+2 −1
Original line number Diff line number Diff line
@@ -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