Пример #1
0
    def _create_subarrays(self, subarray_defs):
        """
        Create subarrays, setting default subarray properties
        for this dataset to the first subarray.

        Parameters
        ----------
        subarray_defs : list of dicts
            List of subarray definition dictionaries
            { 'antenna' : list, 'corr_products' : list}
        """

        subarrays = []

        for subarray_def in subarray_defs:
            try:
                ants = subarray_def['antenna']
            except KeyError as e:
                raise KeyError("Subarray definition '%s' "
                               "missing '%s'" % (subarray_def, str(e)))

            ants = [
                a if isinstance(a, katpoint.Antenna) else katpoint.Antenna(a)
                for a in ants
            ]

            try:
                corr_products = subarray_def['corr_products']
            except KeyError:
                # Generate correlation products for all antenna pairs
                # including auto-correlations
                corr_products = np.array([(a1.name + c1, a2.name + c2)
                                          for i, a1 in enumerate(ants)
                                          for a2 in ants[i:]
                                          for c1 in ('h', 'v')
                                          for c2 in ('h', 'v')])

            subarrays.append(Subarray(ants, corr_products))

        try:
            subarray = subarrays[0]
        except IndexError:
            raise ValueError("No subarrays were defined in '%s'" %
                             subarray_defs)

        self.subarrays = subarrays
        self.subarray = 0
        self.inputs = subarray.inputs
        self.ants = subarray.ants
        self.corr_products = subarray.corr_products

        subarray_catdata = CategoricalData(self.subarrays, [0, self._ndumps])
        subarray_index_catdata = CategoricalData([self.subarray],
                                                 [0, self._ndumps])
        self.sensor['Observation/subarray'] = subarray_catdata
        self.sensor['Observation/subarray_index'] = subarray_index_catdata
Пример #2
0
 def test_setitem_categorical(self):
     data = CategoricalData(['x', 'y', 'x'], [0, 2, 4, 8])
     self.cache['dog'] = data
     ans = self.cache.get('dog')
     assert_equal(data.unique_values, ans.unique_values)
     np.testing.assert_array_equal(data.events, ans.events)
     np.testing.assert_array_equal(data.indices, ans.indices)
Пример #3
0
    def _create_antenna_sensors(self, antenna):
        """
        Create antenna sensors.

        Parameters
        ----------
        antenna : list of :class:`katpoint.Antenna`
            Antenna objects
        """
        for ant in antenna:
            ant_catdata = CategoricalData([ant], [0, self._ndumps])
            self.sensor['Antennas/%s/antenna' % (ant.name, )] = ant_catdata

        # Extract array reference from first antenna (first 5 fields of description)
        array_ant_fields = ['array'] + antenna[0].description.split(',')[1:5]
        array_ant = katpoint.Antenna(','.join(array_ant_fields))
        self.sensor['Antennas/array/antenna'] = CategoricalData(
            [array_ant], [0, self._ndumps])
Пример #4
0
    def _create_spectral_windows(self, spw_defs):
        """
        Create spectral windows, setting the default spectral windows
        for this dataset to the first spectral window.

        Parameters
        ----------
        spw_defs : list of dictionaries
            List of dictionaries defining a spectral window
        """
        spws = []

        if not isinstance(spw_defs, (tuple, list)):
            spw_defs = [spw_defs]

        required = set(['centre_freq', 'channel_width', 'num_chans'])

        for spw_def in spw_defs:
            # Sanity check bare minimum is present
            if not required.issubset(spw_def.keys()):
                raise KeyError("Spectral Window definition '%s' "
                               "missing '%s'" % (spw_def, required))

            spws.append(SpectralWindow(**spw_def))

        try:
            spw = spws[0]
        except IndexError:
            raise ValueError("No Spectral Windows were defined")

        self.spectral_windows = spws
        self.spw = 0
        self.channel_width = spw.channel_width
        self.freqs = self.channel_freqs = spw.channel_freqs
        self.channels = np.arange(spw.num_chans)

        spw_catdata = CategoricalData(self.spectral_windows, [0, self._ndumps])
        spw_index_catdata = CategoricalData([self.spw], [0, self._ndumps])
        self.sensor['Observation/spw'] = spw_catdata
        self.sensor['Observation/spw_index'] = spw_index_catdata
Пример #5
0
def gain_corrections(pol, ant, multi_channel=False, targets=False, fluxes=False):
    """Figure out N_DUMPS gain corrections given `pol` and `ant` indices."""
    dumps = np.arange(N_DUMPS)
    events = np.array(GAIN_EVENTS)
    gains = create_gain(pol, ant, multi_channel, targets, fluxes)
    gains = np.atleast_2d(gains.T)
    targets = TARGET_SENSOR if targets else CategoricalData([0], [0, len(dumps)])
    smooth_gains = np.full((N_DUMPS, gains.shape[0]), INVALID_GAIN, dtype=gains.dtype)
    for chan, gains_per_chan in enumerate(gains):
        for target in set(targets):
            on_target = (targets == target)
            valid = np.isfinite(gains_per_chan) & on_target[events]
            smooth_gains[on_target, chan] = INVALID_GAIN if not valid.any() else \
                complex_interp(dumps[on_target], events[valid], gains_per_chan[valid])
    return np.reciprocal(smooth_gains)
Пример #6
0
 def constant_sensor(value):
     return CategoricalData([value], [0, num_dumps])
Пример #7
0
    def _create_scans(self, ref_ant, dumps_def):
        """
        Setup reference antenna, as well as scans
        associated with it

        Parameters
        ----------
        ref_ant : :class:`katpoint.Antenna`
            Reference antenna
        dump_defs : list of tuples
            List of (event, number of dumps, target) tuples

        """
        self.ref_ant = ref_ant

        def _generate_ref_ant_compound_scans():
            """
            Divide dumps into periods of slewing and tracking at a target,
            yielding (dump_index, 'slew'/'track', target).
            """
            dump_index = 0

            for event, dumps, target in dumps_def:
                yield dump_index, event, target
                dump_index += dumps

        # Generate compound scans for the reference antenna
        ref_ant_compound_scans = _generate_ref_ant_compound_scans()

        # Labels seem to only involve tracks, separate them out
        label_scans = [
            tup for tup in ref_ant_compound_scans if tup[1] == 'track'
        ]
        events, values, _ = zip(*label_scans)
        label = CategoricalData(values, events + (self._ndumps, ))

        # Generate dump indexes (events) and 'slew'/'track' (values)
        # and targets for the reference antenna
        events, values, targets = zip(*(_generate_ref_ant_compound_scans()))
        refant = CategoricalData(values, events + (self._ndumps, ))
        # DO THIS BCOS h5datav3.py does it
        refant.add_unmatched(label.events)
        self.sensor['Antennas/%s/activity' % self.ref_ant.name] = refant

        # Derive scan states and indices from reference antenna data
        scan_index = CategoricalData(list(range(len(refant))), refant.events)

        self.sensor['Observation/scan_state'] = refant
        self.sensor['Observation/scan_index'] = scan_index

        # DO THIS BCOS h5datav3.py does it
        label.align(refant.events)

        # First track event unlikely to happen at dump 0
        if label.events[0] > 0:
            label.add(0, '')

        # Derive compound scan index from the label
        compscan_index = CategoricalData(range(len(label)), label.events)
        self.sensor['Observation/label'] = label
        self.sensor['Observation/compscan_index'] = compscan_index

        # Create categorical data for our targets
        targets = CategoricalData(targets, (events + (self._ndumps, )))
        # DO THIS BCOS h5datav3.py does it
        targets.align(refant.events)

        target_index = CategoricalData(targets.indices, targets.events)

        self.sensor['Observation/target'] = targets
        self.sensor['Observation/target_index'] = target_index