"""
photometric_system.py
====================================
Module for the management of photometric systems.
"""
from configparser import ConfigParser
from os import remove
from os.path import exists
from aenum import Enum
from gaiaxpy.core.generic_functions import _get_built_in_systems, _is_built_in_system
from .config import _CFG_FILE_PATH, create_config, get_additional_filters_names, contains_filter_key
from .regular_photometric_system import RegularPhotometricSystem
from .standardised_photometric_system import StandardisedPhotometricSystem
from .utils import get_yes_no_answer
[docs]
def get_available_systems():
systems_list = _get_available_systems()
return ', '.join(systems_list)
[docs]
class AutoName(Enum):
[docs]
def get_system_name(self):
return self.name
[docs]
def get_system_label(self):
return self.value.label
[docs]
def get_zero_points(self):
return self.value.zero_points
[docs]
def get_bands(self):
return self.value.bands
[docs]
def get_offsets(self):
return self.value.offsets
[docs]
def get_version(self):
return self.value.version
def _system_is_standard(system_name):
"""
Tell whether the input system is standard or not.
Args:
system_name (str): Photometric system name.
Returns:
bool: True is system is standard, false otherwise.
"""
std_substring = system_name.split('_')[-1] if _is_built_in_system(system_name) else system_name[-3:]
return std_substring.lower() == 'std'
[docs]
def create_system(name, systems_path=None):
return StandardisedPhotometricSystem(name, systems_path) if _system_is_standard(name) \
else RegularPhotometricSystem(name, systems_path)
def _get_available_systems(config_file=None):
"""
Get the available photometric systems according to the
package configuration.
Returns:
str: A string containing the names of the photometric
systems separated by spaces.
"""
built_in_systems = _get_built_in_systems()
# Try to load the configuration and see whether more systems have been defined
additional_systems = get_additional_filters_names(config_file)
return built_in_systems + additional_systems
def _get_system_tuples():
return [(s, create_system(s, None)) if _is_built_in_system(s) else (s, create_system(s, _CFG_FILE_PATH)) for s in
_get_available_systems(_CFG_FILE_PATH)]
system_tuples = _get_system_tuples()
PhotometricSystem = AutoName('PhotometricSystem', system_tuples)
PhotometricSystem.get_available_systems = get_available_systems
[docs]
def get_current_filters_path():
_config_parser = ConfigParser()
_config_parser.read(_CFG_FILE_PATH)
return _config_parser['filter']['filters_dir']
[docs]
def load_additional_systems(_systems_path=None):
"""
Load additional photometric systems.
Args:
_systems_path (str): Path to directory containing the additional filter files. If not provided, the program
will ask the user to input one.
Returns:
Enum: PhotometricSystem object corresponding to an enumeration of the updated available systems.
"""
updated_enum = __load_additional_systems(_systems_path, _CFG_FILE_PATH)
updated_enum.get_available_systems = get_available_systems
print('Systems loaded. Use PhotometricSystem.get_available_systems() to get the names of the current available'
' systems.')
return updated_enum
def __load_additional_systems(_filters_path=None, config_file=None):
"""
Load additional photometric systems. The names of these additional systems will start with the prefix 'USER.'
For example, if a system is named 'X' in the loaded file, the corresponding photometric system will be referenced
in GaiaXPy as 'USER_X', and it should be called using 'PhotometricSystem.USER_X,' where USER is not a username but
simply the string 'USER'.
Args:
_filters_path (str): Path to directory containing the additional filter files.
config_file (str): Path to configuration file where the path to the additional filter files will be stored.
"""
config_file = config_file if config_file else _CFG_FILE_PATH
if exists(config_file) and contains_filter_key(config_file):
print(f'A path for additional filters has already been defined. The current path is '
f'{get_current_filters_path()}')
get_yes_no_answer('Do you want to redefine the path? [[y]/n]: ', yes_action=create_config, no_action=None,
yes_args=_filters_path)
else:
create_config(_filters_path, config_file)
return AutoName('PhotometricSystem', _get_system_tuples())
[docs]
def remove_additional_systems():
"""
Remove previously loaded additional photometric systems. If no additional systems have been added, no changes will
be made.
Returns:
Enum: PhotometricSystem object corresponding to an enumeration of the updated available systems.
"""
if exists(_CFG_FILE_PATH):
remove(_CFG_FILE_PATH)
print('Additional systems configuration successfully removed.')
else:
print('No additional configuration exists.')
_PhotometricSystem = AutoName('PhotometricSystem', _get_system_tuples())
_PhotometricSystem.get_available_systems = get_available_systems
return _PhotometricSystem