Source code for planetary_coverage.esa.metakernel

"""ESA metakernel module."""

import re
from collections import UserDict

from .api import get_mk, get_tag
from ..misc import cached_property


TWO_ELEMENTS = 2
THREE_ELEMENTS = 3


[docs] class EsaMetakernels: """ESA mission metakernels. Parameters ---------- mission: str Name of the mission. doi: str, optional DOI of the dataset. sc_alias: str """ def __init__(self, mission, doi=None, alias=None): self.mission = mission self.doi = doi self.alias = ( alias if isinstance(alias, (list, tuple)) else [alias] if alias else [] ) def __str__(self): return ' / '.join([self.mission] + list(self.alias)) def __repr__(self): s = f'<{self.__class__.__name__}> mission: {self} ' if self.doi: s += f'(doi:{self.doi}) ' s += f'| latest version: {self.latest} | ' n = len(self) if n == 0: s += 'No metakernel is available.' else: s += '\n - '.join([f'{n} metakernel{"s" if n > 1 else ""}:', *self.mks]) return s def __len__(self): return len(self.mks) def __iter__(self): return iter(self.mks) def __contains__(self, other): return other in self.mks def __getitem__(self, item): """Get a single metakernel for the latest or a specific version.""" version = None if isinstance(item, tuple) and len(item) == TWO_ELEMENTS: mk, version = item elif isinstance(item, (int, float, str)): mk = item else: raise KeyError( 'You need to provide a `mk` key (with an optional `version` key).' ) # SKD VERSION suffix pattern if match := re.findall(r'(.*)_([vV]\d{3}_\d{8}_\d{3})(?:\.(?:tm|TM))?$', str(mk)): mk, version = match[0] # Use 'latest' version if not provided if version is None: version = self.latest return get_mk(self.mission, mk=str(mk), version=version.lower()) @cached_property def latest(self) -> str: """Latest version.""" return get_tag(self.mission, version='latest') @property def versions(self) -> list: """Get all the releases available for a given mission.""" return get_tag(self.mission, version='all')
[docs] def version(self, version) -> list: """List of all the metakernels for a given version.""" return get_mk(self.mission, mk='all', version=version)[::-1]
@cached_property def mks(self) -> list: """List of all the latest metakernels.""" return self.version(self.latest)
[docs] class EsaMetakernelsCollection(UserDict): """ESA metakernels collection.""" def __init__(self, *esa_kernels): self.data = {esa_kernel.mission: esa_kernel for esa_kernel in esa_kernels} self.aliases = { alias: esa_kernel.mission for esa_kernel in esa_kernels for alias in esa_kernel.alias } def __repr__(self): n = len(self.data) return '\n - '.join([ f'<{self.__class__.__name__}> {n} mission{"s" if n > 1 else ""}:', *map(str, self.values()), ]) def __contains__(self, mission): m = str(mission).upper() return m in self.data or m in self.aliases def __getitem__(self, item): if isinstance(item, tuple): if len(item) == TWO_ELEMENTS: return self[item[0]][item[1]] if len(item) == THREE_ELEMENTS: return self[item[0]][item[1], item[2]] raise KeyError(item) mission = str(item).upper() if mission in self.data: return self.data[mission] if mission in self.aliases: return self.data[self.aliases[mission]] raise KeyError(item)
# ESA missions metakernels ESA_MK = EsaMetakernelsCollection( EsaMetakernels( 'BEPICOLOMBO', doi='10.5270/esa-dwuc9bs', alias=( 'MPO', 'BEPICOLOMBO MPO', 'MERCURY PLANETARY ORBITER', 'MTM', 'BEPICOLOMBO MTM', 'MERCURY TRANSFER MODULE', 'MMO', 'BEPICOLOMBO MMO', 'MERCURY MAGNETOSPHERIC ORBITER', ), ), EsaMetakernels('ENVISION'), EsaMetakernels('COMET-INTERCEPTOR'), EsaMetakernels( 'EXOMARS2016', doi='10.5270/esa-pwviqkg', alias=( 'TGO', 'EXOMARS 2016 TGO', 'TRACE GAS ORBITER', 'EDM', 'EXOMARS 2016 EDM', 'EDL DEMONSTRATOR MODULE', ), ), EsaMetakernels( 'EXOMARSRSP', doi='10.5270/esa-uvyv4w5', alias=( 'RM', 'EXM RSP RM', 'EXM ROVER', 'EXOMARS ROVER', 'SP', 'EXM RSP SP', 'EXM SURFACE PLATFORM', 'EXOMARS SP', 'CM', 'EXM RSP SCC', 'EXM SPACECRAFT COMPOSITE', 'EXOMARS SCC', ), ), EsaMetakernels('GAIA'), EsaMetakernels('HERA'), EsaMetakernels( 'HUYGENS', doi='10.5270/esa-ssem3np', alias=( 'CASP', 'CASSINI PROBE', 'HUYGENS PROBE', ), ), EsaMetakernels('INTEGRAL', doi='10.5270/esa-p54lhqn'), EsaMetakernels('JUICE', doi='10.5270/esa-ybmj68p'), EsaMetakernels('JWST'), # EsaMetakernels('LUNAR-GATEWAY'), # no SKD tag in the repo EsaMetakernels( 'MARS-EXPRESS', doi='10.5270/esa-trn5vp1', alias=( 'MEX', 'MARS EXPRESS', 'BEAGLE2', 'BEAGLE 2', 'BEAGLE-2', ), ), EsaMetakernels('ROSETTA', doi='10.5270/esa-tyidsbu', alias=('PHILAE',)), EsaMetakernels( 'SMART-1', doi='10.5270/esa-um8r1n0', alias=( 'S1', 'SM1', 'SMART1', ), ), EsaMetakernels( 'SOLAR-ORBITER', doi='10.5270/esa-kt1577e', alias=( 'SOLO', 'SOLAR ORBITER', ), ), EsaMetakernels( 'VENUS-EXPRESS', doi='10.5270/esa-h3zbs8s', alias=( 'VEX', 'VENUS EXPRESS', ), ), )