예제 #1
0
파일: averaging.py 프로젝트: Mulan-94/xova
def average_main(main_ds, time_bin_secs, chan_bin_size, group_row_chunks,
                 respect_flag_row):
    """
    Parameters
    ----------
    main_ds : list of Datasets
        Dataset containing Measurement Set columns.
        Should have a DATA_DESC_ID attribute.
    time_bin_secs : float
        Number of time bins to average together
    chan_bin_size : int
        Number of channels to average together
    group_row_chunks : int, optional
        Number of row chunks to concatenate together
    respect_flag_row : bool
        Respect FLAG_ROW instead of using FLAG
        for computing row flags.

    Returns
    -------
    avg
        tuple containing averaged data
    """
    # Get the appropriate spectral window and polarisation Dataset
    # Must have a single DDID table

    output_ds = []

    for ds in main_ds:
        if respect_flag_row is False:
            ds = ds.assign(FLAG_ROW=(("row", ), ds.FLAG.data.all(axis=(1, 2))))

        dv = ds.data_vars

        # Default kwargs
        kwargs = {
            'time_bin_secs': time_bin_secs,
            'chan_bin_size': chan_bin_size,
            'vis': dv['DATA'].data
        }

        # Other columns with directly transferable names
        columns = [
            'FLAG_ROW', 'TIME_CENTROID', 'EXPOSURE', 'WEIGHT', 'SIGMA', 'UVW',
            'FLAG', 'WEIGHT_SPECTRUM', 'SIGMA_SPECTRUM'
        ]

        for c in columns:
            try:
                kwargs[c.lower()] = dv[c].data
            except KeyError:
                pass

        # Set up the average operation
        avg = time_and_channel(dv['TIME'].data, dv['INTERVAL'].data,
                               dv['ANTENNA1'].data, dv['ANTENNA2'].data,
                               **kwargs)

        output_ds.append(
            output_dataset(avg, ds.FIELD_ID, ds.DATA_DESC_ID, ds.SCAN_NUMBER,
                           group_row_chunks))

    return output_ds
예제 #2
0
def average_main(main_ds,
                 field_ds,
                 time_bin_secs,
                 chan_bin_size,
                 fields,
                 scan_numbers,
                 group_row_chunks,
                 respect_flag_row,
                 viscolumn="DATA"):
    """
    Parameters
    ----------
    main_ds : list of Datasets
        Dataset containing Measurement Set columns.
        Should have a DATA_DESC_ID attribute.
    field_ds : list of Datasets
        Each Dataset corresponds to a row of the FIELD table.
    time_bin_secs : float
        Number of time bins to average together
    chan_bin_size : int
        Number of channels to average together
    fields : list
    scan_numbers : list
    group_row_chunks : int, optional
        Number of row chunks to concatenate together
    respect_flag_row : bool
        Respect FLAG_ROW instead of using FLAG
        for computing row flags.
    viscolumn: string
        name of column to average
    Returns
    -------
    avg
        tuple containing averaged data
    """
    output_ds = []

    for ds in main_ds:
        if fields and ds.FIELD_ID not in fields:
            continue

        if scan_numbers and ds.SCAN_NUMBER not in scan_numbers:
            continue

        if respect_flag_row is False:
            ds = ds.assign(FLAG_ROW=(("row", ), ds.FLAG.data.all(axis=(1, 2))))

        dv = ds.data_vars

        # Default kwargs.
        kwargs = {
            'time_bin_secs': time_bin_secs,
            'chan_bin_size': chan_bin_size,
            'vis': dv[viscolumn].data
        }

        # Other columns with directly transferable names
        columns = [
            'FLAG_ROW', 'TIME_CENTROID', 'EXPOSURE', 'WEIGHT', 'SIGMA', 'UVW',
            'FLAG', 'WEIGHT_SPECTRUM', 'SIGMA_SPECTRUM'
        ]

        for c in columns:
            try:
                kwargs[c.lower()] = dv[c].data
            except KeyError:
                pass

        # Set up the average operation
        avg = time_and_channel(dv['TIME'].data, dv['INTERVAL'].data,
                               dv['ANTENNA1'].data, dv['ANTENNA2'].data,
                               **kwargs)

        output_ds.append(
            output_dataset(avg, ds.FIELD_ID, ds.DATA_DESC_ID, ds.SCAN_NUMBER,
                           group_row_chunks))

    return output_ds
예제 #3
0
def average_main(main_ds,
                 time_bin_secs,
                 chan_bin_size,
                 group_row_chunks,
                 respect_flag_row=True,
                 viscolumn="DATA",
                 sel_cols=None):
    """ Perform averaging of the main table of the MS
    At this point,the input :attr:`main_ds` is a list containing an MS
    grouped by DDID, FIELD_ID & SCAN_NUMBER.

    Parameters
    ----------
    main_ds : list of Datasets
        Dataset containing Measurement Set columns.
        Should have a DATA_DESC_ID attribute.
    time_bin_secs : float
        Number of time bins to average together
    chan_bin_size : int
        Number of channels to average together
    group_row_chunks : int, optional
        Number of row chunks to concatenate together
    respect_flag_row : bool
        Respect FLAG_ROW instead of using FLAG
        for computing row flags.
    viscolumn: string
        name of column to average
    sel_cols: list
        Columns that need to be present in the dataset
    Returns
    -------
    avg
        tuple containing averaged data
    """
    output_ds = []

    # for each group
    for ds in main_ds:
        if respect_flag_row is False:
            if len(ds.FLAG.dims) > 2:
                ds = ds.assign(FLAG_ROW=(("row", ),
                                         ds.FLAG.data.all(axis=(1, 2))))
            else:
                ds = ds.assign(FLAG_ROW=(("row", ), ds.FLAG.data.all(axis=1)))

        # store the subgroup's data variables
        dv = ds.data_vars

        # Default kwargs.
        kwargs = {
            "time_bin_secs": time_bin_secs,
            "chan_bin_size": chan_bin_size,
            "vis": dv[viscolumn].data
        }

        # Other columns with directly transferable names
        # columns = ["FLAG_ROW", "TIME_CENTROID", "EXPOSURE", "WEIGHT",
        #           "SIGMA",
        #            "UVW", "FLAG", "WEIGHT_SPECTRUM", "SIGMA_SPECTRUM"]
        columns = ["TIME_CENTROID"] + sel_cols

        for c in columns:
            if c != viscolumn:
                try:
                    kwargs[c.lower()] = dv[c].data
                except KeyError:
                    pass

        # Set up the average operation
        avg = time_and_channel(**kwargs)

        output_ds.append(
            output_dataset(avg,
                           ds.FIELD_ID,
                           ds.DATA_DESC_ID,
                           ds.SCAN_NUMBER,
                           group_row_chunks,
                           viscolumn=viscolumn))

    return output_ds