Source code for pyspex.gen_l1a.cli

#!/usr/bin/env python3
#
# This file is part of pyspex
#
# https://github.com/rmvanhees/pyspex.git
#
# Copyright (c) 2022-2023 SRON - Netherlands Institute for Space Research
#    All Rights Reserved
#
# License:  BSD-3-Clause
"""Command-line implementation of spx1_level01a."""
from __future__ import annotations

import logging
import warnings

from pyspex.argparse_gen_l1a import argparse_gen_l1a
from pyspex.lib.check_input_files import check_input_files
from pyspex.lib.logger import start_logger
from pyspex.lv0_lib import CorruptPacketWarning
from pyspex.tlm import SPXtlm


[docs] def main() -> int: """Execute the main bit of the application.""" error_code = 0 warn_code = 0 # initialize logger start_logger() logging.captureWarnings(True) # parse command-line parameters and YAML file for settings config = argparse_gen_l1a() logging.getLogger().setLevel(config.verbose) # first, set the root logger logger = logging.getLogger('pyspex.gen_l1a') # then initiate a descendant logger.debug('%s', config) # check input files (SEPXone level-0) try: check_input_files(config) except FileNotFoundError as exc: logger.fatal('File "%s" not found on system.', exc) return 110 except TypeError as exc: logger.fatal('%s', exc) return 121 # read level 0 data # Note that we read as much as possible packages from a file, but stop at # the first occurence of a corrupted data-packet, then the remainder of # the file is neglected. tlm = None with warnings.catch_warnings(record=True) as wrec_list: warnings.simplefilter('always', category=CorruptPacketWarning) try: tlm = SPXtlm() tlm.from_lv0(config.l0_list, file_format=config.l0_format, debug=config.debug, dump=config.dump) except FileNotFoundError as exc: logger.fatal('FileNotFoundError exception raised for "%s".', exc) error_code = 110 except TypeError as exc: logger.fatal('TypeError exception raised with "%s".', exc) error_code = 121 for wrec in wrec_list: logger.warning('CorruptPacketWarning raised with "%s".', str(wrec.message)) warn_code = 122 if error_code != 0 or config.debug or config.dump: return error_code # Write Level-1A product. if not config.outdir.is_dir(): config.outdir.mkdir(mode=0o755, parents=True) try: if config.eclipse is None: tlm.gen_l1a(config, 'all') elif config.eclipse: tlm.gen_l1a(config, 'binned') tlm.gen_l1a(config, 'full') else: tlm.gen_l1a(config, 'binned') except (KeyError, RuntimeError) as exc: logger.fatal('RuntimeError with "%s"', exc) error_code = 131 except UserWarning as exc: logger.warning('navigation data is incomplete: "%s".', exc) error_code = 132 except Exception as exc: # raise RuntimeError from exc logger.fatal('Unexpected exception occurred with "%s".', exc) error_code = 135 return warn_code if error_code == 0 else error_code
if __name__ == '__main__': main()