Lockman-SWIRE master catalogue

Preparation of UKIRT Hemisphere Survey (UHS) data

The catalogue comes from dmu0_UHS. This is a J band only survey documented in https://arxiv.org/pdf/1707.09975.pdf

In the catalogue, we keep:

  • The identifier (it's unique in the catalogue);
  • The position;
  • The stellarity;
  • The magnitude for each band in aperture 4 (2 arcsec aperture corrected).
  • The kron magnitude to be used as total magnitude (no “auto” magnitude is provided).

We don't know when the maps have been observed. We will use the year of the reference paper.

In [1]:
from herschelhelp_internal import git_version
print("This notebook was run with herschelhelp_internal version: \n{}".format(git_version()))
This notebook was run with herschelhelp_internal version: 
44f1ae0 (Thu Nov 30 18:27:54 2017 +0000)
In [2]:
%matplotlib inline
#%config InlineBackend.figure_format = 'svg'

import matplotlib.pyplot as plt
plt.rc('figure', figsize=(10, 6))

from collections import OrderedDict
import os

from astropy import units as u
from astropy.coordinates import SkyCoord
from astropy.table import Column, Table
import numpy as np

from herschelhelp_internal.flagging import  gaia_flag_column
from herschelhelp_internal.masterlist import nb_astcor_diag_plot, remove_duplicates
from herschelhelp_internal.utils import astrometric_correction, mag_to_flux
In [3]:
OUT_DIR =  os.environ.get('TMP_DIR', "./data_tmp")
try:
    os.makedirs(OUT_DIR)
except FileExistsError:
    pass

RA_COL = "uhs_ra"
DEC_COL = "uhs_dec"

I - Column selection

In [4]:
imported_columns = OrderedDict({
        'SOURCEID': "uhs_id",
        'RA': "uhs_ra",
        'DEC': "uhs_dec",
        'PSTAR':  "uhs_stellarity",
        'JPETROMAG': "m_uhs_j", 
        'JPETROMAGERR': "merr_uhs_j", 
        'JAPERMAG4': "m_ap_uhs_j", 
        'JAPERMAG4ERR': "merr_ap_uhs_j", 

    })


catalogue = Table.read("../../dmu0/dmu0_UHS/data/UHS-DR1_Lockman-SWIRE.fits")[list(imported_columns)]
for column in imported_columns:
    catalogue[column].name = imported_columns[column]

epoch = 2011

# Clean table metadata
catalogue.meta = None
In [5]:
#Vega to AB
#Vega ZPT (1548.66 Jy) from http://svo2.cab.inta-csic.es/svo/theory/fps3/index.php?id=UKIRT/WFCAM.J

vega_to_ab = {
    "j": -2.5*np.log10(1548.66 / 3631)
}
print(vega_to_ab["j"])
0.925175419285
In [6]:
# Adding flux and band-flag columns
for col in catalogue.colnames:
    if col.startswith('m_'):
        
        errcol = "merr{}".format(col[1:])
        
        # Some object have a magnitude to 0, we suppose this means missing value
        catalogue[col][catalogue[col] <= 0] = np.nan
        catalogue[errcol][catalogue[errcol] <= 0] = np.nan  
        
        # Convert magnitude from Vega to AB
        catalogue[col] += vega_to_ab[col[-1]]        

        flux, error = mag_to_flux(np.array(catalogue[col]), np.array(catalogue[errcol]))
        
        # Fluxes are added in µJy
        catalogue.add_column(Column(flux * 1.e6, name="f{}".format(col[1:])))
        catalogue.add_column(Column(error * 1.e6, name="f{}".format(errcol[1:])))
        
        # Band-flag column
        if "ap" not in col:
            catalogue.add_column(Column(np.zeros(len(catalogue), dtype=bool), name="flag{}".format(col[1:])))
        
# TODO: Set to True the flag columns for fluxes that should not be used for SED fitting.
/opt/anaconda3/envs/herschelhelp_internal/lib/python3.6/site-packages/astropy/table/column.py:1096: MaskedArrayFutureWarning: setting an item on a masked array which has a shared mask will not copy the mask and also change the original mask array in the future.
Check the NumPy 1.11 release notes for more information.
  ma.MaskedArray.__setitem__(self, index, value)
In [7]:
catalogue[:10].show_in_notebook()
Out[7]:
<Table masked=True length=10>
idxuhs_iduhs_rauhs_decuhs_stellaritym_uhs_jmerr_uhs_jm_ap_uhs_jmerr_ap_uhs_jf_uhs_jferr_uhs_jflag_uhs_jf_ap_uhs_jferr_ap_uhs_j
degdeg
0459798365599165.75127482957.5167317570.0030674918.22240.12875218.99640.0672318186.66222.1352False91.50285.66611
1459798365600165.7502531457.55585443940.0030674918.41330.13794419.01540.0681576156.56119.8913False89.91375.64438
2459798365601165.74924525757.46948268340.0030674920.06320.35453820.03580.17216334.253911.1853False35.13125.57068
3459798365602165.74704294857.6266770060.0030674918.36960.14071718.65640.0495768162.99321.1247False125.1585.71495
4459798365603165.74456957.6152539660.0030674919.24890.22509719.50990.10543272.519615.0349False57.02385.53739
5459798365604165.7442834357.65565538690.0030674919.22390.16854119.44490.099160574.209511.5197False60.53735.52888
6459798365605165.74405802457.618771980.0030674918.780.17715219.0730.0714904111.68218.2223False85.27225.61475
7459798365606165.74400594557.53802027610.0030674918.03610.092827518.73420.0534129221.59918.9461False116.5015.73128
8459798365607165.74300086557.65134896860.99386517.64920.036455317.64640.0211523316.45410.6254False317.2856.18134
9459798365608165.74250058857.66287087980.0030674919.31910.19365619.20520.079953367.974612.1242False75.49545.55946

II - Removal of duplicated sources

We remove duplicated objects from the input catalogues.

In [8]:
SORT_COLS = ['merr_ap_uhs_j']
FLAG_NAME = 'uhs_flag_cleaned'

nb_orig_sources = len(catalogue)

catalogue = remove_duplicates(catalogue, RA_COL, DEC_COL, sort_col=SORT_COLS,flag_name=FLAG_NAME)

nb_sources = len(catalogue)

print("The initial catalogue had {} sources.".format(nb_orig_sources))
print("The cleaned catalogue has {} sources ({} removed).".format(nb_sources, nb_orig_sources - nb_sources))
print("The cleaned catalogue has {} sources flagged as having been cleaned".format(np.sum(catalogue[FLAG_NAME])))
/opt/anaconda3/envs/herschelhelp_internal/lib/python3.6/site-packages/astropy/table/column.py:1096: MaskedArrayFutureWarning: setting an item on a masked array which has a shared mask will not copy the mask and also change the original mask array in the future.
Check the NumPy 1.11 release notes for more information.
  ma.MaskedArray.__setitem__(self, index, value)
The initial catalogue had 195229 sources.
The cleaned catalogue has 182619 sources (12610 removed).
The cleaned catalogue has 12112 sources flagged as having been cleaned

III - Astrometry correction

We match the astrometry to the Gaia one. We limit the Gaia catalogue to sources with a g band flux between the 30th and the 70th percentile. Some quick tests show that this give the lower dispersion in the results.

In [9]:
gaia = Table.read("../../dmu0/dmu0_GAIA/data/GAIA_Lockman-SWIRE.fits")
gaia_coords = SkyCoord(gaia['ra'], gaia['dec'])
In [10]:
nb_astcor_diag_plot(catalogue[RA_COL], catalogue[DEC_COL], 
                    gaia_coords.ra, gaia_coords.dec)
In [11]:
delta_ra, delta_dec =  astrometric_correction(
    SkyCoord(catalogue[RA_COL], catalogue[DEC_COL]),
    gaia_coords
)

print("RA correction: {}".format(delta_ra))
print("Dec correction: {}".format(delta_dec))
RA correction: -0.07215760333565413 arcsec
Dec correction: -0.12638207908679533 arcsec
In [12]:
catalogue[RA_COL] +=  delta_ra.to(u.deg)
catalogue[DEC_COL] += delta_dec.to(u.deg)
In [13]:
nb_astcor_diag_plot(catalogue[RA_COL], catalogue[DEC_COL], 
                    gaia_coords.ra, gaia_coords.dec)

IV - Flagging Gaia objects

In [14]:
catalogue.add_column(
    gaia_flag_column(SkyCoord(catalogue[RA_COL], catalogue[DEC_COL]), epoch, gaia)
)
In [15]:
GAIA_FLAG_NAME = "uhs_flag_gaia"

catalogue['flag_gaia'].name = GAIA_FLAG_NAME
print("{} sources flagged.".format(np.sum(catalogue[GAIA_FLAG_NAME] > 0)))
49470 sources flagged.

V - Saving to disk

In [16]:
catalogue.write("{}/UHS.fits".format(OUT_DIR), overwrite=True)