diff --git a/edosl0util/rdrgen.py b/edosl0util/rdrgen.py index 3ade43d77f92c4020a1ba7c4ee3c699d31607410..c40ec850e75bd9cc098b65a17b197dcf8fe73496 100644 --- a/edosl0util/rdrgen.py +++ b/edosl0util/rdrgen.py @@ -27,8 +27,13 @@ def packets_to_rdrs(sat, l0_files, **kwargs): build_rdr(sat, iter_pkts(l0_files), **kwargs) -def build_rdr(sat, pkt_iter, output_dir='.', aggr_level=None, diary_cushion=10000000, - attr_overrides={}): +def build_rdr(sat, pkt_iter, output_dir='.', aggr_type='idps', aggr_level=None, + diary_cushion=10000000, attr_overrides={}): + """Construct RDR file(s) from L0 packets + + Default aggregation behavior uses file boundaries computed in the same way + as for IDPS assuming the default aggregation level depending on the instrument + (e.g. 85 sec for VIIRS, 8 min for CrIS). # divy packets up into temp files organized by granule file_mgr = BinnedTemporaryFileManager() get_jpss_packet_time = GetJpssPacketTime() @@ -45,10 +50,22 @@ def build_rdr(sat, pkt_iter, output_dir='.', aggr_level=None, diary_cushion=1000 rdr_types = set(rdr_type for rdr_type, gran_iet in gran_infos) primary_type, packaged_type = process_rdr_types(rdr_types, force_packaging=False) rdr_types = sorted(rdr_types, key=(lambda t: 1 if t is primary_type else 2)) - aggr_level = aggr_level or primary_type.default_aggregation - primary_aggr_iets = sorted(set( - get_aggregate_start(sat, primary_type.gran_len, aggr_level, gran_iet) - for (rdr_type, gran_iet) in gran_infos if rdr_type is primary_type)) + if aggr_type == 'idps': + aggr_level = aggr_level or primary_type.default_aggregation + primary_aggr_iets = sorted(set( + get_aggregate_start(sat, primary_type.gran_len, aggr_level, gran_iet) + for (rdr_type, gran_iet) in gran_infos if rdr_type is primary_type)) + elif aggr_type == 'full': + # produce a single output file, ignoring IDPS-style aggregation boundaries + assert aggr_level is None + first_gran_iet = min(gran_iet for (rdr_type, gran_iet) in gran_infos + if rdr_type is primary_type) + last_gran_iet = max(gran_iet for (rdr_type, gran_iet) in gran_infos + if rdr_type is primary_type) + aggr_level = (last_gran_iet - first_gran_iet) / primary_type.gran_len + 1 + primary_aggr_iets = [first_gran_iet] + else: + raise ValueError('aggr_type must be idps or input') # now generate the RDRs rdr_files = [] @@ -56,8 +73,7 @@ def build_rdr(sat, pkt_iter, output_dir='.', aggr_level=None, diary_cushion=1000 rdr_writer = RdrWriter(sat, rdr_types, aggr_iet, aggr_level, output_dir, **attr_overrides) rdr_writer.write_aggregate(primary_type, aggr_iet, aggr_level) - gran_iets = get_aggregate_granule_times( - sat, primary_type.gran_len, aggr_level, aggr_iet) + gran_iets = [aggr_iet + i * primary_type.gran_len for i in range(aggr_level)] for gran_iet in gran_iets: with file_mgr.process_file((primary_type, gran_iet)) as pkt_file: pkts = list(jpss_packet_stream(pkt_file))