Source code for majis.itl.json.reader
"""Majis ITL in JSON format sub-module."""
import json
from pathlib import Path
from planetary_coverage.events import EventWindow
from .mapping import JSON_MAPPING
from .schema import MAJIS_ITL_SCHEMAS
[docs]
def read_itl_json(fname: str | Path) -> list[EventWindow]:
"""Read ITL file in JSON format.
ITL are validated against Juice SOC and Majis schema.
"""
data = json.loads(Path(fname).read_text())
for schema in MAJIS_ITL_SCHEMAS:
schema.validate(data)
# Check filename match the one in the file
filename = Path(data['header']['filename'])
if not filename or filename.name != fname.name:
raise FileNotFoundError(filename)
# Set default values
defaults = {
'ITL': Path(filename),
'COMMENTS': '',
}
return [
EventWindow(
obs['name'],
_parse_json(obs, defaults=defaults),
)
for obs in data['timeline']
# Filter only Majis observations
if obs['instrument'] == 'MAJIS'
]
def _parse_json(obs: dict, defaults: dict | None = None) -> dict:
"""Map ITL JSON to timeline keys."""
# Extract parameters
params = obs.pop('parameters')
# Convert JSON keys to EPS keys
content = {
JSON_MAPPING.get(key, key.upper()): value for key, value in (obs | params).items()
}
# Add extra keys
content['PRIME'] = content.get('OBSERVATION_TYPE') == 'PRIME'
# Add default keys (if not present)
for key, value in defaults.items():
if key not in content:
content[key] = value
# Put the comments at the end (always present from defaults)
content['COMMENTS'] = content.pop('COMMENTS')
return content