One Table To Rule Them All: Radio

This notebook generates a table of radio components in the CDFS and ELAIS-S1 fields, according to various incarnations of the ATLAS survey. To run it, you will need a MongoDB server with the RGZ database loaded. All other data is fetched from the internet.

In the following cell, specify the MongoDB server details:


In [1]:
MONGO_HOST = 'localhost'
MONGO_PORT = 27017

In this cell, specify if you have access to a crowdastro output file (crowdastro.h5), and if so, where it is:


In [2]:
USING_CROWDASTRO = True
CROWDASTRO_PATH = 'crowdastro-swire.h5'
# To get this file, run `crowdastro import_data --ir swire`.

In this cell, specify if you have access to a CSV of the Fan et al. (2015) cross-identifications, and if so, where it is:


In [3]:
USING_FAN = True
FAN_PATH = 'J:/repos/crowdastro/data/fan_2015.csv'

Next, we will fetch the resources we need.


In [4]:
NORRIS_COMPONENTS_URI = 'http://www.atnf.csiro.au/people/rnorris/papers/n202/tab4.txt'
NORRIS_CROSS_IDENTIFICATIONS_URI = 'http://www.atnf.csiro.au/people/rnorris/papers/n202/tab6.txt'
MIDDELBERG_COMPONENTS_URI = 'http://iopscience.iop.org/article/10.1086/508275/fulltext/datafile4.txt'
MIDDELBERG_CROSS_IDENTIFICATIONS_URI = 'http://iopscience.iop.org/article/10.1086/508275/fulltext/datafile6.txt'

In [5]:
# Load Norris components.
import requests, io, astropy.io.ascii as asc, astropy.table, pandas
norris_components = astropy.table.Table.from_pandas(
    pandas.read_fwf(
        io.StringIO(
            requests.get(NORRIS_COMPONENTS_URI).text
        ),
        skiprows=[0, 2],
        header=0,
        widths=map(len, [
                '   # ',
                'Name                       ',
                'Radio RA     ',
                'Radio dec  ',
                'err(RA) ',
                'err(dec) ',
                'Peak Flux  ',
                'Int flux   ',
                'Bmaj   ',
                'Bmin   ',
                ' Bpa      ',
                ' rms  ',
            ])
    )
)
norris_components


Out[5]:
<Table length=784>
#NameRadio RARadio decerr(RA)err(dec)Peak FluxInt fluxBmajBminBparms
str4str26str11str11float64float64float64float64float64float64float64float64
C001ATCDFS_J032602.78-284709.03:26:02.785-28:47:09.00.780.730.71.388.32.660.879.3
C002ATCDFS_J032604.15-275659.33:26:04.152-27:56:59.30.550.90.711.9711.57.3-17.071.9
C003ATCDFS_J032605.68-274734.43:26:05.685-27:47:34.40.10.1140.8174.75.95.685.7119.1
C004ATCDFS_J032606.95-275332.23:26:06.955-27:53:32.20.521.190.410.430.00.0-1.076.7
C005ATCDFS_J032611.47-273243.83:26:11.475-27:32:43.80.10.169.65110.95.33.389.6156.3
C006ATCDFS_J032613.70-281717.73:26:13.701-28:17:17.70.570.790.480.540.00.00.077.7
C007ATCDFS_J032615.48-284629.23:26:15.489-28:46:29.20.340.360.450.710.00.00.066.0
C008ATCDFS_J032615.55-280601.03:26:15.557-28:06:01.00.30.470.731.060.00.0-1.056.9
C009ATCDFS_J032616.35-280014.63:26:16.353-28:00:14.60.180.31.241.660.00.0-1.060.1
C010ATCDFS_J032616.41-271621.13:26:16.419-27:16:21.10.150.234.177.849.12.8-40.090.2
....................................
C775ATCDFS_J033544.32-274323.33:35:44.326-27:43:23.30.480.981.362.819.55.43.673.1
C776ATCDFS_J033544.35-282050.93:35:44.350-28:20:50.90.350.770.671.249.64.3-9.570.4
C777ATCDFS_J033544.96-274308.03:35:44.960-27:43:08.00.410.80.581.319.46.216.071.5
C778ATCDFS_J033546.38-283805.23:35:46.383-28:38:05.20.330.560.981.555.53.954.266.9
C779ATCDFS_J033548.20-284402.33:35:48.204-28:44:02.30.120.157.0912.376.24.6-48.876.4
C780ATCDFS_J033549.15-274918.53:35:49.152-27:49:18.50.120.166.0110.976.75.322.279.5
C781ATCDFS_J033553.33-272740.43:35:53.336-27:27:40.40.10.173.88126.96.03.671.9149.7
C782ATCDFS_J033553.48-275510.93:35:53.480-27:55:10.90.350.620.590.995.84.5-43.673.5
C783ATCDFS_J033553.58-280956.83:35:53.589-28:09:56.80.160.40.460.510.00.00.061.2
C784ATCDFS_J033553.63-282923.53:35:53.634-28:29:23.50.640.960.531.177.46.6-61.280.0

In [7]:
# Load Norris cross-identifications.
# This table has inconsistent tabs, so we will have to convert them to "soft tabs".
def replace_tabs(s, tabstop=8):
    """Convert tabs to spaces."""
    out = ''
    upto = 0
    last = None
    for c in s:
        if c == '\t':
            # Fill up to next tabstop.
            diff = tabstop - upto % tabstop
            if diff == 0:
                diff = tabstop
            out += ' ' * diff
            upto += diff
            last = c
            continue
        
        last = c
        out += c
        upto += 1

    return out

test_input = ('S001	ATCDFS_J032602.78-284709.0	C001	            SWIRE3_J032603.15-284708.5	3:26:02.785	-28:47:09.06	1.4	33.8	21.1	-1.0	-1.0	-1.0						 	4					looks like a group in irac 1')
test_output = ('S001    ATCDFS_J032602.78-284709.0      C001                SWIRE3_J032603.15-284708.5  3:26:02.785     -28:47:09.06    1.4     33.8    21.1    -1.0    -1.0    -1.0                                                    4                                       looks like a group in irac 1')

assert test_output == replace_tabs(test_input)


norris_cross_identifications = astropy.table.Table.from_pandas(
    pandas.read_fwf(
        io.StringIO(
            '\n'.join(map(
                    lambda s: replace_tabs(s, 8),
                    requests.get(NORRIS_CROSS_IDENTIFICATIONS_URI).text.split('\r\n'))
             )
        ),
        skiprows=[0, 2],
        header=0,
        widths=[8, 32, 20, 28, 16, 16, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 16, 8, 16]
    )
)
norris_cross_identifications[700:710]


Out[7]:
<Table masked=True length=10>
#NameComponentSWIRERadio RARadio dec20cm3.6µm4.5µm5.8µm8.0µm24µmUGRIZz(sp)IDClassBasis
str4str26str19str26str11str12float64float64str8str8str8float64float64float64float64float64float64float64int64str4str3
S701ATCDFS_J033529.42-285156.5C753SWIRE3_J033529.46-285154.53:35:29.424-28:51:56.541.7716.0521.4194.3146.7-1.020.618.817.516.716.4--3----
S702ATCDFS_J033530.22-281108.4C754SWIRE3_J033530.19-281108.53:35:30.229-28:11:08.450.832.238.5-1.056.2376.399.099.099.099.099.0--1AGNb
S703ATCDFS_J033531.02-272702.2C755--3:35:31.025-27:27:02.2026.1----------------------9----
S704ATCDFS_J033532.11-274547.6C756SWIRE3_J033532.11-274545.23:35:32.115-27:45:47.612.2164.484.655.340.6-1.0------------3----
S705ATCDFS_J033532.19-284801.0C757SWIRE3_J033532.19-284801.13:35:32.192-28:48:01.080.9222.5417.81084.82999.410830.199.024.222.020.720.1--1----
S706ATCDFS_J033533.22-280621.8C758--3:35:33.224-28:06:21.850.3----------------------9----
S707ATCDFS_J033533.96-273313.4C759,C760,C761,C764SWIRE3_J033533.90-273310.93:35:33.963-27:33:13.469.4451.6512.5724.7966.62208.2--19.819.518.9----3AGNb
S708ATCDFS_J033534.47-284213.3C763SWIRE3_J033534.66-284221.73:35:34.479-28:42:13.310.579.853.1-1.044.3-1.099.022.721.320.419.9--4----
S709ATCDFS_J033535.20-281729.0C762,C765SWIRE3_J033535.20-281729.03:35:35.20-28:17:29.008.434.525.3-1.0-1.0-1.099.099.099.022.621.9---1AGNa
S710ATCDFS_J033536.48-282618.2C766(154935)3:35:36.488-28:26:18.270.34.1-1.0-1.0-1.0-1.099.099.099.099.099.0--1----

In [8]:
# Load Middelberg tables.
middelberg_components = asc.read(MIDDELBERG_COMPONENTS_URI)
print(middelberg_components[0])
middelberg_cross_identifications = asc.read(MIDDELBERG_CROSS_IDENTIFICATIONS_URI)
print(middelberg_cross_identifications[0])


Downloading http://iopscience.iop.org/article/10.1086/508275/fulltext/datafile4.txt [Done]
 ID             Name            RAh RAm  RAs  DE- DEd  DEm    DEs   e_RAs  e_DEs  PFlux IFlux MajAxis MinAxis PosAng rms  Com
                                 h  min   s       deg arcmin arcsec arcsec arcsec  mJy   mJy   arcsec  arcsec  deg   uJy     
---- -------------------------- --- --- ----- --- --- ------ ------ ------ ------ ----- ----- ------- ------- ------ ---- ---
C001 ATCDFS_J032602.78-284709.0   3  26 2.785   -  28     47    9.0   0.78   0.73   0.7  1.38     8.3     2.6   60.8 79.3  --
Downloading http://iopscience.iop.org/article/10.1086/508275/fulltext/datafile6.txt [Done]
 ID             Name            CID            SName            RAh RAm  RAs  DE- DEd  DEm    DEs   F20 F3.6 F4.5 F5.8 F8.0 F24  umag gmag rmag Imag zmag  z  Type Class f_Class             Comm            
                                                                 h  min   s       deg arcmin arcsec mJy uJy  uJy  uJy  uJy  uJy  mag  mag  mag  mag  mag                                                     
---- -------------------------- ---- -------------------------- --- --- ----- --- --- ------ ------ --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- ---- ----- ------- ----------------------------
S001 ATCDFS_J032602.78-284709.0 C001 SWIRE3_J032603.15-284708.5   3  26 2.785   -  28     47   9.06 1.4 33.8 21.1 -1.0 -1.0 -1.0   --   --   --   --   --  --    4    --      -- looks like a group in irac 1

In [9]:
# Convert Middelberg data into columns. There's no catalogue matching to do here so we can
# throw everything in right away.
import astropy.coordinates

_middelberg_component_ids = middelberg_components['ID']
_middelberg_component_names = middelberg_components['Name']
_middelberg_component_positions = [
    astropy.coordinates.SkyCoord(ra=(r['RAh'], r['RAm'], r['RAs']),
                                 dec=(-r['DEd'], r['DEm'], r['DEs']),
                                 unit=('hourangle', 'deg'))
    for r in middelberg_components
]
_middelberg_component_ras = [r.ra.deg for r in _middelberg_component_positions]
_middelberg_component_decs = [r.dec.deg for r in _middelberg_component_positions]

_middelberg_source_ids = middelberg_components['ID']
_middelberg_cid_to_source_id = {}
_middelberg_cid_to_source_name = {}
_middelberg_cid_to_swire = {}
_middelberg_cid_to_source_z = {}
_middelberg_cid_to_source_ra = {}
_middelberg_cid_to_source_dec = {}
for row in middelberg_cross_identifications:
    for component in row['CID'].split(','):
        component = component.strip()
        _middelberg_cid_to_source_id[component] = row['ID']
        _middelberg_cid_to_source_name[component] = row['Name']
        _middelberg_cid_to_swire[component] = row['SName']
        _middelberg_cid_to_source_z[component] = row['z']
        pos = astropy.coordinates.SkyCoord(ra=(row['RAh'], row['RAm'], row['RAs']),
                                           dec=(-row['DEd'], row['DEm'], row['DEs']),
                                           unit=('hourangle', 'deg'))
        _middelberg_cid_to_source_ra[component] = pos.ra.deg
        _middelberg_cid_to_source_dec[component] = pos.dec.deg

_middelberg_component_source_ids = [_middelberg_cid_to_source_id[c] for c in _middelberg_component_ids]
_middelberg_component_source_names = [_middelberg_cid_to_source_name[c] for c in _middelberg_component_ids]
_middelberg_component_swires = [_middelberg_cid_to_swire[c] for c in _middelberg_component_ids]
_middelberg_component_source_zs = [_middelberg_cid_to_source_z[c] for c in _middelberg_component_ids]
_middelberg_component_source_ras = [_middelberg_cid_to_source_ra[c] for c in _middelberg_component_ids]
_middelberg_component_source_decs = [_middelberg_cid_to_source_dec[c] for c in _middelberg_component_ids]

In [10]:
# Load RGZ.
import pymongo, numpy

client = pymongo.MongoClient(MONGO_HOST, MONGO_PORT)
db = client['radio']

_rgz_sources = []
_rgz_coords = []
_rgz_zids = []

for subject in db.radio_subjects.find({'metadata.survey': 'atlas'}):
    source = subject['metadata']['source']
    ra, dec = subject['coords']
    zid = subject['zooniverse_id']
    _rgz_sources.append(source)
    _rgz_coords.append((ra, dec))
    _rgz_zids.append(zid)

_rgz_coords = numpy.array(_rgz_coords)

In [11]:
# Load consensuses from crowdastro.
import h5py
with h5py.File(CROWDASTRO_PATH, 'r') as crowdastro_h5:
    # (atlas_i, ir_i, success, percentage)
    _crowdastro_consensus_objects = crowdastro_h5['/atlas/cdfs/consensus_objects']
    _crowdastro_zids = [r[0].decode('ascii') for r in crowdastro_h5['/atlas/cdfs/string']]
    _crowdastro_swire_names = [r.decode('ascii') for r in crowdastro_h5['/swire/cdfs/string']]
    _crowdastro_zid_to_swire = {}
    for atlas_i, ir_i, success, percentage in _crowdastro_consensus_objects:
        _crowdastro_zid_to_swire[_crowdastro_zids[int(atlas_i)]] = _crowdastro_swire_names[int(ir_i)]

In [12]:
# Match RGZ to Norris.
import scipy.spatial
_rgz_zid_to_norris = {}  # Maps ZID -> Norris CID
_norris_cids = [r['#'] for r in norris_components]
_norris_coords = [astropy.coordinates.SkyCoord(
    ra=r['Radio RA'],
    dec=r['Radio dec'],
    unit=('hourangle', 'deg')) for r in norris_components]

_norris_coords = numpy.array([(p.ra.deg, p.dec.deg) for p in _norris_coords])
_norris_tree = scipy.spatial.KDTree(_norris_coords)
# Assume that there are no situations where one Norris component maps to multiple RGZ components (and vice versa).
_dists, _indices = _norris_tree.query(_rgz_coords)
_matches = _dists < 3 / 60 / 60

for zid, match, index in zip(_rgz_zids, _matches, _indices):
    if not match:
        continue
    
    _rgz_zid_to_norris[zid] = _norris_cids[index]
_norris_to_rgz_zid = {j:i for i, j in _rgz_zid_to_norris.items()}

In [13]:
# Load Fan.
fan_cross_identifications = asc.read(FAN_PATH, header_start=0, delimiter=',')
_fan_source_ids = fan_cross_identifications['id']
_fan_id_to_swire = {r['id']:r['swire'] for r in fan_cross_identifications}
# Assuming that CID in Fan = CID in Norris.
_fan_component_to_source = {}
_fan_component_to_swire = {}
for row in fan_cross_identifications:
    components = row['radios'].split(',')
    for component in components:
        component = component.strip()
        _fan_component_to_source[component] = row['id']
        _fan_component_to_swire[component] = row['swire']

Now, we can construct the table. We will have the following columns:

  • Key
  • Component ID (Norris)
  • Source ID (Norris)
  • Source Name (Norris)
  • SWIRE Name (Norris)
  • RA (Norris)
  • Dec (Norris)
  • Source RA (Norris)
  • Source Dec (Norris)
  • Component ID (RGZ)
  • Zooniverse ID (RGZ)
  • SWIRE Name (RGZ-MV)
  • RA (RGZ)
  • Dec (RGZ)
  • Source ID (Fan)
  • SWIRE Name (Fan)
  • Component ID (Middelberg)
  • Component Name (Middelberg)
  • RA (Middelberg)
  • Dec (Middelberg)
  • Source ID (Middelberg)
  • Source Name (Middelberg)
  • SWIRE Name (Middelberg)
  • Source RA (Middelberg)
  • Source Dec (Middelberg)
  • Source Redshift (Middelberg)

In [14]:
columns = [
    'Key', 'Component ID (Norris)', 'Source ID (Norris)', 'Source Name (Norris)',
    'SWIRE Name (Norris)', 'RA (Norris)', 'Dec (Norris)', 'Source RA (Norris)', 'Source Dec (Norris)',
    'Component ID (RGZ)', 'Zooniverse ID (RGZ)', 'SWIRE Name (RGZ)', 'RA (RGZ)', 'Dec (RGZ)',
    'Source ID (Fan)', 'SWIRE Name (Fan)',
    'Component ID (Middelberg)', 'Component Name (Middelberg)', 'RA (Middelberg)',
    'Dec (Middelberg)', 'Source ID (Middelberg)', 'Source Name (Middelberg)',
    'SWIRE Name (Middelberg)', 'Source RA (Middelberg)', 'Source Dec (Middelberg)',
    'Source Redshift (Middelberg)',
]

In [15]:
import astropy.coordinates

# Component ID (Norris)
component_ids_norris = [r['#'] for r in norris_components]

# Source ID (Norris)
_component_to_source = {}
for r in norris_cross_identifications:
    for component in r['Component'].split(','):
        _component_to_source[component.strip()] = r['#']
source_ids_norris = [_component_to_source[c] for c in component_ids_norris]

# Source Name (Norris)
_source_to_name = {r['#']:r['Name'] for r in norris_cross_identifications}
source_names_norris = [_source_to_name[s] for s in source_ids_norris]

# SWIRE Name (Norris)
_source_to_swire_norris = {r['#']:r['SWIRE'] for r in norris_cross_identifications}
swire_names_norris = [_source_to_swire_norris[s] for s in source_ids_norris]

# RA (Norris), Dec (Norris)
_positions_norris = [astropy.coordinates.SkyCoord(
    ra=r['Radio RA'],
    dec=r['Radio dec'],
    unit=('hourangle', 'deg')) for r in norris_components]
ras_norris = [p.ra.deg for p in _positions_norris]
decs_norris = [p.dec.deg for p in _positions_norris]

# Source RA (Norris), Source Dec (Norris)
_source_positions_norris = [astropy.coordinates.SkyCoord(
    ra=r['Radio RA'],
    dec=r['Radio dec'],
    unit=('hourangle', 'deg')) for r in norris_cross_identifications]
_source_id_to_position_norris = dict(zip(norris_cross_identifications['#'], _source_positions_norris))
source_ras_norris = [_source_id_to_position_norris[s].ra.deg for s in source_ids_norris]
source_decs_norris = [_source_id_to_position_norris[s].dec.deg for s in source_ids_norris]

# Zooniverse ID (RGZ)
zooniverse_ids_rgz = [_norris_to_rgz_zid.get(cid, '') for cid in component_ids_norris]

# Component ID (RGZ)
_zid_to_cid = {z:c for z, c in zip(_rgz_zids, _rgz_sources)}
_zid_to_coord = {z:p for z, p in zip(_rgz_zids, _rgz_coords)}
component_ids_rgz = [_zid_to_cid.get(z, '') for z in zooniverse_ids_rgz]

# Extend all of these columns by RGZ objects with no corresponding Norris object.
_zid_no_norris = [z for z in _rgz_zids if z not in _rgz_zid_to_norris]
_cid_no_norris = [_zid_to_cid.get(z, '') for z in _zid_no_norris]
_blank_no_norris = [''] * len(_zid_no_norris)

for l in [component_ids_norris, source_ids_norris, source_names_norris,
          swire_names_norris, ras_norris, decs_norris, source_ras_norris,
          source_decs_norris]:
    l.extend(_blank_no_norris)
zooniverse_ids_rgz.extend(_zid_no_norris)
component_ids_rgz.extend(_cid_no_norris)

# RA (RGZ), Dec (RGZ)
ras_rgz = [_zid_to_coord.get(z, ('', ''))[0] for z in zooniverse_ids_rgz]
decs_rgz = [_zid_to_coord.get(z, ('', ''))[1] for z in zooniverse_ids_rgz]

# SWIRE Name (RGZ)
swire_names_rgz = [_crowdastro_zid_to_swire.get(z, '') for z in zooniverse_ids_rgz]

# Source ID (Fan)
fan_source_ids = [_fan_component_to_source.get(cid, '') for cid in component_ids_norris]

# SWIRE Name (Fan)
fan_swire_names = [_fan_component_to_swire.get(cid, '') for cid in component_ids_norris]

# Pad out the Middelberg columns.
middelberg_component_ids = [''] * len(component_ids_norris) + list(_middelberg_component_ids)
middelberg_component_names = [''] * len(component_ids_norris) + list(_middelberg_component_names)
middelberg_component_ras = [''] * len(component_ids_norris) + list(_middelberg_component_ras)
middelberg_component_decs = [''] * len(component_ids_norris) + list(_middelberg_component_decs)
middelberg_component_source_ids = [''] * len(component_ids_norris) + list(_middelberg_component_source_ids)
middelberg_component_source_names = [''] * len(component_ids_norris) + list(_middelberg_component_source_names)
middelberg_component_swires = [''] * len(component_ids_norris) + list(_middelberg_component_swires)
middelberg_component_source_ras = [''] * len(component_ids_norris) + list(_middelberg_component_source_ras)
middelberg_component_source_decs = [''] * len(component_ids_norris) + list(_middelberg_component_source_decs)
middelberg_component_source_zs = [''] * len(component_ids_norris) + list(_middelberg_component_source_zs)

# Pad out the other columns.
for l in [component_ids_norris, source_ids_norris, source_names_norris,
          swire_names_norris, ras_norris, decs_norris, component_ids_rgz,
          zooniverse_ids_rgz, swire_names_rgz, ras_rgz, decs_rgz,
          fan_source_ids, fan_swire_names, source_ras_norris, source_decs_norris]:
    l.extend([''] * len(_middelberg_component_ids))

keys = list(range(len(component_ids_norris)))

table = astropy.table.Table(data=[keys, component_ids_norris, source_ids_norris, source_names_norris,
                                  swire_names_norris, ras_norris, decs_norris, source_ras_norris,
                                  source_decs_norris,
                                  component_ids_rgz, zooniverse_ids_rgz, swire_names_rgz, ras_rgz, decs_rgz,
                                  fan_source_ids, fan_swire_names,
                                  middelberg_component_ids, middelberg_component_names,
                                  middelberg_component_ras, middelberg_component_decs,
                                  middelberg_component_source_ids, middelberg_component_source_names,
                                  middelberg_component_swires, middelberg_component_source_ras,
                                  middelberg_component_source_decs, middelberg_component_source_zs,
],
                            names=columns)
table


Out[15]:
<Table length=3491>
KeyComponent ID (Norris)Source ID (Norris)Source Name (Norris)SWIRE Name (Norris)RA (Norris)Dec (Norris)Source RA (Norris)Source Dec (Norris)Component ID (RGZ)Zooniverse ID (RGZ)SWIRE Name (RGZ)RA (RGZ)Dec (RGZ)Source ID (Fan)SWIRE Name (Fan)Component ID (Middelberg)Component Name (Middelberg)RA (Middelberg)Dec (Middelberg)Source ID (Middelberg)Source Name (Middelberg)SWIRE Name (Middelberg)Source RA (Middelberg)Source Dec (Middelberg)Source Redshift (Middelberg)
int32str4str4str26str32str32str32str32str32str8str10str26str32str32str11str26str4str26str18str19str4str26str32str18str19str32
0C001S001ATCDFS_J032602.78-284709.0SWIRE3_J032603.15-284708.551.511604166666665-28.78583333333333651.511604166666665-28.78585CI0412ARG0003rb2SWIRE3_J032602.36-284711.551.511734-28.78557591SWIRE3_J032603.15-284708.5
1C002S002ATCDFS_J032604.15-275659.3--51.5173-27.94980555555555751.5173-27.949830555555558
2C003S003ATCDFS_J032605.68-274734.4--51.5236875-27.7928888888888951.5236875-27.792911111111113
3C004S004ATCDFS_J032606.95-275332.2--51.528979166666666-27.89227777777777851.528979166666666-27.892294444444445
4C005S005ATCDFS_J032611.47-273243.8--51.5478125-27.545551.5478125-27.54550277777778
5C006S006ATCDFS_J032613.70-281717.7(441298)51.557087499999994-28.2882551.557087499999994-28.288252777777778
6C007S007ATCDFS_J032615.48-284629.2SWIRE3_J032615.41-284630.751.5645375-28.7747777777777851.5645375-28.77478888888889CI0614ARG0003rfrSWIRE3_J032615.41-284630.751.564555-28.774847153SWIRE3_J032615.41-284630.7
7C008S008ATCDFS_J032615.55-280601.0SWIRE3_J032615.52-280559.851.564820833333336-28.1002777777777851.564820833333336-28.100291666666667CI0320ARG0003r8sSWIRE3_J032615.52-280559.851.564799-28.099955156SWIRE3_J032615.52-280559.8
8C009S009ATCDFS_J032616.35-280014.6SWIRE3_J032616.31-280014.751.5681375-28.00405555555555651.5681375-28.004058333333333996SWIRE3_J032616.31-280014.7
9C010S010ATCDFS_J032616.41-271621.1--51.568412499999994-27.2725277777777851.568412499999994-27.27252777777778
..............................................................................
3481C775ATCDFS_J033544.32-274323.353.934691666666666-27.723138888888887S719ATCDFS_J033542.53-274343.8SWIRE3_J033542.52-274344.153.927208333333326-27.728838888888887--
3482C776ATCDFS_J033544.35-282050.953.93479166666666-28.347472222222223S718ATCDFS_J033544.35-282050.9SWIRE3_J033544.37-282050.853.93479166666666-28.347472222222223--
3483C777ATCDFS_J033544.96-274308.053.93733333333333-27.718888888888888S719ATCDFS_J033542.53-274343.8SWIRE3_J033542.52-274344.153.927208333333326-27.728838888888887--
3484C778ATCDFS_J033546.38-283805.253.943262499999996-28.634777777777778S720ATCDFS_J033546.38-283805.2(146056)53.943262499999996-28.634797222222222--
3485C779ATCDFS_J033548.20-284402.353.950849999999996-28.733972222222224S721ATCDFS_J033548.20-284402.3SWIRE3_J033548.21-284402.153.950849999999996-28.733980555555558--
3486C780ATCDFS_J033549.15-274918.553.9548-27.821805555555557S722ATCDFS_J033549.15-274918.5SWIRE3_J033549.18-274918.853.9548-27.82182222222222--
3487C781ATCDFS_J033553.33-272740.453.97223333333333-27.461222222222222S723ATCDFS_J033553.33-272740.4SWIRE3_J033553.33-272740.453.97223333333333-27.46123611111111--
3488C782ATCDFS_J033553.48-275510.953.97283333333333-27.919694444444445S724ATCDFS_J033553.48-275510.9SWIRE3_J033553.44-275512.853.97283333333333-27.91971388888889--
3489C783ATCDFS_J033553.58-280956.853.9732875-28.165777777777777S725ATCDFS_J033553.58-280956.8SWIRE3_J033553.56-280952.453.9732875-28.165788888888887--
3490C784ATCDFS_J033553.63-282923.553.973475-28.48986111111111S726ATCDFS_J033553.63-282923.5SWIRE3_J033553.59-282922.453.973475-28.489872222222225--

In [16]:
table.write('one-table-to-rule-them-all.tbl', format='ascii')

In [ ]: