ELAIS N2 master catalogue

Preparation of Red Cluster Sequence Lensing Survey (RCSLenS) data

This catalogue comes from dmu0_RCSLenS.

In the catalogue, we keep:

  • The id as unique object identifier;
  • The position;
  • The g, r, i, z, y auto magnitudes.

Strange magnitudes

The missing values seems to be encoded as -99. but there are also quite some 99. magnitudes. The “sensible” range of magnitudes seems to go from 14 to 37 (depending on the bands and given that 37 is really faint and may not be reliable). In addition to that there are some very low magnitudes under -40. and very high ones above 90. We don't know the meaning of these extreme values so we are removing all the negative magnitudes and and those above 80. We are also removing the sources for which we have no magnitude information given the modifications above.

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 = "rcs_ra"
DEC_COL = "rcs_dec"

I - Column selection

In [4]:
imported_columns = OrderedDict({
        "id": "rcs_id",
        "ALPHA_J2000": "rcs_ra",
        "DELTA_J2000": "rcs_dec",
        "CLASS_STAR": "rcs_stellarity",
        "MAG_g": "m_rcs_g",
        "MAGERR_g": "merr_rcs_g",
        "MAG_r": "m_rcs_r",
        "MAGERR_r": "merr_rcs_r",        
        "MAG_i": "m_rcs_i",
        "MAGERR_i": "merr_rcs_i",
        "MAG_z": "m_rcs_z",
        "MAGERR_z": "merr_rcs_z",
        "MAG_y": "m_rcs_y",
        "MAGERR_y": "merr_rcs_y"    
    })


catalogue = Table.read("../../dmu0/dmu0_RCSLenS/data/RCSLenS_ELAIS-N2.fits")[list(imported_columns)]
for column in imported_columns:
    catalogue[column].name = imported_columns[column]

epoch = 2017

# Clean table metadata
catalogue.meta = None
In [5]:
# Adding flux and band-flag columns
for col in catalogue.colnames:
    if col.startswith('m_'):
        errcol = "merr{}".format(col[1:])
        
        # Remove missing values (-99, 99?) and extreme magnitudes (see above).
        mask = (catalogue[col] < 0) | (catalogue[col] > 80)
        catalogue[col][mask] = np.nan
        catalogue[errcol][mask] = np.nan 
        
        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:])))

        #We add NAN filled aperture columns because no aperture fluxes are present
        #nancol = np.zeros(len(catalogue))
        #nancol.fill(np.nan)
        #catalogue.add_column(Column(nancol, 
        #                            name="m_ap{}".format(col[1:])))
        #catalogue.add_column(Column(nancol, 
        #                            name="merr_ap{}".format(col[1:])))
        #catalogue.add_column(Column(nancol, 
        #                            name="f_ap{}".format(col[1:])))
        #catalogue.add_column(Column(nancol, 
        #                            name="ferr_ap{}".format(col[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.
In [6]:
catalogue[:10].show_in_notebook()
Out[6]:
<Table length=10>
idxrcs_idrcs_rarcs_decrcs_stellaritym_rcs_gmerr_rcs_gm_rcs_rmerr_rcs_rm_rcs_imerr_rcs_im_rcs_zmerr_rcs_zm_rcs_ymerr_rcs_yf_rcs_gferr_rcs_gflag_rcs_gf_rcs_rferr_rcs_rflag_rcs_rf_rcs_iferr_rcs_iflag_rcs_if_rcs_zferr_rcs_zflag_rcs_zf_rcs_yferr_rcs_yflag_rcs_y
0CDE1645C4_008629251.464870440.62388750.42nannannannannannannannannannannannanFalsenannanFalsenannanFalsenannanFalsenannanFalse
1CDE1645C4_008674251.469091640.62431810.3625.66430.12296524.79940.064109nannannannannannan0.1969150.0223016False0.4367570.025789FalsenannanFalsenannanFalsenannanFalse
2CDE1645C4_009301251.480456740.6303940.47nannan23.74080.0632709nannannannannannannannanFalse1.157920.0674776FalsenannanFalsenannanFalsenannanFalse
3CDE1645C4_009572251.464529640.63292120.38nannannannannannannannannannannannanFalsenannanFalsenannanFalsenannanFalsenannanFalse
4CDE1645C4_009587251.466110240.63306080.44nannan24.39570.0754646nannannannannannannannanFalse0.6334610.044029FalsenannanFalsenannanFalsenannanFalse
5CDE1645C4_009610251.4646640.63323090.41nannannannannannannannannannannannanFalsenannanFalsenannanFalsenannanFalsenannanFalse
6CDE1645C4_009618251.466227940.63328410.42nannan23.46480.0478849nannan23.01280.154239nannannannanFalse1.493070.0658498FalsenannanFalse2.264020.321625FalsenannanFalse
7CDE1645C4_009644251.499063240.63259450.95nannannannannannannannannannannannanFalsenannanFalsenannanFalsenannanFalsenannanFalse
8CDE1645C4_009646251.464542340.63346310.02nannannannannannannannannannannannanFalsenannanFalsenannanFalsenannanFalsenannanFalse
9CDE1645C4_009723251.46689640.63412080.124.17980.036092723.15710.0166201nannan22.63240.0480923nannan0.7728220.0256906False1.982260.0303437FalsenannanFalse3.213950.142361FalsenannanFalse

II - Removal of duplicated sources

We remove duplicated objects from the input catalogues.

In [7]:
SORT_COLS = []
FLAG_NAME = 'rcs_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])))
The initial catalogue had 1086082 sources.
The cleaned catalogue has 1066558 sources (19524 removed).
The cleaned catalogue has 19420 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 [8]:
gaia = Table.read("../../dmu0/dmu0_GAIA/data/GAIA_ELAIS-N2.fits")
gaia_coords = SkyCoord(gaia['ra'], gaia['dec'])
In [9]:
nb_astcor_diag_plot(catalogue[RA_COL], catalogue[DEC_COL], 
                    gaia_coords.ra, gaia_coords.dec, near_ra0=True)
In [10]:
delta_ra, delta_dec =  astrometric_correction(
    SkyCoord(catalogue[RA_COL], catalogue[DEC_COL]),
    gaia_coords, near_ra0=True
)

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

IV - Flagging Gaia objects

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

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

V - Flagging objects near bright stars

VI - Saving to disk

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