Source code for majis.opl.reader
"""OPL generic reader module."""
import csv
from pathlib import Path
from planetary_coverage.events import EventsDict, EventsList, EventWindow
from ..itl.reader import read_itl_json
from ..misc.events import flatten, group
[docs]
def read_opl(
fname: str | Path,
flat: bool = False,
only: str | list | bool | None = 'MAJIS',
validation: bool = True,
) -> EventsDict | EventsList:
"""Read OPL file.
Both, CSV (``.csv``) and JSON (``.json``) format are supported.
The result can be return as a nested dict of events (default) or
as a flat list of events.
By default only the MAJIS events will be reported.
This can be changed by providing an other instrument filter key,
a list of keys or an explicit ``'ALL'``, False or None value.
Applicable only to JSON OPL.
"""
f = Path(fname)
match f.suffix.lower():
case '.csv':
events = read_opl_csv(f)
case '.json':
events = read_opl_json(f, only=only, validation=validation)
case _:
raise ValueError(f'Invalid OPL file input: {fname}')
return flatten(events) if flat else group(events)
[docs]
def read_opl_csv(fname: str | Path) -> list[EventWindow]:
"""Read OPL file in CSV format."""
with Path(fname).open(encoding='utf-8') as content:
return [EventWindow(**parse_opl_csv(*params)) for params in csv.reader(content)]
[docs]
def parse_opl_csv(key, start, end, obs_key, instrument) -> dict:
"""OPL CSV line parser.
Warning
-------
Currently the OPL CSV don't have an explicit header.
Here we assume that the header is as follow"
# key, start, end, obs_key, instrument
The initial ``key`` is composed of the following parameters:
<instrument>_<observation_type>_<type>
"""
_, observation_type, _type = key.split('_')
return {
'key': key,
't_start': start,
't_end': end,
'OBS_KEY': obs_key,
'INSTRUMENT': instrument,
'OBSERVATION_TYPE': observation_type,
'TYPE': _type,
}
[docs]
def read_opl_json(
fname: str | Path,
only: str | list | bool | None = 'MAJIS',
validation: bool = True,
) -> list[EventWindow]:
"""Read OPL file in JSON format.
Note
----
Re-use ITL JSON reader with OPL schema instead.
By default only the MAJIS events will be reported.
This can be changed by providing an other instrument filter key,
a list of keys or an explicit ``'ALL'``, False or None value.
"""
return read_itl_json(fname, fmt='OPL', only=only, validation=validation)