# Licensed under a MIT license - see LICENSE
"""MUSE-PHANGS pipeline wrapper
initialisation of folders
"""
__authors__ = "Eric Emsellem"
__copyright__ = "(c) 2017, ESO + CRAL"
__license__ = "MIT"
__contact__ = " <eric.emsellem@eso.org>"
# Standard modules
import os
from os.path import join as joinpath
import re
import copy
from . import util_pipe as upipe
from .util_pipe import get_dataset_name
from .config_pipe import (dict_user_folders, default_rc_filename,
dict_extra_filters, dict_calib_tables, dict_input_folders,
dict_folders, dict_folders_target,
default_str_dataset, default_ndigits)
############################################################
# Some fixed parameters for the structure
############################################################
[docs]def add_suffix_tokeys(dic, suffix="_folder") :
newdic = {}
for key in dic:
setattr(newdic, key + suffix, dic[key])
############################################################
# Main class InitMuseParameters
############################################################
[docs]class InitMuseParameters(object) :
def __init__(self, folder_config="Config/",
rc_filename=None, cal_filename=None,
verbose=True, **kwargs) :
"""Define the default parameters (folders/calibration files)
and name suffixes for the MUSE data reduction
Parameters
----------
folder_config: str
Name of the input folder for the configurations files
rc_filename: str
Name of the configuration file
including root input folder names
cal_filename: str
Name of the configuration file including
the calibration input folders
verbose: bool [True]
"""
self.verbose = verbose
# Will first test if there is an rc_file provided
# If not, it will look for a default rc_filename, the name of which is provided
# above. If not, the hardcoded default will be used.
# First adding the suffix to the dictionaries
# attributing the dictionaries
self._dict_folders = dict_folders
self._dict_input_folders = dict_input_folders
self._dict_folders_target = dict_folders_target
self._dict_extra_filters = dict_extra_filters
if rc_filename is None :
if not os.path.isfile(default_rc_filename):
upipe.print_warning(f"No filename or {default_rc_filename} file "
"to initialise from. We will use the default hardcoded "
"in the config_pipe.py module")
self.init_default_param(dict_user_folders)
else :
self.read_param_file(default_rc_filename, dict_user_folders)
self.rcfile = "default_values"
else :
rcfile = joinpath(folder_config, rc_filename)
self.read_param_file(rcfile, dict_user_folders)
self.rcfile = rcfile
# Initialisation of fixed attributes for the structure
self.init_default_param(dict_folders)
self.init_default_param(dict_input_folders)
# Same happens with the calibration files.
# If filename is provided, will use that, otherwise use the hard coded values.
if cal_filename is None :
self.init_default_param(dict_calib_tables)
self.calfile = "default_values"
else :
calfile = joinpath(folder_config, cal_filename)
self.read_param_file(calfile, dict_calib_tables)
self.calfile = calfile
[docs] def init_default_param(self, dict_param) :
"""Initialise the parameters as defined in the input dictionary
Hardcoded in config_pipe.py
Input
-----
dict_param: dict
Input dictionary defining the attributes
"""
for key in dict_param:
upipe.print_info(f"Default initialisation of attribute {key}",
pipe=self)
setattr(self, key, dict_param[key])
[docs] def read_param_file(self, filename, dict_param) :
"""Reading an input parameter initialisation file
"""
# Testing existence of filename
if not os.path.isfile(filename) :
upipe.print_error((f"Input parameter {filename} cannot be found. "
"We will use the default hardcoded in the "
"config_pipe.py module"))
# Now relying on the default file but first checking it's there
if not os.path.isfile(default_rc_filename):
upipe.print_error(f"Default rc file as defined in config_pipe.py "
f"could not be found ({default_rc_filename}).")
return
else:
filename = default_rc_filename
# If it exists, open and read it
f_param = open(filename)
lines = f_param.readlines()
# Dummy dictionary to see which items are not initialised
noninit_dict_param = copy.copy(dict_param)
for line in lines:
if line[0] in ["#", "%"]: continue
sline = re.split(r'(\s+)', line)
keyword_name = sline[0]
keyword = ("".join(sline[2:])).rstrip()
if keyword_name in dict_param:
upipe.print_info("Initialisation of attribute {0}".format(keyword_name),
pipe=self)
setattr(self, keyword_name, keyword)
# Here we drop the item which was initialised
val = noninit_dict_param.pop(keyword_name)
else:
continue
# Listing them as warning and using the hardcoded default
for key in noninit_dict_param:
upipe.print_warning(("Parameter {param} not initialised "
"We will use the default hardcoded value from "
"config_pipe.py").format(param=key))
setattr(self, key, dict_param[key])
def _get_dataset_name(self, dataset=None):
"""Reporting the _get_dataset_name from the InitMuseParam
class
dataset : int
dataset number. Default is None.
"""
if dataset is None:
if hasattr(self, "dataset"):
dataset = self.dataset
else:
upipe.print_error("No dataset number provided")
return "NONAME"
return get_dataset_name(dataset, self.str_dataset, self.ndigits)