mirror of
https://github.com/AllenDowney/AstronomicalData.git
synced 2026-07-28 14:47:02 -07:00
464 KiB
464 KiB
In [1]:
# If we're running on Colab, install libraries
import sys
IN_COLAB = 'google.colab' in sys.modules
if IN_COLAB:
!pip install astroquery astro-gala pyia python-wgetIn [2]:
import os
from wget import download
filename = 'gd1_dataframe.hdf5'
path = 'https://github.com/AllenDowney/AstronomicalData/raw/main/data/'
if not os.path.exists(filename):
print(download(path+filename))In [3]:
import pandas as pd
df = pd.read_hdf(filename, 'df')
centerline = pd.read_hdf(filename, 'centerline')
selected = pd.read_hdf(filename, 'selected')In [4]:
pm1_min = -8.9
pm1_max = -6.9
pm2_min = -2.2
pm2_max = 1.0In [5]:
import astropy.units as u
pm1_rect = [pm1_min, pm1_min, pm1_max, pm1_max, pm1_min] * u.mas/u.yr
pm2_rect = [pm2_min, pm2_max, pm2_max, pm2_min, pm2_min] * u.mas/u.yrIn [6]:
import matplotlib.pyplot as plt
pm1 = centerline['pm_phi1']
pm2 = centerline['pm_phi2']
plt.plot(pm1, pm2, 'ko', markersize=0.3, alpha=0.3)
pm1 = selected['pm_phi1']
pm2 = selected['pm_phi2']
plt.plot(pm1, pm2, 'gx', markersize=0.3, alpha=0.3)
plt.plot(pm1_rect, pm2_rect, '-')
plt.xlabel('Proper motion phi1 (GD1 frame)')
plt.ylabel('Proper motion phi2 (GD1 frame)')
plt.xlim(-12, 8)
plt.ylim(-10, 10);In [7]:
pm1 = centerline['pmra']
pm2 = centerline['pmdec']
plt.plot(pm1, pm2, 'ko', markersize=0.3, alpha=0.3)
pm1 = selected['pmra']
pm2 = selected['pmdec']
plt.plot(pm1, pm2, 'gx', markersize=1, alpha=0.3)
plt.xlabel('Proper motion phi1 (ICRS frame)')
plt.ylabel('Proper motion phi2 (ICRS frame)')
plt.xlim([-10, 5])
plt.ylim([-20, 5]);In [8]:
import numpy as np
points = selected[['pmra','pmdec']].to_numpy()
points.shapeOut [8]:
(1049, 2)
In [9]:
from scipy.spatial import ConvexHull
hull = ConvexHull(points)
hullOut [9]:
<scipy.spatial.qhull.ConvexHull at 0x7f446b1e8bb0>
In [10]:
hull.verticesOut [10]:
array([ 692, 873, 141, 303, 42, 622, 45, 83, 127, 182, 1006,
971, 967, 1001, 969, 940], dtype=int32)In [11]:
pm_vertices = points[hull.vertices]
pm_verticesOut [11]:
array([[ -4.05037121, -14.75623261],
[ -3.41981085, -14.72365546],
[ -3.03521988, -14.44357135],
[ -2.26847919, -13.7140236 ],
[ -2.61172203, -13.24797471],
[ -2.73471401, -13.09054471],
[ -3.19923146, -12.5942653 ],
[ -3.34082546, -12.47611926],
[ -5.67489413, -11.16083338],
[ -5.95159272, -11.10547884],
[ -6.42394023, -11.05981295],
[ -7.09631023, -11.95187806],
[ -7.30641519, -12.24559977],
[ -7.04016696, -12.88580702],
[ -6.00347705, -13.75912098],
[ -4.42442296, -14.74641176]])In [12]:
pmra_poly, pmdec_poly = np.transpose(pm_vertices)In [13]:
pm1 = centerline['pmra']
pm2 = centerline['pmdec']
plt.plot(pm1, pm2, 'ko', markersize=0.3, alpha=0.3)
pm1 = selected['pmra']
pm2 = selected['pmdec']
plt.plot(pm1, pm2, 'gx', markersize=0.3, alpha=0.3)
plt.plot(pmra_poly, pmdec_poly)
plt.xlabel('Proper motion phi1 (ICRS frame)')
plt.ylabel('Proper motion phi2 (ICRS frame)')
plt.xlim([-10, 5])
plt.ylim([-20, 5]);In [14]:
t = [str(x) for x in pm_vertices.flatten()]
tOut [14]:
['-4.050371212154984', '-14.75623260987968', '-3.4198108491382455', '-14.723655456335619', '-3.035219883740934', '-14.443571352854612', '-2.268479190206636', '-13.714023598831554', '-2.611722027231764', '-13.247974712069263', '-2.7347140078529106', '-13.090544709622938', '-3.199231461993783', '-12.594265302440828', '-3.34082545787549', '-12.476119260818695', '-5.674894125178565', '-11.160833381392624', '-5.95159272432137', '-11.105478836426514', '-6.423940229776128', '-11.05981294804957', '-7.096310230579248', '-11.951878058650085', '-7.306415190921692', '-12.245599765990594', '-7.040166963232815', '-12.885807024935527', '-6.0034770546523735', '-13.759120984106968', '-4.42442296194263', '-14.7464117578883']
In [15]:
pm_point_list = ', '.join(t)
pm_point_listOut [15]:
'-4.050371212154984, -14.75623260987968, -3.4198108491382455, -14.723655456335619, -3.035219883740934, -14.443571352854612, -2.268479190206636, -13.714023598831554, -2.611722027231764, -13.247974712069263, -2.7347140078529106, -13.090544709622938, -3.199231461993783, -12.594265302440828, -3.34082545787549, -12.476119260818695, -5.674894125178565, -11.160833381392624, -5.95159272432137, -11.105478836426514, -6.423940229776128, -11.05981294804957, -7.096310230579248, -11.951878058650085, -7.306415190921692, -12.245599765990594, -7.040166963232815, -12.885807024935527, -6.0034770546523735, -13.759120984106968, -4.42442296194263, -14.7464117578883'
In [16]:
phi1_min = -70
phi1_max = -20
phi2_min = -5
phi2_max = 5In [17]:
phi1_rect = [phi1_min, phi1_min, phi1_max, phi1_max] * u.deg
phi2_rect = [phi2_min, phi2_max, phi2_max, phi2_min] * u.degIn [18]:
import gala.coordinates as gc
import astropy.coordinates as coord
corners = gc.GD1Koposov10(phi1=phi1_rect, phi2=phi2_rect)
corners_icrs = corners.transform_to(coord.ICRS)In [19]:
point_base = "{point.ra.value}, {point.dec.value}"
t = [point_base.format(point=point)
for point in corners_icrs]
point_list = ', '.join(t)
point_listOut [19]:
'135.30559858565638, 8.398623940157561, 126.50951508623503, 13.44494195652069, 163.0173655836748, 54.24242734020255, 172.9328536286811, 46.47260492416258'
In [20]:
query_base = """SELECT
{columns}
FROM gaiadr2.gaia_source
WHERE parallax < 1
AND bp_rp BETWEEN -0.75 AND 2
AND 1 = CONTAINS(POINT(ra, dec),
POLYGON({point_list}))
"""In [21]:
# Solution
query_base = """SELECT
{columns}
FROM gaiadr2.gaia_source
WHERE parallax < 1
AND bp_rp BETWEEN -0.75 AND 2
AND 1 = CONTAINS(POINT(ra, dec),
POLYGON({point_list}))
AND 1 = CONTAINS(POINT(pmra, pmdec),
POLYGON({pm_point_list}))
"""In [22]:
columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'In [23]:
# Solution
query = query_base.format(columns=columns,
point_list=point_list,
pm_point_list=pm_point_list)
print(query)SELECT
source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity
FROM gaiadr2.gaia_source
WHERE parallax < 1
AND bp_rp BETWEEN -0.75 AND 2
AND 1 = CONTAINS(POINT(ra, dec),
POLYGON(135.30559858565638, 8.398623940157561, 126.50951508623503, 13.44494195652069, 163.0173655836748, 54.24242734020255, 172.9328536286811, 46.47260492416258))
AND 1 = CONTAINS(POINT(pmra, pmdec),
POLYGON(-4.050371212154984, -14.75623260987968, -3.4198108491382455, -14.723655456335619, -3.035219883740934, -14.443571352854612, -2.268479190206636, -13.714023598831554, -2.611722027231764, -13.247974712069263, -2.7347140078529106, -13.090544709622938, -3.199231461993783, -12.594265302440828, -3.34082545787549, -12.476119260818695, -5.674894125178565, -11.160833381392624, -5.95159272432137, -11.105478836426514, -6.423940229776128, -11.05981294804957, -7.096310230579248, -11.951878058650085, -7.306415190921692, -12.245599765990594, -7.040166963232815, -12.885807024935527, -6.0034770546523735, -13.759120984106968, -4.42442296194263, -14.7464117578883))
In [24]:
from astroquery.gaia import Gaia
job = Gaia.launch_job_async(query)
print(job)Created TAP+ (v1.2.1) - Connection:
Host: gea.esac.esa.int
Use HTTPS: True
Port: 443
SSL Port: 443
Created TAP+ (v1.2.1) - Connection:
Host: geadata.esac.esa.int
Use HTTPS: True
Port: 443
SSL Port: 443
INFO: Query finished. [astroquery.utils.tap.core]
<Table length=7346>
name dtype unit description n_bad
--------------- ------- -------- ------------------------------------------------------------------ -----
source_id int64 Unique source identifier (unique within a particular Data Release) 0
ra float64 deg Right ascension 0
dec float64 deg Declination 0
pmra float64 mas / yr Proper motion in right ascension direction 0
pmdec float64 mas / yr Proper motion in declination direction 0
parallax float64 mas Parallax 0
parallax_error float64 mas Standard error of parallax 0
radial_velocity float64 km / s Radial velocity 7295
Jobid: 1603132746237O
Phase: COMPLETED
Owner: None
Output file: async_20201019143906.vot
Results: None
In [25]:
candidate_table = job.get_results()
len(candidate_table)Out [25]:
7346
In [26]:
x = candidate_table['ra']
y = candidate_table['dec']
plt.plot(x, y, 'ko', markersize=0.3, alpha=0.3)
plt.xlabel('ra (degree ICRS)')
plt.ylabel('dec (degree ICRS)');In [27]:
from pyia import GaiaData
def make_dataframe(table):
"""Transform coordinates from ICRS to GD-1 frame.
table: Astropy Table
returns: Pandas DataFrame
"""
gaia_data = GaiaData(table)
c_sky = gaia_data.get_skycoord(distance=8*u.kpc,
radial_velocity=0*u.km/u.s)
c_gd1 = gc.reflex_correct(
c_sky.transform_to(gc.GD1Koposov10))
df = table.to_pandas()
df['phi1'] = c_gd1.phi1
df['phi2'] = c_gd1.phi2
df['pm_phi1'] = c_gd1.pm_phi1_cosphi2
df['pm_phi2'] = c_gd1.pm_phi2
return dfIn [28]:
candidate_df = make_dataframe(candidate_table)In [44]:
x = candidate_df['phi1']
y = candidate_df['phi2']
plt.plot(x, y, 'ko', markersize=0.5, alpha=0.5)
plt.xlabel('ra (degree GD1)')
plt.ylabel('dec (degree GD1)');In [30]:
!rm -f gd1_candidates.hdf5In [31]:
filename = 'gd1_candidates.hdf5'
candidate_df.to_hdf(filename, 'candidate_df')In [32]:
!ls -lh gd1_candidates.hdf5-rw-rw-r-- 1 downey downey 756K Oct 19 14:39 gd1_candidates.hdf5
In [33]:
candidate_df.to_csv('gd1_candidates.csv')In [34]:
!ls -lh gd1_candidates.csv-rw-rw-r-- 1 downey downey 1.6M Oct 19 14:39 gd1_candidates.csv
In [35]:
!head -3 gd1_candidates.csv,source_id,ra,dec,pmra,pmdec,parallax,parallax_error,radial_velocity,phi1,phi2,pm_phi1,pm_phi2 0,635559124339440000,137.58671691646745,19.1965441084838,-3.770521900009566,-12.490481778113859,0.7913934419894347,0.2717538145759051,,-59.63048941944396,-1.21648525150429,-7.361362712556612,-0.5926328820420083 1,635860218726658176,138.5187065217173,19.09233926905897,-5.941679495793577,-11.346409129876392,0.30745551377348623,0.19946557779138105,,-59.247329893833296,-2.0160784008206476,-7.527126084599517,1.7487794924398758
In [36]:
read_back_csv = pd.read_csv('gd1_candidates.csv')In [37]:
candidate_df.head(3)Out [37]:
| source_id | ra | dec | pmra | pmdec | parallax | parallax_error | radial_velocity | phi1 | phi2 | pm_phi1 | pm_phi2 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 635559124339440000 | 137.586717 | 19.196544 | -3.770522 | -12.490482 | 0.791393 | 0.271754 | NaN | -59.630489 | -1.216485 | -7.361363 | -0.592633 |
| 1 | 635860218726658176 | 138.518707 | 19.092339 | -5.941679 | -11.346409 | 0.307456 | 0.199466 | NaN | -59.247330 | -2.016078 | -7.527126 | 1.748779 |
| 2 | 635674126383965568 | 138.842874 | 19.031798 | -3.897001 | -12.702780 | 0.779463 | 0.223692 | NaN | -59.133391 | -2.306901 | -7.560608 | -0.741800 |
In [38]:
read_back_csv.head(3)Out [38]:
| Unnamed: 0 | source_id | ra | dec | pmra | pmdec | parallax | parallax_error | radial_velocity | phi1 | phi2 | pm_phi1 | pm_phi2 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 635559124339440000 | 137.586717 | 19.196544 | -3.770522 | -12.490482 | 0.791393 | 0.271754 | NaN | -59.630489 | -1.216485 | -7.361363 | -0.592633 |
| 1 | 1 | 635860218726658176 | 138.518707 | 19.092339 | -5.941679 | -11.346409 | 0.307456 | 0.199466 | NaN | -59.247330 | -2.016078 | -7.527126 | 1.748779 |
| 2 | 2 | 635674126383965568 | 138.842874 | 19.031798 | -3.897001 | -12.702780 | 0.779463 | 0.223692 | NaN | -59.133391 | -2.306901 | -7.560608 | -0.741800 |
In [ ]:

