Source code for aces.obsplan.config

import os
import pkg_resources
import logging
from math import pi
from typing import Union

from askap.footprint import FootprintFactory, Footprint
from aces.askapdata.schedblock import SchedulingBlock

[docs]logger = logging.getLogger(__name__)
[docs]class ACESConfig(object): def __init__(self, clear_footprint_cache=False): """ Read aces config parset or create it if it doesn't exist :return: aces config parset :rtype: :class:ParameterSet """ # Since python 3.7 the insertion order of dicts is guaranteed to be preserved self.footprint_caches = { 'askap': 'ak', 'askap-commissioning': 'co', 'effelsberg': 'ef', 'jodrell': 'jb', 'legacy': 'old', 'sandbox': 'xx' } self.footprint_cache_root = pkg_resources.resource_filename("aces", "data/footprints") logger.debug(f"Loading footprint defs from {self.footprint_cache_root=}") first_cache, first_prefix = next(iter(self.footprint_caches.items())) self.footprint_factory = FootprintFactory(os.path.join(self.footprint_cache_root, first_cache), first_prefix) for cache, prefix in self.footprint_caches.items(): if cache != first_cache: self.footprint_factory.add_parset_folder(os.path.join(self.footprint_cache_root, cache), prefix)
[docs]def get_footprint(sb: Union[int,SchedulingBlock]) -> Footprint: """Obtain the footprint layout for a given observation Args: sb (Union[int,SchedulingBlock]): Information of the schedule block that corresponds to an observation. If int, an instance of SchedularBlock is created. Returns: Footprint: A layout of the footprint of an observation """ if isinstance(sb, int): sb = SchedulingBlock(sb) aces_cfg = ACESConfig() fp_factory = aces_cfg.footprint_factory name = sb.get_footprint_name() pitch = sb.get_footprint_pitch() # Catch the single mset_inx footprint, which may have zero pitch, disallowed by the footprint factory. if pitch == 0.0: pitch = 1.0 rotation = sb.get_footprint_rotation() fp = fp_factory.make_footprint('ak:' + name, pitch * pi / 180, rotation * pi / 180) return fp
[docs]def get_footprint_pa_zero(name: str, pitch: float) -> Footprint: """Returns a footprint instance based on a footprint name, with a user provided pitch angle. No care or facility is given to tie it to a particular schedule block / SBID. Args: name (str): Name of the footprint to use pitch (float): Rotation of the PAF (in degrees) Returns: Footprint: Instance of PAF footprint layout """ aces_cfg = ACESConfig() fp_factory = aces_cfg.footprint_factory # Catch the single beam footprint, which may have zero pitch, disallowed by the footprint factory. if pitch == 0.0: pitch = 1.0 fp = fp_factory.make_footprint('ak:' + name, pitch * pi / 180, 0.0) return fp