def test_level1_processor_generate_primary_header(config, product): config.get.side_effect = [td.soop.DIR, '.'] processor = FitsL1Processor('some/path') beg = SCETime(coarse=683769519, fine=0) end = SCETime(coarse=beg.coarse + 24 * 60 * 60) beg + (end - beg) / 2 product.scet_timerange = SCETimeRange(start=beg, end=end) product.utc_timerange = product.scet_timerange.to_timerange() product.raw = ['packet1.xml', 'packet2.xml'] product.parent = ['l01.fits', 'l02.fts'] product.level = 'L1' product.type = "ql" product.service_type = 1 product.service_subtype = 2 product.ssid = 3 test_data = { 'FILENAME': 'a_filename.fits', 'OBT_BEG': beg.as_float().value, 'OBT_END': end.as_float().value, 'DATE_OBS': product.utc_timerange.start.fits, 'DATE_BEG': product.utc_timerange.start.fits, 'DATE_AVG': product.utc_timerange.center.fits, 'DATE_END': product.utc_timerange.end.fits, 'STYPE': product.service_type, 'SSTYPE': product.service_subtype, 'SSID': product.ssid, 'TIMESYS': 'UTC', 'LEVEL': 'L1', 'OBS_ID': 'SSTX_040A_000_000_5Md2_112;SSTX_040A_000_000_vFLg_11Y', 'OBS_TYPE': '5Md2;vFLg', 'OBS_MODE': 'STIX_ANALYSIS;STIX_BASIC', 'SOOPNAME': '', 'SOOPTYPE': '', 'TARGET': '', 'RSUN_ARC': 1589.33, 'HGLT_OBS': -0.32, 'HGLN_OBS': -66.52, 'RAW_FILE': 'packet1.xml;packet2.xml', 'PARENT': 'l01.fits;l02.fts' } header = processor.generate_primary_header('a_filename.fits', product) for name, value, *comment in header: if name in test_data.keys(): if isinstance(value, float): assert np.allclose(test_data[name], value) else: assert value == test_data[name]
def from_levelb(cls, levelb, parent=''): packets, idb_versions, control = QLProduct.from_levelb(levelb, parent=parent) # Control control.add_basic(name='integration_time', nix='NIX00122', packets=packets, dtype=np.uint32, attr='value') control.add_basic(name='quiet_time', nix='NIX00123', packets=packets, dtype=np.uint16, attr='value') control.add_basic(name='live_time', nix='NIX00124', packets=packets, dtype=np.uint32, attr='value') control.add_basic(name='average_temperature', nix='NIX00125', packets=packets, dtype=np.uint16, attr='value') control.add_data('detector_mask', _get_detector_mask(packets)) control.add_data('pixel_mask', _get_pixel_mask(packets)) control.add_data('subspectrum_mask', _get_sub_spectrum_mask(packets)) control.add_data('compression_scheme_counts_skm', _get_compression_scheme(packets, 'NIX00158')) subspec_data = {} j = 129 for subspec, i in enumerate(range(300, 308)): subspec_data[subspec+1] = {'num_points': packets.get_value(f'NIXD0{j}'), 'num_summed_channel': packets.get_value(f'NIXD0{j + 1}'), 'lowest_channel': packets.get_value(f'NIXD0{j + 2}')} j += 3 control.add_basic(name='num_samples', nix='NIX00159', packets=packets, dtype=np.uint16) control['subspec_num_points'] = ( np.vstack([v['num_points'] for v in subspec_data.values()]).T + 1).astype(np.uint16) control['subspec_num_summed_channel'] = (np.vstack( [v['num_summed_channel'] for v in subspec_data.values()]).T + 1).astype(np.uint16) control['subspec_lowest_channel'] = ( np.vstack([v['lowest_channel'] for v in subspec_data.values()]).T).astype(np.uint16) channels = [] for i, subspectrum_mask in enumerate(control['subspectrum_mask']): subspec_index = np.argwhere(subspectrum_mask == 1) sub_channels = [np.arange(control['subspec_num_points'][i, index]) * (control['subspec_num_summed_channel'][i, index]) + control['subspec_lowest_channel'][i, index] for index in subspec_index] channels.append(list(chain(*[ch.tolist() for ch in sub_channels]))) control['num_channels'] = [len(c) for c in channels] duration = SCETimeDelta(packets.get_value('NIX00122').astype(np.uint32)) time = SCETime(control['scet_coarse'], control['scet_fine']) + duration / 2 dids = packets.get_value('NIXD0155') pids = packets.get_value('NIXD0156') ssids = packets.get_value('NIXD0157') num_spec_points = packets.get_value('NIX00146') unique_times, unique_time_indices = np.unique(time.as_float(), return_index=True) unique_times_lookup = {k: v for k, v in zip(unique_times, np.arange(unique_times.size))} # should really do the other way make a smaller lookup rather than repeating many many times tids = np.hstack([[unique_times_lookup[t.as_float()]] * n for t, n in zip(time, control['num_samples'])]) c_in = list(chain.from_iterable([repeat(c, n) for c, n in zip(channels, control['num_samples'])])) counts = packets.get_value('NIX00158') counts_var = packets.get_value('NIX00158', attr='error') c_out = np.arange(1025) start = 0 count_map = defaultdict(list) counts_var_map = defaultdict(list) for tid, did, pid, ssid, nps, cin in zip(tids, dids, pids, ssids, num_spec_points, c_in): end = start + nps logger.debug('%d, %d, %d, %d, %d, %d', tid, did, pid, ssid, nps, end) count_map[tid, did, pid].append(counts[start:end]) counts_var_map[tid, did, pid].append(counts_var[start:end]) start = end full_counts = np.zeros((unique_times.size, 32, 12, 1024)) full_counts_var = np.zeros((unique_times.size, 32, 12, 1024)) for tid, did, pid in count_map.keys(): cur_counts = count_map[tid, did, pid] cur_counts_var = counts_var_map[tid, did, pid] counts_rebinned = rebin_proportional(np.hstack(cur_counts), cin, c_out) counts_var_rebinned = rebin_proportional(np.hstack(cur_counts_var), cin, c_out) full_counts[tid, did, pid] = counts_rebinned full_counts_var[tid, did, pid] = counts_var_rebinned control = control[unique_time_indices] control['index'] = np.arange(len(control)) # Data data = Data() data['time'] = time[unique_time_indices] data['timedel'] = duration[unique_time_indices] data.add_meta(name='timedel', nix='NIX00122', packets=packets) data['counts'] = (full_counts*u.ct).astype(get_min_uint(full_counts)) data.add_meta(name='counts', nix='NIX00158', packets=packets) data['counts_err'] = (np.sqrt(full_counts_var)*u.ct).astype(np.float32) data['control_index'] = np.arange(len(control)).astype(np.uint16) return cls(service_type=packets.service_type, service_subtype=packets.service_subtype, ssid=packets.ssid, control=control, data=data, idb_versions=idb_versions, packets=packets)
def test_time_as_float(): dt = SCETime(coarse=1, fine=0) assert dt.as_float() == 1.0 * u.s