Skip to content
Snippets Groups Projects
rdr2l0.py 4.18 KiB
"""
Create a NASA Level0 PDS file from a set of NOAA IDPS RDR files. The output
PDS file will have packets sorted by time and apid. Any packets marked in
the RDR PacketTracker as containing fill are removed.
"""
from edosl0util.jpssrdr import cris_hsk, cris_dwell, atms_dwell, atms_sci, viirs_sci, spacecraft, \
    cris_sci, atms_hsk

__copyright__ = "Copyright (C) 2015 University of Wisconsin SSEC. All rights reserved."

import os
import glob
import logging
from datetime import datetime, timedelta

from edosl0util.cli import util

LOG = logging


def remove_files(files):
    [os.remove(f) for f in files]


def main():
    # XXX: This currently uses standard CCSDS packet merging that does not have
    #      any context regarding fill packets. In the future if it is desired to
    #      keep fill packets a new RDR specific merge will be required.
    parser = util.default_parser()
    parser.description = __doc__
    parser.add_argument('--leave-pkts', action='store_true',
                        help='Do not delete intermediate .pkts files')
    parser.add_argument(
        '-S', '--satellite', choices=['snpp', 'j01'], default='snpp',
        help='Satellite used to set SCID')

    def timestamp(v):
        return datetime.strptime(v, '%Y-%m-%d %H:%M:%S')

    parser.add_argument(
        '-s', '--start', type=timestamp, required=True,
        help=('File start time. Data before this time will be dropped. This '
              'time also determines the creation time in the filename. Format '
              'is YYYY-mm-dd HH:MM:SS.'),
    )
    parser.add_argument(
        '-e', '--end', nargs='?', type=timestamp,
        help=('File end time. Data after this time will be dropped. If omitted '
              'end will default to start + 2 hours. Format '
              'is YYYY-mm-dd HH:MM:SS.'),
    )
    subs = parser.add_subparsers(title='Destination level 0 data type sub-commands')

    def cmd_cris_hsk(args):
        cris_hsk(args.satellite, args.rcrit, args.start, args.end)

    subp = subs.add_parser('CRISHSK')
    subp.add_argument('rcrit', nargs='+')
    subp.set_defaults(func=cmd_cris_hsk)

    def cmd_cris_dwell(args):
        return cris_dwell(args.satellite, args.rdrs, args.start, args.end)

    subp = subs.add_parser('CRISDWELL')
    subp.add_argument(
        'rdrs', nargs='+',
        help=('RCRIH, RCRIM, and RCRII files. The same number of each is '
              'required to produce a valid L0 file.'))
    subp.set_defaults(func=cmd_cris_dwell)

    def cmd_cris_sci(args):
        return cris_sci(args.satellite, args.rcris, args.start, args.end)

    subp = subs.add_parser('CRISSCIENCE')
    subp.add_argument('rcris', nargs='+')
    subp.set_defaults(func=cmd_cris_sci)

    def cmd_atms_hsk(args):
        return atms_hsk(args.satellite, args.ratmt, args.start, args.end)

    subp = subs.add_parser('ATMSHSK')
    subp.add_argument('ratmt', nargs='+')
    subp.set_defaults(func=cmd_atms_hsk)

    def cmd_atms_dwell(args):
        return atms_dwell(args.satellite, args.rdrs, args.start, args.end)

    subp = subs.add_parser('ATMSDWELL')
    subp.add_argument(
        'rdrs', nargs='+',
        help=('RATMW and RATMM files. The same number of each is required '
              'to produce a valid L0 file.'))
    subp.set_defaults(func=cmd_atms_dwell)

    def cmd_atms_sci(args):
        return atms_sci(args.satellite, args.ratms, args.start, args.end)

    subp = subs.add_parser('ATMSSCIENCE')
    subp.add_argument('ratms', nargs='+')
    subp.set_defaults(func=cmd_atms_sci)

    def cmd_viirs_sci(args):
        return viirs_sci(args.satellite, args.rvirs, args.start, args.end)

    subp = subs.add_parser('VIIRSSCIENCE')
    subp.add_argument('rvirs', nargs='+')
    subp.set_defaults(func=cmd_viirs_sci)

    def cmd_spacecraft(args):
        return spacecraft(args.satellite, args.rnsca, args.start, args.end)

    subp = subs.add_parser('SPACECRAFT')
    subp.add_argument('rnsca', nargs='+')
    subp.set_defaults(func=cmd_spacecraft)

    args = parser.parse_args()

    if not args.end:
        args.end = args.start + timedelta(hours=2)

    util.configure_logging(args)

    args.func(args)
    if not args.leave_pkts:
        remove_files(glob.glob('*.pkts'))


if __name__ == '__main__':
    main()