Exemple #1
0
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]
Exemple #2
0
    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)
Exemple #3
0
def test_time_as_float():
    dt = SCETime(coarse=1, fine=0)
    assert dt.as_float() == 1.0 * u.s