{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# GAMA-09 master catalogue: Flags"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from astropy.table import Table\n",
    "\n",
    "import itertools\n",
    "\n",
    "from herschelhelp_internal.flagging import flag_outliers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "SUFFIX = \"20171206\"\n",
    "FIELD = \"GAMA-09\"\n",
    "catname = \"../../dmu1/dmu1_ml_GAMA-09/data/master_catalogue_gama-09_{}.fits\".format(SUFFIX)\n",
    "master_catalogue = Table.read(catname)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "u_bands = [\"Megacam u\", \"OmegaCAM u\"]\n",
    "g_bands = [\"Megacam g\", \"DECam g\", \"OmegaCAM g\", \"SUPRIME g\", \"GPC1 g\"]\n",
    "r_bands = [\"Megacam r\", \"DECam r\", \"OmegaCAM r\", \"SUPRIME r\", \"GPC1 r\"]\n",
    "i_bands = [\"Megacam i\",            \"OmegaCAM i\", \"SUPRIME i\", \"GPC1 i\"]\n",
    "z_bands = [\"Megacam z\", \"DECam z\",               \"SUPRIME z\", \"GPC1 z\", \"VISTA Z\"]\n",
    "y_bands = [                                      \"SUPRIME y\", \"GPC1 y\", \"VISTA Y\", \"UKIDSS Y\"]\n",
    "J_bands = [\"UKIDSS J\", \"VISTA J\"]\n",
    "H_bands = [\"UKIDSS H\", \"VISTA H\"]\n",
    "K_bands = [\"UKIDSS K\", \"VISTA Ks\"]\n",
    "\n",
    "all_bands = [u_bands, g_bands, r_bands, i_bands, z_bands, y_bands, J_bands, H_bands, K_bands]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. Magnitudes and magnitude erros"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def flag_mag(flagcol, mask):\n",
    "    \n",
    "    # Add flag columns if does not exist\n",
    "    if flagcol not in master_catalogue.colnames:\n",
    "        master_catalogue[flagcol] = np.zeros(len(master_catalogue), dtype=bool)\n",
    "    \n",
    "    # Flagged\n",
    "    master_catalogue[flagcol][mask] = np.ones(len(mask), dtype=bool)\n",
    "    print('    Number of flagged objects:', len(master_catalogue[flagcol][mask]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.a Pan-STARRS Aperture and Total magnitude errors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GPC1 g\n",
      "  Aperture magnitude\n",
      "    Number of flagged objects: 1486\n",
      "  Total magnitude\n",
      "    Number of flagged objects: 1633\n",
      "GPC1 r\n",
      "  Aperture magnitude\n",
      "    Number of flagged objects: 1739\n",
      "  Total magnitude\n",
      "    Number of flagged objects: 2045\n",
      "GPC1 i\n",
      "  Aperture magnitude\n",
      "    Number of flagged objects: 1989\n",
      "  Total magnitude\n",
      "    Number of flagged objects: 2110\n",
      "GPC1 z\n",
      "  Aperture magnitude\n",
      "    Number of flagged objects: 1363\n",
      "  Total magnitude\n",
      "    Number of flagged objects: 1427\n",
      "GPC1 y\n",
      "  Aperture magnitude\n",
      "    Number of flagged objects: 620\n",
      "  Total magnitude\n",
      "    Number of flagged objects: 647\n"
     ]
    }
   ],
   "source": [
    "## dmu0: Pan-STARRS forced photometry cat \n",
    "gpc1_err = 0.0010860000038519502\n",
    "bands = [\"GPC1 g\", \"GPC1 r\", \"GPC1 i\", \"GPC1 z\", \"GPC1 y\"]\n",
    "\n",
    "for i, band in enumerate(bands):\n",
    "    print(band)\n",
    "    basecol = band.replace(\" \", \"_\").lower()\n",
    "    \n",
    "    ecol_ap, ecol_tot = \"merr_ap_{}\".format(basecol), \"merr_{}\".format(basecol)\n",
    "    flagcol_ap, flagcol_tot = \"flag_ap_{}\".format(basecol), \"flag_{}\".format(basecol)\n",
    "    \n",
    "    mask_ap  = np.where(master_catalogue[ecol_ap]  == gpc1_err)[0]\n",
    "    mask_tot = np.where(master_catalogue[ecol_tot] == gpc1_err)[0]\n",
    "    \n",
    "    print('  Aperture magnitude')\n",
    "    flag_mag(flagcol_ap, mask_ap)\n",
    "    print('  Total magnitude')\n",
    "    flag_mag(flagcol_tot, mask_tot)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.a DECaLS Total magnitudes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "DECam g\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/anaconda3/envs/herschelhelp_internal/lib/python3.6/site-packages/astropy/table/column.py:965: RuntimeWarning: invalid value encountered in less\n",
      "  return getattr(self.data, op)(other)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  Total magnitude\n",
      "    Number of flagged objects: 290\n",
      "DECam r\n",
      "  Total magnitude\n",
      "    Number of flagged objects: 207\n",
      "DECam z\n",
      "  Total magnitude\n",
      "    Number of flagged objects: 55\n"
     ]
    }
   ],
   "source": [
    "decam_mag = 14.999935\n",
    "bands = [\"DECam g\", \"DECam r\", \"DECam z\"]\n",
    "\n",
    "for i, band in enumerate(bands):\n",
    "    print(band)\n",
    "    basecol = band.replace(\" \", \"_\").lower()\n",
    "    \n",
    "    col = \"m_{}\".format(basecol)\n",
    "    flagcol = \"flag_{}\".format(basecol)\n",
    "    \n",
    "    mask  = np.where((master_catalogue[col]  == decam_mag) | (master_catalogue[col] < 7))[0]\n",
    "    \n",
    "    print('  Total magnitude')\n",
    "    flag_mag(flagcol, mask)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. Outliers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "OmegaCAM u (aperture) - Megacam u (aperture):\n",
      "  Number of outliers: 4\n",
      "OmegaCAM u (total) - Megacam u (total):\n",
      "  Number of outliers: 53\n",
      "DECam g (aperture) - Megacam g (aperture):\n",
      "  Number of outliers: 120\n",
      "DECam g (total) - Megacam g (total):\n",
      "  Number of outliers: 1177\n",
      "OmegaCAM g (aperture) - Megacam g (aperture):\n",
      "  Number of outliers: 14\n",
      "OmegaCAM g (total) - Megacam g (total):\n",
      "  Number of outliers: 106\n",
      "No sources have both Megacam g (aperture) and SUPRIME g (aperture) values.\n",
      "\n",
      "No sources have both Megacam g (total) and SUPRIME g (total) values.\n",
      "\n",
      "GPC1 g (aperture) - Megacam g (aperture):\n",
      "  Number of outliers: 1\n",
      "GPC1 g (total) - Megacam g (total):\n",
      "  Number of outliers: 7\n",
      "OmegaCAM g (aperture) - DECam g (aperture):\n",
      "  Number of outliers: 0\n",
      "OmegaCAM g (total) - DECam g (total):\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/opt/herschelhelp_internal/herschelhelp_internal/flagging.py:151: RuntimeWarning: overflow encountered in power\n",
      "  ichi2 = np.power(diff, 2) / (np.power(xerr, 2) + np.power(yerr, 2))\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "  Number of outliers: 152\n",
      "SUPRIME g (aperture) - DECam g (aperture):\n",
      "  Number of outliers: 7\n",
      "SUPRIME g (total) - DECam g (total):\n",
      "  Number of outliers: 207\n",
      "GPC1 g (aperture) - DECam g (aperture):\n",
      "  Number of outliers: 3892\n",
      "GPC1 g (total) - DECam g (total):\n",
      "  Number of outliers: 81\n",
      "SUPRIME g (aperture) - OmegaCAM g (aperture):\n",
      "  Number of outliers: 31\n",
      "SUPRIME g (total) - OmegaCAM g (total):\n",
      "  Number of outliers: 349\n",
      "GPC1 g (aperture) - OmegaCAM g (aperture):\n",
      "  Number of outliers: 0\n",
      "GPC1 g (total) - OmegaCAM g (total):\n",
      "  Number of outliers: 0\n",
      "GPC1 g (aperture) - SUPRIME g (aperture):\n",
      "  Number of outliers: 0\n",
      "GPC1 g (total) - SUPRIME g (total):\n",
      "  Number of outliers: 3\n",
      "DECam r (aperture) - Megacam r (aperture):\n",
      "  Number of outliers: 0\n",
      "DECam r (total) - Megacam r (total):\n",
      "  Number of outliers: 7\n",
      "OmegaCAM r (aperture) - Megacam r (aperture):\n",
      "  Number of outliers: 15\n",
      "OmegaCAM r (total) - Megacam r (total):\n",
      "  Number of outliers: 40\n",
      "No sources have both Megacam r (aperture) and SUPRIME r (aperture) values.\n",
      "\n",
      "No sources have both Megacam r (total) and SUPRIME r (total) values.\n",
      "\n",
      "GPC1 r (aperture) - Megacam r (aperture):\n",
      "  Number of outliers: 1\n",
      "GPC1 r (total) - Megacam r (total):\n",
      "  Number of outliers: 7\n",
      "OmegaCAM r (aperture) - DECam r (aperture):\n",
      "  Number of outliers: 0\n",
      "OmegaCAM r (total) - DECam r (total):\n",
      "  Number of outliers: 2\n",
      "SUPRIME r (aperture) - DECam r (aperture):\n",
      "  Number of outliers: 0\n",
      "SUPRIME r (total) - DECam r (total):\n",
      "  Number of outliers: 4\n",
      "GPC1 r (aperture) - DECam r (aperture):\n",
      "  Number of outliers: 54\n",
      "GPC1 r (total) - DECam r (total):\n",
      "  Number of outliers: 0\n",
      "SUPRIME r (aperture) - OmegaCAM r (aperture):\n",
      "  Number of outliers: 3\n",
      "SUPRIME r (total) - OmegaCAM r (total):\n",
      "  Number of outliers: 129\n",
      "GPC1 r (aperture) - OmegaCAM r (aperture):\n",
      "  Number of outliers: 0\n",
      "GPC1 r (total) - OmegaCAM r (total):\n",
      "  Number of outliers: 7\n",
      "GPC1 r (aperture) - SUPRIME r (aperture):\n",
      "  Number of outliers: 0\n",
      "GPC1 r (total) - SUPRIME r (total):\n",
      "  Number of outliers: 4\n",
      "OmegaCAM i (aperture) - Megacam i (aperture):\n",
      "  Number of outliers: 8\n",
      "OmegaCAM i (total) - Megacam i (total):\n",
      "  Number of outliers: 27\n",
      "No sources have both Megacam i (aperture) and SUPRIME i (aperture) values.\n",
      "\n",
      "No sources have both Megacam i (total) and SUPRIME i (total) values.\n",
      "\n",
      "GPC1 i (aperture) - Megacam i (aperture):\n",
      "  Number of outliers: 0\n",
      "GPC1 i (total) - Megacam i (total):\n",
      "  Number of outliers: 9\n",
      "SUPRIME i (aperture) - OmegaCAM i (aperture):\n",
      "  Number of outliers: 157\n",
      "SUPRIME i (total) - OmegaCAM i (total):\n",
      "  Number of outliers: 61\n",
      "GPC1 i (aperture) - OmegaCAM i (aperture):\n",
      "  Number of outliers: 1\n",
      "GPC1 i (total) - OmegaCAM i (total):\n",
      "  Number of outliers: 13\n",
      "GPC1 i (aperture) - SUPRIME i (aperture):\n",
      "  Number of outliers: 0\n",
      "GPC1 i (total) - SUPRIME i (total):\n",
      "  Number of outliers: 5\n",
      "DECam z (aperture) - Megacam z (aperture):\n",
      "  Number of outliers: 0\n",
      "DECam z (total) - Megacam z (total):\n",
      "  Number of outliers: 0\n",
      "No sources have both Megacam z (aperture) and SUPRIME z (aperture) values.\n",
      "\n",
      "No sources have both Megacam z (total) and SUPRIME z (total) values.\n",
      "\n",
      "GPC1 z (aperture) - Megacam z (aperture):\n",
      "  Number of outliers: 0\n",
      "GPC1 z (total) - Megacam z (total):\n",
      "  Number of outliers: 21\n",
      "VISTA Z (aperture) - Megacam z (aperture):\n",
      "  Number of outliers: 0\n",
      "VISTA Z (total) - Megacam z (total):\n",
      "  Number of outliers: 6\n",
      "SUPRIME z (aperture) - DECam z (aperture):\n",
      "  Number of outliers: 0\n",
      "SUPRIME z (total) - DECam z (total):\n",
      "  Number of outliers: 1\n",
      "GPC1 z (aperture) - DECam z (aperture):\n",
      "  Number of outliers: 111\n",
      "GPC1 z (total) - DECam z (total):\n",
      "  Number of outliers: 1\n",
      "VISTA Z (aperture) - DECam z (aperture):\n",
      "  Number of outliers: 0\n",
      "VISTA Z (total) - DECam z (total):\n",
      "  Number of outliers: 400\n",
      "GPC1 z (aperture) - SUPRIME z (aperture):\n",
      "  Number of outliers: 1\n",
      "GPC1 z (total) - SUPRIME z (total):\n",
      "  Number of outliers: 2\n",
      "VISTA Z (aperture) - SUPRIME z (aperture):\n",
      "  Number of outliers: 17\n",
      "VISTA Z (total) - SUPRIME z (total):\n",
      "  Number of outliers: 278\n",
      "VISTA Z (aperture) - GPC1 z (aperture):\n",
      "  Number of outliers: 83\n",
      "VISTA Z (total) - GPC1 z (total):\n",
      "  Number of outliers: 18\n",
      "GPC1 y (aperture) - SUPRIME y (aperture):\n",
      "  Number of outliers: 1\n",
      "GPC1 y (total) - SUPRIME y (total):\n",
      "  Number of outliers: 0\n",
      "VISTA Y (aperture) - SUPRIME y (aperture):\n",
      "  Number of outliers: 4\n",
      "VISTA Y (total) - SUPRIME y (total):\n",
      "  Number of outliers: 31\n",
      "UKIDSS Y (aperture) - SUPRIME y (aperture):\n",
      "  Number of outliers: 55\n",
      "UKIDSS Y (total) - SUPRIME y (total):\n",
      "  Number of outliers: 33\n",
      "VISTA Y (aperture) - GPC1 y (aperture):\n",
      "  Number of outliers: 40\n",
      "VISTA Y (total) - GPC1 y (total):\n",
      "  Number of outliers: 0\n",
      "UKIDSS Y (aperture) - GPC1 y (aperture):\n",
      "  Number of outliers: 62\n",
      "UKIDSS Y (total) - GPC1 y (total):\n",
      "  Number of outliers: 77\n",
      "UKIDSS Y (aperture) - VISTA Y (aperture):\n",
      "  Number of outliers: 9\n",
      "UKIDSS Y (total) - VISTA Y (total):\n",
      "  Number of outliers: 9\n",
      "VISTA J (aperture) - UKIDSS J (aperture):\n",
      "  Number of outliers: 1661\n",
      "VISTA J (total) - UKIDSS J (total):\n",
      "  Number of outliers: 220\n",
      "VISTA H (aperture) - UKIDSS H (aperture):\n",
      "  Number of outliers: 2796\n",
      "VISTA H (total) - UKIDSS H (total):\n",
      "  Number of outliers: 813\n",
      "VISTA Ks (aperture) - UKIDSS K (aperture):\n",
      "  Number of outliers: 547\n",
      "VISTA Ks (total) - UKIDSS K (total):\n",
      "  Number of outliers: 327\n"
     ]
    }
   ],
   "source": [
    "for band_of_a_kind in all_bands:\n",
    "    for band1, band2 in itertools.combinations(band_of_a_kind, 2):\n",
    "        #print(band1, band2)\n",
    "\n",
    "        basecol1, basecol2 = band1.replace(\" \", \"_\").lower(), band2.replace(\" \", \"_\").lower()\n",
    "        \n",
    "        # Aperture mag\n",
    "        col1, col2 = \"m_ap_{}\".format(basecol1), \"m_ap_{}\".format(basecol2)\n",
    "        ecol1, ecol2 = \"merr_ap_{}\".format(basecol1), \"merr_ap_{}\".format(basecol2)\n",
    "        flagcol1, flagcol2 = \"flag_ap_{}\".format(basecol1), \"flag_ap_{}\".format(basecol2)\n",
    "        \n",
    "        try:\n",
    "            master_catalogue = flag_outliers(master_catalogue, col1, col2,\n",
    "                      ecol1, ecol2,\n",
    "                      flagcol1, flagcol2,\n",
    "                      labels=(\"{} (aperture)\".format(band1), \"{} (aperture)\".format(band2)))\n",
    "        except KeyError:\n",
    "            print(\"One of {} and {} is not present in the catalogue.\".format(col1, col2))\n",
    "                      \n",
    "        \n",
    "        # Tot mag\n",
    "        col1, col2 = \"m_{}\".format(basecol1), \"m_{}\".format(basecol2)              \n",
    "        ecol1, ecol2 = \"merr_{}\".format(basecol1), \"merr_{}\".format(basecol2)              \n",
    "        flagcol1, flagcol2 = \"flag_{}\".format(basecol1), \"flag_{}\".format(basecol2)\n",
    "              \n",
    "        try:\n",
    "            master_catalogue = flag_outliers(master_catalogue, col1, col2, \n",
    "                      ecol1, ecol2,\n",
    "                      flagcol1, flagcol2,\n",
    "                      labels=(\"{} (total)\".format(band1), \"{} (total)\".format(band2)))   \n",
    "        except KeyError:\n",
    "            print(\"One of {} and {} is not present in the catalogue.\".format(col1, col2))          \n",
    "                      "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. Save table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "\n",
    "#Merge any aperture flags#Merge  \n",
    "for col in master_catalogue.colnames:\n",
    "    if col.startswith(\"flag_ap_\"):\n",
    "        try:\n",
    "            master_catalogue[col.replace(\"_ap_\", \"_\")] = (master_catalogue[col.replace(\"_ap_\", \"_\")] |\n",
    "                                                          master_catalogue[col])\n",
    "            master_catalogue.remove_column(col)\n",
    "        except KeyError:\n",
    "            print(\"{} only has aperture flags.\".format(col))\n",
    "            master_catalogue.rename_column(col, col.replace(\"_ap_\", \"_\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "flag_cols = [\"help_id\"]\n",
    "for col in master_catalogue.colnames:\n",
    "    if col.startswith(\"flag_\"):\n",
    "        flag_cols += [col]\n",
    "new_catname = \"./data/{}_{}_flags.fits\".format(FIELD.lower(),SUFFIX)\n",
    "master_catalogue[flag_cols].write(new_catname, overwrite = True)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python (herschelhelp_internal)",
   "language": "python",
   "name": "helpint"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
