def _create_table(table_name, datasets, columns, descriptor): builder = descriptor_builder(table_name, descriptor) schemas = [DatasetSchema.from_dataset(ds, columns) for ds in datasets] table_desc, dminfo = builder.execute(schemas) root, table, subtable = table_path_split(table_name) table_path = root / table from daskms.descriptors.ms import MSDescriptorBuilder from daskms.descriptors.ms_subtable import MSSubTableDescriptorBuilder if not subtable and isinstance(builder, MSDescriptorBuilder): table_path = str(table_path) # Create the MS with pt.default_ms(table_path, tabdesc=table_desc, dminfo=dminfo): pass return _writable_table_proxy(table_path) elif subtable: # NOTE(sjperkins) # Recreate the subtable path with OS separator components # This avoids accessing the subtable via the main table # (e.g. WSRT.MS::SOURCE) # which can cause lock issues as the subtables seemingly # inherit the parent table lock subtable_path = str(table_path / subtable) # Create the subtable if isinstance(builder, MSSubTableDescriptorBuilder): with pt.default_ms_subtable(subtable, subtable_path, tabdesc=table_desc, dminfo=dminfo): pass else: with pt.table(subtable_path, table_desc, dminfo=dminfo, ack=False): pass # Add subtable to the main table table_proxy = _writable_table_proxy(str(table_path)) table_proxy.putkeywords({subtable: "Table: " + subtable_path}).result() del table_proxy # Return TableProxy return _writable_table_proxy(subtable_path) else: # Create the table with pt.table(str(table_path), table_desc, dminfo=dminfo, ack=False): pass return _writable_table_proxy(str(table_path))
def create_ms(filename, table_desc=None, dm_info=None): with tables.default_ms(filename, table_desc, dm_info) as T: # Add the SOURCE subtable source_filename = os.path.join(os.getcwd(), filename, "SOURCE") tables.default_ms_subtable("SOURCE", source_filename) T.putkeyword("SOURCE", "Table: %s" % source_filename)
def _ms_factory_impl(ms_name): rs = np.random.RandomState(42) ant_name = "::".join((ms_name, "ANTENNA")) ddid_name = "::".join((ms_name, "DATA_DESCRIPTION")) field_name = "::".join((ms_name, "FIELD")) pol_name = "::".join((ms_name, "POLARIZATION")) spw_name = "::".join((ms_name, "SPECTRAL_WINDOW")) kw = {'ack': False, 'readonly': False} desc = { 'DATA': { '_c_order': True, 'comment': 'DATA column', 'dataManagerGroup': 'StandardStMan', 'dataManagerType': 'StandardStMan', 'keywords': {}, 'maxlen': 0, 'ndim': 2, 'option': 0, # 'shape': ..., # Variably shaped 'valueType': 'COMPLEX' } } na = 64 corr_types = [[9, 10, 11, 12], [9, 12]] spw_chans = [16, 32] ddids = ([0, 0, 4], [1, 1, 6]) with pt.default_ms(ms_name, desc) as ms: # Populate ANTENNA table with pt.table(ant_name, **kw) as A: A.addrows(na) A.putcol("POSITION", rs.random_sample((na, 3)) * 10000) A.putcol("OFFSET", rs.random_sample((na, 3))) A.putcol("NAME", ["ANT-%d" % i for i in range(na)]) # Populate POLARIZATION table with pt.table(pol_name, **kw) as P: for r, corr_type in enumerate(corr_types): P.addrows(1) P.putcol("NUM_CORR", np.array(len(corr_type))[None], startrow=r, nrow=1) P.putcol("CORR_TYPE", np.array(corr_type)[None, :], startrow=r, nrow=1) # Populate SPECTRAL_WINDOW table with pt.table(spw_name, **kw) as SPW: freq_start = .856e9 freq_end = 2 * .856e9 for r, nchan in enumerate(spw_chans): chan_width = (freq_end - freq_start) / nchan chan_width = np.full(nchan, chan_width) chan_freq = np.linspace(freq_start, freq_end, nchan) ref_freq = chan_freq[chan_freq.size // 2] SPW.addrows(1) SPW.putcol("NUM_CHAN", np.array(nchan)[None], startrow=r, nrow=1) SPW.putcol("CHAN_WIDTH", chan_width[None, :], startrow=r, nrow=1) SPW.putcol("CHAN_FREQ", chan_freq[None, :], startrow=r, nrow=1) SPW.putcol("REF_FREQUENCY", np.array(ref_freq)[None], startrow=r, nrow=1) # Populate FIELD table with pt.table(field_name, **kw) as F: fields = (['3C147', np.deg2rad([0, 60])], ['3C147', np.deg2rad([30, 45])]) npoly = 1 for r, (name, phase_dir) in enumerate(fields): F.addrows(1) F.putcol("NAME", [name], startrow=r, nrow=1) F.putcol("NUM_POLY", np.array(npoly)[None], startrow=r, nrow=1) # Set all these to the phase centre for c in ["PHASE_DIR", "REFERENCE_DIR", "DELAY_DIR"]: F.putcol(c, phase_dir[None, None, :], startrow=r, nrow=1) # Populate DATA_DESCRIPTION table with pt.table(ddid_name, **kw) as D: for r, (spw_id, pol_id, _) in enumerate(ddids): D.addrows(1) D.putcol("SPECTRAL_WINDOW_ID", np.array(spw_id)[None], startrow=r, nrow=1) D.putcol("POLARIZATION_ID", np.array(pol_id)[None], startrow=r, nrow=1) startrow = 0 # Add some data to the main table for ddid, (spw_id, pol_id, rows) in enumerate(ddids): ms.addrows(rows) ms.putcol("DATA_DESC_ID", np.full(rows, ddid), startrow=startrow, nrow=rows) nchan = spw_chans[spw_id] ncorr = len(corr_types[pol_id]) vis = (np.random.random((rows, nchan, ncorr)) + np.random.random( (rows, nchan, ncorr)) * 1j) ms.putcol("DATA", vis, startrow=startrow, nrow=rows) startrow += rows