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
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
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