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 ...schema import MAJIS_SCHEMAS
from .mapping import JSON_MAPPING
[docs]
def read_itl_json(fname: str | Path, fmt='ITL') -> list[EventWindow]:
"""Read ITL file in JSON format.
ITL are validated against Juice SOC and Majis schema.
"""
content = json.loads(Path(fname).read_text())
for schema in MAJIS_SCHEMAS[fmt]:
schema.validate(content)
# Check filename match the one in the file
filename = Path(content['header']['filename'])
if not filename or filename.name != Path(fname).name:
raise FileNotFoundError(filename)
# Set default values
defaults = {
fmt: Path(filename),
}
return [
EventWindow(
obs['name'],
parse_json(obs, defaults=defaults),
)
for obs in content['timeline']
# Filter only Majis observations
if obs['instrument'] == 'MAJIS'
]
[docs]
def parse_json(obs: dict, defaults: dict | None = None) -> dict:
"""Map ITL JSON timeline keys to EPS event dictionary."""
# Extract parameters if present
params = obs.pop('parameters') if 'parameters' in obs else {}
# Convert JSON keys to EPS keys
content = {
JSON_MAPPING.get(key, key.upper()): value for key, value in (obs | params).items()
}
# Add extra keys
if 'OBSERVATION_TYPE' in content:
content['PRIME'] = content['OBSERVATION_TYPE'] == 'PRIME'
# Add default keys if not already present
if defaults:
for key, value in defaults.items():
if key.upper() not in content:
content[key.upper()] = value
# Put comments last if present
content['COMMENTS'] = content.pop('COMMENTS') if 'COMMENTS' in content else ''
return content