GW Example¶
v2 – Refactor with localization¶
v3 – Refactor with PATH¶
[1]:
%matplotlib notebook
[16]:
# imports
from importlib import reload
import os
from pkg_resources import resource_filename
import numpy as np
import healpy as hp
import pandas
from astropy.io import fits
from astropy.table import Table
from astropy.coordinates import SkyCoord
from astropath import bayesian
from astropath import localization
from astropath import path
LIGO example – GW170817¶
[3]:
lfile = os.path.join(resource_filename('astropath', 'data'), 'gw_examples',
'GW170817_skymap.fits.gz')
[4]:
gw170817 = hp.read_map(lfile)
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/fitsfunc.py:369: UserWarning: If you are not specifying the input dtype and using the default np.float64 dtype of read_map(), please consider that it will change in a future version to None as to keep the same dtype of the input file: please explicitly set the dtype if it is important to you.
"If you are not specifying the input dtype and using the default "
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/fitsfunc.py:391: UserWarning: NSIDE = 1024
warnings.warn("NSIDE = {0:d}".format(nside))
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/fitsfunc.py:400: UserWarning: ORDERING = NESTED in fits file
warnings.warn("ORDERING = {0:s} in fits file".format(ordering))
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/fitsfunc.py:428: UserWarning: INDXSCHM = IMPLICIT
warnings.warn("INDXSCHM = {0:s}".format(schm))
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/fitsfunc.py:486: UserWarning: Ordering converted to RING
warnings.warn("Ordering converted to RING")
[5]:
header = fits.open(lfile)[1].header
header
[5]:
XTENSION= 'BINTABLE' / binary table extension
BITPIX = 8 / array data type
NAXIS = 2 / number of array dimensions
NAXIS1 = 32 / length of dimension 1
NAXIS2 = 12582912 / length of dimension 2
PCOUNT = 0 / number of group parameters
GCOUNT = 1 / number of groups
TFIELDS = 4 / number of table fields
TTYPE1 = 'PROB '
TFORM1 = 'D '
TUNIT1 = 'pix-1 '
TTYPE2 = 'DISTMU '
TFORM2 = 'D '
TUNIT2 = 'Mpc '
TTYPE3 = 'DISTSIGMA'
TFORM3 = 'D '
TUNIT3 = 'Mpc '
TTYPE4 = 'DISTNORM'
TFORM4 = 'D '
TUNIT4 = 'Mpc-2 '
PIXTYPE = 'HEALPIX ' / HEALPIX pixelisation
ORDERING= 'NESTED ' / Pixel ordering scheme: RING, NESTED, or NUNIQ
COORDSYS= 'C ' / Ecliptic, Galactic or Celestial (equatorial)
NSIDE = 1024 / Resolution parameter of HEALPIX
INDXSCHM= 'IMPLICIT' / Indexing: IMPLICIT or EXPLICIT
OBJECT = 'GW170817' / Unique identifier for this event
DATE-OBS= '2017-08-17T12:41:04.429464' / UTC date of the observation
MJD-OBS = 57982.52852348908 / modified Julian date of the observation
DATE = '2019-05-08T21:51:56.613850' / UTC date of file creation
CREATOR = 'ligo-skymap-from-samples' / Program that created this file
ORIGIN = 'LIGO/Virgo' / Organization responsible for this FITS file
DISTMEAN= 38.03408225450563 / Posterior mean distance (Mpc)
DISTSTD = 7.499686641911211 / Posterior standard deviation of distance (Mpc)
VCSVERS = 'ligo.skymap 0.0.15' / Software version
VCSREV = '65fc6500a1e117fec2e27550a8e9b10c9792ffca' / Software revision (Git)
DATE-BLD= '2018-09-04T14:19:20' / Software build date
HISTORY
HISTORY Generated by running the following script:
HISTORY ligo-skymap-from-samples --seed 170817 --outdir . --objid GW170817 --fit
HISTORY soutname MCMC_TF2_LowSpin_AllSky.fits.gz MCMC_TF2_LowSpin_AllSky_post.da
HISTORY t
[6]:
hp.mollview(
gw170817,
coord=["C"],
title="GW170817",
#unit="mK",
#norm="hist",
#min=-1,
#max=1,
)
hp.graticule()
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/projaxes.py:920: MatplotlibDeprecationWarning: You are modifying the state of a globally registered colormap. In future versions, you will not be able to modify a registered colormap in-place. To remove this warning, you can make a copy of the colormap first. cmap = copy.copy(mpl.cm.get_cmap("viridis"))
newcm.set_over(newcm(1.0))
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/projaxes.py:921: MatplotlibDeprecationWarning: You are modifying the state of a globally registered colormap. In future versions, you will not be able to modify a registered colormap in-place. To remove this warning, you can make a copy of the colormap first. cmap = copy.copy(mpl.cm.get_cmap("viridis"))
newcm.set_under(bgcolor)
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/projaxes.py:922: MatplotlibDeprecationWarning: You are modifying the state of a globally registered colormap. In future versions, you will not be able to modify a registered colormap in-place. To remove this warning, you can make a copy of the colormap first. cmap = copy.copy(mpl.cm.get_cmap("viridis"))
newcm.set_bad(badcolor)
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/projaxes.py:211: MatplotlibDeprecationWarning: Passing parameters norm and vmin/vmax simultaneously is deprecated since 3.3 and will become an error two minor releases later. Please pass vmin/vmax directly to the norm when creating it.
**kwds
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/projaxes.py:543: UserWarning: 0.0 180.0 -180.0 180.0
pmin / dtor, pmax / dtor, mmin / dtor, mmax / dtor
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/projaxes.py:658: UserWarning: The interval between parallels is 30 deg -0.00'.
vdeg, varcmin
/home/xavier/anaconda3/lib/python3.7/site-packages/healpy/projaxes.py:666: UserWarning: The interval between meridians is 30 deg -0.00'.
vdeg, varcmin
Galaxies¶
https://vizier.u-strasbg.fr/viz-bin/VizieR?-source=VII/275
[7]:
galfile = os.path.join(resource_filename('astropath', 'data'), 'gw_examples',
'GW170817_galaxies.csv')
[8]:
cut_galaxies = pandas.read_csv(galfile, index_col=0)
[9]:
cut_galaxies.head()
[9]:
RAJ2000 | DEJ2000 | Dist | Bmag | BmagHyp | ImagHyp | modzHyp | mod0Hyp | logd25Hyp | logr25Hyp | ... | BmagGWGC | maj | min | PAGWGC | DistGWGC | Kmag2MPZ | Bmag2MPZ | zsp2MPZ | zph2MPZ | Flag | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
667013 | 357.169220 | -2.362345 | 92.028 | 15.33 | 15.81 | 14.02 | 34.92 | NaN | 0.85 | 0.19 | ... | 15.33 | 0.708 | 0.457 | 136.2 | 92.028 | 12.761 | 15.622 | 0.02219 | 0.031973 | 0 |
667018 | 150.132019 | -31.244976 | 31.583 | 12.60 | 12.95 | 10.66 | 32.62 | NaN | 1.31 | 0.15 | ... | 12.60 | 2.042 | 1.446 | 179.9 | 31.583 | 8.792 | 12.490 | 0.00813 | 0.008867 | 0 |
667030 | 76.325119 | -9.147248 | 44.347 | 12.53 | 13.03 | 10.86 | 33.33 | NaN | 1.43 | 0.35 | ... | 12.53 | 1.816 | 0.890 | 112.0 | 44.347 | 8.818 | 12.735 | 0.01090 | 0.010972 | 0 |
667044 | 338.249908 | -20.094194 | 80.264 | 14.13 | 14.43 | 13.35 | 34.57 | NaN | 1.05 | 0.03 | ... | 14.13 | 0.830 | 0.772 | NaN | 80.264 | 12.792 | 14.575 | 0.01905 | 0.011343 | 0 |
667076 | 138.796539 | 29.252758 | 88.167 | 16.19 | 17.13 | NaN | 34.83 | NaN | 0.72 | 0.46 | ... | 16.19 | 0.525 | 0.182 | 2.4 | 88.167 | 13.127 | 16.320 | 0.02080 | 0.062994 | 0 |
5 rows × 31 columns
Coordinates¶
[10]:
cut_gal_coord = SkyCoord(ra=cut_galaxies.RAJ2000, dec=cut_galaxies.DEJ2000, unit='deg')
[11]:
ngc_4993 = SkyCoord('13h09m47.706s -23d23m01.79s', frame='icrs')
[12]:
np.min(ngc_4993.separation(cut_gal_coord).to('arcmin'))
[12]:
$6.96812e-05\mathrm{{}^{\prime}}$
[13]:
np.argmin(ngc_4993.separation(cut_gal_coord))
[13]:
11
[14]:
cut_galaxies.iloc[11]
[14]:
RAJ2000 197.448776
DEJ2000 -23.383831
Dist 33.806000
Bmag 12.870000
BmagHyp 13.450000
ImagHyp 11.310000
modzHyp 33.130000
mod0Hyp NaN
logd25Hyp 1.190000
logr25Hyp 0.060000
logdcHyp 1.260000
PAHyp 173.200000
BmagHypC 12.870000
ImagHypC 11.080000
U-BHypC NaN
B-VHypC NaN
Jmag2 10.292000
Hmag2 9.599000
Kmag2 9.330000
a_b 0.900000
PAK -20.000000
BmagGWGC 12.870000
maj 0.932000
min 0.792000
PAGWGC 173.200000
DistGWGC 33.806000
Kmag2MPZ 9.285000
Bmag2MPZ 13.160000
zsp2MPZ 0.009680
zph2MPZ 0.012307
Flag 0.000000
Name: 667145, dtype: float64
PATH time¶
Instantiate¶
[17]:
Path = path.PATH()
Candidates¶
[19]:
Path.init_candidates(cut_galaxies.RAJ2000.values,
cut_galaxies.DEJ2000.values,
cut_galaxies.maj.values,
mag=cut_galaxies.Bmag.values)
Priors¶
[20]:
# Candidates
Path.init_cand_prior('inverse', P_U=0.)
# Offsets
Path.init_theta_prior('exp', 6.)
Localization¶
[21]:
Path.init_localization('healpix',
healpix_data=gw170817,
healpix_nside=header['NSIDE'],
healpix_ordering='NESTED',
healpix_coord='C')
Calculate Priors¶
[23]:
P_O = Path.calc_priors()
Calculate Posteriors¶
[24]:
P_Ox, P_Ux = Path.calc_posteriors('local', box_hwidth=30.)
[25]:
Path.candidates.sort_values('P_Ox', ascending=False)
[25]:
ra | dec | ang_size | mag | P_O | p_xO | P_Ox | |
---|---|---|---|---|---|---|---|
11 | 197.448776 | -23.383831 | 0.932 | 12.87 | 0.006478 | 2.783514e-04 | 9.999998e-01 |
144 | 193.861099 | -20.892786 | 0.776 | 15.73 | 0.000128 | 3.112096e-09 | 2.201734e-07 |
64 | 194.469193 | -22.638481 | 1.047 | 15.52 | 0.000167 | 3.205848e-11 | 2.972815e-09 |
347 | 206.735901 | -39.884365 | 0.757 | 14.88 | 0.000388 | 2.893990e-16 | 6.227795e-14 |
297 | 192.973251 | -12.604387 | 0.468 | 16.27 | 0.000064 | 1.294926e-17 | 4.627079e-16 |
... | ... | ... | ... | ... | ... | ... | ... |
132 | 180.701767 | 21.145529 | 0.871 | 16.00 | 0.000090 | 0.000000e+00 | 0.000000e+00 |
131 | 110.026970 | 53.010151 | 0.757 | 14.28 | 0.000875 | 0.000000e+00 | 0.000000e+00 |
129 | 140.950027 | 2.112878 | 0.630 | 15.07 | 0.000301 | 0.000000e+00 | 0.000000e+00 |
128 | 21.381145 | 32.136272 | 1.582 | 13.63 | 0.002167 | 0.000000e+00 | 0.000000e+00 |
389 | 171.504303 | 1.984145 | 0.775 | 14.04 | 0.001219 | 0.000000e+00 | 0.000000e+00 |
390 rows × 7 columns
F’ing A¶
Multi order¶
https://emfollow.docs.ligo.org/userguide/tutorial/multiorder_skymaps.html
[28]:
mofile = os.path.join(resource_filename('astropath', 'data'), 'gw_examples',
'GW190814_PublicationSamples.multiorder.fits')