From ac57bcaf38cb5c83c204519cde8b8367de4702d2 Mon Sep 17 00:00:00 2001 From: Bruce Flynn <brucef@ssec.wisc.edu> Date: Thu, 7 Jan 2016 03:33:14 +0000 Subject: [PATCH] viirs_scan_bytes: aggregate RDRs --- scripts/viirs_scan_bytes.py | 105 ++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 33 deletions(-) diff --git a/scripts/viirs_scan_bytes.py b/scripts/viirs_scan_bytes.py index 5ee9a8d..09c51c2 100755 --- a/scripts/viirs_scan_bytes.py +++ b/scripts/viirs_scan_bytes.py @@ -1,14 +1,51 @@ -#!/usr/bin/env python +#!/home/brucef/code/PeateScience/local/dist/edosl0/0.1/env/bin/python """ Write a NetCDF file containing size in bytes of VIIRS scans. """ import os -import numpy as np +from collections import defaultdict +from datetime import datetime + import netCDF4 +import numpy as np from edosl0util import jpssrdr +from grain import grain + + +band_map = { + 800: 'M5', + 801: 'M4', + 802: 'M3', + 803: 'M2', + 804: 'M1', + 805: 'M6', + 806: 'M7', + 807: 'M9', + 808: 'M10', + 809: 'M8', + 810: 'M11', + 811: 'M13', + 812: 'M12', + 813: 'I4', + 814: 'M16', + 815: 'M15', + 816: 'M14', + 817: 'I5', + 818: 'I1', + 819: 'I2', + 820: 'I3', + 821: 'DNB', + 825: 'CAL', + 826: 'ENGR'} +apids = sorted(band_map.keys()) + +def utc2tai(val): + dt = datetime.strptime(val, '%Y-%m-%d %H:%M:%S') + return grain.Grain().utc2tai(dt, grain.VIIRS_EPOCH) * 10**2 -def write_netcdf_file(destpath, scans, apids, sizes): + +def write_netcdf_file(destpath, scans, sizes): dataset = netCDF4.Dataset(destpath, 'w') dataset.bands = """Band APID Day ============== @@ -38,56 +75,58 @@ I5 817 DNB 821 CAL 825 ENGR 826""" - dataset.createDimension('scan', size=len(scans)) + dataset.createDimension('scan_time', None) dataset.createDimension('apid', size=len(apids)) - dataset.createVariable('time', 'u8', ('scan',)) - dataset.createVariable('size', 'i4', ('apid', 'scan',), fill_value=-999) + dataset.createVariable('time', 'u8', ('scan_time',)) + dataset.createVariable('size', 'i4', ('apid', 'scan_time',), fill_value=-999) dataset.createVariable('apid', 'u2', ('apid',)) dataset['time'][:] = np.array(list(scans)) - dataset['time'].description = 'Scan start time (IET)' dataset['apid'][:] = np.array(list(apids)) - - # FIXME: Is there a more numpyish way to do this? - dat = np.ones((len(apids), len(scans))) * -999 - for sidx, scan in enumerate(scans): - for aidx, apid in enumerate(apids): - key = (apid, scan) - if key in sizes: - dat[aidx,sidx] = sizes[key] - dataset['size'][:] = dat + dataset['size'][:] = sizes dataset.close() -def read_data_from_rdr(filepath): +def read_data_from_rdr(filepath, start, end): # XXX: just get the VIIRS Science RDR for now rdr = jpssrdr.rdr_datasets(filepath)['science'][0] - scans = set() - apids = set() - dat = {} + dat = defaultdict(lambda: 0) + times = set() for tracker, packet in rdr.packets(): apid = packet.apid - scan = tracker.obs_time + time = tracker.obs_time size = tracker.size - key = (apid, scan) - if key in dat: - dat[key] += size - else: - dat[key] = size + # skip data outside requested window + if end < time < start: + continue # skip data outside window + + key = (apid, time) + dat[key] += size - scans.add(scan) - apids.add(apid) + times.add(time) - return scans, apids, dat + return times, apids, dat if __name__ == '__main__': import argparse parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument('viirs_rdr') + parser.add_argument('start', type=utc2tai) + parser.add_argument('end', type=utc2tai) + parser.add_argument('rdrs', nargs='+') args = parser.parse_args() - destpath = os.path.basename(args.viirs_rdr) + '.size.nc' - scans, apids, dat = read_data_from_rdr(args.viirs_rdr) - write_netcdf_file(destpath, scans, apids, dat) + + scan_times = set() + sizes = np.ones((len(apids), 86400 / 1.7864)) * float('nan') + for filepath in args.rdrs: + print "reading", filepath + times, _, dat = read_data_from_rdr(filepath, args.start, args.end) + for tidx, time in enumerate(times): + for aidx, apid in enumerate(apids): + sizes[aidx][tidx] = dat[apid, time] + + destpath = os.path.basename(args.rdrs[0]) + '.scanbytes.nc' + print "writing", destpath + write_netcdf_file(destpath, scan_times, sizes) -- GitLab