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


[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) == 2: 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) == 2: return self[item[0]][item[1]] if len(item) == 3: 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', )), )