diff --git a/03_motion.html b/03_motion.html index 0679509..2760a35 100644 --- a/03_motion.html +++ b/03_motion.html @@ -576,7 +576,7 @@ radial_velocity float64 km / s
-_images/03_motion_28_0.png +_images/03_motion_29_0.png

The arguments to plt.plot are x, y, and a string that specifies the style. In this case, the letters ko indicate that we want a black, round marker (k is for black because b is for blue).

@@ -696,7 +696,7 @@ which is an “interface for celestial coordinate representation, manipulation,
-_images/03_motion_45_0.png +_images/03_motion_46_0.png

Remember that we started with a rectangle in GD-1 coordinates. When transformed to ICRS, it’s a non-rectangular polygon. Now that we have transformed back to GD-1 coordinates, it’s a rectangle again.

@@ -885,7 +885,7 @@ which is an “interface for celestial coordinate representation, manipulation,

Exploring data

-

One benefit of using Pandas is that it provides function for exploring the data and checking for problems.

+

One benefit of using Pandas is that it provides functions for exploring the data and checking for problems.

One of the most useful of these functions is describe, which computes summary statistics for each column.

@@ -1222,7 +1222,7 @@ Name: phi2, dtype: bool
-_images/03_motion_83_0.png +_images/03_motion_84_0.png

Looking at these results, we see a large cluster around (0, 0), and a smaller cluster near (0, -10).

@@ -1243,7 +1243,7 @@ Name: phi2, dtype: bool
-_images/03_motion_85_0.png +_images/03_motion_86_0.png

Now we can see the smaller cluster more clearly.

@@ -1291,7 +1291,7 @@ Name: phi2, dtype: bool
-_images/03_motion_92_0.png +_images/03_motion_93_0.png

To select rows that fall within these bounds, we’ll use the following function, which uses Pandas operators to make a mask that selects rows where series falls between low and high.

@@ -1361,7 +1361,7 @@ Name: phi2, dtype: bool
-_images/03_motion_102_0.png +_images/03_motion_103_0.png

Now that’s starting to look like a tidal stream!

diff --git a/04_select.html b/04_select.html index 7f8880b..6c39e29 100644 --- a/04_select.html +++ b/04_select.html @@ -254,14 +254,26 @@
  • - - Selecting the region + + Convex Hull
  • - - Assemble the query + + Assembling the query +
  • @@ -317,8 +329,10 @@

    That will make it possible to search a bigger region of the sky in a single query.

    After completing this lesson, you should be able to

    @@ -352,6 +366,13 @@

    Selection by proper motion

    +

    Let’s review how we got to this point.

    +
      +
    1. We made an ADQL query to the Gaia server to get data for stars in the vicinity of GD-1.

    2. +
    3. We transformed the coordinates to the GD1Koposov10 frame so we could select stars along the centerline of GD-1.

    4. +
    5. We plotted the proper motion of the centerline stars to identify the bounds of the overdense region.

    6. +
    7. We made a mask that selects stars whose proper motion is in the overdense region.

    8. +

    At this point we have downloaded data for a relatively large number of stars (more than 100,000) and selected a relatively small number (around 1000).

    It would be more efficient to use ADQL to select only the stars we need. That would also make it possible to download data covering a larger region of the sky.

    However, the selection we did was based on proper motion in the GD1Koposov10 frame. In order to do the same selection in ADQL, we have to work with proper motions in ICRS.

    @@ -405,7 +426,7 @@
    -_images/04_select_11_0.png +_images/04_select_12_0.png

    Now we’ll make the same plot using proper motions in the ICRS frame, which are stored in columns pmra and pmdec.

    @@ -428,14 +449,16 @@
    -_images/04_select_13_0.png +_images/04_select_14_0.png

    The proper motions of the selected stars are more spread out in this frame, which is why it was preferable to do the selection in the GD-1 frame.

    -

    But now we can define a polygon that encloses the proper motions of these stars in ICRS, -and use the polygon as a selection criterion in an ADQL query.

    +

    But now we can define a polygon that encloses the proper motions of these stars in ICRS, and use that polygon as a selection criterion in an ADQL query.

    + +
    +

    Convex Hull

    SciPy provides a function that computes the convex hull of a set of points, which is the smallest convex polygon that contains all of the points.

    -

    To use it, I’ll select columns pmra and pmdec and convert them to a NumPy array.

    +

    To use it, we’ll select columns pmra and pmdec and convert them to a NumPy array.

    import numpy as np
    @@ -467,7 +490,7 @@ and use the polygon as a selection criterion in an ADQL query.

    -
    <scipy.spatial.qhull.ConvexHull at 0x7f8dec2b8c10>
    +
    <scipy.spatial.qhull.ConvexHull at 0x7f0d570cd700>
     
    @@ -523,6 +546,7 @@ and use the polygon as a selection criterion in an ADQL query.

    +

    This use of transpose is a bit of a NumPy trick. Because pm_vertices has two columns, its transpose has two rows, which are assigned to the two variables pmra_poly and pmdec_poly.

    The following figure shows proper motion in ICRS again, along with the convex hull we just computed.

    @@ -545,9 +569,34 @@ and use the polygon as a selection criterion in an ADQL query.

    -_images/04_select_25_0.png +_images/04_select_28_0.png
    +

    So pm_vertices represents the polygon we want to select. +The next step is to use it as part of an ADQL query.

    +
    +
    +

    Assembling the query

    +

    Here’s the base string we used for the query in the previous lesson.

    +
    +
    +
    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 here are the changes we’ll make in this lesson:

    +
      +
    1. We will add another clause to select stars whose proper motion is in the polygon we just computed, pm_vertices.

    2. +
    3. We will select stars with coordinates in a larger region.

    4. +

    To use pm_vertices as part of an ADQL query, we have to convert it to a string.

    We’ll use flatten to convert from a 2-D array to a 1-D array, and str to convert each element to a string.

    @@ -608,27 +657,8 @@ and use the polygon as a selection criterion in an ADQL query.

    - -
    -

    Selecting the region

    -

    Let’s review how we got to this point.

    -
      -
    1. We made an ADQL query to the Gaia server to get data for stars in the vicinity of GD-1.

    2. -
    3. We transformed to GD1 coordinates so we could select stars along the centerline of GD-1.

    4. -
    5. We plotted the proper motion of the centerline stars to identify the bounds of the overdense region.

    6. -
    7. We made a mask that selects stars whose proper motion is in the overdense region.

    8. -
    -

    The problem is that we downloaded data for more than 100,000 stars and selected only about 1000 of them.

    -

    It will be more efficient if we select on proper motion as part of the query. That will allow us to work with a larger region of the sky in a single query, and download less unneeded data.

    -

    This query will select on the following conditions:

    - -

    The first three conditions are the same as in the previous query. Only the last one is new.

    -

    Here’s the rectangle in the GD-1 frame we’ll select.

    +

    We’ll add this string to the query soon, but first let’s compute the other polygon, the one that specifies the region of the sky we want.

    +

    Here are the coordinates of the rectangle we’ll select, in the GD-1 frame.

    phi1_min = -70
    @@ -658,6 +688,11 @@ and use the polygon as a selection criterion in an ADQL query.

    +
    +
    WARNING: AstropyDeprecationWarning: Transforming a frame instance to a frame class (as opposed to another frame instance) will not be supported in the future.  Either explicitly instantiate the target frame, or first convert the source frame instance to a `astropy.coordinates.SkyCoord` and use its `transform_to()` method. [astropy.coordinates.baseframe]
    +
    +
    +

    To use corners_icrs as part of an ADQL query, we have to convert it to a string. Here’s how we do that, as we saw in the previous lesson.

    @@ -678,11 +713,8 @@ and use the polygon as a selection criterion in an ADQL query.

    -

    Now we have everything we need to assemble the query.

    - -
    -

    Assemble the query

    -

    Here’s the base string we used for the query in the previous lesson.

    +

    Now we have everything we need to assemble the query. +Here’s the base query from the previous lesson again:

    query_base = """SELECT 
    @@ -697,7 +729,9 @@ and use the polygon as a selection criterion in an ADQL query.

    -

    Exercise: Modify query_base by adding a new clause to select stars whose coordinates of proper motion, pmra and pmdec, fall within the polygon defined by pm_point_list.

    +
    +

    Exercise

    +

    Modify query_base by adding a new clause to select stars whose coordinates of proper motion, pmra and pmdec, fall within the polygon defined by pm_point_list.

    # Solution
    @@ -719,12 +753,15 @@ and use the polygon as a selection criterion in an ADQL query.

    Here again are the columns we want to select.

    -
    columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'
    +
    columns = 'source_id, ra, dec, pmra, pmdec, parallax, radial_velocity'
     
    -

    Exercise: Use format to format query_base and define query, filling in the values of columns, point_list, and pm_point_list.

    +
    +
    +

    Exercise

    +

    Use format to format query_base and define query, filling in the values of columns, point_list, and pm_point_list.

    # Solution
    @@ -738,7 +775,7 @@ and use the polygon as a selection criterion in an ADQL query.

    SELECT 
    -source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity
    +source_id, ra, dec, pmra, pmdec, parallax, radial_velocity
     FROM gaiadr2.gaia_source
     WHERE parallax < 1
       AND bp_rp BETWEEN -0.75 AND 2 
    @@ -750,7 +787,7 @@ WHERE parallax < 1
     
    -

    Here’s how we run it.

    +

    Now we can run the query like this:

    from astroquery.gaia import Gaia
    @@ -771,24 +808,22 @@ Created TAP+ (v1.2.1) - Connection:
     	Use HTTPS: True
     	Port: 443
     	SSL Port: 443
    -
    -
    -
    ---------------------------------------------------------------------------
    -HTTPError                                 Traceback (most recent call last)
    -<ipython-input-24-05c718e32682> in <module>
    -      1 from astroquery.gaia import Gaia
    -      2 
    -----> 3 job = Gaia.launch_job_async(query)
    -      4 print(job)
    -
    -~/anaconda3/envs/AstronomicalData/lib/python3.8/site-packages/astroquery/utils/tap/core.py in launch_job_async(self, query, name, output_file, output_format, verbose, dump_to_file, background, upload_resource, upload_table_name, autorun)
    -    422                 self.__connHandler.dump_to_file(suitableOutputFile,
    -    423                                                 response)
    ---> 424             raise requests.exceptions.HTTPError(response.reason)
    -    425         else:
    -    426             location = self.__connHandler.find_header(
    -
    -HTTPError: OK
    +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
    +radial_velocity float64   km / s                                                    Radial velocity  7295
    +Jobid: 1607614394159O
    +Phase: COMPLETED
    +Owner: None
    +Output file: async_20201210103314.vot
    +Results: None
     
    @@ -801,6 +836,12 @@ Created TAP+ (v1.2.1) - Connection:
    +
    +
    7346
    +
    +
    +
    +
    @@ -817,6 +858,9 @@ Created TAP+ (v1.2.1) - Connection:
    +
    +_images/04_select_56_0.png +

    Here we can see why it was useful to transform these coordinates. In ICRS, it is more difficult to identity the stars near the centerline of GD-1.

    So, before we move on to the next step, let’s collect the code we used to transform the coordinates and make a Pandas DataFrame:

    @@ -830,10 +874,10 @@ Created TAP+ (v1.2.1) - Connection: returns: Pandas DataFrame """ skycoord = coord.SkyCoord( - ra=results['ra'], - dec=results['dec'], - pm_ra_cosdec=results['pmra'], - pm_dec=results['pmdec'], + ra=table['ra'], + dec=table['dec'], + pm_ra_cosdec=table['pmra'], + pm_dec=table['pmdec'], distance=8*u.kpc, radial_velocity=0*u.km/u.s) @@ -871,6 +915,9 @@ Created TAP+ (v1.2.1) - Connection: +
    +_images/04_select_62_0.png +

    We’re starting to see GD-1 more clearly.

    We can compare this figure with one of these panels in Figure 1 from the original paper:

    @@ -899,6 +946,11 @@ Created TAP+ (v1.2.1) - Connection: +
    +
    -rw-rw-r-- 1 downey downey 698K Dec 10 19:18 gd1_candidates.hdf5
    +
    +
    +

    If you are using Windows, ls might not work; in that case, try:

    !dir gd1_candidates.hdf5
    @@ -927,6 +979,11 @@ Created TAP+ (v1.2.1) - Connection:
     
    +
    +
    -rw-rw-r-- 1 downey downey 1.4M Dec 10 19:19 gd1_candidates.csv
    +
    +
    +

    The CSV file about 2 times bigger than the HDF5 file (so that’s not that bad, really).

    We can see the first few lines like this:

    @@ -936,6 +993,13 @@ Created TAP+ (v1.2.1) - Connection: +
    +
    ,source_id,ra,dec,pmra,pmdec,parallax,radial_velocity,phi1,phi2,pm_phi1,pm_phi2
    +0,635559124339440000,137.58671691646745,19.1965441084838,-3.770521900009566,-12.490481778113859,0.7913934419894347,,-59.63048941944402,-1.2164852515042963,-7.361362712597496,-0.592632882064492
    +1,635860218726658176,138.5187065217173,19.09233926905897,-5.941679495793577,-11.346409129876392,0.30745551377348623,,-59.247329893833296,-2.016078400820631,-7.527126084640531,1.7487794924176672
    +
    +
    +

    The CSV file contains the names of the columns, but not the data types.

    We can read the CSV file back like this:

    @@ -953,6 +1017,84 @@ Created TAP+ (v1.2.1) - Connection: +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    source_idradecpmrapmdecparallaxradial_velocityphi1phi2pm_phi1pm_phi2
    0635559124339440000137.58671719.196544-3.770522-12.4904820.791393NaN-59.630489-1.216485-7.361363-0.592633
    1635860218726658176138.51870719.092339-5.941679-11.3464090.307456NaN-59.247330-2.016078-7.5271261.748779
    2635674126383965568138.84287419.031798-3.897001-12.7027800.779463NaN-59.133391-2.306901-7.560608-0.741800
    +
    @@ -960,6 +1102,88 @@ Created TAP+ (v1.2.1) - Connection:
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Unnamed: 0source_idradecpmrapmdecparallaxradial_velocityphi1phi2pm_phi1pm_phi2
    00635559124339440000137.58671719.196544-3.770522-12.4904820.791393NaN-59.630489-1.216485-7.361363-0.592633
    11635860218726658176138.51870719.092339-5.941679-11.3464090.307456NaN-59.247330-2.016078-7.5271261.748779
    22635674126383965568138.84287419.031798-3.897001-12.7027800.779463NaN-59.133391-2.306901-7.560608-0.741800
    +

    Notice that the index in candidate_df has become an unnamed column in read_back_csv. The Pandas functions for writing and reading CSV files provide options to avoid that problem, but this is an example of the kind of thing that can go wrong with CSV files.

    diff --git a/05_join.html b/05_join.html index fd56189..656cb38 100644 --- a/05_join.html +++ b/05_join.html @@ -262,6 +262,13 @@ Preparing a table for uploading +
  • @@ -277,6 +284,23 @@ Getting the photometry data +
  • @@ -308,9 +332,9 @@

    Chapter 5

    This is the fifth in a series of notebooks related to astronomy data.

    As a continuing example, we will replicate part of the analysis in a recent paper, “Off the beaten path: Gaia reveals GD-1 stars outside of the main stream” by Adrian M. Price-Whelan and Ana Bonaca.

    -

    Picking up where we left off, the next step in the analysis is to select candidate stars based on photometry. The following figure from the paper is a color-magnitude diagram for the stars selected based on proper motion:

    +

    Picking up where we left off, the next step in the analysis is to select candidate stars based on photometry data. The following figure from the paper is a color-magnitude diagram for the stars selected based on proper motion:

    https://github.com/datacarpentry/astronomy-python/raw/gh-pages/fig/gd1-3.png -

    In red is a theoretical isochrone, showing where we expect the stars in GD-1 to fall based on the metallicity and age of their original globular cluster.

    +

    In red is a stellar isochrone, showing where we expect the stars in GD-1 to fall based on the metallicity and age of their original globular cluster.

    By selecting stars in the shaded area, we can further distinguish the main sequence of GD-1 from younger background stars.

    Outline

    @@ -369,7 +393,7 @@
    -_images/05_join_9_0.png +_images/05_join_10_0.png

    This is the same figure we saw at the end of the previous notebook. GD-1 is visible against the background stars, but we will be able to see it more clearly after selecting based on photometry data.

    @@ -450,7 +474,7 @@ We could write the entire table to a file, but that would take longer to transmi
    <?xml version="1.0" encoding="utf-8"?>
    -<!-- Produced with astropy.io.votable version 4.0.2
    +<!-- Produced with astropy.io.votable version 4.2
          http://www.astropy.org/ -->
     <VOTABLE version="1.4" xmlns="http://www.ivoa.net/xml/VOTable/v1.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.ivoa.net/xml/VOTable/v1.4">
      <RESOURCE type="results">
    @@ -475,7 +499,7 @@ The size of the file is about 750 KB, so that’s not too bad.

    -
    -rw-rw-r-- 1 downey downey 396K Nov 18 19:21 candidate_df.xml
    +
    -rw-rw-r-- 1 downey downey 396K Dec 10 11:33 candidate_df.xml
     
    @@ -484,7 +508,9 @@ The size of the file is about 750 KB, so that’s not too bad.

    !dir candidate_df.xml
     
    -

    Exercise: There’s a gotcha here we want to warn you about. Why do you think we used double brackets to specify the column we wanted? What happens if you use single brackets?

    +
    +

    Exercise

    +

    There’s a gotcha here we want to warn you about. Why do you think we used double brackets to specify the column we wanted? What happens if you use single brackets?

    Run these cells to find out.

    @@ -514,12 +540,15 @@ The size of the file is about 750 KB, so that’s not too bad.

    -
    # writeto(column, 'candidate_df.xml')
    +
    # This line is commented out because it would cause an error
    +
    +# writeto(column, 'candidate_df.xml')
     
    +

    Uploading a table

    The next step is to upload this table to the Gaia server and use it as part of a query.

    @@ -575,7 +604,7 @@ INFO: Query finished. [astroquery.utils.tap.core]
    Table length=7346 - +
    @@ -637,7 +666,7 @@ INFO: Query finished. [astroquery.utils.tap.core]
    query1 = """SELECT *
     FROM gaiadr2.panstarrs1_best_neighbour as best
     JOIN tap_upload.candidate_df as candidate_df
    -ON best.source_id = candidate_df.source_id
    +  ON best.source_id = candidate_df.source_id
     """
     
    @@ -676,7 +705,7 @@ INFO: Query finished. [astroquery.utils.tap.core]
    Table length=3724 -
    source_id
    int64
    635559124339440000
    +
    @@ -723,7 +752,7 @@ INFO: Query finished. [astroquery.utils.tap.core]

    Because one of the column names appears in both tables, the second instance of source_id has been appended with the suffix _2.

    -

    The length of the results table is about 2000, which means we were not able to find matches for all stars in the list of candidate_df.

    +

    The length of results1 is about 3000, which means we were not able to find matches for all stars in the list of candidates.

    len(results1)
    @@ -737,42 +766,92 @@ INFO: Query finished. [astroquery.utils.tap.core]
     

    To get more information about the matching process, we can inspect best_neighbour_multiplicity, which indicates for each star in Gaia how many stars in Pan-STARRS are equally likely matches.

    -

    For this kind of data exploration, we’ll convert a column from the table to a Pandas Series so we can use value_counts, which counts the number of times each value appears in a Series, like a histogram.

    +
    +
    +
    results1['best_neighbour_multiplicity']
    +
    +
    +
    +
    +
    <MaskedColumn name='best_neighbour_multiplicity' dtype='int16' description='Number of neighbours with same probability as best neighbour' length=3724> +
    source_idoriginal_ext_source_idangular_distancenumber_of_neighboursnumber_of_matesbest_neighbour_multiplicitygaia_astrometric_paramssource_id_2
    arcsec
    int64int64float64int32int16int16int16int64
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    ...
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    +
    +

    It looks like most of the values are 1, which is good; that means that for each candidate star we have identified exactly one source in Pan-STARRS that is likely to be the same star.

    +

    To check whether there are any values other than 1, we can convert this column to a Pandas Series and use describe, which we saw in in Lesson 3.

    import pandas as pd
     
    -nn = pd.Series(results1['best_neighbour_multiplicity'])
    -nn.value_counts()
    +multiplicity = pd.Series(results1['best_neighbour_multiplicity'])
    +multiplicity.describe()
     
    -
    1    3724
    -dtype: int64
    +
    count    3724.0
    +mean        1.0
    +std         0.0
    +min         1.0
    +25%         1.0
    +50%         1.0
    +75%         1.0
    +max         1.0
    +dtype: float64
     
    -

    The result shows that 1 is the only value in the Series, appearing xxx times.

    -

    That means that in every case where a match was found, the matching algorithm identified a single neighbor as the most likely match.

    -

    Similarly, number_of_mates indicates the number of other stars in Gaia that match with the same star in Pan-STARRS.

    +

    In fact, 1 is the only value in the Series, so every candidate star has a single best match.

    +

    Similarly, number_of_mates indicates the number of other stars in Gaia that match with the same star in Pan-STARRS.

    -
    nm = pd.Series(results1['number_of_mates'])
    -nm.value_counts()
    +
    mates = pd.Series(results1['number_of_mates'])
    +mates.describe()
     
    -
    0    3724
    -dtype: int64
    +
    count    3724.0
    +mean        0.0
    +std         0.0
    +min         0.0
    +25%         0.0
    +50%         0.0
    +75%         0.0
    +max         0.0
    +dtype: float64
     
    -

    For this set of candidate_df, almost all of the stars we’ve selected from Pan-STARRS are only matched with a single star in the Gaia catalog.

    -

    Detail The table also contains number_of_neighbors which is the number of stars in Pan-STARRS that match in terms of position, before using other critieria to choose the most likely match.

    +

    All values in this column are 0, which means that for each match we found in Pan-STARRS, there are no other stars in Gaia that also match.

    +

    Detail: The table also contains number_of_neighbors which is the number of stars in Pan-STARRS that match in terms of position, before using other criteria to choose the most likely match.

    Getting the photometry data

    @@ -785,7 +864,9 @@ dtype: int64
  • Run the query using the uploaded table.

  • Since we’ve done everything here before, we’ll do these steps as an exercise.

    -

    Exercise: Select source_id and original_ext_source_id from results1 and write the resulting table as a file named external.xml.

    +
    +

    Exercise

    +

    Select source_id and original_ext_source_id from results1 and write the resulting table as a file named external.xml.

    # Solution
    @@ -805,7 +886,7 @@ dtype: int64
     
    <?xml version="1.0" encoding="utf-8"?>
    -<!-- Produced with astropy.io.votable version 4.0.2
    +<!-- Produced with astropy.io.votable version 4.2
          http://www.astropy.org/ -->
     <VOTABLE version="1.4" xmlns="http://www.ivoa.net/xml/VOTable/v1.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.ivoa.net/xml/VOTable/v1.4">
      <RESOURCE type="results">
    @@ -818,7 +899,10 @@ dtype: int64
     
    -

    Exercise: Read the documentation of the Pan-STARRS table and make note of obj_id, which contains the object IDs we’ll use to find the rows we want.

    +
    +
    +

    Exercise

    +

    Read the documentation of the Pan-STARRS table and make note of obj_id, which contains the object IDs we’ll use to find the rows we want.

    Write a query that uses each value of original_ext_source_id from the uploaded table to find a row in gaiadr2.panstarrs1_original_valid with the same value in obj_id, and select all columns from both tables.

    Suggestion: Develop and test your query incrementally. For example:

      @@ -837,67 +921,39 @@ dtype: int64
      # Solution
       
      +# First test
      +
       query2 = """SELECT *
       FROM tap_upload.external as external
       """
      -
      -
      -
      -
    -
    -
    -
    # Solution
    +
    +# Second test
     
     query2 = """SELECT TOP 10 *
     FROM gaiadr2.panstarrs1_original_valid
     """
    -
    -
    -
    -
    -
    -
    -
    # Solution
    +
    +# Third test
     
     query2 = """SELECT *
     FROM gaiadr2.panstarrs1_original_valid as ps
     JOIN tap_upload.external as external
    -ON ps.obj_id = external.original_ext_source_id
    +  ON ps.obj_id = external.original_ext_source_id
     """
    -
    -
    -
    -
    -
    -
    -
    # Solution
    +
    +# Complete query
     
     query2 = """SELECT
     external.source_id, ps.g_mean_psf_mag, ps.i_mean_psf_mag
     FROM gaiadr2.panstarrs1_original_valid as ps
     JOIN tap_upload.external as external
    -ON ps.obj_id = external.original_ext_source_id
    +  ON ps.obj_id = external.original_ext_source_id
     """
     
    -
    -
    -
    print(query2)
    -
    -
    -
    -
    -
    SELECT
    -external.source_id, ps.g_mean_psf_mag, ps.i_mean_psf_mag
    -FROM gaiadr2.panstarrs1_original_valid as ps
    -JOIN tap_upload.external as external
    -ON ps.obj_id = external.original_ext_source_id
    -
    -
    -
    -
    +

    Here’s how we launch the job and get the results.

    job2 = Gaia.launch_job_async(query=query2, 
    @@ -921,7 +977,7 @@ ON ps.obj_id = external.original_ext_source_id
     
    Table length=3724 - +
    @@ -947,9 +1003,65 @@ ON ps.obj_id = external.original_ext_source_id
    source_idg_mean_psf_magi_mean_psf_mag
    mag
    int64float64float64
    61225641850042316820.871599197387719.9612007141113
    -

    Challenge exercise

    -

    Do both joins in one query.

    +
    +
    +

    Exercise

    +

    Optional Challenge: Do both joins in one query.

    There’s an example here you could start with.

    +
    +
    +
    # Solution
    +
    +query3 = """SELECT
    +candidate_df.source_id, ps.g_mean_psf_mag, ps.i_mean_psf_mag
    +FROM tap_upload.candidate_df as candidate_df
    +JOIN gaiadr2.panstarrs1_best_neighbour as best
    +  ON best.source_id = candidate_df.source_id
    +JOIN gaiadr2.panstarrs1_original_valid as ps
    +  ON ps.obj_id = best.original_ext_source_id
    +"""
    +
    +job3 = Gaia.launch_job_async(query=query3, 
    +                       upload_resource='candidate_df.xml', 
    +                       upload_table_name='candidate_df')
    +
    +results3 = job3.get_results()
    +results3
    +
    +
    +
    +
    +
    INFO: Query finished. [astroquery.utils.tap.core]
    +
    +
    +
    Table length=3724 + + + + + + + + + + + + + + + + + + + + + + + + +
    source_idg_mean_psf_magi_mean_psf_mag
    mag
    int64float64float64
    63586021872665817617.897800445556617.5174007415771
    63567412638396556819.287300109863317.6781005859375
    63553545477498304016.923799514770516.478099822998
    63549727681031360019.924200057983418.3339996337891
    63561416864013286416.151599884033214.6662998199463
    63559860797436979216.522399902343816.1375007629395
    63573766183549657614.503299713134813.9849004745483
    63585094589274867216.517499923706116.0450000762939
    63560053211971366420.450599670410219.5177001953125
    .........
    61224178124912460820.234399795532218.6518001556396
    61233214736144307221.384899139404320.3076000213623
    61242674401680243217.828100204467817.4281005859375
    61233173934034176021.865699768066419.5223007202148
    61228273805826496022.515199661254919.9743995666504
    61238633266869760019.379299163818417.9923000335693
    61229617271781862417.494400024414116.926700592041
    61225037548010176015.333000183105514.6280002593994
    61239492689915916816.441400527954115.8212003707886
    61225641850042316820.871599197387719.9612007141113
    +
    +

    Write the data

    @@ -970,7 +1082,7 @@ ON ps.obj_id = external.original_ext_source_id
    -
    -rw-rw-r-- 1 downey downey 96K Nov 18 19:22 gd1_photo.fits
    +
    -rw-rw-r-- 1 downey downey 96K Dec 10 11:34 gd1_photo.fits
     
    diff --git a/06_photo.html b/06_photo.html index 07dfa32..a583055 100644 --- a/06_photo.html +++ b/06_photo.html @@ -259,8 +259,8 @@
  • - - Drawing a polygon + + Making a polygon
  • @@ -324,16 +324,17 @@

    This is the sixth in a series of notebooks related to astronomy data.

    As a continuing example, we will replicate part of the analysis in a recent paper, “Off the beaten path: Gaia reveals GD-1 stars outside of the main stream” by Adrian M. Price-Whelan and Ana Bonaca.

    In the previous lesson we downloaded photometry data from Pan-STARRS, which is available from the same server we’ve been using to get Gaia data.

    -

    The next step in the analysis is to select candidate stars based on the photometry data. The following figure from the paper is a color-magnitude diagram for the stars selected based on proper motion:

    +

    The next step in the analysis is to select candidate stars based on the photometry data.
    +The following figure from the paper is a color-magnitude diagram showing the stars we previously selected based on proper motion:

    https://github.com/datacarpentry/astronomy-python/raw/gh-pages/fig/gd1-3.png

    In red is a theoretical isochrone, showing where we expect the stars in GD-1 to fall based on the metallicity and age of their original globular cluster.

    -

    By selecting stars in the shaded area, we can further distinguish the main sequence of GD-1 from younger background stars.

    +

    By selecting stars in the shaded area, we can further distinguish the main sequence of GD-1 from mostly younger background stars.

    Outline

    Here are the steps in this notebook:

    1. We’ll reload the data from the previous notebook and make a color-magnitude diagram.

    2. -
    3. Then we’ll specify a polygon in the diagram that contains stars with the photometry we expect.

    4. +
    5. We’ll use an isochrone computed by MIST to specify a polygonal region in the color-magnitude diagram and select the stars inside it.

    6. Then we’ll merge the photometry data with the list of candidate stars, storing the result in a Pandas DataFrame.

    After completing this lesson, you should be able to

    @@ -379,6 +380,8 @@

    Stars with lower values of (g-i) are brighter in g-band than in i-band, compared to other stars, which means they are bluer.

    Stars in the lower-left quadrant of this diagram are less bright and less metallic than the others, which means they are likely to be older.

    Since we expect the stars in GD-1 to be older than the background stars, the stars in the lower-left are more likely to be in GD-1.

    +

    The following function takes a table containing photometry data and draws a color-magnitude diagram. +The input can be an Astropy Table or Pandas DataFrame, as long as it has columns named g_mean_psf_mag and i_mean_psf_mag.

    import matplotlib.pyplot as plt
    @@ -422,52 +425,40 @@
     
    -_images/06_photo_12_0.png +_images/06_photo_14_0.png

    Our figure does not look exactly like the one in the paper because we are working with a smaller region of the sky, so we don’t have as many stars. But we can see an overdense region in the lower left that contains stars with the photometry we expect for GD-1.

    -

    The authors of the original paper derive a detailed polygon that defines a boundary between stars that are likely to be in GD-1 or not.

    -

    As a simplification, we’ll choose a boundary by eye that seems to contain the overdense region.

    +

    In the next section we’ll use an isochrone to specify a polygon that contains this overdense regioin.

    Isochrone

    -

    http://waps.cfa.harvard.edu/MIST/interp_isos.html

    -

    MIST Version 1.2

    -

    Rotation initial v/v_crit = 0.4

    -

    Single age, log10 scale = 10.079

    -

    Composition [Fe/H] = -1.35

    -

    Synthetic Photometry, PanStarrs

    -

    Extinction av = 0

    +

    Based on our best estimates for the ages of the stars in GD-1 and their metallicity, we can compute a stellar isochrone that predicts the relationship between their magnitude and color.

    +

    In fact, we can use MESA Isochrones & Stellar Tracks (MIST) to compute it for us.

    +

    Using the MIST Version 1.2 web interface, we computed an isochrone with the following parameters:

    +
      +
    • Rotation initial v/v_crit = 0.4

    • +
    • Single age, linear scale = 12e9

    • +
    • Composition [Fe/H] = -1.35

    • +
    • Synthetic Photometry, PanStarrs

    • +
    • Extinction av = 0

    • +
    +

    The following cell downloads the results:

    -
    import numpy as np
    +
    import os
    +from wget import download
     
    -log_age = np.log10(12e9)
    -log_age
    -
    -
    -
    -
    -
    10.079181246047625
    -
    -
    -
    -
    -
    -
    -
    import numpy as np
    +filename = 'MIST_iso_5fd2532653c27.iso.cmd'
    +filepath = 'https://github.com/AllenDowney/AstronomicalData/raw/main/data/'
     
    -log_age = np.log10(15e9)
    -log_age
    -
    -
    -
    -
    -
    10.176091259055681
    +if not os.path.exists(filename):
    +    print(download(filepath+filename))
     
    +

    To read this file we’ll download a Python module from this repository.

    import os
    @@ -482,21 +473,23 @@
     
    +

    Now we can read the file:

    import read_mist_models
     
    -filename = 'mist_iso_12.0_-1.35.cmd'
    +filename = 'MIST_iso_5fd2532653c27.iso.cmd'
     iso = read_mist_models.ISOCMD(filename)
     
    -
    Reading in: mist_iso_12.0_-1.35.cmd
    +
    Reading in: MIST_iso_5fd2532653c27.iso.cmd
     
    +

    The result is an ISOCMD object.

    type(iso)
    @@ -509,6 +502,7 @@
     
    +

    It contains a list of arrays, one for each isochrone.

    type(iso.isocmds)
    @@ -521,6 +515,7 @@
     
    +

    We only got one isochrone.

    len(iso.isocmds)
    @@ -533,9 +528,18 @@
     
    +

    So we can select it like this:

    -
    type(iso.isocmds[0])
    +
    iso_array = iso.isocmds[0]
    +
    +
    +
    +
    +

    It’s a NumPy array:

    +
    +
    +
    type(iso_array)
     
    @@ -545,75 +549,70 @@
    +

    But it’s an unusual NumPy array, because it contains names for the columns.

    -
    iso.isocmds[0].dtype
    +
    iso_array.dtype
     
    -
    dtype([('EEP', '<i4'), ('log10_isochrone_age_yr', '<f8'), ('initial_mass', '<f8'), ('star_mass', '<f8'), ('log_Teff', '<f8'), ('log_g', '<f8'), ('log_L', '<f8'), ('[Fe/H]_init', '<f8'), ('[Fe/H]', '<f8'), ('PS_g', '<f8'), ('PS_r', '<f8'), ('PS_i', '<f8'), ('PS_z', '<f8'), ('PS_y', '<f8'), ('PS_w', '<f8'), ('PS_open', '<f8'), ('phase', '<f8')])
    +
    dtype([('EEP', '<i4'), ('isochrone_age_yr', '<f8'), ('initial_mass', '<f8'), ('star_mass', '<f8'), ('log_Teff', '<f8'), ('log_g', '<f8'), ('log_L', '<f8'), ('[Fe/H]_init', '<f8'), ('[Fe/H]', '<f8'), ('PS_g', '<f8'), ('PS_r', '<f8'), ('PS_i', '<f8'), ('PS_z', '<f8'), ('PS_y', '<f8'), ('PS_w', '<f8'), ('PS_open', '<f8'), ('phase', '<f8')])
    +
    +
    +
    +
    +

    Which means we can select columns using the bracket operator:

    +
    +
    +
    iso_array['phase']
    +
    +
    +
    +
    +
    array([0., 0., 0., ..., 6., 6., 6.])
    +
    +
    +
    +
    +

    We can use phase to select the part of the isochrone for stars in the main sequence and red giant phases.

    +
    +
    +
    phase_mask = (iso_array['phase'] >= 0) & (iso_array['phase'] < 3)
    +phase_mask.sum()
    +
    +
    +
    +
    +
    354
     
    -
    from astropy.table import Table 
    -
    -iso_table = Table(iso.isocmds[0])
    -iso_table[:5]
    +
    main_sequence = iso_array[phase_mask]
    +len(main_sequence)
     
    -
    Table length=5 - - - - - - - - -
    EEPlog10_isochrone_age_yrinitial_massstar_masslog_Tefflog_glog_L[Fe/H]_init[Fe/H]PS_gPS_rPS_iPS_zPS_yPS_wPS_openphase
    int32float64float64float64float64float64float64float64float64float64float64float64float64float64float64float64float64
    25110.0790.105870850108208960.105869705589364823.54036068292639565.321292252841703-2.7463861921790302-1.35-1.30902413.83327812.39528311.63853511.28630911.09987712.30464511.9700720.0
    25210.0790.108809974798175170.108808758217223443.54258290625209735.312318300317242-2.7181724188486394-1.35-1.30888713.72806512.30235811.56230511.21656411.03057212.22069511.8916950.0
    25310.0790.112652468448451230.112651153162689773.54551901495962075.300571015130943-2.6811483213239216-1.35-1.308713.59011312.18069911.46111311.12465910.93905112.11006911.7887120.0
    25410.0790.116427328711895660.116425909285919643.54840384284145665.288998772212527-2.644742589781073-1.35-1.30852713.45454412.06139811.36112811.03319410.84876912.00072911.6869940.0
    25510.0790.120222397889611750.120220866480104383.5513078778592485.277331450307816-2.608093791390564-1.35-1.30828513.3183711.9418211.26008710.94010610.75770811.8903111.5842020.0
    -
    -
    -
    -
    iso_table.colnames
    -
    -
    -
    -
    -
    ['EEP',
    - 'log10_isochrone_age_yr',
    - 'initial_mass',
    - 'star_mass',
    - 'log_Teff',
    - 'log_g',
    - 'log_L',
    - '[Fe/H]_init',
    - '[Fe/H]',
    - 'PS_g',
    - 'PS_r',
    - 'PS_i',
    - 'PS_z',
    - 'PS_y',
    - 'PS_w',
    - 'PS_open',
    - 'phase']
    +
    354
     
    +

    The other two columns we’ll use are PS_g and PS_i, which contain simulated photometry data for stars with the given age and metallicity, based on a model of the Pan-STARRS sensors.

    +

    We’ll use these columns to superimpose the isochrone on the color-magnitude diagram, but first we have to use a distance modulus to scale the isochrone based on the estimated distance of GD-1.

    +

    We can use the Distance object from Astropy to compute the distance modulus.

    import astropy.coordinates as coord
     import astropy.units as u
     
     distance = 7.8 * u.kpc
    -dm = coord.Distance(distance).distmod.value
    -dm
    +distmod = coord.Distance(distance).distmod.value
    +distmod
     
    @@ -623,254 +622,609 @@
    +

    Now we can compute the scaled magnitude and color of the isochrone.

    -
    g = iso_table['PS_g'] + dm
    -gi = iso_table['PS_g'] - iso_table['PS_i']
    +
    g = main_sequence['PS_g'] + distmod
    +gi = main_sequence['PS_g'] - main_sequence['PS_i']
     
    +

    To make this data easier to work with, we’ll put it in a Pandas Series with that contains gi as the index and g as the values.

    -
    import matplotlib.pyplot as plt
    +
    import pandas as pd
     
    -plot_cmd(photo_table)
    -plt.plot(gi, g)
    +iso_series = pd.Series(g, index=gi)
    +iso_series.head()
     
    -
    [<matplotlib.lines.Line2D at 0x7efd97389fd0>]
    -
    -
    -_images/06_photo_28_1.png -
    -
    -
    -
    -
    def read_and_clean_cmd(filename, distance):
    -    iso = read_mist_models.ISOCMD(filename)
    -    iso_table = Table(iso.isocmds[0])
    -
    -    phase_mask = (iso_table['phase'] >= 0) & (iso_table['phase'] < 3)
    -    table = iso_table[phase_mask]
    -    
    -    dm = coord.Distance(distance).distmod.value
    -    g = iso_table['PS_g'] + dm
    -    gi = iso_table['PS_g'] - iso_table['PS_i']
    -    
    -    return gi, g
    +
    2.195021    28.294743
    +2.166076    28.189718
    +2.129312    28.051761
    +2.093721    27.916194
    +2.058585    27.780024
    +dtype: float64
     
    -
    -
    -
    filename = 'mist_iso_12.0_-1.35.cmd'
    -
    -gi1, g1 = read_and_clean_cmd(filename, distance)
    -
    -
    -
    -
    -
    Reading in: mist_iso_12.0_-1.35.cmd
    -
    -
    -
    -
    -
    -
    -
    filename = 'mist_iso_15.0_-1.35.cmd'
    -
    -gi2, g2 = read_and_clean_cmd(filename, distance)
    -
    -
    -
    -
    -
    Reading in: mist_iso_15.0_-1.35.cmd
    -
    -
    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    -
    -plot_cmd(photo_table)
    -plt.plot(gi1, g1)
    -plt.plot(gi2, g2)
    -
    -
    -
    -
    -
    [<matplotlib.lines.Line2D at 0x7efd9703c550>]
    -
    -
    -_images/06_photo_32_1.png -
    -
    -
    -
    -
    left_gi = gi - 0.5*(g/28)**5
    -right_gi = gi + 0.55*(g/28)**5
    -
    -
    -
    -
    -
    -
    -
    import matplotlib.pyplot as plt
    -
    -plot_cmd(photo_table)
    -plt.plot(gi1, g1)
    -plt.plot(gi2, g2)
    -
    -
    -
    -
    -
    [<matplotlib.lines.Line2D at 0x7efd97a51b80>]
    -
    -
    -_images/06_photo_34_1.png -
    -
    -
    -
    -
    # TODO
    -# ind = (poly[:,1]<21.) & (poly[:,1]>17.8)
    -
    -
    -
    -
    -
    -
    -

    Drawing a polygon

    -

    Matplotlib provides a function called ginput that lets us click on the figure and make a list of coordinates.

    -

    It’s a little tricky to use ginput in a Jupyter notebook.
    -Before calling plt.ginput we have to tell Matplotlib to use TkAgg to draw the figure in a new window.

    -

    When you run the following cell, a figure should appear in a new window. Click on it 10 times to draw a polygon around the overdense area. A red cross should appear where you click.

    -
    -
    -
    import matplotlib as mpl
    -
    -coords = None
    -
    -if not IN_COLAB:
    -    mpl.use('TkAgg')
    -    plot_cmd(photo_table)
    -    coords = plt.ginput(10)
    -    mpl.use('agg')
    -
    -
    -
    -
    -

    The argument to ginput is the number of times the user has to click on the figure.

    -

    The result from ginput is a list of coordinate pairs.

    -
    -
    -
    coords
    -
    -
    -
    -
    -
    [(0.2643369175627239, 17.84253127299485),
    - (0.3539426523297491, 18.799116997792495),
    - (0.47491039426523296, 19.682119205298015),
    - (0.6317204301075269, 20.454746136865342),
    - (0.7661290322580645, 20.785871964679913),
    - (0.8064516129032258, 21.41133186166299),
    - (0.5869175627240143, 21.300956585724798),
    - (0.39426523297491034, 20.565121412803535),
    - (0.22401433691756267, 19.240618101545255),
    - (0.19713261648745517, 18.02649006622517)]
    -
    -
    -
    -
    -

    If ginput doesn’t work for you, you could use the following coordinates.

    -
    -
    -
    if coords is None:
    -    coords = [(0.2, 17.5), 
    -              (0.2, 19.5), 
    -              (0.65, 22),
    -              (0.75, 21),
    -              (0.4, 19),
    -              (0.4, 17.5)]
    -
    -
    -
    -
    -

    The next step is to convert the coordinates to a format we can use to plot them, which is a sequence of x coordinates and a sequence of y coordinates. The NumPy function transpose does what we want.

    -
    -
    -
    import numpy as np
    -
    -xs, ys = np.transpose(coords)
    -xs, ys
    -
    -
    -
    -
    -
    (array([0.26433692, 0.35394265, 0.47491039, 0.63172043, 0.76612903,
    -        0.80645161, 0.58691756, 0.39426523, 0.22401434, 0.19713262]),
    - array([17.84253127, 18.799117  , 19.68211921, 20.45474614, 20.78587196,
    -        21.41133186, 21.30095659, 20.56512141, 19.2406181 , 18.02649007]))
    -
    -
    -
    -
    -

    To display the polygon, we’ll draw the figure again and use plt.plot to draw the polygon.

    +

    Now we can plot it on the color-magnitude diagram like this.

    plot_cmd(photo_table)
    -plt.plot(xs, ys);
    +iso_series.plot();
     
    -_images/06_photo_45_0.png +_images/06_photo_46_0.png
    -

    If it looks like your polygon does a good job surrounding the overdense area, go on to the next section. Otherwise you can try again.

    -

    If you want a polygon with more points (or fewer), you can change the argument to ginput.

    -

    The polygon does not have to be “closed”. When we use this polygon in the next section, the last and first points will be connected by a straight line.

    +

    The theoretical isochrone passes through the overdense region where we expect to find stars in GD-1.

    +

    Let’s save this result so we can reload it later without repeating the steps in this section.

    +
    +
    +
    filename = 'gd1_isochrone.hdf5'
    +
    +iso_series.to_hdf(filename, 'iso_series')
    +
    +
    +
    +
    +
    +
    +

    Making a polygon

    +

    The following cell downloads the isochrone series we made in the previous section, if necessary.

    +
    +
    +
    import os
    +from wget import download
    +
    +filename = 'gd1_isochrone.hdf5'
    +filepath = 'https://github.com/AllenDowney/AstronomicalData/raw/main/data/'
    +
    +if not os.path.exists(filename):
    +    print(download(filepath+filename))
    +
    +
    +
    +
    +

    Now we can read the isochrone back in.

    +
    +
    +
    iso_series = pd.read_hdf(filename, 'iso_series')
    +iso_series.head()
    +
    +
    +
    +
    +
    2.195021    28.294743
    +2.166076    28.189718
    +2.129312    28.051761
    +2.093721    27.916194
    +2.058585    27.780024
    +dtype: float64
    +
    +
    +
    +
    +

    To select the stars in the overdense region of the color-magnitude diagram, we want to stretch the isochrone into a polygon.

    +

    We’ll use the following formulas to compute the left and right sides of the polygons.

    +
    +
    +
    g = iso_series.to_numpy()
    +gi = iso_series.index
    +
    +
    +
    +
    +
    +
    +
    left_gi = gi - 0.4 * (g/28)**5
    +right_gi = gi + 0.7 * (g/28)**5
    +
    +
    +
    +
    +

    To explain the terms:

    +
      +
    • We divide magnitudes by 28 to normalize them onto the range from 0 to 1.

    • +
    • Raising the normalized magnitudes to the 5th power [DOES WHAT?]

    • +
    • Then we add and subtract the result from gi to shift the isochrone left and right. The factors 0.4 and 0.7 were chosen by eye to enclose the overdense region.

    • +
    +

    To make the shifted isochrones easier to work with, we’ll put them in a Pandas Series with that contains both g and the scaled values of gi.

    +
    +
    +
    import pandas as pd
    +
    +left_series = pd.Series(g, index=left_gi)
    +left_series.head()
    +
    +
    +
    +
    +
    1.773520    28.294743
    +1.752340    28.189718
    +1.725601    28.051761
    +1.699671    27.916194
    +1.674053    27.780024
    +dtype: float64
    +
    +
    +
    +
    +
    +
    +
    right_series = pd.Series(g, index=right_gi)
    +right_series.head()
    +
    +
    +
    +
    +
    2.932648    28.294743
    +2.890114    28.189718
    +2.835806    28.051761
    +2.783308    27.916194
    +2.731517    27.780024
    +dtype: float64
    +
    +
    +
    +
    +

    Now we can plot them on the color-magnitude diagram like this.

    +
    +
    +
    plot_cmd(photo_table)
    +left_series.plot()
    +right_series.plot();
    +
    +
    +
    +
    +_images/06_photo_61_0.png +
    +
    +

    It looks like the scaled isochrones bound the overdense area well, but they also include stars with magnitudes higher than we expect for stars in GD-1, so we’ll use another mask to limit the range of g.

    +
    +
    +
    g_mask = (g > 18.0) & (g < 21.5)
    +g_mask.sum()
    +
    +
    +
    +
    +
    117
    +
    +
    +
    +
    +
    +
    +
    left = left_series[g_mask]
    +right = right_series[g_mask]
    +
    +len(left), len(right)
    +
    +
    +
    +
    +
    (117, 117)
    +
    +
    +
    +
    +

    Here’s what they look like:

    +
    +
    +
    plot_cmd(photo_table)
    +left.plot()
    +right.plot();
    +
    +
    +
    +
    +_images/06_photo_66_0.png +
    +
    +

    Now we want to assemble the two halves into a polygon. We can use append to make a new Series that contains both halves.

    +

    And we’ll use the slice [::-1] to reverse the elements of right so the result forms a loop. See here for an explanation of this idiom.

    +
    +
    +
    loop = left.append(right[::-1])
    +loop.head()
    +
    +
    +
    +
    +
    0.587571    21.411746
    +0.567801    21.322466
    +0.548134    21.233380
    +0.528693    21.144427
    +0.509300    21.054549
    +dtype: float64
    +
    +
    +
    +
    +

    The following lines add metadata by assigning names to the values and the index in loop.

    +
    +
    +
    loop.name = 'g'
    +loop.index.name = 'gi'
    +loop.head()
    +
    +
    +
    +
    +
    gi
    +0.587571    21.411746
    +0.567801    21.322466
    +0.548134    21.233380
    +0.528693    21.144427
    +0.509300    21.054549
    +Name: g, dtype: float64
    +
    +
    +
    +
    +

    And here’s what it looks like

    +
    +
    +
    loop.plot()
    +plot_cmd(photo_table)
    +
    +
    +
    +
    +_images/06_photo_72_0.png +
    +
    +

    Next we’ll use this polygon to identify stars in the overdense region.

    Which points are in the polygon?

    -

    Matplotlib provides a Path object that we can use to check which points fall in the polygon we selected.

    -

    Here’s how we make a Path using a list of coordinates.

    +

    Matplotlib provides a Path object that we can use to check which points fall in the polygon we just constructed.

    +

    To make a Path, we need a list of coordinates in the form of an array with two columns.

    +

    Currently loop is a Series with the values of gi in the index:

    +
    +
    +
    loop.head()
    +
    +
    +
    +
    +
    gi
    +0.587571    21.411746
    +0.567801    21.322466
    +0.548134    21.233380
    +0.528693    21.144427
    +0.509300    21.054549
    +Name: g, dtype: float64
    +
    +
    +
    +
    +

    We can move them out of the index into a column using reset_index:

    +
    +
    +
    loop_df = loop.reset_index()
    +loop_df.head()
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    gig
    00.58757121.411746
    10.56780121.322466
    20.54813421.233380
    30.52869321.144427
    40.50930021.054549
    +
    +
    +

    The result is a DataFrame with one column for gi and one column for g, so we can pass it to Path like this:

    from matplotlib.path import Path
     
    -path = Path(coords)
    +path = Path(loop_df)
     path
     
    -
    Path(array([[ 0.26433692, 17.84253127],
    -       [ 0.35394265, 18.799117  ],
    -       [ 0.47491039, 19.68211921],
    -       [ 0.63172043, 20.45474614],
    -       [ 0.76612903, 20.78587196],
    -       [ 0.80645161, 21.41133186],
    -       [ 0.58691756, 21.30095659],
    -       [ 0.39426523, 20.56512141],
    -       [ 0.22401434, 19.2406181 ],
    -       [ 0.19713262, 18.02649007]]), None)
    +
    Path(array([[ 0.58757135, 21.41174601],
    +       [ 0.56780097, 21.32246601],
    +       [ 0.54813409, 21.23338001],
    +       [ 0.5286928 , 21.14442701],
    +       [ 0.50929987, 21.05454901],
    +       [ 0.48991266, 20.96383501],
    +       [ 0.47084777, 20.87386601],
    +       [ 0.45222635, 20.78511001],
    +       [ 0.43438902, 20.69865301],
    +       [ 0.42745198, 20.66469601],
    +       [ 0.42067029, 20.63135301],
    +       [ 0.41402867, 20.59850601],
    +       [ 0.40738016, 20.56529901],
    +       [ 0.40088387, 20.53264001],
    +       [ 0.39449608, 20.50023501],
    +       [ 0.38843797, 20.46871801],
    +       [ 0.38251577, 20.43765101],
    +       [ 0.3766547 , 20.40653701],
    +       [ 0.37088531, 20.37564701],
    +       [ 0.36522325, 20.34505401],
    +       [ 0.35962415, 20.31443001],
    +       [ 0.35413292, 20.28413501],
    +       [ 0.34871894, 20.25390101],
    +       [ 0.34339273, 20.22385701],
    +       [ 0.33815825, 20.19395801],
    +       [ 0.33305724, 20.16427301],
    +       [ 0.32820637, 20.13508501],
    +       [ 0.32348139, 20.10604901],
    +       [ 0.31883343, 20.07716101],
    +       [ 0.31425423, 20.04833101],
    +       [ 0.30974976, 20.01961701],
    +       [ 0.30531997, 19.99097001],
    +       [ 0.30097354, 19.96246401],
    +       [ 0.29669999, 19.93401801],
    +       [ 0.29250157, 19.90573101],
    +       [ 0.28837983, 19.87746501],
    +       [ 0.28441584, 19.84955001],
    +       [ 0.28065057, 19.82188301],
    +       [ 0.27700644, 19.79450101],
    +       [ 0.27342328, 19.76713801],
    +       [ 0.26989305, 19.73985301],
    +       [ 0.26641258, 19.71265801],
    +       [ 0.26298257, 19.68540001],
    +       [ 0.25960216, 19.65824401],
    +       [ 0.2562733 , 19.63113701],
    +       [ 0.25299978, 19.60409301],
    +       [ 0.24977307, 19.57714401],
    +       [ 0.24660506, 19.55024001],
    +       [ 0.24348829, 19.52341001],
    +       [ 0.24042159, 19.49666601],
    +       [ 0.23741737, 19.46998501],
    +       [ 0.23447423, 19.44339301],
    +       [ 0.23158726, 19.41688701],
    +       [ 0.22876474, 19.39045101],
    +       [ 0.22600432, 19.36410901],
    +       [ 0.22330395, 19.33786601],
    +       [ 0.220663  , 19.31170101],
    +       [ 0.21808571, 19.28560101],
    +       [ 0.21557456, 19.25960101],
    +       [ 0.21312279, 19.23368701],
    +       [ 0.21073349, 19.20785601],
    +       [ 0.20840975, 19.18210401],
    +       [ 0.20614799, 19.15640601],
    +       [ 0.20395119, 19.13076401],
    +       [ 0.20182156, 19.10523201],
    +       [ 0.19975572, 19.07977101],
    +       [ 0.19775195, 19.05436401],
    +       [ 0.19581903, 19.02902801],
    +       [ 0.19395701, 19.00376101],
    +       [ 0.19216276, 18.97857301],
    +       [ 0.19044513, 18.95347601],
    +       [ 0.1888007 , 18.92850001],
    +       [ 0.18723796, 18.90368201],
    +       [ 0.18576648, 18.87905401],
    +       [ 0.18438763, 18.85466301],
    +       [ 0.18310871, 18.83056001],
    +       [ 0.18193706, 18.80672701],
    +       [ 0.18087817, 18.78327401],
    +       [ 0.17993184, 18.76015001],
    +       [ 0.17910244, 18.73740501],
    +       [ 0.17838817, 18.71496101],
    +       [ 0.17779005, 18.69282101],
    +       [ 0.177312  , 18.67099501],
    +       [ 0.17694971, 18.64944001],
    +       [ 0.1767112 , 18.62815801],
    +       [ 0.17659065, 18.60714001],
    +       [ 0.17658939, 18.58636601],
    +       [ 0.17671618, 18.56585701],
    +       [ 0.17696696, 18.54562201],
    +       [ 0.17733781, 18.52565801],
    +       [ 0.1778346 , 18.50597901],
    +       [ 0.17846661, 18.48656801],
    +       [ 0.17922891, 18.46742401],
    +       [ 0.18012796, 18.44859001],
    +       [ 0.18116197, 18.43005501],
    +       [ 0.18233604, 18.41181501],
    +       [ 0.18363223, 18.39379401],
    +       [ 0.18506009, 18.37602901],
    +       [ 0.18660932, 18.35862101],
    +       [ 0.18829849, 18.34153201],
    +       [ 0.19012805, 18.32480701],
    +       [ 0.19210919, 18.30851301],
    +       [ 0.19422686, 18.29250401],
    +       [ 0.1964951 , 18.27685701],
    +       [ 0.19890209, 18.26156301],
    +       [ 0.20145338, 18.24666001],
    +       [ 0.20417715, 18.23260501],
    +       [ 0.20705285, 18.21898101],
    +       [ 0.21005661, 18.20562501],
    +       [ 0.21319339, 18.19254201],
    +       [ 0.22126873, 18.16185301],
    +       [ 0.2300065 , 18.13259301],
    +       [ 0.23950909, 18.10508001],
    +       [ 0.24974677, 18.07932501],
    +       [ 0.26066153, 18.05527801],
    +       [ 0.27224553, 18.03295501],
    +       [ 0.28447607, 18.01227601],
    +       [ 0.40566013, 18.01227601],
    +       [ 0.39412682, 18.03295501],
    +       [ 0.38329907, 18.05527801],
    +       [ 0.37320316, 18.07932501],
    +       [ 0.36384734, 18.10508001],
    +       [ 0.35529237, 18.13259301],
    +       [ 0.34756872, 18.16185301],
    +       [ 0.34056407, 18.19254201],
    +       [ 0.33788593, 18.20562501],
    +       [ 0.33535176, 18.21898101],
    +       [ 0.33295648, 18.23260501],
    +       [ 0.33072983, 18.24666001],
    +       [ 0.32870734, 18.26156301],
    +       [ 0.32684482, 18.27685701],
    +       [ 0.3251355 , 18.29250401],
    +       [ 0.32359167, 18.30851301],
    +       [ 0.32219665, 18.32480701],
    +       [ 0.32097089, 18.34153201],
    +       [ 0.31990093, 18.35862101],
    +       [ 0.31898485, 18.37602901],
    +       [ 0.3182056 , 18.39379401],
    +       [ 0.31756993, 18.41181501],
    +       [ 0.31706705, 18.43005501],
    +       [ 0.31671781, 18.44859001],
    +       [ 0.3165174 , 18.46742401],
    +       [ 0.31646817, 18.48656801],
    +       [ 0.3165622 , 18.50597901],
    +       [ 0.31680458, 18.52565801],
    +       [ 0.31718682, 18.54562201],
    +       [ 0.31770268, 18.56585701],
    +       [ 0.31835632, 18.58636601],
    +       [ 0.31915162, 18.60714001],
    +       [ 0.32007915, 18.62815801],
    +       [ 0.3211385 , 18.64944001],
    +       [ 0.32233599, 18.67099501],
    +       [ 0.32366367, 18.69282101],
    +       [ 0.32512771, 18.71496101],
    +       [ 0.32672398, 18.73740501],
    +       [ 0.32845154, 18.76015001],
    +       [ 0.33031546, 18.78327401],
    +       [ 0.33230964, 18.80672701],
    +       [ 0.33443651, 18.83056001],
    +       [ 0.3366864 , 18.85466301],
    +       [ 0.3390529 , 18.87905401],
    +       [ 0.34152681, 18.90368201],
    +       [ 0.34410502, 18.92850001],
    +       [ 0.34677677, 18.95347601],
    +       [ 0.34953217, 18.97857301],
    +       [ 0.35237348, 19.00376101],
    +       [ 0.35529144, 19.02902801],
    +       [ 0.35828883, 19.05436401],
    +       [ 0.36136575, 19.07977101],
    +       [ 0.36451277, 19.10523201],
    +       [ 0.36773241, 19.13076401],
    +       [ 0.37102978, 19.15640601],
    +       [ 0.37440044, 19.18210401],
    +       [ 0.37784139, 19.20785601],
    +       [ 0.38135736, 19.23368701],
    +       [ 0.38494552, 19.25960101],
    +       [ 0.388603  , 19.28560101],
    +       [ 0.39233725, 19.31170101],
    +       [ 0.39614435, 19.33786601],
    +       [ 0.40002069, 19.36410901],
    +       [ 0.40396796, 19.39045101],
    +       [ 0.40798805, 19.41688701],
    +       [ 0.41208235, 19.44339301],
    +       [ 0.41624335, 19.46998501],
    +       [ 0.42047622, 19.49666601],
    +       [ 0.42478124, 19.52341001],
    +       [ 0.42914714, 19.55024001],
    +       [ 0.43357463, 19.57714401],
    +       [ 0.43806989, 19.60409301],
    +       [ 0.44262347, 19.63113701],
    +       [ 0.44724247, 19.65824401],
    +       [ 0.4519225 , 19.68540001],
    +       [ 0.45666424, 19.71265801],
    +       [ 0.46146067, 19.73985301],
    +       [ 0.46631851, 19.76713801],
    +       [ 0.47124047, 19.79450101],
    +       [ 0.47623175, 19.82188301],
    +       [ 0.48136578, 19.84955001],
    +       [ 0.48671855, 19.87746501],
    +       [ 0.49225451, 19.90573101],
    +       [ 0.49787627, 19.93401801],
    +       [ 0.50358931, 19.96246401],
    +       [ 0.50938655, 19.99097001],
    +       [ 0.51528266, 20.01961701],
    +       [ 0.52126534, 20.04833101],
    +       [ 0.52733726, 20.07716101],
    +       [ 0.53348957, 20.10604901],
    +       [ 0.53973535, 20.13508501],
    +       [ 0.54612384, 20.16427301],
    +       [ 0.55279781, 20.19395801],
    +       [ 0.55962597, 20.22385701],
    +       [ 0.56656311, 20.25390101],
    +       [ 0.57360789, 20.28413501],
    +       [ 0.58074299, 20.31443001],
    +       [ 0.5880138 , 20.34505401],
    +       [ 0.59535596, 20.37564701],
    +       [ 0.60283203, 20.40653701],
    +       [ 0.61042265, 20.43765101],
    +       [ 0.61808231, 20.46871801],
    +       [ 0.62591386, 20.50023501],
    +       [ 0.63413647, 20.53264001],
    +       [ 0.64249372, 20.56529901],
    +       [ 0.65104657, 20.59850601],
    +       [ 0.659584  , 20.63135301],
    +       [ 0.66830253, 20.66469601],
    +       [ 0.67722496, 20.69865301],
    +       [ 0.70017638, 20.78511001],
    +       [ 0.72413715, 20.87386601],
    +       [ 0.74870785, 20.96383501],
    +       [ 0.77374297, 21.05454901],
    +       [ 0.7988286 , 21.14442701],
    +       [ 0.8240001 , 21.23338001],
    +       [ 0.84950281, 21.32246601],
    +       [ 0.8752204 , 21.41174601]]), None)
     
    +

    The result is a Path object that represents the polygon.

    Path provides contains_points, which figures out which points are inside the polygon.

    To test it, we’ll create a list with two points, one inside the polygon and one outside.

    points = [(0.4, 20), 
    -          (0.4, 30)]
    +          (0.4, 16)]
     
    @@ -918,7 +1272,7 @@ Before calling plt.
    -

    candidate_df is the Pandas DataFrame that contains the results from Notebook XX, which selects stars likely to be in GD-1 based on proper motion. It also includes position and proper motion transformed to the ICRS frame.

    +

    candidate_df is the Pandas DataFrame that contains the results from Lesson 4, which selects stars likely to be in GD-1 based on proper motion. It also includes position and proper motion transformed to the ICRS frame.

    Merging photometry data

    @@ -988,7 +1342,6 @@ i_mean_psf_mag pmra pmdec parallax - parallax_error radial_velocity phi1 phi2 @@ -1007,7 +1360,6 @@ i_mean_psf_mag -3.770522 -12.490482 0.791393 - 0.271754 NaN -59.630489 -1.216485 @@ -1024,7 +1376,6 @@ i_mean_psf_mag -5.941679 -11.346409 0.307456 - 0.199466 NaN -59.247330 -2.016078 @@ -1041,7 +1392,6 @@ i_mean_psf_mag -3.897001 -12.702780 0.779463 - 0.223692 NaN -59.133391 -2.306901 @@ -1058,7 +1408,6 @@ i_mean_psf_mag -4.335041 -14.492309 0.314514 - 0.102775 NaN -59.785300 -1.594569 @@ -1075,7 +1424,6 @@ i_mean_psf_mag -7.172931 -12.291499 0.425404 - 0.337689 NaN -59.557744 -1.682147 @@ -1120,7 +1468,6 @@ dec pmra pmdec parallax -parallax_error radial_velocity phi1 phi2 @@ -1274,7 +1621,7 @@ Name: color, Length: 7346, dtype: bool
    -
    481
    +
    464
     
    @@ -1291,14 +1638,15 @@ Name: color, Length: 7346, dtype: bool
    plot_cmd(photo_table)
    -plt.plot(xs, ys)
    +plt.plot(gi, g)
    +loop.plot()
     
    -plt.plot(selected2['color'], selected2['mag'], 'gx');
    +plt.plot(selected2['color'], selected2['mag'], 'g.');
     
    -_images/06_photo_83_0.png +_images/06_photo_114_0.png

    It looks like the selected stars are, in fact, inside the polygon, which means they have photometry data consistent with GD-1.

    @@ -1320,7 +1668,7 @@ Name: color, Length: 7346, dtype: bool
    -_images/06_photo_85_0.png +_images/06_photo_116_0.png

    This example includes two new Matplotlib commands:

    @@ -1350,7 +1698,7 @@ Name: color, Length: 7346, dtype: bool
    -
    -rw-rw-r-- 1 downey downey 2.0M Nov 18 19:28 gd1_merged.hdf5
    +
    -rw-rw-r-- 1 downey downey 1.1M Dec 14 14:24 gd1_merged.hdf5
     
    @@ -1364,20 +1712,13 @@ Name: color, Length: 7346, dtype: bool

    Save the polygon

    Reproducibile research is “the idea that … the full computational environment used to produce the results in the paper such as the code, data, etc. can be used to reproduce the results and create new work based on the research.”

    This Jupyter notebook is an example of reproducible research because it contains all of the code needed to reproduce the results, including the database queries that download the data and and analysis.

    -

    However, when we used ginput to define a polygon by hand, we introduced a non-reproducible element to the analysis. If someone running this notebook chooses a different polygon, they will get different results. So it is important to record the polygon we chose as part of the data analysis pipeline.

    -

    Since coords is a NumPy array, we can’t use to_hdf to save it in a file. But we can convert it to a Pandas DataFrame and save that.

    -

    As an alternative, we could use PyTables, which is the library Pandas uses to read and write files. It is a powerful library, but not easy to use directly. So let’s take advantage of Pandas.

    -
    -
    -
    coords_df = pd.DataFrame(coords)
    -
    -
    -
    -
    +

    In this lesson we used an isochrone to derive a polygon, which we used to select stars based on photometry. +So it is important to record the polygon as part of the data analysis pipeline.

    +

    Here’s how we can save it in an HDF file.

    filename = 'gd1_polygon.hdf5'
    -coords_df.to_hdf(filename, 'coords_df')
    +loop.to_hdf(filename, 'loop')
     
    @@ -1385,8 +1726,7 @@ Name: color, Length: 7346, dtype: bool

    We can read it back like this.

    -
    coords2_df = pd.read_hdf(filename, 'coords_df')
    -coords2 = coords2_df.to_numpy()
    +
    loop2 = pd.read_hdf(filename, 'loop')
     
    @@ -1394,7 +1734,9 @@ Name: color, Length: 7346, dtype: bool

    And verify that the data we read back is the same.

    -
    np.all(coords2 == coords)
    +
    import numpy as np
    +
    +np.all(loop == loop2)
     
    diff --git a/07_plot.html b/07_plot.html index 62fbcf1..e074256 100644 --- a/07_plot.html +++ b/07_plot.html @@ -429,7 +429,7 @@
    -_images/07_plot_13_0.png +_images/07_plot_14_0.png
    @@ -737,7 +737,7 @@
    -_images/07_plot_50_0.png +_images/07_plot_51_0.png
    @@ -794,7 +794,7 @@
    -_images/07_plot_57_0.png +_images/07_plot_58_0.png
    @@ -845,7 +845,7 @@
    -_images/07_plot_63_0.png +_images/07_plot_64_0.png

    Exercise: Add a few lines to plot_cmd to show the Polygon we selected as a shaded area.

    @@ -931,7 +931,7 @@
    -_images/07_plot_69_0.png +_images/07_plot_70_0.png

    We use plt.tight_layout at the end, which adjusts the sizes of the panels to make sure the titles and axis labels don’t overlap.

    @@ -969,7 +969,7 @@
    -_images/07_plot_72_0.png +_images/07_plot_73_0.png

    This is looking more and more like the figure in the paper.

    diff --git a/AstronomicalData/01_query.html b/AstronomicalData/01_query.html deleted file mode 100644 index eadda39..0000000 --- a/AstronomicalData/01_query.html +++ /dev/null @@ -1,1403 +0,0 @@ - - - - - - - - Lesson 1 — Astronomical Data in Python - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - -
    - - - - - - - - - - - - - - -
    - - - -
    -
    -
    - -
    - -
    -

    Lesson 1

    -
    -

    Introduction

    -

    This workshop is an introduction to tools and practices for working with astronomical data. Topics covered include:

    -
      -
    • Writing queries that select and download data from a database.

    • -
    • Using data stored in an Astropy Table or Pandas DataFrame.

    • -
    • Working with coordinates and other quantities with units.

    • -
    • Storing data in various formats.

    • -
    • Performing database join operations that combine data from multiple tables.

    • -
    • Visualizing data and preparing publication-quality figures.

    • -
    -

    As a running example, we will replicate part of the analysis in a recent paper, “Off the beaten path: Gaia reveals GD-1 stars outside of the main stream” by Adrian M. Price-Whelan and Ana Bonaca.

    -

    As the abstract explains, “Using data from the Gaia second data release combined with Pan-STARRS photometry, we present a sample of highly-probable members of the longest cold stream in the Milky Way, GD-1.”

    -

    GD-1 is a stellar stream, which is “an association of stars orbiting a galaxy that was once a globular cluster or dwarf galaxy that has now been torn apart and stretched out along its orbit by tidal forces.”

    -

    This article in Science magazine explains some of the background, including the process that led to the paper and an discussion of the scientific implications:

    -
      -
    • “The streams are particularly useful for … galactic archaeology — rewinding the cosmic clock to reconstruct the assembly of the Milky Way.”

    • -
    • “They also are being used as exquisitely sensitive scales to measure the galaxy’s mass.”

    • -
    • “… the streams are well-positioned to reveal the presence of dark matter … because the streams are so fragile, theorists say, collisions with marauding clumps of dark matter could leave telltale scars, potential clues to its nature.”

    • -
    -
    -
    -

    Prerequisites

    -

    This workshop is meant for people who are familiar with basic Python, but not necessarily the libraries we will use, like Astropy or Pandas. If you are familiar with Python lists and dictionaries, and you know how to write a function that takes parameters and returns a value, you know enough Python for this workshop.

    -

    We assume that you have some familiarity with operating systems, like the ability to use a command-line interface. But we don’t assume you have any prior experience with databases.

    -

    We assume that you are familiar with astronomy at the undergraduate level, but we will not assume specialized knowledge of the datasets or analysis methods we’ll use.

    -
    -
    -

    Data

    -

    The datasets we will work with are:

    -
      -
    • Gaia, which is “a space observatory of the European Space Agency (ESA), launched in 2013 … designed for astrometry: measuring the positions, distances and motions of stars with unprecedented precision”, and

    • -
    • Pan-STARRS, The Panoramic Survey Telescope and Rapid Response System, which is a survey designed to monitor the sky for transient objects, producing a catalog with accurate astronometry and photometry of detected sources.

    • -
    -

    Both of these datasets are very large, which can make them challenging to work with. It might not be possible, or practical, to download the entire dataset. -One of the goals of this workshop is to provide tools for working with large datasets.

    -
    -
    -

    Lesson 1

    -

    The first lesson demonstrates the steps for selecting and downloading data from the Gaia Database:

    -
      -
    1. First we’ll make a connection to the Gaia server,

    2. -
    3. We will explore information about the database and the tables it contains,

    4. -
    5. We will write a query and send it to the server, and finally

    6. -
    7. We will download the response from the server.

    8. -
    -

    After completing this lesson, you should be able to

    -
      -
    • Compose a basic query in ADQL.

    • -
    • Use queries to explore a database and its tables.

    • -
    • Use queries to download data.

    • -
    • Develop, test, and debug a query incrementally.

    • -
    -
    -
    -

    Query Language

    -

    In order to select data from a database, you have to compose a query, which is like a program written in a “query language”. -The query language we’ll use is ADQL, which stands for “Astronomical Data Query Language”.

    -

    ADQL is a dialect of SQL (Structured Query Language), which is by far the most commonly used query language. Almost everything you will learn about ADQL also works in SQL.

    -

    The reference manual for ADQL is here. -But you might find it easier to learn from this ADQL Cookbook.

    -
    -
    -

    Installing libraries

    -

    The library we’ll use to get Gaia data is Astroquery.

    -

    If you are running this notebook on Colab, you can run the following cell to install Astroquery and the other libraries we’ll use.

    -

    If you are running this notebook on your own computer, you might have to install these libraries yourself.

    -

    If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions.

    -

    TODO: Add a link to the instructions.

    -
    -
    -
    # 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
    -
    -
    -
    -
    -
    -
    -

    Connecting to Gaia

    -

    Astroquery provides Gaia, which is an object that represents a connection to the Gaia database.

    -

    We can connect to the Gaia database like this:

    -
    -
    -
    from astroquery.gaia import Gaia
    -
    -
    -
    -
    -
    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
    -
    -
    -
    -
    -
    -

    Optional detail

    -
    -

    Running this import statement has the effect of creating a TAP+ connection; TAP stands for “Table Access Protocol”. It is a network protocol for sending queries to the database and getting back the results. We’re not sure why it seems to create two connections.

    -
    -
    -
    -
    -

    Databases and Tables

    -

    What is a database, anyway? Most generally, it can be any collection of data, but when we are talking about ADQL or SQL:

    -
      -
    • A database is a collection of one or more named tables.

    • -
    • Each table is a 2-D array with one or more named columns of data.

    • -
    -

    We can use Gaia.load_tables to get the names of the tables in the Gaia database. With the option only_names=True, it loads information about the tables, called the “metadata”, not the data itself.

    -
    -
    -
    tables = Gaia.load_tables(only_names=True)
    -
    -
    -
    -
    -
    INFO: Retrieving tables... [astroquery.utils.tap.core]
    -INFO: Parsing tables... [astroquery.utils.tap.core]
    -INFO: Done. [astroquery.utils.tap.core]
    -
    -
    -
    -
    -
    -
    -
    for table in (tables):
    -    print(table.get_qualified_name())
    -
    -
    -
    -
    -
    external.external.apassdr9
    -external.external.gaiadr2_geometric_distance
    -external.external.galex_ais
    -external.external.ravedr5_com
    -external.external.ravedr5_dr5
    -external.external.ravedr5_gra
    -external.external.ravedr5_on
    -external.external.sdssdr13_photoprimary
    -external.external.skymapperdr1_master
    -external.external.tmass_xsc
    -public.public.hipparcos
    -public.public.hipparcos_newreduction
    -public.public.hubble_sc
    -public.public.igsl_source
    -public.public.igsl_source_catalog_ids
    -public.public.tycho2
    -public.public.dual
    -tap_config.tap_config.coord_sys
    -tap_config.tap_config.properties
    -tap_schema.tap_schema.columns
    -tap_schema.tap_schema.key_columns
    -tap_schema.tap_schema.keys
    -tap_schema.tap_schema.schemas
    -tap_schema.tap_schema.tables
    -gaiadr1.gaiadr1.aux_qso_icrf2_match
    -gaiadr1.gaiadr1.ext_phot_zero_point
    -gaiadr1.gaiadr1.allwise_best_neighbour
    -gaiadr1.gaiadr1.allwise_neighbourhood
    -gaiadr1.gaiadr1.gsc23_best_neighbour
    -gaiadr1.gaiadr1.gsc23_neighbourhood
    -gaiadr1.gaiadr1.ppmxl_best_neighbour
    -gaiadr1.gaiadr1.ppmxl_neighbourhood
    -gaiadr1.gaiadr1.sdss_dr9_best_neighbour
    -gaiadr1.gaiadr1.sdss_dr9_neighbourhood
    -gaiadr1.gaiadr1.tmass_best_neighbour
    -gaiadr1.gaiadr1.tmass_neighbourhood
    -gaiadr1.gaiadr1.ucac4_best_neighbour
    -gaiadr1.gaiadr1.ucac4_neighbourhood
    -gaiadr1.gaiadr1.urat1_best_neighbour
    -gaiadr1.gaiadr1.urat1_neighbourhood
    -gaiadr1.gaiadr1.cepheid
    -gaiadr1.gaiadr1.phot_variable_time_series_gfov
    -gaiadr1.gaiadr1.phot_variable_time_series_gfov_statistical_parameters
    -gaiadr1.gaiadr1.rrlyrae
    -gaiadr1.gaiadr1.variable_summary
    -gaiadr1.gaiadr1.allwise_original_valid
    -gaiadr1.gaiadr1.gsc23_original_valid
    -gaiadr1.gaiadr1.ppmxl_original_valid
    -gaiadr1.gaiadr1.sdssdr9_original_valid
    -gaiadr1.gaiadr1.tmass_original_valid
    -gaiadr1.gaiadr1.ucac4_original_valid
    -gaiadr1.gaiadr1.urat1_original_valid
    -gaiadr1.gaiadr1.gaia_source
    -gaiadr1.gaiadr1.tgas_source
    -gaiadr2.gaiadr2.aux_allwise_agn_gdr2_cross_id
    -gaiadr2.gaiadr2.aux_iers_gdr2_cross_id
    -gaiadr2.gaiadr2.aux_sso_orbit_residuals
    -gaiadr2.gaiadr2.aux_sso_orbits
    -gaiadr2.gaiadr2.dr1_neighbourhood
    -gaiadr2.gaiadr2.allwise_best_neighbour
    -gaiadr2.gaiadr2.allwise_neighbourhood
    -gaiadr2.gaiadr2.apassdr9_best_neighbour
    -gaiadr2.gaiadr2.apassdr9_neighbourhood
    -gaiadr2.gaiadr2.gsc23_best_neighbour
    -gaiadr2.gaiadr2.gsc23_neighbourhood
    -gaiadr2.gaiadr2.hipparcos2_best_neighbour
    -gaiadr2.gaiadr2.hipparcos2_neighbourhood
    -gaiadr2.gaiadr2.panstarrs1_best_neighbour
    -gaiadr2.gaiadr2.panstarrs1_neighbourhood
    -gaiadr2.gaiadr2.ppmxl_best_neighbour
    -gaiadr2.gaiadr2.ppmxl_neighbourhood
    -gaiadr2.gaiadr2.ravedr5_best_neighbour
    -gaiadr2.gaiadr2.ravedr5_neighbourhood
    -gaiadr2.gaiadr2.sdssdr9_best_neighbour
    -gaiadr2.gaiadr2.sdssdr9_neighbourhood
    -gaiadr2.gaiadr2.tmass_best_neighbour
    -gaiadr2.gaiadr2.tmass_neighbourhood
    -gaiadr2.gaiadr2.tycho2_best_neighbour
    -gaiadr2.gaiadr2.tycho2_neighbourhood
    -gaiadr2.gaiadr2.urat1_best_neighbour
    -gaiadr2.gaiadr2.urat1_neighbourhood
    -gaiadr2.gaiadr2.sso_observation
    -gaiadr2.gaiadr2.sso_source
    -gaiadr2.gaiadr2.vari_cepheid
    -gaiadr2.gaiadr2.vari_classifier_class_definition
    -gaiadr2.gaiadr2.vari_classifier_definition
    -gaiadr2.gaiadr2.vari_classifier_result
    -gaiadr2.gaiadr2.vari_long_period_variable
    -gaiadr2.gaiadr2.vari_rotation_modulation
    -gaiadr2.gaiadr2.vari_rrlyrae
    -gaiadr2.gaiadr2.vari_short_timescale
    -gaiadr2.gaiadr2.vari_time_series_statistics
    -gaiadr2.gaiadr2.panstarrs1_original_valid
    -gaiadr2.gaiadr2.gaia_source
    -gaiadr2.gaiadr2.ruwe
    -
    -
    -
    -
    -

    So that’s a lot of tables. The ones we’ll use are:

    -
      -
    • gaiadr2.gaia_source, which contains Gaia data from data release 2,

    • -
    • gaiadr2.panstarrs1_original_valid, which contains the photometry data we’ll use from PanSTARRS, and

    • -
    • gaiadr2.panstarrs1_best_neighbour, which we’ll use to cross-match each star observed by Gaia with the same star observed by PanSTARRS.

    • -
    -

    We can use load_table (not load_tables) to get the metadata for a single table. The name of this function is misleading, because it only downloads metadata.

    -
    -
    -
    meta = Gaia.load_table('gaiadr2.gaia_source')
    -meta
    -
    -
    -
    -
    -
    Retrieving table 'gaiadr2.gaia_source'
    -Parsing table 'gaiadr2.gaia_source'...
    -Done.
    -
    -
    -
    <astroquery.utils.tap.model.taptable.TapTableMeta at 0x7f922376e0a0>
    -
    -
    -
    -
    -

    Jupyter shows that the result is an object of type TapTableMeta, but it does not display the contents.

    -

    To see the metadata, we have to print the object.

    -
    -
    -
    print(meta)
    -
    -
    -
    -
    -
    TAP Table name: gaiadr2.gaiadr2.gaia_source
    -Description: This table has an entry for every Gaia observed source as listed in the
    -Main Database accumulating catalogue version from which the catalogue
    -release has been generated. It contains the basic source parameters,
    -that is only final data (no epoch data) and no spectra (neither final
    -nor epoch).
    -Num. columns: 96
    -
    -
    -
    -
    -

    Notice one gotcha: in the list of table names, this table appears as gaiadr2.gaiadr2.gaia_source, but when we load the metadata, we refer to it as gaiadr2.gaia_source.

    -

    Exercise: Go back and try

    -
    meta = Gaia.load_table('gaiadr2.gaiadr2.gaia_source')
    -
    -
    -

    What happens? Is the error message helpful? If you had not made this error deliberately, would you have been able to figure it out?

    -
    -
    -

    Columns

    -

    The following loop prints the names of the columns in the table.

    -
    -
    -
    for column in meta.columns:
    -    print(column.name)
    -
    -
    -
    -
    -
    solution_id
    -designation
    -source_id
    -random_index
    -ref_epoch
    -ra
    -ra_error
    -dec
    -dec_error
    -parallax
    -parallax_error
    -parallax_over_error
    -pmra
    -pmra_error
    -pmdec
    -pmdec_error
    -ra_dec_corr
    -ra_parallax_corr
    -ra_pmra_corr
    -ra_pmdec_corr
    -dec_parallax_corr
    -dec_pmra_corr
    -dec_pmdec_corr
    -parallax_pmra_corr
    -parallax_pmdec_corr
    -pmra_pmdec_corr
    -astrometric_n_obs_al
    -astrometric_n_obs_ac
    -astrometric_n_good_obs_al
    -astrometric_n_bad_obs_al
    -astrometric_gof_al
    -astrometric_chi2_al
    -astrometric_excess_noise
    -astrometric_excess_noise_sig
    -astrometric_params_solved
    -astrometric_primary_flag
    -astrometric_weight_al
    -astrometric_pseudo_colour
    -astrometric_pseudo_colour_error
    -mean_varpi_factor_al
    -astrometric_matched_observations
    -visibility_periods_used
    -astrometric_sigma5d_max
    -frame_rotator_object_type
    -matched_observations
    -duplicated_source
    -phot_g_n_obs
    -phot_g_mean_flux
    -phot_g_mean_flux_error
    -phot_g_mean_flux_over_error
    -phot_g_mean_mag
    -phot_bp_n_obs
    -phot_bp_mean_flux
    -phot_bp_mean_flux_error
    -phot_bp_mean_flux_over_error
    -phot_bp_mean_mag
    -phot_rp_n_obs
    -phot_rp_mean_flux
    -phot_rp_mean_flux_error
    -phot_rp_mean_flux_over_error
    -phot_rp_mean_mag
    -phot_bp_rp_excess_factor
    -phot_proc_mode
    -bp_rp
    -bp_g
    -g_rp
    -radial_velocity
    -radial_velocity_error
    -rv_nb_transits
    -rv_template_teff
    -rv_template_logg
    -rv_template_fe_h
    -phot_variable_flag
    -l
    -b
    -ecl_lon
    -ecl_lat
    -priam_flags
    -teff_val
    -teff_percentile_lower
    -teff_percentile_upper
    -a_g_val
    -a_g_percentile_lower
    -a_g_percentile_upper
    -e_bp_min_rp_val
    -e_bp_min_rp_percentile_lower
    -e_bp_min_rp_percentile_upper
    -flame_flags
    -radius_val
    -radius_percentile_lower
    -radius_percentile_upper
    -lum_val
    -lum_percentile_lower
    -lum_percentile_upper
    -datalink_url
    -epoch_photometry_url
    -
    -
    -
    -
    -

    You can probably guess what many of these columns are by looking at the names, but you should resist the temptation to guess. -To find out what the columns mean, read the documentation.

    -

    If you want to know what can go wrong when you don’t read the documentation, you might like this article.

    -

    Exercise: One of the other tables we’ll use is gaiadr2.gaiadr2.panstarrs1_original_valid. Use load_table to get the metadata for this table. How many columns are there and what are their names?

    -

    Hint: Remember the gotcha we mentioned earlier.

    -
    -
    -
    # Solution
    -
    -meta2 = Gaia.load_table('gaiadr2.panstarrs1_original_valid')
    -print(meta2)
    -
    -
    -
    -
    -
    Retrieving table 'gaiadr2.panstarrs1_original_valid'
    -Parsing table 'gaiadr2.panstarrs1_original_valid'...
    -Done.
    -TAP Table name: gaiadr2.gaiadr2.panstarrs1_original_valid
    -Description: The Panoramic Survey Telescope and Rapid Response System (Pan-STARRS) is
    -a system for wide-field astronomical imaging developed and operated by
    -the Institute for Astronomy at the University of Hawaii. Pan-STARRS1
    -(PS1) is the first part of Pan-STARRS to be completed and is the basis
    -for Data Release 1 (DR1). The PS1 survey used a 1.8 meter telescope and
    -its 1.4 Gigapixel camera to image the sky in five broadband filters (g,
    -r, i, z, y).
    -
    -The current table contains a filtered subsample of the 10 723 304 629
    -entries listed in the original ObjectThin table.
    -We used only ObjectThin and MeanObject tables to extract
    -panstarrs1OriginalValid table, this means that objects detected only in
    -stack images are not included here. The main reason for us to avoid the
    -use of objects detected in stack images is that their astrometry is not
    -as good as the mean objects astrometry: “The stack positions (raStack,
    -decStack) have considerably larger systematic astrometric errors than
    -the mean epoch positions (raMean, decMean).” The astrometry for the
    -MeanObject positions uses Gaia DR1 as a reference catalog, while the
    -stack positions use 2MASS as a reference catalog.
    -
    -In details, we filtered out all objects where:
    -
    --   nDetections = 1
    -
    --   no good quality data in Pan-STARRS, objInfoFlag 33554432 not set
    -
    --   mean astrometry could not be measured, objInfoFlag 524288 set
    -
    --   stack position used for mean astrometry, objInfoFlag 1048576 set
    -
    --   error on all magnitudes equal to 0 or to -999;
    -
    --   all magnitudes set to -999;
    -
    --   error on RA or DEC greater than 1 arcsec.
    -
    -The number of objects in panstarrs1OriginalValid is 2 264 263 282.
    -
    -The panstarrs1OriginalValid table contains only a subset of the columns
    -available in the combined ObjectThin and MeanObject tables. A
    -description of the original ObjectThin and MeanObjects tables can be
    -found at:
    -https://outerspace.stsci.edu/display/PANSTARRS/PS1+Database+object+and+detection+tables
    -
    -Download:
    -http://mastweb.stsci.edu/ps1casjobs/home.aspx
    -Documentation:
    -https://outerspace.stsci.edu/display/PANSTARRS
    -http://pswww.ifa.hawaii.edu/pswww/
    -References:
    -The Pan-STARRS1 Surveys, Chambers, K.C., et al. 2016, arXiv:1612.05560
    -Pan-STARRS Data Processing System, Magnier, E. A., et al. 2016,
    -arXiv:1612.05240
    -Pan-STARRS Pixel Processing: Detrending, Warping, Stacking, Waters, C.
    -Z., et al. 2016, arXiv:1612.05245
    -Pan-STARRS Pixel Analysis: Source Detection and Characterization,
    -Magnier, E. A., et al. 2016, arXiv:1612.05244
    -Pan-STARRS Photometric and Astrometric Calibration, Magnier, E. A., et
    -al. 2016, arXiv:1612.05242
    -The Pan-STARRS1 Database and Data Products, Flewelling, H. A., et al.
    -2016, arXiv:1612.05243
    -
    -Catalogue curator:
    -SSDC - ASI Space Science Data Center
    -https://www.ssdc.asi.it/
    -Num. columns: 26
    -
    -
    -
    -
    -
    -
    -
    # Solution
    -
    -for column in meta2.columns:
    -    print(column.name)
    -
    -
    -
    -
    -
    obj_name
    -obj_id
    -ra
    -dec
    -ra_error
    -dec_error
    -epoch_mean
    -g_mean_psf_mag
    -g_mean_psf_mag_error
    -g_flags
    -r_mean_psf_mag
    -r_mean_psf_mag_error
    -r_flags
    -i_mean_psf_mag
    -i_mean_psf_mag_error
    -i_flags
    -z_mean_psf_mag
    -z_mean_psf_mag_error
    -z_flags
    -y_mean_psf_mag
    -y_mean_psf_mag_error
    -y_flags
    -n_detections
    -zone_id
    -obj_info_flag
    -quality_flag
    -
    -
    -
    -
    -
    -
    -

    Writing queries

    -

    By now you might be wondering how we actually download the data. With tables this big, you generally don’t. Instead, you use queries to select only the data you want.

    -

    A query is a string written in a query language like SQL; for the Gaia database, the query language is a dialect of SQL called ADQL.

    -

    Here’s an example of an ADQL query.

    -
    -
    -
    query1 = """SELECT 
    -TOP 10
    -source_id, ref_epoch, ra, dec, parallax 
    -FROM gaiadr2.gaia_source"""
    -
    -
    -
    -
    -

    Python note: We use a triple-quoted string here so we can include line breaks in the query, which makes it easier to read.

    -

    The words in uppercase are ADQL keywords:

    -
      -
    • SELECT indicates that we are selecting data (as opposed to adding or modifying data).

    • -
    • TOP indicates that we only want the first 10 rows of the table, which is useful for testing a query before asking for all of the data.

    • -
    • FROM specifies which table we want data from.

    • -
    -

    The third line is a list of column names, indicating which columns we want.

    -

    In this example, the keywords are capitalized and the column names are lowercase. This is a common style, but it is not required. ADQL and SQL are not case-sensitive.

    -

    To run this query, we use the Gaia object, which represents our connection to the Gaia database, and invoke launch_job:

    -
    -
    -
    job1 = Gaia.launch_job(query1)
    -job1
    -
    -
    -
    -
    -
    <astroquery.utils.tap.model.job.Job at 0x7f9222e9cb20>
    -
    -
    -
    -
    -

    The result is an object that represents the job running on a Gaia server.

    -

    If you print it, it displays metadata for the forthcoming table.

    -
    -
    -
    print(job1)
    -
    -
    -
    -
    -
    <Table length=10>
    -   name    dtype  unit                            description                            
    ---------- ------- ---- ------------------------------------------------------------------
    -source_id   int64      Unique source identifier (unique within a particular Data Release)
    -ref_epoch float64   yr                                                    Reference epoch
    -       ra float64  deg                                                    Right ascension
    -      dec float64  deg                                                        Declination
    - parallax float64  mas                                                           Parallax
    -Jobid: None
    -Phase: COMPLETED
    -Owner: None
    -Output file: sync_20201005090721.xml.gz
    -Results: None
    -
    -
    -
    -
    -

    Don’t worry about Results: None. That does not actually mean there are no results.

    -

    However, Phase: COMPLETED indicates that the job is complete, so we can get the results like this:

    -
    -
    -
    results1 = job1.get_results()
    -type(results1)
    -
    -
    -
    -
    -
    astropy.table.table.Table
    -
    -
    -
    -
    -

    Optional detail: Why is table repeated three times? The first is the name of the module, the second is the name of the submodule, and the third is the name of the class. Most of the time we only care about the last one. It’s like the Linnean name for gorilla, which is Gorilla Gorilla Gorilla.

    -

    The result is an Astropy Table, which is similar to a table in an SQL database except:

    -
      -
    • SQL databases are stored on disk drives, so they are persistent; that is, they “survive” even if you turn off the computer. An Astropy Table is stored in memory; it disappears when you turn off the computer (or shut down this Jupyter notebook).

    • -
    • SQL databases are designed to process queries. An Astropy Table can perform some query-like operations, like selecting columns and rows. But these operations use Python syntax, not SQL.

    • -
    -

    Jupyter knows how to display the contents of a Table.

    -
    -
    -
    results1
    -
    -
    -
    -
    -
    Table length=10 - - - - - - - - - - - - - - -
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307550606271623682015.5281.267623626829920.5585239223461581.1422630184554958
    45307468443413159682015.5281.137043174954120.3778523888981841.0092247424630945
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    -
    -

    Each column has a name, units, and a data type.

    -

    For example, the units of ra and dec are degrees, and their data type is float64, which is a 64-bit floating-point number, used to store measurements with a fraction part.

    -

    This information comes from the Gaia database, and has been stored in the Astropy Table by Astroquery.

    -

    Exercise: Read the documentation of this table and choose a column that looks interesting to you. Add the column name to the query and run it again. What are the units of the column you selected? What is its data type?

    -
    -
    -

    Asynchronous queries

    -

    launch_job asks the server to run the job “synchronously”, which normally means it runs immediately. But synchronous jobs are limited to 2000 rows. For queries that return more rows, you should run “asynchronously”, which mean they might take longer to get started.

    -

    If you are not sure how many rows a query will return, you can use the SQL command COUNT to find out how many rows are in the result without actually returning them. We’ll see an example of this later.

    -

    The results of an asynchronous query are stored in a file on the server, so you can start a query and come back later to get the results.

    -

    For anonymous users, files are kept for three days.

    -

    As an example, let’s try a query that’s similar to query1, with two changes:

    -
      -
    • It selects the first 3000 rows, so it is bigger than we should run synchronously.

    • -
    • It uses a new keyword, WHERE.

    • -
    -
    -
    -
    query2 = """SELECT TOP 3000
    -source_id, ref_epoch, ra, dec, parallax
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 1
    -"""
    -
    -
    -
    -
    -

    A WHERE clause indicates which rows we want; in this case, the query selects only rows “where” parallax is less than 1. This has the effect of selecting stars with relatively low parallax, which are farther away. We’ll use this clause to exclude nearby stars that are unlikely to be part of GD-1.

    -

    WHERE is one of the most common clauses in ADQL/SQL, and one of the most useful, because it allows us to select only the rows we need from the database.

    -

    We use launch_job_async to submit an asynchronous query.

    -
    -
    -
    job2 = Gaia.launch_job_async(query2)
    -print(job2)
    -
    -
    -
    -
    -
    INFO: Query finished. [astroquery.utils.tap.core]
    -<Table length=3000>
    -   name    dtype  unit                            description                            
    ---------- ------- ---- ------------------------------------------------------------------
    -source_id   int64      Unique source identifier (unique within a particular Data Release)
    -ref_epoch float64   yr                                                    Reference epoch
    -       ra float64  deg                                                    Right ascension
    -      dec float64  deg                                                        Declination
    - parallax float64  mas                                                           Parallax
    -Jobid: 1601903242219O
    -Phase: COMPLETED
    -Owner: None
    -Output file: async_20201005090722.vot
    -Results: None
    -
    -
    -
    -
    -

    And here are the results.

    -
    -
    -
    results2 = job2.get_results()
    -results2
    -
    -
    -
    -
    -
    Table length=3000 - - - - - - - - - - - - - - - - - - - - - - - - -
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    45307409387744093442015.5281.376256953641620.4361400589412060.9242670062090182
    ...............
    44677109150118026242015.5269.96809693073471.14290850381608820.42361471245557913
    44677065513286795522015.5270.0331645898811.05657473236899270.922888231734588
    44677122550373000962015.5270.77247179230470.6581664892880896-2.669179465293931
    44677350011817617922015.5270.36286062483080.89470793235991240.6117399163086398
    44677371014219166722015.5270.51108346614440.9806225910160181-0.39818224846127004
    44677075477573274882015.5269.887462805949271.02127599401369620.7741412301054209
    44677327720945730562015.5270.559971827601260.9037072088489417-1.7920417800164183
    44677323554910877442015.5270.67307907024910.9197224705139885-0.3464446494840354
    44677170997669445122015.5270.576671731208250.7262776590095680.05443955111134051
    44677190582657812482015.5270.72480529715140.82055519217827850.3733943917490343
    -
    -

    You might notice that some values of parallax are negative. As this FAQ explains, “Negative parallaxes are caused by errors in the observations.” Negative parallaxes have “no physical meaning,” but they can be a “useful diagnostic on the quality of the astrometric solution.”

    -

    Later we will see an example where we use parallax and parallax_error to identify stars where the distance estimate is likely to be inaccurate.

    -

    Exercise: The clauses in a query have to be in the right order. Go back and change the order of the clauses in query2 and run it again.

    -

    The query should fail, but notice that you don’t get much useful debugging information.

    -

    For this reason, developing and debugging ADQL queries can be really hard. A few suggestions that might help:

    -
      -
    • Whenever possible, start with a working query, either an example you find online or a query you have used in the past.

    • -
    • Make small changes and test each change before you continue.

    • -
    • While you are debugging, use TOP to limit the number of rows in the result. That will make each attempt run faster, which reduces your testing time.

    • -
    • Launching test queries synchronously might make them start faster, too.

    • -
    -
    -
    -

    Operators

    -

    In a WHERE clause, you can use any of the SQL comparison operators; here are the most common ones:

    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Symbol

    Operation

    >

    greater than

    <

    less than

    >=

    greater than or equal

    <=

    less than or equal

    =

    equal

    != or <>

    not equal

    -

    Most of these are the same as Python, but some are not. In particular, notice that the equality operator is =, not ==. -Be careful to keep your Python out of your ADQL!

    -

    You can combine comparisons using the logical operators:

    -
      -
    • AND: true if both comparisons are true

    • -
    • OR: true if either or both comparisons are true

    • -
    -

    Finally, you can use NOT to invert the result of a comparison.

    -

    Exercise: Read about SQL operators here and then modify the previous query to select rows where bp_rp is between -0.75 and 2.

    -

    You can read about this variable here.

    -
    -
    -
    # Solution
    -
    -# This is what most people will probably do
    -
    -query = """SELECT TOP 10
    -source_id, ref_epoch, ra, dec, parallax
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 1 
    -  AND bp_rp > -0.75 AND bp_rp < 2
    -"""
    -
    -
    -
    -
    -
    -
    -
    # Solution
    -
    -# But if someone notices the BETWEEN operator, 
    -# they might do this
    -
    -query = """SELECT TOP 10
    -source_id, ref_epoch, ra, dec, parallax
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 1 
    -  AND bp_rp BETWEEN -0.75 AND 2
    -"""
    -
    -
    -
    -
    -

    This Hertzsprung-Russell diagram shows the BP-RP color and luminosity of stars in the Gaia catalog.

    -

    Selecting stars with bp-rp less than 2 excludes many class M dwarf stars, which are low temperature, low luminosity. A star like that at GD-1’s distance would be hard to detect, so if it is detected, it it more likely to be in the foreground.

    -
    -
    -

    Cleaning up

    -

    Asynchronous jobs have a jobid.

    -
    -
    -
    job1.jobid, job2.jobid
    -
    -
    -
    -
    -
    (None, '1601903242219O')
    -
    -
    -
    -
    -

    Which you can use to remove the job from the server.

    -
    -
    -
    Gaia.remove_jobs([job2.jobid])
    -
    -
    -
    -
    -
    Removed jobs: '['1601903242219O']'.
    -
    -
    -
    -
    -

    If you don’t remove it job from the server, it will be removed eventually, so don’t feel too bad if you don’t clean up after yourself.

    -
    -
    -

    Formatting queries

    -

    So far the queries have been string “literals”, meaning that the entire string is part of the program. -But writing queries yourself can be slow, repetitive, and error-prone.

    -

    It is often a good idea to write Python code that assembles a query for you. One useful tool for that is the string format method.

    -

    As an example, we’ll divide the previous query into two parts; a list of column names and a “base” for the query that contains everything except the column names.

    -

    Here’s the list of columns we’ll select.

    -
    -
    -
    columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'
    -
    -
    -
    -
    -

    And here’s the base; it’s a string that contains at least one format specifier in curly brackets (braces).

    -
    -
    -
    query3_base = """SELECT TOP 10 
    -{columns}
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 1
    -  AND bp_rp BETWEEN -0.75 AND 2
    -"""
    -
    -
    -
    -
    -

    This base query contains one format specifier, {columns}, which is a placeholder for the list of column names we will provide.

    -

    To assemble the query, we invoke format on the base string and provide a keyword argument that assigns a value to columns.

    -
    -
    -
    query3 = query3_base.format(columns=columns)
    -
    -
    -
    -
    -

    The result is a string with line breaks. If you display it, the line breaks appear as \n.

    -
    -
    -
    query3
    -
    -
    -
    -
    -
    'SELECT TOP 10 \nsource_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\nFROM gaiadr2.gaia_source\nWHERE parallax < 1\n  AND bp_rp BETWEEN -0.75 AND 2\n'
    -
    -
    -
    -
    -

    But if you print it, the line breaks appear as… line breaks.

    -
    -
    -
    print(query3)
    -
    -
    -
    -
    -
    SELECT TOP 10 
    -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
    -
    -
    -
    -
    -

    Notice that the format specifier has been replaced with the value of columns.

    -

    Let’s run it and see if it works:

    -
    -
    -
    job3 = Gaia.launch_job(query3)
    -print(job3)
    -
    -
    -
    -
    -
    <Table length=10>
    -      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    10
    -Jobid: None
    -Phase: COMPLETED
    -Owner: None
    -Output file: sync_20201005090726.xml.gz
    -Results: None
    -
    -
    -
    -
    -
    -
    -
    results3 = job3.get_results()
    -results3
    -
    -
    -
    -
    -
    Table length=10 - - - - - - - - - - - - - - -
    source_idradecpmrapmdecparallaxparallax_errorradial_velocity
    degdegmas / yrmas / yrmasmaskm / s
    int64float64float64float64float64float64float64float64
    4467710915011802624269.96809693073471.14290850381608822.0233280236600626-2.56924278755102660.423614712455579130.470352406647465--
    4467706551328679552270.0331645898811.0565747323689927-3.414829591355289-3.84372158574957370.9228882317345880.927008559859825--
    4467712255037300096270.77247179230470.6581664892880896-3.5620173752896025-6.595792323153987-2.6691794652939310.9719742773203504--
    4467735001181761792270.36286062483080.89470793235991242.13070799264892050.88267277109107120.61173991630863980.509812721702093--
    4467737101421916672270.51108346614440.98062259101601810.17532366511560785-5.113270239706202-0.398182248461270040.7549581886719651--
    4467707547757327488269.887462805949271.0212759940136962-2.6382230817672987-3.7077765320492870.77414123010542090.3022057897812064--
    4467732355491087744270.67307907024910.9197224705139885-2.2735991502653037-11.864952855984358-0.34644464948403540.4937921513912002--
    4467717099766944512270.576671731208250.726277659009568-3.4598362614808367-4.6014268933659210.054439551111340510.8867339293525688--
    4467719058265781248270.72480529715140.8205551921782785-3.255079498426542-9.2492850691110850.37339439174903430.390952370410666--
    4467722326741572352270.874312918885040.85955659758691580.106963983518598261.2035993780158853-0.118509434328643730.1660452431882023--
    -
    -

    Good so far.

    -

    Exercise: This query always selects sources with parallax less than 1. But suppose you want to take that upper bound as an input.

    -

    Modify query3_base to replace 1 with a format specifier like {max_parallax}. Now, when you call format, add a keyword argument that assigns a value to max_parallax, and confirm that the format specifier gets replaced with the value you provide.

    -
    -
    -
    # Solution
    -
    -query4_base = """SELECT TOP 10
    -{columns}
    -FROM gaiadr2.gaia_source
    -WHERE parallax < {max_parallax} AND 
    -bp_rp BETWEEN -0.75 AND 2
    -"""
    -
    -
    -
    -
    -
    -
    -
    # Solution
    -
    -query4 = query4_base.format(columns=columns,
    -                          max_parallax=0.5)
    -print(query)
    -
    -
    -
    -
    -
    SELECT TOP 10
    -source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 0.5 AND 
    -bp_rp BETWEEN -0.75 AND 2
    -
    -
    -
    -
    -

    Style note: You might notice that the variable names in this notebook are numbered, like query1, query2, etc.

    -

    The advantage of this style is that it isolates each section of the notebook from the others, so if you go back and run the cells out of order, it’s less likely that you will get unexpected interactions.

    -

    A drawback of this style is that it can be a nuisance to update the notebook if you add, remove, or reorder a section.

    -

    What do you think of this choice? Are there alternatives you prefer?

    -
    -
    -

    Summary

    -

    This notebook demonstrates the following steps:

    -
      -
    1. Making a connection to the Gaia server,

    2. -
    3. Exploring information about the database and the tables it contains,

    4. -
    5. Writing a query and sending it to the server, and finally

    6. -
    7. Downloading the response from the server as an Astropy Table.

    8. -
    -
    -
    -

    Best practices

    -
      -
    • If you can’t download an entire dataset (or it’s not practical) use queries to select the data you need.

    • -
    • Read the metadata and the documentation to make sure you understand the tables, their columns, and what they mean.

    • -
    • Develop queries incrementally: start with something simple, test it, and add a little bit at a time.

    • -
    • Use ADQL features like TOP and COUNT to test before you run a query that might return a lot of data.

    • -
    • If you know your query will return fewer than 3000 rows, you can run it synchronously, which might complete faster (but it doesn’t seem to make much difference). If it might return more than 3000 rows, you should run it asynchronously.

    • -
    • ADQL and SQL are not case-sensitive, so you don’t have to capitalize the keywords, but you should.

    • -
    • ADQL and SQL don’t require you to break a query into multiple lines, but you should.

    • -
    -

    Jupyter notebooks can be good for developing and testing code, but they have some drawbacks. In particular, if you run the cells out of order, you might find that variables don’t have the values you expect.

    -

    There are a few things you can do to mitigate these problems:

    -
      -
    • Make each section of the notebook self-contained. Try not to use the same variable name in more than one section.

    • -
    • Keep notebooks short. Look for places where you can break your analysis into phases with one notebook per phase.

    • -
    -
    -
    - - - - -
    - -
    -
    - - -
    - - -
    -
    -
    -

    - - By Allen B. Downey
    - - © Copyright 2020.
    -

    -
    -
    -
    - - -
    -
    - - - - - - - - \ No newline at end of file diff --git a/AstronomicalData/02_coords.html b/AstronomicalData/02_coords.html deleted file mode 100644 index 81a0755..0000000 --- a/AstronomicalData/02_coords.html +++ /dev/null @@ -1,1824 +0,0 @@ - - - - - - - - Lesson 2 — Astronomical Data in Python - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - -
    - - - - - - - - - - - - - - -
    - - - -
    -
    -
    - -
    - -
    -

    Lesson 2

    -

    This is the second in a series of lessons related to astronomy data.

    -

    As a running example, we are replicating parts of the analysis in a recent paper, “Off the beaten path: Gaia reveals GD-1 stars outside of the main stream” by Adrian M. Price-Whelan and Ana Bonaca.

    -

    In the first notebook, we wrote ADQL queries and used them to select and download data from the Gaia server.

    -

    In this notebook, we’ll pick up where we left off and write a query to select stars from the region of the sky where we expect GD-1 to be.

    -

    We’ll start with an example that does a “cone search”; that is, it selects stars that appear in a circular region of the sky.

    -

    Then, to select stars in the vicinity of GD-1, we’ll:

    -
      -
    • Use Quantity objects to represent measurements with units.

    • -
    • Use the Gala library to convert coordinates from one frame to another.

    • -
    • Use the ADQL keywords POLYGON, CONTAINS, and POINT to select stars that fall within a polygonal region.

    • -
    • Submit a query and download the results.

    • -
    • Store the results in a FITS file.

    • -
    -

    After completing this lesson, you should be able to

    -
      -
    • Use Python string formatting to compose more complex ADQL queries.

    • -
    • Work with coordinates and other quantities that have units.

    • -
    • Download the results of a query and store them in a file.

    • -
    -
    -

    Installing libraries

    -

    If you are running this notebook on Colab, you can run the following cell to install Astroquery and a the other libraries we’ll use.

    -

    If you are running this notebook on your own computer, you might have to install these libraries yourself.

    -

    If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions.

    -

    TODO: Add a link to the instructions.

    -
    -
    -
    # 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
    -
    -
    -
    -
    -
    -
    -

    Selecting a region

    -

    One of the most common ways to restrict a query is to select stars in a particular region of the sky.

    -

    For example, here’s a query from the Gaia archive documentation that selects “all the objects … in a circular region centered at (266.41683, -29.00781) with a search radius of 5 arcmin (0.08333 deg).”

    -
    -
    -
    query = """
    -SELECT 
    -TOP 10 source_id
    -FROM gaiadr2.gaia_source
    -WHERE 1=CONTAINS(
    -  POINT(ra, dec),
    -  CIRCLE(266.41683, -29.00781, 0.08333333))
    -"""
    -
    -
    -
    -
    -

    This query uses three keywords that are specific to ADQL (not SQL):

    -
      -
    • POINT: a location in ICRS coordinates, specified in degrees of right ascension and declination.

    • -
    • CIRCLE: a circle where the first two values are the coordinates of the center and the third is the radius in degrees.

    • -
    • CONTAINS: a function that returns 1 if a POINT is contained in a shape and 0 otherwise.

    • -
    -

    Here is the documentation of CONTAINS.

    -

    A query like this is called a cone search because it selects stars in a cone.

    -

    Here’s how we run it.

    -
    -
    -
    from astroquery.gaia import Gaia
    -
    -job = Gaia.launch_job(query)
    -result = job.get_results()
    -result
    -
    -
    -
    -
    -
    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
    -
    -
    -
    Table length=10 - - - - - - - - - - - - - -
    source_id
    int64
    4057468321929794432
    4057468287575835392
    4057482027171038976
    4057470349160630656
    4057470039924301696
    4057469868125641984
    4057468351995073024
    4057469661959554560
    4057470520960672640
    4057470555320409600
    -
    -

    Exercise: When you are debugging queries like this, you can use TOP to limit the size of the results, but then you still don’t know how big the results will be.

    -

    An alternative is to use COUNT, which asks for the number of rows that would be selected, but it does not return them.

    -

    In the previous query, replace TOP 10 source_id with COUNT(source_id) and run the query again. How many stars has Gaia identified in the cone we searched?

    -
    -
    -

    Getting GD-1 Data

    -

    From the Price-Whelan and Bonaca paper, we will try to reproduce Figure 1, which includes this representation of stars likely to belong to GD-1:

    -

    Along the axis of right ascension (\(\phi_1\)) the figure extends from -100 to 20 degrees.

    -

    Along the axis of declination (\(\phi_2\)) the figure extends from about -8 to 4 degrees.

    -

    Ideally, we would select all stars from this rectangle, but there are more than 10 million of them, so

    -
      -
    • That would be difficult to work with,

    • -
    • As anonymous users, we are limited to 3 million rows in a single query, and

    • -
    • While we are developing and testing code, it will be faster to work with a smaller dataset.

    • -
    -

    So we’ll start by selecting stars in a smaller rectangle, from -55 to -45 degrees right ascension and -8 to 4 degrees of declination.

    -

    But first we let’s see how to represent quantities with units like degrees.

    -
    -
    -

    Working with coordinates

    -

    Coordinates are physical quantities, which means that they have two parts, a value and a unit.

    -

    For example, the coordinate \(30^{\circ}\) has value 30 and its units are degrees.

    -

    Until recently, most scientific computation was done with values only; units were left out of the program altogether, often with disastrous results.

    -

    Astropy provides tools for including units explicitly in computations, which makes it possible to detect errors before they cause disasters.

    -

    To use Astropy units, we import them like this:

    -
    -
    -
    import astropy.units as u
    -
    -u
    -
    -
    -
    -
    -
    <module 'astropy.units' from '/home/downey/anaconda3/envs/AstronomicalData/lib/python3.8/site-packages/astropy/units/__init__.py'>
    -
    -
    -
    -
    -

    u is an object that contains most common units and all SI units.

    -

    You can use dir to list them, but you should also read the documentation.

    -
    -
    -
    dir(u)
    -
    -
    -
    -
    -
    ['A',
    - 'AA',
    - 'AB',
    - 'ABflux',
    - 'ABmag',
    - 'AU',
    - 'Angstrom',
    - 'B',
    - 'Ba',
    - 'Barye',
    - 'Bi',
    - 'Biot',
    - 'Bol',
    - 'Bq',
    - 'C',
    - 'Celsius',
    - 'Ci',
    - 'CompositeUnit',
    - 'D',
    - 'Da',
    - 'Dalton',
    - 'Debye',
    - 'Decibel',
    - 'DecibelUnit',
    - 'Dex',
    - 'DexUnit',
    - 'EA',
    - 'EAU',
    - 'EB',
    - 'EBa',
    - 'EC',
    - 'ED',
    - 'EF',
    - 'EG',
    - 'EGal',
    - 'EH',
    - 'EHz',
    - 'EJ',
    - 'EJy',
    - 'EK',
    - 'EL',
    - 'EN',
    - 'EOhm',
    - 'EP',
    - 'EPa',
    - 'ER',
    - 'ERy',
    - 'ES',
    - 'ESt',
    - 'ET',
    - 'EV',
    - 'EW',
    - 'EWb',
    - 'Ea',
    - 'Eadu',
    - 'Earcmin',
    - 'Earcsec',
    - 'Eau',
    - 'Eb',
    - 'Ebarn',
    - 'Ebeam',
    - 'Ebin',
    - 'Ebit',
    - 'Ebyte',
    - 'Ecd',
    - 'Echan',
    - 'Ecount',
    - 'Ect',
    - 'Ed',
    - 'Edeg',
    - 'Edyn',
    - 'EeV',
    - 'Eerg',
    - 'Eg',
    - 'Eh',
    - 'EiB',
    - 'Eib',
    - 'Eibit',
    - 'Eibyte',
    - 'Ek',
    - 'El',
    - 'Elm',
    - 'Elx',
    - 'Elyr',
    - 'Em',
    - 'Emag',
    - 'Emin',
    - 'Emol',
    - 'Eohm',
    - 'Epc',
    - 'Eph',
    - 'Ephoton',
    - 'Epix',
    - 'Epixel',
    - 'Erad',
    - 'Es',
    - 'Esr',
    - 'Eu',
    - 'Evox',
    - 'Evoxel',
    - 'Eyr',
    - 'F',
    - 'Farad',
    - 'Fr',
    - 'Franklin',
    - 'FunctionQuantity',
    - 'FunctionUnitBase',
    - 'G',
    - 'GA',
    - 'GAU',
    - 'GB',
    - 'GBa',
    - 'GC',
    - 'GD',
    - 'GF',
    - 'GG',
    - 'GGal',
    - 'GH',
    - 'GHz',
    - 'GJ',
    - 'GJy',
    - 'GK',
    - 'GL',
    - 'GN',
    - 'GOhm',
    - 'GP',
    - 'GPa',
    - 'GR',
    - 'GRy',
    - 'GS',
    - 'GSt',
    - 'GT',
    - 'GV',
    - 'GW',
    - 'GWb',
    - 'Ga',
    - 'Gadu',
    - 'Gal',
    - 'Garcmin',
    - 'Garcsec',
    - 'Gau',
    - 'Gauss',
    - 'Gb',
    - 'Gbarn',
    - 'Gbeam',
    - 'Gbin',
    - 'Gbit',
    - 'Gbyte',
    - 'Gcd',
    - 'Gchan',
    - 'Gcount',
    - 'Gct',
    - 'Gd',
    - 'Gdeg',
    - 'Gdyn',
    - 'GeV',
    - 'Gerg',
    - 'Gg',
    - 'Gh',
    - 'GiB',
    - 'Gib',
    - 'Gibit',
    - 'Gibyte',
    - 'Gk',
    - 'Gl',
    - 'Glm',
    - 'Glx',
    - 'Glyr',
    - 'Gm',
    - 'Gmag',
    - 'Gmin',
    - 'Gmol',
    - 'Gohm',
    - 'Gpc',
    - 'Gph',
    - 'Gphoton',
    - 'Gpix',
    - 'Gpixel',
    - 'Grad',
    - 'Gs',
    - 'Gsr',
    - 'Gu',
    - 'Gvox',
    - 'Gvoxel',
    - 'Gyr',
    - 'H',
    - 'Henry',
    - 'Hertz',
    - 'Hz',
    - 'IrreducibleUnit',
    - 'J',
    - 'Jansky',
    - 'Joule',
    - 'Jy',
    - 'K',
    - 'Kayser',
    - 'Kelvin',
    - 'KiB',
    - 'Kib',
    - 'Kibit',
    - 'Kibyte',
    - 'L',
    - 'L_bol',
    - 'L_sun',
    - 'LogQuantity',
    - 'LogUnit',
    - 'Lsun',
    - 'MA',
    - 'MAU',
    - 'MB',
    - 'MBa',
    - 'MC',
    - 'MD',
    - 'MF',
    - 'MG',
    - 'MGal',
    - 'MH',
    - 'MHz',
    - 'MJ',
    - 'MJy',
    - 'MK',
    - 'ML',
    - 'MN',
    - 'MOhm',
    - 'MP',
    - 'MPa',
    - 'MR',
    - 'MRy',
    - 'MS',
    - 'MSt',
    - 'MT',
    - 'MV',
    - 'MW',
    - 'MWb',
    - 'M_bol',
    - 'M_e',
    - 'M_earth',
    - 'M_jup',
    - 'M_jupiter',
    - 'M_p',
    - 'M_sun',
    - 'Ma',
    - 'Madu',
    - 'MagUnit',
    - 'Magnitude',
    - 'Marcmin',
    - 'Marcsec',
    - 'Mau',
    - 'Mb',
    - 'Mbarn',
    - 'Mbeam',
    - 'Mbin',
    - 'Mbit',
    - 'Mbyte',
    - 'Mcd',
    - 'Mchan',
    - 'Mcount',
    - 'Mct',
    - 'Md',
    - 'Mdeg',
    - 'Mdyn',
    - 'MeV',
    - 'Mearth',
    - 'Merg',
    - 'Mg',
    - 'Mh',
    - 'MiB',
    - 'Mib',
    - 'Mibit',
    - 'Mibyte',
    - 'Mjup',
    - 'Mjupiter',
    - 'Mk',
    - 'Ml',
    - 'Mlm',
    - 'Mlx',
    - 'Mlyr',
    - 'Mm',
    - 'Mmag',
    - 'Mmin',
    - 'Mmol',
    - 'Mohm',
    - 'Mpc',
    - 'Mph',
    - 'Mphoton',
    - 'Mpix',
    - 'Mpixel',
    - 'Mrad',
    - 'Ms',
    - 'Msr',
    - 'Msun',
    - 'Mu',
    - 'Mvox',
    - 'Mvoxel',
    - 'Myr',
    - 'N',
    - 'NamedUnit',
    - 'Newton',
    - 'Ohm',
    - 'P',
    - 'PA',
    - 'PAU',
    - 'PB',
    - 'PBa',
    - 'PC',
    - 'PD',
    - 'PF',
    - 'PG',
    - 'PGal',
    - 'PH',
    - 'PHz',
    - 'PJ',
    - 'PJy',
    - 'PK',
    - 'PL',
    - 'PN',
    - 'POhm',
    - 'PP',
    - 'PPa',
    - 'PR',
    - 'PRy',
    - 'PS',
    - 'PSt',
    - 'PT',
    - 'PV',
    - 'PW',
    - 'PWb',
    - 'Pa',
    - 'Padu',
    - 'Parcmin',
    - 'Parcsec',
    - 'Pascal',
    - 'Pau',
    - 'Pb',
    - 'Pbarn',
    - 'Pbeam',
    - 'Pbin',
    - 'Pbit',
    - 'Pbyte',
    - 'Pcd',
    - 'Pchan',
    - 'Pcount',
    - 'Pct',
    - 'Pd',
    - 'Pdeg',
    - 'Pdyn',
    - 'PeV',
    - 'Perg',
    - 'Pg',
    - 'Ph',
    - 'PiB',
    - 'Pib',
    - 'Pibit',
    - 'Pibyte',
    - 'Pk',
    - 'Pl',
    - 'Plm',
    - 'Plx',
    - 'Plyr',
    - 'Pm',
    - 'Pmag',
    - 'Pmin',
    - 'Pmol',
    - 'Pohm',
    - 'Ppc',
    - 'Pph',
    - 'Pphoton',
    - 'Ppix',
    - 'Ppixel',
    - 'Prad',
    - 'PrefixUnit',
    - 'Ps',
    - 'Psr',
    - 'Pu',
    - 'Pvox',
    - 'Pvoxel',
    - 'Pyr',
    - 'Quantity',
    - 'QuantityInfo',
    - 'QuantityInfoBase',
    - 'R',
    - 'R_earth',
    - 'R_jup',
    - 'R_jupiter',
    - 'R_sun',
    - 'Rayleigh',
    - 'Rearth',
    - 'Rjup',
    - 'Rjupiter',
    - 'Rsun',
    - 'Ry',
    - 'S',
    - 'ST',
    - 'STflux',
    - 'STmag',
    - 'Siemens',
    - 'SpecificTypeQuantity',
    - 'St',
    - 'Sun',
    - 'T',
    - 'TA',
    - 'TAU',
    - 'TB',
    - 'TBa',
    - 'TC',
    - 'TD',
    - 'TF',
    - 'TG',
    - 'TGal',
    - 'TH',
    - 'THz',
    - 'TJ',
    - 'TJy',
    - 'TK',
    - 'TL',
    - 'TN',
    - 'TOhm',
    - 'TP',
    - 'TPa',
    - 'TR',
    - 'TRy',
    - 'TS',
    - 'TSt',
    - 'TT',
    - 'TV',
    - 'TW',
    - 'TWb',
    - 'Ta',
    - 'Tadu',
    - 'Tarcmin',
    - 'Tarcsec',
    - 'Tau',
    - 'Tb',
    - 'Tbarn',
    - 'Tbeam',
    - 'Tbin',
    - 'Tbit',
    - 'Tbyte',
    - 'Tcd',
    - 'Tchan',
    - 'Tcount',
    - 'Tct',
    - 'Td',
    - 'Tdeg',
    - 'Tdyn',
    - 'TeV',
    - 'Terg',
    - 'Tesla',
    - 'Tg',
    - 'Th',
    - 'TiB',
    - 'Tib',
    - 'Tibit',
    - 'Tibyte',
    - 'Tk',
    - 'Tl',
    - 'Tlm',
    - 'Tlx',
    - 'Tlyr',
    - 'Tm',
    - 'Tmag',
    - 'Tmin',
    - 'Tmol',
    - 'Tohm',
    - 'Tpc',
    - 'Tph',
    - 'Tphoton',
    - 'Tpix',
    - 'Tpixel',
    - 'Trad',
    - 'Ts',
    - 'Tsr',
    - 'Tu',
    - 'Tvox',
    - 'Tvoxel',
    - 'Tyr',
    - 'Unit',
    - 'UnitBase',
    - 'UnitConversionError',
    - 'UnitTypeError',
    - 'UnitsError',
    - 'UnitsWarning',
    - 'UnrecognizedUnit',
    - 'V',
    - 'Volt',
    - 'W',
    - 'Watt',
    - 'Wb',
    - 'Weber',
    - 'YA',
    - 'YAU',
    - 'YB',
    - 'YBa',
    - 'YC',
    - 'YD',
    - 'YF',
    - 'YG',
    - 'YGal',
    - 'YH',
    - 'YHz',
    - 'YJ',
    - 'YJy',
    - 'YK',
    - 'YL',
    - 'YN',
    - 'YOhm',
    - 'YP',
    - 'YPa',
    - 'YR',
    - 'YRy',
    - 'YS',
    - 'YSt',
    - 'YT',
    - 'YV',
    - 'YW',
    - 'YWb',
    - 'Ya',
    - 'Yadu',
    - 'Yarcmin',
    - 'Yarcsec',
    - 'Yau',
    - 'Yb',
    - 'Ybarn',
    - 'Ybeam',
    - 'Ybin',
    - 'Ybit',
    - 'Ybyte',
    - 'Ycd',
    - 'Ychan',
    - 'Ycount',
    - 'Yct',
    - 'Yd',
    - 'Ydeg',
    - 'Ydyn',
    - 'YeV',
    - 'Yerg',
    - 'Yg',
    - 'Yh',
    - 'Yk',
    - 'Yl',
    - 'Ylm',
    - 'Ylx',
    - 'Ylyr',
    - 'Ym',
    - 'Ymag',
    - 'Ymin',
    - 'Ymol',
    - 'Yohm',
    - 'Ypc',
    - 'Yph',
    - 'Yphoton',
    - 'Ypix',
    - 'Ypixel',
    - 'Yrad',
    - 'Ys',
    - 'Ysr',
    - 'Yu',
    - 'Yvox',
    - 'Yvoxel',
    - 'Yyr',
    - 'ZA',
    - 'ZAU',
    - 'ZB',
    - 'ZBa',
    - 'ZC',
    - 'ZD',
    - 'ZF',
    - 'ZG',
    - 'ZGal',
    - 'ZH',
    - 'ZHz',
    - 'ZJ',
    - 'ZJy',
    - 'ZK',
    - 'ZL',
    - 'ZN',
    - 'ZOhm',
    - 'ZP',
    - 'ZPa',
    - 'ZR',
    - 'ZRy',
    - 'ZS',
    - 'ZSt',
    - 'ZT',
    - 'ZV',
    - 'ZW',
    - 'ZWb',
    - 'Za',
    - 'Zadu',
    - 'Zarcmin',
    - 'Zarcsec',
    - 'Zau',
    - 'Zb',
    - 'Zbarn',
    - 'Zbeam',
    - 'Zbin',
    - 'Zbit',
    - 'Zbyte',
    - 'Zcd',
    - 'Zchan',
    - 'Zcount',
    - 'Zct',
    - 'Zd',
    - 'Zdeg',
    - 'Zdyn',
    - 'ZeV',
    - 'Zerg',
    - 'Zg',
    - 'Zh',
    - 'Zk',
    - 'Zl',
    - 'Zlm',
    - 'Zlx',
    - 'Zlyr',
    - 'Zm',
    - 'Zmag',
    - 'Zmin',
    - 'Zmol',
    - 'Zohm',
    - 'Zpc',
    - 'Zph',
    - 'Zphoton',
    - 'Zpix',
    - 'Zpixel',
    - 'Zrad',
    - 'Zs',
    - 'Zsr',
    - 'Zu',
    - 'Zvox',
    - 'Zvoxel',
    - 'Zyr',
    - '__builtins__',
    - '__cached__',
    - '__doc__',
    - '__file__',
    - '__loader__',
    - '__name__',
    - '__package__',
    - '__path__',
    - '__spec__',
    - 'a',
    - 'aA',
    - 'aAU',
    - 'aB',
    - 'aBa',
    - 'aC',
    - 'aD',
    - 'aF',
    - 'aG',
    - 'aGal',
    - 'aH',
    - 'aHz',
    - 'aJ',
    - 'aJy',
    - 'aK',
    - 'aL',
    - 'aN',
    - 'aOhm',
    - 'aP',
    - 'aPa',
    - 'aR',
    - 'aRy',
    - 'aS',
    - 'aSt',
    - 'aT',
    - 'aV',
    - 'aW',
    - 'aWb',
    - 'aa',
    - 'aadu',
    - 'aarcmin',
    - 'aarcsec',
    - 'aau',
    - 'ab',
    - 'abA',
    - 'abC',
    - 'abampere',
    - 'abarn',
    - 'abcoulomb',
    - 'abeam',
    - 'abin',
    - 'abit',
    - 'abyte',
    - 'acd',
    - 'achan',
    - 'acount',
    - 'act',
    - 'ad',
    - 'add_enabled_equivalencies',
    - 'add_enabled_units',
    - 'adeg',
    - 'adu',
    - 'adyn',
    - 'aeV',
    - 'aerg',
    - 'ag',
    - 'ah',
    - 'ak',
    - 'al',
    - 'allclose',
    - 'alm',
    - 'alx',
    - 'alyr',
    - 'am',
    - 'amag',
    - 'amin',
    - 'amol',
    - 'amp',
    - 'ampere',
    - 'angstrom',
    - 'annum',
    - 'aohm',
    - 'apc',
    - 'aph',
    - 'aphoton',
    - 'apix',
    - 'apixel',
    - 'arad',
    - 'arcmin',
    - 'arcminute',
    - 'arcsec',
    - 'arcsecond',
    - 'asr',
    - 'astronomical_unit',
    - 'astrophys',
    - 'attoBarye',
    - 'attoDa',
    - 'attoDalton',
    - 'attoDebye',
    - 'attoFarad',
    - 'attoGauss',
    - 'attoHenry',
    - 'attoHertz',
    - 'attoJansky',
    - 'attoJoule',
    - 'attoKayser',
    - 'attoKelvin',
    - 'attoNewton',
    - 'attoOhm',
    - 'attoPascal',
    - 'attoRayleigh',
    - 'attoSiemens',
    - 'attoTesla',
    - 'attoVolt',
    - 'attoWatt',
    - 'attoWeber',
    - 'attoamp',
    - 'attoampere',
    - 'attoannum',
    - 'attoarcminute',
    - 'attoarcsecond',
    - 'attoastronomical_unit',
    - 'attobarn',
    - 'attobarye',
    - 'attobit',
    - 'attobyte',
    - 'attocandela',
    - 'attocoulomb',
    - 'attocount',
    - 'attoday',
    - 'attodebye',
    - 'attodegree',
    - 'attodyne',
    - 'attoelectronvolt',
    - 'attofarad',
    - 'attogal',
    - 'attogauss',
    - 'attogram',
    - 'attohenry',
    - 'attohertz',
    - 'attohour',
    - 'attohr',
    - 'attojansky',
    - 'attojoule',
    - 'attokayser',
    - 'attolightyear',
    - 'attoliter',
    - 'attolumen',
    - 'attolux',
    - 'attometer',
    - 'attominute',
    - 'attomole',
    - 'attonewton',
    - 'attoparsec',
    - 'attopascal',
    - 'attophoton',
    - 'attopixel',
    - 'attopoise',
    - 'attoradian',
    - 'attorayleigh',
    - 'attorydberg',
    - 'attosecond',
    - 'attosiemens',
    - 'attosteradian',
    - 'attostokes',
    - 'attotesla',
    - 'attovolt',
    - 'attovoxel',
    - 'attowatt',
    - 'attoweber',
    - 'attoyear',
    - 'au',
    - 'avox',
    - 'avoxel',
    - 'ayr',
    - 'b',
    - 'bar',
    - 'barn',
    - 'barye',
    - 'beam',
    - 'beam_angular_area',
    - 'becquerel',
    - 'bin',
    - 'binary_prefixes',
    - 'bit',
    - 'bol',
    - 'brightness_temperature',
    - 'byte',
    - 'cA',
    - 'cAU',
    - 'cB',
    - 'cBa',
    - 'cC',
    - 'cD',
    - 'cF',
    - 'cG',
    - 'cGal',
    - 'cH',
    - 'cHz',
    - 'cJ',
    - 'cJy',
    - 'cK',
    - 'cL',
    - 'cN',
    - 'cOhm',
    - 'cP',
    - 'cPa',
    - 'cR',
    - 'cRy',
    - 'cS',
    - 'cSt',
    - 'cT',
    - 'cV',
    - 'cW',
    - 'cWb',
    - 'ca',
    - 'cadu',
    - 'candela',
    - 'carcmin',
    - 'carcsec',
    - 'cau',
    - 'cb',
    - 'cbarn',
    - 'cbeam',
    - 'cbin',
    - 'cbit',
    - 'cbyte',
    - 'ccd',
    - 'cchan',
    - 'ccount',
    - 'cct',
    - 'cd',
    - 'cdeg',
    - 'cdyn',
    - 'ceV',
    - 'centiBarye',
    - 'centiDa',
    - 'centiDalton',
    - 'centiDebye',
    - 'centiFarad',
    - 'centiGauss',
    - 'centiHenry',
    - 'centiHertz',
    - 'centiJansky',
    - 'centiJoule',
    - 'centiKayser',
    - 'centiKelvin',
    - 'centiNewton',
    - 'centiOhm',
    - 'centiPascal',
    - 'centiRayleigh',
    - 'centiSiemens',
    - 'centiTesla',
    - 'centiVolt',
    - 'centiWatt',
    - 'centiWeber',
    - 'centiamp',
    - 'centiampere',
    - 'centiannum',
    - 'centiarcminute',
    - 'centiarcsecond',
    - 'centiastronomical_unit',
    - 'centibarn',
    - 'centibarye',
    - 'centibit',
    - 'centibyte',
    - 'centicandela',
    - 'centicoulomb',
    - 'centicount',
    - 'centiday',
    - 'centidebye',
    - 'centidegree',
    - 'centidyne',
    - 'centielectronvolt',
    - 'centifarad',
    - 'centigal',
    - 'centigauss',
    - 'centigram',
    - 'centihenry',
    - 'centihertz',
    - 'centihour',
    - 'centihr',
    - 'centijansky',
    - 'centijoule',
    - 'centikayser',
    - 'centilightyear',
    - 'centiliter',
    - 'centilumen',
    - 'centilux',
    - 'centimeter',
    - 'centiminute',
    - 'centimole',
    - 'centinewton',
    - 'centiparsec',
    - 'centipascal',
    - 'centiphoton',
    - 'centipixel',
    - 'centipoise',
    - 'centiradian',
    - 'centirayleigh',
    - 'centirydberg',
    - 'centisecond',
    - 'centisiemens',
    - 'centisteradian',
    - 'centistokes',
    - 'centitesla',
    - 'centivolt',
    - 'centivoxel',
    - 'centiwatt',
    - 'centiweber',
    - 'centiyear',
    - 'cerg',
    - 'cg',
    - 'cgs',
    - 'ch',
    - 'chan',
    - 'ck',
    - 'cl',
    - 'clm',
    - 'clx',
    - 'clyr',
    - 'cm',
    - 'cmag',
    - 'cmin',
    - 'cmol',
    - 'cohm',
    - 'core',
    - 'coulomb',
    - 'count',
    - 'cpc',
    - 'cph',
    - 'cphoton',
    - 'cpix',
    - 'cpixel',
    - 'crad',
    - 'cs',
    - 'csr',
    - 'ct',
    - 'cu',
    - 'curie',
    - 'cvox',
    - 'cvoxel',
    - 'cy',
    - 'cycle',
    - 'cyr',
    - 'd',
    - 'dA',
    - 'dAU',
    - 'dB',
    - 'dBa',
    - 'dC',
    - 'dD',
    - 'dF',
    - 'dG',
    - 'dGal',
    - 'dH',
    - 'dHz',
    - 'dJ',
    - 'dJy',
    - 'dK',
    - 'dL',
    - 'dN',
    - 'dOhm',
    - 'dP',
    - 'dPa',
    - 'dR',
    - 'dRy',
    - 'dS',
    - 'dSt',
    - 'dT',
    - ...]
    -
    -
    -
    -
    -

    To create a quantity, we multiply a value by a unit.

    -
    -
    -
    coord = 30 * u.deg
    -type(coord)
    -
    -
    -
    -
    -
    astropy.units.quantity.Quantity
    -
    -
    -
    -
    -

    The result is a Quantity object.

    -

    Jupyter knows how to display Quantities like this:

    -
    -
    -
    coord
    -
    -
    -
    -
    -
    -\[30 \; \mathrm{{}^{\circ}}\]
    -
    -
    -
    -
    -

    Selecting a rectangle

    -

    Now we’ll select a rectangle from -55 to -45 degrees right ascension and -8 to 4 degrees of declination.

    -

    We’ll define variables to contain these limits.

    -
    -
    -
    phi1_min = -55
    -phi1_max = -45
    -phi2_min = -8
    -phi2_max = 4
    -
    -
    -
    -
    -

    To represent a rectangle, we’ll use two lists of coordinates and multiply by their units.

    -
    -
    -
    phi1_rect = [phi1_min, phi1_min, phi1_max, phi1_max] * u.deg
    -phi2_rect = [phi2_min, phi2_max, phi2_max, phi2_min] * u.deg
    -
    -
    -
    -
    -

    phi1_rect and phi2_rect represent the coordinates of the corners of a rectangle.

    -

    But they are in “a Heliocentric spherical coordinate system defined by the orbit of the GD1 stream

    -

    In order to use them in a Gaia query, we have to convert them to International Celestial Reference System (ICRS) coordinates. We can do that by storing the coordinates in a GD1Koposov10 object provided by Gala.

    -
    -
    -
    import gala.coordinates as gc
    -
    -corners = gc.GD1Koposov10(phi1=phi1_rect, phi2=phi2_rect)
    -type(corners)
    -
    -
    -
    -
    -
    gala.coordinates.gd1.GD1Koposov10
    -
    -
    -
    -
    -

    We can display the result like this:

    -
    -
    -
    corners
    -
    -
    -
    -
    -
    <GD1Koposov10 Coordinate: (phi1, phi2) in deg
    -    [(-55., -8.), (-55.,  4.), (-45.,  4.), (-45., -8.)]>
    -
    -
    -
    -
    -

    Now we can use transform_to to convert to ICRS coordinates.

    -
    -
    -
    import astropy.coordinates as coord
    -
    -corners_icrs = corners.transform_to(coord.ICRS)
    -type(corners_icrs)
    -
    -
    -
    -
    -
    astropy.coordinates.builtin_frames.icrs.ICRS
    -
    -
    -
    -
    -

    The result is an ICRS object.

    -
    -
    -
    corners_icrs
    -
    -
    -
    -
    -
    <ICRS Coordinate: (ra, dec) in deg
    -    [(146.27533314, 19.26190982), (135.42163944, 25.87738723),
    -     (141.60264825, 34.3048303 ), (152.81671045, 27.13611254)]>
    -
    -
    -
    -
    -

    Notice that a rectangle in one coordinate system is not necessarily a rectangle in another. In this example, the result is a polygon.

    -
    -
    -

    Selecting a polygon

    -

    In order to use this polygon as part of an ADQL query, we have to convert it to a string with a comma-separated list of coordinates, as in this example:

    -
    """
    -POLYGON(143.65, 20.98, 
    -        134.46, 26.39, 
    -        140.58, 34.85, 
    -        150.16, 29.01)
    -"""
    -
    -
    -

    corners_icrs behaves like a list, so we can use a for loop to iterate through the points.

    -
    -
    -
    for point in corners_icrs:
    -    print(point)
    -
    -
    -
    -
    -
    <ICRS Coordinate: (ra, dec) in deg
    -    (146.27533314, 19.26190982)>
    -<ICRS Coordinate: (ra, dec) in deg
    -    (135.42163944, 25.87738723)>
    -<ICRS Coordinate: (ra, dec) in deg
    -    (141.60264825, 34.3048303)>
    -<ICRS Coordinate: (ra, dec) in deg
    -    (152.81671045, 27.13611254)>
    -
    -
    -
    -
    -

    From that, we can select the coordinates ra and dec:

    -
    -
    -
    for point in corners_icrs:
    -    print(point.ra, point.dec)
    -
    -
    -
    -
    -
    146d16m31.1993s 19d15m42.8754s
    -135d25m17.902s 25d52m38.594s
    -141d36m09.5337s 34d18m17.3891s
    -152d49m00.1576s 27d08m10.0051s
    -
    -
    -
    -
    -

    The results are quantities with units, but if we select the value part, we get a dimensionless floating-point number.

    -
    -
    -
    for point in corners_icrs:
    -    print(point.ra.value, point.dec.value)
    -
    -
    -
    -
    -
    146.27533313607782 19.261909820533692
    -135.42163944306296 25.87738722767213
    -141.60264825107333 34.304830296257144
    -152.81671044675923 27.136112541397996
    -
    -
    -
    -
    -

    We can use string format to convert these numbers to strings.

    -
    -
    -
    point_base = "{point.ra.value}, {point.dec.value}"
    -
    -t = [point_base.format(point=point)
    -     for point in corners_icrs]
    -t
    -
    -
    -
    -
    -
    ['146.27533313607782, 19.261909820533692',
    - '135.42163944306296, 25.87738722767213',
    - '141.60264825107333, 34.304830296257144',
    - '152.81671044675923, 27.136112541397996']
    -
    -
    -
    -
    -

    The result is a list of strings, which we can join into a single string using join.

    -
    -
    -
    point_list = ', '.join(t)
    -point_list
    -
    -
    -
    -
    -
    '146.27533313607782, 19.261909820533692, 135.42163944306296, 25.87738722767213, 141.60264825107333, 34.304830296257144, 152.81671044675923, 27.136112541397996'
    -
    -
    -
    -
    -

    Notice that we invoke join on a string and pass the list as an argument.

    -

    Before we can assemble the query, we need columns again (as we saw in the previous notebook).

    -
    -
    -
    columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'
    -
    -
    -
    -
    -

    Here’s the base for the query, with format specifiers for columns and point_list.

    -
    -
    -
    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 here’s the result:

    -
    -
    -
    query = query_base.format(columns=columns, 
    -                          point_list=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(146.27533313607782, 19.261909820533692, 135.42163944306296, 25.87738722767213, 141.60264825107333, 34.304830296257144, 152.81671044675923, 27.136112541397996))
    -
    -
    -
    -
    -

    As always, we should take a minute to proof-read the query before we launch it.

    -

    The result will be bigger than our previous queries, so it will take a little longer.

    -
    -
    -
    job = Gaia.launch_job_async(query)
    -print(job)
    -
    -
    -
    -
    -
    INFO: Query finished. [astroquery.utils.tap.core]
    -<Table length=140340>
    -      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 139374
    -Jobid: 1603114980658O
    -Phase: COMPLETED
    -Owner: None
    -Output file: async_20201019094300.vot
    -Results: None
    -
    -
    -
    -
    -

    Here are the results.

    -
    -
    -
    results = job.get_results()
    -len(results)
    -
    -
    -
    -
    -
    140340
    -
    -
    -
    -
    -

    There are more than 100,000 stars in this polygon, but that’s a manageable size to work with.

    -
    -
    -

    Saving results

    -

    This is the set of stars we’ll work with in the next step. But since we have a substantial dataset now, this is a good time to save it.

    -

    Storing the data in a file means we can shut down this notebook and pick up where we left off without running the previous query again.

    -

    Astropy Table objects provide write, which writes the table to disk.

    -
    -
    -
    filename = 'gd1_results.fits'
    -results.write(filename, overwrite=True)
    -
    -
    -
    -
    -

    Because the filename ends with fits, the table is written in the FITS format, which preserves the metadata associated with the table.

    -

    If the file already exists, the overwrite argument causes it to be overwritten.

    -

    To see how big the file is, we can use ls with the -lh option, which prints information about the file including its size in human-readable form.

    -
    -
    -
    !ls -lh gd1_results.fits
    -
    -
    -
    -
    -
    -rw-rw-r-- 1 downey downey 8.6M Oct 19 09:43 gd1_results.fits
    -
    -
    -
    -
    -

    The file is about 8.6 MB. If you are using Windows, ls might not work; in that case, try:

    -
    !dir gd1_results.fits
    -
    -
    -
    -
    -

    Summary

    -

    In this notebook, we composed more complex queries to select stars within a polygonal region of the sky. Then we downloaded the results and saved them in a FITS file.

    -

    In the next notebook, we’ll reload the data from this file and replicate the next step in the analysis, using proper motion to identify stars likely to be in GD-1.

    -
    -
    -

    Best practices

    -
      -
    • For measurements with units, use Quantity objects that represent units explicitly and check for errors.

    • -
    • Use the format function to compose queries; it is often faster and less error-prone.

    • -
    • Develop queries incrementally: start with something simple, test it, and add a little bit at a time.

    • -
    • Once you have a query working, save the data in a local file. If you shut down the notebook and come back to it later, you can reload the file; you don’t have to run the query again.

    • -
    -
    -
    - - - - -
    - -
    -
    - - -
    - - -
    -
    -
    -

    - - By Allen B. Downey
    - - © Copyright 2020.
    -

    -
    -
    -
    - - -
    -
    - - - - - - - - \ No newline at end of file diff --git a/AstronomicalData/README.html b/AstronomicalData/README.html deleted file mode 100644 index 3e73f5d..0000000 --- a/AstronomicalData/README.html +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - - Astronomical Data in Python — Astronomical Data in Python - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - -
    - - - - - - - - - - - - -
    - - -
    - -
    -
    -
    -
    - -
    - -
    -

    Astronomical Data in Python

    -

    Astronomical Data in Python is an introduction to tools and practices for working with astronomical data. Topics covered include:

    -
      -
    • Writing queries that select and download data from a database.

    • -
    • Using data stored in an Astropy Table or Pandas DataFrame.

    • -
    • Working with coordinates and other quantities with units.

    • -
    • Storing data in various formats.

    • -
    • Performing database join operations that combine data from multiple tables.

    • -
    • Visualizing data and preparing publication-quality figures.

    • -
    -

    As a running example, we will replicate part of the analysis in a recent paper, “Off the beaten path: Gaia reveals GD-1 stars outside of the main stream” by Adrian M. Price-Whelan and Ana Bonaca.

    -

    This material was developed in collaboration with The Carpentries and the Astronomy Curriculum Development Committee, and supported by funding from the American Institute of Physics through the American Astronomical Society.

    -

    I am grateful for contributions from the members of the committee – Azalee Bostroem, Rodolfo Montez, and Phil Rosenfield – and from Erin Becker, Brett Morris and Adrian Price-Whelan.

    -

    The original format of this material is a series of Jupyter notebooks. Using the -links below, you can read the notebooks on NBViewer or run them on Colab. If you -want to run the notebooks in your own environment, you can download them from -this repository and follow the instructions below to set up your environment.

    -

    This material is also available in the form of Carpentries lessons, but you should be -aware that these versions might diverge in the future.

    -

    Prerequisites

    -

    This material should be accessible to people familiar with basic Python, but not necessarily the libraries we will use, like Astropy or Pandas. If you are familiar with Python lists and dictionaries, and you know how to write a function that takes parameters and returns a value, that should be enough.

    -

    We assume that you are familiar with astronomy at the undergraduate level, but we will not assume specialized knowledge of the datasets or analysis methods we’ll use.

    -

    Notebook 1

    -

    This notebook demonstrates the following steps:

    -
      -
    1. Making a connection to the Gaia server,

    2. -
    3. Exploring information about the database and the tables it contains,

    4. -
    5. Writing a query and sending it to the server, and finally

    6. -
    7. Downloading the response from the server as an Astropy Table.

    8. -
    -

    Press this button to run this notebook on Colab:

    -

    -

    or click here to read it on NBViewer

    -

    Notebook 2

    -

    This notebook starts with an example that does a “cone search”; that is, it selects stars that appear in a circular region of the sky.

    -

    Then, to select stars in the vicinity of GD-1, we:

    -
      -
    • Use Quantity objects to represent measurements with units.

    • -
    • Use the Gala library to convert coordinates from one frame to another.

    • -
    • Use the ADQL keywords POLYGON, CONTAINS, and POINT to select stars that fall within a polygonal region.

    • -
    • Submit a query and download the results.

    • -
    • Store the results in a FITS file.

    • -
    -

    Press this button to run this notebook on Colab:

    -

    -

    or click here to read it on NBViewer

    -

    Notebook 3

    -

    Here are the steps in this notebook:

    -
      -
    1. We’ll read back the results from the previous notebook, which we saved in a FITS file.

    2. -
    3. Then we’ll transform the coordinates and proper motion data from ICRS back to the coordinate frame of GD-1.

    4. -
    5. We’ll put those results into a Pandas DataFrame, which we’ll use to select stars near the centerline of GD-1.

    6. -
    7. Plotting the proper motion of those stars, we’ll identify a region of proper motion for stars that are likely to be in GD-1.

    8. -
    9. Finally, we’ll select and plot the stars whose proper motion is in that region.

    10. -
    -

    Press this button to run this notebook on Colab:

    -

    -

    or click here to read it on NBViewer

    -

    Notebook 4

    -

    Here are the steps in this notebook:

    -
      -
    1. Using data from the previous notebook, we’ll identify the values of proper motion for stars likely to be in GD-1.

    2. -
    3. Then we’ll compose an ADQL query that selects stars based on proper motion, so we can download only the data we need.

    4. -
    5. We’ll also see how to write the results to a CSV file.

    6. -
    -

    That will make it possible to search a bigger region of the sky in a single query.

    -

    Press this button to run this notebook on Colab:

    -

    -

    or click here to read it on NBViewer

    -

    Notebook 5

    -

    Here are the steps in this notebook:

    -
      -
    1. We’ll reload the candidate stars we identified in the previous notebook.

    2. -
    3. Then we’ll run a query on the Gaia server that uploads the table of candidates and uses a JOIN operation to select photometry data for the candidate stars.

    4. -
    5. We’ll write the results to a file for use in the next notebook.

    6. -
    -

    Press this button to run this notebook on Colab:

    -

    -

    or click here to read it on NBViewer

    -

    Notebook 6

    -

    Here are the steps in this notebook:

    -
      -
    1. We’ll reload the data from the previous notebook and make a color-magnitude diagram.

    2. -
    3. Then we’ll specify a polygon in the diagram that contains stars with the photometry we expect.

    4. -
    5. Then we’ll merge the photometry data with the list of candidate stars, storing the result in a Pandas DataFrame.

    6. -
    -

    Press this button to run this notebook on Colab:

    -

    -

    or click here to read it on NBViewer

    -

    Notebook 7

    -

    Here are the steps in this notebook:

    -
      -
    1. Starting with the figure from the previous notebook, we’ll add annotations to present the results more clearly.

    2. -
    3. The we’ll see several ways to customize figures to make them more appealing and effective.

    4. -
    5. Finally, we’ll see how to make a figure with multiple panels or subplots.

    6. -
    -

    Press this button to run this notebook on Colab:

    -

    -

    or click here to read it on NBViewer

    -

    Installation instructions

    -

    Coming soon.

    -
    - - - - -
    - -
    -
    - - -
    - - -
    -
    -
    -

    - - By Allen B. Downey
    - - © Copyright 2020.
    -

    -
    -
    -
    - - -
    -
    - - - - - - - - \ No newline at end of file diff --git a/AstronomicalData/_build/html/_static/vendor/lato_latin-ext/1.44.1/LICENSE.html b/AstronomicalData/_build/html/_static/vendor/lato_latin-ext/1.44.1/LICENSE.html deleted file mode 100644 index b59ee64..0000000 --- a/AstronomicalData/_build/html/_static/vendor/lato_latin-ext/1.44.1/LICENSE.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - <no title> — Astronomical Data in Python - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - -
    - - - - - - - - - - - - -
    - - -
    - -
    - Contents -
    - - -
    -
    -
    -
    - -
    - -

    Copyright (c) 2019 Jan Bednar

    -

    Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -“Software”), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions:

    -

    The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software.

    -

    THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    - - - - -
    - -
    -
    - - -
    - - -
    -
    -
    -

    - - By Allen B. Downey
    - - © Copyright 2020.
    -

    -
    -
    -
    - - -
    -
    - - - - - - - - \ No newline at end of file diff --git a/AstronomicalData/_build/html/_static/vendor/open-sans_all/1.44.1/LICENSE.html b/AstronomicalData/_build/html/_static/vendor/open-sans_all/1.44.1/LICENSE.html deleted file mode 100644 index 2b73475..0000000 --- a/AstronomicalData/_build/html/_static/vendor/open-sans_all/1.44.1/LICENSE.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - <no title> — Astronomical Data in Python - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - -
    - - - - - - - - - - - - -
    - - -
    - -
    - Contents -
    - - -
    -
    -
    -
    - -
    - -

    Copyright (c) 2019 Jan Bednar

    -

    Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -“Software”), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions:

    -

    The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software.

    -

    THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    - - - - -
    - -
    -
    - - -
    - - -
    -
    -
    -

    - - By Allen B. Downey
    - - © Copyright 2020.
    -

    -
    -
    -
    - - -
    -
    - - - - - - - - \ No newline at end of file diff --git a/AstronomicalData/_build/jupyter_execute/01_query.html b/AstronomicalData/_build/jupyter_execute/01_query.html deleted file mode 100644 index 752cca2..0000000 --- a/AstronomicalData/_build/jupyter_execute/01_query.html +++ /dev/null @@ -1,1384 +0,0 @@ - - - - - - - - Lesson 1 — Astronomical Data in Python - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - -
    - - - - - - - - - - - - - - -
    - - - -
    -
    -
    - -
    - -
    -

    Lesson 1

    -
    -

    Introduction

    -

    This workshop is an introduction to tools and practices for working with astronomical data. Topics covered include:

    -
      -
    • Writing queries that select and download data from a database.

    • -
    • Using data stored in an Astropy Table or Pandas DataFrame.

    • -
    • Working with coordinates and other quantities with units.

    • -
    • Storing data in various formats.

    • -
    • Performing database join operations that combine data from multiple tables.

    • -
    • Visualizing data and preparing publication-quality figures.

    • -
    -

    As a running example, we will replicate part of the analysis in a recent paper, “Off the beaten path: Gaia reveals GD-1 stars outside of the main stream” by Adrian M. Price-Whelan and Ana Bonaca.

    -

    As the abstract explains, “Using data from the Gaia second data release combined with Pan-STARRS photometry, we present a sample of highly-probable members of the longest cold stream in the Milky Way, GD-1.”

    -

    GD-1 is a stellar stream, which is “an association of stars orbiting a galaxy that was once a globular cluster or dwarf galaxy that has now been torn apart and stretched out along its orbit by tidal forces.”

    -

    This article in Science magazine explains some of the background, including the process that led to the paper and an discussion of the scientific implications:

    -
      -
    • “The streams are particularly useful for … galactic archaeology — rewinding the cosmic clock to reconstruct the assembly of the Milky Way.”

    • -
    • “They also are being used as exquisitely sensitive scales to measure the galaxy’s mass.”

    • -
    • “… the streams are well-positioned to reveal the presence of dark matter … because the streams are so fragile, theorists say, collisions with marauding clumps of dark matter could leave telltale scars, potential clues to its nature.”

    • -
    -
    -
    -

    Prerequisites

    -

    This workshop is meant for people who are familiar with basic Python, but not necessarily the libraries we will use, like Astropy or Pandas. If you are familiar with Python lists and dictionaries, and you know how to write a function that takes parameters and returns a value, you know enough Python for this workshop.

    -

    We assume that you have some familiarity with operating systems, like the ability to use a command-line interface. But we don’t assume you have any prior experience with databases.

    -

    We assume that you are familiar with astronomy at the undergraduate level, but we will not assume specialized knowledge of the datasets or analysis methods we’ll use.

    -
    -
    -

    Data

    -

    The datasets we will work with are:

    -
      -
    • Gaia, which is “a space observatory of the European Space Agency (ESA), launched in 2013 … designed for astrometry: measuring the positions, distances and motions of stars with unprecedented precision”, and

    • -
    • Pan-STARRS, The Panoramic Survey Telescope and Rapid Response System, which is a survey designed to monitor the sky for transient objects, producing a catalog with accurate astronometry and photometry of detected sources.

    • -
    -

    Both of these datasets are very large, which can make them challenging to work with. It might not be possible, or practical, to download the entire dataset. -One of the goals of this workshop is to provide tools for working with large datasets.

    -
    -
    -

    Lesson 1

    -

    The first lesson demonstrates the steps for selecting and downloading data from the Gaia Database:

    -
      -
    1. First we’ll make a connection to the Gaia server,

    2. -
    3. We will explore information about the database and the tables it contains,

    4. -
    5. We will write a query and send it to the server, and finally

    6. -
    7. We will download the response from the server.

    8. -
    -

    After completing this lesson, you should be able to

    -
      -
    • Compose a basic query in ADQL.

    • -
    • Use queries to explore a database and its tables.

    • -
    • Use queries to download data.

    • -
    • Develop, test, and debug a query incrementally.

    • -
    -
    -
    -

    Query Language

    -

    In order to select data from a database, you have to compose a query, which is like a program written in a “query language”. -The query language we’ll use is ADQL, which stands for “Astronomical Data Query Language”.

    -

    ADQL is a dialect of SQL (Structured Query Language), which is by far the most commonly used query language. Almost everything you will learn about ADQL also works in SQL.

    -

    The reference manual for ADQL is here. -But you might find it easier to learn from this ADQL Cookbook.

    -
    -
    -

    Installing libraries

    -

    The library we’ll use to get Gaia data is Astroquery.

    -

    If you are running this notebook on Colab, you can run the following cell to install Astroquery and the other libraries we’ll use.

    -

    If you are running this notebook on your own computer, you might have to install these libraries yourself.

    -

    If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions.

    -

    TODO: Add a link to the instructions.

    -
    -
    -
    # 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
    -
    -
    -
    -
    -
    -
    -

    Connecting to Gaia

    -

    Astroquery provides Gaia, which is an object that represents a connection to the Gaia database.

    -

    We can connect to the Gaia database like this:

    -
    -
    -
    from astroquery.gaia import Gaia
    -
    -
    -
    -
    -
    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
    -
    -
    -
    -
    -
    -

    Optional detail

    -
    -

    Running this import statement has the effect of creating a TAP+ connection; TAP stands for “Table Access Protocol”. It is a network protocol for sending queries to the database and getting back the results. We’re not sure why it seems to create two connections.

    -
    -
    -
    -
    -

    Databases and Tables

    -

    What is a database, anyway? Most generally, it can be any collection of data, but when we are talking about ADQL or SQL:

    -
      -
    • A database is a collection of one or more named tables.

    • -
    • Each table is a 2-D array with one or more named columns of data.

    • -
    -

    We can use Gaia.load_tables to get the names of the tables in the Gaia database. With the option only_names=True, it loads information about the tables, called the “metadata”, not the data itself.

    -
    -
    -
    tables = Gaia.load_tables(only_names=True)
    -
    -
    -
    -
    -
    INFO: Retrieving tables... [astroquery.utils.tap.core]
    -INFO: Parsing tables... [astroquery.utils.tap.core]
    -INFO: Done. [astroquery.utils.tap.core]
    -
    -
    -
    -
    -
    -
    -
    for table in (tables):
    -    print(table.get_qualified_name())
    -
    -
    -
    -
    -
    external.external.apassdr9
    -external.external.gaiadr2_geometric_distance
    -external.external.galex_ais
    -external.external.ravedr5_com
    -external.external.ravedr5_dr5
    -external.external.ravedr5_gra
    -external.external.ravedr5_on
    -external.external.sdssdr13_photoprimary
    -external.external.skymapperdr1_master
    -external.external.tmass_xsc
    -public.public.hipparcos
    -public.public.hipparcos_newreduction
    -public.public.hubble_sc
    -public.public.igsl_source
    -public.public.igsl_source_catalog_ids
    -public.public.tycho2
    -public.public.dual
    -tap_config.tap_config.coord_sys
    -tap_config.tap_config.properties
    -tap_schema.tap_schema.columns
    -tap_schema.tap_schema.key_columns
    -tap_schema.tap_schema.keys
    -tap_schema.tap_schema.schemas
    -tap_schema.tap_schema.tables
    -gaiadr1.gaiadr1.aux_qso_icrf2_match
    -gaiadr1.gaiadr1.ext_phot_zero_point
    -gaiadr1.gaiadr1.allwise_best_neighbour
    -gaiadr1.gaiadr1.allwise_neighbourhood
    -gaiadr1.gaiadr1.gsc23_best_neighbour
    -gaiadr1.gaiadr1.gsc23_neighbourhood
    -gaiadr1.gaiadr1.ppmxl_best_neighbour
    -gaiadr1.gaiadr1.ppmxl_neighbourhood
    -gaiadr1.gaiadr1.sdss_dr9_best_neighbour
    -gaiadr1.gaiadr1.sdss_dr9_neighbourhood
    -gaiadr1.gaiadr1.tmass_best_neighbour
    -gaiadr1.gaiadr1.tmass_neighbourhood
    -gaiadr1.gaiadr1.ucac4_best_neighbour
    -gaiadr1.gaiadr1.ucac4_neighbourhood
    -gaiadr1.gaiadr1.urat1_best_neighbour
    -gaiadr1.gaiadr1.urat1_neighbourhood
    -gaiadr1.gaiadr1.cepheid
    -gaiadr1.gaiadr1.phot_variable_time_series_gfov
    -gaiadr1.gaiadr1.phot_variable_time_series_gfov_statistical_parameters
    -gaiadr1.gaiadr1.rrlyrae
    -gaiadr1.gaiadr1.variable_summary
    -gaiadr1.gaiadr1.allwise_original_valid
    -gaiadr1.gaiadr1.gsc23_original_valid
    -gaiadr1.gaiadr1.ppmxl_original_valid
    -gaiadr1.gaiadr1.sdssdr9_original_valid
    -gaiadr1.gaiadr1.tmass_original_valid
    -gaiadr1.gaiadr1.ucac4_original_valid
    -gaiadr1.gaiadr1.urat1_original_valid
    -gaiadr1.gaiadr1.gaia_source
    -gaiadr1.gaiadr1.tgas_source
    -gaiadr2.gaiadr2.aux_allwise_agn_gdr2_cross_id
    -gaiadr2.gaiadr2.aux_iers_gdr2_cross_id
    -gaiadr2.gaiadr2.aux_sso_orbit_residuals
    -gaiadr2.gaiadr2.aux_sso_orbits
    -gaiadr2.gaiadr2.dr1_neighbourhood
    -gaiadr2.gaiadr2.allwise_best_neighbour
    -gaiadr2.gaiadr2.allwise_neighbourhood
    -gaiadr2.gaiadr2.apassdr9_best_neighbour
    -gaiadr2.gaiadr2.apassdr9_neighbourhood
    -gaiadr2.gaiadr2.gsc23_best_neighbour
    -gaiadr2.gaiadr2.gsc23_neighbourhood
    -gaiadr2.gaiadr2.hipparcos2_best_neighbour
    -gaiadr2.gaiadr2.hipparcos2_neighbourhood
    -gaiadr2.gaiadr2.panstarrs1_best_neighbour
    -gaiadr2.gaiadr2.panstarrs1_neighbourhood
    -gaiadr2.gaiadr2.ppmxl_best_neighbour
    -gaiadr2.gaiadr2.ppmxl_neighbourhood
    -gaiadr2.gaiadr2.ravedr5_best_neighbour
    -gaiadr2.gaiadr2.ravedr5_neighbourhood
    -gaiadr2.gaiadr2.sdssdr9_best_neighbour
    -gaiadr2.gaiadr2.sdssdr9_neighbourhood
    -gaiadr2.gaiadr2.tmass_best_neighbour
    -gaiadr2.gaiadr2.tmass_neighbourhood
    -gaiadr2.gaiadr2.tycho2_best_neighbour
    -gaiadr2.gaiadr2.tycho2_neighbourhood
    -gaiadr2.gaiadr2.urat1_best_neighbour
    -gaiadr2.gaiadr2.urat1_neighbourhood
    -gaiadr2.gaiadr2.sso_observation
    -gaiadr2.gaiadr2.sso_source
    -gaiadr2.gaiadr2.vari_cepheid
    -gaiadr2.gaiadr2.vari_classifier_class_definition
    -gaiadr2.gaiadr2.vari_classifier_definition
    -gaiadr2.gaiadr2.vari_classifier_result
    -gaiadr2.gaiadr2.vari_long_period_variable
    -gaiadr2.gaiadr2.vari_rotation_modulation
    -gaiadr2.gaiadr2.vari_rrlyrae
    -gaiadr2.gaiadr2.vari_short_timescale
    -gaiadr2.gaiadr2.vari_time_series_statistics
    -gaiadr2.gaiadr2.panstarrs1_original_valid
    -gaiadr2.gaiadr2.gaia_source
    -gaiadr2.gaiadr2.ruwe
    -
    -
    -
    -
    -

    So that’s a lot of tables. The ones we’ll use are:

    -
      -
    • gaiadr2.gaia_source, which contains Gaia data from data release 2,

    • -
    • gaiadr2.panstarrs1_original_valid, which contains the photometry data we’ll use from PanSTARRS, and

    • -
    • gaiadr2.panstarrs1_best_neighbour, which we’ll use to cross-match each star observed by Gaia with the same star observed by PanSTARRS.

    • -
    -

    We can use load_table (not load_tables) to get the metadata for a single table. The name of this function is misleading, because it only downloads metadata.

    -
    -
    -
    meta = Gaia.load_table('gaiadr2.gaia_source')
    -meta
    -
    -
    -
    -
    -
    Retrieving table 'gaiadr2.gaia_source'
    -Parsing table 'gaiadr2.gaia_source'...
    -Done.
    -
    -
    -
    <astroquery.utils.tap.model.taptable.TapTableMeta at 0x7f922376e0a0>
    -
    -
    -
    -
    -

    Jupyter shows that the result is an object of type TapTableMeta, but it does not display the contents.

    -

    To see the metadata, we have to print the object.

    -
    -
    -
    print(meta)
    -
    -
    -
    -
    -
    TAP Table name: gaiadr2.gaiadr2.gaia_source
    -Description: This table has an entry for every Gaia observed source as listed in the
    -Main Database accumulating catalogue version from which the catalogue
    -release has been generated. It contains the basic source parameters,
    -that is only final data (no epoch data) and no spectra (neither final
    -nor epoch).
    -Num. columns: 96
    -
    -
    -
    -
    -

    Notice one gotcha: in the list of table names, this table appears as gaiadr2.gaiadr2.gaia_source, but when we load the metadata, we refer to it as gaiadr2.gaia_source.

    -

    Exercise: Go back and try

    -
    meta = Gaia.load_table('gaiadr2.gaiadr2.gaia_source')
    -
    -
    -

    What happens? Is the error message helpful? If you had not made this error deliberately, would you have been able to figure it out?

    -
    -
    -

    Columns

    -

    The following loop prints the names of the columns in the table.

    -
    -
    -
    for column in meta.columns:
    -    print(column.name)
    -
    -
    -
    -
    -
    solution_id
    -designation
    -source_id
    -random_index
    -ref_epoch
    -ra
    -ra_error
    -dec
    -dec_error
    -parallax
    -parallax_error
    -parallax_over_error
    -pmra
    -pmra_error
    -pmdec
    -pmdec_error
    -ra_dec_corr
    -ra_parallax_corr
    -ra_pmra_corr
    -ra_pmdec_corr
    -dec_parallax_corr
    -dec_pmra_corr
    -dec_pmdec_corr
    -parallax_pmra_corr
    -parallax_pmdec_corr
    -pmra_pmdec_corr
    -astrometric_n_obs_al
    -astrometric_n_obs_ac
    -astrometric_n_good_obs_al
    -astrometric_n_bad_obs_al
    -astrometric_gof_al
    -astrometric_chi2_al
    -astrometric_excess_noise
    -astrometric_excess_noise_sig
    -astrometric_params_solved
    -astrometric_primary_flag
    -astrometric_weight_al
    -astrometric_pseudo_colour
    -astrometric_pseudo_colour_error
    -mean_varpi_factor_al
    -astrometric_matched_observations
    -visibility_periods_used
    -astrometric_sigma5d_max
    -frame_rotator_object_type
    -matched_observations
    -duplicated_source
    -phot_g_n_obs
    -phot_g_mean_flux
    -phot_g_mean_flux_error
    -phot_g_mean_flux_over_error
    -phot_g_mean_mag
    -phot_bp_n_obs
    -phot_bp_mean_flux
    -phot_bp_mean_flux_error
    -phot_bp_mean_flux_over_error
    -phot_bp_mean_mag
    -phot_rp_n_obs
    -phot_rp_mean_flux
    -phot_rp_mean_flux_error
    -phot_rp_mean_flux_over_error
    -phot_rp_mean_mag
    -phot_bp_rp_excess_factor
    -phot_proc_mode
    -bp_rp
    -bp_g
    -g_rp
    -radial_velocity
    -radial_velocity_error
    -rv_nb_transits
    -rv_template_teff
    -rv_template_logg
    -rv_template_fe_h
    -phot_variable_flag
    -l
    -b
    -ecl_lon
    -ecl_lat
    -priam_flags
    -teff_val
    -teff_percentile_lower
    -teff_percentile_upper
    -a_g_val
    -a_g_percentile_lower
    -a_g_percentile_upper
    -e_bp_min_rp_val
    -e_bp_min_rp_percentile_lower
    -e_bp_min_rp_percentile_upper
    -flame_flags
    -radius_val
    -radius_percentile_lower
    -radius_percentile_upper
    -lum_val
    -lum_percentile_lower
    -lum_percentile_upper
    -datalink_url
    -epoch_photometry_url
    -
    -
    -
    -
    -

    You can probably guess what many of these columns are by looking at the names, but you should resist the temptation to guess. -To find out what the columns mean, read the documentation.

    -

    If you want to know what can go wrong when you don’t read the documentation, you might like this article.

    -

    Exercise: One of the other tables we’ll use is gaiadr2.gaiadr2.panstarrs1_original_valid. Use load_table to get the metadata for this table. How many columns are there and what are their names?

    -

    Hint: Remember the gotcha we mentioned earlier.

    -
    -
    -
    # Solution
    -
    -meta2 = Gaia.load_table('gaiadr2.panstarrs1_original_valid')
    -print(meta2)
    -
    -
    -
    -
    -
    Retrieving table 'gaiadr2.panstarrs1_original_valid'
    -Parsing table 'gaiadr2.panstarrs1_original_valid'...
    -Done.
    -TAP Table name: gaiadr2.gaiadr2.panstarrs1_original_valid
    -Description: The Panoramic Survey Telescope and Rapid Response System (Pan-STARRS) is
    -a system for wide-field astronomical imaging developed and operated by
    -the Institute for Astronomy at the University of Hawaii. Pan-STARRS1
    -(PS1) is the first part of Pan-STARRS to be completed and is the basis
    -for Data Release 1 (DR1). The PS1 survey used a 1.8 meter telescope and
    -its 1.4 Gigapixel camera to image the sky in five broadband filters (g,
    -r, i, z, y).
    -
    -The current table contains a filtered subsample of the 10 723 304 629
    -entries listed in the original ObjectThin table.
    -We used only ObjectThin and MeanObject tables to extract
    -panstarrs1OriginalValid table, this means that objects detected only in
    -stack images are not included here. The main reason for us to avoid the
    -use of objects detected in stack images is that their astrometry is not
    -as good as the mean objects astrometry: “The stack positions (raStack,
    -decStack) have considerably larger systematic astrometric errors than
    -the mean epoch positions (raMean, decMean).” The astrometry for the
    -MeanObject positions uses Gaia DR1 as a reference catalog, while the
    -stack positions use 2MASS as a reference catalog.
    -
    -In details, we filtered out all objects where:
    -
    --   nDetections = 1
    -
    --   no good quality data in Pan-STARRS, objInfoFlag 33554432 not set
    -
    --   mean astrometry could not be measured, objInfoFlag 524288 set
    -
    --   stack position used for mean astrometry, objInfoFlag 1048576 set
    -
    --   error on all magnitudes equal to 0 or to -999;
    -
    --   all magnitudes set to -999;
    -
    --   error on RA or DEC greater than 1 arcsec.
    -
    -The number of objects in panstarrs1OriginalValid is 2 264 263 282.
    -
    -The panstarrs1OriginalValid table contains only a subset of the columns
    -available in the combined ObjectThin and MeanObject tables. A
    -description of the original ObjectThin and MeanObjects tables can be
    -found at:
    -https://outerspace.stsci.edu/display/PANSTARRS/PS1+Database+object+and+detection+tables
    -
    -Download:
    -http://mastweb.stsci.edu/ps1casjobs/home.aspx
    -Documentation:
    -https://outerspace.stsci.edu/display/PANSTARRS
    -http://pswww.ifa.hawaii.edu/pswww/
    -References:
    -The Pan-STARRS1 Surveys, Chambers, K.C., et al. 2016, arXiv:1612.05560
    -Pan-STARRS Data Processing System, Magnier, E. A., et al. 2016,
    -arXiv:1612.05240
    -Pan-STARRS Pixel Processing: Detrending, Warping, Stacking, Waters, C.
    -Z., et al. 2016, arXiv:1612.05245
    -Pan-STARRS Pixel Analysis: Source Detection and Characterization,
    -Magnier, E. A., et al. 2016, arXiv:1612.05244
    -Pan-STARRS Photometric and Astrometric Calibration, Magnier, E. A., et
    -al. 2016, arXiv:1612.05242
    -The Pan-STARRS1 Database and Data Products, Flewelling, H. A., et al.
    -2016, arXiv:1612.05243
    -
    -Catalogue curator:
    -SSDC - ASI Space Science Data Center
    -https://www.ssdc.asi.it/
    -Num. columns: 26
    -
    -
    -
    -
    -
    -
    -
    # Solution
    -
    -for column in meta2.columns:
    -    print(column.name)
    -
    -
    -
    -
    -
    obj_name
    -obj_id
    -ra
    -dec
    -ra_error
    -dec_error
    -epoch_mean
    -g_mean_psf_mag
    -g_mean_psf_mag_error
    -g_flags
    -r_mean_psf_mag
    -r_mean_psf_mag_error
    -r_flags
    -i_mean_psf_mag
    -i_mean_psf_mag_error
    -i_flags
    -z_mean_psf_mag
    -z_mean_psf_mag_error
    -z_flags
    -y_mean_psf_mag
    -y_mean_psf_mag_error
    -y_flags
    -n_detections
    -zone_id
    -obj_info_flag
    -quality_flag
    -
    -
    -
    -
    -
    -
    -

    Writing queries

    -

    By now you might be wondering how we actually download the data. With tables this big, you generally don’t. Instead, you use queries to select only the data you want.

    -

    A query is a string written in a query language like SQL; for the Gaia database, the query language is a dialect of SQL called ADQL.

    -

    Here’s an example of an ADQL query.

    -
    -
    -
    query1 = """SELECT 
    -TOP 10
    -source_id, ref_epoch, ra, dec, parallax 
    -FROM gaiadr2.gaia_source"""
    -
    -
    -
    -
    -

    Python note: We use a triple-quoted string here so we can include line breaks in the query, which makes it easier to read.

    -

    The words in uppercase are ADQL keywords:

    -
      -
    • SELECT indicates that we are selecting data (as opposed to adding or modifying data).

    • -
    • TOP indicates that we only want the first 10 rows of the table, which is useful for testing a query before asking for all of the data.

    • -
    • FROM specifies which table we want data from.

    • -
    -

    The third line is a list of column names, indicating which columns we want.

    -

    In this example, the keywords are capitalized and the column names are lowercase. This is a common style, but it is not required. ADQL and SQL are not case-sensitive.

    -

    To run this query, we use the Gaia object, which represents our connection to the Gaia database, and invoke launch_job:

    -
    -
    -
    job1 = Gaia.launch_job(query1)
    -job1
    -
    -
    -
    -
    -
    <astroquery.utils.tap.model.job.Job at 0x7f9222e9cb20>
    -
    -
    -
    -
    -

    The result is an object that represents the job running on a Gaia server.

    -

    If you print it, it displays metadata for the forthcoming table.

    -
    -
    -
    print(job1)
    -
    -
    -
    -
    -
    <Table length=10>
    -   name    dtype  unit                            description                            
    ---------- ------- ---- ------------------------------------------------------------------
    -source_id   int64      Unique source identifier (unique within a particular Data Release)
    -ref_epoch float64   yr                                                    Reference epoch
    -       ra float64  deg                                                    Right ascension
    -      dec float64  deg                                                        Declination
    - parallax float64  mas                                                           Parallax
    -Jobid: None
    -Phase: COMPLETED
    -Owner: None
    -Output file: sync_20201005090721.xml.gz
    -Results: None
    -
    -
    -
    -
    -

    Don’t worry about Results: None. That does not actually mean there are no results.

    -

    However, Phase: COMPLETED indicates that the job is complete, so we can get the results like this:

    -
    -
    -
    results1 = job1.get_results()
    -type(results1)
    -
    -
    -
    -
    -
    astropy.table.table.Table
    -
    -
    -
    -
    -

    Optional detail: Why is table repeated three times? The first is the name of the module, the second is the name of the submodule, and the third is the name of the class. Most of the time we only care about the last one. It’s like the Linnean name for gorilla, which is Gorilla Gorilla Gorilla.

    -

    The result is an Astropy Table, which is similar to a table in an SQL database except:

    -
      -
    • SQL databases are stored on disk drives, so they are persistent; that is, they “survive” even if you turn off the computer. An Astropy Table is stored in memory; it disappears when you turn off the computer (or shut down this Jupyter notebook).

    • -
    • SQL databases are designed to process queries. An Astropy Table can perform some query-like operations, like selecting columns and rows. But these operations use Python syntax, not SQL.

    • -
    -

    Jupyter knows how to display the contents of a Table.

    -
    -
    -
    results1
    -
    -
    -
    -
    -
    Table length=10 - - - - - - - - - - - - - - -
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307550606271623682015.5281.267623626829920.5585239223461581.1422630184554958
    45307468443413159682015.5281.137043174954120.3778523888981841.0092247424630945
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    -
    -

    Each column has a name, units, and a data type.

    -

    For example, the units of ra and dec are degrees, and their data type is float64, which is a 64-bit floating-point number, used to store measurements with a fraction part.

    -

    This information comes from the Gaia database, and has been stored in the Astropy Table by Astroquery.

    -

    Exercise: Read the documentation of this table and choose a column that looks interesting to you. Add the column name to the query and run it again. What are the units of the column you selected? What is its data type?

    -
    -
    -

    Asynchronous queries

    -

    launch_job asks the server to run the job “synchronously”, which normally means it runs immediately. But synchronous jobs are limited to 2000 rows. For queries that return more rows, you should run “asynchronously”, which mean they might take longer to get started.

    -

    If you are not sure how many rows a query will return, you can use the SQL command COUNT to find out how many rows are in the result without actually returning them. We’ll see an example of this later.

    -

    The results of an asynchronous query are stored in a file on the server, so you can start a query and come back later to get the results.

    -

    For anonymous users, files are kept for three days.

    -

    As an example, let’s try a query that’s similar to query1, with two changes:

    -
      -
    • It selects the first 3000 rows, so it is bigger than we should run synchronously.

    • -
    • It uses a new keyword, WHERE.

    • -
    -
    -
    -
    query2 = """SELECT TOP 3000
    -source_id, ref_epoch, ra, dec, parallax
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 1
    -"""
    -
    -
    -
    -
    -

    A WHERE clause indicates which rows we want; in this case, the query selects only rows “where” parallax is less than 1. This has the effect of selecting stars with relatively low parallax, which are farther away. We’ll use this clause to exclude nearby stars that are unlikely to be part of GD-1.

    -

    WHERE is one of the most common clauses in ADQL/SQL, and one of the most useful, because it allows us to select only the rows we need from the database.

    -

    We use launch_job_async to submit an asynchronous query.

    -
    -
    -
    job2 = Gaia.launch_job_async(query2)
    -print(job2)
    -
    -
    -
    -
    -
    INFO: Query finished. [astroquery.utils.tap.core]
    -<Table length=3000>
    -   name    dtype  unit                            description                            
    ---------- ------- ---- ------------------------------------------------------------------
    -source_id   int64      Unique source identifier (unique within a particular Data Release)
    -ref_epoch float64   yr                                                    Reference epoch
    -       ra float64  deg                                                    Right ascension
    -      dec float64  deg                                                        Declination
    - parallax float64  mas                                                           Parallax
    -Jobid: 1601903242219O
    -Phase: COMPLETED
    -Owner: None
    -Output file: async_20201005090722.vot
    -Results: None
    -
    -
    -
    -
    -

    And here are the results.

    -
    -
    -
    results2 = job2.get_results()
    -results2
    -
    -
    -
    -
    -
    Table length=3000 - - - - - - - - - - - - - - - - - - - - - - - - -
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    45307409387744093442015.5281.376256953641620.4361400589412060.9242670062090182
    ...............
    44677109150118026242015.5269.96809693073471.14290850381608820.42361471245557913
    44677065513286795522015.5270.0331645898811.05657473236899270.922888231734588
    44677122550373000962015.5270.77247179230470.6581664892880896-2.669179465293931
    44677350011817617922015.5270.36286062483080.89470793235991240.6117399163086398
    44677371014219166722015.5270.51108346614440.9806225910160181-0.39818224846127004
    44677075477573274882015.5269.887462805949271.02127599401369620.7741412301054209
    44677327720945730562015.5270.559971827601260.9037072088489417-1.7920417800164183
    44677323554910877442015.5270.67307907024910.9197224705139885-0.3464446494840354
    44677170997669445122015.5270.576671731208250.7262776590095680.05443955111134051
    44677190582657812482015.5270.72480529715140.82055519217827850.3733943917490343
    -
    -

    You might notice that some values of parallax are negative. As this FAQ explains, “Negative parallaxes are caused by errors in the observations.” Negative parallaxes have “no physical meaning,” but they can be a “useful diagnostic on the quality of the astrometric solution.”

    -

    Later we will see an example where we use parallax and parallax_error to identify stars where the distance estimate is likely to be inaccurate.

    -

    Exercise: The clauses in a query have to be in the right order. Go back and change the order of the clauses in query2 and run it again.

    -

    The query should fail, but notice that you don’t get much useful debugging information.

    -

    For this reason, developing and debugging ADQL queries can be really hard. A few suggestions that might help:

    -
      -
    • Whenever possible, start with a working query, either an example you find online or a query you have used in the past.

    • -
    • Make small changes and test each change before you continue.

    • -
    • While you are debugging, use TOP to limit the number of rows in the result. That will make each attempt run faster, which reduces your testing time.

    • -
    • Launching test queries synchronously might make them start faster, too.

    • -
    -
    -
    -

    Operators

    -

    In a WHERE clause, you can use any of the SQL comparison operators:

    -
      -
    • >: greater than

    • -
    • <: less than

    • -
    • >=: greater than or equal

    • -
    • <=: less than or equal

    • -
    • =: equal

    • -
    • != or <>: not equal

    • -
    -

    Most of these are the same as Python, but some are not. In particular, notice that the equality operator is =, not ==. -Be careful to keep your Python out of your ADQL!

    -

    You can combine comparisons using the logical operators:

    -
      -
    • AND: true if both comparisons are true

    • -
    • OR: true if either or both comparisons are true

    • -
    -

    Finally, you can use NOT to invert the result of a comparison.

    -

    Exercise: Read about SQL operators here and then modify the previous query to select rows where bp_rp is between -0.75 and 2.

    -

    You can read about this variable here.

    -
    -
    -
    # Solution
    -
    -# This is what most people will probably do
    -
    -query = """SELECT TOP 10
    -source_id, ref_epoch, ra, dec, parallax
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 1 
    -  AND bp_rp > -0.75 AND bp_rp < 2
    -"""
    -
    -
    -
    -
    -
    -
    -
    # Solution
    -
    -# But if someone notices the BETWEEN operator, 
    -# they might do this
    -
    -query = """SELECT TOP 10
    -source_id, ref_epoch, ra, dec, parallax
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 1 
    -  AND bp_rp BETWEEN -0.75 AND 2
    -"""
    -
    -
    -
    -
    -

    This Hertzsprung-Russell diagram shows the BP-RP color and luminosity of stars in the Gaia catalog.

    -

    Selecting stars with bp-rp less than 2 excludes many class M dwarf stars, which are low temperature, low luminosity. A star like that at GD-1’s distance would be hard to detect, so if it is detected, it it more likely to be in the foreground.

    -
    -
    -

    Cleaning up

    -

    Asynchronous jobs have a jobid.

    -
    -
    -
    job1.jobid, job2.jobid
    -
    -
    -
    -
    -
    (None, '1601903242219O')
    -
    -
    -
    -
    -

    Which you can use to remove the job from the server.

    -
    -
    -
    Gaia.remove_jobs([job2.jobid])
    -
    -
    -
    -
    -
    Removed jobs: '['1601903242219O']'.
    -
    -
    -
    -
    -

    If you don’t remove it job from the server, it will be removed eventually, so don’t feel too bad if you don’t clean up after yourself.

    -
    -
    -

    Formatting queries

    -

    So far the queries have been string “literals”, meaning that the entire string is part of the program. -But writing queries yourself can be slow, repetitive, and error-prone.

    -

    It is often a good idea to write Python code that assembles a query for you. One useful tool for that is the string format method.

    -

    As an example, we’ll divide the previous query into two parts; a list of column names and a “base” for the query that contains everything except the column names.

    -

    Here’s the list of columns we’ll select.

    -
    -
    -
    columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'
    -
    -
    -
    -
    -

    And here’s the base; it’s a string that contains at least one format specifier in curly brackets (braces).

    -
    -
    -
    query3_base = """SELECT TOP 10 
    -{columns}
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 1
    -  AND bp_rp BETWEEN -0.75 AND 2
    -"""
    -
    -
    -
    -
    -

    This base query contains one format specifier, {columns}, which is a placeholder for the list of column names we will provide.

    -

    To assemble the query, we invoke format on the base string and provide a keyword argument that assigns a value to columns.

    -
    -
    -
    query3 = query3_base.format(columns=columns)
    -
    -
    -
    -
    -

    The result is a string with line breaks. If you display it, the line breaks appear as \n.

    -
    -
    -
    query3
    -
    -
    -
    -
    -
    'SELECT TOP 10 \nsource_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\nFROM gaiadr2.gaia_source\nWHERE parallax < 1\n  AND bp_rp BETWEEN -0.75 AND 2\n'
    -
    -
    -
    -
    -

    But if you print it, the line breaks appear as… line breaks.

    -
    -
    -
    print(query3)
    -
    -
    -
    -
    -
    SELECT TOP 10 
    -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
    -
    -
    -
    -
    -

    Notice that the format specifier has been replaced with the value of columns.

    -

    Let’s run it and see if it works:

    -
    -
    -
    job3 = Gaia.launch_job(query3)
    -print(job3)
    -
    -
    -
    -
    -
    <Table length=10>
    -      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    10
    -Jobid: None
    -Phase: COMPLETED
    -Owner: None
    -Output file: sync_20201005090726.xml.gz
    -Results: None
    -
    -
    -
    -
    -
    -
    -
    results3 = job3.get_results()
    -results3
    -
    -
    -
    -
    -
    Table length=10 - - - - - - - - - - - - - - -
    source_idradecpmrapmdecparallaxparallax_errorradial_velocity
    degdegmas / yrmas / yrmasmaskm / s
    int64float64float64float64float64float64float64float64
    4467710915011802624269.96809693073471.14290850381608822.0233280236600626-2.56924278755102660.423614712455579130.470352406647465--
    4467706551328679552270.0331645898811.0565747323689927-3.414829591355289-3.84372158574957370.9228882317345880.927008559859825--
    4467712255037300096270.77247179230470.6581664892880896-3.5620173752896025-6.595792323153987-2.6691794652939310.9719742773203504--
    4467735001181761792270.36286062483080.89470793235991242.13070799264892050.88267277109107120.61173991630863980.509812721702093--
    4467737101421916672270.51108346614440.98062259101601810.17532366511560785-5.113270239706202-0.398182248461270040.7549581886719651--
    4467707547757327488269.887462805949271.0212759940136962-2.6382230817672987-3.7077765320492870.77414123010542090.3022057897812064--
    4467732355491087744270.67307907024910.9197224705139885-2.2735991502653037-11.864952855984358-0.34644464948403540.4937921513912002--
    4467717099766944512270.576671731208250.726277659009568-3.4598362614808367-4.6014268933659210.054439551111340510.8867339293525688--
    4467719058265781248270.72480529715140.8205551921782785-3.255079498426542-9.2492850691110850.37339439174903430.390952370410666--
    4467722326741572352270.874312918885040.85955659758691580.106963983518598261.2035993780158853-0.118509434328643730.1660452431882023--
    -
    -

    Good so far.

    -

    Exercise: This query always selects sources with parallax less than 1. But suppose you want to take that upper bound as an input.

    -

    Modify query3_base to replace 1 with a format specifier like {max_parallax}. Now, when you call format, add a keyword argument that assigns a value to max_parallax, and confirm that the format specifier gets replaced with the value you provide.

    -
    -
    -
    # Solution
    -
    -query4_base = """SELECT TOP 10
    -{columns}
    -FROM gaiadr2.gaia_source
    -WHERE parallax < {max_parallax} AND 
    -bp_rp BETWEEN -0.75 AND 2
    -"""
    -
    -
    -
    -
    -
    -
    -
    # Solution
    -
    -query4 = query4_base.format(columns=columns,
    -                          max_parallax=0.5)
    -print(query)
    -
    -
    -
    -
    -
    SELECT TOP 10
    -source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity
    -FROM gaiadr2.gaia_source
    -WHERE parallax < 0.5 AND 
    -bp_rp BETWEEN -0.75 AND 2
    -
    -
    -
    -
    -

    Style note: You might notice that the variable names in this notebook are numbered, like query1, query2, etc.

    -

    The advantage of this style is that it isolates each section of the notebook from the others, so if you go back and run the cells out of order, it’s less likely that you will get unexpected interactions.

    -

    A drawback of this style is that it can be a nuisance to update the notebook if you add, remove, or reorder a section.

    -

    What do you think of this choice? Are there alternatives you prefer?

    -
    -
    -

    Summary

    -

    This notebook demonstrates the following steps:

    -
      -
    1. Making a connection to the Gaia server,

    2. -
    3. Exploring information about the database and the tables it contains,

    4. -
    5. Writing a query and sending it to the server, and finally

    6. -
    7. Downloading the response from the server as an Astropy Table.

    8. -
    -
    -
    -

    Best practices

    -
      -
    • If you can’t download an entire dataset (or it’s not practical) use queries to select the data you need.

    • -
    • Read the metadata and the documentation to make sure you understand the tables, their columns, and what they mean.

    • -
    • Develop queries incrementally: start with something simple, test it, and add a little bit at a time.

    • -
    • Use ADQL features like TOP and COUNT to test before you run a query that might return a lot of data.

    • -
    • If you know your query will return fewer than 3000 rows, you can run it synchronously, which might complete faster (but it doesn’t seem to make much difference). If it might return more than 3000 rows, you should run it asynchronously.

    • -
    • ADQL and SQL are not case-sensitive, so you don’t have to capitalize the keywords, but you should.

    • -
    • ADQL and SQL don’t require you to break a query into multiple lines, but you should.

    • -
    -

    Jupyter notebooks can be good for developing and testing code, but they have some drawbacks. In particular, if you run the cells out of order, you might find that variables don’t have the values you expect.

    -

    There are a few things you can do to mitigate these problems:

    -
      -
    • Make each section of the notebook self-contained. Try not to use the same variable name in more than one section.

    • -
    • Keep notebooks short. Look for places where you can break your analysis into phases with one notebook per phase.

    • -
    -
    -
    - - - - -
    - -
    -
    - - -
    - - -
    -
    -
    -

    - - By Allen B. Downey
    - - © Copyright 2020.
    -

    -
    -
    -
    - - -
    -
    - - - - - - - - \ No newline at end of file diff --git a/AstronomicalData/_build/jupyter_execute/02_coords.html b/AstronomicalData/_build/jupyter_execute/02_coords.html deleted file mode 100644 index 50db850..0000000 --- a/AstronomicalData/_build/jupyter_execute/02_coords.html +++ /dev/null @@ -1,1821 +0,0 @@ - - - - - - - - Lesson 2 — Astronomical Data in Python - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - - - - - - - - -
    - -
    - -
    - - - - - - - - - - - - - - -
    - - - -
    -
    -
    - -
    - -
    -

    Lesson 2

    -

    This is the second in a series of lessons related to astronomy data.

    -

    As a running example, we are replicating parts of the analysis in a recent paper, “Off the beaten path: Gaia reveals GD-1 stars outside of the main stream” by Adrian M. Price-Whelan and Ana Bonaca.

    -

    In the first notebook, we wrote ADQL queries and used them to select and download data from the Gaia server.

    -

    In this notebook, we’ll pick up where we left off and write a query to select stars from the region of the sky where we expect GD-1 to be.

    -

    We’ll start with an example that does a “cone search”; that is, it selects stars that appear in a circular region of the sky.

    -

    Then, to select stars in the vicinity of GD-1, we’ll:

    -
      -
    • Use Quantity objects to represent measurements with units.

    • -
    • Use the Gala library to convert coordinates from one frame to another.

    • -
    • Use the ADQL keywords POLYGON, CONTAINS, and POINT to select stars that fall within a polygonal region.

    • -
    • Submit a query and download the results.

    • -
    • Store the results in a FITS file.

    • -
    -

    After completing this lesson, you should be able to

    -
      -
    • Use Python string formatting to compose more complex ADQL queries.

    • -
    • Work with coordinates and other quantities that have units.

    • -
    • Download the results of a query and store them in a file.

    • -
    -
    -

    Installing libraries

    -

    If you are running this notebook on Colab, you can run the following cell to install Astroquery and a the other libraries we’ll use.

    -

    If you are running this notebook on your own computer, you might have to install these libraries yourself.

    -

    If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions.

    -

    TODO: Add a link to the instructions.

    -
    -
    -
    # 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
    -
    -
    -
    -
    -
    -
    -

    Selecting a region

    -

    One of the most common ways to restrict a query is to select stars in a particular region of the sky.

    -

    For example, here’s a query from the Gaia archive documentation that selects “all the objects … in a circular region centered at (266.41683, -29.00781) with a search radius of 5 arcmin (0.08333 deg).”

    -
    -
    -
    query = """
    -SELECT 
    -TOP 10 source_id
    -FROM gaiadr2.gaia_source
    -WHERE 1=CONTAINS(
    -  POINT(ra, dec),
    -  CIRCLE(266.41683, -29.00781, 0.08333333))
    -"""
    -
    -
    -
    -
    -

    This query uses three keywords that are specific to ADQL (not SQL):

    -
      -
    • POINT: a location in ICRS coordinates, specified in degrees of right ascension and declination.

    • -
    • CIRCLE: a circle where the first two values are the coordinates of the center and the third is the radius in degrees.

    • -
    • CONTAINS: a function that returns 1 if a POINT is contained in a shape and 0 otherwise.

    • -
    -

    Here is the documentation of CONTAINS.

    -

    A query like this is called a cone search because it selects stars in a cone.

    -

    Here’s how we run it.

    -
    -
    -
    from astroquery.gaia import Gaia
    -
    -job = Gaia.launch_job(query)
    -result = job.get_results()
    -result
    -
    -
    -
    -
    -
    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
    -
    -
    -
    Table length=10 - - - - - - - - - - - - - -
    source_id
    int64
    4057468321929794432
    4057468287575835392
    4057482027171038976
    4057470349160630656
    4057470039924301696
    4057469868125641984
    4057468351995073024
    4057469661959554560
    4057470520960672640
    4057470555320409600
    -
    -

    Exercise: When you are debugging queries like this, you can use TOP to limit the size of the results, but then you still don’t know how big the results will be.

    -

    An alternative is to use COUNT, which asks for the number of rows that would be selected, but it does not return them.

    -

    In the previous query, replace TOP 10 source_id with COUNT(source_id) and run the query again. How many stars has Gaia identified in the cone we searched?

    -
    -
    -

    Getting GD-1 Data

    -

    From the Price-Whelan and Bonaca paper, we will try to reproduce Figure 1, which includes this representation of stars likely to belong to GD-1:

    -

    Along the axis of right ascension (\(\phi_1\)) the figure extends from -100 to 20 degrees.

    -

    Along the axis of declination (\(\phi_2\)) the figure extends from about -8 to 4 degrees.

    -

    Ideally, we would select all stars from this rectangle, but there are more than 10 million of them, so

    -
      -
    • That would be difficult to work with,

    • -
    • As anonymous users, we are limited to 3 million rows in a single query, and

    • -
    • While we are developing and testing code, it will be faster to work with a smaller dataset.

    • -
    -

    So we’ll start by selecting stars in a smaller rectangle, from -55 to -45 degrees right ascension and -8 to 4 degrees of declination.

    -

    But first we let’s see how to represent quantities with units like degrees.

    -
    -
    -

    Working with coordinates

    -

    Coordinates are physical quantities, which means that they have two parts, a value and a unit.

    -

    For example, the coordinate \(30^{\circ}\) has value 30 and its units are degrees.

    -

    Until recently, most scientific computation was done with values only; units were left out of the program altogether, often with disastrous results.

    -

    Astropy provides tools for including units explicitly in computations, which makes it possible to detect errors before they cause disasters.

    -

    To use Astropy units, we import them like this:

    -
    -
    -
    import astropy.units as u
    -
    -u
    -
    -
    -
    -
    -
    <module 'astropy.units' from '/home/downey/anaconda3/envs/AstronomicalData/lib/python3.8/site-packages/astropy/units/__init__.py'>
    -
    -
    -
    -
    -

    u is an object that contains most common units and all SI units.

    -

    You can use dir to list them, but you should also read the documentation.

    -
    -
    -
    dir(u)
    -
    -
    -
    -
    -
    ['A',
    - 'AA',
    - 'AB',
    - 'ABflux',
    - 'ABmag',
    - 'AU',
    - 'Angstrom',
    - 'B',
    - 'Ba',
    - 'Barye',
    - 'Bi',
    - 'Biot',
    - 'Bol',
    - 'Bq',
    - 'C',
    - 'Celsius',
    - 'Ci',
    - 'CompositeUnit',
    - 'D',
    - 'Da',
    - 'Dalton',
    - 'Debye',
    - 'Decibel',
    - 'DecibelUnit',
    - 'Dex',
    - 'DexUnit',
    - 'EA',
    - 'EAU',
    - 'EB',
    - 'EBa',
    - 'EC',
    - 'ED',
    - 'EF',
    - 'EG',
    - 'EGal',
    - 'EH',
    - 'EHz',
    - 'EJ',
    - 'EJy',
    - 'EK',
    - 'EL',
    - 'EN',
    - 'EOhm',
    - 'EP',
    - 'EPa',
    - 'ER',
    - 'ERy',
    - 'ES',
    - 'ESt',
    - 'ET',
    - 'EV',
    - 'EW',
    - 'EWb',
    - 'Ea',
    - 'Eadu',
    - 'Earcmin',
    - 'Earcsec',
    - 'Eau',
    - 'Eb',
    - 'Ebarn',
    - 'Ebeam',
    - 'Ebin',
    - 'Ebit',
    - 'Ebyte',
    - 'Ecd',
    - 'Echan',
    - 'Ecount',
    - 'Ect',
    - 'Ed',
    - 'Edeg',
    - 'Edyn',
    - 'EeV',
    - 'Eerg',
    - 'Eg',
    - 'Eh',
    - 'EiB',
    - 'Eib',
    - 'Eibit',
    - 'Eibyte',
    - 'Ek',
    - 'El',
    - 'Elm',
    - 'Elx',
    - 'Elyr',
    - 'Em',
    - 'Emag',
    - 'Emin',
    - 'Emol',
    - 'Eohm',
    - 'Epc',
    - 'Eph',
    - 'Ephoton',
    - 'Epix',
    - 'Epixel',
    - 'Erad',
    - 'Es',
    - 'Esr',
    - 'Eu',
    - 'Evox',
    - 'Evoxel',
    - 'Eyr',
    - 'F',
    - 'Farad',
    - 'Fr',
    - 'Franklin',
    - 'FunctionQuantity',
    - 'FunctionUnitBase',
    - 'G',
    - 'GA',
    - 'GAU',
    - 'GB',
    - 'GBa',
    - 'GC',
    - 'GD',
    - 'GF',
    - 'GG',
    - 'GGal',
    - 'GH',
    - 'GHz',
    - 'GJ',
    - 'GJy',
    - 'GK',
    - 'GL',
    - 'GN',
    - 'GOhm',
    - 'GP',
    - 'GPa',
    - 'GR',
    - 'GRy',
    - 'GS',
    - 'GSt',
    - 'GT',
    - 'GV',
    - 'GW',
    - 'GWb',
    - 'Ga',
    - 'Gadu',
    - 'Gal',
    - 'Garcmin',
    - 'Garcsec',
    - 'Gau',
    - 'Gauss',
    - 'Gb',
    - 'Gbarn',
    - 'Gbeam',
    - 'Gbin',
    - 'Gbit',
    - 'Gbyte',
    - 'Gcd',
    - 'Gchan',
    - 'Gcount',
    - 'Gct',
    - 'Gd',
    - 'Gdeg',
    - 'Gdyn',
    - 'GeV',
    - 'Gerg',
    - 'Gg',
    - 'Gh',
    - 'GiB',
    - 'Gib',
    - 'Gibit',
    - 'Gibyte',
    - 'Gk',
    - 'Gl',
    - 'Glm',
    - 'Glx',
    - 'Glyr',
    - 'Gm',
    - 'Gmag',
    - 'Gmin',
    - 'Gmol',
    - 'Gohm',
    - 'Gpc',
    - 'Gph',
    - 'Gphoton',
    - 'Gpix',
    - 'Gpixel',
    - 'Grad',
    - 'Gs',
    - 'Gsr',
    - 'Gu',
    - 'Gvox',
    - 'Gvoxel',
    - 'Gyr',
    - 'H',
    - 'Henry',
    - 'Hertz',
    - 'Hz',
    - 'IrreducibleUnit',
    - 'J',
    - 'Jansky',
    - 'Joule',
    - 'Jy',
    - 'K',
    - 'Kayser',
    - 'Kelvin',
    - 'KiB',
    - 'Kib',
    - 'Kibit',
    - 'Kibyte',
    - 'L',
    - 'L_bol',
    - 'L_sun',
    - 'LogQuantity',
    - 'LogUnit',
    - 'Lsun',
    - 'MA',
    - 'MAU',
    - 'MB',
    - 'MBa',
    - 'MC',
    - 'MD',
    - 'MF',
    - 'MG',
    - 'MGal',
    - 'MH',
    - 'MHz',
    - 'MJ',
    - 'MJy',
    - 'MK',
    - 'ML',
    - 'MN',
    - 'MOhm',
    - 'MP',
    - 'MPa',
    - 'MR',
    - 'MRy',
    - 'MS',
    - 'MSt',
    - 'MT',
    - 'MV',
    - 'MW',
    - 'MWb',
    - 'M_bol',
    - 'M_e',
    - 'M_earth',
    - 'M_jup',
    - 'M_jupiter',
    - 'M_p',
    - 'M_sun',
    - 'Ma',
    - 'Madu',
    - 'MagUnit',
    - 'Magnitude',
    - 'Marcmin',
    - 'Marcsec',
    - 'Mau',
    - 'Mb',
    - 'Mbarn',
    - 'Mbeam',
    - 'Mbin',
    - 'Mbit',
    - 'Mbyte',
    - 'Mcd',
    - 'Mchan',
    - 'Mcount',
    - 'Mct',
    - 'Md',
    - 'Mdeg',
    - 'Mdyn',
    - 'MeV',
    - 'Mearth',
    - 'Merg',
    - 'Mg',
    - 'Mh',
    - 'MiB',
    - 'Mib',
    - 'Mibit',
    - 'Mibyte',
    - 'Mjup',
    - 'Mjupiter',
    - 'Mk',
    - 'Ml',
    - 'Mlm',
    - 'Mlx',
    - 'Mlyr',
    - 'Mm',
    - 'Mmag',
    - 'Mmin',
    - 'Mmol',
    - 'Mohm',
    - 'Mpc',
    - 'Mph',
    - 'Mphoton',
    - 'Mpix',
    - 'Mpixel',
    - 'Mrad',
    - 'Ms',
    - 'Msr',
    - 'Msun',
    - 'Mu',
    - 'Mvox',
    - 'Mvoxel',
    - 'Myr',
    - 'N',
    - 'NamedUnit',
    - 'Newton',
    - 'Ohm',
    - 'P',
    - 'PA',
    - 'PAU',
    - 'PB',
    - 'PBa',
    - 'PC',
    - 'PD',
    - 'PF',
    - 'PG',
    - 'PGal',
    - 'PH',
    - 'PHz',
    - 'PJ',
    - 'PJy',
    - 'PK',
    - 'PL',
    - 'PN',
    - 'POhm',
    - 'PP',
    - 'PPa',
    - 'PR',
    - 'PRy',
    - 'PS',
    - 'PSt',
    - 'PT',
    - 'PV',
    - 'PW',
    - 'PWb',
    - 'Pa',
    - 'Padu',
    - 'Parcmin',
    - 'Parcsec',
    - 'Pascal',
    - 'Pau',
    - 'Pb',
    - 'Pbarn',
    - 'Pbeam',
    - 'Pbin',
    - 'Pbit',
    - 'Pbyte',
    - 'Pcd',
    - 'Pchan',
    - 'Pcount',
    - 'Pct',
    - 'Pd',
    - 'Pdeg',
    - 'Pdyn',
    - 'PeV',
    - 'Perg',
    - 'Pg',
    - 'Ph',
    - 'PiB',
    - 'Pib',
    - 'Pibit',
    - 'Pibyte',
    - 'Pk',
    - 'Pl',
    - 'Plm',
    - 'Plx',
    - 'Plyr',
    - 'Pm',
    - 'Pmag',
    - 'Pmin',
    - 'Pmol',
    - 'Pohm',
    - 'Ppc',
    - 'Pph',
    - 'Pphoton',
    - 'Ppix',
    - 'Ppixel',
    - 'Prad',
    - 'PrefixUnit',
    - 'Ps',
    - 'Psr',
    - 'Pu',
    - 'Pvox',
    - 'Pvoxel',
    - 'Pyr',
    - 'Quantity',
    - 'QuantityInfo',
    - 'QuantityInfoBase',
    - 'R',
    - 'R_earth',
    - 'R_jup',
    - 'R_jupiter',
    - 'R_sun',
    - 'Rayleigh',
    - 'Rearth',
    - 'Rjup',
    - 'Rjupiter',
    - 'Rsun',
    - 'Ry',
    - 'S',
    - 'ST',
    - 'STflux',
    - 'STmag',
    - 'Siemens',
    - 'SpecificTypeQuantity',
    - 'St',
    - 'Sun',
    - 'T',
    - 'TA',
    - 'TAU',
    - 'TB',
    - 'TBa',
    - 'TC',
    - 'TD',
    - 'TF',
    - 'TG',
    - 'TGal',
    - 'TH',
    - 'THz',
    - 'TJ',
    - 'TJy',
    - 'TK',
    - 'TL',
    - 'TN',
    - 'TOhm',
    - 'TP',
    - 'TPa',
    - 'TR',
    - 'TRy',
    - 'TS',
    - 'TSt',
    - 'TT',
    - 'TV',
    - 'TW',
    - 'TWb',
    - 'Ta',
    - 'Tadu',
    - 'Tarcmin',
    - 'Tarcsec',
    - 'Tau',
    - 'Tb',
    - 'Tbarn',
    - 'Tbeam',
    - 'Tbin',
    - 'Tbit',
    - 'Tbyte',
    - 'Tcd',
    - 'Tchan',
    - 'Tcount',
    - 'Tct',
    - 'Td',
    - 'Tdeg',
    - 'Tdyn',
    - 'TeV',
    - 'Terg',
    - 'Tesla',
    - 'Tg',
    - 'Th',
    - 'TiB',
    - 'Tib',
    - 'Tibit',
    - 'Tibyte',
    - 'Tk',
    - 'Tl',
    - 'Tlm',
    - 'Tlx',
    - 'Tlyr',
    - 'Tm',
    - 'Tmag',
    - 'Tmin',
    - 'Tmol',
    - 'Tohm',
    - 'Tpc',
    - 'Tph',
    - 'Tphoton',
    - 'Tpix',
    - 'Tpixel',
    - 'Trad',
    - 'Ts',
    - 'Tsr',
    - 'Tu',
    - 'Tvox',
    - 'Tvoxel',
    - 'Tyr',
    - 'Unit',
    - 'UnitBase',
    - 'UnitConversionError',
    - 'UnitTypeError',
    - 'UnitsError',
    - 'UnitsWarning',
    - 'UnrecognizedUnit',
    - 'V',
    - 'Volt',
    - 'W',
    - 'Watt',
    - 'Wb',
    - 'Weber',
    - 'YA',
    - 'YAU',
    - 'YB',
    - 'YBa',
    - 'YC',
    - 'YD',
    - 'YF',
    - 'YG',
    - 'YGal',
    - 'YH',
    - 'YHz',
    - 'YJ',
    - 'YJy',
    - 'YK',
    - 'YL',
    - 'YN',
    - 'YOhm',
    - 'YP',
    - 'YPa',
    - 'YR',
    - 'YRy',
    - 'YS',
    - 'YSt',
    - 'YT',
    - 'YV',
    - 'YW',
    - 'YWb',
    - 'Ya',
    - 'Yadu',
    - 'Yarcmin',
    - 'Yarcsec',
    - 'Yau',
    - 'Yb',
    - 'Ybarn',
    - 'Ybeam',
    - 'Ybin',
    - 'Ybit',
    - 'Ybyte',
    - 'Ycd',
    - 'Ychan',
    - 'Ycount',
    - 'Yct',
    - 'Yd',
    - 'Ydeg',
    - 'Ydyn',
    - 'YeV',
    - 'Yerg',
    - 'Yg',
    - 'Yh',
    - 'Yk',
    - 'Yl',
    - 'Ylm',
    - 'Ylx',
    - 'Ylyr',
    - 'Ym',
    - 'Ymag',
    - 'Ymin',
    - 'Ymol',
    - 'Yohm',
    - 'Ypc',
    - 'Yph',
    - 'Yphoton',
    - 'Ypix',
    - 'Ypixel',
    - 'Yrad',
    - 'Ys',
    - 'Ysr',
    - 'Yu',
    - 'Yvox',
    - 'Yvoxel',
    - 'Yyr',
    - 'ZA',
    - 'ZAU',
    - 'ZB',
    - 'ZBa',
    - 'ZC',
    - 'ZD',
    - 'ZF',
    - 'ZG',
    - 'ZGal',
    - 'ZH',
    - 'ZHz',
    - 'ZJ',
    - 'ZJy',
    - 'ZK',
    - 'ZL',
    - 'ZN',
    - 'ZOhm',
    - 'ZP',
    - 'ZPa',
    - 'ZR',
    - 'ZRy',
    - 'ZS',
    - 'ZSt',
    - 'ZT',
    - 'ZV',
    - 'ZW',
    - 'ZWb',
    - 'Za',
    - 'Zadu',
    - 'Zarcmin',
    - 'Zarcsec',
    - 'Zau',
    - 'Zb',
    - 'Zbarn',
    - 'Zbeam',
    - 'Zbin',
    - 'Zbit',
    - 'Zbyte',
    - 'Zcd',
    - 'Zchan',
    - 'Zcount',
    - 'Zct',
    - 'Zd',
    - 'Zdeg',
    - 'Zdyn',
    - 'ZeV',
    - 'Zerg',
    - 'Zg',
    - 'Zh',
    - 'Zk',
    - 'Zl',
    - 'Zlm',
    - 'Zlx',
    - 'Zlyr',
    - 'Zm',
    - 'Zmag',
    - 'Zmin',
    - 'Zmol',
    - 'Zohm',
    - 'Zpc',
    - 'Zph',
    - 'Zphoton',
    - 'Zpix',
    - 'Zpixel',
    - 'Zrad',
    - 'Zs',
    - 'Zsr',
    - 'Zu',
    - 'Zvox',
    - 'Zvoxel',
    - 'Zyr',
    - '__builtins__',
    - '__cached__',
    - '__doc__',
    - '__file__',
    - '__loader__',
    - '__name__',
    - '__package__',
    - '__path__',
    - '__spec__',
    - 'a',
    - 'aA',
    - 'aAU',
    - 'aB',
    - 'aBa',
    - 'aC',
    - 'aD',
    - 'aF',
    - 'aG',
    - 'aGal',
    - 'aH',
    - 'aHz',
    - 'aJ',
    - 'aJy',
    - 'aK',
    - 'aL',
    - 'aN',
    - 'aOhm',
    - 'aP',
    - 'aPa',
    - 'aR',
    - 'aRy',
    - 'aS',
    - 'aSt',
    - 'aT',
    - 'aV',
    - 'aW',
    - 'aWb',
    - 'aa',
    - 'aadu',
    - 'aarcmin',
    - 'aarcsec',
    - 'aau',
    - 'ab',
    - 'abA',
    - 'abC',
    - 'abampere',
    - 'abarn',
    - 'abcoulomb',
    - 'abeam',
    - 'abin',
    - 'abit',
    - 'abyte',
    - 'acd',
    - 'achan',
    - 'acount',
    - 'act',
    - 'ad',
    - 'add_enabled_equivalencies',
    - 'add_enabled_units',
    - 'adeg',
    - 'adu',
    - 'adyn',
    - 'aeV',
    - 'aerg',
    - 'ag',
    - 'ah',
    - 'ak',
    - 'al',
    - 'allclose',
    - 'alm',
    - 'alx',
    - 'alyr',
    - 'am',
    - 'amag',
    - 'amin',
    - 'amol',
    - 'amp',
    - 'ampere',
    - 'angstrom',
    - 'annum',
    - 'aohm',
    - 'apc',
    - 'aph',
    - 'aphoton',
    - 'apix',
    - 'apixel',
    - 'arad',
    - 'arcmin',
    - 'arcminute',
    - 'arcsec',
    - 'arcsecond',
    - 'asr',
    - 'astronomical_unit',
    - 'astrophys',
    - 'attoBarye',
    - 'attoDa',
    - 'attoDalton',
    - 'attoDebye',
    - 'attoFarad',
    - 'attoGauss',
    - 'attoHenry',
    - 'attoHertz',
    - 'attoJansky',
    - 'attoJoule',
    - 'attoKayser',
    - 'attoKelvin',
    - 'attoNewton',
    - 'attoOhm',
    - 'attoPascal',
    - 'attoRayleigh',
    - 'attoSiemens',
    - 'attoTesla',
    - 'attoVolt',
    - 'attoWatt',
    - 'attoWeber',
    - 'attoamp',
    - 'attoampere',
    - 'attoannum',
    - 'attoarcminute',
    - 'attoarcsecond',
    - 'attoastronomical_unit',
    - 'attobarn',
    - 'attobarye',
    - 'attobit',
    - 'attobyte',
    - 'attocandela',
    - 'attocoulomb',
    - 'attocount',
    - 'attoday',
    - 'attodebye',
    - 'attodegree',
    - 'attodyne',
    - 'attoelectronvolt',
    - 'attofarad',
    - 'attogal',
    - 'attogauss',
    - 'attogram',
    - 'attohenry',
    - 'attohertz',
    - 'attohour',
    - 'attohr',
    - 'attojansky',
    - 'attojoule',
    - 'attokayser',
    - 'attolightyear',
    - 'attoliter',
    - 'attolumen',
    - 'attolux',
    - 'attometer',
    - 'attominute',
    - 'attomole',
    - 'attonewton',
    - 'attoparsec',
    - 'attopascal',
    - 'attophoton',
    - 'attopixel',
    - 'attopoise',
    - 'attoradian',
    - 'attorayleigh',
    - 'attorydberg',
    - 'attosecond',
    - 'attosiemens',
    - 'attosteradian',
    - 'attostokes',
    - 'attotesla',
    - 'attovolt',
    - 'attovoxel',
    - 'attowatt',
    - 'attoweber',
    - 'attoyear',
    - 'au',
    - 'avox',
    - 'avoxel',
    - 'ayr',
    - 'b',
    - 'bar',
    - 'barn',
    - 'barye',
    - 'beam',
    - 'beam_angular_area',
    - 'becquerel',
    - 'bin',
    - 'binary_prefixes',
    - 'bit',
    - 'bol',
    - 'brightness_temperature',
    - 'byte',
    - 'cA',
    - 'cAU',
    - 'cB',
    - 'cBa',
    - 'cC',
    - 'cD',
    - 'cF',
    - 'cG',
    - 'cGal',
    - 'cH',
    - 'cHz',
    - 'cJ',
    - 'cJy',
    - 'cK',
    - 'cL',
    - 'cN',
    - 'cOhm',
    - 'cP',
    - 'cPa',
    - 'cR',
    - 'cRy',
    - 'cS',
    - 'cSt',
    - 'cT',
    - 'cV',
    - 'cW',
    - 'cWb',
    - 'ca',
    - 'cadu',
    - 'candela',
    - 'carcmin',
    - 'carcsec',
    - 'cau',
    - 'cb',
    - 'cbarn',
    - 'cbeam',
    - 'cbin',
    - 'cbit',
    - 'cbyte',
    - 'ccd',
    - 'cchan',
    - 'ccount',
    - 'cct',
    - 'cd',
    - 'cdeg',
    - 'cdyn',
    - 'ceV',
    - 'centiBarye',
    - 'centiDa',
    - 'centiDalton',
    - 'centiDebye',
    - 'centiFarad',
    - 'centiGauss',
    - 'centiHenry',
    - 'centiHertz',
    - 'centiJansky',
    - 'centiJoule',
    - 'centiKayser',
    - 'centiKelvin',
    - 'centiNewton',
    - 'centiOhm',
    - 'centiPascal',
    - 'centiRayleigh',
    - 'centiSiemens',
    - 'centiTesla',
    - 'centiVolt',
    - 'centiWatt',
    - 'centiWeber',
    - 'centiamp',
    - 'centiampere',
    - 'centiannum',
    - 'centiarcminute',
    - 'centiarcsecond',
    - 'centiastronomical_unit',
    - 'centibarn',
    - 'centibarye',
    - 'centibit',
    - 'centibyte',
    - 'centicandela',
    - 'centicoulomb',
    - 'centicount',
    - 'centiday',
    - 'centidebye',
    - 'centidegree',
    - 'centidyne',
    - 'centielectronvolt',
    - 'centifarad',
    - 'centigal',
    - 'centigauss',
    - 'centigram',
    - 'centihenry',
    - 'centihertz',
    - 'centihour',
    - 'centihr',
    - 'centijansky',
    - 'centijoule',
    - 'centikayser',
    - 'centilightyear',
    - 'centiliter',
    - 'centilumen',
    - 'centilux',
    - 'centimeter',
    - 'centiminute',
    - 'centimole',
    - 'centinewton',
    - 'centiparsec',
    - 'centipascal',
    - 'centiphoton',
    - 'centipixel',
    - 'centipoise',
    - 'centiradian',
    - 'centirayleigh',
    - 'centirydberg',
    - 'centisecond',
    - 'centisiemens',
    - 'centisteradian',
    - 'centistokes',
    - 'centitesla',
    - 'centivolt',
    - 'centivoxel',
    - 'centiwatt',
    - 'centiweber',
    - 'centiyear',
    - 'cerg',
    - 'cg',
    - 'cgs',
    - 'ch',
    - 'chan',
    - 'ck',
    - 'cl',
    - 'clm',
    - 'clx',
    - 'clyr',
    - 'cm',
    - 'cmag',
    - 'cmin',
    - 'cmol',
    - 'cohm',
    - 'core',
    - 'coulomb',
    - 'count',
    - 'cpc',
    - 'cph',
    - 'cphoton',
    - 'cpix',
    - 'cpixel',
    - 'crad',
    - 'cs',
    - 'csr',
    - 'ct',
    - 'cu',
    - 'curie',
    - 'cvox',
    - 'cvoxel',
    - 'cy',
    - 'cycle',
    - 'cyr',
    - 'd',
    - 'dA',
    - 'dAU',
    - 'dB',
    - 'dBa',
    - 'dC',
    - 'dD',
    - 'dF',
    - 'dG',
    - 'dGal',
    - 'dH',
    - 'dHz',
    - 'dJ',
    - 'dJy',
    - 'dK',
    - 'dL',
    - 'dN',
    - 'dOhm',
    - 'dP',
    - 'dPa',
    - 'dR',
    - 'dRy',
    - 'dS',
    - 'dSt',
    - 'dT',
    - ...]
    -
    -
    -
    -
    -

    To create a quantity, we multiply a value by a unit.

    -
    -
    -
    coord = 30 * u.deg
    -type(coord)
    -
    -
    -
    -
    -
    astropy.units.quantity.Quantity
    -
    -
    -
    -
    -

    The result is a Quantity object.

    -

    Jupyter knows how to display Quantities like this:

    -
    -
    -
    coord
    -
    -
    -
    -
    -
    -\[30 \; \mathrm{{}^{\circ}}\]
    -
    -
    -
    -
    -

    Selecting a rectangle

    -

    Now we’ll select a rectangle from -55 to -45 degrees right ascension and -8 to 4 degrees of declination.

    -

    We’ll define variables to contain these limits.

    -
    -
    -
    phi1_min = -55
    -phi1_max = -45
    -phi2_min = -8
    -phi2_max = 4
    -
    -
    -
    -
    -

    To represent a rectangle, we’ll use two lists of coordinates and multiply by their units.

    -
    -
    -
    phi1_rect = [phi1_min, phi1_min, phi1_max, phi1_max] * u.deg
    -phi2_rect = [phi2_min, phi2_max, phi2_max, phi2_min] * u.deg
    -
    -
    -
    -
    -

    phi1_rect and phi2_rect represent the coordinates of the corners of a rectangle.

    -

    But they are in “a Heliocentric spherical coordinate system defined by the orbit of the GD1 stream

    -

    In order to use them in a Gaia query, we have to convert them to International Celestial Reference System (ICRS) coordinates. We can do that by storing the coordinates in a GD1Koposov10 object provided by Gala.

    -
    -
    -
    import gala.coordinates as gc
    -
    -corners = gc.GD1Koposov10(phi1=phi1_rect, phi2=phi2_rect)
    -type(corners)
    -
    -
    -
    -
    -
    gala.coordinates.gd1.GD1Koposov10
    -
    -
    -
    -
    -

    We can display the result like this:

    -
    -
    -
    corners
    -
    -
    -
    -
    -
    <GD1Koposov10 Coordinate: (phi1, phi2) in deg
    -    [(-55., -8.), (-55.,  4.), (-45.,  4.), (-45., -8.)]>
    -
    -
    -
    -
    -

    Now we can use transform_to to convert to ICRS coordinates.

    -
    -
    -
    import astropy.coordinates as coord
    -
    -corners_icrs = corners.transform_to(coord.ICRS)
    -type(corners_icrs)
    -
    -
    -
    -
    -
    astropy.coordinates.builtin_frames.icrs.ICRS
    -
    -
    -
    -
    -

    The result is an ICRS object.

    -
    -
    -
    corners_icrs
    -
    -
    -
    -
    -
    <ICRS Coordinate: (ra, dec) in deg
    -    [(146.27533314, 19.26190982), (135.42163944, 25.87738723),
    -     (141.60264825, 34.3048303 ), (152.81671045, 27.13611254)]>
    -
    -
    -
    -
    -

    Notice that a rectangle in one coordinate system is not necessarily a rectangle in another. In this example, the result is a polygon.

    -
    -
    -

    Selecting a polygon

    -

    In order to use this polygon as part of an ADQL query, we have to convert it to a string with a comma-separated list of coordinates, as in this example:

    -
    """
    -POLYGON(143.65, 20.98, 
    -        134.46, 26.39, 
    -        140.58, 34.85, 
    -        150.16, 29.01)
    -"""
    -
    -
    -

    corners_icrs behaves like a list, so we can use a for loop to iterate through the points.

    -
    -
    -
    for point in corners_icrs:
    -    print(point)
    -
    -
    -
    -
    -
    <ICRS Coordinate: (ra, dec) in deg
    -    (146.27533314, 19.26190982)>
    -<ICRS Coordinate: (ra, dec) in deg
    -    (135.42163944, 25.87738723)>
    -<ICRS Coordinate: (ra, dec) in deg
    -    (141.60264825, 34.3048303)>
    -<ICRS Coordinate: (ra, dec) in deg
    -    (152.81671045, 27.13611254)>
    -
    -
    -
    -
    -

    From that, we can select the coordinates ra and dec:

    -
    -
    -
    for point in corners_icrs:
    -    print(point.ra, point.dec)
    -
    -
    -
    -
    -
    146d16m31.1993s 19d15m42.8754s
    -135d25m17.902s 25d52m38.594s
    -141d36m09.5337s 34d18m17.3891s
    -152d49m00.1576s 27d08m10.0051s
    -
    -
    -
    -
    -

    The results are quantities with units, but if we select the value part, we get a dimensionless floating-point number.

    -
    -
    -
    for point in corners_icrs:
    -    print(point.ra.value, point.dec.value)
    -
    -
    -
    -
    -
    146.27533313607782 19.261909820533692
    -135.42163944306296 25.87738722767213
    -141.60264825107333 34.304830296257144
    -152.81671044675923 27.136112541397996
    -
    -
    -
    -
    -

    We can use string format to convert these numbers to strings.

    -
    -
    -
    point_base = "{point.ra.value}, {point.dec.value}"
    -
    -t = [point_base.format(point=point)
    -     for point in corners_icrs]
    -t
    -
    -
    -
    -
    -
    ['146.27533313607782, 19.261909820533692',
    - '135.42163944306296, 25.87738722767213',
    - '141.60264825107333, 34.304830296257144',
    - '152.81671044675923, 27.136112541397996']
    -
    -
    -
    -
    -

    The result is a list of strings, which we can join into a single string using join.

    -
    -
    -
    point_list = ', '.join(t)
    -point_list
    -
    -
    -
    -
    -
    '146.27533313607782, 19.261909820533692, 135.42163944306296, 25.87738722767213, 141.60264825107333, 34.304830296257144, 152.81671044675923, 27.136112541397996'
    -
    -
    -
    -
    -

    Notice that we invoke join on a string and pass the list as an argument.

    -

    Before we can assemble the query, we need columns again (as we saw in the previous notebook).

    -
    -
    -
    columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'
    -
    -
    -
    -
    -

    Here’s the base for the query, with format specifiers for columns and point_list.

    -
    -
    -
    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 here’s the result:

    -
    -
    -
    query = query_base.format(columns=columns, 
    -                          point_list=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(146.27533313607782, 19.261909820533692, 135.42163944306296, 25.87738722767213, 141.60264825107333, 34.304830296257144, 152.81671044675923, 27.136112541397996))
    -
    -
    -
    -
    -

    As always, we should take a minute to proof-read the query before we launch it.

    -

    The result will be bigger than our previous queries, so it will take a little longer.

    -
    -
    -
    job = Gaia.launch_job_async(query)
    -print(job)
    -
    -
    -
    -
    -
    INFO: Query finished. [astroquery.utils.tap.core]
    -<Table length=140340>
    -      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 139374
    -Jobid: 1601903357321O
    -Phase: COMPLETED
    -Owner: None
    -Output file: async_20201005090917.vot
    -Results: None
    -
    -
    -
    -
    -

    Here are the results.

    -
    -
    -
    results = job.get_results()
    -len(results)
    -
    -
    -
    -
    -
    140340
    -
    -
    -
    -
    -

    There are more than 100,000 stars in this polygon, but that’s a manageable size to work with.

    -
    -
    -

    Saving results

    -

    This is the set of stars we’ll work with in the next step. But since we have a substantial dataset now, this is a good time to save it.

    -

    Storing the data in a file means we can shut down this notebook and pick up where we left off without running the previous query again.

    -

    Astropy Table objects provide write, which writes the table to disk.

    -
    -
    -
    filename = 'gd1_results.fits'
    -results.write(filename, overwrite=True)
    -
    -
    -
    -
    -

    Because the filename ends with fits, the table is written in the FITS format, which preserves the metadata associated with the table.

    -

    If the file already exists, the overwrite argument causes it to be overwritten.

    -

    To see how big the file is, we can use ls with the -lh option, which prints information about the file including its size in human-readable form.

    -
    -
    -
    !ls -lh gd1_results.fits
    -
    -
    -
    -
    -
    -rw-rw-r-- 1 downey downey 8.6M Oct  5 09:09 gd1_results.fits
    -
    -
    -
    -
    -

    The file is about 8.6 MB.

    -
    -
    -

    Summary

    -

    In this notebook, we composed more complex queries to select stars within a polygonal region of the sky. Then we downloaded the results and saved them in a FITS file.

    -

    In the next notebook, we’ll reload the data from this file and replicate the next step in the analysis, using proper motion to identify stars likely to be in GD-1.

    -
    -
    -

    Best practices

    -
      -
    • For measurements with units, use Quantity objects that represent units explicitly and check for errors.

    • -
    • Use the format function to compose queries; it is often faster and less error-prone.

    • -
    • Develop queries incrementally: start with something simple, test it, and add a little bit at a time.

    • -
    • Once you have a query working, save the data in a local file. If you shut down the notebook and come back to it later, you can reload the file; you don’t have to run the query again.

    • -
    -
    -
    - - - - -
    - -
    -
    - - -
    - - -
    -
    -
    -

    - - By Allen B. Downey
    - - © Copyright 2020.
    -

    -
    -
    -
    - - -
    -
    - - - - - - - - \ No newline at end of file diff --git a/_images/03_motion_98_0.png b/_images/03_motion_103_0.png similarity index 100% rename from _images/03_motion_98_0.png rename to _images/03_motion_103_0.png diff --git a/_images/03_motion_28_0.png b/_images/03_motion_29_0.png similarity index 100% rename from _images/03_motion_28_0.png rename to _images/03_motion_29_0.png diff --git a/_images/03_motion_45_0.png b/_images/03_motion_45_0.png deleted file mode 100644 index f3e40e9..0000000 Binary files a/_images/03_motion_45_0.png and /dev/null differ diff --git a/_images/03_motion_79_0.png b/_images/03_motion_84_0.png similarity index 100% rename from _images/03_motion_79_0.png rename to _images/03_motion_84_0.png diff --git a/_images/03_motion_81_0.png b/_images/03_motion_86_0.png similarity index 100% rename from _images/03_motion_81_0.png rename to _images/03_motion_86_0.png diff --git a/_images/03_motion_88_0.png b/_images/03_motion_93_0.png similarity index 100% rename from _images/03_motion_88_0.png rename to _images/03_motion_93_0.png diff --git a/_images/04_select_11_0.png b/_images/04_select_12_0.png similarity index 100% rename from _images/04_select_11_0.png rename to _images/04_select_12_0.png diff --git a/_images/04_select_13_0.png b/_images/04_select_14_0.png similarity index 100% rename from _images/04_select_13_0.png rename to _images/04_select_14_0.png diff --git a/_images/04_select_25_0.png b/_images/04_select_28_0.png similarity index 100% rename from _images/04_select_25_0.png rename to _images/04_select_28_0.png diff --git a/_images/04_select_51_0.png b/_images/04_select_56_0.png similarity index 100% rename from _images/04_select_51_0.png rename to _images/04_select_56_0.png diff --git a/_images/04_select_57_0.png b/_images/04_select_62_0.png similarity index 100% rename from _images/04_select_57_0.png rename to _images/04_select_62_0.png diff --git a/_images/05_join_9_0.png b/_images/05_join_10_0.png similarity index 100% rename from _images/05_join_9_0.png rename to _images/05_join_10_0.png diff --git a/_images/06_photo_114_0.png b/_images/06_photo_114_0.png new file mode 100644 index 0000000..889d799 Binary files /dev/null and b/_images/06_photo_114_0.png differ diff --git a/_images/06_photo_116_0.png b/_images/06_photo_116_0.png new file mode 100644 index 0000000..16586ba Binary files /dev/null and b/_images/06_photo_116_0.png differ diff --git a/_images/06_photo_12_0.png b/_images/06_photo_14_0.png similarity index 100% rename from _images/06_photo_12_0.png rename to _images/06_photo_14_0.png diff --git a/_images/06_photo_23_0.png b/_images/06_photo_23_0.png deleted file mode 100644 index be23eb8..0000000 Binary files a/_images/06_photo_23_0.png and /dev/null differ diff --git a/_images/06_photo_46_0.png b/_images/06_photo_46_0.png new file mode 100644 index 0000000..f8e4d01 Binary files /dev/null and b/_images/06_photo_46_0.png differ diff --git a/_images/06_photo_61_0.png b/_images/06_photo_61_0.png index 86e1ce0..01e4585 100644 Binary files a/_images/06_photo_61_0.png and b/_images/06_photo_61_0.png differ diff --git a/_images/06_photo_63_0.png b/_images/06_photo_63_0.png deleted file mode 100644 index e06ef8d..0000000 Binary files a/_images/06_photo_63_0.png and /dev/null differ diff --git a/_images/06_photo_66_0.png b/_images/06_photo_66_0.png new file mode 100644 index 0000000..fd8c1bc Binary files /dev/null and b/_images/06_photo_66_0.png differ diff --git a/_images/06_photo_72_0.png b/_images/06_photo_72_0.png new file mode 100644 index 0000000..0931648 Binary files /dev/null and b/_images/06_photo_72_0.png differ diff --git a/_images/07_plot_13_0.png b/_images/07_plot_14_0.png similarity index 100% rename from _images/07_plot_13_0.png rename to _images/07_plot_14_0.png diff --git a/_images/07_plot_50_0.png b/_images/07_plot_51_0.png similarity index 100% rename from _images/07_plot_50_0.png rename to _images/07_plot_51_0.png diff --git a/_images/07_plot_57_0.png b/_images/07_plot_58_0.png similarity index 100% rename from _images/07_plot_57_0.png rename to _images/07_plot_58_0.png diff --git a/_images/07_plot_63_0.png b/_images/07_plot_64_0.png similarity index 100% rename from _images/07_plot_63_0.png rename to _images/07_plot_64_0.png diff --git a/_images/07_plot_69_0.png b/_images/07_plot_70_0.png similarity index 100% rename from _images/07_plot_69_0.png rename to _images/07_plot_70_0.png diff --git a/_images/07_plot_72_0.png b/_images/07_plot_73_0.png similarity index 100% rename from _images/07_plot_72_0.png rename to _images/07_plot_73_0.png diff --git a/_sources/01_query.md b/_sources/01_query.md deleted file mode 100644 index a6b736b..0000000 --- a/_sources/01_query.md +++ /dev/null @@ -1,1073 +0,0 @@ -# Chapter 1 - -*Astronomical Data in Python* is an introduction to tools and practices for working with astronomical data. Topics covered include: - -* Writing queries that select and download data from a database. - -* Using data stored in an Astropy `Table` or Pandas `DataFrame`. - -* Working with coordinates and other quantities with units. - -* Storing data in various formats. - -* Performing database join operations that combine data from multiple tables. - -* Visualizing data and preparing publication-quality figures. - -As a running example, we will replicate part of the analysis in a recent paper, "[Off the beaten path: Gaia reveals GD-1 stars outside of the main stream](https://arxiv.org/abs/1805.00425)" by Adrian M. Price-Whelan and Ana Bonaca. - -As the abstract explains, "Using data from the Gaia second data release combined with Pan-STARRS photometry, we present a sample of highly-probable members of the longest cold stream in the Milky Way, GD-1." - -GD-1 is a [stellar stream](https://en.wikipedia.org/wiki/List_of_stellar_streams), which is "an association of stars orbiting a galaxy that was once a globular cluster or dwarf galaxy that has now been torn apart and stretched out along its orbit by tidal forces." - -[This article in *Science* magazine](https://www.sciencemag.org/news/2018/10/streams-stars-reveal-galaxy-s-violent-history-and-perhaps-its-unseen-dark-matter) explains some of the background, including the process that led to the paper and an discussion of the scientific implications: - -* "The streams are particularly useful for ... galactic archaeology --- rewinding the cosmic clock to reconstruct the assembly of the Milky Way." - -* "They also are being used as exquisitely sensitive scales to measure the galaxy's mass." - -* "... the streams are well-positioned to reveal the presence of dark matter ... because the streams are so fragile, theorists say, collisions with marauding clumps of dark matter could leave telltale scars, potential clues to its nature." - -## Data - -The datasets we will work with are: - -* [Gaia](https://en.wikipedia.org/wiki/Gaia_(spacecraft)), which is "a space observatory of the European Space Agency (ESA), launched in 2013 ... designed for astrometry: measuring the positions, distances and motions of stars with unprecedented precision", and - -* [Pan-STARRS](https://en.wikipedia.org/wiki/Pan-STARRS), The Panoramic Survey Telescope and Rapid Response System, which is a survey designed to monitor the sky for transient objects, producing a catalog with accurate astronometry and photometry of detected sources. - -Both of these datasets are very large, which can make them challenging to work with. It might not be possible, or practical, to download the entire dataset. -One of the goals of this workshop is to provide tools for working with large datasets. - -## Prerequisites - -These notebooks are meant for people who are familiar with basic Python, but not necessarily the libraries we will use, like Astropy or Pandas. If you are familiar with Python lists and dictionaries, and you know how to write a function that takes parameters and returns a value, you know enough Python to get started. - -We assume that you have some familiarity with operating systems, like the ability to use a command-line interface. But we don't assume you have any prior experience with databases. - -We assume that you are familiar with astronomy at the undergraduate level, but we will not assume specialized knowledge of the datasets or analysis methods we'll use. - -## Outline - -The first lesson demonstrates the steps for selecting and downloading data from the Gaia Database: - -1. First we'll make a connection to the Gaia server, - -2. We will explore information about the database and the tables it contains, - -3. We will write a query and send it to the server, and finally - -4. We will download the response from the server. - -After completing this lesson, you should be able to - -* Compose a basic query in ADQL. - -* Use queries to explore a database and its tables. - -* Use queries to download data. - -* Develop, test, and debug a query incrementally. - -## Query Language - -In order to select data from a database, you have to compose a query, which is like a program written in a "query language". -The query language we'll use is ADQL, which stands for "Astronomical Data Query Language". - -ADQL is a dialect of [SQL](https://en.wikipedia.org/wiki/SQL) (Structured Query Language), which is by far the most commonly used query language. Almost everything you will learn about ADQL also works in SQL. - -[The reference manual for ADQL is here](http://www.ivoa.net/documents/ADQL/20180112/PR-ADQL-2.1-20180112.html). -But you might find it easier to learn from [this ADQL Cookbook](https://www.gaia.ac.uk/data/gaia-data-release-1/adql-cookbook). - -## Installing libraries - -The library we'll use to get Gaia data is [Astroquery](https://astroquery.readthedocs.io/en/latest/). - -If you are running this notebook on Colab, you can run the following cell to install Astroquery and the other libraries we'll use. - -If you are running this notebook on your own computer, you might have to install these libraries yourself. - -If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions. - -TODO: Add a link to the instructions. - - - -```python -# 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 -``` - -## Connecting to Gaia - -Astroquery provides `Gaia`, which is an [object that represents a connection to the Gaia database](https://astroquery.readthedocs.io/en/latest/gaia/gaia.html). - -We can connect to the Gaia database like this: - - -```python -from astroquery.gaia import Gaia -``` - - 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 - - -Running this import statement has the effect of creating a [TAP+](http://www.ivoa.net/documents/TAP/) connection; TAP stands for "Table Access Protocol". It is a network protocol for sending queries to the database and getting back the results. We're not sure why it seems to create two connections. - -## Databases and Tables - -What is a database, anyway? Most generally, it can be any collection of data, but when we are talking about ADQL or SQL: - -* A database is a collection of one or more named tables. - -* Each table is a 2-D array with one or more named columns of data. - -We can use `Gaia.load_tables` to get the names of the tables in the Gaia database. With the option `only_names=True`, it loads information about the tables, called the "metadata", not the data itself. - - -```python -tables = Gaia.load_tables(only_names=True) -``` - - INFO: Retrieving tables... [astroquery.utils.tap.core] - INFO: Parsing tables... [astroquery.utils.tap.core] - INFO: Done. [astroquery.utils.tap.core] - - - -```python -for table in (tables): - print(table.get_qualified_name()) -``` - - external.external.apassdr9 - external.external.gaiadr2_geometric_distance - external.external.galex_ais - external.external.ravedr5_com - external.external.ravedr5_dr5 - external.external.ravedr5_gra - external.external.ravedr5_on - external.external.sdssdr13_photoprimary - external.external.skymapperdr1_master - external.external.tmass_xsc - public.public.hipparcos - public.public.hipparcos_newreduction - public.public.hubble_sc - public.public.igsl_source - public.public.igsl_source_catalog_ids - public.public.tycho2 - public.public.dual - tap_config.tap_config.coord_sys - tap_config.tap_config.properties - tap_schema.tap_schema.columns - tap_schema.tap_schema.key_columns - tap_schema.tap_schema.keys - tap_schema.tap_schema.schemas - tap_schema.tap_schema.tables - gaiadr1.gaiadr1.aux_qso_icrf2_match - gaiadr1.gaiadr1.ext_phot_zero_point - gaiadr1.gaiadr1.allwise_best_neighbour - gaiadr1.gaiadr1.allwise_neighbourhood - gaiadr1.gaiadr1.gsc23_best_neighbour - gaiadr1.gaiadr1.gsc23_neighbourhood - gaiadr1.gaiadr1.ppmxl_best_neighbour - gaiadr1.gaiadr1.ppmxl_neighbourhood - gaiadr1.gaiadr1.sdss_dr9_best_neighbour - gaiadr1.gaiadr1.sdss_dr9_neighbourhood - gaiadr1.gaiadr1.tmass_best_neighbour - gaiadr1.gaiadr1.tmass_neighbourhood - gaiadr1.gaiadr1.ucac4_best_neighbour - gaiadr1.gaiadr1.ucac4_neighbourhood - gaiadr1.gaiadr1.urat1_best_neighbour - gaiadr1.gaiadr1.urat1_neighbourhood - gaiadr1.gaiadr1.cepheid - gaiadr1.gaiadr1.phot_variable_time_series_gfov - gaiadr1.gaiadr1.phot_variable_time_series_gfov_statistical_parameters - gaiadr1.gaiadr1.rrlyrae - gaiadr1.gaiadr1.variable_summary - gaiadr1.gaiadr1.allwise_original_valid - gaiadr1.gaiadr1.gsc23_original_valid - gaiadr1.gaiadr1.ppmxl_original_valid - gaiadr1.gaiadr1.sdssdr9_original_valid - gaiadr1.gaiadr1.tmass_original_valid - gaiadr1.gaiadr1.ucac4_original_valid - gaiadr1.gaiadr1.urat1_original_valid - gaiadr1.gaiadr1.gaia_source - gaiadr1.gaiadr1.tgas_source - gaiadr2.gaiadr2.aux_allwise_agn_gdr2_cross_id - gaiadr2.gaiadr2.aux_iers_gdr2_cross_id - gaiadr2.gaiadr2.aux_sso_orbit_residuals - gaiadr2.gaiadr2.aux_sso_orbits - gaiadr2.gaiadr2.dr1_neighbourhood - gaiadr2.gaiadr2.allwise_best_neighbour - gaiadr2.gaiadr2.allwise_neighbourhood - gaiadr2.gaiadr2.apassdr9_best_neighbour - gaiadr2.gaiadr2.apassdr9_neighbourhood - gaiadr2.gaiadr2.gsc23_best_neighbour - gaiadr2.gaiadr2.gsc23_neighbourhood - gaiadr2.gaiadr2.hipparcos2_best_neighbour - gaiadr2.gaiadr2.hipparcos2_neighbourhood - gaiadr2.gaiadr2.panstarrs1_best_neighbour - gaiadr2.gaiadr2.panstarrs1_neighbourhood - gaiadr2.gaiadr2.ppmxl_best_neighbour - gaiadr2.gaiadr2.ppmxl_neighbourhood - gaiadr2.gaiadr2.ravedr5_best_neighbour - gaiadr2.gaiadr2.ravedr5_neighbourhood - gaiadr2.gaiadr2.sdssdr9_best_neighbour - gaiadr2.gaiadr2.sdssdr9_neighbourhood - gaiadr2.gaiadr2.tmass_best_neighbour - gaiadr2.gaiadr2.tmass_neighbourhood - gaiadr2.gaiadr2.tycho2_best_neighbour - gaiadr2.gaiadr2.tycho2_neighbourhood - gaiadr2.gaiadr2.urat1_best_neighbour - gaiadr2.gaiadr2.urat1_neighbourhood - gaiadr2.gaiadr2.sso_observation - gaiadr2.gaiadr2.sso_source - gaiadr2.gaiadr2.vari_cepheid - gaiadr2.gaiadr2.vari_classifier_class_definition - gaiadr2.gaiadr2.vari_classifier_definition - gaiadr2.gaiadr2.vari_classifier_result - gaiadr2.gaiadr2.vari_long_period_variable - gaiadr2.gaiadr2.vari_rotation_modulation - gaiadr2.gaiadr2.vari_rrlyrae - gaiadr2.gaiadr2.vari_short_timescale - gaiadr2.gaiadr2.vari_time_series_statistics - gaiadr2.gaiadr2.panstarrs1_original_valid - gaiadr2.gaiadr2.gaia_source - gaiadr2.gaiadr2.ruwe - - -So that's a lot of tables. The ones we'll use are: - -* `gaiadr2.gaia_source`, which contains Gaia data from [data release 2](https://www.cosmos.esa.int/web/gaia/data-release-2), - -* `gaiadr2.panstarrs1_original_valid`, which contains the photometry data we'll use from PanSTARRS, and - -* `gaiadr2.panstarrs1_best_neighbour`, which we'll use to cross-match each star observed by Gaia with the same star observed by PanSTARRS. - -We can use `load_table` (not `load_tables`) to get the metadata for a single table. The name of this function is misleading, because it only downloads metadata. - - -```python -meta = Gaia.load_table('gaiadr2.gaia_source') -meta -``` - - Retrieving table 'gaiadr2.gaia_source' - Parsing table 'gaiadr2.gaia_source'... - Done. - - - - - - - - - -Jupyter shows that the result is an object of type `TapTableMeta`, but it does not display the contents. - -To see the metadata, we have to print the object. - - -```python -print(meta) -``` - - TAP Table name: gaiadr2.gaiadr2.gaia_source - Description: This table has an entry for every Gaia observed source as listed in the - Main Database accumulating catalogue version from which the catalogue - release has been generated. It contains the basic source parameters, - that is only final data (no epoch data) and no spectra (neither final - nor epoch). - Num. columns: 96 - - -Notice one gotcha: in the list of table names, this table appears as `gaiadr2.gaiadr2.gaia_source`, but when we load the metadata, we refer to it as `gaiadr2.gaia_source`. - -**Exercise:** Go back and try - -``` -meta = Gaia.load_table('gaiadr2.gaiadr2.gaia_source') -``` - -What happens? Is the error message helpful? If you had not made this error deliberately, would you have been able to figure it out? - -## Columns - -The following loop prints the names of the columns in the table. - - -```python -for column in meta.columns: - print(column.name) -``` - - solution_id - designation - source_id - random_index - ref_epoch - ra - ra_error - dec - dec_error - parallax - parallax_error - parallax_over_error - pmra - pmra_error - pmdec - pmdec_error - ra_dec_corr - ra_parallax_corr - ra_pmra_corr - ra_pmdec_corr - dec_parallax_corr - dec_pmra_corr - dec_pmdec_corr - parallax_pmra_corr - parallax_pmdec_corr - pmra_pmdec_corr - astrometric_n_obs_al - astrometric_n_obs_ac - astrometric_n_good_obs_al - astrometric_n_bad_obs_al - astrometric_gof_al - astrometric_chi2_al - astrometric_excess_noise - astrometric_excess_noise_sig - astrometric_params_solved - astrometric_primary_flag - astrometric_weight_al - astrometric_pseudo_colour - astrometric_pseudo_colour_error - mean_varpi_factor_al - astrometric_matched_observations - visibility_periods_used - astrometric_sigma5d_max - frame_rotator_object_type - matched_observations - duplicated_source - phot_g_n_obs - phot_g_mean_flux - phot_g_mean_flux_error - phot_g_mean_flux_over_error - phot_g_mean_mag - phot_bp_n_obs - phot_bp_mean_flux - phot_bp_mean_flux_error - phot_bp_mean_flux_over_error - phot_bp_mean_mag - phot_rp_n_obs - phot_rp_mean_flux - phot_rp_mean_flux_error - phot_rp_mean_flux_over_error - phot_rp_mean_mag - phot_bp_rp_excess_factor - phot_proc_mode - bp_rp - bp_g - g_rp - radial_velocity - radial_velocity_error - rv_nb_transits - rv_template_teff - rv_template_logg - rv_template_fe_h - phot_variable_flag - l - b - ecl_lon - ecl_lat - priam_flags - teff_val - teff_percentile_lower - teff_percentile_upper - a_g_val - a_g_percentile_lower - a_g_percentile_upper - e_bp_min_rp_val - e_bp_min_rp_percentile_lower - e_bp_min_rp_percentile_upper - flame_flags - radius_val - radius_percentile_lower - radius_percentile_upper - lum_val - lum_percentile_lower - lum_percentile_upper - datalink_url - epoch_photometry_url - - -You can probably guess what many of these columns are by looking at the names, but you should resist the temptation to guess. -To find out what the columns mean, [read the documentation](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html). - -If you want to know what can go wrong when you don't read the documentation, [you might like this article](https://www.vox.com/future-perfect/2019/6/4/18650969/married-women-miserable-fake-paul-dolan-happiness). - -**Exercise:** One of the other tables we'll use is `gaiadr2.gaiadr2.panstarrs1_original_valid`. Use `load_table` to get the metadata for this table. How many columns are there and what are their names? - -Hint: Remember the gotcha we mentioned earlier. - - -```python -# Solution - -meta2 = Gaia.load_table('gaiadr2.panstarrs1_original_valid') -print(meta2) -``` - - Retrieving table 'gaiadr2.panstarrs1_original_valid' - Parsing table 'gaiadr2.panstarrs1_original_valid'... - Done. - TAP Table name: gaiadr2.gaiadr2.panstarrs1_original_valid - Description: The Panoramic Survey Telescope and Rapid Response System (Pan-STARRS) is - a system for wide-field astronomical imaging developed and operated by - the Institute for Astronomy at the University of Hawaii. Pan-STARRS1 - (PS1) is the first part of Pan-STARRS to be completed and is the basis - for Data Release 1 (DR1). The PS1 survey used a 1.8 meter telescope and - its 1.4 Gigapixel camera to image the sky in five broadband filters (g, - r, i, z, y). - - The current table contains a filtered subsample of the 10 723 304 629 - entries listed in the original ObjectThin table. - We used only ObjectThin and MeanObject tables to extract - panstarrs1OriginalValid table, this means that objects detected only in - stack images are not included here. The main reason for us to avoid the - use of objects detected in stack images is that their astrometry is not - as good as the mean objects astrometry: “The stack positions (raStack, - decStack) have considerably larger systematic astrometric errors than - the mean epoch positions (raMean, decMean).” The astrometry for the - MeanObject positions uses Gaia DR1 as a reference catalog, while the - stack positions use 2MASS as a reference catalog. - - In details, we filtered out all objects where: - - - nDetections = 1 - - - no good quality data in Pan-STARRS, objInfoFlag 33554432 not set - - - mean astrometry could not be measured, objInfoFlag 524288 set - - - stack position used for mean astrometry, objInfoFlag 1048576 set - - - error on all magnitudes equal to 0 or to -999; - - - all magnitudes set to -999; - - - error on RA or DEC greater than 1 arcsec. - - The number of objects in panstarrs1OriginalValid is 2 264 263 282. - - The panstarrs1OriginalValid table contains only a subset of the columns - available in the combined ObjectThin and MeanObject tables. A - description of the original ObjectThin and MeanObjects tables can be - found at: - https://outerspace.stsci.edu/display/PANSTARRS/PS1+Database+object+and+detection+tables - - Download: - http://mastweb.stsci.edu/ps1casjobs/home.aspx - Documentation: - https://outerspace.stsci.edu/display/PANSTARRS - http://pswww.ifa.hawaii.edu/pswww/ - References: - The Pan-STARRS1 Surveys, Chambers, K.C., et al. 2016, arXiv:1612.05560 - Pan-STARRS Data Processing System, Magnier, E. A., et al. 2016, - arXiv:1612.05240 - Pan-STARRS Pixel Processing: Detrending, Warping, Stacking, Waters, C. - Z., et al. 2016, arXiv:1612.05245 - Pan-STARRS Pixel Analysis: Source Detection and Characterization, - Magnier, E. A., et al. 2016, arXiv:1612.05244 - Pan-STARRS Photometric and Astrometric Calibration, Magnier, E. A., et - al. 2016, arXiv:1612.05242 - The Pan-STARRS1 Database and Data Products, Flewelling, H. A., et al. - 2016, arXiv:1612.05243 - - Catalogue curator: - SSDC - ASI Space Science Data Center - https://www.ssdc.asi.it/ - Num. columns: 26 - - - -```python -# Solution - -for column in meta2.columns: - print(column.name) -``` - - obj_name - obj_id - ra - dec - ra_error - dec_error - epoch_mean - g_mean_psf_mag - g_mean_psf_mag_error - g_flags - r_mean_psf_mag - r_mean_psf_mag_error - r_flags - i_mean_psf_mag - i_mean_psf_mag_error - i_flags - z_mean_psf_mag - z_mean_psf_mag_error - z_flags - y_mean_psf_mag - y_mean_psf_mag_error - y_flags - n_detections - zone_id - obj_info_flag - quality_flag - - -## Writing queries - -By now you might be wondering how we actually download the data. With tables this big, you generally don't. Instead, you use queries to select only the data you want. - -A query is a string written in a query language like SQL; for the Gaia database, the query language is a dialect of SQL called ADQL. - -Here's an example of an ADQL query. - - -```python -query1 = """SELECT -TOP 10 -source_id, ref_epoch, ra, dec, parallax -FROM gaiadr2.gaia_source""" -``` - -**Python note:** We use a [triple-quoted string](https://docs.python.org/3/tutorial/introduction.html#strings) here so we can include line breaks in the query, which makes it easier to read. - -The words in uppercase are ADQL keywords: - -* `SELECT` indicates that we are selecting data (as opposed to adding or modifying data). - -* `TOP` indicates that we only want the first 10 rows of the table, which is useful for testing a query before asking for all of the data. - -* `FROM` specifies which table we want data from. - -The third line is a list of column names, indicating which columns we want. - -In this example, the keywords are capitalized and the column names are lowercase. This is a common style, but it is not required. ADQL and SQL are not case-sensitive. - -To run this query, we use the `Gaia` object, which represents our connection to the Gaia database, and invoke `launch_job`: - - -```python -job1 = Gaia.launch_job(query1) -job1 -``` - - - - - - - - -The result is an object that represents the job running on a Gaia server. - -If you print it, it displays metadata for the forthcoming table. - - -```python -print(job1) -``` - - - name dtype unit description - --------- ------- ---- ------------------------------------------------------------------ - source_id int64 Unique source identifier (unique within a particular Data Release) - ref_epoch float64 yr Reference epoch - ra float64 deg Right ascension - dec float64 deg Declination - parallax float64 mas Parallax - Jobid: None - Phase: COMPLETED - Owner: None - Output file: sync_20201005090721.xml.gz - Results: None - - -Don't worry about `Results: None`. That does not actually mean there are no results. - -However, `Phase: COMPLETED` indicates that the job is complete, so we can get the results like this: - - -```python -results1 = job1.get_results() -type(results1) -``` - - - - - astropy.table.table.Table - - - -**Optional detail:** Why is `table` repeated three times? The first is the name of the module, the second is the name of the submodule, and the third is the name of the class. Most of the time we only care about the last one. It's like the Linnean name for gorilla, which is *Gorilla Gorilla Gorilla*. - -The result is an [Astropy Table](https://docs.astropy.org/en/stable/table/), which is similar to a table in an SQL database except: - -* SQL databases are stored on disk drives, so they are persistent; that is, they "survive" even if you turn off the computer. An Astropy `Table` is stored in memory; it disappears when you turn off the computer (or shut down this Jupyter notebook). - -* SQL databases are designed to process queries. An Astropy `Table` can perform some query-like operations, like selecting columns and rows. But these operations use Python syntax, not SQL. - -Jupyter knows how to display the contents of a `Table`. - - -```python -results1 -``` - - - - -Table length=10 -
    - - - - - - - - - - - - - -
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307550606271623682015.5281.267623626829920.5585239223461581.1422630184554958
    45307468443413159682015.5281.137043174954120.3778523888981841.0092247424630945
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    - - - -Each column has a name, units, and a data type. - -For example, the units of `ra` and `dec` are degrees, and their data type is `float64`, which is a 64-bit floating-point number, used to store measurements with a fraction part. - -This information comes from the Gaia database, and has been stored in the Astropy `Table` by Astroquery. - -**Exercise:** Read [the documentation of this table](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html) and choose a column that looks interesting to you. Add the column name to the query and run it again. What are the units of the column you selected? What is its data type? - -## Asynchronous queries - -`launch_job` asks the server to run the job "synchronously", which normally means it runs immediately. But synchronous jobs are limited to 2000 rows. For queries that return more rows, you should run "asynchronously", which mean they might take longer to get started. - -If you are not sure how many rows a query will return, you can use the SQL command `COUNT` to find out how many rows are in the result without actually returning them. We'll see an example of this later. - -The results of an asynchronous query are stored in a file on the server, so you can start a query and come back later to get the results. - -For anonymous users, files are kept for three days. - -As an example, let's try a query that's similar to `query1`, with two changes: - -* It selects the first 3000 rows, so it is bigger than we should run synchronously. - -* It uses a new keyword, `WHERE`. - - -```python -query2 = """SELECT TOP 3000 -source_id, ref_epoch, ra, dec, parallax -FROM gaiadr2.gaia_source -WHERE parallax < 1 -""" -``` - -A `WHERE` clause indicates which rows we want; in this case, the query selects only rows "where" `parallax` is less than 1. This has the effect of selecting stars with relatively low parallax, which are farther away. We'll use this clause to exclude nearby stars that are unlikely to be part of GD-1. - -`WHERE` is one of the most common clauses in ADQL/SQL, and one of the most useful, because it allows us to select only the rows we need from the database. - -We use `launch_job_async` to submit an asynchronous query. - - -```python -job2 = Gaia.launch_job_async(query2) -print(job2) -``` - - INFO: Query finished. [astroquery.utils.tap.core] - - name dtype unit description - --------- ------- ---- ------------------------------------------------------------------ - source_id int64 Unique source identifier (unique within a particular Data Release) - ref_epoch float64 yr Reference epoch - ra float64 deg Right ascension - dec float64 deg Declination - parallax float64 mas Parallax - Jobid: 1601903242219O - Phase: COMPLETED - Owner: None - Output file: async_20201005090722.vot - Results: None - - -And here are the results. - - -```python -results2 = job2.get_results() -results2 -``` - - - - -Table length=3000 -
    - - - - - - - - - - - - - - - - - - - - - - - -
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    45307409387744093442015.5281.376256953641620.4361400589412060.9242670062090182
    ...............
    44677109150118026242015.5269.96809693073471.14290850381608820.42361471245557913
    44677065513286795522015.5270.0331645898811.05657473236899270.922888231734588
    44677122550373000962015.5270.77247179230470.6581664892880896-2.669179465293931
    44677350011817617922015.5270.36286062483080.89470793235991240.6117399163086398
    44677371014219166722015.5270.51108346614440.9806225910160181-0.39818224846127004
    44677075477573274882015.5269.887462805949271.02127599401369620.7741412301054209
    44677327720945730562015.5270.559971827601260.9037072088489417-1.7920417800164183
    44677323554910877442015.5270.67307907024910.9197224705139885-0.3464446494840354
    44677170997669445122015.5270.576671731208250.7262776590095680.05443955111134051
    44677190582657812482015.5270.72480529715140.82055519217827850.3733943917490343
    - - - -You might notice that some values of `parallax` are negative. As [this FAQ explains](https://www.cosmos.esa.int/web/gaia/archive-tips#negative%20parallax), "Negative parallaxes are caused by errors in the observations." Negative parallaxes have "no physical meaning," but they can be a "useful diagnostic on the quality of the astrometric solution." - -Later we will see an example where we use `parallax` and `parallax_error` to identify stars where the distance estimate is likely to be inaccurate. - -**Exercise:** The clauses in a query have to be in the right order. Go back and change the order of the clauses in `query2` and run it again. - -The query should fail, but notice that you don't get much useful debugging information. - -For this reason, developing and debugging ADQL queries can be really hard. A few suggestions that might help: - -* Whenever possible, start with a working query, either an example you find online or a query you have used in the past. - -* Make small changes and test each change before you continue. - -* While you are debugging, use `TOP` to limit the number of rows in the result. That will make each attempt run faster, which reduces your testing time. - -* Launching test queries synchronously might make them start faster, too. - -## Operators - -In a `WHERE` clause, you can use any of the [SQL comparison operators](https://www.w3schools.com/sql/sql_operators.asp); here are the most common ones: - -| Symbol | Operation -|--------| :--- -| `>` | greater than -| `<` | less than -| `>=` | greater than or equal -| `<=` | less than or equal -| `=` | equal -| `!=` or `<>` | not equal - -Most of these are the same as Python, but some are not. In particular, notice that the equality operator is `=`, not `==`. -Be careful to keep your Python out of your ADQL! - -You can combine comparisons using the logical operators: - -* AND: true if both comparisons are true -* OR: true if either or both comparisons are true - -Finally, you can use `NOT` to invert the result of a comparison. - -**Exercise:** [Read about SQL operators here](https://www.w3schools.com/sql/sql_operators.asp) and then modify the previous query to select rows where `bp_rp` is between `-0.75` and `2`. - -You can [read about this variable here](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html). - - -```python -# Solution - -# This is what most people will probably do - -query = """SELECT TOP 10 -source_id, ref_epoch, ra, dec, parallax -FROM gaiadr2.gaia_source -WHERE parallax < 1 - AND bp_rp > -0.75 AND bp_rp < 2 -""" -``` - - -```python -# Solution - -# But if someone notices the BETWEEN operator, -# they might do this - -query = """SELECT TOP 10 -source_id, ref_epoch, ra, dec, parallax -FROM gaiadr2.gaia_source -WHERE parallax < 1 - AND bp_rp BETWEEN -0.75 AND 2 -""" -``` - -This [Hertzsprung-Russell diagram](https://sci.esa.int/web/gaia/-/60198-gaia-hertzsprung-russell-diagram) shows the BP-RP color and luminosity of stars in the Gaia catalog. - -Selecting stars with `bp-rp` less than 2 excludes many [class M dwarf stars](https://xkcd.com/2360/), which are low temperature, low luminosity. A star like that at GD-1's distance would be hard to detect, so if it is detected, it it more likely to be in the foreground. - -## Cleaning up - -Asynchronous jobs have a `jobid`. - - -```python -job1.jobid, job2.jobid -``` - - - - - (None, '1601903242219O') - - - -Which you can use to remove the job from the server. - - -```python -Gaia.remove_jobs([job2.jobid]) -``` - - Removed jobs: '['1601903242219O']'. - - -If you don't remove it job from the server, it will be removed eventually, so don't feel too bad if you don't clean up after yourself. - -## Formatting queries - -So far the queries have been string "literals", meaning that the entire string is part of the program. -But writing queries yourself can be slow, repetitive, and error-prone. - -It is often a good idea to write Python code that assembles a query for you. One useful tool for that is the [string `format` method](https://www.w3schools.com/python/ref_string_format.asp). - -As an example, we'll divide the previous query into two parts; a list of column names and a "base" for the query that contains everything except the column names. - -Here's the list of columns we'll select. - - -```python -columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity' -``` - -And here's the base; it's a string that contains at least one format specifier in curly brackets (braces). - - -```python -query3_base = """SELECT TOP 10 -{columns} -FROM gaiadr2.gaia_source -WHERE parallax < 1 - AND bp_rp BETWEEN -0.75 AND 2 -""" -``` - -This base query contains one format specifier, `{columns}`, which is a placeholder for the list of column names we will provide. - -To assemble the query, we invoke `format` on the base string and provide a keyword argument that assigns a value to `columns`. - - -```python -query3 = query3_base.format(columns=columns) -``` - -The result is a string with line breaks. If you display it, the line breaks appear as `\n`. - - -```python -query3 -``` - - - - - 'SELECT TOP 10 \nsource_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\nFROM gaiadr2.gaia_source\nWHERE parallax < 1\n AND bp_rp BETWEEN -0.75 AND 2\n' - - - -But if you print it, the line breaks appear as... line breaks. - - -```python -print(query3) -``` - - SELECT TOP 10 - 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 - - - -Notice that the format specifier has been replaced with the value of `columns`. - -Let's run it and see if it works: - - -```python -job3 = Gaia.launch_job(query3) -print(job3) -``` - - - 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 10 - Jobid: None - Phase: COMPLETED - Owner: None - Output file: sync_20201005090726.xml.gz - Results: None - - - -```python -results3 = job3.get_results() -results3 -``` - - - - -Table length=10 -
    - - - - - - - - - - - - - -
    source_idradecpmrapmdecparallaxparallax_errorradial_velocity
    degdegmas / yrmas / yrmasmaskm / s
    int64float64float64float64float64float64float64float64
    4467710915011802624269.96809693073471.14290850381608822.0233280236600626-2.56924278755102660.423614712455579130.470352406647465--
    4467706551328679552270.0331645898811.0565747323689927-3.414829591355289-3.84372158574957370.9228882317345880.927008559859825--
    4467712255037300096270.77247179230470.6581664892880896-3.5620173752896025-6.595792323153987-2.6691794652939310.9719742773203504--
    4467735001181761792270.36286062483080.89470793235991242.13070799264892050.88267277109107120.61173991630863980.509812721702093--
    4467737101421916672270.51108346614440.98062259101601810.17532366511560785-5.113270239706202-0.398182248461270040.7549581886719651--
    4467707547757327488269.887462805949271.0212759940136962-2.6382230817672987-3.7077765320492870.77414123010542090.3022057897812064--
    4467732355491087744270.67307907024910.9197224705139885-2.2735991502653037-11.864952855984358-0.34644464948403540.4937921513912002--
    4467717099766944512270.576671731208250.726277659009568-3.4598362614808367-4.6014268933659210.054439551111340510.8867339293525688--
    4467719058265781248270.72480529715140.8205551921782785-3.255079498426542-9.2492850691110850.37339439174903430.390952370410666--
    4467722326741572352270.874312918885040.85955659758691580.106963983518598261.2035993780158853-0.118509434328643730.1660452431882023--
    - - - -Good so far. - -**Exercise:** This query always selects sources with `parallax` less than 1. But suppose you want to take that upper bound as an input. - -Modify `query3_base` to replace `1` with a format specifier like `{max_parallax}`. Now, when you call `format`, add a keyword argument that assigns a value to `max_parallax`, and confirm that the format specifier gets replaced with the value you provide. - - -```python -# Solution - -query4_base = """SELECT TOP 10 -{columns} -FROM gaiadr2.gaia_source -WHERE parallax < {max_parallax} AND -bp_rp BETWEEN -0.75 AND 2 -""" -``` - - -```python -# Solution - -query4 = query4_base.format(columns=columns, - max_parallax=0.5) -print(query) -``` - - SELECT TOP 10 - source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity - FROM gaiadr2.gaia_source - WHERE parallax < 0.5 AND - bp_rp BETWEEN -0.75 AND 2 - - - -**Style note:** You might notice that the variable names in this notebook are numbered, like `query1`, `query2`, etc. - -The advantage of this style is that it isolates each section of the notebook from the others, so if you go back and run the cells out of order, it's less likely that you will get unexpected interactions. - -A drawback of this style is that it can be a nuisance to update the notebook if you add, remove, or reorder a section. - -What do you think of this choice? Are there alternatives you prefer? - -## Summary - -This notebook demonstrates the following steps: - -1. Making a connection to the Gaia server, - -2. Exploring information about the database and the tables it contains, - -3. Writing a query and sending it to the server, and finally - -4. Downloading the response from the server as an Astropy `Table`. - -## Best practices - -* If you can't download an entire dataset (or it's not practical) use queries to select the data you need. - -* Read the metadata and the documentation to make sure you understand the tables, their columns, and what they mean. - -* Develop queries incrementally: start with something simple, test it, and add a little bit at a time. - -* Use ADQL features like `TOP` and `COUNT` to test before you run a query that might return a lot of data. - -* If you know your query will return fewer than 3000 rows, you can run it synchronously, which might complete faster (but it doesn't seem to make much difference). If it might return more than 3000 rows, you should run it asynchronously. - -* ADQL and SQL are not case-sensitive, so you don't have to capitalize the keywords, but you should. - -* ADQL and SQL don't require you to break a query into multiple lines, but you should. - - -Jupyter notebooks can be good for developing and testing code, but they have some drawbacks. In particular, if you run the cells out of order, you might find that variables don't have the values you expect. - -There are a few things you can do to mitigate these problems: - -* Make each section of the notebook self-contained. Try not to use the same variable name in more than one section. - -* Keep notebooks short. Look for places where you can break your analysis into phases with one notebook per phase. diff --git a/_sources/02_coords.ipynb b/_sources/02_coords.ipynb index 1d02ecf..b910f38 100644 --- a/_sources/02_coords.ipynb +++ b/_sources/02_coords.ipynb @@ -1,5 +1,45 @@ { "cells": [ + { + "cell_type": "raw", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "---\n", + "title: \"Coordinate Transformations\"\n", + "teaching: 3000\n", + "exercises: 0\n", + "questions:\n", + "\n", + "- \"How do we transform celestial coordinates from one frame to another and save results in files?\"\n", + "\n", + "objectives:\n", + "\n", + "- \"Use Python string formatting to compose more complex ADQL queries.\"\n", + "\n", + "- \"Work with coordinates and other quantities that have units.\"\n", + "\n", + "- \"Download the results of a query and store them in a file.\"\n", + "\n", + "keypoints:\n", + "\n", + "- \"For measurements with units, use `Quantity` objects that represent units explicitly and check for errors.\"\n", + "\n", + "- \"Use the `format` function to compose queries; it is often faster and less error-prone.\"\n", + "\n", + "- \"Develop queries incrementally: start with something simple, test it, and add a little bit at a time.\"\n", + "\n", + "- \"Once you have a query working, save the data in a local file. If you shut down the notebook and come back to it later, you can reload the file; you don't have to run the query again.\"\n", + "\n", + "---\n", + "FIXME\n", + "\n", + "{% include links.md %}\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1955,6 +1995,7 @@ } ], "metadata": { + "celltoolbar": "Tags", "kernelspec": { "display_name": "Python 3", "language": "python", diff --git a/_sources/03_motion.ipynb b/_sources/03_motion.ipynb index ac31939..6e85b0b 100644 --- a/_sources/03_motion.ipynb +++ b/_sources/03_motion.ipynb @@ -1,5 +1,49 @@ { "cells": [ + { + "cell_type": "raw", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "---\n", + "title: \"Plotting and Pandas\"\n", + "teaching: 3000\n", + "exercises: 0\n", + "questions:\n", + "\n", + "- \"How do we make scatter plots in Matplotlib?\"\n", + "\n", + "- \"How do we store data in a Pandas `DataFrame`?\"\n", + "\n", + "objectives:\n", + "\n", + "- \"Select rows and columns from an Astropy `Table`.\"\n", + "\n", + "- \"Use Matplotlib to make a scatter plot.\"\n", + "\n", + "- \"Use Gala to transform coordinates.\"\n", + "\n", + "- \"Make a Pandas `DataFrame` and use a Boolean `Series` to select rows.\"\n", + "\n", + "- \"Save a `DataFrame` in an HDF5 file.\"\n", + "\n", + "keypoints:\n", + "\n", + "- \"When you make a scatter plot, adjust the size of the markers and their transparency so the figure is not overplotted; otherwise it can misrepresent the data badly.\n", + "\n", + "- \"For simple scatter plots in Matplotlib, `plot` is faster than `scatter`.\n", + "\n", + "- \"An Astropy `Table` and a Pandas `DataFrame` are similar in many ways and they provide many of the same functions. They have pros and cons, but for many projects, either one would be a reasonable choice.\"\n", + "\n", + "---\n", + "FIXME\n", + "\n", + "{% include links.md %}\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1075,7 +1119,7 @@ "source": [ "## Exploring data\n", "\n", - "One benefit of using Pandas is that it provides function for exploring the data and checking for problems.\n", + "One benefit of using Pandas is that it provides functions for exploring the data and checking for problems.\n", "\n", "One of the most useful of these functions is `describe`, which computes summary statistics for each column." ] diff --git a/_sources/04_select.ipynb b/_sources/04_select.ipynb index 331f0a5..a633d49 100644 --- a/_sources/04_select.ipynb +++ b/_sources/04_select.ipynb @@ -1,5 +1,45 @@ { "cells": [ + { + "cell_type": "raw", + "metadata": { + "tags": [ + "remove-cell" + ] + }, + "source": [ + "---\n", + "title: \"Transform and Select\"\n", + "teaching: 3000\n", + "exercises: 0\n", + "questions:\n", + "\n", + "- \"Question?\"\n", + "\n", + "objectives:\n", + "\n", + "- \"Transform proper motions from one frame to another.\"\n", + "\n", + "- \"Compute the convex hull of a set of points.\"\n", + "\n", + "- \"Write an ADQL query that selects based on proper motion.\"\n", + "\n", + "- \"Save data in CSV format.\"\n", + "\n", + "keypoints:\n", + "\n", + "- \"When possible, 'move the computation to the data'; that is, do as much of the work as possible on the database server before downloading the data.\"\n", + "\n", + "- \"For most applications, saving data in FITS or HDF5 is better than CSV. FITS and HDF5 are binary formats, so the files are usually smaller, and they store metadata, so you don't lose anything when you read the file back.\"\n", + "\n", + "- \"On the other hand, CSV is a 'least common denominator' format; that is, it can be read by practically any application that works with data.\"\n", + "\n", + "---\n", + "FIXME\n", + "\n", + "{% include links.md %}\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -35,9 +75,13 @@ "\n", "After completing this lesson, you should be able to\n", "\n", - "* Convert proper motion between frames.\n", + "* Transform proper motions from one frame to another.\n", "\n", - "* Write an ADQL query that selects based on proper motion." + "* Compute the convex hull of a set of points.\n", + "\n", + "* Write an ADQL query that selects based on proper motion.\n", + "\n", + "* Save data in CSV format." ] }, { @@ -118,6 +162,16 @@ "source": [ "## Selection by proper motion\n", "\n", + "Let's review how we got to this point.\n", + "\n", + "1. We made an ADQL query to the Gaia server to get data for stars in the vicinity of GD-1.\n", + "\n", + "2. We transformed the coordinates to the `GD1Koposov10` frame so we could select stars along the centerline of GD-1.\n", + "\n", + "3. We plotted the proper motion of the centerline stars to identify the bounds of the overdense region.\n", + "\n", + "4. We made a mask that selects stars whose proper motion is in the overdense region.\n", + "\n", "At this point we have downloaded data for a relatively large number of stars (more than 100,000) and selected a relatively small number (around 1000).\n", "\n", "It would be more efficient to use ADQL to select only the stars we need. That would also make it possible to download data covering a larger region of the sky.\n", @@ -249,12 +303,18 @@ "source": [ "The proper motions of the selected stars are more spread out in this frame, which is why it was preferable to do the selection in the GD-1 frame.\n", "\n", - "But now we can define a polygon that encloses the proper motions of these stars in ICRS, \n", - "and use the polygon as a selection criterion in an ADQL query.\n", + "But now we can define a polygon that encloses the proper motions of these stars in ICRS, and use that polygon as a selection criterion in an ADQL query." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convex Hull\n", "\n", "SciPy provides a function that computes the [convex hull](https://en.wikipedia.org/wiki/Convex_hull) of a set of points, which is the smallest convex polygon that contains all of the points.\n", "\n", - "To use it, I'll select columns `pmra` and `pmdec` and convert them to a NumPy array." + "To use it, we'll select columns `pmra` and `pmdec` and convert them to a NumPy array." ] }, { @@ -289,8 +349,13 @@ "```\n", "points = selected[['pmra','pmdec']].values\n", "\n", - "```\n", - "\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "We'll pass the points to `ConvexHull`, which returns an object that contains the results. " ] }, @@ -302,7 +367,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 9, @@ -408,6 +473,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "This use of `transpose` is a bit of a NumPy trick. Because `pm_vertices` has two columns, its transpose has two rows, which are assigned to the two variables `pmra_poly` and `pmdec_poly`.\n", + "\n", "The following figure shows proper motion in ICRS again, along with the convex hull we just computed." ] }, @@ -451,6 +518,45 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "So `pm_vertices` represents the polygon we want to select.\n", + "The next step is to use it as part of an ADQL query." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Assembling the query\n", + "\n", + "Here's the base string we used for the query in the previous lesson." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "query_base = \"\"\"SELECT \n", + "{columns}\n", + "FROM gaiadr2.gaia_source\n", + "WHERE parallax < 1\n", + " AND bp_rp BETWEEN -0.75 AND 2 \n", + " AND 1 = CONTAINS(POINT(ra, dec), \n", + " POLYGON({point_list}))\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here are the changes we'll make in this lesson:\n", + "\n", + "1. We will add another clause to select stars whose proper motion is in the polygon we just computed, `pm_vertices`.\n", + "\n", + "2. We will select stars with coordinates in a larger region.\n", + "\n", "To use `pm_vertices` as part of an ADQL query, we have to convert it to a string.\n", "\n", "We'll use `flatten` to convert from a 2-D array to a 1-D array, and `str` to convert each element to a string." @@ -458,7 +564,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -498,7 +604,7 @@ " '-14.7464117578883']" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -517,7 +623,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -526,7 +632,7 @@ "'-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'" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -540,40 +646,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Selecting the region\n", + "We'll add this string to the query soon, but first let's compute the other polygon, the one that specifies the region of the sky we want.\n", "\n", - "Let's review how we got to this point.\n", - "\n", - "1. We made an ADQL query to the Gaia server to get data for stars in the vicinity of GD-1.\n", - "\n", - "2. We transformed to `GD1` coordinates so we could select stars along the centerline of GD-1.\n", - "\n", - "3. We plotted the proper motion of the centerline stars to identify the bounds of the overdense region.\n", - "\n", - "4. We made a mask that selects stars whose proper motion is in the overdense region.\n", - "\n", - "The problem is that we downloaded data for more than 100,000 stars and selected only about 1000 of them.\n", - "\n", - "It will be more efficient if we select on proper motion as part of the query. That will allow us to work with a larger region of the sky in a single query, and download less unneeded data.\n", - "\n", - "This query will select on the following conditions:\n", - "\n", - "* `parallax < 1`\n", - "\n", - "* `bp_rp BETWEEN -0.75 AND 2`\n", - "\n", - "* Coordinates within a rectangle in the GD-1 frame, transformed to ICRS.\n", - "\n", - "* Proper motion with the polygon we just computed.\n", - "\n", - "The first three conditions are the same as in the previous query. Only the last one is new.\n", - "\n", - "Here's the rectangle in the GD-1 frame we'll select." + "Here are the coordinates of the rectangle we'll select, in the GD-1 frame." ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -585,7 +665,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -602,9 +682,17 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: AstropyDeprecationWarning: Transforming a frame instance to a frame class (as opposed to another frame instance) will not be supported in the future. Either explicitly instantiate the target frame, or first convert the source frame instance to a `astropy.coordinates.SkyCoord` and use its `transform_to()` method. [astropy.coordinates.baseframe]\n" + ] + } + ], "source": [ "import gala.coordinates as gc\n", "import astropy.coordinates as coord\n", @@ -622,7 +710,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -631,7 +719,7 @@ "'135.30559858565638, 8.398623940157561, 126.50951508623503, 13.44494195652069, 163.0173655836748, 54.24242734020255, 172.9328536286811, 46.47260492416258'" ] }, - "execution_count": 19, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -650,21 +738,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we have everything we need to assemble the query." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Assemble the query\n", - "\n", - "Here's the base string we used for the query in the previous lesson." + "Now we have everything we need to assemble the query.\n", + "Here's the base query from the previous lesson again:" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ @@ -682,12 +762,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Exercise:** Modify `query_base` by adding a new clause to select stars whose coordinates of proper motion, `pmra` and `pmdec`, fall within the polygon defined by `pm_point_list`." + "### Exercise\n", + "\n", + "Modify `query_base` by adding a new clause to select stars whose coordinates of proper motion, `pmra` and `pmdec`, fall within the polygon defined by `pm_point_list`." ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": { "tags": [ "hide-cell" @@ -718,23 +800,25 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ - "columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'" + "columns = 'source_id, ra, dec, pmra, pmdec, parallax, radial_velocity'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "**Exercise:** Use `format` to format `query_base` and define `query`, filling in the values of `columns`, `point_list`, and `pm_point_list`." + "### Exercise\n", + "\n", + "Use `format` to format `query_base` and define `query`, filling in the values of `columns`, `point_list`, and `pm_point_list`." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": { "tags": [ "hide-cell" @@ -746,7 +830,7 @@ "output_type": "stream", "text": [ "SELECT \n", - "source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\n", + "source_id, ra, dec, pmra, pmdec, parallax, radial_velocity\n", "FROM gaiadr2.gaia_source\n", "WHERE parallax < 1\n", " AND bp_rp BETWEEN -0.75 AND 2 \n", @@ -771,12 +855,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Here's how we run it." + "Now we can run the query like this:" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": { "scrolled": true }, @@ -794,19 +878,23 @@ "\tHost: geadata.esac.esa.int\n", "\tUse HTTPS: True\n", "\tPort: 443\n", - "\tSSL Port: 443\n" - ] - }, - { - "ename": "HTTPError", - "evalue": "OK", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mHTTPError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mastroquery\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgaia\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mGaia\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mGaia\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlaunch_job_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mquery\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mjob\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/anaconda3/envs/AstronomicalData/lib/python3.8/site-packages/astroquery/utils/tap/core.py\u001b[0m in \u001b[0;36mlaunch_job_async\u001b[0;34m(self, query, name, output_file, output_format, verbose, dump_to_file, background, upload_resource, upload_table_name, autorun)\u001b[0m\n\u001b[1;32m 422\u001b[0m self.__connHandler.dump_to_file(suitableOutputFile,\n\u001b[1;32m 423\u001b[0m response)\n\u001b[0;32m--> 424\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mrequests\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexceptions\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mHTTPError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreason\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 425\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 426\u001b[0m location = self.__connHandler.find_header(\n", - "\u001b[0;31mHTTPError\u001b[0m: OK" + "\tSSL Port: 443\n", + "INFO: Query finished. [astroquery.utils.tap.core]\n", + "\n", + " name dtype unit description n_bad\n", + "--------------- ------- -------- ------------------------------------------------------------------ -----\n", + " source_id int64 Unique source identifier (unique within a particular Data Release) 0\n", + " ra float64 deg Right ascension 0\n", + " dec float64 deg Declination 0\n", + " pmra float64 mas / yr Proper motion in right ascension direction 0\n", + " pmdec float64 mas / yr Proper motion in declination direction 0\n", + " parallax float64 mas Parallax 0\n", + "radial_velocity float64 km / s Radial velocity 7295\n", + "Jobid: 1607614394159O\n", + "Phase: COMPLETED\n", + "Owner: None\n", + "Output file: async_20201210103314.vot\n", + "Results: None\n" ] } ], @@ -826,9 +914,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "7346" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "candidate_table = job.get_results()\n", "len(candidate_table)" @@ -845,9 +944,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "x = candidate_table['ra']\n", "y = candidate_table['dec']\n", @@ -868,7 +980,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "metadata": {}, "outputs": [], "source": [ @@ -880,10 +992,10 @@ " returns: Pandas DataFrame\n", " \"\"\"\n", " skycoord = coord.SkyCoord(\n", - " ra=results['ra'], \n", - " dec=results['dec'],\n", - " pm_ra_cosdec=results['pmra'],\n", - " pm_dec=results['pmdec'], \n", + " ra=table['ra'], \n", + " dec=table['dec'],\n", + " pm_ra_cosdec=table['pmra'],\n", + " pm_dec=table['pmdec'], \n", " distance=8*u.kpc, \n", " radial_velocity=0*u.km/u.s)\n", "\n", @@ -907,7 +1019,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -923,9 +1035,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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F34Bt912Gx5++GG0tbXhVa96Fd75znfi1ltvxQMPPID169fjL//yL3Hw4EH87u/+Li688ELcd999+PznP4+3ve1t2LJlC+6++2788R//MQYGBtDf34+LLroIV155JcrlMs4777zUYqxWq3jwwQfxy7/8y/ja176Gp556CsePH08ZOB34+8mf/En88Ic/xNatW3H77ben1gfRZK1Wq0sbpTRMslYGBgbw9NNPo6urC5/4xCcAAJ/+9Kdx9OjROnoHgN27d+Oaa67BD3/4Q7z97W/HggULUk0YAO66667UWv23f/s3PPXUU9i0aROOHz+OhQsXor29HW95y1vwd3/3d/iDP/gD3HPPPViwYAE2bNiAD37wg3jpS1+ariFl6pDC8OCDD6K9vR3XX399KnwXL16MT37yk7j77rtTC2b//v144okn8Nhjj2H9+vXYvHkzenp6sH//fhw5ciRNo33iiScAzDD6vr4+PPnkk9ixYweefvrpNOWWsqOIFjs7O3HjjTfiwQcfTNNCtX3LD/VxeuaC4KGHHsLWrVvTFGdqZ8eOHZiamkoFjLU35P99qeFaOYu5Aq8FMAufnvNeZ0ATZQ2uJefcdgDbAeCqq65q2vWkSVhzYEwyk/tEWgNSy6XnKE9/9erVaS40ac5r1qzBfffdh927dyNJEjzyyCPYuHFjWkuFiMFK99I0BtLsOjo68Ku/+qu48MILcdlll+G//tf/mjIbAOmYeP6/xIf2HRHwddddh4ULF6p50fwU8kMPPYRHH30UPT09qfZFqbMA6oTttm3b0N/fn55PSJIEk5OT2L17N9asWYPFixfj9ttvx2WXXYbjx4/jySefRKFQwIkTJ/Bv//ZvWLhwIa699lqcf/756OjowKFDh1LG9slPfhKFQgE33HADfvCDH2B4eBhvfOMb0zHXajWMjY0BAN7whjfgpS99KXp7e7FixQocP34cX/7yl/Hoo4/i/e9/P5YuXYoFCxbg8ssvx6te9Sq85CUvSdf6gQcewLPPPotPfepT6OrqSjU1rr1dfvnlqFarqdX4gQ98IHV13HvvvekJYToZ3NHRkTKahx9+GHfccQduu+02vPOd76yjga6uLmzcuBGPPPIIFixYgHe+8524/PLL8fTTT2Px4sV160n0c9FFF6GtrQ0bN27E0qVLU/eScw7nn38+1qxZg+PHj2PTpk1Y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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "x = candidate_df['phi1']\n", "y = candidate_df['phi2']\n", @@ -966,7 +1091,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ @@ -984,9 +1109,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-rw-rw-r-- 1 downey downey 698K Dec 10 19:18 gd1_candidates.hdf5\r\n" + ] + } + ], "source": [ "!ls -lh gd1_candidates.hdf5" ] @@ -1023,7 +1156,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -1039,9 +1172,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-rw-rw-r-- 1 downey downey 1.4M Dec 10 19:19 gd1_candidates.csv\r\n" + ] + } + ], "source": [ "!ls -lh gd1_candidates.csv" ] @@ -1057,9 +1198,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + ",source_id,ra,dec,pmra,pmdec,parallax,radial_velocity,phi1,phi2,pm_phi1,pm_phi2\r\n", + "0,635559124339440000,137.58671691646745,19.1965441084838,-3.770521900009566,-12.490481778113859,0.7913934419894347,,-59.63048941944402,-1.2164852515042963,-7.361362712597496,-0.592632882064492\r\n", + "1,635860218726658176,138.5187065217173,19.09233926905897,-5.941679495793577,-11.346409129876392,0.30745551377348623,,-59.247329893833296,-2.016078400820631,-7.527126084640531,1.7487794924176672\r\n" + ] + } + ], "source": [ "!head -3 gd1_candidates.csv" ] @@ -1075,7 +1226,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -1091,18 +1242,218 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "
    \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    source_idradecpmrapmdecparallaxradial_velocityphi1phi2pm_phi1pm_phi2
    0635559124339440000137.58671719.196544-3.770522-12.4904820.791393NaN-59.630489-1.216485-7.361363-0.592633
    1635860218726658176138.51870719.092339-5.941679-11.3464090.307456NaN-59.247330-2.016078-7.5271261.748779
    2635674126383965568138.84287419.031798-3.897001-12.7027800.779463NaN-59.133391-2.306901-7.560608-0.741800
    \n", + "
    " + ], + "text/plain": [ + " source_id ra dec pmra pmdec parallax \\\n", + "0 635559124339440000 137.586717 19.196544 -3.770522 -12.490482 0.791393 \n", + "1 635860218726658176 138.518707 19.092339 -5.941679 -11.346409 0.307456 \n", + "2 635674126383965568 138.842874 19.031798 -3.897001 -12.702780 0.779463 \n", + "\n", + " radial_velocity phi1 phi2 pm_phi1 pm_phi2 \n", + "0 NaN -59.630489 -1.216485 -7.361363 -0.592633 \n", + "1 NaN -59.247330 -2.016078 -7.527126 1.748779 \n", + "2 NaN -59.133391 -2.306901 -7.560608 -0.741800 " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "candidate_df.head(3)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    Unnamed: 0source_idradecpmrapmdecparallaxradial_velocityphi1phi2pm_phi1pm_phi2
    00635559124339440000137.58671719.196544-3.770522-12.4904820.791393NaN-59.630489-1.216485-7.361363-0.592633
    11635860218726658176138.51870719.092339-5.941679-11.3464090.307456NaN-59.247330-2.016078-7.5271261.748779
    22635674126383965568138.84287419.031798-3.897001-12.7027800.779463NaN-59.133391-2.306901-7.560608-0.741800
    \n", + "
    " + ], + "text/plain": [ + " Unnamed: 0 source_id ra dec pmra pmdec \\\n", + "0 0 635559124339440000 137.586717 19.196544 -3.770522 -12.490482 \n", + "1 1 635860218726658176 138.518707 19.092339 -5.941679 -11.346409 \n", + "2 2 635674126383965568 138.842874 19.031798 -3.897001 -12.702780 \n", + "\n", + " parallax radial_velocity phi1 phi2 pm_phi1 pm_phi2 \n", + "0 0.791393 NaN -59.630489 -1.216485 -7.361363 -0.592633 \n", + "1 0.307456 NaN -59.247330 -2.016078 -7.527126 1.748779 \n", + "2 0.779463 NaN -59.133391 -2.306901 -7.560608 -0.741800 " + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "read_back_csv.head(3)" ] diff --git a/_sources/05_join.ipynb b/_sources/05_join.ipynb index fab853e..ef07f88 100644 --- a/_sources/05_join.ipynb +++ b/_sources/05_join.ipynb @@ -1,5 +1,35 @@ { "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "title: \"Join\"\n", + "teaching: 3000\n", + "exercises: 0\n", + "questions:\n", + "\n", + "- \"How do we use `JOIN` to combine information from multiple tables?\"\n", + "\n", + "objectives:\n", + "\n", + "- \"Upload a table to the Gaia server.\"\n", + "\n", + "- \"Write ADQL queries involving `JOIN` operations.\"\n", + "\n", + "keypoints:\n", + "\n", + "- \"Use `JOIN` operations to combine data from multiple tables in a databased, using some kind of identifier to match up records from one table with records from another.\"\n", + "\n", + "* \"This is another example of a practice we saw in the previous notebook, moving the computation to the data.\"\n", + "\n", + "---\n", + "FIXME\n", + "\n", + "{% include links.md %}\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -10,11 +40,11 @@ "\n", "As a continuing example, we will replicate part of the analysis in a recent paper, \"[Off the beaten path: Gaia reveals GD-1 stars outside of the main stream](https://arxiv.org/abs/1805.00425)\" by Adrian M. Price-Whelan and Ana Bonaca.\n", "\n", - "Picking up where we left off, the next step in the analysis is to select candidate stars based on photometry. The following figure from the paper is a color-magnitude diagram for the stars selected based on proper motion:\n", + "Picking up where we left off, the next step in the analysis is to select candidate stars based on photometry data. The following figure from the paper is a color-magnitude diagram for the stars selected based on proper motion:\n", "\n", "\n", "\n", - "In red is a theoretical isochrone, showing where we expect the stars in GD-1 to fall based on the metallicity and age of their original globular cluster. \n", + "In red is a [stellar isochrone](https://en.wikipedia.org/wiki/Stellar_isochrone), showing where we expect the stars in GD-1 to fall based on the metallicity and age of their original globular cluster. \n", "\n", "By selecting stars in the shaded area, we can further distinguish the main sequence of GD-1 from younger background stars." ] @@ -311,7 +341,7 @@ "output_type": "stream", "text": [ "\r\n", - "\r\n", "\r\n", " \r\n", @@ -350,7 +380,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "-rw-rw-r-- 1 downey downey 396K Nov 18 19:21 candidate_df.xml\r\n" + "-rw-rw-r-- 1 downey downey 396K Dec 10 11:33 candidate_df.xml\r\n" ] } ], @@ -373,7 +403,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Exercise:** There's a gotcha here we want to warn you about. Why do you think we used double brackets to specify the column we wanted? What happens if you use single brackets?\n", + "### Exercise\n", + "\n", + "There's a gotcha here we want to warn you about. Why do you think we used double brackets to specify the column we wanted? What happens if you use single brackets?\n", "\n", "Run these cells to find out." ] @@ -426,6 +458,8 @@ "metadata": {}, "outputs": [], "source": [ + "# This line is commented out because it would cause an error\n", + "\n", "# writeto(column, 'candidate_df.xml')" ] }, @@ -517,7 +551,7 @@ "data": { "text/html": [ "Table length=7346\n", - "\n", + "
    \n", "\n", "\n", "\n", @@ -655,7 +689,7 @@ "query1 = \"\"\"SELECT *\n", "FROM gaiadr2.panstarrs1_best_neighbour as best\n", "JOIN tap_upload.candidate_df as candidate_df\n", - "ON best.source_id = candidate_df.source_id\n", + " ON best.source_id = candidate_df.source_id\n", "\"\"\"" ] }, @@ -713,7 +747,7 @@ "data": { "text/html": [ "Table length=3724\n", - "
    source_id
    int64
    635559124339440000
    \n", + "
    \n", "\n", "\n", "\n", @@ -819,7 +853,7 @@ "source": [ "Because one of the column names appears in both tables, the second instance of `source_id` has been appended with the suffix `_2`.\n", "\n", - "The length of the results table is about 2000, which means we were not able to find matches for all stars in the list of candidate_df." + "The length of `results1` is about 3000, which means we were not able to find matches for all stars in the list of candidates." ] }, { @@ -846,9 +880,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "To get more information about the matching process, we can inspect `best_neighbour_multiplicity`, which indicates for each star in Gaia how many stars in Pan-STARRS are equally likely matches.\n", - "\n", - "For this kind of data exploration, we'll convert a column from the table to a Pandas `Series` so we can use `value_counts`, which counts the number of times each value appears in a `Series`, like a histogram." + "To get more information about the matching process, we can inspect `best_neighbour_multiplicity`, which indicates for each star in Gaia how many stars in Pan-STARRS are equally likely matches." ] }, { @@ -858,9 +890,63 @@ "outputs": [ { "data": { + "text/html": [ + "<MaskedColumn name='best_neighbour_multiplicity' dtype='int16' description='Number of neighbours with same probability as best neighbour' length=3724>\n", + "
    source_idoriginal_ext_source_idangular_distancenumber_of_neighboursnumber_of_matesbest_neighbour_multiplicitygaia_astrometric_paramssource_id_2
    arcsec
    int64int64float64int32int16int16int16int64
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    ...
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    1
    " + ], "text/plain": [ - "1 3724\n", - "dtype: int64" + "\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + "...\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1\n", + " 1" ] }, "execution_count": 22, @@ -869,21 +955,16 @@ } ], "source": [ - "import pandas as pd\n", - "\n", - "nn = pd.Series(results1['best_neighbour_multiplicity'])\n", - "nn.value_counts()" + "results1['best_neighbour_multiplicity']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The result shows that `1` is the only value in the `Series`, appearing xxx times.\n", + "It looks like most of the values are `1`, which is good; that means that for each candidate star we have identified exactly one source in Pan-STARRS that is likely to be the same star.\n", "\n", - "That means that in every case where a match was found, the matching algorithm identified a single neighbor as the most likely match.\n", - "\n", - "Similarly, `number_of_mates` indicates the number of other stars in Gaia that match with the same star in Pan-STARRS." + "To check whether there are any values other than `1`, we can convert this column to a Pandas `Series` and use `describe`, which we saw in in Lesson 3." ] }, { @@ -894,8 +975,15 @@ { "data": { "text/plain": [ - "0 3724\n", - "dtype: int64" + "count 3724.0\n", + "mean 1.0\n", + "std 0.0\n", + "min 1.0\n", + "25% 1.0\n", + "50% 1.0\n", + "75% 1.0\n", + "max 1.0\n", + "dtype: float64" ] }, "execution_count": 23, @@ -904,17 +992,57 @@ } ], "source": [ - "nm = pd.Series(results1['number_of_mates'])\n", - "nm.value_counts()" + "import pandas as pd\n", + "\n", + "multiplicity = pd.Series(results1['best_neighbour_multiplicity'])\n", + "multiplicity.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "For this set of candidate_df, almost all of the stars we've selected from Pan-STARRS are only matched with a single star in the Gaia catalog.\n", + "In fact, `1` is the only value in the `Series`, so every candidate star has a single best match.\n", "\n", - "**Detail** The table also contains `number_of_neighbors` which is the number of stars in Pan-STARRS that match in terms of position, before using other critieria to choose the most likely match." + "Similarly, `number_of_mates` indicates the number of *other* stars in Gaia that match with the same star in Pan-STARRS." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 3724.0\n", + "mean 0.0\n", + "std 0.0\n", + "min 0.0\n", + "25% 0.0\n", + "50% 0.0\n", + "75% 0.0\n", + "max 0.0\n", + "dtype: float64" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mates = pd.Series(results1['number_of_mates'])\n", + "mates.describe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All values in this column are `0`, which means that for each match we found in Pan-STARRS, there are no other stars in Gaia that also match. \n", + "\n", + "**Detail:** The table also contains `number_of_neighbors` which is the number of stars in Pan-STARRS that match in terms of position, before using other criteria to choose the most likely match." ] }, { @@ -935,14 +1063,21 @@ "\n", "4. Run the query using the uploaded table.\n", "\n", - "Since we've done everything here before, we'll do these steps as an exercise.\n", + "Since we've done everything here before, we'll do these steps as an exercise." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Exercise\n", "\n", - "**Exercise:** Select `source_id` and `original_ext_source_id` from `results1` and write the resulting table as a file named `external.xml`." + "Select `source_id` and `original_ext_source_id` from `results1` and write the resulting table as a file named `external.xml`." ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": { "tags": [ "hide-cell" @@ -965,7 +1100,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -973,7 +1108,7 @@ "output_type": "stream", "text": [ "\r\n", - "\r\n", "\r\n", " \r\n", @@ -993,7 +1128,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Exercise:** Read [the documentation of the Pan-STARRS table](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_external_catalogues/ssec_dm_panstarrs1_original_valid.html) and make note of `obj_id`, which contains the object IDs we'll use to find the rows we want.\n", + "### Exercise\n", + "\n", + "Read [the documentation of the Pan-STARRS table](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_external_catalogues/ssec_dm_panstarrs1_original_valid.html) and make note of `obj_id`, which contains the object IDs we'll use to find the rows we want.\n", "\n", "Write a query that uses each value of `original_ext_source_id` from the uploaded table to find a row in `gaiadr2.panstarrs1_original_valid` with the same value in `obj_id`, and select all columns from both tables.\n", "\n", @@ -1017,23 +1154,6 @@ "Hint: When you select a column from a join, you have to specify which table the column is in." ] }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "query2 = \"\"\"SELECT *\n", - "FROM tap_upload.external as external\n", - "\"\"\"" - ] - }, { "cell_type": "code", "execution_count": 27, @@ -1046,75 +1166,46 @@ "source": [ "# Solution\n", "\n", + "# First test\n", + "\n", + "query2 = \"\"\"SELECT *\n", + "FROM tap_upload.external as external\n", + "\"\"\"\n", + "\n", + "# Second test\n", + "\n", "query2 = \"\"\"SELECT TOP 10 *\n", "FROM gaiadr2.panstarrs1_original_valid\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "# Solution\n", + "\"\"\"\n", + "\n", + "# Third test\n", "\n", "query2 = \"\"\"SELECT *\n", "FROM gaiadr2.panstarrs1_original_valid as ps\n", "JOIN tap_upload.external as external\n", - "ON ps.obj_id = external.original_ext_source_id\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "tags": [ - "hide-cell" - ] - }, - "outputs": [], - "source": [ - "# Solution\n", + " ON ps.obj_id = external.original_ext_source_id\n", + "\"\"\"\n", + "\n", + "# Complete query\n", "\n", "query2 = \"\"\"SELECT\n", "external.source_id, ps.g_mean_psf_mag, ps.i_mean_psf_mag\n", "FROM gaiadr2.panstarrs1_original_valid as ps\n", "JOIN tap_upload.external as external\n", - "ON ps.obj_id = external.original_ext_source_id\n", + " ON ps.obj_id = external.original_ext_source_id\n", "\"\"\"" ] }, { - "cell_type": "code", - "execution_count": 30, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT\n", - "external.source_id, ps.g_mean_psf_mag, ps.i_mean_psf_mag\n", - "FROM gaiadr2.panstarrs1_original_valid as ps\n", - "JOIN tap_upload.external as external\n", - "ON ps.obj_id = external.original_ext_source_id\n", - "\n" - ] - } - ], "source": [ - "print(query2)" + "Here's how we launch the job and get the results." ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1133,14 +1224,14 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "Table length=3724\n", - "\n", + "
    \n", "\n", "\n", "\n", @@ -1194,7 +1285,7 @@ "612256418500423168 20.8715991973877 19.9612007141113" ] }, - "execution_count": 32, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1208,13 +1299,108 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**Challenge exercise**\n", + "### Exercise\n", "\n", - "Do both joins in one query.\n", + "Optional Challenge: Do both joins in one query.\n", "\n", "There's an [example here](https://github.com/smoh/Getting-started-with-Gaia/blob/master/gaia-adql-snippets.md) you could start with." ] }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "INFO: Query finished. [astroquery.utils.tap.core]\n" + ] + }, + { + "data": { + "text/html": [ + "Table length=3724\n", + "
    source_idg_mean_psf_magi_mean_psf_mag
    mag
    int64float64float64
    \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
    source_idg_mean_psf_magi_mean_psf_mag
    mag
    int64float64float64
    63586021872665817617.897800445556617.5174007415771
    63567412638396556819.287300109863317.6781005859375
    63553545477498304016.923799514770516.478099822998
    63549727681031360019.924200057983418.3339996337891
    63561416864013286416.151599884033214.6662998199463
    63559860797436979216.522399902343816.1375007629395
    63573766183549657614.503299713134813.9849004745483
    63585094589274867216.517499923706116.0450000762939
    63560053211971366420.450599670410219.5177001953125
    .........
    61224178124912460820.234399795532218.6518001556396
    61233214736144307221.384899139404320.3076000213623
    61242674401680243217.828100204467817.4281005859375
    61233173934034176021.865699768066419.5223007202148
    61228273805826496022.515199661254919.9743995666504
    61238633266869760019.379299163818417.9923000335693
    61229617271781862417.494400024414116.926700592041
    61225037548010176015.333000183105514.6280002593994
    61239492689915916816.441400527954115.8212003707886
    61225641850042316820.871599197387719.9612007141113
    " + ], + "text/plain": [ + "\n", + " source_id g_mean_psf_mag i_mean_psf_mag \n", + " mag \n", + " int64 float64 float64 \n", + "------------------ ---------------- ----------------\n", + "635860218726658176 17.8978004455566 17.5174007415771\n", + "635674126383965568 19.2873001098633 17.6781005859375\n", + "635535454774983040 16.9237995147705 16.478099822998\n", + "635497276810313600 19.9242000579834 18.3339996337891\n", + "635614168640132864 16.1515998840332 14.6662998199463\n", + "635598607974369792 16.5223999023438 16.1375007629395\n", + "635737661835496576 14.5032997131348 13.9849004745483\n", + "635850945892748672 16.5174999237061 16.0450000762939\n", + "635600532119713664 20.4505996704102 19.5177001953125\n", + " ... ... ...\n", + "612241781249124608 20.2343997955322 18.6518001556396\n", + "612332147361443072 21.3848991394043 20.3076000213623\n", + "612426744016802432 17.8281002044678 17.4281005859375\n", + "612331739340341760 21.8656997680664 19.5223007202148\n", + "612282738058264960 22.5151996612549 19.9743995666504\n", + "612386332668697600 19.3792991638184 17.9923000335693\n", + "612296172717818624 17.4944000244141 16.926700592041\n", + "612250375480101760 15.3330001831055 14.6280002593994\n", + "612394926899159168 16.4414005279541 15.8212003707886\n", + "612256418500423168 20.8715991973877 19.9612007141113" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Solution\n", + "\n", + "query3 = \"\"\"SELECT\n", + "candidate_df.source_id, ps.g_mean_psf_mag, ps.i_mean_psf_mag\n", + "FROM tap_upload.candidate_df as candidate_df\n", + "JOIN gaiadr2.panstarrs1_best_neighbour as best\n", + " ON best.source_id = candidate_df.source_id\n", + "JOIN gaiadr2.panstarrs1_original_valid as ps\n", + " ON ps.obj_id = best.original_ext_source_id\n", + "\"\"\"\n", + "\n", + "job3 = Gaia.launch_job_async(query=query3, \n", + " upload_resource='candidate_df.xml', \n", + " upload_table_name='candidate_df')\n", + "\n", + "results3 = job3.get_results()\n", + "results3" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -1226,7 +1412,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ @@ -1243,14 +1429,14 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "-rw-rw-r-- 1 downey downey 96K Nov 18 19:22 gd1_photo.fits\r\n" + "-rw-rw-r-- 1 downey downey 96K Dec 10 11:34 gd1_photo.fits\r\n" ] } ], diff --git a/_sources/06_photo.ipynb b/_sources/06_photo.ipynb index 8b74810..5ae2b97 100644 --- a/_sources/06_photo.ipynb +++ b/_sources/06_photo.ipynb @@ -1,5 +1,39 @@ { "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "title: \"Title\"\n", + "teaching: 3000\n", + "exercises: 0\n", + "questions:\n", + "\n", + "- \"How do we use Matplotlib to select a polygon and Pandas to merge data from multiple tables?\"\n", + "\n", + "objectives:\n", + "\n", + "- \"Use Matplotlib to specify a `Polygon` and determine which points fall inside it.\"\n", + "\n", + "- \"Use Pandas to merge data from multiple `DataFrames`, much like a database `JOIN` operation.\"\n", + "\n", + "keypoints:\n", + "\n", + "- \"If you want to perform something like a database `JOIN` operation with data that is in a Pandas `DataFrame`, you can use the `join` or `merge` function. In many cases, `merge` is easier to use because the arguments are more like SQL.\"\n", + "\n", + "- \"Use Matplotlib options to control the size and aspect ratio of figures to make them easier to interpret.\"\n", + "\n", + "- \"Matplotlib also provides operations for working with points, polygons, and other geometric entities, so it's not just for making figures.\"\n", + "\n", + "- \"Be sure to record every element of the data analysis pipeline that would be needed to replicate the results.\"\n", + "\n", + "---\n", + "FIXME\n", + "\n", + "{% include links.md %}\n" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -12,13 +46,14 @@ "\n", "In the previous lesson we downloaded photometry data from Pan-STARRS, which is available from the same server we've been using to get Gaia data. \n", "\n", - "The next step in the analysis is to select candidate stars based on the photometry data. The following figure from the paper is a color-magnitude diagram for the stars selected based on proper motion:\n", + "The next step in the analysis is to select candidate stars based on the photometry data. \n", + "The following figure from the paper is a color-magnitude diagram showing the stars we previously selected based on proper motion:\n", "\n", "\n", "\n", "In red is a theoretical isochrone, showing where we expect the stars in GD-1 to fall based on the metallicity and age of their original globular cluster. \n", "\n", - "By selecting stars in the shaded area, we can further distinguish the main sequence of GD-1 from younger background stars." + "By selecting stars in the shaded area, we can further distinguish the main sequence of GD-1 from mostly younger background stars." ] }, { @@ -31,7 +66,7 @@ "\n", "1. We'll reload the data from the previous notebook and make a color-magnitude diagram.\n", "\n", - "2. Then we'll specify a polygon in the diagram that contains stars with the photometry we expect.\n", + "2. We'll use an isochrone computed by MIST to specify a polygonal region in the color-magnitude diagram and select the stars inside it.\n", "\n", "3. Then we'll merge the photometry data with the list of candidate stars, storing the result in a Pandas `DataFrame`.\n", "\n", @@ -59,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 1, "metadata": { "tags": [ "remove-cell" @@ -87,7 +122,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -110,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -140,9 +175,18 @@ "Since we expect the stars in GD-1 to be older than the background stars, the stars in the lower-left are more likely to be in GD-1." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following function takes a table containing photometry data and draws a color-magnitude diagram.\n", + "The input can be an Astropy `Table` or Pandas `DataFrame`, as long as it has columns named `g_mean_psf_mag` and `i_mean_psf_mag`.\n", + "\n" + ] + }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -198,7 +242,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -224,9 +268,7 @@ "source": [ "Our figure does not look exactly like the one in the paper because we are working with a smaller region of the sky, so we don't have as many stars. But we can see an overdense region in the lower left that contains stars with the photometry we expect for GD-1.\n", "\n", - "The authors of the original paper derive a detailed polygon that defines a boundary between stars that are likely to be in GD-1 or not.\n", - "\n", - "As a simplification, we'll choose a boundary by eye that seems to contain the overdense region." + "In the next section we'll use an isochrone to specify a polygon that contains this overdense regioin." ] }, { @@ -235,71 +277,51 @@ "source": [ "## Isochrone\n", "\n", - "http://waps.cfa.harvard.edu/MIST/interp_isos.html\n", + "Based on our best estimates for the ages of the stars in GD-1 and their metallicity, we can compute a [stellar isochrone](https://en.wikipedia.org/wiki/Stellar_isochrone) that predicts the relationship between their magnitude and color.\n", + "\n", + "In fact, we can use [MESA Isochrones & Stellar Tracks](http://waps.cfa.harvard.edu/MIST/) (MIST) to compute it for us.\n", + "\n", + "Using the [MIST Version 1.2 web interface](http://waps.cfa.harvard.edu/MIST/interp_isos.html), we computed an isochrone with the following parameters:\n", " \n", - "MIST Version 1.2\n", + "* Rotation initial v/v_crit = 0.4\n", "\n", - "Rotation initial v/v_crit = 0.4\n", + "* Single age, linear scale = 12e9\n", "\n", - "Single age, log10 scale = 10.079\n", + "* Composition [Fe/H] = -1.35\n", "\n", - "Composition [Fe/H] = -1.35\n", + "* Synthetic Photometry, PanStarrs\n", "\n", - "Synthetic Photometry, PanStarrs\n", + "* Extinction av = 0\n", "\n", - "Extinction av = 0\n", - " " + "The following cell downloads the results:" ] }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 6, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10.079181246047625" - ] - }, - "execution_count": 132, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "import numpy as np\n", + "import os\n", + "from wget import download\n", "\n", - "log_age = np.log10(12e9)\n", - "log_age" + "filename = 'MIST_iso_5fd2532653c27.iso.cmd'\n", + "filepath = 'https://github.com/AllenDowney/AstronomicalData/raw/main/data/'\n", + "\n", + "if not os.path.exists(filename):\n", + " print(download(filepath+filename))" ] }, { - "cell_type": "code", - "execution_count": 182, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "10.176091259055681" - ] - }, - "execution_count": 182, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "import numpy as np\n", - "\n", - "log_age = np.log10(15e9)\n", - "log_age" + "To read this file we'll download a Python module [from this repository](https://github.com/jieunchoi/MIST_codes)." ] }, { "cell_type": "code", - "execution_count": 147, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -313,521 +335,38 @@ " print(download(filepath+filename))" ] }, - { - "cell_type": "code", - "execution_count": 149, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading in: mist_iso_12.0_-1.35.cmd\n" - ] - } - ], - "source": [ - "import read_mist_models\n", - "\n", - "filename = 'mist_iso_12.0_-1.35.cmd'\n", - "iso = read_mist_models.ISOCMD(filename)" - ] - }, - { - "cell_type": "code", - "execution_count": 150, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "read_mist_models.ISOCMD" - ] - }, - "execution_count": 150, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(iso)" - ] - }, - { - "cell_type": "code", - "execution_count": 151, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "list" - ] - }, - "execution_count": 151, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(iso.isocmds)" - ] - }, - { - "cell_type": "code", - "execution_count": 152, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 152, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(iso.isocmds)" - ] - }, - { - "cell_type": "code", - "execution_count": 153, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "numpy.ndarray" - ] - }, - "execution_count": 153, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type(iso.isocmds[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 154, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dtype([('EEP', 'Table length=5\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    EEPlog10_isochrone_age_yrinitial_massstar_masslog_Tefflog_glog_L[Fe/H]_init[Fe/H]PS_gPS_rPS_iPS_zPS_yPS_wPS_openphase
    int32float64float64float64float64float64float64float64float64float64float64float64float64float64float64float64float64
    25110.0790.105870850108208960.105869705589364823.54036068292639565.321292252841703-2.7463861921790302-1.35-1.30902413.83327812.39528311.63853511.28630911.09987712.30464511.9700720.0
    25210.0790.108809974798175170.108808758217223443.54258290625209735.312318300317242-2.7181724188486394-1.35-1.30888713.72806512.30235811.56230511.21656411.03057212.22069511.8916950.0
    25310.0790.112652468448451230.112651153162689773.54551901495962075.300571015130943-2.6811483213239216-1.35-1.308713.59011312.18069911.46111311.12465910.93905112.11006911.7887120.0
    25410.0790.116427328711895660.116425909285919643.54840384284145665.288998772212527-2.644742589781073-1.35-1.30852713.45454412.06139811.36112811.03319410.84876912.00072911.6869940.0
    25510.0790.120222397889611750.120220866480104383.5513078778592485.277331450307816-2.608093791390564-1.35-1.30828513.3183711.9418211.26008710.94010610.75770811.8903111.5842020.0
    " - ], - "text/plain": [ - "\n", - " EEP log10_isochrone_age_yr initial_mass ... PS_w PS_open phase \n", - "int32 float64 float64 ... float64 float64 float64\n", - "----- ---------------------- ------------------- ... --------- --------- -------\n", - " 251 10.079 0.10587085010820896 ... 12.304645 11.970072 0.0\n", - " 252 10.079 0.10880997479817517 ... 12.220695 11.891695 0.0\n", - " 253 10.079 0.11265246844845123 ... 12.110069 11.788712 0.0\n", - " 254 10.079 0.11642732871189566 ... 12.000729 11.686994 0.0\n", - " 255 10.079 0.12022239788961175 ... 11.89031 11.584202 0.0" - ] - }, - "execution_count": 155, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from astropy.table import Table \n", - "\n", - "iso_table = Table(iso.isocmds[0])\n", - "iso_table[:5]" - ] - }, - { - "cell_type": "code", - "execution_count": 156, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['EEP',\n", - " 'log10_isochrone_age_yr',\n", - " 'initial_mass',\n", - " 'star_mass',\n", - " 'log_Teff',\n", - " 'log_g',\n", - " 'log_L',\n", - " '[Fe/H]_init',\n", - " '[Fe/H]',\n", - " 'PS_g',\n", - " 'PS_r',\n", - " 'PS_i',\n", - " 'PS_z',\n", - " 'PS_y',\n", - " 'PS_w',\n", - " 'PS_open',\n", - " 'phase']" - ] - }, - "execution_count": 156, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "iso_table.colnames" - ] - }, - { - "cell_type": "code", - "execution_count": 157, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "14.4604730134524" - ] - }, - "execution_count": 157, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import astropy.coordinates as coord\n", - "import astropy.units as u\n", - "\n", - "distance = 7.8 * u.kpc\n", - "dm = coord.Distance(distance).distmod.value\n", - "dm" - ] - }, - { - "cell_type": "code", - "execution_count": 158, - "metadata": {}, - "outputs": [], - "source": [ - "g = iso_table['PS_g'] + dm\n", - "gi = iso_table['PS_g'] - iso_table['PS_i']" - ] - }, - { - "cell_type": "code", - "execution_count": 159, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 159, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "plot_cmd(photo_table)\n", - "plt.plot(gi, g)" - ] - }, - { - "cell_type": "code", - "execution_count": 169, - "metadata": {}, - "outputs": [], - "source": [ - "def read_and_clean_cmd(filename, distance):\n", - " iso = read_mist_models.ISOCMD(filename)\n", - " iso_table = Table(iso.isocmds[0])\n", - "\n", - " phase_mask = (iso_table['phase'] >= 0) & (iso_table['phase'] < 3)\n", - " table = iso_table[phase_mask]\n", - " \n", - " dm = coord.Distance(distance).distmod.value\n", - " g = iso_table['PS_g'] + dm\n", - " gi = iso_table['PS_g'] - iso_table['PS_i']\n", - " \n", - " return gi, g" - ] - }, - { - "cell_type": "code", - "execution_count": 170, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading in: mist_iso_12.0_-1.35.cmd\n" - ] - } - ], - "source": [ - "filename = 'mist_iso_12.0_-1.35.cmd'\n", - "\n", - "gi1, g1 = read_and_clean_cmd(filename, distance)" - ] - }, - { - "cell_type": "code", - "execution_count": 183, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Reading in: mist_iso_15.0_-1.35.cmd\n" - ] - } - ], - "source": [ - "filename = 'mist_iso_15.0_-1.35.cmd'\n", - "\n", - "gi2, g2 = read_and_clean_cmd(filename, distance)" - ] - }, - { - "cell_type": "code", - "execution_count": 184, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 184, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEOCAYAAACAfcAXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAB4IElEQVR4nO2deXxU1fn/3yfLJISwhX1HCLITlKCCG1r3tVpqbe1qq12+7c/azaVV7GLrUq3aumLFWq1ocSmioqggAgESNAkYtoDsYUtYMiSZyWTO74/JHW5u7jozmUzgfF6vec3Mveee85xz732e5zzPc54jpJQoKCgoKJx4SGtvAhQUFBQU2gdKACgoKCicoFACQEFBQeEEhRIACgoKCicolABQUFBQOEGhBICCgoLCCYo2FwBCiOeEEPuEEGtNzv1KCCGFEL3amg4FBQUFhZZIxgzgeeAS40EhxGDgQmB7EmhQUFBQUDCgzQWAlHIJUGNy6m/AbwC1Ek1BQUGhHZDRHo0KIa4Cdkkpy4QQTmVvBm4G6Ny58+TRo0cngcK2h5SSuro6cnJycBqDVMfx1JdEQ0qJECI6Rp06dSItrbXepZVLBAKNIepqD5LRcJBc6hAmOlaQTOrTu5CW053OuV1Ji6HtsJRU+4Mc8AcIhSXZGen0ys2kO7WIugPQWA8iHXLyIKcnZHZKRPcUYsDq1asPSCl7G48nXQAIIXKA3wIXuSkvpXwGeAagsLBQlpSUtCF1bYtgMIjP57P835FxPPWlrWA1RsFgkNLSUiZNmuR5DLU6a+uDFC1ZQFPpHM6o+5gewk+DyEGk5ZLeFCCDEAGZyZKMaRwZdwOnT7+CQXmdY+qHPxDiX8u3MuuTLYi6Rr46qjf/N6UrhfvfQBQ/C3UHoe8kOO0HMH4GZOXG1I5C4iCE2GZ2vD1mACOAkwBN+x8EfCqEOE1Kuacd6EkKzF7y44lh2vVFCYcIrMbA5/PFxPwDgQBvvT2PzruXMnb/Ai4Sewjg42jOAA6Hu5IVqCarqZ7NciAVA65l0Lnf44JRw2OeadQ2NPJC0TZmfbKFQ3WNnDeqN78+vRNjNz8Lb7wMTQEYeTFM+ykMOxvUbDDlkXQBIKVcA/TR/gshtgKFUsoDyaYlmYj1JW9vxMu849Fuk4FUEU5eaNi7ZxfrP/gXeVv+x4zwesJSsCtnNPuz+yPrauhTv5WAzGRp1lmET/0u06ZfzojszJhpqwuGmL1sa5Txnz+6D786PYexlbNg7r8jZp5JX4cz/g96nxxzOwrJR5sLACHEy8B0oJcQYicwU0r5z7ZuNxWRCozGCxLBvGMRfBpTbmvmnOrCSY9gXS3rFr8Ma/7L2LrVnCua2J4xjG19LyYjVE/PA8Xk1NezSQ5iWb//x4gLbuT8/GFx+RWCoTBzirfz2IeVHPAHOH90H355RhfGbX4W5v4LpITJ34WzfgHdBiauswpJg+hI6aA7ug+gIyJZzFjfXmlpKWPHjqWioqLNmXOqzABM0dTIrtVvU7PiP4yo+ZgcGthDL6r6nkufbjmk7Sqh/9F1NMhM3hNTeSFwHqGBp/Haj6eRkR57gF9TWPLmZ7v42wcb2XmwntNOyuO3Z/egYNtsKJkNsglO+Rac/UvoPjiBHVZoKwghVkspC43H2yUKSKHjQGP+Rk25rRinfsaQDM085Zi/lBzdUsSuj/9Fnx3vMlAeprPszOpuF9B3+AQ6Ha5k9Nb5dNpbz/rwYJ5q+g5vNJ3JEZodrTsP09gkyUiPpWnJ+xV7eej9DWzc62ds/y689PXhTKv6N+L1f0JTI0z6Bpzza+gxNLH9VmgXKAGg4AgjM25r00lHdJLbCUQ3wrJxzzp2LvkXXTa9Sa/GKobITFb6TkeefCljujcxquw/9CmdT730Mb/pDF5uOp9P5UjgmInnx9NH8KuLRpGe5t3sU7S5mvsXrKd0xyGG9+rMP67Np2DjPxj09muIxnqYeD2c+2vIG+65boXUhRIACrbQmJeegcWjnae0ySVG2AlEu3NNh3ax5PUnGbHnXYYEKxkiBavERJYMuZGJ48YxatP/6FHxR7JkA5vCA9kgx3N2+lq+mrGE18LngIww+oevK+DqSQNjYvyb9tbyl3fX89H6ffTvls2D14zmWvkB6R//AI7uhzFXwfl3KefucQrlA1CwRKI1fWN9x5MwcD0DOLKbxr+fTkOwkc40kCYkpeHhbOpzKX2nfoNJvh0EFv6J3kfWUi99rJXDEEBh2sYWdV7g+zc/vXQyVxYMiInx76tt4G8LN/FK8XY6+zL4yfThfD+vFN/ie+HgFzD0TLjg9zB4iue6FVIPygeg4BmJtsPr6+tIEThOcBJkPhmk8elLyKxaDUAmkCngb41f4X/haTz/y68zvWo59Qt+RNeja9gle7I4XEBXcZQpBsb/u+w7mXzxDbxXEJvGXxcM8cySLTyzZAvBUJhvTx3GL/Kr6PrJD6CqFPqMg2/8F0ZeqOL4TwAoAaBgi0QzZ719/3hh/qaCrCkEC26D4meBCNPXUBoezoqzX+DnF4znms8+pHH2FfQ++in10sdW2RefaGR6elmLdp72fZt+F93KPacMiynCpyks+W/JDh5euJF9tQEum9CP3xYKBhbfDa9+AN0GwzVPw4SvQloMHmSFDgklABRiQiLMNx2d+YOJINu6FJ6/3LTslRlP8vzPv8Kk3CxyPvuEtQ9cxIT6VdHznUSQYWIvq8MjkQgGimoq0kay7fwn+P7UwphDO5dXHuAP8ytYv6eWyUN78MyMk5hU+QTMmQ2+XLjoTzDlJsjMjql+hY4LJQAUPCNR5ptYhUiq+Q58ogk+f5O6T18hZ/M7Lc49OewRTj3nKk47KY95QOnq5Wz54F6mNCxrUa5OZvFu2jm8HxjHTRnvMFBUU3nSDQz7yn2Mze0aE13bq+v48zvrWPD5Hgb16MSTXx/PJUfnIV5/EIJ+KLwRpt8BnXvG2nWFDg4lADo4ksEMjW0kwnyjX/CVm2ueLMysbynjOwgFYcsiGsvnwvq3yQwdxS+783r4S+zpfQ4nTfsKl0zoz4+zMgiHJZ+sKCK86D6mBz9uUc122ZfledewsOlUzqp5jcd9f0dmZNN01T8ZMvqqmPp6NBDiicWVzPrkC9KF4FcXjuTmvuvxffRlqNkC+RfARfdCn+Mjs65C7FBRQB0YiWaGfr+/FTNuS4br9/stV/s6hVZqjmRIoikpFIDNiwh//gbhdW+T0VjLYdmZd5umUJx7PsOnXMyXJw9lYPdI2uNgKMzC5asIL7qPK+WiFlUtF6dQNerblGWMJ7dsNj9Oe4POIkD41O+Qcf6dkNunRV/dIByWvPHZLu5fsJ59tQGuPWUgd54aoteye2DrJ9BrFFz8Zxh5QUKHRSH1YRUFpARAB0eiZgB+v5+5c+cyY8YMUyEQa5rieMo5nSspKUFKyZQpU9pOCDQ2wOaPkBVvEF73LumNtRyhM++FJrMoYxp54y/mminDOHVIj0jenVCAwJr/sXn1h4zdOadVdc+GLqX39B9Tti9MYNMifhJ+iYHiAIHhF5J1yZ9i1srLdhxi5rzPKd1xiILB3fnjBb2ZuP4x+OxF6NQDzrsTJn8P0tWk/0SEEgAKjjCbAcSCeGcNbvMPtdkMoP4gbPoAufFdwhveI73RzxFyWRCazPucQXr+eVxxylAuHNuX7MzmiJnDu2hY8U+yix4yrfKOxu9T2u1CfnvNFOa9+QrfrJ3FxLQvqO85nk6X/xmGnxsTqTVHgzz43nrmFO+gV24Wd1yUz5dD75C2+C+RDVlO/yGc86uIEGgHpJq/5kSFWgfQgdBeL00imD/Ev1JY8w2UlZXZavcJG6NwGPZVwJZFNK1/F7FjBWmyiYN04/1QIe/L00kbMZ1LC4bw8Li+dNVSK0sJW5cSWP4UWRvfwiqG5tbcB+k5ahqFezdS/8J1PJC+mvrO/ZGXPE2nCdeByQ5hTmgKS/6zajt/fW8D/kCI7595Er84eR85H3w90pcR58OlD0CvkbGPS5xIGX+NgiWUAEgxnOgvjSY8AEKhUNs0Em6CvWth6zLktqWEv1hGeuAQAJvkED5ouoKlaYV0G3EGXxrbn4fH9aV7ju5eBPyw5lXkqlmIfRVk6ap+s2kanafdxNljh5I9dDJHGhoZ9t4qeq2aydfSPiLs60TjOXfTadpPWmyR6EXof7b9IL97cy2f7z7C1OE9+dMFPRnx6X3wn7mReP6vvQijr2j3hVzHy1qP4xlKAKQYOvJLozfdJEKIZWbGvolJFFLCkV2w+zPY/Rly92fInatJCxwGYDd9WB6ayEo5hl3dCxk3Zjznje7DTcN6kGVMqXmgEoqfRZa+iAjUUiXzGNDMYz9OO52ci+/mqilnkpYmaApLXlm+gf0L/8aN4TfJSQ8SKPguORf9Fjr3alGt2/EKhsI89uEmnlhcSZ8u2Tx+/Tgu8/8PMeeBSKbOc34DZ90Kvpz4xy1B6IjP8YkE5QNQsIQXrdQqz49Xc5a+HmjNQPT1tao7HI7ksdlXAXvWwu5Pkbs/QxzdD0AT6WwWQyhpHMaq8Bg2dSpgRP4opo7oyZkjejGkZ05EYBzcCp17R/ayDTfBpoURM8+2RQRlOu+ET+ez8EhuzphPL45Qc9599J/+gygZyzftY/kbj3PD0RfoL2o4PPRiul15r605xirkVTtWua+Wn79SytpdR5g+NJtHz/PR7YNfwoENkW0YL71PZepUsIRyAit4QixavNEpG+tMwHHz9IICOLqfLSvmk981SEb1BthbAfvXQ2MdABJBlW8onzYOY1VwKGvCw6nKHsEpIwYwdURPpo3oyYjeuYjAEdi1GnaWwM7iyKf+IOEJ17HTN4Kua/9F98Bu9sgevBT6EnOazmd6eil/yphNU05vcr71HxhwCgA79hzgnddnc9aefzMubRuHekyg29X3I4ad6brvxr5OnFjAy6t3c9+76+mclcF9V43kS7ufIX3Vk9ClP1z+EIy61HP9CicWlABQ8Aw32rtRIy8pKaGwsDAxG8c01kcWLh3YBNWb4EAl4QMbSaveDM0mHIBAVh67fSfxeWgQy2v78nnTIDbJQfTM68HkIT04dWgPCofmMbpPDmkH1keY/K6SCNPfvwGQgCDU8+SIMNFhZXg0/wpdxPvhQtKQzMx4gRsyPkSeNB0x4znIzCZY8S5bl7zE4OqldBJBjmQPIPuS3+ObOCMmB6+G3TW13PHmOj7euJ/zRvXmoWkB8t6/NTIWk78LF/4RsmNbJaxwYqHdooCEEM8BVwD7pJTjm4/dA9wE7G8udqeU8h3zGhTaC25CMI0avlGhsDUDNTXCkV007t9C5tHdcGgHHNoOh3fAwW2Rb47VF8rtz6FOw9je/QI+D/Rh2ZHelNT150BDN3wZaUwc2I3JE3rw4yE9OHVod/qI2matfh68XxzxAwT9kcpyeiIHFrJ78BUsbxjGf6t6U7nrIJ9m/wiAFT2upnHyjeQNP4V3HltKX2p4sevjjAyug9NuRgw+Hfn2rYQ3vIevqYEeshslPS5j7IXfoeeYc+NOqPbxxv388tVSahtC3HvlyXzD/y/Ey/+AboPgW29EonwUFOJEm88AhBDnAH7gBYMA8Esp/+qlLjUDSA3Y2elbrCVorCdYvZUtn35Mfq9MMvxVEQZ/aAfy0DZEbRXIsK5mAV0HILsNxp/dn51pA1jX2JdVtXl8tL8r+xoi+kpmuuDkvl0YP6Ab4wd2ZfzAbozr2wnf/s+PmXF2FsOhbZFq0zKQ/SYQ6Hsqe7tOoCJ9FAt2ZfPxpgMcqmskTcDkoT2YPqoPl3XdwrCxU5BZ3XmhaCv3L9jAwLRq3vbdTlbjERBpkJ4FoXoOpfVgXrCQtd3PZ8Y1X+W0Eb0tx8vtLEhKyROLN/Pgexs4uW8uT1w9iPxFP4EdKyILuS76I2R18XS/FBTabQYgpVwihBjW1u0oJBeTRg1DVJWSWX8AanfDkSqaDu+kafcmwhwlzV8FDYfxAdG1rSINug4k3HUQNV3G0mPC9TR0GcwXwR5sauzJpzWdqDgQpGLrEeobm8ggRLeMEBP7+Lh+TCZjemZwcs8MBncBX7gOGqpgdyl8XgxVZdAUiLTTdSChAZOpHHI9i/xDWHioH5t2N1G7RQsrPUjPzj7OH92H80b14eyRvXRhnvl8ceAot/1rBau21nD+yB48t+Nr0Bg5G87pxeqcs/jb7nGsyxzHLy4fw19OH2qZm9+LHyQclvxhfgXPL9/K1ZMG8MAZAbJeuxwaDsOM52D8V2K/YQoKJmjPMNCfCiG+DZQAv5RSHmxHWhSMaApBXbXucwDqqmk6uJ3g5+/R+fAGhM48g0gjPbcvXXL7kdYtH046K+KkzO6GTMvkUCDMwYYwhw9UUV+9E1m7l/DuxaSH6ukkgowmwGQRJDe9kZzMAL6MAGmymWHXNH/MkJEdccKefjMHuk9kkX8ob20VFK05QGOTpEtWBqcM7co1Q3MYkhf5DO3ZmZF9ckkzMO2msGT2si948L0N+DLSeHDGRGaM7wb/moSUTSwediu/WdWZAzVNfP20IfzjolHkdbZn6m7Deg/XN/LLV8v4YN1ebjr7JO7oW0zav38VGcPvvw/9JjjcMAUF70iKE7h5BjBfZwLqCxwgYuD9I9BfSnmjxbU3AzcDDBkyZPK2bdvanN6URjgMoYbIp7H+2HfgSGQP16MRRs3RA5H/dQeafx+I/G5hcgFOak5BEDwasY8Hj0bqajjcum0AkUZ4wGTShk4llN2DjIxMQEA4RKh2H4f37yR0aDcZdXvJCRygk6xrVUW99HEoPY+QrxsZWTlkdcolO6cz/roAPfsNIj0rN7JIKjOn+Vv/+9h3KCOH4sNd+HiLn4/W72Xj3oh9/6ReOYzrIfnaWWM5I78PsinkygTznedW8fHG/Vwwpg/3XjOBvl0ja3tLm/PslO04xOShPfj9VeMYP7Cb61vmhHVVR/jRi6vZdbCemZeN5FuHnoCS5yJ2/q/8E3LyEtaWwomJlEoFIaXcq/0WQswC5tuUfQZ4BiI+gLanro3w4R/hk4ciURtZ3cDXORJn3ndchCk3NkRCGEMNUL05Es+eDFRXRlaPZneDrv0BQTjgj2jfTSEIN0actU2NyHAjTY0BxL51sKu41cPTKH34ZXf20oMDDKA+q4Bwbj8yuvUjq/sAeg4YRv9Bw+jTI4/+nbKjtvH6YBOrttawaN0eDtWHuP3ckfTrYZ6W4nBdI4s37mPR+n0s3rCDQ/WNZKQJTh+ex9emDOH80X04qVfnmBalNTaF6ZSZzn1fmUiv3CwO+AM8sGA9r5bspHeXLB6+roBrThmIECJh6Tr+V7qL214rp2t2Jq99czgFRf8HO1bCmT+HL92tdudSaFO0iwAQQvSXUlY1/70GWNsedCQVnzT7uxsOt9SudxbHV292t8iipZxekRWmnXtFfvs6w45VkXDHo/tbXiPSInu/du4FDYfg6D6obqYrHMIYuCgzOiG69GVXU3dKD+axT45hr+zBvmZmv1f2oHvvgQwfNJCzR/Vh8tAeTMhOo1N2Vot6Dh4N8uH6ffztheXsOlRv2aWR2X5uuux0fD4fUko27/fz4bp9fLh+H6u3HaQpLMnr7ONLY/py7sg8po/pdyw/TzNi2XryD1eP49JHP+EPb1UwaXB3/vbBRuqDTdx8znB+dn4+XZrbSMRK56aw5P4F63lmyRZOG5bHU+eFyHvr6sjsa8ZsGH9tTPUqKHhBMqKAXgamA72AvcDM5v+TiJiAtgI/1AkES3ToKCApI5p0XXWE0QaOQG0VVMyD7SsACdndj2niJ18S2bjDYvrvyITe/x0s/3vr4xnZkTa0trK7QSfd7+xuhLJ7ktFjEHTpTzArj9J1W5h0yims2naEb/5zpavupgm4qqA/uw41UNsQYs+RBg7VNTpe9/XTBnPR6N6kZWSwaP0+Plq/j+01ETPSmP5d+dLoPpw/pg8Fg7rHtCm6Ex5euJHHPtwEwNkjezHzynHk92k9G4lnBnC4rpGfzfmMJRv3860zhjJz4Coy3v1NJMTz+pcis0IXUJk2FdxCLQQ7DmGbPqCuBnZ92oKxk90tpn1fje0EAgHqQoIjDY0cqQ9R29BItb+eR9+roPLgsQRuA7plM7B7Nt1ysujTNYvhvTpzUq/OZGWk0xAMsnLNJsKde7Ktpo4dNQ1srT5KIHTMR5GVkcaZ+b04f3Qfzh/dhwHdO9HWaGhs4v4F6zljeE8uGts3kuPfBLEy3017a7nphRJ2HarnT1eO4mv7HoVP/xUR9l951nXa5hM9aaCCNygBcAIgGUzBro01O6r549sbOXdUb66fMpguPmFLj3ExWUZGJvtqA2ytPkowFGbKsDw6+VLPBh7rOC+s2Mutr5SSnZnOszOGMano/8G2ZXDWL+D833m296sZgIJbKAFwgqA99gi2O6dfGGaX48dLyolUgNfFXU99vIX7F6xn4qBu/POyXHq/9R04UgVffgImzGhjahVOdFgJgNgTlSikJJLBJO2Yf2lpaVSzDwaDVFRUEAwGTc/Z1ac/b7w2FeB2nBubwtzx+hruX7CeKwsGMPeCo/R+5UoI1sH33lHMX6FdoQSAQsJgjLjR/9f/dmLoxvPtuUdCPELnSEMj35tdzJziHfzsvBE8dtJKfK9cD92Hwk0fwaBWCpmCQlKhBICCI4xM0I4p6rOA6v/rf/t8PsaOHWu71aOR4bcX84915rGjpo6vPLGcFVuq+eu1Y/hl49OIBbfByZfCjQug++A2oFhBwRuUAFCwhZnpxokputHwNdOQFVLB3u8kqKxQtuMQ1zyxnL1HGnjpm6OZse7nkZW9Z/48sl1jVmL2XlZQiBfKCazgCKPD08zRq5l5rMqY1QmpweitEEu0z6IN+/jJi5/Sq4uPF2YM5KQF343sZ3Dlo3DKDW1LsIKCBZQT+DhGWztHjcxPs+NDhPnPmTOHoqIiW8eu5gjWw8opbIVkO4G9+h7e/GwXN/2rhOG9O/O/63px0pvXRvY4+OZcxfwVUhJKAHRwtGWEjFWdfr8/2mZubi7XX389U6dObWX/19dTXFxMSUlJi3OaecWqD8mMBLKq1zirscLsZV/w81dKKRzWg/9eJsibcyU0BeF7b8Pw6YkmV0EhIVACoIOjrSJk7JhyRUVFC9t4bm5uq32AjbOBKVOmRLeK1ARCeXl51FRk7EMyI4HsQlStymiQUvLX9zbw+7cquHhcX16YdoCcOV+BnJ7wg4XQvyDh9CooJArKB6BgiVgXbtmmqND9B+dtJ734FeKBm+yhxvabwpK7/reW/6zczvVTBvPnoZ+S9vat0H8S3PDfSLI9BYUUgPIBKHiGXZiml+s0jd84K7AyGZmhrU1AbrKHGpn/r/9bxn9Wbucn00fwlwGfkDb/lkgO/+/OV8xfoUNACQCFpMAqqZrenwC0+C4tLaWmJrIVWKJNQPGEoDaFJb98tZTXP9vFLy88md/kzEe8dyeMuQqufzmSiltBoQNACQAFV9BH8XjVwn0+X9T+b6yzvLzc1Bns8/nIz89n3rx5+P3+hPVDazfW2USoKcwvXi3lzdLd/Pqik/kZc+CjP8KE6yJ5/DNSN6xVQcEIJQAUTGGMwCkpKaG4uJiampqYmKeVVi2ltDS/5ObmMmPGDHJzc+M2ARnNT06zCbN2msKSX/63jP+V7uY3F5/M/4X+Fdno59RvwzVPQXp7brGtoOAdSgAotIJZBE5hYSEFBQVUVla20Ni91quHFh2kr8sYTRTLzl5O/dG3Y0aXWXkpJXf/b22U+f+k6T+RDXem3ARXPqa2blTokFACQKEVrHLx5ObmMnbs2KhGbozrt4OVBm+1DiCR+YDshIfbtv+2cCMvrdzOj84dwU/Ea7D0YZj8XbjsQbDwbygopDqUAFAwhRWz1Kd3tgshNmP0dtE1ZuficfhqNJrNLOzaNgtPfW7pFzz2USVfKxzMbT0Ww+K/wKQb4PK/Keav0KGhBICCa2jMEqCiooKCggLXWrVTDL/TngBeoM1OioqKWoSf2s1CrM7PK9vNH+ZXcMm4fvx5VCViwe0w+gq46u+Q5v71cepLstNc2MHLrE6hY6PNBYAQ4jkhxD4hxFrD8Z8JITYIIT4XQjzQ1nQoJAb63P7aTl9mZYxatVcHbjxOX81nMXXq1KiPwYwuJ7pXfVHDr14t47ST8nhsqp/0N38Ig0+P7N3rwebvJjtqqmx445aWVKJZIXa0+UpgIcQ5gB94QUo5vvnYecBvgcullAEhRB8p5T6nuhKxErgtV5MqHIObVbyxrChORLtusHm/n2ufWE7PXB9vfqUbXV++Crr0hxsXEMzIjZsur+eTCbe0pBLNCvZot5XAUsolQI3h8I+B+6SUgeYyjsw/EVBaizXijegxnrOLujErYxbr78RczKJ39I7pWO/3AX+A780uJjNd8OKMAXR97evgy4VvvkYwI5fi4uIovWY0mMHr6un2hFtaUolmhdjQXj6Ak4GzhRArhRAfCyGmWBUUQtwshCgRQpTs378/rkbbMqFYR4ZXRulUXu8rsIL+Xvj9fubOneu44MvoU7BKzmbWhps6ARoam/jBv0rYV9vAc18fw4C3v4MMHo2kdG7exSsUClFWVma6ilkpGAodCUlJBieEGAbM15mA1gIfAbcAU4BXgOHSgRiVDK5tYJeYTT/Nt/ptVtbv91NRUeFa4Pr9/hY+BTNTjjFJWyxmJWNZfZ1SSn76n894Z20VT90wiYvLf4HctJANU/7M8AtuNI0U0tozfisopBJSLRncTuB1GcEqIAyo7FntAI0J2p3TwimNi8OMZbWIGy1cND8/35IZGrVkI/M3MyEZt2d0StjmBOMM4YnFm3l7TRW3XzKai3c/BRsXIC69vwXz167TO5aNKSwUFDoK2ksAvAmcDyCEOBnwAQfaiZYTGm7j892YU7SEbxqzrqysNDWHuDUh6TVu/RoEt3BTVmvjo/V7+ev7G7iqYAA3dy2C5Y9B4ffhtJtsVw0b6VXmH4VUgNvnMBlhoC8DRcAoIcROIcT3geeA4c2moDnAd5zMPwptB7fx+U7l9AnfcnNzPS38corNBzxt0G60z9th834/t7xcytj+XXnwtDrE/FvhpHPh0vtd12m1ollBIdnw8hyqDWEU2hR2ZhG93dxu83XtQXa7QbtWn5a2wg61DY18+fFlHKxrZP53RzBgzkWQ1QV+8CHk5HmuU5mBFFIBxucw1XwACicA7DQR4zknxu4lgkszQTkxfyklv3y1jK3VdTxx/QQGLPwJBOsiOf11zF/fvlOdZr4RBYVkw60SogSAQpvBjX8BaOWEtgr3dONQdusvCAaDPLdsK+9X7OWOS0czpfJR2F4EVz0GfUZb9scLlElIIdWhBIBC0qGPJHJKG+HkYDWLVAJs1yEEg0HmLFzBX95ZxwVj+vKdbp+RvvIJmibfCBNmWNLrFXYCUAkFhVSAEgAKbQYzDdhplbAZ07RzsOpnEsZrrbTvI/WNPFbip1sW3H9OFplv/5zwgFNJv/Q+yz7EuiuZ22R5CgrtASUAFNoMVszcjb3fTV16GM1EVuWllPx23joOBeCpr0+g54IfQ1oGade9QDDcOrWz5k/wGoJqh2SuSFdCRsEOSgB0YHSEl9vrYi3jbMHNdVbrBszK/3vFNt77fC+3XzqaKV88BXvXwDVPEczpS0lJiammbxfSakanE5IVKaRmGgpOUAKgg+J4fLn1ffK697Ce+Wv7FxuvXbfrIPe+vY7po3rz/f5boegfkS0dT74YgMbGRsrKyizj/PV0mtHsJjFcMu+b00zDDQ3H0/Ol0BpKAHRQxGpGsGJKiUKstnI41qdgMMi8efNsU0nY1VFYWNhiHwAAf10D//fvVXTypfPg5YPgzR9Dr1Fw0R+j1xn3DzCDlZMaWvoc7HwWXha0xQs75u8kiI5HJUOhJZQA6MBIRFhiIl9yfVbPeCJncnNzmTFjhmPMvV0dxrF5euk2thwKcd814+n5wa+QRw/QePWTkNmpVVSSU91mfg3jcStGH0tKi7aAm9lBMn0VCu0DJQBOIMTqlDXCinlpjNvn87neVcqO1kQJptXbDvL4okqmD8nigob3Sdv4NuHzfkfm4MkxCUA7X4QGK0afSkzVzewgFehUaDuoVBAKnpColAj6dNFgn4o6HkZUH2zikkeXEGqSzP/WUHq8MB36TYTvvBXd09dN/bHQ0F4M1KndtuqvQupCpYJQSAjchkU6MaCKigrGjh0LWMfra8xfv8uXVzzywUa2Vdfx1xkT6fHxb6GpEa6ObOiuN/3Ywcp05oT2Yv52Mxq3Mx7F/E8MnNACoL3tsBpShQ4j7Ew98Zgx9Hl13JhEYp2lrt11mGeXfsH1UwYztX4xbHwXzv8d5A137QTV02u1WjmVYDWeVn1ROLFxwgqAVHmJU4UOI6xSH9tpll5g9ENY1ePz+Rwjc8zoaApL7nh9DT1yfNx5Ti9459cwsBDO+HG0XrtoHLNoHz1NTums2xNmzN9uMx+FExcnrABw0pTam462hpPmq5lojExOS4sQ7164ZuYUu9BJt3Vq1z+/fCtrdh1m5pVj6frx7yDoh6sfh7T0aFmrmH+tTbv7YjYubmYTsSDeZ1Jp/QpWOGEFADhrSu1FR6IQqx1Yb6LRX6M/bgx59MJgjIun9BEniTAt7Tsa4qH3N3DeqN5ckbsR1r4GZ/+qVZZPbQczu/q8tBtPzL1WLtZr3dDYnkilGZLCMZzQAsCI40lTMjIO/QsYD8O2isqxiuIxg759s/h5tzSZHZNScvf/PkdK+OOVoxALbocew+DMW1rRoN/BLF7Y1eNmvO1mPx39mUxVM6eCEgCt0NFfNA36FapmL2Asq1015u9Wm7WLnNE7VL0ID33d2qpjbSZRUlLCo69/wkfr9/HzL41gUOXLsH8dXPxnyMxuVUesNvxYGFksC8zcXhsPksGUjwchdrwiGXsCPyeE2Ne8/6927BUhRGnzZ6sQorSt6TjeYTSraNDnx3cT7qjBbMGY9q3PtW+liZuVM6ZVthISdkJGq1sLRdX8EQBDR47hpfVBxvbPZWLTRuTiP8Pw8wiedEGrOux8GFbtgre9hr0i2U7leENsvUAx/9REMmYAzwOX6A9IKb8mpZwkpZwEvAa8ngQ6jmvoGa6ZTd1trLueodrBzBmsr0c7pqfFbP2AWXil8bhZ3bm5uVEntVb2H5/swN8If/7yOE764t8QPErwgj9RanD2mpmdtP92fdIWr7V1Lp9Em0zs6ulIC0EVEo+krAQWQgwD5kspxxuOC2A7cL6UcpNTPWolsDtYmVXcXufmeruy+mPG0EP9daUmm7w7ta2/vri4GCEEhYWFlO7yc93TRdw4bSh3F4aQz0xHnPETuOTPjjTqj1mtco5lbNzAzgQWzz3U/y8pKbH0d8TajkLHQqquBD4b2GvH/IUQNwshSoQQJfv3708iaR0X8TION9fblTUeM4tBt7ILu7GVa99TpkyhsLAQmZbOHa+XM6h7NtN7+gm/82tETk849zemdTo5XM1SXOjbdeOfcKO9OznqvcKqbTslTzH/ExvtLQC+DrxsV0BK+YyUslBKWdi7d+8kkZWaiNUkEIvDNlE0eHFuGhmhXVt+vz9q2npy8WY27z/KPVeOYVrOF6TtXEVo+m+hU/e4aIolLNPo+7CDG9OT2beb+vTHvCykS2WoKKLEo90EgBAiA7gWeKW9aOhIiNUubOZ81Z8D91EaXmkwav36Y8ZyRh+E3++3dFDq005X7vPz+KJKpg7MpPOBCtI/vIdwvwI+lWNt6XTTV7NNZdyOldtx0mYURt+CfhxKS0tdb5ATTxRRKjPYRPtFFCJozxnABcB6KeXOdqShw8DIeJy0Qo3h+3w+8vPzWzlfzUIpvdJgB6sIH6tjQKtFZprpwlheSzudk9OZO99YQ6fMdB66YSqnBT5B+PeQdtmDTDrl1FZjZUajHfQLxbyaZ7yEPRpNT3qBoDm7Kysr29T53BYMNpF1qVDStkEywkBfBoqAUUKInUKI7zefuh4H849CSxijZaxCEo0bs1gxDy0qp6amhrlz51JTU+OaBjflzF5Yq/0IjD4IzXQBx7RpYxTQf1fvYNUXNfzm4pEMYD/pK5+AiV+DIae3GiujENEfN2NUPt+xhWKx2PW9wmxMNIGgCUWn9NvxIFYGaydcrWaesUIx/zaAlLLDfCZPniwVIggEAi2+jaitrW1VVv9/5cqVMhAIRM9VV1dHjyWKNqs2zWidPXt2C5r11+np1L53HqyT4+9eIGc8sVQWrVghm168Tso/9Zfy8G5begKBgFy2bFmLeq3oMl7ntr+JGEMvsOuDsVwiUVtba9uu03mF5AEokSY8tb2dwAoxwi4KR9OQjWX1/42LtPLy8hIyxXaKsDEzy1htAamvS7+eIByW/PLVUsJS8vDXTmFy12rSNi2Ac34FXfu3osnYJ9lsWtJmGmb9Ns6urMbFrL/J1lTdaO9tsbbAaU1EvGnDFdoeakewDgC3sdray20WX29WVnOy6s0dyaDXag2AXV36Omct2cK976zjgRkTuW5SH3jiDBBp8OMiyHA3Tm7o02zwbtcmuEF7xt0nuu1EjotC2yJV1wEoGGDU0Kxs2Prfeps2uHNA+nw+Jk6cyLRp0xLK/LW6nc57Yf76Oit2H+HB9zZw0di+fHXyIFj+GNRsgUsfcMX8nejT2tRs7onQnPUO+0Tbxb3Aqd+Jri8Vonbau/1Ux3EhAI6Xm2xlTjBLl6Ax/eLiYrRZkdcMnxUVFdE2ko1YQk4P1zXyoxdX0z0nk79cOwFxeAcseQjGXAn5X4qbJqOpSaMzllTPRqav1elmO02rdtoKbcGsUyFqJ1WEUCqjw5uAvJgTkoV4pr5urtWX0S+I0s5ZjYex7kRM0WOtw8y0Y3cuHJZ8d/ZKirbU8OL3Cjk9vw+88k3Y9AH8tBi6D46rH27oclPWzAzndtztjrf1M94RzDWx0NgR+pUMHLcmoGRrGk7aRLxah5t+6JmNpsVr/63Gw42zMhatNN7FaXZrBTT6pJT84a21LNlUzW0X5SNqttJY/jqse4vQmbcmjPnDsYVZTv0yo9PKDGfmhLerz4ymRDnorZDqTDLWZy3V+9Xe6PAzgGTCrSaWTK1Dr4VqtGkwap3GY8Z6nPpmpfF66auxDrsZgIYnFlfywIINfPuMwfz+6gk0HqrCN+tswl36s/qUByg4NbE+DDMazM6DuRB1Gr9Y24wHsc4i4ulPLHU6XQeKqccCIcSnUsrJxuMdfgaQTLjVxJL5gOrb0ph/SUkJxcXF0YVgbrQnu5mD9m2WksArMzGzsRvL6I+9ULSVBxZs4KzBWdx5ySiEEPg+uBMaDpN27dNtwvzd9KO4uNj0nFdfgZtrtetjhd3M0Ok6K5rjnf3F2p9UXq2cqmjuYyezc0oAeER7MBunc3rTQzAYpLCwkIKCAsrLy6OMSp8OwqpOO7OR5sCMJyWBxoTs+qO1J6Xkr+9t4O7/fc4FY/ry1PfOIjs7C9a+Dp+/AdNvg77j2uR+uNn0xWw/4VgErBsYmaYXpqU3t3kJJXai2Y1z3AzxjEOizb1ODnynYx0FzeNVb3ZOCYAUhpMGpiUr016MYDDI3LlzCQYjC8EKCwuj6RQqKyvJz88Hjm3m4gQjw3aTkgBwrNuqfa09mZbOr14t5R+LKvla4WCe+uap5OZkw4FKmPf/YOBkOPNWR/rtYPXSa34VOyHn87VeNxGvhm8HPePzqkF7iTxy4ycy1u22HjfXuUEiBb6ZQDGjPd5ZS4rA3NZvtjw4VT8nYioIq2X0+pQGepilU9COa8vyvSzRd5sqQUN1dbVlWgczWoz4Yr9fXv7ox3LobfPlrf/8QDY0NDQ3dlTKx6dKed8wGdi32ZFuOxj7ZPY/1noTcb3Vf6fjbut2k9Yi3vQNHTn9g9tnvSMBlQqiY8KLFgq00M71Goumvet/u404chtVFAxGEs9dddVVLTJbGq8za7+xKczTH2/mkkeXsL2mnse/XsB93zybrKwsCDfBGzfDvgoar36S0i8OxKWNGftk9t8MTqaCWDR0fV1GM4/dTMlNfWbX2NUbbx+s2ksEkql9W5m8jkcoAdCB4eQ01C8Y06C36RuZt/7bqR0rwTBp0iTy8vJa0WD8r13XFJa8VbabCx/+mL+8u54zR/TkvVvP4fKCQZEyUsLbv4B1b8ElfyFz9CUJsQMbGZQdwzJzpFsxyVjt1JqpRi+E4lk0ZhdS6lSvk6/GTftOdHitry1MMB3cpJMQKAFwnMCKERmdgNqLrT+u/23nFLPSKvX1mdFgZGo+n4/D9Y28ULSVLz20mJ+9/BlZGek8fcMkbh4j6dkpPVKBlPDBPbD6eTjrF3DGj1u1Gw/cMHX9MbNZgxlidfQamXKsydSchJBdvWbKghcYhXyihHWi1/o4+ddOFKh1ACkCvVYcy7X6NQDG6X5+fj6VlZXR81pZjenohYLP5zNl7GPHjqWsrMx2e0GnPtQcqePFD1ezzt+JDzfsJxgKM2lwd246eziXjO9Hepo4VkcoCG/dAmX/gcIb4fKHwRB5E8+YWdVhVqff74+Ok9nYJIo5OfVHf14/i0u0QLRaweyWduOsyisNyTK3mLXl9p4mk85EwGolsBIAKYBEMBLNTGFkVGaMwmgC8vl80U1kNPu9ZqvXykNkfYFZ9IsVzXXBEKXbD1G89SArtlRTsq2GxiZJj5xMrp40kGtPHcjEQd1b9cMXrodXvw1bFsP0OyObuxuYvxVTthqbeJmlFVNLFiMIBoPR8QeiQtntGOjrsetDLP0xExyxLjpLpEA11h3PGBnPtxWdXmlxW14JgBRHvA+oXlM3C9M0MkE9Q9H+19TUsGXLFo4ePcq2bdu4/vrrW8wIzLTl0tJSxoybQJU/xJb9R9m838/nuw6xYa+fLw4cJSwjvHtU3y6cO6o354zII61mK5NPPcW0D5WLXmJMxcNQuxtx5WNwyg2mfbHrq7FsSUkJo0ePjs6CYtVM7V76thYEwWAk7LegoKBFimqvz42xD4liZm5mUrHUkwi0BcNOhuD3SrddeSUAjgNoWqjVTbYSDBDR3idOnNgixl1jKD6fj5KSEqSUFBQURK/1+XyUfPoZ/YeP5kBdE1WHG9hzuJ6qww1UHWqg6kgDVYfq2e8PoH+MeuekMXFIT0b360Ln+n1cd34hvbp1tqWT+oPw4R+RJc9B9yFUjPkFI8/7RszmJn255cuX4/NF0l87CQynuqyYfzI0QuOsJ1Ztva1mMalsFrG7d6lAc6Loa7MZgBDiG8BVQBMggLeklI57+gohngOuAPZJKcc3H5sEPAVkAyHgJ1LKVU51ncgCwMrO7+aa/Px81q1bx5QpUwgGg5SXl1NYWIi/roFln31O3sDh7DnSwJ7DAfYcaWDDjr3Ukc3e2gAHagOtVpB09qXTv3sn+nfLbv50YnjvzgzvlcuwXjlkpckogyouLrb1GxDww6qnYdljEDgCp/0QzruTYFp2Qh587ZzZmLl5ubwImkT6I5wYgpXQaSsN2ok5JUvLTrTPw/H5TAKSoUAkQgA8LaX8oe7/41LK/3Nx3TmAH3hBJwDeB/4mpXxXCHEZ8Bsp5XSnuk5kAQDeH34pJTv2HeTjT9fRlNOTffWwZX8t63dWcySURs3RxlbXdMnOoF/XLPp1zaZv1yxE/SEmnTyMwT1z6d8tm37dsumSnRk/zQe3QfGz8Om/oOEwjLwYvnQX9Jvgum6tfjCfFTkJBaeZVDJt0nrt3qo/TnXE48S1a8NqbM3MSW5npU70tYW5ymy8zPxaVnS3Jdq6vUQIgOeB/wI7gEHADCnljS6vHQbM1wmA94DnpJSvCCG+DlwppfyGUz3HqwDw+/1xmSYADh2pZU+dZO2uI6zddZjPdx9mw55ajjSEomUy0gRD8nIY2C2LrKY6Rg/tR1NtNaeNH8ngXl3o1y2b3KyMmGYbruDfDxvegfJXYdtSEOmRzVym/hQGT2lZVDcmbkwvGp1WzNsLc3LDRON1KJs5TfU+Da+2fbDvf6ywmj3pafRiGtP31c6BnWinu5cZUzKdvLHC6zgkQgDkANcSYf47gdellHUurx1GSwEwBniPiCkpDZgmpdxmce3NwM0AQ4YMmbxtm2mxDgst+sZsU3QrBINB6oJNrN52kFXbD1NUuZ+K3UcIyUikTI4vnbH9u3Jyn86M6NuVwd19+Hdv4bzTC+jRrWu0DruXt6ampsWCLojhZWysh50lsL0IKj+AHasACT3zYeL1UHC9aS5//Zj4fD7Xzlcr5h2LM81J805E1JYdI/JieiouLkYI4SlCy00ZN4pALM5xL4LDqt1Y4NRX4zOTDCevlxme/rjX5y9mASCE2ASsAcqAUqBMSrnVVavH6hhGSwHwGPCxlPI1IcR1wM1Syguc6jnRZwAb99by5uptfLh2F5UHQzTJiFZ/ypDujO3XmVOH9WLcgG6c1KszTaFGioqKmDp1Kj5fJMzTKY5fQ01NDa+//no0CkhjMHonaquHUErw74Pdn8H25bCtKPI73AgI6D8RRl0Goy6FfhNbhXVq0B56NzMAu+uNx8A+xUMinKmJQiwCC+y1dKtrnNpxU87N8xuLM1Nr1020Vzztup2VJBJuBGcio87iEQC/AoYDFcB44JvAF8AbwB+llK0Nya3rGEZLAXAY6C6llCKSV/ewlLKrUz0dVQDEwyy+OHCU+WW7eat8Nxv3+hHAuAFdOH1Yd04b2p1OR6s4o7B1SKXf72fOnDlcf/310bBBfRy53QtfXFxMfX0955xzTlQb0juPfSIM+9cT2l1GxoENsHct7P0c6g5EKknLJNx/EmnDpsGQaTDkdOjUw3GMwJ3t2wvifdES0X4i7NWxtu1kvwf3AQWxjl88Y+xlvUc87SZa8/cy27Aqn0glIx4BUCqlnKT7Pwn4HhFfwFAp5c9cND6MlgJgHfBjKeViIcSXgAekyW41RnREARDLwy+l5JNNB3hmyRaWVkaY6uQh3blq0kCmDspmQF5uC4eh1UOkaWb6Bw5wjHzQGH5u585waDvsqyC0u5yD65fSK7QHUbMZZFOkcEYn6DMG+o6DvuOh33iCvcdT+vlG105MK4YU7wvg9qVuK22+PW3JbswssZic7NqyqytR9Xv1lyXbmau1aRdg0FZrMewQjwD4GPiZlLJcd2yllPL05m3GTnW4/mVgOtAL2AvMBDYAjwIZQAORMNDVTp3oiAIA3D+E4bDkrfLdPLl4M+v31NKnSxbfmTaMK8b3Ye8X68nPz+f1118nPz+fwsLCVit13URr6GcCLWiqq4F9FbC3gqaqNdRtLSG3bjsieCxrpOw2BNFvPE29RrOlrjNDT7scX9+TIS3dss9GLQdoxfStyrnRLJ20znjMB/HAKwO2Oua2HeOxRC0gMmvHrd8gHv+DGez8Zalgs3dbtq21fTPEIwBGAy8Rsf+XAqOAyVLKqUKItZpWnwx0VAHgBmU7DnH3vM8p23GIk/vmctPZw7lq0gCyMtJbME4tqZuZ9qCVMaKVhuavwXdgHexaTdOOYtKrPoPDO45dkN2dpl6jSe8/AfqOozHvZDIHTIDsri3qNLZnpgnqaTM6K52Yl1V/jOWsaIjHfGAFt1N7Ow0QWgs3M4HlxnfhFMrqtV9u7kk8gtkN7XYwmwEkQ4O20tyTPbvQ05MUH0DzxelEIoAmAtXAv4lo7rdKKf/kmoo4cTwKACklsz7Zwv0LNtCzs4/bLhnNNacMJBRqtGQmnqfvDUdg27JIbp0vPkHuX4eQ4cipTv3IHHYG6YNOhT7joO9Yglk9KS0rM33hNaakHdcYltXMwmh+AudoIrcPt53AsRsrMxrcwM3UXj8eboWbVlYTWPqV2sbonkSabrz2L9GML9G0J8Jn4tZUmAihE49/yE3b+vpVKogUhJSS3725lpdWbufS8f24f8ZEumZnOppHHDWwQADfwU2wbl6E6e8sidjsM7IJDzqdXWkD6VVwMeuO5HDyKdNscwfpfweDEQdxKBRi6tSpBIMts4la+Rbi7Y8XOGnobmYhbuo3u07PwO2EgJ3Q0kdraWWTaStuT63WDMmiJ5axjdevEa+J04n56+u3EgDtvs2jl09H3RLSaju5v7yzTg69bb78yzvrZDgcblHWzbZ9GqLbLx6olI0f/lkefXCClDO7SnlPdymfOU/KD34v5ZaPpQzWy0AgIJcuXSpra2tlIBDwvP1dbW1ti60oY9lq0LgdZFttt2fVNzta3NZrdZ223aXXbTf1v5ctW2Z5fVuMVXtvd2i39WUs9ycRdLhtMx7anN6XeLcp1fhCIBCw3BKy3Zm6l09HFAD6G6m/iZ9s3C+H3jZf3v5aeQvmv3LlSlldXd2qHqs9dqsP7JcLH/+VbHz24gjTn9lVNj17kZQrn5Gydp9pPdXV1ZZMys1Lp38oY9m3Nt49bd2Wd8M8ErV/r9m5RO8tHO8ewVYCMRH7IcdKl9a+1fPtVYDGCq/vgJdysdJoVFT0DN0K+jLaNcuWLZPAaqn2BE4+fL5jO0eVNu9AFA5L/jD/c07q1Zm7rxiLaF4U5fP5yM/PZ968edTU1ETrqKmpYe7cuS33cW1qJFQ8m06zz+OCfc+QcXgHXHAP3Po5oW+9BafdBLm9W9CirQ349NNPo2YK4xRUo9dueqmPJiouLm5h3w8GW2+fqD+nXW923ApW9dmVd+pHPL4Ap+u0c279GFY0mZmKzMbUzdhYldOPk5u6vNyD0tJjO85ZweeLb+tLr8+GHa368XdjCnJbLlYa9c+BNkZWu/bBsSgp/e5/Pp8voulbwUwqpOqnI84A9NAk90fr9sqht82Xb36207ScpqFrGnarWcGmhVL+fUpE239impRlr0gZCkbbMJtx6OteunRp3Fqj9m3UnPTmJeM1ZrONRGnqVtqSVVk3ZqhEzx7sxsQNTW0xA3BTJlaTmaZ9mj1vbvpm157Tc+4ViZixJnrWa1WHmxmAsTzKBJQ6uOP1cjn2rndloLEpepOMDMuUEdQfknLu9yOmnkcKpKx4SwYaGkxfJjsbtJcHWv+SmTEq/QsYCATk4sWLLQWM8ZpEvcBGmtzY352m/E7MzisztCpvJhBjqb+tEK+JyOz+Jsp04laIxIO2MAclA0Z6rASAigJqB1z26Cf06pLFs9+cRGlpKUOGDGHBggW2CeGCezfim/NV5KEdiHNvg7N+TjAsKCoqIiMjo0X0jVlMuRtYRa0A0Q1jpkxpmbXT2L6X2HWzcrGGORrjw2ON7nE65uW81/LGsYHEZcOMB/GEK8azVsBrW221wjaWsGS7aLFkwU0YqPIBtAP21QYY0C07avPfvn07V111lemDEgwGObprPXL2Zcj6Q6w74yGC026FjCwAMjMzo7t6adDsf16Zv5WN2OfzUVhY2ELIaGUzMjJatG8MWzS2odkz9eWMNGi+jpqaGlMfgxFa+KVmE9bo8AKz8lb9sLrGycbr1qasjYMRxvFJFuKJVXc7dvHCzB7v1kZvhNk74FRGX05/n+L1T8QKt4JHCYB2ghCCYDBIZWVlVFM3PizBYJCSlUWEX/02PhlAfHc++efd0ILZ6lNC6BGLZqrXPM3q09epCZgpU6ZYriMoKSmJMiv9S2F0+AWDwajjSnN2aRlJ6+vrW5TTj5HG8LXYeyCuF87sunidrG5oMZbRLwbTw4vD1KovyYDWTrJzINkJcbdw6wh3Em7a+2E1Bm15Lzw5nc3sQqn6cesDSBU7nBUueGix/P7zK6WUzrHHDR89GLH5r33dtK62dkSaXa/Z+O3s94FAQL7//vumawaMfV68eLGcNWuWrKqqanHeypls5kOIx0ZtHAerMm7r0v93M55e10W4tUfrxy8WG3UsNvpAIGDp+E0kYvENeLmP8d4Dp2vb2l9grBsLH8BxNwNIRFhYWyO/T2fKtlU724SPHiat6O+ET5oO4645dlynAXsNjzSW10+TzabMZnVrs5fly5dTVFTUwvSiv0bbQ8AY1micpk+ePJkrrriC+fPnR2cCALm5uabjo5lH9DMWbXZhp23ZhVDamQvcapFmGrubkFoz04WXdszOjx07lvLy8qgJzas5JFZN2MxcaHVtrLAzrZjNEmMxxziVjWdmE6tpyi0s+IrpBhzHnQBo68FNBKYM68n+ujBVtce2UjB9mbZ/QmbwEGln3WJazmtfrcpbMR+7F9zn8yGEQErZKua7uLgYv9/P1q1bW7RjFBTasfLycnJzcxk5cmQLR7KbPmjCwMo0YsUAzMavLZ4ZN3WaldHb+WNhlrm5ua0YsZNPw0iT0aFqvNbueXLj7I6lX3qTn9mzYnZPncwxRsQiLL2ireq2GVvTaJ/jTgBA27zIicRF4/oCML+8KnpM7xyN3rwti8DXBYadDSSGaXkp7/SCT506lWnTIrmE8vPzowxYW9im7Sim0a5fOKZnKFLKaH0QiTgyltFgjK7Q6LN6wfVlzBY8OQmc9oB+QU88zNLO0e5WCOivSZRTMx4lTc/QrfpipeB4ffbdoC0tDmazGSd4HdvjUgCkOgb1yOG0k/L4z8pthJoiWTmDwSBlZWUtX7KaLdBrJKRntmJaZkgGIzNqgBoD1TuzR48ezbx581o9wBMnToyGkeodwloUkdYvbVahOZH1swvttyYk9Azc7qHXZgpGB2WqmAz17efm5kZDgmNhll5mUG5gpUXHK5y80K0/b9Tu20qItwXD9QIrpcXNdSY4MUxAHQXfPWMwuw41MO+zY3n4hRAtH6j6gy22UtRHhtjZsxMFI/O107j0Yad5eXlcddVV5OXlRe30xcXFlJeXtyhvvE6DZrbQZgaaeQeOMW7ZvH7FSksyhkpqdBjTV7h9gdsy9NJsXPVj4pX5t4X92sp/45b5uWHuGt1ubPt6GhL17BtnmnEy3ITATNh5RXMfOpmeNPMMp+rneFkJLKWUTU1hedHDi+VZ938o64MhKeWx6IPoquDnLpNNz14UjaxYtGhRNLLDuIo2UUviNWiraaurq+WiRYui0TxuI0OMUQ7GiB63q4z15Y1tGH9r11dVVcnZs2e3GiutjJdMnRrtWn1thXijShJVV6Khv69O4+cUieYl8icWOpOVpTbRcEMzKhlcaiEtTfC7K8ayo6aeZ5dURo8XFRUxZ84c/H4/Tbn9aNy3iWAwyMSJExFCRLVoTaM12mbNZgZmsNNojXntfT5fNJrHzXTbzIGoafDGMhCZHWgrvK38G2Z2Xb0Wr5mDxo4dG11Yp2nRxjq9xmdrJplkaHpWsBpzK0e93TXJghYQANZOej205ysWTTfee2PWbqr7EqH1zMlm1mKe8sFMKiTyAzwH7APW6o4VAEXAGuAtoKubuo6nGYCG7z23Qo767dtyy95DUspjGqqUUjYueUTKmV3lqg/ntdKUNehj5pcuXRrNJa8dM9OmjBqtmWau19aMCaaccuQ4HbeK7XcqbzeDMJs5eNXqnLTPWOLoY12f4KXtRNHrpl6v1+ufx1SPnW9vxNo3lzOA9kkGB5wDnGoQAMXAuc2/bwT+6Kau40UA6G/S9uqjcuxd78pvzCqSTU3hlgX3rJVyZlfZWPRM9JDdRiG1tbWtNiSxSjJnzBtu9RB5YaKxLnyyK6MXSFZ06De3cRIk+oVpZrBjVl4XH2kLotyanBJt4kgFhuvUdy8ml/YUZm2NthZw7SYAIm0zzCAAjnBsO8rBQIWbeo4HAWCmrb64Yqscett8+cLyL1qUqz1yRB784wgZmnVhi2uNTF2v/dtpnVYPmZsXzy1DdLOxhxvt3qwfZmVra2vlrFmzZHV1teMK1EAg4Hje625e+uvsZjZOgikVNdxE0GL17GjntD57FZJeZ2LxZJ5ti3vi9D4luk0rAdBePoC1wFXNv7/aLARMIYS4WQhRIoQo2b9/f1KIa0uYhXbNmNSPs0f24t531rF+z5HocYRg36BLSd+5EnZ/Zho1o9nXCwoKogu07OKenRaCWdlojbZFs5hwjRanCCVjGGFNTU005FNfVltlrLfxm9U1cuRI04VPxj75fD7bFapuFw0ZI47M7McavWb3wsxuC8nPneOEeGnR982q/knNye+s8h+Z1ed2PYLm59L7m7zG1bdFdJ3T+oWkhiabSYVEf2g9AxgNvA+sBmYC1W7qOR5mAEZokn7vkXo55U8L5fQHF8kj9cGotrJi8fsyfO8AKV/+hmMddsfiNc/oNS+rmYgVLcbr9ceqqqrksmXL5Pvvvy8XLlwYrV+v2Rs1d2NEkdPmL4sWLXKl/bnRurS+GzftcTKb2bWVaNOPWyRjtuHmebDaBtXpOjtYRW4Z23V7z2NBPPfV67VO9ZFKMwAp5Xop5UVSysnAy8Dm9qCjLeFWemtSv0+XbP7+9VPYXlPHba+Vk5mZic/n45Sp5yLO/Dmsnw/bWufd0dehb9ssMiSWvDT6c0Zt1SkLqbF9o+a7fPly3nzzTUaPHs3kyZPZunVrVHPOzc3l2muvpbKykmDw2OpibcGcfrWw1axD+66srHTUGp3O67X9sWPHUllZSX5+PnAsisnN2gKzRWt2Mw19vVZw+6zFGuceD6zGQL+oURtPLzH3TrMT/WI64/Vau2apLtz2wQlO4+tUp90zYTbzNmvL1b01kwqJ/tB6BtCn+TsNeAG40U09HWUGEI899+mPK+XQ2+bLh9/foKvwqJR/HS2bnpgmly1ZLBcvXuxKA7L7Hyvc1qOfJVhpu7W1tXLx4sUtopasbOXGGYjVbEDftr6MWV1mtJr1w+x+6m3Wbm3Ldu2YQfPtxDprcyoX7wwgnuu9+qG8ws4X5XX3t1jRVjOsWGb8tGMU0MtAFdAI7AS+D9wCbGz+3EezQ9jp01EEgJSx3/xwOCx/9WqpHHrbfPnGp8f2DA6Wvy7lzK6yYeG9pouy9EzOjAEmYiFTLAzMbItI/W/NlGK2aMuqfb2ZyNgvJxOBVRtWL5Wd8zCWe+zF2el2rN3SkUiG1FZMMxFwet6t7mW8JsJUGws9Pe0mABL56UgCIB4EGpvk155eLkfe+Y5c9UV1VBPc+49LZfgPvWRgZ3mLF1B74I12aT0SMQMIBAIt2nCCRrfZOgJ9yKq2Ub2ZNm9s3yjg7ASfVR2x+C7s4PXFTwX7fyKQyvR5fd69KB9259tytXg8sBIAak/gFMWhuiDXPrGcmqNBfjctl/Mnj2Zz2QoKV/0U0bU//OADgjI9aivUImiMOfSNe+VaQbOL2p0vLi6O5vh3qlOzS+bn55OXl9finN/vp6ysrMV+AUuWLKFTp06WUTpaffoIKr39tqSkhMLCyJanxvNaGWi5t7Ex6iKWKBxtXJzy31tda9Wu0/1ob6Q6fbHAGHFmdd4K2gp6pwiy9hg3tSdwB0P3HB/Pf+80fBlp3L/yKEfCWRSceQHi2qdh71qa3rm9FYN76KGHooIAIg+kllbCziHkxiGohVBabUFpVt7KuadtJamvq1OnTq32Njarz+oFNaaFMIb7af/NQkXjSbQFEAqFYrrOKnw0qWGAMaA96WvLNp0Sy7lxPDsxf7fjlqyxVQIghTGkZw4v/uB0QmHJDc+uoLq+ieDQc9k1bAbpnz1P6LNXomVzc3OZPn06Pp+vRbbLkSNHAvY7HFkxQLN4dy9MUnshrKCP6LDaW1hPi7ZXsBYLblaXWYSHJjy0fERm+Yzc5gUyQ2ZmZkzXGdtN1JqAtmYw8QrMWKHNtswi4bzUYYd4+2b1DnmpO5kCVgmAFMfJfbvwz2+fSo0/wDdmreBwQNL7a48RHnQ6GW/fQuO24mjZc889F5/PRygUIhiM7LQ1efJkR0YM1qGkidgExE3YmhlTNp7Xh19WVFS0WOijmX/04YV66MfAGI5qBqeXUC8ctQV4Xq4zg55BxMP8zQSk/nwiGEw8AjMeAaVtRxoL/W6vi6dvZu3p74XZc27WfrIErBIAHQCnDuvFs9+ezJ7DAb72TBE1wXTSrn+JcKc85MvXc3RPpemKSykj+fS1B9CMEVvB7apYO1jFW1uZPqzMNho0WvLy8lpll9SYplm9+m+9hm03Jk6x/MXFxezZs4e5c+e61vLcxGvHOs766522x4TErzp2y1zdlLMSYpqgj+WZtHrurMrCsZXEsQocs3thVpcXc5Pb99c1zDzDqfo5UaKA9NBHHazcUi3H3vWuPOeBj+QXew/J8oUvy/Cf+kn59LkycKQ6GgmjRdRUV1e3iBDSr7Z0E80Tb5y3MeeR17BKszLGiCK7kD59ZIZVu8aIHKe4e63c4sWL5bJly6Jj6mV9hPF/POGUXsJa7Y4nAokMR3WbRM7L+gu3z5x2X7X3xm07du1b/fdy/43vj9XeGWZAhYF2HOhvqjG0bGXlXjl+5gJ55n0fyso9h6Rc/66U9/SQTbOvkKuWfxINc1y4cKH8+9//HmX8ixcvlrNmzZLbtm1rIRSMber/x8qYjA+lWfx+LHVrL6VTJlNt8xw9w3fzomjXun0ZtXJu1lnYhX7GE0bq5fpkh23G8+zYXW8m2GOhxer50ZQALyHP8cBL/UaFSvvtRKcSAB0ExpupT+usnVv9xX458Z735On3fiA37DkiG0tekHJmV9n0n69LGWqUgUBALly4UP7tb3+T77zzTvTaTZs2ybvuuis6M7BqU388FuZkp5F6iZc205SMOWPMGHttbW0rRm6mNTm16Qb6+2Q8bvaCxir89PXGcn28Mw1jXfG255YhW11ndt/jFThmx5ItNN20aab9qxnAcQTjzTQzYVTsPiyn/GmhnDBzgXz+7U9k4yePSTmzq5Sv3SxlU0jW1tbKbdu2ySeffFIuXrw4qs1s2rTJVZvaMSdmbgY3W/85nbfSzqzoMCtrnCloi8+8wIkZGRe66Y/rhZC+T4lYke2GPuP5RKwq9iJI3KZjMBPUXtuOReCkItyOrxftX0prAaCcwCkIqwgWfXTImP5dee3H0+jVJYt7l9fybu6X2Tbi21A+h6a5P6Dss0/ZuXMn1113HRMmTKCyspIhQ4awdOlS0wgRq4VIVs5aq+ggLVzTycHsFH0Dxxy1ZjTq6bCic+7cudHzY8eOpby8nLKyMteONDfRQqFQqFWdPp+vRXpu7ZjesR4PvEQc6ek33hcrJ7FZfW6c48byVs+Bvg6zNu3i8O3a9up8TzV4cVQbQ5zdJLUzhZlUSNXPiTID8IIaf0B++fGlctjt8+U9L34oGxc/GDEHvXyDDNT5W2mddml33WoVTjMAN9e5rd+oRethtzuadt543GiasbL5GzV3bWtDs7bM2klWnhwvMwAzk5qb2V08Ziev5RJpdoyFlvaC3azI7hr9+203DqgZwPGJHp19/OcHZ3D+qD7MXlPPg/5L2Tr6h6StfwvfmzfhS5PRzd2DwWOpkYEWmq1eS3IKZdRrH2Zw0sKctBz98ciza56uWZsZWfXDLBUwtNQwtfr1dBppBWhsbGT16tUtFtlpKCsraxXrbbbuwi780+y/G+hnU1bhrPqyRhqNszEzrTzWuHS35Y0zGq9wQ1+iY+oTNZswG2OzkGhjef1Y6Rc5er5PZlIhVT9qBtAamrRvDDXJ218rk0Nvmy9v/tcqGVj2ZGQmMPsKWbL0o2g5zRegbaGoRctI6c52H09K4ViddMZZjL6e6upqOWvWrBYpsp2SvVnZxfX9M4b/aRqWmbZvlvHUODsxjp3TeTv6jceN+w570dhj9fO0FVJZU9fPIN2GlTrV52YDJjehn7H6ANqdqXv5KAHQEsYHIhwOy1lLNstht8+Xlz26RB5c/ryUv8+TTY9PlTXbKqLMQmP+2rcXB2UiTAOxwPhC6Ke8VVVVtozUytRjVlZzFM+ePTu6W5k+EstsjIxmJa1eMyGib9cqosms73aMQn8PY2Hcdu0uWrQoJTJcejF1tVX7+j2nre6F1/fBrZDWEOu9AFZLZQI6vmCcNgoh+MHZw3nuO1PYVl3HhR8NZPOFsxEHt8I/L+Rw5SqEEPh8PqSU0X10NQelcdWi3qxhZVKIZUVmrH3VvvVT3rFjx7J9+/ZWU2ljm42NjaZ16un3+/2Ul5fj8/m45JJL2LJlSwuTVW5ubrRto8lHW3Gtn5brdyLTMkVq9ZklyrMbR7ud2vTOZm0HMTf3xOyeGs+vX7+e1atXJ8WB6saZHcv5WNo0QhtnLZGg1b3w+j64WfGrN5E5BVjYwDTtsxIAHRxmNsPzRvfhlZumkJ2ZxmVvZ/LRGc+R40un17xvMKnHUXw+H2PGjGkVNaN/gP1+fzSKxmppvta+dr0djLZ1/XGv0EdF6Zmyvq7i4uIo7eXl5a1s/cb2g8HIVpONjY0Eg0E2b97M6NGjmTZtWosX3irVgvZyahEZGl0arcb0BW7TGfj9fpxSoJulvjD20UvEj4bc3Fy++c1vMnXq1DbPS2NHjxufUaypvL0IDivGbywTr7C0osutb8kLlAA4DmB8AYLBIIe3r+e/N51GweDufH9hE0+OnIXM6UP2q19j8yt38uorr7Bnz54oYy8uLqaoqAggGjqp7alqldPEzPFqBmNop9HpZ5W4zKnPdk7KUCjE6tWrASgsLGTatGmtaNILOYApU6YwdepUgsEgoVCI9evXm/bDrD39LMHv97fS+LUyWj36/1bQCyUv46K/PhiM7L1s3FvYLdM07i/RVvASGACtczzFSmN75USyg9NYWOXMiqVNJQCOExgfFikleZ19PPetU7h0RCce+bSRG7iXfd1PZczmWVwefo+N69YyduxYAAoKCsjMzKSmpoY5c+ZQVFTUok69xhoMRjZg0SJirCJK9LQZ1zHoTSGxTGv1wsMscmTChAlRrd8Y/aNn5DNmzMDn80W17GAwyLx585gwYUIL04pWj6bhW5kAtD0YSkpKomNrRreVpm6sb8qUKUyePNkVk9Kbg4LBYIv7M3r0aNOIH6u22wNuGbHx3sdq+okl4sisHj1inY0Y4Xa2o58VOIyFMD1q5hhI5AcYDCwC1gGfA7c0H88DFgKbmr97ONWlnMDuYXSCvl2+W46/e4EsmPmO3PjSL6Wc2VUeemiKrNn2eTSPjX6LRjdONzdOVTtnWbyJtswcnto2lIsXL24RGaSdM6NLc44bI36s+mcWjaSH/nqnRG1OkSV2Y2rljNTOac5hN05sq+OJgtu6vJaLh0an++iGhlRZ72FXJhAISKBCtkcUENAfOLX5dxciG8GPBR4Abm8+fjtwv1NdSgDEh01VB+Wlj3wsh942X774z0cimUTvP0lWr3wlWsa42MlteKD235hgzuoFMSZ2MyKWSApjhJCXiCUzgWCWT8jITGOJTtHTu2jRohZRPGbXGIWY1r4ZjXZ90l9vbMtrWKoXuK0r2QzVeB+dBILdvYyVBi+02pV3qgv4VLaHAGjVIPwPuBDYAPSXx4TEBqdrlQDwBjMGeMRfJ+9+o1wOvW2+/N4DL0r/w5OlnNlVBubfJgN1/ihT0WYE+rA3jTEak63pNXqNqdtpaEZN2+x8rHHsbjNyuqlX/9GPhVvN0apves188eLFnhLzGWcgsWjCVkw+UTOAeBhlMssZ76+WIdftTMwLHWZte8kL5dQPJ+XGagaQVB+AEGIYcAqwEugrpawCaP7uY3HNzUKIEiFEyf79+5NGa0eH1WrOLp078fsvT+CFG09jTaAPU/b9lrI+X8ZX/CQZL17FlJF9GT16NOXl5axYsYJQKBTdhlFzjkLLFbR6B6hmUzeupDWjS18uFgelvqxWt50/wY3T1VhWc46vXr06utOaFgZqVp+dY1zrp5SSYDDI6tWrkVLahtZq1xQXR3Z+0+cS0nwRsTgezXw3bn0xZitU9eesIljcwG34aqI2n9H8ANqzm5eXZ/rsmT2T8Thgvfi/nMJ6XTrQ601PmkmFtvgAucBq4Nrm/4cM5w861aFmAN7gpDV8sKRIfn/2Cjn0tvnyob/dJ4N/6Ceb/jxIbvzfX2V1dbVctGiRrKqqkrNmzYr6BYzmCn192sxB++/WNBFrimQzTTbR9ly9OUmfT0mbCZmZZ8y0cr3JRptd6cfLrl9m6a2trrH7rf03rgA3a9dO43UygcVrwnE780tEXYmg1euM1en+xFq3HWjPXEBCiEzgNeAlKeXrzYf3CiH6N5/vD+xLBi0nEpy0hrNPP5VZ3zmNB2ZM5J81BVzReB976MPIT/9At0W3k9FUh8/nY+TIkdFwQP3CMSO0mHtNo7GL69ZDHz+vr8sOxpmEMcrIC4x16I9rC840OmtqalizZg319fWUlJRQUlISXW9g7IdxAY8+Q2hFRQUTJ05ska9I0yT1IZuaxq+P7jGDWWitmQbs8/mYOHGiaV3G2YSdJmy3jiGWeHz9bzfafaJmFImI1nE7Y9VmckVFRabhq8YZhVnodMJhJhUS+SESfvQC8Ijh+IO0dAI/4FSXmgEkDkaNYlPVQXnpgwtk/m1vyrkP/kiG7+kh6+4dLtfMe7yFlmrmJNZrjk72fzPEmk0z1hmDVVtmdBu1+GXLlsn333+/RW4gN7MPq5mFdk6vWWt+AaON2O24aHZss3uht/db1RXPpjVeZ2FmfYpX27WqIxH1uoGdXV/vSzJDosdBA+04AzgT+BZwvhCitPlzGXAfcKEQYhMRp/B9SaBFgWOaiF7Lyu/Xndd/Op3fXTmeu49czfWhezjSmMb41XeQu/ReaKxnz549PP/88xQVFVFTUxOtR6+xlpeXs3z58hZ2S6ON1Phbs4PaLewygxetyM3qSqfY8tzcXCZOnEjnzp2jbZvt1WDWtvF/WVlZdPagTx/h8/nIyMgwtRFbzVKMdVdWVpKfnx+dvZjFzdtp8LFsug5EFxRq/XIDq0V1ZnBrZ7fyv8S7QMupTaDV4kIjcnNzo+kkzOBmHBIJIaX5EvlURGFhoXRaFq/gDM3MYFzopOGLfYe55cWVbNzn5+Eer3NZ/VuE8/KZ23Qhu0U/rr32Wj766KOowxeOPaxaPp3CwsJofSUlJUgpGTNmDLm5uZSWlkbTJGj0QIQBmzEeKyeYUci4mYLbldHO6781mvR91OgtLi62fZm1ssXFxYRCoRYpFfRM3dh//XGNWVvVbTZmxn5YHXOC17LafYWIuUzvYDajz0ubZn21u/9+v7/VuHnpjxOMbetpM2s7lnoTWV4IsVpKWdjqhNm0IFU/ygSUODhNLxsaGuR/irbI8Xe9Lb9151/k4T+NkOGZ3WXdm7dKGfDbZrI0mjQCgUCLEFF9FlInmowmAjMHqdGME8/U2YwmM+eu3iHuBL0T14sjV5990i29sR43KxdPZkv9WOn7YFevU5vG+u3SJCfCcWpHR1uZrbzQbWa+tAIWJiA1A1Cwxd5Dfh75aAtvr1rPPTn/5drw+4S7DmZd/g8Zev73ohpPZWVli41ntOOaJgjHtN6ysrJWGrEZ7DRys/rh2GzDSTM3tqH91tev18z1zl2zWYGbdvTX2mmr+v56aUN/vdXMQN8XuzBWr7MFO1qMs81YZgBWZa1ojZd2qzH0Un8sNLi9xviMmM0e9fVYzQCUAFBwRDAY5NWPinlxXYgu+0p4uNM/GRzexZ6+09kw7Dus27aPL3/5y2zfvj1qtzZmLSwuLqagoICKigry8/Ntk4zZMUsjw4ZjOXg04aMdc9MvM7OCBv1LZfxvZmKxa7empoa8vLxWETmazVgzp2k+Ea8CRqPByjyib6+8vJzGxsaoANYzE02AFhQUtDDRGct5oS2RphdjvXZM2th2W5lX7GjTmzoT1Y6VUIVjyoreBAfWAkAlg1NwhM/n48tnFTBzajYXX3o1Vzbdz9+brqX3vqWcXfYLzu2xh7wePVqEB0LL5GvaPgRaHnwr2IUhmmnr0Nrx5kWDMoafanRDy/A7vbNSPxsJBoPRlM1m20VChPk/8sgj7NmzB6BFWf3iuZKSEsrKyqJ2dC9OS6OTU6O7pqYmGnqoCcmJEyeSkZFhGipaWFgYFdTavdM7kGtqamz7GitiqUvvwDerS983t05g4z4PscLMiW8Gt3QZz2uKu/5+a+OhfwcdYWYXStWP8gG0LzQ7497D9fJn//lUXnD7U3LNPYWRrSefu1zKvetalDeGTRrrsYI+KZ3+GrtwTX0yOzfho1aLmcwW6tjZrI2+CCtUVVW1SKthFiqo9SHWJGVmoabazmYLFy5sYYvXfDLV1dWmG4qb2bf1oalufS1u7PpebP9O9bvphxX06SASBTf+G7fPq5WfzcxvZTyH2hJSIdFYtmm/vOShj+Rv77xFHpnZX4bvyZOhd+6QsuFItExVVZV88sknHRmkEWbJ4qweeiMjdgMrIRJLvhc3bQYCgWh8vxmt2vmFCxfKWbNmucppZPXi65mz1p62FagemjPeuM2hW6blZfWr1XGz9QrGe+sUN+/1ftnBLBdQIhy8RsTi8HX6baxXf85KACgT0AmOeKbx0/J78dYt5zLqylu5UjzGK6GzSV/5OE2PFcKauQQDATZs2MCIESMAdyYN7XxeXl50Qxo9jHHj+th2fZ4cJxjDVzXbu5lJyMlR7TafC0Qc4ICpeSAjI4MzzjiDK664olWIrL4e/foBvblDM/UsWbIkuiOaZhooKChg/fr1LerLy8trtc2hlUnCaFoyi9+3gl3Mu357T61vevOSZj40g9Znt+25gTEXkFsTjVd4GT+tvBk9Zs+qp1XxZlIhVT9qBpBYJCpcTkopDx0NyrvfKJfX3PGIXDtzkpQzu8rGZy+Rn773H9P8QEYzh5MpwErz1za3j2flqtnvWOuwOm9mJjLT3jQzhF5zN46RlcauzzFkpt07hZTa0ZXoldlWMw7jcbtZnXb/20JD1yPWjdjjGa9Yz1kBZQJSMEOiX56KnTXyO88ul3fceas8PHOAbLonT4bf+Y2UR6ujL3RVVVWL1Ltu0ilYTfWNzNBtn9zYnhMJL23ohaN+/YAxb71WRvOXmOW1dzMubhhVrHZqq7JWaxy8mnNi7ZNbxPqMOF1ndz6eVBxWbSkBoJBw2D2g763ZKS/9wxz50m+/LEMzu8vGPw+RsuhJWXuoRq5cuVJu27atRR1OzN/O2WX872bzjHizh5ohVk1RDyM9dj4QveavCVIj83CiyYlxe2GAXq6zEuix2sX1/+Nh2l6OO5WJRXg5zXpirQ9YLU14qvIBKMQEJ9vo9JN7c8d5g5CXP8y3Mx6kqG4QLLgN33PnMyZtKx99+GGrnPpalkRjnWb2UmP7+rBQN3HhZnbSeOy8TjlgzOgwO2bskzEXkD700SyvT0VFBUOGDGmxxsCJJjubt36s9DTradSgH0s3Nm47+7UTrO6/8f7GEkZr9vx5ocXuOqvx0h8z82W58TE55LoyX/BlJhVS9aNmAKkFJy1b+9QFQvIfH26UP7n7Xll51ygpZ3aVR5+5RMqqNdHytbW1ctasWbKqqsoyjM/43y7/vhVNsaYhcAMvEUhuc+nb0WPWnj7qSl/GS5/NZgPGmYfdngBOmrTedBcP3JiPvEaG6U1qdnU70WJVJtaZiRtfh9E8qAcqCkgh0bDTsjVtpLS0lHr/YW46ayhXnns2Dw98hN+HvkNwZznhp84m+Mb/cXTvFnw+H9dee210NbGxHuN/o6bnll67HPbx5l03i0Ay09yc6LD7rx8L/d4L2rH169fT0NDQQoO30w7Nop709WmLwIAWsyb9giO7mZnVcavIHjewi4Ax659ZlJbVffH5fOTn5zNv3jxqamps+2TWtlOZWJ+xCA+3RzAY9DQLBZUKQqGNoK06rampYd68eS1SHSwuXsPibfWMqXyGb2e8TxPp7B5yDYO+eh9kRZiottQdWr7YmtnImPPHTVqARMNpCb+RJivGZXXcrIw+HYUxG6kmGFesWEGnTp2iK3qt0kpo9Bkzs+rbCAYjqauFEJbZY92Oi3Elt9Uqb6djXu+zVo/+W0tNYhU2XFNTQ2VlpWVGU6t22uoZdPOMgHkWVFDZQBWSCONU12zDl0AgID/9Yr+89fH/yrd+d6GUM7vK+j+fJINLH5eBOvNNM/TTc+NqVLPprxdzSqKdnMZrAoGAXLRoUYupvEa/FhFjF+5oFQGkN/HoTTRuVxObhdDGkmHVrRnOrn/GvlmZPezachNIEAhEFt3FmmnVDokIKkiEidJYDmUCUkgGzEwzZhpJaWkp4wZ05b4fXMWuyb/lltyH+KyuL5kL7yD0jzM4rfMu0M1ONc0/Pz+fV199tcViKG0jkvLy8uj0V9PG3Ezj3Uzx7ZyjdjA6RvXbMWpOa2P+HbM6NI28rKyshRlo7ty51NTUtKJH27jezFmr/Q8Gg9EsrsYFcdDS5ONmbOw207G7VjPV6PsGrfPd6MfD7J453Ud9f6ZOnUpBQYEnJ7WbfrkxBdnByZnrhiZthuOKBjOpkKofNQNIbXgNGdTPEJqawvKN1TvkL+99QFbcNU7KmV3lvvsny7rPF0QdxJpmunjx4hZrCLT6jE5JYzqJeLU9s5BML3DjtHSicfHixS3K6DV4oxa/aNGiVo51/azDqj3jMf3iNKtyVrM9q7r1DlcjTcbxcMrFZKzXrIxZqGusufet+hRr3U71eaXJbCxR6wAUkgEvzN+4gCkQCMhgqEm+sHSj/N3M2+XOu0+ScmZXWfPU5bJ4fmtGbpa0y8gIvOYgsmLSejNFIBCJYvHCRN2058Q4tHarq6tbMHMzJqcdM+4PrP02mj+M1xmhtanBqg679RX69s0S+9n12+q4UzSSdtzuWXEDq+fIjgm7qdMJbkxvTs9fINCOC8GAwcAiYB3wOXBL8/GvNv8PA4Vu6lICoOND/8Los34aX6Qj/jo5e/E6+fA9/ycP3t1fNs3sJr/4xzUysK9SSmmtlRrb0JimlYZod51RkzIyLrvEbm4Wo1lppnaorq6Ws2bNkgsXLmxhx3YSBsb6zRi3lkbCjLEb00osW7as1WzErl9u2rcTAlZwmt1pzD+eLJ92WUJjoVlfp1PSPy+LGq1os1sIlgwB0B84tfl3F2AjMBYYA4wCFisBcOLA+MI4pYHYW31I3jXrTTnrrhtkw909ZfCenvLgG7+WgYO7bV8ePWNYuHChbcpj/bd+Na1RyzVqrNo5q7TS+m/jGMSzElnvANe/5G5SahhpMhsDM6ZulsfIbRtW58zqc8r9o4dVf82Ei3F9iRONRlhlCfWyDsXYl7aaARiFsN0MoM2dwFLKKinlp82/a5tnAgOllOuklBvaun2F1IHe8alBH0tu5uDaWrmB31z/Ja7+5dPMnvwa88Jn0eWzZ2h6dBKNix+A+kOtVm9qW0XqHZ1a+LA+vFHvuNQcyatXr45uypKbm9sqzFTfjhbLrjkx9dCHG9o59GJZiaw51Y2ZOc3G0i4e37h6VqvLGHarbVRj7IMXB6qxfaPDWKvPLm7fbJW0fvMcsw1utLHp16+f6Ypnu5h5PQ3GLKH6uu3WWtiNgZtQUTunstn7FAwGWzzrTvcpqTZ8YBiwHeiqO7YYNQM4YeBV4zVqOPuONMh/vDJfzr/rIilndpV1fxgg18/+qVy+eKGlFmm0mZuZcfRtWdFo1AKN5hAr04mbPmt0uTFTmGn8duXMNESz32bXL1u2rNUY2ZV3A6dZh1U9dk5ot7Mf/XV24+cmIZvduDrBa1m3IbH6maketLcTGMgFVgPXGo7bCgDgZqAEKBkyZIjrQVPoeLAyTZi9iLsO1slHX5wrF941XcqZXaX/j0Pk0UWPSBmsM52mmzEIN3ZYs3rMaLRiPG6PSSk92aqNqR68tmUGM4ZmNIHFk0rD6rqlS5ea+hPs6rcyezjBTfoQJ1OUGT1tiUCgdfSX8byTnwv4VLaXAAAygfeAX5icUzMAhVaauRvbam1trfzfh8vlX5/9t1xy15lSzuwqj/xpuPR/8qSUje7s8V6yLhoZfiw2ZWM/jde42dvASqjZ2cPtmIeUzvZ0q283bRj7bYRZRJFZfVaCyG6mY6UMONHrxT5vN7bxzBL01zjtiuY002y3GQAggBeARyzOKwGgIKV0b5rQzutf5k17j8hHn31OrrpripQzu8pD946StUXPSRlqTDiNVozS7cpg7WOXE9+LGcN4nZekbfrzZo5ys75ptJuln7brh5fZgRkddqYos/9WEU1W9du1bUe32XiZte/EyJ3aiee8lQBo81xAQoizgE+ANURCPgHuBLKAvwO9gUNAqZTyYru6VC4gBQ1muVGCwSDzPy5m1xdrOGfn0xSkbaEmezC+C35H7qnXQVrrmAdjnhizc3a/rcpb0ew2N5A+z49VfhezXD5WtFq1pdXt1D9jPcuXL0cIQUZGBmPGjCE3N7fVvSguLnadQ8iKZu2Y3+9nzpw5jBw5kqlTp7bqixXNZn029t2MDqsxd6rHmEtJg9YfuxxX+joSnUtI5QJSOG5gpYVr56SUcmPVYfnU04/Kddqq4vtOkf7PXpeBhoZW9ViFcVqZpOKl3U0ZbUrvtN7BSQPX/07kaljtU1tba5lXx81Mxliv3WxFH/7qxgRkHANjXVbjYRfWa0e7WVkzWo3HjNuAtsWzRns7gRPxUQJAQYNbxryh6pD851MPRvch2P6nAnmwZK6U4XC0Hv23sQ2z34mGU9tWC5DcrLp16oPXfplF4mjmIDu4NY2ZOV/dMFk3Y6CV01ZxWyUpNPbTzVhb1eN0jVV7buBkUtP3XQkAheMSbl+W9btq5POP/0l+cddIKWd2lXsemCJrS9+MCoL2oEkrG0sop5t2nOzkbupxM2MwMjy319m1ZyxrFQLqZvyMyoJZWgenGZ9bhUO/mtopNDUebd9MuJmV0aAEgIKClHLN1r3y+Sf+LLc0C4K9DxRKfwIFQSwbejsx6kSZA5zy5Rjh1hRiNJ14uc4NrW7+m30by9rNMozXWYXiWt0bY916zd5uBhEr8zd+OwlB2isVRCI/SgAoJArrdlUnXBDYMRevdbSFyclKW3Ri6rHU7WZ2YrdIzem42QzBrfBx2srSbZ4eM8HnRvjEy/TdLO7Tl1+2bJkE1kkTnqp2BFM4obFuVw0r/vc05+55nuFpe9jXeSSdL/odnSdcZRo15IRERHC0RRSIvm63u1Ylig6rSCstHYVZBI1VlJXZeWM0lB3dZlFPZnXbRQHpy2r0a+lH9LuvWUWqOUUvOfXb7hot0kjKlrvlZWVlfSqlnGwsrwSAggJQsbOGlfN0giBnJJ0v+i2dJ14dkyBIZbSlgDFrS2POGoPUh3bOnTuXGTNmtAqBdAq1NYaNgrvtEo3tGet2U4++rFlYr1V/na636qtVv51o0+Dz+SzDQJUAUFDQ4fOd1aycN4vpe2Y3C4J8Ol1wJ10mXXPcCQJwLwy8Cg0z5qXt6mYV/66/Vh9Lb7cvMGC6FsIKdjMAra5Y9hs2O2YnxIxrBfRCUaPPSIvX2Zt+HYbVDOD4e6IVFOLAuEE9ufEntxP8URH/6ncnfv9Rusy7kb0PTuFwyasQDjtX0kHgNoOll0yXZuU1ZlhWVkZJSUmLesyYtn4LTGMGUP15qwyixm899MxVO69lJgU8MX+NFq/njNs7arRoMxRNUJplmHVLn8/no6CgILroDMgxK6dmAAoKNqjcc5gV855h2s5/Mjytin3ZJ5F53q/pMeV6SEtvb/LiRjJmAPpj4M7EYqzHatWzXTmjCcbKpGKs12lVuBs6Y51FaMwf8LSS2gi9T6LZBKR8AAoKsWLrviMsm/csU7b/k5PTdnLAN4i0c39N3hk3QHpme5OXUkikj0HPWLU9AMycwGb/3VxrvN7J9AL2Jimjqcut4DCry3jei5+gpKSEiRMnRoWalQ9AmYAUFFxgWJ+u3PCDX9DplpW8NPRP7A+kk7fwFqrvm0D1x89AyJ155HiHV3ORm7o0E42ZCcSsPT3D1JihtsmP3llrLK/9ttr4BTDtm/4av98fNXUZN73R02xHu779srIyioqKTDcW0vqmCTj9Rj9SSqPAEGZjrGYACgoxYPfBOha99QITNj/DRLGZgxl9CE27hd5n/wAys9ubvHZFW80A7EIfnbRsOCYQvDiNvdKh1W01A/AS0qmnXaPfeE6fNNAYhaT5OwCysrLWSSlbOhVQAkBBIS7sO1zPB/P/w+iNT3Gq2MihjF4ET/8pfc79IfhM/W4K7QyjfdwJTiYgY1njLMNNKKfX9QFmZi4r/8akSZNUFJCCQlugT7dOfOOG7zPkV5/w8ujH2djYhz7L7uHI/WPZ8+79ELDec1ahfaDfO9kNjCYgu32E4Zhmrjfd6M1BVj4EO9OQ/re+LqP5R6NXT3fzf1NNX80AFBQSiINHg7z37usMWfM400Q5tWld8Z/yQ/pf+P8gu2t7k6cQJ6xmD8Z1BEY4mZ3sZgBW6x6A6MI2O0cxWDuBlQBQUGgDHK5vZMG7b9G//DHO4TOOilxqxt/IoEt/gcjp0d7kKcQBI7M2SwPhdE08bRrDRo0Lx4w0BINBsrKyVBSQgkKy0K1TJl+79lpOuX0hcwtfZBVjGbzmMeofHMPmObcR9h9obxIVYoSRuVZUVLRw/DpdE2+b+t/ajMJu8VzzIjcVBaSg0F5oaGzig8UfkbPiYaaHigiILHYM/xonXflrMnsMbm/yFOJAIqOeEgEzc5LVDEAJAAWFJCLUFGbJsk+QnzzMucElIATbBlzGoMtvI2vghPYmT+E4RbstBBNCDBZCLBJCrBNCfC6EuKX5+INCiPVCiHIhxBtCiO5tTYuCQnsjIz2N8885l/PueJMVV3zAgk6X03/X+2TNOottj12Gf/1H0IGUMoWOjTafAQgh+gP9pZSfCiG6AKuBLwODgI+klCEhxP0AUsrb7OpSMwCF4w1SSlav28zW9/7OuYdep7c4wq6c0WSdcyu9psyA9Iz2JlHhOEC7zQCklFVSyk+bf9cC64CBUsr3pZSh5mIriAgEBYUTCkIICsfmM+PWR9l3Ywmv9vslwaOH6LXgh+y/bwLbFzwKwbr2JlPhOEVSfQBCiGHAEmC8lPKI7vhbwCtSyhdNrrkZuLn573hgbRJITSR6AR0p5KOj0QuK5mSgo9ELHY/mtqR3qJSyt/Fg0gSAECIX+Bi4V0r5uu74b4FC4FrpQIwQosRsGpPK6Gg0dzR6QdGcDHQ0eqHj0dwe9CbFwCiEyAReA14yMP/vAFcAX3Ji/goKCgoKiUWbCwAhhAD+SWRX+od1xy8BbgPOlVIqI6eCgoJCkpGMGcCZwLeANUKI0uZjdwKPAVnAwoiMYIWU8kcOdT3TVkS2IToazR2NXlA0JwMdjV7oeDQnnd4OtRBMQUFBQSFxULmAFBQUFE5QKAGgoKCgcIIiJQWAEOISIcQGIUSlEOJ2k/NCCPFY8/lyIcSp7UGnjh4nem9oprNcCLFcCFHQHnQaaLKlWVduihCiSQgxI5n0mdDhSK8QYroQorQ55cjHyabRhB6n56KbEOItIURZM83faw86dfQ8J4TYJ4QwXWuTau9dM01ONKfiu2dLs65c2797UsqU+gDpwGZgOOADyoCxhjKXAe8SSXF6BrAyxemdBvRo/n1pe9LrlmZduY+Ad4AZqUwv0B2oAIY0/++T6mNMJBji/ubfvYEawNeONJ8DnAqstTifMu+dB5pT6t1zQ7Pu+Wnzdy8VZwCnAZVSyi1SyiAwB7jaUOZq4AUZwQqge3POofaAI71SyuVSyoPNf1Mh7YWbMQb4GZH1G/uSSZwJ3ND7DeB1KeV2ACllR6BZAl2aQ6VziQiAEO0EKeWSZhqskErvHeBMcwq+e27GGZL07qWiABgI7ND939l8zGuZZMErLd8nokW1JxxpFkIMBK4BnkoiXVZwM8YnAz2EEIuFEKuFEN9OGnXmcEPzP4AxwG5gDXCLlDKcHPJiQiq9d7EgFd49RyTz3UvFVINmO9cYY1XdlEkWXNMihDiPyEN4VptS5Aw3ND8C3CalbGpep9GecENvBjAZ+BLQCSgSQqyQUm5sa+Is4Ibmi4FS4HxgBJE1MZ9IXZ6sFEMqvXeekELvnhs8QpLevVQUADsB/RZJg4hoSF7LJAuuaBFCTASeBS6VUlYniTYruKG5EJjT/AD2Ai4TQoSklG8mhcKWcPtMHJBSHgWOCiGWAAVAewkANzR/D7hPRoy+lUKIL4DRwKrkkOgZqfTeuUaKvXtukLx3r70dIibOjwxgC3ASx5xn4wxlLqelM2pVitM7BKgEprX3+Lql2VD+edrXCexmjMcAHzaXzSGSNXZ8itP8JHBP8+++wC6gVzs/G8OwdqimzHvngeaUevfc0Gwo16bvXsrNAGRkg5ifAu8R8YQ/J6X8XAjxo+bzTxHxjF9G5MbWEdGkUpneu4GewBPNUj0k2zFLoUuaUwZu6JVSrhNCLADKgTDwrJSy3VKHuxzjPwLPCyHWEGGqt0kp2y19sRDiZWA60EsIsROYCWRC6r13GlzQnFLvHriiOXm0NEsZBQUFBYUTDKkYBaSgoKCgkAQoAaCgoKBwgkIJAAUFBYUTFEoAKCgoKJygUAJAQUFB4QSFEgAKCgoKJyiUAFBQUFA4QaEEgIJCM4QQnYQQHwsh0hNc7zQhxO+FED4hxBIhRMotwFQ4MaEWgikoNEMI8X9AhpTy0TZsYyaRNNEvtVUbCgpuoWYACgrHcAPwPwAhxJhmbb1cCPFrIURlrJUKIf4rhNCyUL7Z3I6CQrtDCQAFBUAI4QOGSym3NptoXiKSn38ikV294skrNJ5Ivn+a65kSF7EKCgmCskUqKETQCzjU/PtaoExK+Vnz/wpMdmYSQnwA9DOp67dSSm0mkQ1kSikPA8hIjvegEKILkaR1TwBBYLEyCykkG0oAKChEUA9kN/+eSGSjFg3jgQXGC6SUF7iodxwRAaJHFtAAXA/MlVK+JYR4hcisQ0EhaVAmIAUFQEb2jU1v1tiriWwxiRBiEvBNIvn8Y8EEIimqaa6vJ7BfStlIZEMVbYvFphjrV1CIGUoAKCgcw/tEtgz8N1AohCgGbgS2Sim3xFhnCwEAnEckrz5EdtjSNilX76JC0qHCQBUUmiGEOAX4BfBjKaW/+divgW5Syt8lqI3XgTuklBuEEJ2JbAzfACxVPgCFZEMJAAUFHYQQNxLZ9/Y6oBFYBvxCShlIQN0+4Hop5Qvx1qWgkAgoAaCgoKBwgkLZHRUUFBROUCgBoKCgoHCCQgkABQUFhRMUSgAoKCgonKBQAkBBQUHhBIUSAAoKCgonKJQAUFBQUDhB8f8BjP/CRpV6NXQAAAAASUVORK5CYII=\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "plot_cmd(photo_table)\n", - "plt.plot(gi1, g1)\n", - "plt.plot(gi2, g2)" - ] - }, - { - "cell_type": "code", - "execution_count": 173, - "metadata": {}, - "outputs": [], - "source": [ - "left_gi = gi - 0.5*(g/28)**5\n", - "right_gi = gi + 0.55*(g/28)**5" - ] - }, - { - "cell_type": "code", - "execution_count": 172, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[]" - ] - }, - "execution_count": 172, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
    " - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "plot_cmd(photo_table)\n", - "plt.plot(gi1, g1)\n", - "plt.plot(gi2, g2)" - ] - }, - { - "cell_type": "code", - "execution_count": 174, - "metadata": {}, - "outputs": [], - "source": [ - "# TODO\n", - "# ind = (poly[:,1]<21.) & (poly[:,1]>17.8)" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Drawing a polygon\n", - "\n", - "Matplotlib provides a function called `ginput` that lets us click on the figure and make a list of coordinates.\n", - "\n", - "It's a little tricky to use `ginput` in a Jupyter notebook. \n", - "Before calling `plt.ginput` we have to tell Matplotlib to use `TkAgg` to draw the figure in a new window.\n", - "\n", - "When you run the following cell, a figure should appear in a new window. Click on it 10 times to draw a polygon around the overdense area. A red cross should appear where you click." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib as mpl\n", - "\n", - "coords = None\n", - "\n", - "if not IN_COLAB:\n", - " mpl.use('TkAgg')\n", - " plot_cmd(photo_table)\n", - " coords = plt.ginput(10)\n", - " mpl.use('agg')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The argument to `ginput` is the number of times the user has to click on the figure.\n", - "\n", - "The result from `ginput` is a list of coordinate pairs." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[(0.2643369175627239, 17.84253127299485),\n", - " (0.3539426523297491, 18.799116997792495),\n", - " (0.47491039426523296, 19.682119205298015),\n", - " (0.6317204301075269, 20.454746136865342),\n", - " (0.7661290322580645, 20.785871964679913),\n", - " (0.8064516129032258, 21.41133186166299),\n", - " (0.5869175627240143, 21.300956585724798),\n", - " (0.39426523297491034, 20.565121412803535),\n", - " (0.22401433691756267, 19.240618101545255),\n", - " (0.19713261648745517, 18.02649006622517)]" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coords" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If `ginput` doesn't work for you, you could use the following coordinates." + "Now we can read the file:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Reading in: MIST_iso_5fd2532653c27.iso.cmd\n" + ] + } + ], "source": [ - "if coords is None:\n", - " coords = [(0.2, 17.5), \n", - " (0.2, 19.5), \n", - " (0.65, 22),\n", - " (0.75, 21),\n", - " (0.4, 19),\n", - " (0.4, 17.5)]" + "import read_mist_models\n", + "\n", + "filename = 'MIST_iso_5fd2532653c27.iso.cmd'\n", + "iso = read_mist_models.ISOCMD(filename)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The next step is to convert the coordinates to a format we can use to plot them, which is a sequence of `x` coordinates and a sequence of `y` coordinates. The NumPy function `transpose` does what we want. " + "The result is an `ISOCMD` object." ] }, { @@ -838,10 +377,7 @@ { "data": { "text/plain": [ - "(array([0.26433692, 0.35394265, 0.47491039, 0.63172043, 0.76612903,\n", - " 0.80645161, 0.58691756, 0.39426523, 0.22401434, 0.19713262]),\n", - " array([17.84253127, 18.799117 , 19.68211921, 20.45474614, 20.78587196,\n", - " 21.41133186, 21.30095659, 20.56512141, 19.2406181 , 18.02649007]))" + "read_mist_models.ISOCMD" ] }, "execution_count": 9, @@ -850,17 +386,14 @@ } ], "source": [ - "import numpy as np\n", - "\n", - "xs, ys = np.transpose(coords)\n", - "xs, ys" + "type(iso)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "To display the polygon, we'll draw the figure again and use `plt.plot` to draw the polygon." + "It contains a list of arrays, one for each isochrone." ] }, { @@ -870,7 +403,295 @@ "outputs": [ { "data": { - "image/png": "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\n", + "text/plain": [ + "list" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(iso.isocmds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We only got one isochrone." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(iso.isocmds)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So we can select it like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "iso_array = iso.isocmds[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It's a NumPy array:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(iso_array)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "But it's an unusual NumPy array, because it contains names for the columns." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype([('EEP', '= 0) & (iso_array['phase'] < 3)\n", + "phase_mask.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "354" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "main_sequence = iso_array[phase_mask]\n", + "len(main_sequence)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The other two columns we'll use are `PS_g` and `PS_i`, which contain simulated photometry data for stars with the given age and metallicity, based on a model of the Pan-STARRS sensors.\n", + "\n", + "We'll use these columns to superimpose the isochrone on the color-magnitude diagram, but first we have to use a [distance modulus](https://en.wikipedia.org/wiki/Distance_modulus) to scale the isochrone based on the estimated distance of GD-1.\n", + "\n", + "We can use the `Distance` object from Astropy to compute the distance modulus." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "14.4604730134524" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import astropy.coordinates as coord\n", + "import astropy.units as u\n", + "\n", + "distance = 7.8 * u.kpc\n", + "distmod = coord.Distance(distance).distmod.value\n", + "distmod" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can compute the scaled magnitude and color of the isochrone." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "g = main_sequence['PS_g'] + distmod\n", + "gi = main_sequence['PS_g'] - main_sequence['PS_i']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To make this data easier to work with, we'll put it in a Pandas `Series` with that contains `gi` as the index and `g` as the values." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.195021 28.294743\n", + "2.166076 28.189718\n", + "2.129312 28.051761\n", + "2.093721 27.916194\n", + "2.058585 27.780024\n", + "dtype: float64" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "iso_series = pd.Series(g, index=gi)\n", + "iso_series.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can plot it on the color-magnitude diagram like this." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", "text/plain": [ "
    " ] @@ -883,18 +704,408 @@ ], "source": [ "plot_cmd(photo_table)\n", - "plt.plot(xs, ys);" + "iso_series.plot();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "If it looks like your polygon does a good job surrounding the overdense area, go on to the next section. Otherwise you can try again.\n", + "The theoretical isochrone passes through the overdense region where we expect to find stars in GD-1.\n", "\n", - "If you want a polygon with more points (or fewer), you can change the argument to `ginput`.\n", + "Let's save this result so we can reload it later without repeating the steps in this section." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "filename = 'gd1_isochrone.hdf5'\n", "\n", - "The polygon does not have to be \"closed\". When we use this polygon in the next section, the last and first points will be connected by a straight line.\n" + "iso_series.to_hdf(filename, 'iso_series')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Making a polygon\n", + "\n", + "The following cell downloads the isochrone series we made in the previous section, if necessary." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "from wget import download\n", + "\n", + "filename = 'gd1_isochrone.hdf5'\n", + "filepath = 'https://github.com/AllenDowney/AstronomicalData/raw/main/data/'\n", + "\n", + "if not os.path.exists(filename):\n", + " print(download(filepath+filename))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can read the isochrone back in." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.195021 28.294743\n", + "2.166076 28.189718\n", + "2.129312 28.051761\n", + "2.093721 27.916194\n", + "2.058585 27.780024\n", + "dtype: float64" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "iso_series = pd.read_hdf(filename, 'iso_series')\n", + "iso_series.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To select the stars in the overdense region of the color-magnitude diagram, we want to stretch the isochrone into a polygon.\n", + "\n", + "We'll use the following formulas to compute the left and right sides of the polygons." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "g = iso_series.to_numpy()\n", + "gi = iso_series.index" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "left_gi = gi - 0.4 * (g/28)**5\n", + "right_gi = gi + 0.7 * (g/28)**5" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To explain the terms:\n", + "\n", + "* We divide magnitudes by 28 to normalize them onto the range from 0 to 1.\n", + "\n", + "* Raising the normalized magnitudes to the 5th power [DOES WHAT?]\n", + "\n", + "* Then we add and subtract the result from `gi` to shift the isochrone left and right. The factors 0.4 and 0.7 were chosen by eye to enclose the overdense region." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To make the shifted isochrones easier to work with, we'll put them in a Pandas `Series` with that contains both `g` and the scaled values of `gi`." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.773520 28.294743\n", + "1.752340 28.189718\n", + "1.725601 28.051761\n", + "1.699671 27.916194\n", + "1.674053 27.780024\n", + "dtype: float64" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "left_series = pd.Series(g, index=left_gi)\n", + "left_series.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.932648 28.294743\n", + "2.890114 28.189718\n", + "2.835806 28.051761\n", + "2.783308 27.916194\n", + "2.731517 27.780024\n", + "dtype: float64" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "right_series = pd.Series(g, index=right_gi)\n", + "right_series.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can plot them on the color-magnitude diagram like this." + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_cmd(photo_table)\n", + "left_series.plot()\n", + "right_series.plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It looks like the scaled isochrones bound the overdense area well, but they also include stars with magnitudes higher than we expect for stars in GD-1, so we'll use another mask to limit the range of `g`." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "117" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g_mask = (g > 18.0) & (g < 21.5)\n", + "g_mask.sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(117, 117)" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "left = left_series[g_mask]\n", + "right = right_series[g_mask]\n", + "\n", + "len(left), len(right)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here's what they look like:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_cmd(photo_table)\n", + "left.plot()\n", + "right.plot();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we want to assemble the two halves into a polygon. We can use `append` to make a new `Series` that contains both halves.\n", + "\n", + "And we'll use the slice `[::-1]` to reverse the elements of `right` so the result forms a loop. [See here for an explanation of this idiom](https://stackoverflow.com/questions/5876998/reversing-a-list-using-slice-notation)." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.587571 21.411746\n", + "0.567801 21.322466\n", + "0.548134 21.233380\n", + "0.528693 21.144427\n", + "0.509300 21.054549\n", + "dtype: float64" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loop = left.append(right[::-1])\n", + "loop.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following lines add metadata by assigning names to the values and the index in `loop`." + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "gi\n", + "0.587571 21.411746\n", + "0.567801 21.322466\n", + "0.548134 21.233380\n", + "0.528693 21.144427\n", + "0.509300 21.054549\n", + "Name: g, dtype: float64" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loop.name = 'g'\n", + "loop.index.name = 'gi'\n", + "loop.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And here's what it looks like" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
    " + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "loop.plot()\n", + "plot_cmd(photo_table)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next we'll use this polygon to identify stars in the overdense region." ] }, { @@ -903,32 +1114,377 @@ "source": [ "## Which points are in the polygon?\n", "\n", - "Matplotlib provides a `Path` object that we can use to check which points fall in the polygon we selected.\n", + "Matplotlib provides a `Path` object that we can use to check which points fall in the polygon we just constructed.\n", "\n", - "Here's how we make a `Path` using a list of coordinates." + "To make a `Path`, we need a list of coordinates in the form of an array with two columns.\n", + "\n", + "Currently `loop` is a `Series` with the values of `gi` in the index:" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "Path(array([[ 0.26433692, 17.84253127],\n", - " [ 0.35394265, 18.799117 ],\n", - " [ 0.47491039, 19.68211921],\n", - " [ 0.63172043, 20.45474614],\n", - " [ 0.76612903, 20.78587196],\n", - " [ 0.80645161, 21.41133186],\n", - " [ 0.58691756, 21.30095659],\n", - " [ 0.39426523, 20.56512141],\n", - " [ 0.22401434, 19.2406181 ],\n", - " [ 0.19713262, 18.02649007]]), None)" + "gi\n", + "0.587571 21.411746\n", + "0.567801 21.322466\n", + "0.548134 21.233380\n", + "0.528693 21.144427\n", + "0.509300 21.054549\n", + "Name: g, dtype: float64" ] }, - "execution_count": 11, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loop.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can move them out of the index into a column using `reset_index`:" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "
    \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    gig
    00.58757121.411746
    10.56780121.322466
    20.54813421.233380
    30.52869321.144427
    40.50930021.054549
    \n", + "
    " + ], + "text/plain": [ + " gi g\n", + "0 0.587571 21.411746\n", + "1 0.567801 21.322466\n", + "2 0.548134 21.233380\n", + "3 0.528693 21.144427\n", + "4 0.509300 21.054549" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "loop_df = loop.reset_index()\n", + "loop_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The result is a `DataFrame` with one column for `gi` and one column for `g`, so we can pass it to `Path` like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Path(array([[ 0.58757135, 21.41174601],\n", + " [ 0.56780097, 21.32246601],\n", + " [ 0.54813409, 21.23338001],\n", + " [ 0.5286928 , 21.14442701],\n", + " [ 0.50929987, 21.05454901],\n", + " [ 0.48991266, 20.96383501],\n", + " [ 0.47084777, 20.87386601],\n", + " [ 0.45222635, 20.78511001],\n", + " [ 0.43438902, 20.69865301],\n", + " [ 0.42745198, 20.66469601],\n", + " [ 0.42067029, 20.63135301],\n", + " [ 0.41402867, 20.59850601],\n", + " [ 0.40738016, 20.56529901],\n", + " [ 0.40088387, 20.53264001],\n", + " [ 0.39449608, 20.50023501],\n", + " [ 0.38843797, 20.46871801],\n", + " [ 0.38251577, 20.43765101],\n", + " [ 0.3766547 , 20.40653701],\n", + " [ 0.37088531, 20.37564701],\n", + " [ 0.36522325, 20.34505401],\n", + " [ 0.35962415, 20.31443001],\n", + " [ 0.35413292, 20.28413501],\n", + " [ 0.34871894, 20.25390101],\n", + " [ 0.34339273, 20.22385701],\n", + " [ 0.33815825, 20.19395801],\n", + " [ 0.33305724, 20.16427301],\n", + " [ 0.32820637, 20.13508501],\n", + " [ 0.32348139, 20.10604901],\n", + " [ 0.31883343, 20.07716101],\n", + " [ 0.31425423, 20.04833101],\n", + " [ 0.30974976, 20.01961701],\n", + " [ 0.30531997, 19.99097001],\n", + " [ 0.30097354, 19.96246401],\n", + " [ 0.29669999, 19.93401801],\n", + " [ 0.29250157, 19.90573101],\n", + " [ 0.28837983, 19.87746501],\n", + " [ 0.28441584, 19.84955001],\n", + " [ 0.28065057, 19.82188301],\n", + " [ 0.27700644, 19.79450101],\n", + " [ 0.27342328, 19.76713801],\n", + " [ 0.26989305, 19.73985301],\n", + " [ 0.26641258, 19.71265801],\n", + " [ 0.26298257, 19.68540001],\n", + " [ 0.25960216, 19.65824401],\n", + " [ 0.2562733 , 19.63113701],\n", + " [ 0.25299978, 19.60409301],\n", + " [ 0.24977307, 19.57714401],\n", + " [ 0.24660506, 19.55024001],\n", + " [ 0.24348829, 19.52341001],\n", + " [ 0.24042159, 19.49666601],\n", + " [ 0.23741737, 19.46998501],\n", + " [ 0.23447423, 19.44339301],\n", + " [ 0.23158726, 19.41688701],\n", + " [ 0.22876474, 19.39045101],\n", + " [ 0.22600432, 19.36410901],\n", + " [ 0.22330395, 19.33786601],\n", + " [ 0.220663 , 19.31170101],\n", + " [ 0.21808571, 19.28560101],\n", + " [ 0.21557456, 19.25960101],\n", + " [ 0.21312279, 19.23368701],\n", + " [ 0.21073349, 19.20785601],\n", + " [ 0.20840975, 19.18210401],\n", + " [ 0.20614799, 19.15640601],\n", + " [ 0.20395119, 19.13076401],\n", + " [ 0.20182156, 19.10523201],\n", + " [ 0.19975572, 19.07977101],\n", + " [ 0.19775195, 19.05436401],\n", + " [ 0.19581903, 19.02902801],\n", + " [ 0.19395701, 19.00376101],\n", + " [ 0.19216276, 18.97857301],\n", + " [ 0.19044513, 18.95347601],\n", + " [ 0.1888007 , 18.92850001],\n", + " [ 0.18723796, 18.90368201],\n", + " [ 0.18576648, 18.87905401],\n", + " [ 0.18438763, 18.85466301],\n", + " [ 0.18310871, 18.83056001],\n", + " [ 0.18193706, 18.80672701],\n", + " [ 0.18087817, 18.78327401],\n", + " [ 0.17993184, 18.76015001],\n", + " [ 0.17910244, 18.73740501],\n", + " [ 0.17838817, 18.71496101],\n", + " [ 0.17779005, 18.69282101],\n", + " [ 0.177312 , 18.67099501],\n", + " [ 0.17694971, 18.64944001],\n", + " [ 0.1767112 , 18.62815801],\n", + " [ 0.17659065, 18.60714001],\n", + " [ 0.17658939, 18.58636601],\n", + " [ 0.17671618, 18.56585701],\n", + " [ 0.17696696, 18.54562201],\n", + " [ 0.17733781, 18.52565801],\n", + " [ 0.1778346 , 18.50597901],\n", + " [ 0.17846661, 18.48656801],\n", + " [ 0.17922891, 18.46742401],\n", + " [ 0.18012796, 18.44859001],\n", + " [ 0.18116197, 18.43005501],\n", + " [ 0.18233604, 18.41181501],\n", + " [ 0.18363223, 18.39379401],\n", + " [ 0.18506009, 18.37602901],\n", + " [ 0.18660932, 18.35862101],\n", + " [ 0.18829849, 18.34153201],\n", + " [ 0.19012805, 18.32480701],\n", + " [ 0.19210919, 18.30851301],\n", + " [ 0.19422686, 18.29250401],\n", + " [ 0.1964951 , 18.27685701],\n", + " [ 0.19890209, 18.26156301],\n", + " [ 0.20145338, 18.24666001],\n", + " [ 0.20417715, 18.23260501],\n", + " [ 0.20705285, 18.21898101],\n", + " [ 0.21005661, 18.20562501],\n", + " [ 0.21319339, 18.19254201],\n", + " [ 0.22126873, 18.16185301],\n", + " [ 0.2300065 , 18.13259301],\n", + " [ 0.23950909, 18.10508001],\n", + " [ 0.24974677, 18.07932501],\n", + " [ 0.26066153, 18.05527801],\n", + " [ 0.27224553, 18.03295501],\n", + " [ 0.28447607, 18.01227601],\n", + " [ 0.40566013, 18.01227601],\n", + " [ 0.39412682, 18.03295501],\n", + " [ 0.38329907, 18.05527801],\n", + " [ 0.37320316, 18.07932501],\n", + " [ 0.36384734, 18.10508001],\n", + " [ 0.35529237, 18.13259301],\n", + " [ 0.34756872, 18.16185301],\n", + " [ 0.34056407, 18.19254201],\n", + " [ 0.33788593, 18.20562501],\n", + " [ 0.33535176, 18.21898101],\n", + " [ 0.33295648, 18.23260501],\n", + " [ 0.33072983, 18.24666001],\n", + " [ 0.32870734, 18.26156301],\n", + " [ 0.32684482, 18.27685701],\n", + " [ 0.3251355 , 18.29250401],\n", + " [ 0.32359167, 18.30851301],\n", + " [ 0.32219665, 18.32480701],\n", + " [ 0.32097089, 18.34153201],\n", + " [ 0.31990093, 18.35862101],\n", + " [ 0.31898485, 18.37602901],\n", + " [ 0.3182056 , 18.39379401],\n", + " [ 0.31756993, 18.41181501],\n", + " [ 0.31706705, 18.43005501],\n", + " [ 0.31671781, 18.44859001],\n", + " [ 0.3165174 , 18.46742401],\n", + " [ 0.31646817, 18.48656801],\n", + " [ 0.3165622 , 18.50597901],\n", + " [ 0.31680458, 18.52565801],\n", + " [ 0.31718682, 18.54562201],\n", + " [ 0.31770268, 18.56585701],\n", + " [ 0.31835632, 18.58636601],\n", + " [ 0.31915162, 18.60714001],\n", + " [ 0.32007915, 18.62815801],\n", + " [ 0.3211385 , 18.64944001],\n", + " [ 0.32233599, 18.67099501],\n", + " [ 0.32366367, 18.69282101],\n", + " [ 0.32512771, 18.71496101],\n", + " [ 0.32672398, 18.73740501],\n", + " [ 0.32845154, 18.76015001],\n", + " [ 0.33031546, 18.78327401],\n", + " [ 0.33230964, 18.80672701],\n", + " [ 0.33443651, 18.83056001],\n", + " [ 0.3366864 , 18.85466301],\n", + " [ 0.3390529 , 18.87905401],\n", + " [ 0.34152681, 18.90368201],\n", + " [ 0.34410502, 18.92850001],\n", + " [ 0.34677677, 18.95347601],\n", + " [ 0.34953217, 18.97857301],\n", + " [ 0.35237348, 19.00376101],\n", + " [ 0.35529144, 19.02902801],\n", + " [ 0.35828883, 19.05436401],\n", + " [ 0.36136575, 19.07977101],\n", + " [ 0.36451277, 19.10523201],\n", + " [ 0.36773241, 19.13076401],\n", + " [ 0.37102978, 19.15640601],\n", + " [ 0.37440044, 19.18210401],\n", + " [ 0.37784139, 19.20785601],\n", + " [ 0.38135736, 19.23368701],\n", + " [ 0.38494552, 19.25960101],\n", + " [ 0.388603 , 19.28560101],\n", + " [ 0.39233725, 19.31170101],\n", + " [ 0.39614435, 19.33786601],\n", + " [ 0.40002069, 19.36410901],\n", + " [ 0.40396796, 19.39045101],\n", + " [ 0.40798805, 19.41688701],\n", + " [ 0.41208235, 19.44339301],\n", + " [ 0.41624335, 19.46998501],\n", + " [ 0.42047622, 19.49666601],\n", + " [ 0.42478124, 19.52341001],\n", + " [ 0.42914714, 19.55024001],\n", + " [ 0.43357463, 19.57714401],\n", + " [ 0.43806989, 19.60409301],\n", + " [ 0.44262347, 19.63113701],\n", + " [ 0.44724247, 19.65824401],\n", + " [ 0.4519225 , 19.68540001],\n", + " [ 0.45666424, 19.71265801],\n", + " [ 0.46146067, 19.73985301],\n", + " [ 0.46631851, 19.76713801],\n", + " [ 0.47124047, 19.79450101],\n", + " [ 0.47623175, 19.82188301],\n", + " [ 0.48136578, 19.84955001],\n", + " [ 0.48671855, 19.87746501],\n", + " [ 0.49225451, 19.90573101],\n", + " [ 0.49787627, 19.93401801],\n", + " [ 0.50358931, 19.96246401],\n", + " [ 0.50938655, 19.99097001],\n", + " [ 0.51528266, 20.01961701],\n", + " [ 0.52126534, 20.04833101],\n", + " [ 0.52733726, 20.07716101],\n", + " [ 0.53348957, 20.10604901],\n", + " [ 0.53973535, 20.13508501],\n", + " [ 0.54612384, 20.16427301],\n", + " [ 0.55279781, 20.19395801],\n", + " [ 0.55962597, 20.22385701],\n", + " [ 0.56656311, 20.25390101],\n", + " [ 0.57360789, 20.28413501],\n", + " [ 0.58074299, 20.31443001],\n", + " [ 0.5880138 , 20.34505401],\n", + " [ 0.59535596, 20.37564701],\n", + " [ 0.60283203, 20.40653701],\n", + " [ 0.61042265, 20.43765101],\n", + " [ 0.61808231, 20.46871801],\n", + " [ 0.62591386, 20.50023501],\n", + " [ 0.63413647, 20.53264001],\n", + " [ 0.64249372, 20.56529901],\n", + " [ 0.65104657, 20.59850601],\n", + " [ 0.659584 , 20.63135301],\n", + " [ 0.66830253, 20.66469601],\n", + " [ 0.67722496, 20.69865301],\n", + " [ 0.70017638, 20.78511001],\n", + " [ 0.72413715, 20.87386601],\n", + " [ 0.74870785, 20.96383501],\n", + " [ 0.77374297, 21.05454901],\n", + " [ 0.7988286 , 21.14442701],\n", + " [ 0.8240001 , 21.23338001],\n", + " [ 0.84950281, 21.32246601],\n", + " [ 0.8752204 , 21.41174601]]), None)" + ] + }, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -936,7 +1492,7 @@ "source": [ "from matplotlib.path import Path\n", "\n", - "path = Path(coords)\n", + "path = Path(loop_df)\n", "path" ] }, @@ -944,6 +1500,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "The result is a `Path` object that represents the polygon.\n", + "\n", "`Path` provides `contains_points`, which figures out which points are inside the polygon.\n", "\n", "To test it, we'll create a list with two points, one inside the polygon and one outside." @@ -951,12 +1509,12 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "points = [(0.4, 20), \n", - " (0.4, 30)]" + " (0.4, 16)]" ] }, { @@ -968,7 +1526,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -977,7 +1535,7 @@ "array([ True, False])" ] }, - "execution_count": 13, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1008,7 +1566,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ @@ -1024,7 +1582,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 42, "metadata": {}, "outputs": [], "source": [ @@ -1037,7 +1595,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "`candidate_df` is the Pandas DataFrame that contains the results from Notebook XX, which selects stars likely to be in GD-1 based on proper motion. It also includes position and proper motion transformed to the ICRS frame." + "`candidate_df` is the Pandas DataFrame that contains the results from Lesson 4, which selects stars likely to be in GD-1 based on proper motion. It also includes position and proper motion transformed to the ICRS frame." ] }, { @@ -1063,7 +1621,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1096,7 +1654,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 44, "metadata": { "scrolled": true }, @@ -1128,7 +1686,6 @@ " pmra\n", " pmdec\n", " parallax\n", - " parallax_error\n", " radial_velocity\n", " phi1\n", " phi2\n", @@ -1147,7 +1704,6 @@ " -3.770522\n", " -12.490482\n", " 0.791393\n", - " 0.271754\n", " NaN\n", " -59.630489\n", " -1.216485\n", @@ -1164,7 +1720,6 @@ " -5.941679\n", " -11.346409\n", " 0.307456\n", - " 0.199466\n", " NaN\n", " -59.247330\n", " -2.016078\n", @@ -1181,7 +1736,6 @@ " -3.897001\n", " -12.702780\n", " 0.779463\n", - " 0.223692\n", " NaN\n", " -59.133391\n", " -2.306901\n", @@ -1198,7 +1752,6 @@ " -4.335041\n", " -14.492309\n", " 0.314514\n", - " 0.102775\n", " NaN\n", " -59.785300\n", " -1.594569\n", @@ -1215,7 +1768,6 @@ " -7.172931\n", " -12.291499\n", " 0.425404\n", - " 0.337689\n", " NaN\n", " -59.557744\n", " -1.682147\n", @@ -1236,22 +1788,22 @@ "3 635535454774983040 137.837752 18.864007 -4.335041 -14.492309 0.314514 \n", "4 635497276810313600 138.044516 19.009471 -7.172931 -12.291499 0.425404 \n", "\n", - " parallax_error radial_velocity phi1 phi2 pm_phi1 pm_phi2 \\\n", - "0 0.271754 NaN -59.630489 -1.216485 -7.361363 -0.592633 \n", - "1 0.199466 NaN -59.247330 -2.016078 -7.527126 1.748779 \n", - "2 0.223692 NaN -59.133391 -2.306901 -7.560608 -0.741800 \n", - "3 0.102775 NaN -59.785300 -1.594569 -9.357536 -1.218492 \n", - "4 0.337689 NaN -59.557744 -1.682147 -9.000831 2.334407 \n", + " radial_velocity phi1 phi2 pm_phi1 pm_phi2 g_mean_psf_mag \\\n", + "0 NaN -59.630489 -1.216485 -7.361363 -0.592633 NaN \n", + "1 NaN -59.247330 -2.016078 -7.527126 1.748779 17.8978 \n", + "2 NaN -59.133391 -2.306901 -7.560608 -0.741800 19.2873 \n", + "3 NaN -59.785300 -1.594569 -9.357536 -1.218492 16.9238 \n", + "4 NaN -59.557744 -1.682147 -9.000831 2.334407 19.9242 \n", "\n", - " g_mean_psf_mag i_mean_psf_mag \n", - "0 NaN NaN \n", - "1 17.8978 17.517401 \n", - "2 19.2873 17.678101 \n", - "3 16.9238 16.478100 \n", - "4 19.9242 18.334000 " + " i_mean_psf_mag \n", + "0 NaN \n", + "1 17.517401 \n", + "2 17.678101 \n", + "3 16.478100 \n", + "4 18.334000 " ] }, - "execution_count": 17, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" } @@ -1281,7 +1833,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 45, "metadata": {}, "outputs": [ { @@ -1290,7 +1842,7 @@ "(7346, 3724, 7346)" ] }, - "execution_count": 18, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1308,7 +1860,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 46, "metadata": {}, "outputs": [ { @@ -1321,7 +1873,6 @@ "pmra\n", "pmdec\n", "parallax\n", - "parallax_error\n", "radial_velocity\n", "phi1\n", "phi2\n", @@ -1357,7 +1908,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 47, "metadata": {}, "outputs": [], "source": [ @@ -1376,7 +1927,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 48, "metadata": {}, "outputs": [ { @@ -1396,7 +1947,7 @@ "Name: color, Length: 7346, dtype: bool" ] }, - "execution_count": 21, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1414,7 +1965,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 49, "metadata": {}, "outputs": [ { @@ -1423,7 +1974,7 @@ "3724" ] }, - "execution_count": 22, + "execution_count": 49, "metadata": {}, "output_type": "execute_result" } @@ -1456,7 +2007,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 50, "metadata": {}, "outputs": [ { @@ -1523,7 +2074,7 @@ "4 1.5902 19.9242" ] }, - "execution_count": 23, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1542,7 +2093,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 51, "metadata": {}, "outputs": [ { @@ -1551,7 +2102,7 @@ "array([False, False, False, ..., False, False, False])" ] }, - "execution_count": 24, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -1570,16 +2121,16 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "481" + "464" ] }, - "execution_count": 25, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -1597,7 +2148,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 53, "metadata": {}, "outputs": [], "source": [ @@ -1613,12 +2164,12 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 54, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -1631,9 +2182,10 @@ ], "source": [ "plot_cmd(photo_table)\n", - "plt.plot(xs, ys)\n", + "plt.plot(gi, g)\n", + "loop.plot()\n", "\n", - "plt.plot(selected2['color'], selected2['mag'], 'gx');" + "plt.plot(selected2['color'], selected2['mag'], 'g.');" ] }, { @@ -1647,12 +2199,12 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 55, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
    " ] @@ -1701,7 +2253,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 56, "metadata": {}, "outputs": [], "source": [ @@ -1713,14 +2265,14 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "-rw-rw-r-- 1 downey downey 2.0M Nov 18 19:28 gd1_merged.hdf5\r\n" + "-rw-rw-r-- 1 downey downey 1.1M Dec 14 14:24 gd1_merged.hdf5\r\n" ] } ], @@ -1749,30 +2301,20 @@ "\n", "This Jupyter notebook is an example of reproducible research because it contains all of the code needed to reproduce the results, including the database queries that download the data and and analysis.\n", "\n", - "However, when we used `ginput` to define a polygon by hand, we introduced a non-reproducible element to the analysis. If someone running this notebook chooses a different polygon, they will get different results. So it is important to record the polygon we chose as part of the data analysis pipeline.\n", + "In this lesson we used an isochrone to derive a polygon, which we used to select stars based on photometry. \n", + "So it is important to record the polygon as part of the data analysis pipeline.\n", "\n", - "Since `coords` is a NumPy array, we can't use `to_hdf` to save it in a file. But we can convert it to a Pandas `DataFrame` and save that.\n", - "\n", - "As an alternative, we could use [PyTables](http://www.pytables.org/index.html), which is the library Pandas uses to read and write files. It is a powerful library, but not easy to use directly. So let's take advantage of Pandas." + "Here's how we can save it in an HDF file." ] }, { "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [], - "source": [ - "coords_df = pd.DataFrame(coords)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, + "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "filename = 'gd1_polygon.hdf5'\n", - "coords_df.to_hdf(filename, 'coords_df')" + "loop.to_hdf(filename, 'loop')" ] }, { @@ -1784,12 +2326,11 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 59, "metadata": {}, "outputs": [], "source": [ - "coords2_df = pd.read_hdf(filename, 'coords_df')\n", - "coords2 = coords2_df.to_numpy()" + "loop2 = pd.read_hdf(filename, 'loop')" ] }, { @@ -1801,7 +2342,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 60, "metadata": {}, "outputs": [ { @@ -1810,13 +2351,15 @@ "True" ] }, - "execution_count": 34, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "np.all(coords2 == coords)" + "import numpy as np\n", + "\n", + "np.all(loop == loop2)" ] }, { diff --git a/_sources/07_plot.ipynb b/_sources/07_plot.ipynb index 15e961c..5765556 100644 --- a/_sources/07_plot.ipynb +++ b/_sources/07_plot.ipynb @@ -1,5 +1,31 @@ { "cells": [ + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "---\n", + "title: \"Title\"\n", + "teaching: 3000\n", + "exercises: 0\n", + "questions:\n", + "\n", + "- \"Question?\"\n", + "\n", + "objectives:\n", + "\n", + "- \"Objective.\"\n", + "\n", + "keypoints:\n", + "\n", + "- \"Keypoint.\"\n", + "\n", + "---\n", + "FIXME\n", + "\n", + "{% include links.md %}\n" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/_sources/AstronomicalData/01_query.ipynb b/_sources/AstronomicalData/01_query.ipynb deleted file mode 100644 index 9a7f17d..0000000 --- a/_sources/AstronomicalData/01_query.ipynb +++ /dev/null @@ -1,1642 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction\n", - "\n", - "This workshop is an introduction to tools and practices for working with astronomical data. Topics covered include:\n", - "\n", - "* Writing queries that select and download data from a database.\n", - "\n", - "* Using data stored in an Astropy `Table` or Pandas `DataFrame`.\n", - "\n", - "* Working with coordinates and other quantities with units.\n", - "\n", - "* Storing data in various formats.\n", - "\n", - "* Performing database join operations that combine data from multiple tables.\n", - "\n", - "* Visualizing data and preparing publication-quality figures." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a running example, we will replicate part of the analysis in a recent paper, \"[Off the beaten path: Gaia reveals GD-1 stars outside of the main stream](https://arxiv.org/abs/1805.00425)\" by Adrian M. Price-Whelan and Ana Bonaca.\n", - "\n", - "As the abstract explains, \"Using data from the Gaia second data release combined with Pan-STARRS photometry, we present a sample of highly-probable members of the longest cold stream in the Milky Way, GD-1.\"\n", - "\n", - "GD-1 is a [stellar stream](https://en.wikipedia.org/wiki/List_of_stellar_streams), which is \"an association of stars orbiting a galaxy that was once a globular cluster or dwarf galaxy that has now been torn apart and stretched out along its orbit by tidal forces.\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[This article in *Science* magazine](https://www.sciencemag.org/news/2018/10/streams-stars-reveal-galaxy-s-violent-history-and-perhaps-its-unseen-dark-matter) explains some of the background, including the process that led to the paper and an discussion of the scientific implications:\n", - "\n", - "* \"The streams are particularly useful for ... galactic archaeology --- rewinding the cosmic clock to reconstruct the assembly of the Milky Way.\"\n", - "\n", - "* \"They also are being used as exquisitely sensitive scales to measure the galaxy's mass.\"\n", - "\n", - "* \"... the streams are well-positioned to reveal the presence of dark matter ... because the streams are so fragile, theorists say, collisions with marauding clumps of dark matter could leave telltale scars, potential clues to its nature.\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "\n", - "This workshop is meant for people who are familiar with basic Python, but not necessarily the libraries we will use, like Astropy or Pandas. If you are familiar with Python lists and dictionaries, and you know how to write a function that takes parameters and returns a value, you know enough Python for this workshop.\n", - "\n", - "We assume that you have some familiarity with operating systems, like the ability to use a command-line interface. But we don't assume you have any prior experience with databases.\n", - "\n", - "We assume that you are familiar with astronomy at the undergraduate level, but we will not assume specialized knowledge of the datasets or analysis methods we'll use. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data\n", - "\n", - "The datasets we will work with are:\n", - " \n", - "* [Gaia](https://en.wikipedia.org/wiki/Gaia_(spacecraft)), which is \"a space observatory of the European Space Agency (ESA), launched in 2013 ... designed for astrometry: measuring the positions, distances and motions of stars with unprecedented precision\", and\n", - "\n", - "* [Pan-STARRS](https://en.wikipedia.org/wiki/Pan-STARRS), The Panoramic Survey Telescope and Rapid Response System, which is a survey designed to monitor the sky for transient objects, producing a catalog with accurate astronometry and photometry of detected sources.\n", - "\n", - "Both of these datasets are very large, which can make them challenging to work with. It might not be possible, or practical, to download the entire dataset.\n", - "One of the goals of this workshop is to provide tools for working with large datasets." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Lesson 1\n", - "\n", - "The first lesson demonstrates the steps for selecting and downloading data from the Gaia Database:\n", - "\n", - "1. First we'll make a connection to the Gaia server,\n", - "\n", - "2. We will explore information about the database and the tables it contains,\n", - "\n", - "3. We will write a query and send it to the server, and finally\n", - "\n", - "4. We will download the response from the server.\n", - "\n", - "After completing this lesson, you should be able to\n", - "\n", - "* Compose a basic query in ADQL.\n", - "\n", - "* Use queries to explore a database and its tables.\n", - "\n", - "* Use queries to download data.\n", - "\n", - "* Develop, test, and debug a query incrementally." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Query Language\n", - "\n", - "In order to select data from a database, you have to compose a query, which is like a program written in a \"query language\".\n", - "The query language we'll use is ADQL, which stands for \"Astronomical Data Query Language\".\n", - "\n", - "ADQL is a dialect of [SQL](https://en.wikipedia.org/wiki/SQL) (Structured Query Language), which is by far the most commonly used query language. Almost everything you will learn about ADQL also works in SQL.\n", - "\n", - "[The reference manual for ADQL is here](http://www.ivoa.net/documents/ADQL/20180112/PR-ADQL-2.1-20180112.html).\n", - "But you might find it easier to learn from [this ADQL Cookbook](https://www.gaia.ac.uk/data/gaia-data-release-1/adql-cookbook)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Installing libraries\n", - "\n", - "The library we'll use to get Gaia data is [Astroquery](https://astroquery.readthedocs.io/en/latest/).\n", - "\n", - "If you are running this notebook on Colab, you can run the following cell to install Astroquery and the other libraries we'll use.\n", - "\n", - "If you are running this notebook on your own computer, you might have to install these libraries yourself. \n", - "\n", - "If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions.\n", - "\n", - "TODO: Add a link to the instructions.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# If we're running on Colab, install libraries\n", - "\n", - "import sys\n", - "IN_COLAB = 'google.colab' in sys.modules\n", - "\n", - "if IN_COLAB:\n", - " !pip install astroquery astro-gala pyia" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Connecting to Gaia\n", - "\n", - "Astroquery provides `Gaia`, which is an [object that represents a connection to the Gaia database](https://astroquery.readthedocs.io/en/latest/gaia/gaia.html).\n", - "\n", - "We can connect to the Gaia database like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: gea.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n", - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: geadata.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n" - ] - } - ], - "source": [ - "from astroquery.gaia import Gaia" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Optional detail \n", - "\n", - "> Running this import statement has the effect of creating a [TAP+](http://www.ivoa.net/documents/TAP/) connection; TAP stands for \"Table Access Protocol\". It is a network protocol for sending queries to the database and getting back the results. We're not sure why it seems to create two connections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Databases and Tables\n", - "\n", - "What is a database, anyway? Most generally, it can be any collection of data, but when we are talking about ADQL or SQL:\n", - "\n", - "* A database is a collection of one or more named tables.\n", - "\n", - "* Each table is a 2-D array with one or more named columns of data.\n", - "\n", - "We can use `Gaia.load_tables` to get the names of the tables in the Gaia database. With the option `only_names=True`, it loads information about the tables, called the \"metadata\", not the data itself." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO: Retrieving tables... [astroquery.utils.tap.core]\n", - "INFO: Parsing tables... [astroquery.utils.tap.core]\n", - "INFO: Done. [astroquery.utils.tap.core]\n" - ] - } - ], - "source": [ - "tables = Gaia.load_tables(only_names=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "external.external.apassdr9\n", - "external.external.gaiadr2_geometric_distance\n", - "external.external.galex_ais\n", - "external.external.ravedr5_com\n", - "external.external.ravedr5_dr5\n", - "external.external.ravedr5_gra\n", - "external.external.ravedr5_on\n", - "external.external.sdssdr13_photoprimary\n", - "external.external.skymapperdr1_master\n", - "external.external.tmass_xsc\n", - "public.public.hipparcos\n", - "public.public.hipparcos_newreduction\n", - "public.public.hubble_sc\n", - "public.public.igsl_source\n", - "public.public.igsl_source_catalog_ids\n", - "public.public.tycho2\n", - "public.public.dual\n", - "tap_config.tap_config.coord_sys\n", - "tap_config.tap_config.properties\n", - "tap_schema.tap_schema.columns\n", - "tap_schema.tap_schema.key_columns\n", - "tap_schema.tap_schema.keys\n", - "tap_schema.tap_schema.schemas\n", - "tap_schema.tap_schema.tables\n", - "gaiadr1.gaiadr1.aux_qso_icrf2_match\n", - "gaiadr1.gaiadr1.ext_phot_zero_point\n", - "gaiadr1.gaiadr1.allwise_best_neighbour\n", - "gaiadr1.gaiadr1.allwise_neighbourhood\n", - "gaiadr1.gaiadr1.gsc23_best_neighbour\n", - "gaiadr1.gaiadr1.gsc23_neighbourhood\n", - "gaiadr1.gaiadr1.ppmxl_best_neighbour\n", - "gaiadr1.gaiadr1.ppmxl_neighbourhood\n", - "gaiadr1.gaiadr1.sdss_dr9_best_neighbour\n", - "gaiadr1.gaiadr1.sdss_dr9_neighbourhood\n", - "gaiadr1.gaiadr1.tmass_best_neighbour\n", - "gaiadr1.gaiadr1.tmass_neighbourhood\n", - "gaiadr1.gaiadr1.ucac4_best_neighbour\n", - "gaiadr1.gaiadr1.ucac4_neighbourhood\n", - "gaiadr1.gaiadr1.urat1_best_neighbour\n", - "gaiadr1.gaiadr1.urat1_neighbourhood\n", - "gaiadr1.gaiadr1.cepheid\n", - "gaiadr1.gaiadr1.phot_variable_time_series_gfov\n", - "gaiadr1.gaiadr1.phot_variable_time_series_gfov_statistical_parameters\n", - "gaiadr1.gaiadr1.rrlyrae\n", - "gaiadr1.gaiadr1.variable_summary\n", - "gaiadr1.gaiadr1.allwise_original_valid\n", - "gaiadr1.gaiadr1.gsc23_original_valid\n", - "gaiadr1.gaiadr1.ppmxl_original_valid\n", - "gaiadr1.gaiadr1.sdssdr9_original_valid\n", - "gaiadr1.gaiadr1.tmass_original_valid\n", - "gaiadr1.gaiadr1.ucac4_original_valid\n", - "gaiadr1.gaiadr1.urat1_original_valid\n", - "gaiadr1.gaiadr1.gaia_source\n", - "gaiadr1.gaiadr1.tgas_source\n", - "gaiadr2.gaiadr2.aux_allwise_agn_gdr2_cross_id\n", - "gaiadr2.gaiadr2.aux_iers_gdr2_cross_id\n", - "gaiadr2.gaiadr2.aux_sso_orbit_residuals\n", - "gaiadr2.gaiadr2.aux_sso_orbits\n", - "gaiadr2.gaiadr2.dr1_neighbourhood\n", - "gaiadr2.gaiadr2.allwise_best_neighbour\n", - "gaiadr2.gaiadr2.allwise_neighbourhood\n", - "gaiadr2.gaiadr2.apassdr9_best_neighbour\n", - "gaiadr2.gaiadr2.apassdr9_neighbourhood\n", - "gaiadr2.gaiadr2.gsc23_best_neighbour\n", - "gaiadr2.gaiadr2.gsc23_neighbourhood\n", - "gaiadr2.gaiadr2.hipparcos2_best_neighbour\n", - "gaiadr2.gaiadr2.hipparcos2_neighbourhood\n", - "gaiadr2.gaiadr2.panstarrs1_best_neighbour\n", - "gaiadr2.gaiadr2.panstarrs1_neighbourhood\n", - "gaiadr2.gaiadr2.ppmxl_best_neighbour\n", - "gaiadr2.gaiadr2.ppmxl_neighbourhood\n", - "gaiadr2.gaiadr2.ravedr5_best_neighbour\n", - "gaiadr2.gaiadr2.ravedr5_neighbourhood\n", - "gaiadr2.gaiadr2.sdssdr9_best_neighbour\n", - "gaiadr2.gaiadr2.sdssdr9_neighbourhood\n", - "gaiadr2.gaiadr2.tmass_best_neighbour\n", - "gaiadr2.gaiadr2.tmass_neighbourhood\n", - "gaiadr2.gaiadr2.tycho2_best_neighbour\n", - "gaiadr2.gaiadr2.tycho2_neighbourhood\n", - "gaiadr2.gaiadr2.urat1_best_neighbour\n", - "gaiadr2.gaiadr2.urat1_neighbourhood\n", - "gaiadr2.gaiadr2.sso_observation\n", - "gaiadr2.gaiadr2.sso_source\n", - "gaiadr2.gaiadr2.vari_cepheid\n", - "gaiadr2.gaiadr2.vari_classifier_class_definition\n", - "gaiadr2.gaiadr2.vari_classifier_definition\n", - "gaiadr2.gaiadr2.vari_classifier_result\n", - "gaiadr2.gaiadr2.vari_long_period_variable\n", - "gaiadr2.gaiadr2.vari_rotation_modulation\n", - "gaiadr2.gaiadr2.vari_rrlyrae\n", - "gaiadr2.gaiadr2.vari_short_timescale\n", - "gaiadr2.gaiadr2.vari_time_series_statistics\n", - "gaiadr2.gaiadr2.panstarrs1_original_valid\n", - "gaiadr2.gaiadr2.gaia_source\n", - "gaiadr2.gaiadr2.ruwe\n" - ] - } - ], - "source": [ - "for table in (tables):\n", - " print(table.get_qualified_name())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So that's a lot of tables. The ones we'll use are:\n", - "\n", - "* `gaiadr2.gaia_source`, which contains Gaia data from [data release 2](https://www.cosmos.esa.int/web/gaia/data-release-2),\n", - "\n", - "* `gaiadr2.panstarrs1_original_valid`, which contains the photometry data we'll use from PanSTARRS, and\n", - "\n", - "* `gaiadr2.panstarrs1_best_neighbour`, which we'll use to cross-match each star observed by Gaia with the same star observed by PanSTARRS.\n", - "\n", - "We can use `load_table` (not `load_tables`) to get the metadata for a single table. The name of this function is misleading, because it only downloads metadata. " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Retrieving table 'gaiadr2.gaia_source'\n", - "Parsing table 'gaiadr2.gaia_source'...\n", - "Done.\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "meta = Gaia.load_table('gaiadr2.gaia_source')\n", - "meta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jupyter shows that the result is an object of type `TapTableMeta`, but it does not display the contents.\n", - "\n", - "To see the metadata, we have to print the object." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TAP Table name: gaiadr2.gaiadr2.gaia_source\n", - "Description: This table has an entry for every Gaia observed source as listed in the\n", - "Main Database accumulating catalogue version from which the catalogue\n", - "release has been generated. It contains the basic source parameters,\n", - "that is only final data (no epoch data) and no spectra (neither final\n", - "nor epoch).\n", - "Num. columns: 96\n" - ] - } - ], - "source": [ - "print(meta)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice one gotcha: in the list of table names, this table appears as `gaiadr2.gaiadr2.gaia_source`, but when we load the metadata, we refer to it as `gaiadr2.gaia_source`.\n", - "\n", - "**Exercise:** Go back and try\n", - "\n", - "```\n", - "meta = Gaia.load_table('gaiadr2.gaiadr2.gaia_source')\n", - "```\n", - "\n", - "What happens? Is the error message helpful? If you had not made this error deliberately, would you have been able to figure it out?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Columns\n", - "\n", - "The following loop prints the names of the columns in the table." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "solution_id\n", - "designation\n", - "source_id\n", - "random_index\n", - "ref_epoch\n", - "ra\n", - "ra_error\n", - "dec\n", - "dec_error\n", - "parallax\n", - "parallax_error\n", - "parallax_over_error\n", - "pmra\n", - "pmra_error\n", - "pmdec\n", - "pmdec_error\n", - "ra_dec_corr\n", - "ra_parallax_corr\n", - "ra_pmra_corr\n", - "ra_pmdec_corr\n", - "dec_parallax_corr\n", - "dec_pmra_corr\n", - "dec_pmdec_corr\n", - "parallax_pmra_corr\n", - "parallax_pmdec_corr\n", - "pmra_pmdec_corr\n", - "astrometric_n_obs_al\n", - "astrometric_n_obs_ac\n", - "astrometric_n_good_obs_al\n", - "astrometric_n_bad_obs_al\n", - "astrometric_gof_al\n", - "astrometric_chi2_al\n", - "astrometric_excess_noise\n", - "astrometric_excess_noise_sig\n", - "astrometric_params_solved\n", - "astrometric_primary_flag\n", - "astrometric_weight_al\n", - "astrometric_pseudo_colour\n", - "astrometric_pseudo_colour_error\n", - "mean_varpi_factor_al\n", - "astrometric_matched_observations\n", - "visibility_periods_used\n", - "astrometric_sigma5d_max\n", - "frame_rotator_object_type\n", - "matched_observations\n", - "duplicated_source\n", - "phot_g_n_obs\n", - "phot_g_mean_flux\n", - "phot_g_mean_flux_error\n", - "phot_g_mean_flux_over_error\n", - "phot_g_mean_mag\n", - "phot_bp_n_obs\n", - "phot_bp_mean_flux\n", - "phot_bp_mean_flux_error\n", - "phot_bp_mean_flux_over_error\n", - "phot_bp_mean_mag\n", - "phot_rp_n_obs\n", - "phot_rp_mean_flux\n", - "phot_rp_mean_flux_error\n", - "phot_rp_mean_flux_over_error\n", - "phot_rp_mean_mag\n", - "phot_bp_rp_excess_factor\n", - "phot_proc_mode\n", - "bp_rp\n", - "bp_g\n", - "g_rp\n", - "radial_velocity\n", - "radial_velocity_error\n", - "rv_nb_transits\n", - "rv_template_teff\n", - "rv_template_logg\n", - "rv_template_fe_h\n", - "phot_variable_flag\n", - "l\n", - "b\n", - "ecl_lon\n", - "ecl_lat\n", - "priam_flags\n", - "teff_val\n", - "teff_percentile_lower\n", - "teff_percentile_upper\n", - "a_g_val\n", - "a_g_percentile_lower\n", - "a_g_percentile_upper\n", - "e_bp_min_rp_val\n", - "e_bp_min_rp_percentile_lower\n", - "e_bp_min_rp_percentile_upper\n", - "flame_flags\n", - "radius_val\n", - "radius_percentile_lower\n", - "radius_percentile_upper\n", - "lum_val\n", - "lum_percentile_lower\n", - "lum_percentile_upper\n", - "datalink_url\n", - "epoch_photometry_url\n" - ] - } - ], - "source": [ - "for column in meta.columns:\n", - " print(column.name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can probably guess what many of these columns are by looking at the names, but you should resist the temptation to guess.\n", - "To find out what the columns mean, [read the documentation](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html).\n", - "\n", - "If you want to know what can go wrong when you don't read the documentation, [you might like this article](https://www.vox.com/future-perfect/2019/6/4/18650969/married-women-miserable-fake-paul-dolan-happiness)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** One of the other tables we'll use is `gaiadr2.gaiadr2.panstarrs1_original_valid`. Use `load_table` to get the metadata for this table. How many columns are there and what are their names?\n", - "\n", - "Hint: Remember the gotcha we mentioned earlier." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Retrieving table 'gaiadr2.panstarrs1_original_valid'\n", - "Parsing table 'gaiadr2.panstarrs1_original_valid'...\n", - "Done.\n", - "TAP Table name: gaiadr2.gaiadr2.panstarrs1_original_valid\n", - "Description: The Panoramic Survey Telescope and Rapid Response System (Pan-STARRS) is\n", - "a system for wide-field astronomical imaging developed and operated by\n", - "the Institute for Astronomy at the University of Hawaii. Pan-STARRS1\n", - "(PS1) is the first part of Pan-STARRS to be completed and is the basis\n", - "for Data Release 1 (DR1). The PS1 survey used a 1.8 meter telescope and\n", - "its 1.4 Gigapixel camera to image the sky in five broadband filters (g,\n", - "r, i, z, y).\n", - "\n", - "The current table contains a filtered subsample of the 10 723 304 629\n", - "entries listed in the original ObjectThin table.\n", - "We used only ObjectThin and MeanObject tables to extract\n", - "panstarrs1OriginalValid table, this means that objects detected only in\n", - "stack images are not included here. The main reason for us to avoid the\n", - "use of objects detected in stack images is that their astrometry is not\n", - "as good as the mean objects astrometry: “The stack positions (raStack,\n", - "decStack) have considerably larger systematic astrometric errors than\n", - "the mean epoch positions (raMean, decMean).” The astrometry for the\n", - "MeanObject positions uses Gaia DR1 as a reference catalog, while the\n", - "stack positions use 2MASS as a reference catalog.\n", - "\n", - "In details, we filtered out all objects where:\n", - "\n", - "- nDetections = 1\n", - "\n", - "- no good quality data in Pan-STARRS, objInfoFlag 33554432 not set\n", - "\n", - "- mean astrometry could not be measured, objInfoFlag 524288 set\n", - "\n", - "- stack position used for mean astrometry, objInfoFlag 1048576 set\n", - "\n", - "- error on all magnitudes equal to 0 or to -999;\n", - "\n", - "- all magnitudes set to -999;\n", - "\n", - "- error on RA or DEC greater than 1 arcsec.\n", - "\n", - "The number of objects in panstarrs1OriginalValid is 2 264 263 282.\n", - "\n", - "The panstarrs1OriginalValid table contains only a subset of the columns\n", - "available in the combined ObjectThin and MeanObject tables. A\n", - "description of the original ObjectThin and MeanObjects tables can be\n", - "found at:\n", - "https://outerspace.stsci.edu/display/PANSTARRS/PS1+Database+object+and+detection+tables\n", - "\n", - "Download:\n", - "http://mastweb.stsci.edu/ps1casjobs/home.aspx\n", - "Documentation:\n", - "https://outerspace.stsci.edu/display/PANSTARRS\n", - "http://pswww.ifa.hawaii.edu/pswww/\n", - "References:\n", - "The Pan-STARRS1 Surveys, Chambers, K.C., et al. 2016, arXiv:1612.05560\n", - "Pan-STARRS Data Processing System, Magnier, E. A., et al. 2016,\n", - "arXiv:1612.05240\n", - "Pan-STARRS Pixel Processing: Detrending, Warping, Stacking, Waters, C.\n", - "Z., et al. 2016, arXiv:1612.05245\n", - "Pan-STARRS Pixel Analysis: Source Detection and Characterization,\n", - "Magnier, E. A., et al. 2016, arXiv:1612.05244\n", - "Pan-STARRS Photometric and Astrometric Calibration, Magnier, E. A., et\n", - "al. 2016, arXiv:1612.05242\n", - "The Pan-STARRS1 Database and Data Products, Flewelling, H. A., et al.\n", - "2016, arXiv:1612.05243\n", - "\n", - "Catalogue curator:\n", - "SSDC - ASI Space Science Data Center\n", - "https://www.ssdc.asi.it/\n", - "Num. columns: 26\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "meta2 = Gaia.load_table('gaiadr2.panstarrs1_original_valid')\n", - "print(meta2)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "obj_name\n", - "obj_id\n", - "ra\n", - "dec\n", - "ra_error\n", - "dec_error\n", - "epoch_mean\n", - "g_mean_psf_mag\n", - "g_mean_psf_mag_error\n", - "g_flags\n", - "r_mean_psf_mag\n", - "r_mean_psf_mag_error\n", - "r_flags\n", - "i_mean_psf_mag\n", - "i_mean_psf_mag_error\n", - "i_flags\n", - "z_mean_psf_mag\n", - "z_mean_psf_mag_error\n", - "z_flags\n", - "y_mean_psf_mag\n", - "y_mean_psf_mag_error\n", - "y_flags\n", - "n_detections\n", - "zone_id\n", - "obj_info_flag\n", - "quality_flag\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "for column in meta2.columns:\n", - " print(column.name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Writing queries\n", - "\n", - "By now you might be wondering how we actually download the data. With tables this big, you generally don't. Instead, you use queries to select only the data you want.\n", - "\n", - "A query is a string written in a query language like SQL; for the Gaia database, the query language is a dialect of SQL called ADQL.\n", - "\n", - "Here's an example of an ADQL query." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "query1 = \"\"\"SELECT \n", - "TOP 10\n", - "source_id, ref_epoch, ra, dec, parallax \n", - "FROM gaiadr2.gaia_source\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Python note:** We use a [triple-quoted string](https://docs.python.org/3/tutorial/introduction.html#strings) here so we can include line breaks in the query, which makes it easier to read.\n", - "\n", - "The words in uppercase are ADQL keywords:\n", - "\n", - "* `SELECT` indicates that we are selecting data (as opposed to adding or modifying data).\n", - "\n", - "* `TOP` indicates that we only want the first 10 rows of the table, which is useful for testing a query before asking for all of the data.\n", - "\n", - "* `FROM` specifies which table we want data from.\n", - "\n", - "The third line is a list of column names, indicating which columns we want. \n", - "\n", - "In this example, the keywords are capitalized and the column names are lowercase. This is a common style, but it is not required. ADQL and SQL are not case-sensitive." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run this query, we use the `Gaia` object, which represents our connection to the Gaia database, and invoke `launch_job`:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "job1 = Gaia.launch_job(query1)\n", - "job1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an object that represents the job running on a Gaia server.\n", - "\n", - "If you print it, it displays metadata for the forthcoming table." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - " name dtype unit description \n", - "--------- ------- ---- ------------------------------------------------------------------\n", - "source_id int64 Unique source identifier (unique within a particular Data Release)\n", - "ref_epoch float64 yr Reference epoch\n", - " ra float64 deg Right ascension\n", - " dec float64 deg Declination\n", - " parallax float64 mas Parallax\n", - "Jobid: None\n", - "Phase: COMPLETED\n", - "Owner: None\n", - "Output file: sync_20201005090721.xml.gz\n", - "Results: None\n" - ] - } - ], - "source": [ - "print(job1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Don't worry about `Results: None`. That does not actually mean there are no results.\n", - "\n", - "However, `Phase: COMPLETED` indicates that the job is complete, so we can get the results like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "astropy.table.table.Table" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results1 = job1.get_results()\n", - "type(results1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Optional detail:** Why is `table` repeated three times? The first is the name of the module, the second is the name of the submodule, and the third is the name of the class. Most of the time we only care about the last one. It's like the Linnean name for gorilla, which is *Gorilla Gorilla Gorilla*." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an [Astropy Table](https://docs.astropy.org/en/stable/table/), which is similar to a table in an SQL database except:\n", - "\n", - "* SQL databases are stored on disk drives, so they are persistent; that is, they \"survive\" even if you turn off the computer. An Astropy `Table` is stored in memory; it disappears when you turn off the computer (or shut down this Jupyter notebook).\n", - "\n", - "* SQL databases are designed to process queries. An Astropy `Table` can perform some query-like operations, like selecting columns and rows. But these operations use Python syntax, not SQL.\n", - "\n", - "Jupyter knows how to display the contents of a `Table`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "Table length=10\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307550606271623682015.5281.267623626829920.5585239223461581.1422630184554958
    45307468443413159682015.5281.137043174954120.3778523888981841.0092247424630945
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    " - ], - "text/plain": [ - "\n", - " source_id ref_epoch ... dec parallax \n", - " yr ... deg mas \n", - " int64 float64 ... float64 float64 \n", - "------------------- --------- ... ------------------ --------------------\n", - "4530738361793769600 2015.5 ... 20.40682117430378 0.9785380604519425\n", - "4530752651135081216 2015.5 ... 20.523350496351846 0.2674800612552977\n", - "4530743343951405568 2015.5 ... 20.474147574053124 -0.43911323550176806\n", - "4530755060627162368 2015.5 ... 20.558523922346158 1.1422630184554958\n", - "4530746844341315968 2015.5 ... 20.377852388898184 1.0092247424630945\n", - "4530768456615026432 2015.5 ... 20.31829694530366 -0.06900136127674149\n", - "4530763513119137280 2015.5 ... 20.20956829578524 0.1266016679823622\n", - "4530736364618539264 2015.5 ... 20.346579041327693 0.3894019486060072\n", - "4530735952305177728 2015.5 ... 20.311030903719928 0.2041189982608354\n", - "4530751281056022656 2015.5 ... 20.460309556214753 0.10294642821734962" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each column has a name, units, and a data type.\n", - "\n", - "For example, the units of `ra` and `dec` are degrees, and their data type is `float64`, which is a 64-bit floating-point number, used to store measurements with a fraction part.\n", - "\n", - "This information comes from the Gaia database, and has been stored in the Astropy `Table` by Astroquery." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Read [the documentation of this table](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html) and choose a column that looks interesting to you. Add the column name to the query and run it again. What are the units of the column you selected? What is its data type?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Asynchronous queries\n", - "\n", - "`launch_job` asks the server to run the job \"synchronously\", which normally means it runs immediately. But synchronous jobs are limited to 2000 rows. For queries that return more rows, you should run \"asynchronously\", which mean they might take longer to get started.\n", - "\n", - "If you are not sure how many rows a query will return, you can use the SQL command `COUNT` to find out how many rows are in the result without actually returning them. We'll see an example of this later.\n", - "\n", - "The results of an asynchronous query are stored in a file on the server, so you can start a query and come back later to get the results.\n", - "\n", - "For anonymous users, files are kept for three days.\n", - "\n", - "As an example, let's try a query that's similar to `query1`, with two changes:\n", - "\n", - "* It selects the first 3000 rows, so it is bigger than we should run synchronously.\n", - "\n", - "* It uses a new keyword, `WHERE`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "query2 = \"\"\"SELECT TOP 3000\n", - "source_id, ref_epoch, ra, dec, parallax\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `WHERE` clause indicates which rows we want; in this case, the query selects only rows \"where\" `parallax` is less than 1. This has the effect of selecting stars with relatively low parallax, which are farther away. We'll use this clause to exclude nearby stars that are unlikely to be part of GD-1.\n", - "\n", - "`WHERE` is one of the most common clauses in ADQL/SQL, and one of the most useful, because it allows us to select only the rows we need from the database.\n", - "\n", - "We use `launch_job_async` to submit an asynchronous query." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO: Query finished. [astroquery.utils.tap.core]\n", - "
    \n", - " name dtype unit description \n", - "--------- ------- ---- ------------------------------------------------------------------\n", - "source_id int64 Unique source identifier (unique within a particular Data Release)\n", - "ref_epoch float64 yr Reference epoch\n", - " ra float64 deg Right ascension\n", - " dec float64 deg Declination\n", - " parallax float64 mas Parallax\n", - "Jobid: 1601903242219O\n", - "Phase: COMPLETED\n", - "Owner: None\n", - "Output file: async_20201005090722.vot\n", - "Results: None\n" - ] - } - ], - "source": [ - "job2 = Gaia.launch_job_async(query2)\n", - "print(job2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "Table length=3000\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    45307409387744093442015.5281.376256953641620.4361400589412060.9242670062090182
    ...............
    44677109150118026242015.5269.96809693073471.14290850381608820.42361471245557913
    44677065513286795522015.5270.0331645898811.05657473236899270.922888231734588
    44677122550373000962015.5270.77247179230470.6581664892880896-2.669179465293931
    44677350011817617922015.5270.36286062483080.89470793235991240.6117399163086398
    44677371014219166722015.5270.51108346614440.9806225910160181-0.39818224846127004
    44677075477573274882015.5269.887462805949271.02127599401369620.7741412301054209
    44677327720945730562015.5270.559971827601260.9037072088489417-1.7920417800164183
    44677323554910877442015.5270.67307907024910.9197224705139885-0.3464446494840354
    44677170997669445122015.5270.576671731208250.7262776590095680.05443955111134051
    44677190582657812482015.5270.72480529715140.82055519217827850.3733943917490343
    " - ], - "text/plain": [ - "\n", - " source_id ref_epoch ... dec parallax \n", - " yr ... deg mas \n", - " int64 float64 ... float64 float64 \n", - "------------------- --------- ... ------------------ --------------------\n", - "4530738361793769600 2015.5 ... 20.40682117430378 0.9785380604519425\n", - "4530752651135081216 2015.5 ... 20.523350496351846 0.2674800612552977\n", - "4530743343951405568 2015.5 ... 20.474147574053124 -0.43911323550176806\n", - "4530768456615026432 2015.5 ... 20.31829694530366 -0.06900136127674149\n", - "4530763513119137280 2015.5 ... 20.20956829578524 0.1266016679823622\n", - "4530736364618539264 2015.5 ... 20.346579041327693 0.3894019486060072\n", - "4530735952305177728 2015.5 ... 20.311030903719928 0.2041189982608354\n", - "4530751281056022656 2015.5 ... 20.460309556214753 0.10294642821734962\n", - "4530740938774409344 2015.5 ... 20.436140058941206 0.9242670062090182\n", - " ... ... ... ... ...\n", - "4467710915011802624 2015.5 ... 1.1429085038160882 0.42361471245557913\n", - "4467706551328679552 2015.5 ... 1.0565747323689927 0.922888231734588\n", - "4467712255037300096 2015.5 ... 0.6581664892880896 -2.669179465293931\n", - "4467735001181761792 2015.5 ... 0.8947079323599124 0.6117399163086398\n", - "4467737101421916672 2015.5 ... 0.9806225910160181 -0.39818224846127004\n", - "4467707547757327488 2015.5 ... 1.0212759940136962 0.7741412301054209\n", - "4467732772094573056 2015.5 ... 0.9037072088489417 -1.7920417800164183\n", - "4467732355491087744 2015.5 ... 0.9197224705139885 -0.3464446494840354\n", - "4467717099766944512 2015.5 ... 0.726277659009568 0.05443955111134051\n", - "4467719058265781248 2015.5 ... 0.8205551921782785 0.3733943917490343" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2 = job2.get_results()\n", - "results2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You might notice that some values of `parallax` are negative. As [this FAQ explains](https://www.cosmos.esa.int/web/gaia/archive-tips#negative%20parallax), \"Negative parallaxes are caused by errors in the observations.\" Negative parallaxes have \"no physical meaning,\" but they can be a \"useful diagnostic on the quality of the astrometric solution.\"\n", - "\n", - "Later we will see an example where we use `parallax` and `parallax_error` to identify stars where the distance estimate is likely to be inaccurate." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The clauses in a query have to be in the right order. Go back and change the order of the clauses in `query2` and run it again. \n", - "\n", - "The query should fail, but notice that you don't get much useful debugging information. \n", - "\n", - "For this reason, developing and debugging ADQL queries can be really hard. A few suggestions that might help:\n", - "\n", - "* Whenever possible, start with a working query, either an example you find online or a query you have used in the past.\n", - "\n", - "* Make small changes and test each change before you continue.\n", - "\n", - "* While you are debugging, use `TOP` to limit the number of rows in the result. That will make each attempt run faster, which reduces your testing time. \n", - "\n", - "* Launching test queries synchronously might make them start faster, too." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Operators\n", - "\n", - "In a `WHERE` clause, you can use any of the [SQL comparison operators](https://www.w3schools.com/sql/sql_operators.asp); here are the most common ones:\n", - "\n", - "| Symbol | Operation\n", - "|--------| :---\n", - "| `>` | greater than\n", - "| `<` | less than\n", - "| `>=` | greater than or equal\n", - "| `<=` | less than or equal\n", - "| `=` | equal\n", - "| `!=` or `<>` | not equal\n", - "\n", - "Most of these are the same as Python, but some are not. In particular, notice that the equality operator is `=`, not `==`.\n", - "Be careful to keep your Python out of your ADQL!\n", - "\n", - "You can combine comparisons using the logical operators:\n", - "\n", - "* AND: true if both comparisons are true\n", - "* OR: true if either or both comparisons are true\n", - "\n", - "Finally, you can use `NOT` to invert the result of a comparison. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** [Read about SQL operators here](https://www.w3schools.com/sql/sql_operators.asp) and then modify the previous query to select rows where `bp_rp` is between `-0.75` and `2`.\n", - "\n", - "You can [read about this variable here](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# This is what most people will probably do\n", - "\n", - "query = \"\"\"SELECT TOP 10\n", - "source_id, ref_epoch, ra, dec, parallax\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1 \n", - " AND bp_rp > -0.75 AND bp_rp < 2\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# But if someone notices the BETWEEN operator, \n", - "# they might do this\n", - "\n", - "query = \"\"\"SELECT TOP 10\n", - "source_id, ref_epoch, ra, dec, parallax\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1 \n", - " AND bp_rp BETWEEN -0.75 AND 2\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This [Hertzsprung-Russell diagram](https://sci.esa.int/web/gaia/-/60198-gaia-hertzsprung-russell-diagram) shows the BP-RP color and luminosity of stars in the Gaia catalog.\n", - "\n", - "Selecting stars with `bp-rp` less than 2 excludes many [class M dwarf stars](https://xkcd.com/2360/), which are low temperature, low luminosity. A star like that at GD-1's distance would be hard to detect, so if it is detected, it it more likely to be in the foreground." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Cleaning up\n", - "\n", - "Asynchronous jobs have a `jobid`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(None, '1601903242219O')" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "job1.jobid, job2.jobid" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Which you can use to remove the job from the server." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Removed jobs: '['1601903242219O']'.\n" - ] - } - ], - "source": [ - "Gaia.remove_jobs([job2.jobid])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you don't remove it job from the server, it will be removed eventually, so don't feel too bad if you don't clean up after yourself." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Formatting queries\n", - "\n", - "So far the queries have been string \"literals\", meaning that the entire string is part of the program.\n", - "But writing queries yourself can be slow, repetitive, and error-prone.\n", - "\n", - "It is often a good idea to write Python code that assembles a query for you. One useful tool for that is the [string `format` method](https://www.w3schools.com/python/ref_string_format.asp).\n", - "\n", - "As an example, we'll divide the previous query into two parts; a list of column names and a \"base\" for the query that contains everything except the column names.\n", - "\n", - "Here's the list of columns we'll select. " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the base; it's a string that contains at least one format specifier in curly brackets (braces)." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "query3_base = \"\"\"SELECT TOP 10 \n", - "{columns}\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - " AND bp_rp BETWEEN -0.75 AND 2\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This base query contains one format specifier, `{columns}`, which is a placeholder for the list of column names we will provide.\n", - "\n", - "To assemble the query, we invoke `format` on the base string and provide a keyword argument that assigns a value to `columns`." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "query3 = query3_base.format(columns=columns)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is a string with line breaks. If you display it, the line breaks appear as `\\n`." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'SELECT TOP 10 \\nsource_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\\nFROM gaiadr2.gaia_source\\nWHERE parallax < 1\\n AND bp_rp BETWEEN -0.75 AND 2\\n'" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you print it, the line breaks appear as... line breaks." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT TOP 10 \n", - "source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - " AND bp_rp BETWEEN -0.75 AND 2\n", - "\n" - ] - } - ], - "source": [ - "print(query3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that the format specifier has been replaced with the value of `columns`.\n", - "\n", - "Let's run it and see if it works:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "
    \n", - " name dtype unit description n_bad\n", - "--------------- ------- -------- ------------------------------------------------------------------ -----\n", - " source_id int64 Unique source identifier (unique within a particular Data Release) 0\n", - " ra float64 deg Right ascension 0\n", - " dec float64 deg Declination 0\n", - " pmra float64 mas / yr Proper motion in right ascension direction 0\n", - " pmdec float64 mas / yr Proper motion in declination direction 0\n", - " parallax float64 mas Parallax 0\n", - " parallax_error float64 mas Standard error of parallax 0\n", - "radial_velocity float64 km / s Radial velocity 10\n", - "Jobid: None\n", - "Phase: COMPLETED\n", - "Owner: None\n", - "Output file: sync_20201005090726.xml.gz\n", - "Results: None\n" - ] - } - ], - "source": [ - "job3 = Gaia.launch_job(query3)\n", - "print(job3)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "Table length=10\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    source_idradecpmrapmdecparallaxparallax_errorradial_velocity
    degdegmas / yrmas / yrmasmaskm / s
    int64float64float64float64float64float64float64float64
    4467710915011802624269.96809693073471.14290850381608822.0233280236600626-2.56924278755102660.423614712455579130.470352406647465--
    4467706551328679552270.0331645898811.0565747323689927-3.414829591355289-3.84372158574957370.9228882317345880.927008559859825--
    4467712255037300096270.77247179230470.6581664892880896-3.5620173752896025-6.595792323153987-2.6691794652939310.9719742773203504--
    4467735001181761792270.36286062483080.89470793235991242.13070799264892050.88267277109107120.61173991630863980.509812721702093--
    4467737101421916672270.51108346614440.98062259101601810.17532366511560785-5.113270239706202-0.398182248461270040.7549581886719651--
    4467707547757327488269.887462805949271.0212759940136962-2.6382230817672987-3.7077765320492870.77414123010542090.3022057897812064--
    4467732355491087744270.67307907024910.9197224705139885-2.2735991502653037-11.864952855984358-0.34644464948403540.4937921513912002--
    4467717099766944512270.576671731208250.726277659009568-3.4598362614808367-4.6014268933659210.054439551111340510.8867339293525688--
    4467719058265781248270.72480529715140.8205551921782785-3.255079498426542-9.2492850691110850.37339439174903430.390952370410666--
    4467722326741572352270.874312918885040.85955659758691580.106963983518598261.2035993780158853-0.118509434328643730.1660452431882023--
    " - ], - "text/plain": [ - "\n", - " source_id ra ... parallax_error radial_velocity\n", - " deg ... mas km / s \n", - " int64 float64 ... float64 float64 \n", - "------------------- ------------------ ... ------------------ ---------------\n", - "4467710915011802624 269.9680969307347 ... 0.470352406647465 --\n", - "4467706551328679552 270.033164589881 ... 0.927008559859825 --\n", - "4467712255037300096 270.7724717923047 ... 0.9719742773203504 --\n", - "4467735001181761792 270.3628606248308 ... 0.509812721702093 --\n", - "4467737101421916672 270.5110834661444 ... 0.7549581886719651 --\n", - "4467707547757327488 269.88746280594927 ... 0.3022057897812064 --\n", - "4467732355491087744 270.6730790702491 ... 0.4937921513912002 --\n", - "4467717099766944512 270.57667173120825 ... 0.8867339293525688 --\n", - "4467719058265781248 270.7248052971514 ... 0.390952370410666 --\n", - "4467722326741572352 270.87431291888504 ... 0.1660452431882023 --" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results3 = job3.get_results()\n", - "results3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Good so far." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** This query always selects sources with `parallax` less than 1. But suppose you want to take that upper bound as an input.\n", - "\n", - "Modify `query3_base` to replace `1` with a format specifier like `{max_parallax}`. Now, when you call `format`, add a keyword argument that assigns a value to `max_parallax`, and confirm that the format specifier gets replaced with the value you provide." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "query4_base = \"\"\"SELECT TOP 10\n", - "{columns}\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < {max_parallax} AND \n", - "bp_rp BETWEEN -0.75 AND 2\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT TOP 10\n", - "source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 0.5 AND \n", - "bp_rp BETWEEN -0.75 AND 2\n", - "\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "query4 = query4_base.format(columns=columns,\n", - " max_parallax=0.5)\n", - "print(query)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Style note:** You might notice that the variable names in this notebook are numbered, like `query1`, `query2`, etc. \n", - "\n", - "The advantage of this style is that it isolates each section of the notebook from the others, so if you go back and run the cells out of order, it's less likely that you will get unexpected interactions.\n", - "\n", - "A drawback of this style is that it can be a nuisance to update the notebook if you add, remove, or reorder a section.\n", - "\n", - "What do you think of this choice? Are there alternatives you prefer?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "This notebook demonstrates the following steps:\n", - "\n", - "1. Making a connection to the Gaia server,\n", - "\n", - "2. Exploring information about the database and the tables it contains,\n", - "\n", - "3. Writing a query and sending it to the server, and finally\n", - "\n", - "4. Downloading the response from the server as an Astropy `Table`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Best practices\n", - "\n", - "* If you can't download an entire dataset (or it's not practical) use queries to select the data you need.\n", - "\n", - "* Read the metadata and the documentation to make sure you understand the tables, their columns, and what they mean.\n", - "\n", - "* Develop queries incrementally: start with something simple, test it, and add a little bit at a time.\n", - "\n", - "* Use ADQL features like `TOP` and `COUNT` to test before you run a query that might return a lot of data.\n", - "\n", - "* If you know your query will return fewer than 3000 rows, you can run it synchronously, which might complete faster (but it doesn't seem to make much difference). If it might return more than 3000 rows, you should run it asynchronously.\n", - "\n", - "* ADQL and SQL are not case-sensitive, so you don't have to capitalize the keywords, but you should.\n", - "\n", - "* ADQL and SQL don't require you to break a query into multiple lines, but you should.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jupyter notebooks can be good for developing and testing code, but they have some drawbacks. In particular, if you run the cells out of order, you might find that variables don't have the values you expect.\n", - "\n", - "There are a few things you can do to mitigate these problems:\n", - "\n", - "* Make each section of the notebook self-contained. Try not to use the same variable name in more than one section.\n", - "\n", - "* Keep notebooks short. Look for places where you can break your analysis into phases with one notebook per phase." - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/_sources/AstronomicalData/02_coords.ipynb b/_sources/AstronomicalData/02_coords.ipynb deleted file mode 100644 index 54821b3..0000000 --- a/_sources/AstronomicalData/02_coords.ipynb +++ /dev/null @@ -1,1970 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 2\n", - "\n", - "This is the second in a series of lessons related to astronomy data.\n", - "\n", - "As a running example, we are replicating parts of the analysis in a recent paper, \"[Off the beaten path: Gaia reveals GD-1 stars outside of the main stream](https://arxiv.org/abs/1805.00425)\" by Adrian M. Price-Whelan and Ana Bonaca.\n", - "\n", - "In the first notebook, we wrote ADQL queries and used them to select and download data from the Gaia server.\n", - "\n", - "In this notebook, we'll pick up where we left off and write a query to select stars from the region of the sky where we expect GD-1 to be." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll start with an example that does a \"cone search\"; that is, it selects stars that appear in a circular region of the sky.\n", - "\n", - "Then, to select stars in the vicinity of GD-1, we'll:\n", - "\n", - "* Use `Quantity` objects to represent measurements with units.\n", - "\n", - "* Use the `Gala` library to convert coordinates from one frame to another.\n", - "\n", - "* Use the ADQL keywords `POLYGON`, `CONTAINS`, and `POINT` to select stars that fall within a polygonal region.\n", - "\n", - "* Submit a query and download the results.\n", - "\n", - "* Store the results in a FITS file.\n", - "\n", - "After completing this lesson, you should be able to\n", - "\n", - "* Use Python string formatting to compose more complex ADQL queries.\n", - "\n", - "* Work with coordinates and other quantities that have units.\n", - "\n", - "* Download the results of a query and store them in a file." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Installing libraries\n", - "\n", - "If you are running this notebook on Colab, you can run the following cell to install Astroquery and a the other libraries we'll use.\n", - "\n", - "If you are running this notebook on your own computer, you might have to install these libraries yourself. \n", - "\n", - "If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions.\n", - "\n", - "TODO: Add a link to the instructions.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# If we're running on Colab, install libraries\n", - "\n", - "import sys\n", - "IN_COLAB = 'google.colab' in sys.modules\n", - "\n", - "if IN_COLAB:\n", - " !pip install astroquery astro-gala pyia" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Selecting a region" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One of the most common ways to restrict a query is to select stars in a particular region of the sky.\n", - "\n", - "For example, here's a query from the [Gaia archive documentation](https://gea.esac.esa.int/archive-help/adql/examples/index.html) that selects \"all the objects ... in a circular region centered at (266.41683, -29.00781) with a search radius of 5 arcmin (0.08333 deg).\"" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "query = \"\"\"\n", - "SELECT \n", - "TOP 10 source_id\n", - "FROM gaiadr2.gaia_source\n", - "WHERE 1=CONTAINS(\n", - " POINT(ra, dec),\n", - " CIRCLE(266.41683, -29.00781, 0.08333333))\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This query uses three keywords that are specific to ADQL (not SQL):\n", - "\n", - "* `POINT`: a location in [ICRS coordinates](https://en.wikipedia.org/wiki/International_Celestial_Reference_System), specified in degrees of right ascension and declination.\n", - "\n", - "* `CIRCLE`: a circle where the first two values are the coordinates of the center and the third is the radius in degrees.\n", - "\n", - "* `CONTAINS`: a function that returns `1` if a `POINT` is contained in a shape and `0` otherwise.\n", - "\n", - "Here is the [documentation of `CONTAINS`](http://www.ivoa.net/documents/ADQL/20180112/PR-ADQL-2.1-20180112.html#tth_sEc4.2.12).\n", - "\n", - "A query like this is called a cone search because it selects stars in a cone.\n", - "\n", - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: gea.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n", - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: geadata.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n" - ] - }, - { - "data": { - "text/html": [ - "Table length=10\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    source_id
    int64
    4057468321929794432
    4057468287575835392
    4057482027171038976
    4057470349160630656
    4057470039924301696
    4057469868125641984
    4057468351995073024
    4057469661959554560
    4057470520960672640
    4057470555320409600
    " - ], - "text/plain": [ - "\n", - " source_id \n", - " int64 \n", - "-------------------\n", - "4057468321929794432\n", - "4057468287575835392\n", - "4057482027171038976\n", - "4057470349160630656\n", - "4057470039924301696\n", - "4057469868125641984\n", - "4057468351995073024\n", - "4057469661959554560\n", - "4057470520960672640\n", - "4057470555320409600" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from astroquery.gaia import Gaia\n", - "\n", - "job = Gaia.launch_job(query)\n", - "result = job.get_results()\n", - "result" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you are debugging queries like this, you can use `TOP` to limit the size of the results, but then you still don't know how big the results will be.\n", - "\n", - "An alternative is to use `COUNT`, which asks for the number of rows that would be selected, but it does not return them.\n", - "\n", - "In the previous query, replace `TOP 10 source_id` with `COUNT(source_id)` and run the query again. How many stars has Gaia identified in the cone we searched?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Getting GD-1 Data\n", - "\n", - "From the Price-Whelan and Bonaca paper, we will try to reproduce Figure 1, which includes this representation of stars likely to belong to GD-1:\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Along the axis of right ascension ($\\phi_1$) the figure extends from -100 to 20 degrees.\n", - "\n", - "Along the axis of declination ($\\phi_2$) the figure extends from about -8 to 4 degrees.\n", - "\n", - "Ideally, we would select all stars from this rectangle, but there are more than 10 million of them, so\n", - "\n", - "* That would be difficult to work with,\n", - "\n", - "* As anonymous users, we are limited to 3 million rows in a single query, and\n", - "\n", - "* While we are developing and testing code, it will be faster to work with a smaller dataset.\n", - "\n", - "So we'll start by selecting stars in a smaller rectangle, from -55 to -45 degrees right ascension and -8 to 4 degrees of declination.\n", - "\n", - "But first we let's see how to represent quantities with units like degrees." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Working with coordinates\n", - "\n", - "Coordinates are physical quantities, which means that they have two parts, a value and a unit.\n", - "\n", - "For example, the coordinate $30^{\\circ}$ has value 30 and its units are degrees.\n", - "\n", - "Until recently, most scientific computation was done with values only; units were left out of the program altogether, [often with disastrous results](https://en.wikipedia.org/wiki/Mars_Climate_Orbiter#Cause_of_failure).\n", - "\n", - "Astropy provides tools for including units explicitly in computations, which makes it possible to detect errors before they cause disasters.\n", - "\n", - "To use Astropy units, we import them like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import astropy.units as u\n", - "\n", - "u" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`u` is an object that contains most common units and all SI units.\n", - "\n", - "You can use `dir` to list them, but you should also [read the documentation](https://docs.astropy.org/en/stable/units/)." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['A',\n", - " 'AA',\n", - " 'AB',\n", - " 'ABflux',\n", - " 'ABmag',\n", - " 'AU',\n", - " 'Angstrom',\n", - " 'B',\n", - " 'Ba',\n", - " 'Barye',\n", - " 'Bi',\n", - " 'Biot',\n", - " 'Bol',\n", - " 'Bq',\n", - " 'C',\n", - " 'Celsius',\n", - " 'Ci',\n", - " 'CompositeUnit',\n", - " 'D',\n", - " 'Da',\n", - " 'Dalton',\n", - " 'Debye',\n", - " 'Decibel',\n", - " 'DecibelUnit',\n", - " 'Dex',\n", - " 'DexUnit',\n", - " 'EA',\n", - " 'EAU',\n", - " 'EB',\n", - " 'EBa',\n", - " 'EC',\n", - " 'ED',\n", - " 'EF',\n", - " 'EG',\n", - " 'EGal',\n", - " 'EH',\n", - " 'EHz',\n", - " 'EJ',\n", - " 'EJy',\n", - " 'EK',\n", - " 'EL',\n", - " 'EN',\n", - " 'EOhm',\n", - " 'EP',\n", - " 'EPa',\n", - " 'ER',\n", - " 'ERy',\n", - " 'ES',\n", - " 'ESt',\n", - " 'ET',\n", - " 'EV',\n", - " 'EW',\n", - " 'EWb',\n", - " 'Ea',\n", - " 'Eadu',\n", - " 'Earcmin',\n", - " 'Earcsec',\n", - " 'Eau',\n", - " 'Eb',\n", - " 'Ebarn',\n", - " 'Ebeam',\n", - " 'Ebin',\n", - " 'Ebit',\n", - " 'Ebyte',\n", - " 'Ecd',\n", - " 'Echan',\n", - " 'Ecount',\n", - " 'Ect',\n", - " 'Ed',\n", - " 'Edeg',\n", - " 'Edyn',\n", - " 'EeV',\n", - " 'Eerg',\n", - " 'Eg',\n", - " 'Eh',\n", - " 'EiB',\n", - " 'Eib',\n", - " 'Eibit',\n", - " 'Eibyte',\n", - " 'Ek',\n", - " 'El',\n", - " 'Elm',\n", - " 'Elx',\n", - " 'Elyr',\n", - " 'Em',\n", - " 'Emag',\n", - " 'Emin',\n", - " 'Emol',\n", - " 'Eohm',\n", - " 'Epc',\n", - " 'Eph',\n", - " 'Ephoton',\n", - " 'Epix',\n", - " 'Epixel',\n", - " 'Erad',\n", - " 'Es',\n", - " 'Esr',\n", - " 'Eu',\n", - " 'Evox',\n", - " 'Evoxel',\n", - " 'Eyr',\n", - " 'F',\n", - " 'Farad',\n", - " 'Fr',\n", - " 'Franklin',\n", - " 'FunctionQuantity',\n", - " 'FunctionUnitBase',\n", - " 'G',\n", - " 'GA',\n", - " 'GAU',\n", - " 'GB',\n", - " 'GBa',\n", - " 'GC',\n", - " 'GD',\n", - " 'GF',\n", - " 'GG',\n", - " 'GGal',\n", - " 'GH',\n", - " 'GHz',\n", - " 'GJ',\n", - " 'GJy',\n", - " 'GK',\n", - " 'GL',\n", - " 'GN',\n", - " 'GOhm',\n", - " 'GP',\n", - " 'GPa',\n", - " 'GR',\n", - " 'GRy',\n", - " 'GS',\n", - " 'GSt',\n", - " 'GT',\n", - " 'GV',\n", - " 'GW',\n", - " 'GWb',\n", - " 'Ga',\n", - " 'Gadu',\n", - " 'Gal',\n", - " 'Garcmin',\n", - " 'Garcsec',\n", - " 'Gau',\n", - " 'Gauss',\n", - " 'Gb',\n", - " 'Gbarn',\n", - " 'Gbeam',\n", - " 'Gbin',\n", - " 'Gbit',\n", - " 'Gbyte',\n", - " 'Gcd',\n", - " 'Gchan',\n", - " 'Gcount',\n", - " 'Gct',\n", - " 'Gd',\n", - " 'Gdeg',\n", - " 'Gdyn',\n", - " 'GeV',\n", - " 'Gerg',\n", - " 'Gg',\n", - " 'Gh',\n", - " 'GiB',\n", - " 'Gib',\n", - " 'Gibit',\n", - " 'Gibyte',\n", - " 'Gk',\n", - " 'Gl',\n", - " 'Glm',\n", - " 'Glx',\n", - " 'Glyr',\n", - " 'Gm',\n", - " 'Gmag',\n", - " 'Gmin',\n", - " 'Gmol',\n", - " 'Gohm',\n", - " 'Gpc',\n", - " 'Gph',\n", - " 'Gphoton',\n", - " 'Gpix',\n", - " 'Gpixel',\n", - " 'Grad',\n", - " 'Gs',\n", - " 'Gsr',\n", - " 'Gu',\n", - " 'Gvox',\n", - " 'Gvoxel',\n", - " 'Gyr',\n", - " 'H',\n", - " 'Henry',\n", - " 'Hertz',\n", - " 'Hz',\n", - " 'IrreducibleUnit',\n", - " 'J',\n", - " 'Jansky',\n", - " 'Joule',\n", - " 'Jy',\n", - " 'K',\n", - " 'Kayser',\n", - " 'Kelvin',\n", - " 'KiB',\n", - " 'Kib',\n", - " 'Kibit',\n", - " 'Kibyte',\n", - " 'L',\n", - " 'L_bol',\n", - " 'L_sun',\n", - " 'LogQuantity',\n", - " 'LogUnit',\n", - " 'Lsun',\n", - " 'MA',\n", - " 'MAU',\n", - " 'MB',\n", - " 'MBa',\n", - " 'MC',\n", - " 'MD',\n", - " 'MF',\n", - " 'MG',\n", - " 'MGal',\n", - " 'MH',\n", - " 'MHz',\n", - " 'MJ',\n", - " 'MJy',\n", - " 'MK',\n", - " 'ML',\n", - " 'MN',\n", - " 'MOhm',\n", - " 'MP',\n", - " 'MPa',\n", - " 'MR',\n", - " 'MRy',\n", - " 'MS',\n", - " 'MSt',\n", - " 'MT',\n", - " 'MV',\n", - " 'MW',\n", - " 'MWb',\n", - " 'M_bol',\n", - " 'M_e',\n", - " 'M_earth',\n", - " 'M_jup',\n", - " 'M_jupiter',\n", - " 'M_p',\n", - " 'M_sun',\n", - " 'Ma',\n", - " 'Madu',\n", - " 'MagUnit',\n", - " 'Magnitude',\n", - " 'Marcmin',\n", - " 'Marcsec',\n", - " 'Mau',\n", - " 'Mb',\n", - " 'Mbarn',\n", - " 'Mbeam',\n", - " 'Mbin',\n", - " 'Mbit',\n", - " 'Mbyte',\n", - " 'Mcd',\n", - " 'Mchan',\n", - " 'Mcount',\n", - " 'Mct',\n", - " 'Md',\n", - " 'Mdeg',\n", - " 'Mdyn',\n", - " 'MeV',\n", - " 'Mearth',\n", - " 'Merg',\n", - " 'Mg',\n", - " 'Mh',\n", - " 'MiB',\n", - " 'Mib',\n", - " 'Mibit',\n", - " 'Mibyte',\n", - " 'Mjup',\n", - " 'Mjupiter',\n", - " 'Mk',\n", - " 'Ml',\n", - " 'Mlm',\n", - " 'Mlx',\n", - " 'Mlyr',\n", - " 'Mm',\n", - " 'Mmag',\n", - " 'Mmin',\n", - " 'Mmol',\n", - " 'Mohm',\n", - " 'Mpc',\n", - " 'Mph',\n", - " 'Mphoton',\n", - " 'Mpix',\n", - " 'Mpixel',\n", - " 'Mrad',\n", - " 'Ms',\n", - " 'Msr',\n", - " 'Msun',\n", - " 'Mu',\n", - " 'Mvox',\n", - " 'Mvoxel',\n", - " 'Myr',\n", - " 'N',\n", - " 'NamedUnit',\n", - " 'Newton',\n", - " 'Ohm',\n", - " 'P',\n", - " 'PA',\n", - " 'PAU',\n", - " 'PB',\n", - " 'PBa',\n", - " 'PC',\n", - " 'PD',\n", - " 'PF',\n", - " 'PG',\n", - " 'PGal',\n", - " 'PH',\n", - " 'PHz',\n", - " 'PJ',\n", - " 'PJy',\n", - " 'PK',\n", - " 'PL',\n", - " 'PN',\n", - " 'POhm',\n", - " 'PP',\n", - " 'PPa',\n", - " 'PR',\n", - " 'PRy',\n", - " 'PS',\n", - " 'PSt',\n", - " 'PT',\n", - " 'PV',\n", - " 'PW',\n", - " 'PWb',\n", - " 'Pa',\n", - " 'Padu',\n", - " 'Parcmin',\n", - " 'Parcsec',\n", - " 'Pascal',\n", - " 'Pau',\n", - " 'Pb',\n", - " 'Pbarn',\n", - " 'Pbeam',\n", - " 'Pbin',\n", - " 'Pbit',\n", - " 'Pbyte',\n", - " 'Pcd',\n", - " 'Pchan',\n", - " 'Pcount',\n", - " 'Pct',\n", - " 'Pd',\n", - " 'Pdeg',\n", - " 'Pdyn',\n", - " 'PeV',\n", - " 'Perg',\n", - " 'Pg',\n", - " 'Ph',\n", - " 'PiB',\n", - " 'Pib',\n", - " 'Pibit',\n", - " 'Pibyte',\n", - " 'Pk',\n", - " 'Pl',\n", - " 'Plm',\n", - " 'Plx',\n", - " 'Plyr',\n", - " 'Pm',\n", - " 'Pmag',\n", - " 'Pmin',\n", - " 'Pmol',\n", - " 'Pohm',\n", - " 'Ppc',\n", - " 'Pph',\n", - " 'Pphoton',\n", - " 'Ppix',\n", - " 'Ppixel',\n", - " 'Prad',\n", - " 'PrefixUnit',\n", - " 'Ps',\n", - " 'Psr',\n", - " 'Pu',\n", - " 'Pvox',\n", - " 'Pvoxel',\n", - " 'Pyr',\n", - " 'Quantity',\n", - " 'QuantityInfo',\n", - " 'QuantityInfoBase',\n", - " 'R',\n", - " 'R_earth',\n", - " 'R_jup',\n", - " 'R_jupiter',\n", - " 'R_sun',\n", - " 'Rayleigh',\n", - " 'Rearth',\n", - " 'Rjup',\n", - " 'Rjupiter',\n", - " 'Rsun',\n", - " 'Ry',\n", - " 'S',\n", - " 'ST',\n", - " 'STflux',\n", - " 'STmag',\n", - " 'Siemens',\n", - " 'SpecificTypeQuantity',\n", - " 'St',\n", - " 'Sun',\n", - " 'T',\n", - " 'TA',\n", - " 'TAU',\n", - " 'TB',\n", - " 'TBa',\n", - " 'TC',\n", - " 'TD',\n", - " 'TF',\n", - " 'TG',\n", - " 'TGal',\n", - " 'TH',\n", - " 'THz',\n", - " 'TJ',\n", - " 'TJy',\n", - " 'TK',\n", - " 'TL',\n", - " 'TN',\n", - " 'TOhm',\n", - " 'TP',\n", - " 'TPa',\n", - " 'TR',\n", - " 'TRy',\n", - " 'TS',\n", - " 'TSt',\n", - " 'TT',\n", - " 'TV',\n", - " 'TW',\n", - " 'TWb',\n", - " 'Ta',\n", - " 'Tadu',\n", - " 'Tarcmin',\n", - " 'Tarcsec',\n", - " 'Tau',\n", - " 'Tb',\n", - " 'Tbarn',\n", - " 'Tbeam',\n", - " 'Tbin',\n", - " 'Tbit',\n", - " 'Tbyte',\n", - " 'Tcd',\n", - " 'Tchan',\n", - " 'Tcount',\n", - " 'Tct',\n", - " 'Td',\n", - " 'Tdeg',\n", - " 'Tdyn',\n", - " 'TeV',\n", - " 'Terg',\n", - " 'Tesla',\n", - " 'Tg',\n", - " 'Th',\n", - " 'TiB',\n", - " 'Tib',\n", - " 'Tibit',\n", - " 'Tibyte',\n", - " 'Tk',\n", - " 'Tl',\n", - " 'Tlm',\n", - " 'Tlx',\n", - " 'Tlyr',\n", - " 'Tm',\n", - " 'Tmag',\n", - " 'Tmin',\n", - " 'Tmol',\n", - " 'Tohm',\n", - " 'Tpc',\n", - " 'Tph',\n", - " 'Tphoton',\n", - " 'Tpix',\n", - " 'Tpixel',\n", - " 'Trad',\n", - " 'Ts',\n", - " 'Tsr',\n", - " 'Tu',\n", - " 'Tvox',\n", - " 'Tvoxel',\n", - " 'Tyr',\n", - " 'Unit',\n", - " 'UnitBase',\n", - " 'UnitConversionError',\n", - " 'UnitTypeError',\n", - " 'UnitsError',\n", - " 'UnitsWarning',\n", - " 'UnrecognizedUnit',\n", - " 'V',\n", - " 'Volt',\n", - " 'W',\n", - " 'Watt',\n", - " 'Wb',\n", - " 'Weber',\n", - " 'YA',\n", - " 'YAU',\n", - " 'YB',\n", - " 'YBa',\n", - " 'YC',\n", - " 'YD',\n", - " 'YF',\n", - " 'YG',\n", - " 'YGal',\n", - " 'YH',\n", - " 'YHz',\n", - " 'YJ',\n", - " 'YJy',\n", - " 'YK',\n", - " 'YL',\n", - " 'YN',\n", - " 'YOhm',\n", - " 'YP',\n", - " 'YPa',\n", - " 'YR',\n", - " 'YRy',\n", - " 'YS',\n", - " 'YSt',\n", - " 'YT',\n", - " 'YV',\n", - " 'YW',\n", - " 'YWb',\n", - " 'Ya',\n", - " 'Yadu',\n", - " 'Yarcmin',\n", - " 'Yarcsec',\n", - " 'Yau',\n", - " 'Yb',\n", - " 'Ybarn',\n", - " 'Ybeam',\n", - " 'Ybin',\n", - " 'Ybit',\n", - " 'Ybyte',\n", - " 'Ycd',\n", - " 'Ychan',\n", - " 'Ycount',\n", - " 'Yct',\n", - " 'Yd',\n", - " 'Ydeg',\n", - " 'Ydyn',\n", - " 'YeV',\n", - " 'Yerg',\n", - " 'Yg',\n", - " 'Yh',\n", - " 'Yk',\n", - " 'Yl',\n", - " 'Ylm',\n", - " 'Ylx',\n", - " 'Ylyr',\n", - " 'Ym',\n", - " 'Ymag',\n", - " 'Ymin',\n", - " 'Ymol',\n", - " 'Yohm',\n", - " 'Ypc',\n", - " 'Yph',\n", - " 'Yphoton',\n", - " 'Ypix',\n", - " 'Ypixel',\n", - " 'Yrad',\n", - " 'Ys',\n", - " 'Ysr',\n", - " 'Yu',\n", - " 'Yvox',\n", - " 'Yvoxel',\n", - " 'Yyr',\n", - " 'ZA',\n", - " 'ZAU',\n", - " 'ZB',\n", - " 'ZBa',\n", - " 'ZC',\n", - " 'ZD',\n", - " 'ZF',\n", - " 'ZG',\n", - " 'ZGal',\n", - " 'ZH',\n", - " 'ZHz',\n", - " 'ZJ',\n", - " 'ZJy',\n", - " 'ZK',\n", - " 'ZL',\n", - " 'ZN',\n", - " 'ZOhm',\n", - " 'ZP',\n", - " 'ZPa',\n", - " 'ZR',\n", - " 'ZRy',\n", - " 'ZS',\n", - " 'ZSt',\n", - " 'ZT',\n", - " 'ZV',\n", - " 'ZW',\n", - " 'ZWb',\n", - " 'Za',\n", - " 'Zadu',\n", - " 'Zarcmin',\n", - " 'Zarcsec',\n", - " 'Zau',\n", - " 'Zb',\n", - " 'Zbarn',\n", - " 'Zbeam',\n", - " 'Zbin',\n", - " 'Zbit',\n", - " 'Zbyte',\n", - " 'Zcd',\n", - " 'Zchan',\n", - " 'Zcount',\n", - " 'Zct',\n", - " 'Zd',\n", - " 'Zdeg',\n", - " 'Zdyn',\n", - " 'ZeV',\n", - " 'Zerg',\n", - " 'Zg',\n", - " 'Zh',\n", - " 'Zk',\n", - " 'Zl',\n", - " 'Zlm',\n", - " 'Zlx',\n", - " 'Zlyr',\n", - " 'Zm',\n", - " 'Zmag',\n", - " 'Zmin',\n", - " 'Zmol',\n", - " 'Zohm',\n", - " 'Zpc',\n", - " 'Zph',\n", - " 'Zphoton',\n", - " 'Zpix',\n", - " 'Zpixel',\n", - " 'Zrad',\n", - " 'Zs',\n", - " 'Zsr',\n", - " 'Zu',\n", - " 'Zvox',\n", - " 'Zvoxel',\n", - " 'Zyr',\n", - " '__builtins__',\n", - " '__cached__',\n", - " '__doc__',\n", - " '__file__',\n", - " '__loader__',\n", - " '__name__',\n", - " '__package__',\n", - " '__path__',\n", - " '__spec__',\n", - " 'a',\n", - " 'aA',\n", - " 'aAU',\n", - " 'aB',\n", - " 'aBa',\n", - " 'aC',\n", - " 'aD',\n", - " 'aF',\n", - " 'aG',\n", - " 'aGal',\n", - " 'aH',\n", - " 'aHz',\n", - " 'aJ',\n", - " 'aJy',\n", - " 'aK',\n", - " 'aL',\n", - " 'aN',\n", - " 'aOhm',\n", - " 'aP',\n", - " 'aPa',\n", - " 'aR',\n", - " 'aRy',\n", - " 'aS',\n", - " 'aSt',\n", - " 'aT',\n", - " 'aV',\n", - " 'aW',\n", - " 'aWb',\n", - " 'aa',\n", - " 'aadu',\n", - " 'aarcmin',\n", - " 'aarcsec',\n", - " 'aau',\n", - " 'ab',\n", - " 'abA',\n", - " 'abC',\n", - " 'abampere',\n", - " 'abarn',\n", - " 'abcoulomb',\n", - " 'abeam',\n", - " 'abin',\n", - " 'abit',\n", - " 'abyte',\n", - " 'acd',\n", - " 'achan',\n", - " 'acount',\n", - " 'act',\n", - " 'ad',\n", - " 'add_enabled_equivalencies',\n", - " 'add_enabled_units',\n", - " 'adeg',\n", - " 'adu',\n", - " 'adyn',\n", - " 'aeV',\n", - " 'aerg',\n", - " 'ag',\n", - " 'ah',\n", - " 'ak',\n", - " 'al',\n", - " 'allclose',\n", - " 'alm',\n", - " 'alx',\n", - " 'alyr',\n", - " 'am',\n", - " 'amag',\n", - " 'amin',\n", - " 'amol',\n", - " 'amp',\n", - " 'ampere',\n", - " 'angstrom',\n", - " 'annum',\n", - " 'aohm',\n", - " 'apc',\n", - " 'aph',\n", - " 'aphoton',\n", - " 'apix',\n", - " 'apixel',\n", - " 'arad',\n", - " 'arcmin',\n", - " 'arcminute',\n", - " 'arcsec',\n", - " 'arcsecond',\n", - " 'asr',\n", - " 'astronomical_unit',\n", - " 'astrophys',\n", - " 'attoBarye',\n", - " 'attoDa',\n", - " 'attoDalton',\n", - " 'attoDebye',\n", - " 'attoFarad',\n", - " 'attoGauss',\n", - " 'attoHenry',\n", - " 'attoHertz',\n", - " 'attoJansky',\n", - " 'attoJoule',\n", - " 'attoKayser',\n", - " 'attoKelvin',\n", - " 'attoNewton',\n", - " 'attoOhm',\n", - " 'attoPascal',\n", - " 'attoRayleigh',\n", - " 'attoSiemens',\n", - " 'attoTesla',\n", - " 'attoVolt',\n", - " 'attoWatt',\n", - " 'attoWeber',\n", - " 'attoamp',\n", - " 'attoampere',\n", - " 'attoannum',\n", - " 'attoarcminute',\n", - " 'attoarcsecond',\n", - " 'attoastronomical_unit',\n", - " 'attobarn',\n", - " 'attobarye',\n", - " 'attobit',\n", - " 'attobyte',\n", - " 'attocandela',\n", - " 'attocoulomb',\n", - " 'attocount',\n", - " 'attoday',\n", - " 'attodebye',\n", - " 'attodegree',\n", - " 'attodyne',\n", - " 'attoelectronvolt',\n", - " 'attofarad',\n", - " 'attogal',\n", - " 'attogauss',\n", - " 'attogram',\n", - " 'attohenry',\n", - " 'attohertz',\n", - " 'attohour',\n", - " 'attohr',\n", - " 'attojansky',\n", - " 'attojoule',\n", - " 'attokayser',\n", - " 'attolightyear',\n", - " 'attoliter',\n", - " 'attolumen',\n", - " 'attolux',\n", - " 'attometer',\n", - " 'attominute',\n", - " 'attomole',\n", - " 'attonewton',\n", - " 'attoparsec',\n", - " 'attopascal',\n", - " 'attophoton',\n", - " 'attopixel',\n", - " 'attopoise',\n", - " 'attoradian',\n", - " 'attorayleigh',\n", - " 'attorydberg',\n", - " 'attosecond',\n", - " 'attosiemens',\n", - " 'attosteradian',\n", - " 'attostokes',\n", - " 'attotesla',\n", - " 'attovolt',\n", - " 'attovoxel',\n", - " 'attowatt',\n", - " 'attoweber',\n", - " 'attoyear',\n", - " 'au',\n", - " 'avox',\n", - " 'avoxel',\n", - " 'ayr',\n", - " 'b',\n", - " 'bar',\n", - " 'barn',\n", - " 'barye',\n", - " 'beam',\n", - " 'beam_angular_area',\n", - " 'becquerel',\n", - " 'bin',\n", - " 'binary_prefixes',\n", - " 'bit',\n", - " 'bol',\n", - " 'brightness_temperature',\n", - " 'byte',\n", - " 'cA',\n", - " 'cAU',\n", - " 'cB',\n", - " 'cBa',\n", - " 'cC',\n", - " 'cD',\n", - " 'cF',\n", - " 'cG',\n", - " 'cGal',\n", - " 'cH',\n", - " 'cHz',\n", - " 'cJ',\n", - " 'cJy',\n", - " 'cK',\n", - " 'cL',\n", - " 'cN',\n", - " 'cOhm',\n", - " 'cP',\n", - " 'cPa',\n", - " 'cR',\n", - " 'cRy',\n", - " 'cS',\n", - " 'cSt',\n", - " 'cT',\n", - " 'cV',\n", - " 'cW',\n", - " 'cWb',\n", - " 'ca',\n", - " 'cadu',\n", - " 'candela',\n", - " 'carcmin',\n", - " 'carcsec',\n", - " 'cau',\n", - " 'cb',\n", - " 'cbarn',\n", - " 'cbeam',\n", - " 'cbin',\n", - " 'cbit',\n", - " 'cbyte',\n", - " 'ccd',\n", - " 'cchan',\n", - " 'ccount',\n", - " 'cct',\n", - " 'cd',\n", - " 'cdeg',\n", - " 'cdyn',\n", - " 'ceV',\n", - " 'centiBarye',\n", - " 'centiDa',\n", - " 'centiDalton',\n", - " 'centiDebye',\n", - " 'centiFarad',\n", - " 'centiGauss',\n", - " 'centiHenry',\n", - " 'centiHertz',\n", - " 'centiJansky',\n", - " 'centiJoule',\n", - " 'centiKayser',\n", - " 'centiKelvin',\n", - " 'centiNewton',\n", - " 'centiOhm',\n", - " 'centiPascal',\n", - " 'centiRayleigh',\n", - " 'centiSiemens',\n", - " 'centiTesla',\n", - " 'centiVolt',\n", - " 'centiWatt',\n", - " 'centiWeber',\n", - " 'centiamp',\n", - " 'centiampere',\n", - " 'centiannum',\n", - " 'centiarcminute',\n", - " 'centiarcsecond',\n", - " 'centiastronomical_unit',\n", - " 'centibarn',\n", - " 'centibarye',\n", - " 'centibit',\n", - " 'centibyte',\n", - " 'centicandela',\n", - " 'centicoulomb',\n", - " 'centicount',\n", - " 'centiday',\n", - " 'centidebye',\n", - " 'centidegree',\n", - " 'centidyne',\n", - " 'centielectronvolt',\n", - " 'centifarad',\n", - " 'centigal',\n", - " 'centigauss',\n", - " 'centigram',\n", - " 'centihenry',\n", - " 'centihertz',\n", - " 'centihour',\n", - " 'centihr',\n", - " 'centijansky',\n", - " 'centijoule',\n", - " 'centikayser',\n", - " 'centilightyear',\n", - " 'centiliter',\n", - " 'centilumen',\n", - " 'centilux',\n", - " 'centimeter',\n", - " 'centiminute',\n", - " 'centimole',\n", - " 'centinewton',\n", - " 'centiparsec',\n", - " 'centipascal',\n", - " 'centiphoton',\n", - " 'centipixel',\n", - " 'centipoise',\n", - " 'centiradian',\n", - " 'centirayleigh',\n", - " 'centirydberg',\n", - " 'centisecond',\n", - " 'centisiemens',\n", - " 'centisteradian',\n", - " 'centistokes',\n", - " 'centitesla',\n", - " 'centivolt',\n", - " 'centivoxel',\n", - " 'centiwatt',\n", - " 'centiweber',\n", - " 'centiyear',\n", - " 'cerg',\n", - " 'cg',\n", - " 'cgs',\n", - " 'ch',\n", - " 'chan',\n", - " 'ck',\n", - " 'cl',\n", - " 'clm',\n", - " 'clx',\n", - " 'clyr',\n", - " 'cm',\n", - " 'cmag',\n", - " 'cmin',\n", - " 'cmol',\n", - " 'cohm',\n", - " 'core',\n", - " 'coulomb',\n", - " 'count',\n", - " 'cpc',\n", - " 'cph',\n", - " 'cphoton',\n", - " 'cpix',\n", - " 'cpixel',\n", - " 'crad',\n", - " 'cs',\n", - " 'csr',\n", - " 'ct',\n", - " 'cu',\n", - " 'curie',\n", - " 'cvox',\n", - " 'cvoxel',\n", - " 'cy',\n", - " 'cycle',\n", - " 'cyr',\n", - " 'd',\n", - " 'dA',\n", - " 'dAU',\n", - " 'dB',\n", - " 'dBa',\n", - " 'dC',\n", - " 'dD',\n", - " 'dF',\n", - " 'dG',\n", - " 'dGal',\n", - " 'dH',\n", - " 'dHz',\n", - " 'dJ',\n", - " 'dJy',\n", - " 'dK',\n", - " 'dL',\n", - " 'dN',\n", - " 'dOhm',\n", - " 'dP',\n", - " 'dPa',\n", - " 'dR',\n", - " 'dRy',\n", - " 'dS',\n", - " 'dSt',\n", - " 'dT',\n", - " ...]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir(u)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To create a quantity, we multiply a value by a unit." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "astropy.units.quantity.Quantity" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coord = 30 * u.deg\n", - "type(coord)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is a `Quantity` object.\n", - "\n", - "Jupyter knows how to display `Quantities` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$30 \\; \\mathrm{{}^{\\circ}}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coord" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Selecting a rectangle\n", - "\n", - "Now we'll select a rectangle from -55 to -45 degrees right ascension and -8 to 4 degrees of declination.\n", - "\n", - "We'll define variables to contain these limits." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "phi1_min = -55\n", - "phi1_max = -45\n", - "phi2_min = -8\n", - "phi2_max = 4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To represent a rectangle, we'll use two lists of coordinates and multiply by their units." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "phi1_rect = [phi1_min, phi1_min, phi1_max, phi1_max] * u.deg\n", - "phi2_rect = [phi2_min, phi2_max, phi2_max, phi2_min] * u.deg" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`phi1_rect` and `phi2_rect` represent the coordinates of the corners of a rectangle. \n", - "\n", - "But they are in \"[a Heliocentric spherical coordinate system defined by the orbit of the GD1 stream](https://gala-astro.readthedocs.io/en/latest/_modules/gala/coordinates/gd1.html)\"\n", - "\n", - "In order to use them in a Gaia query, we have to convert them to [International Celestial Reference System](https://en.wikipedia.org/wiki/International_Celestial_Reference_System) (ICRS) coordinates. We can do that by storing the coordinates in a `GD1Koposov10` object provided by [Gala](https://gala-astro.readthedocs.io/en/latest/coordinates/)." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "gala.coordinates.gd1.GD1Koposov10" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import gala.coordinates as gc\n", - "\n", - "corners = gc.GD1Koposov10(phi1=phi1_rect, phi2=phi2_rect)\n", - "type(corners)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can display the result like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "corners" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use `transform_to` to convert to ICRS coordinates." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "astropy.coordinates.builtin_frames.icrs.ICRS" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import astropy.coordinates as coord\n", - "\n", - "corners_icrs = corners.transform_to(coord.ICRS)\n", - "type(corners_icrs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an `ICRS` object." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "corners_icrs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that a rectangle in one coordinate system is not necessarily a rectangle in another. In this example, the result is a polygon." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Selecting a polygon\n", - "\n", - "In order to use this polygon as part of an ADQL query, we have to convert it to a string with a comma-separated list of coordinates, as in this example:\n", - "\n", - "```\n", - "\"\"\"\n", - "POLYGON(143.65, 20.98, \n", - " 134.46, 26.39, \n", - " 140.58, 34.85, \n", - " 150.16, 29.01)\n", - "\"\"\"\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`corners_icrs` behaves like a list, so we can use a `for` loop to iterate through the points." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "for point in corners_icrs:\n", - " print(point)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From that, we can select the coordinates `ra` and `dec`:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "146d16m31.1993s 19d15m42.8754s\n", - "135d25m17.902s 25d52m38.594s\n", - "141d36m09.5337s 34d18m17.3891s\n", - "152d49m00.1576s 27d08m10.0051s\n" - ] - } - ], - "source": [ - "for point in corners_icrs:\n", - " print(point.ra, point.dec)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results are quantities with units, but if we select the `value` part, we get a dimensionless floating-point number." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "146.27533313607782 19.261909820533692\n", - "135.42163944306296 25.87738722767213\n", - "141.60264825107333 34.304830296257144\n", - "152.81671044675923 27.136112541397996\n" - ] - } - ], - "source": [ - "for point in corners_icrs:\n", - " print(point.ra.value, point.dec.value)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use string `format` to convert these numbers to strings." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['146.27533313607782, 19.261909820533692',\n", - " '135.42163944306296, 25.87738722767213',\n", - " '141.60264825107333, 34.304830296257144',\n", - " '152.81671044675923, 27.136112541397996']" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "point_base = \"{point.ra.value}, {point.dec.value}\"\n", - "\n", - "t = [point_base.format(point=point)\n", - " for point in corners_icrs]\n", - "t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is a list of strings, which we can join into a single string using `join`." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'146.27533313607782, 19.261909820533692, 135.42163944306296, 25.87738722767213, 141.60264825107333, 34.304830296257144, 152.81671044675923, 27.136112541397996'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "point_list = ', '.join(t)\n", - "point_list" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that we invoke `join` on a string and pass the list as an argument.\n", - "\n", - "Before we can assemble the query, we need `columns` again (as we saw in the previous notebook)." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the base for the query, with format specifiers for `columns` and `point_list`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "query_base = \"\"\"SELECT {columns}\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - " AND bp_rp BETWEEN -0.75 AND 2 \n", - " AND 1 = CONTAINS(POINT(ra, dec), \n", - " POLYGON({point_list}))\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the result:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - " AND bp_rp BETWEEN -0.75 AND 2 \n", - " AND 1 = CONTAINS(POINT(ra, dec), \n", - " POLYGON(146.27533313607782, 19.261909820533692, 135.42163944306296, 25.87738722767213, 141.60264825107333, 34.304830296257144, 152.81671044675923, 27.136112541397996))\n", - "\n" - ] - } - ], - "source": [ - "query = query_base.format(columns=columns, \n", - " point_list=point_list)\n", - "print(query)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, we should take a minute to proof-read the query before we launch it.\n", - "\n", - "The result will be bigger than our previous queries, so it will take a little longer." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO: Query finished. [astroquery.utils.tap.core]\n", - "
    \n", - " name dtype unit description n_bad \n", - "--------------- ------- -------- ------------------------------------------------------------------ ------\n", - " source_id int64 Unique source identifier (unique within a particular Data Release) 0\n", - " ra float64 deg Right ascension 0\n", - " dec float64 deg Declination 0\n", - " pmra float64 mas / yr Proper motion in right ascension direction 0\n", - " pmdec float64 mas / yr Proper motion in declination direction 0\n", - " parallax float64 mas Parallax 0\n", - " parallax_error float64 mas Standard error of parallax 0\n", - "radial_velocity float64 km / s Radial velocity 139374\n", - "Jobid: 1603114980658O\n", - "Phase: COMPLETED\n", - "Owner: None\n", - "Output file: async_20201019094300.vot\n", - "Results: None\n" - ] - } - ], - "source": [ - "job = Gaia.launch_job_async(query)\n", - "print(job)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "140340" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = job.get_results()\n", - "len(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are more than 100,000 stars in this polygon, but that's a manageable size to work with." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Saving results\n", - "\n", - "This is the set of stars we'll work with in the next step. But since we have a substantial dataset now, this is a good time to save it.\n", - "\n", - "Storing the data in a file means we can shut down this notebook and pick up where we left off without running the previous query again.\n", - "\n", - "Astropy `Table` objects provide `write`, which writes the table to disk." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'gd1_results.fits'\n", - "results.write(filename, overwrite=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Because the filename ends with `fits`, the table is written in the [FITS format](https://en.wikipedia.org/wiki/FITS), which preserves the metadata associated with the table.\n", - "\n", - "If the file already exists, the `overwrite` argument causes it to be overwritten.\n", - "\n", - "To see how big the file is, we can use `ls` with the `-lh` option, which prints information about the file including its size in human-readable form." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-rw-rw-r-- 1 downey downey 8.6M Oct 19 09:43 gd1_results.fits\r\n" - ] - } - ], - "source": [ - "!ls -lh gd1_results.fits" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The file is about 8.6 MB. If you are using Windows, `ls` might not work; in that case, try:\n", - "\n", - "```\n", - "!dir gd1_results.fits\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this notebook, we composed more complex queries to select stars within a polygonal region of the sky. Then we downloaded the results and saved them in a FITS file.\n", - "\n", - "In the next notebook, we'll reload the data from this file and replicate the next step in the analysis, using proper motion to identify stars likely to be in GD-1." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Best practices\n", - "\n", - "* For measurements with units, use `Quantity` objects that represent units explicitly and check for errors.\n", - "\n", - "* Use the `format` function to compose queries; it is often faster and less error-prone.\n", - "\n", - "* Develop queries incrementally: start with something simple, test it, and add a little bit at a time.\n", - "\n", - "* Once you have a query working, save the data in a local file. If you shut down the notebook and come back to it later, you can reload the file; you don't have to run the query again." - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/_sources/AstronomicalData/README.md b/_sources/AstronomicalData/README.md deleted file mode 100644 index 190277b..0000000 --- a/_sources/AstronomicalData/README.md +++ /dev/null @@ -1,172 +0,0 @@ -# Astronomical Data in Python - -*Astronomical Data in Python* is an introduction to tools and practices for working with astronomical data. Topics covered include: - -* Writing queries that select and download data from a database. - -* Using data stored in an Astropy `Table` or Pandas `DataFrame`. - -* Working with coordinates and other quantities with units. - -* Storing data in various formats. - -* Performing database join operations that combine data from multiple tables. - -* Visualizing data and preparing publication-quality figures. - -As a running example, we will replicate part of the analysis in a recent paper, "[Off the beaten path: Gaia reveals GD-1 stars outside of the main stream](https://arxiv.org/abs/1805.00425)" by Adrian M. Price-Whelan and Ana Bonaca. - -This material was developed in collaboration with [The Carpentries](https://carpentries.org/) and the Astronomy Curriculum Development Committee, and supported by funding from the American Institute of Physics through the American Astronomical Society. - -I am grateful for contributions from the members of the committee -- Azalee Bostroem, Rodolfo Montez, and Phil Rosenfield -- and from Erin Becker, Brett Morris and Adrian Price-Whelan. - -The original format of this material is a series of Jupyter notebooks. Using the -links below, you can read the notebooks on NBViewer or run them on Colab. If you -want to run the notebooks in your own environment, you can download them from -this repository and follow the instructions below to set up your environment. - -This material is also available in the form of [Carpentries lessons](https://datacarpentry.github.io/astronomy-python), but you should be -aware that these versions might diverge in the future. - -**Prerequisites** - -This material should be accessible to people familiar with basic Python, but not necessarily the libraries we will use, like Astropy or Pandas. If you are familiar with Python lists and dictionaries, and you know how to write a function that takes parameters and returns a value, that should be enough. - -We assume that you are familiar with astronomy at the undergraduate level, but we will not assume specialized knowledge of the datasets or analysis methods we'll use. - -**Notebook 1** - -This notebook demonstrates the following steps: - -1. Making a connection to the Gaia server, - -2. Exploring information about the database and the tables it contains, - -3. Writing a query and sending it to the server, and finally - -4. Downloading the response from the server as an Astropy `Table`. - -Press this button to run this notebook on Colab: - -[](https://colab.research.google.com/github/AllenDowney/AstronomicalData/blob/main/01_query.ipynb) - -[or click here to read it on NBViewer](https://nbviewer.jupyter.org/github/AllenDowney/AstronomicalData/blob/main/01_query.ipynb) - - -**Notebook 2** - -This notebook starts with an example that does a "cone search"; that is, it selects stars that appear in a circular region of the sky. - -Then, to select stars in the vicinity of GD-1, we: - -* Use `Quantity` objects to represent measurements with units. - -* Use the `Gala` library to convert coordinates from one frame to another. - -* Use the ADQL keywords `POLYGON`, `CONTAINS`, and `POINT` to select stars that fall within a polygonal region. - -* Submit a query and download the results. - -* Store the results in a FITS file. - -Press this button to run this notebook on Colab: - -[](https://colab.research.google.com/github/AllenDowney/AstronomicalData/blob/main/02_coords.ipynb) - -[or click here to read it on NBViewer](https://nbviewer.jupyter.org/github/AllenDowney/AstronomicalData/blob/main/02_coords.ipynb) - - -**Notebook 3** - -Here are the steps in this notebook: - -1. We'll read back the results from the previous notebook, which we saved in a FITS file. - -2. Then we'll transform the coordinates and proper motion data from ICRS back to the coordinate frame of GD-1. - -3. We'll put those results into a Pandas `DataFrame`, which we'll use to select stars near the centerline of GD-1. - -4. Plotting the proper motion of those stars, we'll identify a region of proper motion for stars that are likely to be in GD-1. - -5. Finally, we'll select and plot the stars whose proper motion is in that region. - -Press this button to run this notebook on Colab: - -[](https://colab.research.google.com/github/AllenDowney/AstronomicalData/blob/main/03_motion.ipynb) - -[or click here to read it on NBViewer](https://nbviewer.jupyter.org/github/AllenDowney/AstronomicalData/blob/main/03_motion.ipynb) - - -**Notebook 4** - -Here are the steps in this notebook: - -1. Using data from the previous notebook, we'll identify the values of proper motion for stars likely to be in GD-1. - -2. Then we'll compose an ADQL query that selects stars based on proper motion, so we can download only the data we need. - -3. We'll also see how to write the results to a CSV file. - -That will make it possible to search a bigger region of the sky in a single query. - -Press this button to run this notebook on Colab: - -[](https://colab.research.google.com/github/AllenDowney/AstronomicalData/blob/main/04_select.ipynb) - -[or click here to read it on NBViewer](https://nbviewer.jupyter.org/github/AllenDowney/AstronomicalData/blob/main/04_select.ipynb) - - -**Notebook 5** - -Here are the steps in this notebook: - -1. We'll reload the candidate stars we identified in the previous notebook. - -2. Then we'll run a query on the Gaia server that uploads the table of candidates and uses a `JOIN` operation to select photometry data for the candidate stars. - -3. We'll write the results to a file for use in the next notebook. - -Press this button to run this notebook on Colab: - -[](https://colab.research.google.com/github/AllenDowney/AstronomicalData/blob/main/05_join.ipynb) - -[or click here to read it on NBViewer](https://nbviewer.jupyter.org/github/AllenDowney/AstronomicalData/blob/main/05_join.ipynb) - - -**Notebook 6** - -Here are the steps in this notebook: - -1. We'll reload the data from the previous notebook and make a color-magnitude diagram. - -2. Then we'll specify a polygon in the diagram that contains stars with the photometry we expect. - -3. Then we'll merge the photometry data with the list of candidate stars, storing the result in a Pandas `DataFrame`. - -Press this button to run this notebook on Colab: - -[](https://colab.research.google.com/github/AllenDowney/AstronomicalData/blob/main/06_photo.ipynb) - -[or click here to read it on NBViewer](https://nbviewer.jupyter.org/github/AllenDowney/AstronomicalData/blob/main/06_photo.ipynb) - - -**Notebook 7** - -Here are the steps in this notebook: - -1. Starting with the figure from the previous notebook, we'll add annotations to present the results more clearly. - -2. The we'll see several ways to customize figures to make them more appealing and effective. - -3. Finally, we'll see how to make a figure with multiple panels or subplots. - -Press this button to run this notebook on Colab: - -[](https://colab.research.google.com/github/AllenDowney/AstronomicalData/blob/main/07_plot.ipynb) - -[or click here to read it on NBViewer](https://nbviewer.jupyter.org/github/AllenDowney/AstronomicalData/blob/main/07_plot.ipynb) - - -**Installation instructions** - -Coming soon. diff --git a/_sources/AstronomicalData/_build/html/_static/vendor/lato_latin-ext/1.44.1/LICENSE.md b/_sources/AstronomicalData/_build/html/_static/vendor/lato_latin-ext/1.44.1/LICENSE.md deleted file mode 100644 index 89bc0f2..0000000 --- a/_sources/AstronomicalData/_build/html/_static/vendor/lato_latin-ext/1.44.1/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2019 Jan Bednar - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/_sources/AstronomicalData/_build/html/_static/vendor/open-sans_all/1.44.1/LICENSE.md b/_sources/AstronomicalData/_build/html/_static/vendor/open-sans_all/1.44.1/LICENSE.md deleted file mode 100644 index 89bc0f2..0000000 --- a/_sources/AstronomicalData/_build/html/_static/vendor/open-sans_all/1.44.1/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2019 Jan Bednar - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/_sources/AstronomicalData/_build/jupyter_execute/01_query.ipynb b/_sources/AstronomicalData/_build/jupyter_execute/01_query.ipynb deleted file mode 100644 index 94813e9..0000000 --- a/_sources/AstronomicalData/_build/jupyter_execute/01_query.ipynb +++ /dev/null @@ -1,1640 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Introduction\n", - "\n", - "This workshop is an introduction to tools and practices for working with astronomical data. Topics covered include:\n", - "\n", - "* Writing queries that select and download data from a database.\n", - "\n", - "* Using data stored in an Astropy `Table` or Pandas `DataFrame`.\n", - "\n", - "* Working with coordinates and other quantities with units.\n", - "\n", - "* Storing data in various formats.\n", - "\n", - "* Performing database join operations that combine data from multiple tables.\n", - "\n", - "* Visualizing data and preparing publication-quality figures." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As a running example, we will replicate part of the analysis in a recent paper, \"[Off the beaten path: Gaia reveals GD-1 stars outside of the main stream](https://arxiv.org/abs/1805.00425)\" by Adrian M. Price-Whelan and Ana Bonaca.\n", - "\n", - "As the abstract explains, \"Using data from the Gaia second data release combined with Pan-STARRS photometry, we present a sample of highly-probable members of the longest cold stream in the Milky Way, GD-1.\"\n", - "\n", - "GD-1 is a [stellar stream](https://en.wikipedia.org/wiki/List_of_stellar_streams), which is \"an association of stars orbiting a galaxy that was once a globular cluster or dwarf galaxy that has now been torn apart and stretched out along its orbit by tidal forces.\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[This article in *Science* magazine](https://www.sciencemag.org/news/2018/10/streams-stars-reveal-galaxy-s-violent-history-and-perhaps-its-unseen-dark-matter) explains some of the background, including the process that led to the paper and an discussion of the scientific implications:\n", - "\n", - "* \"The streams are particularly useful for ... galactic archaeology --- rewinding the cosmic clock to reconstruct the assembly of the Milky Way.\"\n", - "\n", - "* \"They also are being used as exquisitely sensitive scales to measure the galaxy's mass.\"\n", - "\n", - "* \"... the streams are well-positioned to reveal the presence of dark matter ... because the streams are so fragile, theorists say, collisions with marauding clumps of dark matter could leave telltale scars, potential clues to its nature.\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Prerequisites\n", - "\n", - "This workshop is meant for people who are familiar with basic Python, but not necessarily the libraries we will use, like Astropy or Pandas. If you are familiar with Python lists and dictionaries, and you know how to write a function that takes parameters and returns a value, you know enough Python for this workshop.\n", - "\n", - "We assume that you have some familiarity with operating systems, like the ability to use a command-line interface. But we don't assume you have any prior experience with databases.\n", - "\n", - "We assume that you are familiar with astronomy at the undergraduate level, but we will not assume specialized knowledge of the datasets or analysis methods we'll use. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Data\n", - "\n", - "The datasets we will work with are:\n", - " \n", - "* [Gaia](https://en.wikipedia.org/wiki/Gaia_(spacecraft)), which is \"a space observatory of the European Space Agency (ESA), launched in 2013 ... designed for astrometry: measuring the positions, distances and motions of stars with unprecedented precision\", and\n", - "\n", - "* [Pan-STARRS](https://en.wikipedia.org/wiki/Pan-STARRS), The Panoramic Survey Telescope and Rapid Response System, which is a survey designed to monitor the sky for transient objects, producing a catalog with accurate astronometry and photometry of detected sources.\n", - "\n", - "Both of these datasets are very large, which can make them challenging to work with. It might not be possible, or practical, to download the entire dataset.\n", - "One of the goals of this workshop is to provide tools for working with large datasets." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Lesson 1\n", - "\n", - "The first lesson demonstrates the steps for selecting and downloading data from the Gaia Database:\n", - "\n", - "1. First we'll make a connection to the Gaia server,\n", - "\n", - "2. We will explore information about the database and the tables it contains,\n", - "\n", - "3. We will write a query and send it to the server, and finally\n", - "\n", - "4. We will download the response from the server.\n", - "\n", - "After completing this lesson, you should be able to\n", - "\n", - "* Compose a basic query in ADQL.\n", - "\n", - "* Use queries to explore a database and its tables.\n", - "\n", - "* Use queries to download data.\n", - "\n", - "* Develop, test, and debug a query incrementally." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Query Language\n", - "\n", - "In order to select data from a database, you have to compose a query, which is like a program written in a \"query language\".\n", - "The query language we'll use is ADQL, which stands for \"Astronomical Data Query Language\".\n", - "\n", - "ADQL is a dialect of [SQL](https://en.wikipedia.org/wiki/SQL) (Structured Query Language), which is by far the most commonly used query language. Almost everything you will learn about ADQL also works in SQL.\n", - "\n", - "[The reference manual for ADQL is here](http://www.ivoa.net/documents/ADQL/20180112/PR-ADQL-2.1-20180112.html).\n", - "But you might find it easier to learn from [this ADQL Cookbook](https://www.gaia.ac.uk/data/gaia-data-release-1/adql-cookbook)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Installing libraries\n", - "\n", - "The library we'll use to get Gaia data is [Astroquery](https://astroquery.readthedocs.io/en/latest/).\n", - "\n", - "If you are running this notebook on Colab, you can run the following cell to install Astroquery and the other libraries we'll use.\n", - "\n", - "If you are running this notebook on your own computer, you might have to install these libraries yourself. \n", - "\n", - "If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions.\n", - "\n", - "TODO: Add a link to the instructions.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# If we're running on Colab, install libraries\n", - "\n", - "import sys\n", - "IN_COLAB = 'google.colab' in sys.modules\n", - "\n", - "if IN_COLAB:\n", - " !pip install astroquery astro-gala pyia" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Connecting to Gaia\n", - "\n", - "Astroquery provides `Gaia`, which is an [object that represents a connection to the Gaia database](https://astroquery.readthedocs.io/en/latest/gaia/gaia.html).\n", - "\n", - "We can connect to the Gaia database like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: gea.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n", - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: geadata.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n" - ] - } - ], - "source": [ - "from astroquery.gaia import Gaia" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Optional detail \n", - "\n", - "> Running this import statement has the effect of creating a [TAP+](http://www.ivoa.net/documents/TAP/) connection; TAP stands for \"Table Access Protocol\". It is a network protocol for sending queries to the database and getting back the results. We're not sure why it seems to create two connections." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Databases and Tables\n", - "\n", - "What is a database, anyway? Most generally, it can be any collection of data, but when we are talking about ADQL or SQL:\n", - "\n", - "* A database is a collection of one or more named tables.\n", - "\n", - "* Each table is a 2-D array with one or more named columns of data.\n", - "\n", - "We can use `Gaia.load_tables` to get the names of the tables in the Gaia database. With the option `only_names=True`, it loads information about the tables, called the \"metadata\", not the data itself." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO: Retrieving tables... [astroquery.utils.tap.core]\n", - "INFO: Parsing tables... [astroquery.utils.tap.core]\n", - "INFO: Done. [astroquery.utils.tap.core]\n" - ] - } - ], - "source": [ - "tables = Gaia.load_tables(only_names=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "external.external.apassdr9\n", - "external.external.gaiadr2_geometric_distance\n", - "external.external.galex_ais\n", - "external.external.ravedr5_com\n", - "external.external.ravedr5_dr5\n", - "external.external.ravedr5_gra\n", - "external.external.ravedr5_on\n", - "external.external.sdssdr13_photoprimary\n", - "external.external.skymapperdr1_master\n", - "external.external.tmass_xsc\n", - "public.public.hipparcos\n", - "public.public.hipparcos_newreduction\n", - "public.public.hubble_sc\n", - "public.public.igsl_source\n", - "public.public.igsl_source_catalog_ids\n", - "public.public.tycho2\n", - "public.public.dual\n", - "tap_config.tap_config.coord_sys\n", - "tap_config.tap_config.properties\n", - "tap_schema.tap_schema.columns\n", - "tap_schema.tap_schema.key_columns\n", - "tap_schema.tap_schema.keys\n", - "tap_schema.tap_schema.schemas\n", - "tap_schema.tap_schema.tables\n", - "gaiadr1.gaiadr1.aux_qso_icrf2_match\n", - "gaiadr1.gaiadr1.ext_phot_zero_point\n", - "gaiadr1.gaiadr1.allwise_best_neighbour\n", - "gaiadr1.gaiadr1.allwise_neighbourhood\n", - "gaiadr1.gaiadr1.gsc23_best_neighbour\n", - "gaiadr1.gaiadr1.gsc23_neighbourhood\n", - "gaiadr1.gaiadr1.ppmxl_best_neighbour\n", - "gaiadr1.gaiadr1.ppmxl_neighbourhood\n", - "gaiadr1.gaiadr1.sdss_dr9_best_neighbour\n", - "gaiadr1.gaiadr1.sdss_dr9_neighbourhood\n", - "gaiadr1.gaiadr1.tmass_best_neighbour\n", - "gaiadr1.gaiadr1.tmass_neighbourhood\n", - "gaiadr1.gaiadr1.ucac4_best_neighbour\n", - "gaiadr1.gaiadr1.ucac4_neighbourhood\n", - "gaiadr1.gaiadr1.urat1_best_neighbour\n", - "gaiadr1.gaiadr1.urat1_neighbourhood\n", - "gaiadr1.gaiadr1.cepheid\n", - "gaiadr1.gaiadr1.phot_variable_time_series_gfov\n", - "gaiadr1.gaiadr1.phot_variable_time_series_gfov_statistical_parameters\n", - "gaiadr1.gaiadr1.rrlyrae\n", - "gaiadr1.gaiadr1.variable_summary\n", - "gaiadr1.gaiadr1.allwise_original_valid\n", - "gaiadr1.gaiadr1.gsc23_original_valid\n", - "gaiadr1.gaiadr1.ppmxl_original_valid\n", - "gaiadr1.gaiadr1.sdssdr9_original_valid\n", - "gaiadr1.gaiadr1.tmass_original_valid\n", - "gaiadr1.gaiadr1.ucac4_original_valid\n", - "gaiadr1.gaiadr1.urat1_original_valid\n", - "gaiadr1.gaiadr1.gaia_source\n", - "gaiadr1.gaiadr1.tgas_source\n", - "gaiadr2.gaiadr2.aux_allwise_agn_gdr2_cross_id\n", - "gaiadr2.gaiadr2.aux_iers_gdr2_cross_id\n", - "gaiadr2.gaiadr2.aux_sso_orbit_residuals\n", - "gaiadr2.gaiadr2.aux_sso_orbits\n", - "gaiadr2.gaiadr2.dr1_neighbourhood\n", - "gaiadr2.gaiadr2.allwise_best_neighbour\n", - "gaiadr2.gaiadr2.allwise_neighbourhood\n", - "gaiadr2.gaiadr2.apassdr9_best_neighbour\n", - "gaiadr2.gaiadr2.apassdr9_neighbourhood\n", - "gaiadr2.gaiadr2.gsc23_best_neighbour\n", - "gaiadr2.gaiadr2.gsc23_neighbourhood\n", - "gaiadr2.gaiadr2.hipparcos2_best_neighbour\n", - "gaiadr2.gaiadr2.hipparcos2_neighbourhood\n", - "gaiadr2.gaiadr2.panstarrs1_best_neighbour\n", - "gaiadr2.gaiadr2.panstarrs1_neighbourhood\n", - "gaiadr2.gaiadr2.ppmxl_best_neighbour\n", - "gaiadr2.gaiadr2.ppmxl_neighbourhood\n", - "gaiadr2.gaiadr2.ravedr5_best_neighbour\n", - "gaiadr2.gaiadr2.ravedr5_neighbourhood\n", - "gaiadr2.gaiadr2.sdssdr9_best_neighbour\n", - "gaiadr2.gaiadr2.sdssdr9_neighbourhood\n", - "gaiadr2.gaiadr2.tmass_best_neighbour\n", - "gaiadr2.gaiadr2.tmass_neighbourhood\n", - "gaiadr2.gaiadr2.tycho2_best_neighbour\n", - "gaiadr2.gaiadr2.tycho2_neighbourhood\n", - "gaiadr2.gaiadr2.urat1_best_neighbour\n", - "gaiadr2.gaiadr2.urat1_neighbourhood\n", - "gaiadr2.gaiadr2.sso_observation\n", - "gaiadr2.gaiadr2.sso_source\n", - "gaiadr2.gaiadr2.vari_cepheid\n", - "gaiadr2.gaiadr2.vari_classifier_class_definition\n", - "gaiadr2.gaiadr2.vari_classifier_definition\n", - "gaiadr2.gaiadr2.vari_classifier_result\n", - "gaiadr2.gaiadr2.vari_long_period_variable\n", - "gaiadr2.gaiadr2.vari_rotation_modulation\n", - "gaiadr2.gaiadr2.vari_rrlyrae\n", - "gaiadr2.gaiadr2.vari_short_timescale\n", - "gaiadr2.gaiadr2.vari_time_series_statistics\n", - "gaiadr2.gaiadr2.panstarrs1_original_valid\n", - "gaiadr2.gaiadr2.gaia_source\n", - "gaiadr2.gaiadr2.ruwe\n" - ] - } - ], - "source": [ - "for table in (tables):\n", - " print(table.get_qualified_name())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "So that's a lot of tables. The ones we'll use are:\n", - "\n", - "* `gaiadr2.gaia_source`, which contains Gaia data from [data release 2](https://www.cosmos.esa.int/web/gaia/data-release-2),\n", - "\n", - "* `gaiadr2.panstarrs1_original_valid`, which contains the photometry data we'll use from PanSTARRS, and\n", - "\n", - "* `gaiadr2.panstarrs1_best_neighbour`, which we'll use to cross-match each star observed by Gaia with the same star observed by PanSTARRS.\n", - "\n", - "We can use `load_table` (not `load_tables`) to get the metadata for a single table. The name of this function is misleading, because it only downloads metadata. " - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Retrieving table 'gaiadr2.gaia_source'\n", - "Parsing table 'gaiadr2.gaia_source'...\n", - "Done.\n" - ] - }, - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "meta = Gaia.load_table('gaiadr2.gaia_source')\n", - "meta" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jupyter shows that the result is an object of type `TapTableMeta`, but it does not display the contents.\n", - "\n", - "To see the metadata, we have to print the object." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "TAP Table name: gaiadr2.gaiadr2.gaia_source\n", - "Description: This table has an entry for every Gaia observed source as listed in the\n", - "Main Database accumulating catalogue version from which the catalogue\n", - "release has been generated. It contains the basic source parameters,\n", - "that is only final data (no epoch data) and no spectra (neither final\n", - "nor epoch).\n", - "Num. columns: 96\n" - ] - } - ], - "source": [ - "print(meta)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice one gotcha: in the list of table names, this table appears as `gaiadr2.gaiadr2.gaia_source`, but when we load the metadata, we refer to it as `gaiadr2.gaia_source`.\n", - "\n", - "**Exercise:** Go back and try\n", - "\n", - "```\n", - "meta = Gaia.load_table('gaiadr2.gaiadr2.gaia_source')\n", - "```\n", - "\n", - "What happens? Is the error message helpful? If you had not made this error deliberately, would you have been able to figure it out?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Columns\n", - "\n", - "The following loop prints the names of the columns in the table." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "solution_id\n", - "designation\n", - "source_id\n", - "random_index\n", - "ref_epoch\n", - "ra\n", - "ra_error\n", - "dec\n", - "dec_error\n", - "parallax\n", - "parallax_error\n", - "parallax_over_error\n", - "pmra\n", - "pmra_error\n", - "pmdec\n", - "pmdec_error\n", - "ra_dec_corr\n", - "ra_parallax_corr\n", - "ra_pmra_corr\n", - "ra_pmdec_corr\n", - "dec_parallax_corr\n", - "dec_pmra_corr\n", - "dec_pmdec_corr\n", - "parallax_pmra_corr\n", - "parallax_pmdec_corr\n", - "pmra_pmdec_corr\n", - "astrometric_n_obs_al\n", - "astrometric_n_obs_ac\n", - "astrometric_n_good_obs_al\n", - "astrometric_n_bad_obs_al\n", - "astrometric_gof_al\n", - "astrometric_chi2_al\n", - "astrometric_excess_noise\n", - "astrometric_excess_noise_sig\n", - "astrometric_params_solved\n", - "astrometric_primary_flag\n", - "astrometric_weight_al\n", - "astrometric_pseudo_colour\n", - "astrometric_pseudo_colour_error\n", - "mean_varpi_factor_al\n", - "astrometric_matched_observations\n", - "visibility_periods_used\n", - "astrometric_sigma5d_max\n", - "frame_rotator_object_type\n", - "matched_observations\n", - "duplicated_source\n", - "phot_g_n_obs\n", - "phot_g_mean_flux\n", - "phot_g_mean_flux_error\n", - "phot_g_mean_flux_over_error\n", - "phot_g_mean_mag\n", - "phot_bp_n_obs\n", - "phot_bp_mean_flux\n", - "phot_bp_mean_flux_error\n", - "phot_bp_mean_flux_over_error\n", - "phot_bp_mean_mag\n", - "phot_rp_n_obs\n", - "phot_rp_mean_flux\n", - "phot_rp_mean_flux_error\n", - "phot_rp_mean_flux_over_error\n", - "phot_rp_mean_mag\n", - "phot_bp_rp_excess_factor\n", - "phot_proc_mode\n", - "bp_rp\n", - "bp_g\n", - "g_rp\n", - "radial_velocity\n", - "radial_velocity_error\n", - "rv_nb_transits\n", - "rv_template_teff\n", - "rv_template_logg\n", - "rv_template_fe_h\n", - "phot_variable_flag\n", - "l\n", - "b\n", - "ecl_lon\n", - "ecl_lat\n", - "priam_flags\n", - "teff_val\n", - "teff_percentile_lower\n", - "teff_percentile_upper\n", - "a_g_val\n", - "a_g_percentile_lower\n", - "a_g_percentile_upper\n", - "e_bp_min_rp_val\n", - "e_bp_min_rp_percentile_lower\n", - "e_bp_min_rp_percentile_upper\n", - "flame_flags\n", - "radius_val\n", - "radius_percentile_lower\n", - "radius_percentile_upper\n", - "lum_val\n", - "lum_percentile_lower\n", - "lum_percentile_upper\n", - "datalink_url\n", - "epoch_photometry_url\n" - ] - } - ], - "source": [ - "for column in meta.columns:\n", - " print(column.name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You can probably guess what many of these columns are by looking at the names, but you should resist the temptation to guess.\n", - "To find out what the columns mean, [read the documentation](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html).\n", - "\n", - "If you want to know what can go wrong when you don't read the documentation, [you might like this article](https://www.vox.com/future-perfect/2019/6/4/18650969/married-women-miserable-fake-paul-dolan-happiness)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** One of the other tables we'll use is `gaiadr2.gaiadr2.panstarrs1_original_valid`. Use `load_table` to get the metadata for this table. How many columns are there and what are their names?\n", - "\n", - "Hint: Remember the gotcha we mentioned earlier." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Retrieving table 'gaiadr2.panstarrs1_original_valid'\n", - "Parsing table 'gaiadr2.panstarrs1_original_valid'...\n", - "Done.\n", - "TAP Table name: gaiadr2.gaiadr2.panstarrs1_original_valid\n", - "Description: The Panoramic Survey Telescope and Rapid Response System (Pan-STARRS) is\n", - "a system for wide-field astronomical imaging developed and operated by\n", - "the Institute for Astronomy at the University of Hawaii. Pan-STARRS1\n", - "(PS1) is the first part of Pan-STARRS to be completed and is the basis\n", - "for Data Release 1 (DR1). The PS1 survey used a 1.8 meter telescope and\n", - "its 1.4 Gigapixel camera to image the sky in five broadband filters (g,\n", - "r, i, z, y).\n", - "\n", - "The current table contains a filtered subsample of the 10 723 304 629\n", - "entries listed in the original ObjectThin table.\n", - "We used only ObjectThin and MeanObject tables to extract\n", - "panstarrs1OriginalValid table, this means that objects detected only in\n", - "stack images are not included here. The main reason for us to avoid the\n", - "use of objects detected in stack images is that their astrometry is not\n", - "as good as the mean objects astrometry: “The stack positions (raStack,\n", - "decStack) have considerably larger systematic astrometric errors than\n", - "the mean epoch positions (raMean, decMean).” The astrometry for the\n", - "MeanObject positions uses Gaia DR1 as a reference catalog, while the\n", - "stack positions use 2MASS as a reference catalog.\n", - "\n", - "In details, we filtered out all objects where:\n", - "\n", - "- nDetections = 1\n", - "\n", - "- no good quality data in Pan-STARRS, objInfoFlag 33554432 not set\n", - "\n", - "- mean astrometry could not be measured, objInfoFlag 524288 set\n", - "\n", - "- stack position used for mean astrometry, objInfoFlag 1048576 set\n", - "\n", - "- error on all magnitudes equal to 0 or to -999;\n", - "\n", - "- all magnitudes set to -999;\n", - "\n", - "- error on RA or DEC greater than 1 arcsec.\n", - "\n", - "The number of objects in panstarrs1OriginalValid is 2 264 263 282.\n", - "\n", - "The panstarrs1OriginalValid table contains only a subset of the columns\n", - "available in the combined ObjectThin and MeanObject tables. A\n", - "description of the original ObjectThin and MeanObjects tables can be\n", - "found at:\n", - "https://outerspace.stsci.edu/display/PANSTARRS/PS1+Database+object+and+detection+tables\n", - "\n", - "Download:\n", - "http://mastweb.stsci.edu/ps1casjobs/home.aspx\n", - "Documentation:\n", - "https://outerspace.stsci.edu/display/PANSTARRS\n", - "http://pswww.ifa.hawaii.edu/pswww/\n", - "References:\n", - "The Pan-STARRS1 Surveys, Chambers, K.C., et al. 2016, arXiv:1612.05560\n", - "Pan-STARRS Data Processing System, Magnier, E. A., et al. 2016,\n", - "arXiv:1612.05240\n", - "Pan-STARRS Pixel Processing: Detrending, Warping, Stacking, Waters, C.\n", - "Z., et al. 2016, arXiv:1612.05245\n", - "Pan-STARRS Pixel Analysis: Source Detection and Characterization,\n", - "Magnier, E. A., et al. 2016, arXiv:1612.05244\n", - "Pan-STARRS Photometric and Astrometric Calibration, Magnier, E. A., et\n", - "al. 2016, arXiv:1612.05242\n", - "The Pan-STARRS1 Database and Data Products, Flewelling, H. A., et al.\n", - "2016, arXiv:1612.05243\n", - "\n", - "Catalogue curator:\n", - "SSDC - ASI Space Science Data Center\n", - "https://www.ssdc.asi.it/\n", - "Num. columns: 26\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "meta2 = Gaia.load_table('gaiadr2.panstarrs1_original_valid')\n", - "print(meta2)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "obj_name\n", - "obj_id\n", - "ra\n", - "dec\n", - "ra_error\n", - "dec_error\n", - "epoch_mean\n", - "g_mean_psf_mag\n", - "g_mean_psf_mag_error\n", - "g_flags\n", - "r_mean_psf_mag\n", - "r_mean_psf_mag_error\n", - "r_flags\n", - "i_mean_psf_mag\n", - "i_mean_psf_mag_error\n", - "i_flags\n", - "z_mean_psf_mag\n", - "z_mean_psf_mag_error\n", - "z_flags\n", - "y_mean_psf_mag\n", - "y_mean_psf_mag_error\n", - "y_flags\n", - "n_detections\n", - "zone_id\n", - "obj_info_flag\n", - "quality_flag\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "for column in meta2.columns:\n", - " print(column.name)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Writing queries\n", - "\n", - "By now you might be wondering how we actually download the data. With tables this big, you generally don't. Instead, you use queries to select only the data you want.\n", - "\n", - "A query is a string written in a query language like SQL; for the Gaia database, the query language is a dialect of SQL called ADQL.\n", - "\n", - "Here's an example of an ADQL query." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "query1 = \"\"\"SELECT \n", - "TOP 10\n", - "source_id, ref_epoch, ra, dec, parallax \n", - "FROM gaiadr2.gaia_source\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Python note:** We use a [triple-quoted string](https://docs.python.org/3/tutorial/introduction.html#strings) here so we can include line breaks in the query, which makes it easier to read.\n", - "\n", - "The words in uppercase are ADQL keywords:\n", - "\n", - "* `SELECT` indicates that we are selecting data (as opposed to adding or modifying data).\n", - "\n", - "* `TOP` indicates that we only want the first 10 rows of the table, which is useful for testing a query before asking for all of the data.\n", - "\n", - "* `FROM` specifies which table we want data from.\n", - "\n", - "The third line is a list of column names, indicating which columns we want. \n", - "\n", - "In this example, the keywords are capitalized and the column names are lowercase. This is a common style, but it is not required. ADQL and SQL are not case-sensitive." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To run this query, we use the `Gaia` object, which represents our connection to the Gaia database, and invoke `launch_job`:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "job1 = Gaia.launch_job(query1)\n", - "job1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an object that represents the job running on a Gaia server.\n", - "\n", - "If you print it, it displays metadata for the forthcoming table." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "
    \n", - " name dtype unit description \n", - "--------- ------- ---- ------------------------------------------------------------------\n", - "source_id int64 Unique source identifier (unique within a particular Data Release)\n", - "ref_epoch float64 yr Reference epoch\n", - " ra float64 deg Right ascension\n", - " dec float64 deg Declination\n", - " parallax float64 mas Parallax\n", - "Jobid: None\n", - "Phase: COMPLETED\n", - "Owner: None\n", - "Output file: sync_20201005090721.xml.gz\n", - "Results: None\n" - ] - } - ], - "source": [ - "print(job1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Don't worry about `Results: None`. That does not actually mean there are no results.\n", - "\n", - "However, `Phase: COMPLETED` indicates that the job is complete, so we can get the results like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "astropy.table.table.Table" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results1 = job1.get_results()\n", - "type(results1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Optional detail:** Why is `table` repeated three times? The first is the name of the module, the second is the name of the submodule, and the third is the name of the class. Most of the time we only care about the last one. It's like the Linnean name for gorilla, which is *Gorilla Gorilla Gorilla*." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an [Astropy Table](https://docs.astropy.org/en/stable/table/), which is similar to a table in an SQL database except:\n", - "\n", - "* SQL databases are stored on disk drives, so they are persistent; that is, they \"survive\" even if you turn off the computer. An Astropy `Table` is stored in memory; it disappears when you turn off the computer (or shut down this Jupyter notebook).\n", - "\n", - "* SQL databases are designed to process queries. An Astropy `Table` can perform some query-like operations, like selecting columns and rows. But these operations use Python syntax, not SQL.\n", - "\n", - "Jupyter knows how to display the contents of a `Table`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "Table length=10\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307550606271623682015.5281.267623626829920.5585239223461581.1422630184554958
    45307468443413159682015.5281.137043174954120.3778523888981841.0092247424630945
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    " - ], - "text/plain": [ - "\n", - " source_id ref_epoch ... dec parallax \n", - " yr ... deg mas \n", - " int64 float64 ... float64 float64 \n", - "------------------- --------- ... ------------------ --------------------\n", - "4530738361793769600 2015.5 ... 20.40682117430378 0.9785380604519425\n", - "4530752651135081216 2015.5 ... 20.523350496351846 0.2674800612552977\n", - "4530743343951405568 2015.5 ... 20.474147574053124 -0.43911323550176806\n", - "4530755060627162368 2015.5 ... 20.558523922346158 1.1422630184554958\n", - "4530746844341315968 2015.5 ... 20.377852388898184 1.0092247424630945\n", - "4530768456615026432 2015.5 ... 20.31829694530366 -0.06900136127674149\n", - "4530763513119137280 2015.5 ... 20.20956829578524 0.1266016679823622\n", - "4530736364618539264 2015.5 ... 20.346579041327693 0.3894019486060072\n", - "4530735952305177728 2015.5 ... 20.311030903719928 0.2041189982608354\n", - "4530751281056022656 2015.5 ... 20.460309556214753 0.10294642821734962" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Each column has a name, units, and a data type.\n", - "\n", - "For example, the units of `ra` and `dec` are degrees, and their data type is `float64`, which is a 64-bit floating-point number, used to store measurements with a fraction part.\n", - "\n", - "This information comes from the Gaia database, and has been stored in the Astropy `Table` by Astroquery." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** Read [the documentation of this table](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html) and choose a column that looks interesting to you. Add the column name to the query and run it again. What are the units of the column you selected? What is its data type?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Asynchronous queries\n", - "\n", - "`launch_job` asks the server to run the job \"synchronously\", which normally means it runs immediately. But synchronous jobs are limited to 2000 rows. For queries that return more rows, you should run \"asynchronously\", which mean they might take longer to get started.\n", - "\n", - "If you are not sure how many rows a query will return, you can use the SQL command `COUNT` to find out how many rows are in the result without actually returning them. We'll see an example of this later.\n", - "\n", - "The results of an asynchronous query are stored in a file on the server, so you can start a query and come back later to get the results.\n", - "\n", - "For anonymous users, files are kept for three days.\n", - "\n", - "As an example, let's try a query that's similar to `query1`, with two changes:\n", - "\n", - "* It selects the first 3000 rows, so it is bigger than we should run synchronously.\n", - "\n", - "* It uses a new keyword, `WHERE`." - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "query2 = \"\"\"SELECT TOP 3000\n", - "source_id, ref_epoch, ra, dec, parallax\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "A `WHERE` clause indicates which rows we want; in this case, the query selects only rows \"where\" `parallax` is less than 1. This has the effect of selecting stars with relatively low parallax, which are farther away. We'll use this clause to exclude nearby stars that are unlikely to be part of GD-1.\n", - "\n", - "`WHERE` is one of the most common clauses in ADQL/SQL, and one of the most useful, because it allows us to select only the rows we need from the database.\n", - "\n", - "We use `launch_job_async` to submit an asynchronous query." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO: Query finished. [astroquery.utils.tap.core]\n", - "
    \n", - " name dtype unit description \n", - "--------- ------- ---- ------------------------------------------------------------------\n", - "source_id int64 Unique source identifier (unique within a particular Data Release)\n", - "ref_epoch float64 yr Reference epoch\n", - " ra float64 deg Right ascension\n", - " dec float64 deg Declination\n", - " parallax float64 mas Parallax\n", - "Jobid: 1601903242219O\n", - "Phase: COMPLETED\n", - "Owner: None\n", - "Output file: async_20201005090722.vot\n", - "Results: None\n" - ] - } - ], - "source": [ - "job2 = Gaia.launch_job_async(query2)\n", - "print(job2)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "Table length=3000\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    source_idref_epochradecparallax
    yrdegdegmas
    int64float64float64float64float64
    45307383617937696002015.5281.5672536244872520.406821174303780.9785380604519425
    45307526511350812162015.5281.086156535525720.5233504963518460.2674800612552977
    45307433439514055682015.5281.3711441829917720.474147574053124-0.43911323550176806
    45307684566150264322015.5281.872092143634720.31829694530366-0.06900136127674149
    45307635131191372802015.5281.921180886411620.209568295785240.1266016679823622
    45307363646185392642015.5281.491347561327420.3465790413276930.3894019486060072
    45307359523051777282015.5281.408554916570420.3110309037199280.2041189982608354
    45307512810560226562015.5281.058532837763820.4603095562147530.10294642821734962
    45307409387744093442015.5281.376256953641620.4361400589412060.9242670062090182
    ...............
    44677109150118026242015.5269.96809693073471.14290850381608820.42361471245557913
    44677065513286795522015.5270.0331645898811.05657473236899270.922888231734588
    44677122550373000962015.5270.77247179230470.6581664892880896-2.669179465293931
    44677350011817617922015.5270.36286062483080.89470793235991240.6117399163086398
    44677371014219166722015.5270.51108346614440.9806225910160181-0.39818224846127004
    44677075477573274882015.5269.887462805949271.02127599401369620.7741412301054209
    44677327720945730562015.5270.559971827601260.9037072088489417-1.7920417800164183
    44677323554910877442015.5270.67307907024910.9197224705139885-0.3464446494840354
    44677170997669445122015.5270.576671731208250.7262776590095680.05443955111134051
    44677190582657812482015.5270.72480529715140.82055519217827850.3733943917490343
    " - ], - "text/plain": [ - "\n", - " source_id ref_epoch ... dec parallax \n", - " yr ... deg mas \n", - " int64 float64 ... float64 float64 \n", - "------------------- --------- ... ------------------ --------------------\n", - "4530738361793769600 2015.5 ... 20.40682117430378 0.9785380604519425\n", - "4530752651135081216 2015.5 ... 20.523350496351846 0.2674800612552977\n", - "4530743343951405568 2015.5 ... 20.474147574053124 -0.43911323550176806\n", - "4530768456615026432 2015.5 ... 20.31829694530366 -0.06900136127674149\n", - "4530763513119137280 2015.5 ... 20.20956829578524 0.1266016679823622\n", - "4530736364618539264 2015.5 ... 20.346579041327693 0.3894019486060072\n", - "4530735952305177728 2015.5 ... 20.311030903719928 0.2041189982608354\n", - "4530751281056022656 2015.5 ... 20.460309556214753 0.10294642821734962\n", - "4530740938774409344 2015.5 ... 20.436140058941206 0.9242670062090182\n", - " ... ... ... ... ...\n", - "4467710915011802624 2015.5 ... 1.1429085038160882 0.42361471245557913\n", - "4467706551328679552 2015.5 ... 1.0565747323689927 0.922888231734588\n", - "4467712255037300096 2015.5 ... 0.6581664892880896 -2.669179465293931\n", - "4467735001181761792 2015.5 ... 0.8947079323599124 0.6117399163086398\n", - "4467737101421916672 2015.5 ... 0.9806225910160181 -0.39818224846127004\n", - "4467707547757327488 2015.5 ... 1.0212759940136962 0.7741412301054209\n", - "4467732772094573056 2015.5 ... 0.9037072088489417 -1.7920417800164183\n", - "4467732355491087744 2015.5 ... 0.9197224705139885 -0.3464446494840354\n", - "4467717099766944512 2015.5 ... 0.726277659009568 0.05443955111134051\n", - "4467719058265781248 2015.5 ... 0.8205551921782785 0.3733943917490343" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results2 = job2.get_results()\n", - "results2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "You might notice that some values of `parallax` are negative. As [this FAQ explains](https://www.cosmos.esa.int/web/gaia/archive-tips#negative%20parallax), \"Negative parallaxes are caused by errors in the observations.\" Negative parallaxes have \"no physical meaning,\" but they can be a \"useful diagnostic on the quality of the astrometric solution.\"\n", - "\n", - "Later we will see an example where we use `parallax` and `parallax_error` to identify stars where the distance estimate is likely to be inaccurate." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** The clauses in a query have to be in the right order. Go back and change the order of the clauses in `query2` and run it again. \n", - "\n", - "The query should fail, but notice that you don't get much useful debugging information. \n", - "\n", - "For this reason, developing and debugging ADQL queries can be really hard. A few suggestions that might help:\n", - "\n", - "* Whenever possible, start with a working query, either an example you find online or a query you have used in the past.\n", - "\n", - "* Make small changes and test each change before you continue.\n", - "\n", - "* While you are debugging, use `TOP` to limit the number of rows in the result. That will make each attempt run faster, which reduces your testing time. \n", - "\n", - "* Launching test queries synchronously might make them start faster, too." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Operators\n", - "\n", - "In a `WHERE` clause, you can use any of the [SQL comparison operators](https://www.w3schools.com/sql/sql_operators.asp):\n", - "\n", - "* `>`: greater than\n", - "* `<`: less than\n", - "* `>=`: greater than or equal\n", - "* `<=`: less than or equal\n", - "* `=`: equal\n", - "* `!=` or `<>`: not equal\n", - "\n", - "Most of these are the same as Python, but some are not. In particular, notice that the equality operator is `=`, not `==`.\n", - "Be careful to keep your Python out of your ADQL!\n", - "\n", - "You can combine comparisons using the logical operators:\n", - "\n", - "* AND: true if both comparisons are true\n", - "* OR: true if either or both comparisons are true\n", - "\n", - "Finally, you can use `NOT` to invert the result of a comparison. " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** [Read about SQL operators here](https://www.w3schools.com/sql/sql_operators.asp) and then modify the previous query to select rows where `bp_rp` is between `-0.75` and `2`.\n", - "\n", - "You can [read about this variable here](https://gea.esac.esa.int/archive/documentation/GDR2/Gaia_archive/chap_datamodel/sec_dm_main_tables/ssec_dm_gaia_source.html)." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# This is what most people will probably do\n", - "\n", - "query = \"\"\"SELECT TOP 10\n", - "source_id, ref_epoch, ra, dec, parallax\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1 \n", - " AND bp_rp > -0.75 AND bp_rp < 2\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "# But if someone notices the BETWEEN operator, \n", - "# they might do this\n", - "\n", - "query = \"\"\"SELECT TOP 10\n", - "source_id, ref_epoch, ra, dec, parallax\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1 \n", - " AND bp_rp BETWEEN -0.75 AND 2\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This [Hertzsprung-Russell diagram](https://sci.esa.int/web/gaia/-/60198-gaia-hertzsprung-russell-diagram) shows the BP-RP color and luminosity of stars in the Gaia catalog.\n", - "\n", - "Selecting stars with `bp-rp` less than 2 excludes many [class M dwarf stars](https://xkcd.com/2360/), which are low temperature, low luminosity. A star like that at GD-1's distance would be hard to detect, so if it is detected, it it more likely to be in the foreground." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Cleaning up\n", - "\n", - "Asynchronous jobs have a `jobid`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(None, '1601903242219O')" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "job1.jobid, job2.jobid" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Which you can use to remove the job from the server." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Removed jobs: '['1601903242219O']'.\n" - ] - } - ], - "source": [ - "Gaia.remove_jobs([job2.jobid])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "If you don't remove it job from the server, it will be removed eventually, so don't feel too bad if you don't clean up after yourself." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Formatting queries\n", - "\n", - "So far the queries have been string \"literals\", meaning that the entire string is part of the program.\n", - "But writing queries yourself can be slow, repetitive, and error-prone.\n", - "\n", - "It is often a good idea to write Python code that assembles a query for you. One useful tool for that is the [string `format` method](https://www.w3schools.com/python/ref_string_format.asp).\n", - "\n", - "As an example, we'll divide the previous query into two parts; a list of column names and a \"base\" for the query that contains everything except the column names.\n", - "\n", - "Here's the list of columns we'll select. " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the base; it's a string that contains at least one format specifier in curly brackets (braces)." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [], - "source": [ - "query3_base = \"\"\"SELECT TOP 10 \n", - "{columns}\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - " AND bp_rp BETWEEN -0.75 AND 2\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This base query contains one format specifier, `{columns}`, which is a placeholder for the list of column names we will provide.\n", - "\n", - "To assemble the query, we invoke `format` on the base string and provide a keyword argument that assigns a value to `columns`." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "query3 = query3_base.format(columns=columns)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is a string with line breaks. If you display it, the line breaks appear as `\\n`." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'SELECT TOP 10 \\nsource_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\\nFROM gaiadr2.gaia_source\\nWHERE parallax < 1\\n AND bp_rp BETWEEN -0.75 AND 2\\n'" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "query3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "But if you print it, the line breaks appear as... line breaks." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT TOP 10 \n", - "source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - " AND bp_rp BETWEEN -0.75 AND 2\n", - "\n" - ] - } - ], - "source": [ - "print(query3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that the format specifier has been replaced with the value of `columns`.\n", - "\n", - "Let's run it and see if it works:" - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "
    \n", - " name dtype unit description n_bad\n", - "--------------- ------- -------- ------------------------------------------------------------------ -----\n", - " source_id int64 Unique source identifier (unique within a particular Data Release) 0\n", - " ra float64 deg Right ascension 0\n", - " dec float64 deg Declination 0\n", - " pmra float64 mas / yr Proper motion in right ascension direction 0\n", - " pmdec float64 mas / yr Proper motion in declination direction 0\n", - " parallax float64 mas Parallax 0\n", - " parallax_error float64 mas Standard error of parallax 0\n", - "radial_velocity float64 km / s Radial velocity 10\n", - "Jobid: None\n", - "Phase: COMPLETED\n", - "Owner: None\n", - "Output file: sync_20201005090726.xml.gz\n", - "Results: None\n" - ] - } - ], - "source": [ - "job3 = Gaia.launch_job(query3)\n", - "print(job3)" - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "Table length=10\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    source_idradecpmrapmdecparallaxparallax_errorradial_velocity
    degdegmas / yrmas / yrmasmaskm / s
    int64float64float64float64float64float64float64float64
    4467710915011802624269.96809693073471.14290850381608822.0233280236600626-2.56924278755102660.423614712455579130.470352406647465--
    4467706551328679552270.0331645898811.0565747323689927-3.414829591355289-3.84372158574957370.9228882317345880.927008559859825--
    4467712255037300096270.77247179230470.6581664892880896-3.5620173752896025-6.595792323153987-2.6691794652939310.9719742773203504--
    4467735001181761792270.36286062483080.89470793235991242.13070799264892050.88267277109107120.61173991630863980.509812721702093--
    4467737101421916672270.51108346614440.98062259101601810.17532366511560785-5.113270239706202-0.398182248461270040.7549581886719651--
    4467707547757327488269.887462805949271.0212759940136962-2.6382230817672987-3.7077765320492870.77414123010542090.3022057897812064--
    4467732355491087744270.67307907024910.9197224705139885-2.2735991502653037-11.864952855984358-0.34644464948403540.4937921513912002--
    4467717099766944512270.576671731208250.726277659009568-3.4598362614808367-4.6014268933659210.054439551111340510.8867339293525688--
    4467719058265781248270.72480529715140.8205551921782785-3.255079498426542-9.2492850691110850.37339439174903430.390952370410666--
    4467722326741572352270.874312918885040.85955659758691580.106963983518598261.2035993780158853-0.118509434328643730.1660452431882023--
    " - ], - "text/plain": [ - "\n", - " source_id ra ... parallax_error radial_velocity\n", - " deg ... mas km / s \n", - " int64 float64 ... float64 float64 \n", - "------------------- ------------------ ... ------------------ ---------------\n", - "4467710915011802624 269.9680969307347 ... 0.470352406647465 --\n", - "4467706551328679552 270.033164589881 ... 0.927008559859825 --\n", - "4467712255037300096 270.7724717923047 ... 0.9719742773203504 --\n", - "4467735001181761792 270.3628606248308 ... 0.509812721702093 --\n", - "4467737101421916672 270.5110834661444 ... 0.7549581886719651 --\n", - "4467707547757327488 269.88746280594927 ... 0.3022057897812064 --\n", - "4467732355491087744 270.6730790702491 ... 0.4937921513912002 --\n", - "4467717099766944512 270.57667173120825 ... 0.8867339293525688 --\n", - "4467719058265781248 270.7248052971514 ... 0.390952370410666 --\n", - "4467722326741572352 270.87431291888504 ... 0.1660452431882023 --" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results3 = job3.get_results()\n", - "results3" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Good so far." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** This query always selects sources with `parallax` less than 1. But suppose you want to take that upper bound as an input.\n", - "\n", - "Modify `query3_base` to replace `1` with a format specifier like `{max_parallax}`. Now, when you call `format`, add a keyword argument that assigns a value to `max_parallax`, and confirm that the format specifier gets replaced with the value you provide." - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": {}, - "outputs": [], - "source": [ - "# Solution\n", - "\n", - "query4_base = \"\"\"SELECT TOP 10\n", - "{columns}\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < {max_parallax} AND \n", - "bp_rp BETWEEN -0.75 AND 2\n", - "\"\"\"" - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT TOP 10\n", - "source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 0.5 AND \n", - "bp_rp BETWEEN -0.75 AND 2\n", - "\n" - ] - } - ], - "source": [ - "# Solution\n", - "\n", - "query4 = query4_base.format(columns=columns,\n", - " max_parallax=0.5)\n", - "print(query)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Style note:** You might notice that the variable names in this notebook are numbered, like `query1`, `query2`, etc. \n", - "\n", - "The advantage of this style is that it isolates each section of the notebook from the others, so if you go back and run the cells out of order, it's less likely that you will get unexpected interactions.\n", - "\n", - "A drawback of this style is that it can be a nuisance to update the notebook if you add, remove, or reorder a section.\n", - "\n", - "What do you think of this choice? Are there alternatives you prefer?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "This notebook demonstrates the following steps:\n", - "\n", - "1. Making a connection to the Gaia server,\n", - "\n", - "2. Exploring information about the database and the tables it contains,\n", - "\n", - "3. Writing a query and sending it to the server, and finally\n", - "\n", - "4. Downloading the response from the server as an Astropy `Table`." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Best practices\n", - "\n", - "* If you can't download an entire dataset (or it's not practical) use queries to select the data you need.\n", - "\n", - "* Read the metadata and the documentation to make sure you understand the tables, their columns, and what they mean.\n", - "\n", - "* Develop queries incrementally: start with something simple, test it, and add a little bit at a time.\n", - "\n", - "* Use ADQL features like `TOP` and `COUNT` to test before you run a query that might return a lot of data.\n", - "\n", - "* If you know your query will return fewer than 3000 rows, you can run it synchronously, which might complete faster (but it doesn't seem to make much difference). If it might return more than 3000 rows, you should run it asynchronously.\n", - "\n", - "* ADQL and SQL are not case-sensitive, so you don't have to capitalize the keywords, but you should.\n", - "\n", - "* ADQL and SQL don't require you to break a query into multiple lines, but you should.\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Jupyter notebooks can be good for developing and testing code, but they have some drawbacks. In particular, if you run the cells out of order, you might find that variables don't have the values you expect.\n", - "\n", - "There are a few things you can do to mitigate these problems:\n", - "\n", - "* Make each section of the notebook self-contained. Try not to use the same variable name in more than one section.\n", - "\n", - "* Keep notebooks short. Look for places where you can break your analysis into phases with one notebook per phase." - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/_sources/AstronomicalData/_build/jupyter_execute/02_coords.ipynb b/_sources/AstronomicalData/_build/jupyter_execute/02_coords.ipynb deleted file mode 100644 index 7707176..0000000 --- a/_sources/AstronomicalData/_build/jupyter_execute/02_coords.ipynb +++ /dev/null @@ -1,1966 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Lesson 2\n", - "\n", - "This is the second in a series of lessons related to astronomy data.\n", - "\n", - "As a running example, we are replicating parts of the analysis in a recent paper, \"[Off the beaten path: Gaia reveals GD-1 stars outside of the main stream](https://arxiv.org/abs/1805.00425)\" by Adrian M. Price-Whelan and Ana Bonaca.\n", - "\n", - "In the first notebook, we wrote ADQL queries and used them to select and download data from the Gaia server.\n", - "\n", - "In this notebook, we'll pick up where we left off and write a query to select stars from the region of the sky where we expect GD-1 to be." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We'll start with an example that does a \"cone search\"; that is, it selects stars that appear in a circular region of the sky.\n", - "\n", - "Then, to select stars in the vicinity of GD-1, we'll:\n", - "\n", - "* Use `Quantity` objects to represent measurements with units.\n", - "\n", - "* Use the `Gala` library to convert coordinates from one frame to another.\n", - "\n", - "* Use the ADQL keywords `POLYGON`, `CONTAINS`, and `POINT` to select stars that fall within a polygonal region.\n", - "\n", - "* Submit a query and download the results.\n", - "\n", - "* Store the results in a FITS file.\n", - "\n", - "After completing this lesson, you should be able to\n", - "\n", - "* Use Python string formatting to compose more complex ADQL queries.\n", - "\n", - "* Work with coordinates and other quantities that have units.\n", - "\n", - "* Download the results of a query and store them in a file." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Installing libraries\n", - "\n", - "If you are running this notebook on Colab, you can run the following cell to install Astroquery and a the other libraries we'll use.\n", - "\n", - "If you are running this notebook on your own computer, you might have to install these libraries yourself. \n", - "\n", - "If you are using this notebook as part of a Carpentries workshop, you should have received setup instructions.\n", - "\n", - "TODO: Add a link to the instructions.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "# If we're running on Colab, install libraries\n", - "\n", - "import sys\n", - "IN_COLAB = 'google.colab' in sys.modules\n", - "\n", - "if IN_COLAB:\n", - " !pip install astroquery astro-gala pyia" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Selecting a region" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "One of the most common ways to restrict a query is to select stars in a particular region of the sky.\n", - "\n", - "For example, here's a query from the [Gaia archive documentation](https://gea.esac.esa.int/archive-help/adql/examples/index.html) that selects \"all the objects ... in a circular region centered at (266.41683, -29.00781) with a search radius of 5 arcmin (0.08333 deg).\"" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "query = \"\"\"\n", - "SELECT \n", - "TOP 10 source_id\n", - "FROM gaiadr2.gaia_source\n", - "WHERE 1=CONTAINS(\n", - " POINT(ra, dec),\n", - " CIRCLE(266.41683, -29.00781, 0.08333333))\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This query uses three keywords that are specific to ADQL (not SQL):\n", - "\n", - "* `POINT`: a location in [ICRS coordinates](https://en.wikipedia.org/wiki/International_Celestial_Reference_System), specified in degrees of right ascension and declination.\n", - "\n", - "* `CIRCLE`: a circle where the first two values are the coordinates of the center and the third is the radius in degrees.\n", - "\n", - "* `CONTAINS`: a function that returns `1` if a `POINT` is contained in a shape and `0` otherwise.\n", - "\n", - "Here is the [documentation of `CONTAINS`](http://www.ivoa.net/documents/ADQL/20180112/PR-ADQL-2.1-20180112.html#tth_sEc4.2.12).\n", - "\n", - "A query like this is called a cone search because it selects stars in a cone.\n", - "\n", - "Here's how we run it." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: gea.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n", - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: geadata.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n" - ] - }, - { - "data": { - "text/html": [ - "Table length=10\n", - "
    \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
    source_id
    int64
    4057468321929794432
    4057468287575835392
    4057482027171038976
    4057470349160630656
    4057470039924301696
    4057469868125641984
    4057468351995073024
    4057469661959554560
    4057470520960672640
    4057470555320409600
    " - ], - "text/plain": [ - "\n", - " source_id \n", - " int64 \n", - "-------------------\n", - "4057468321929794432\n", - "4057468287575835392\n", - "4057482027171038976\n", - "4057470349160630656\n", - "4057470039924301696\n", - "4057469868125641984\n", - "4057468351995073024\n", - "4057469661959554560\n", - "4057470520960672640\n", - "4057470555320409600" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from astroquery.gaia import Gaia\n", - "\n", - "job = Gaia.launch_job(query)\n", - "result = job.get_results()\n", - "result" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Exercise:** When you are debugging queries like this, you can use `TOP` to limit the size of the results, but then you still don't know how big the results will be.\n", - "\n", - "An alternative is to use `COUNT`, which asks for the number of rows that would be selected, but it does not return them.\n", - "\n", - "In the previous query, replace `TOP 10 source_id` with `COUNT(source_id)` and run the query again. How many stars has Gaia identified in the cone we searched?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Getting GD-1 Data\n", - "\n", - "From the Price-Whelan and Bonaca paper, we will try to reproduce Figure 1, which includes this representation of stars likely to belong to GD-1:\n", - "\n", - "" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Along the axis of right ascension ($\\phi_1$) the figure extends from -100 to 20 degrees.\n", - "\n", - "Along the axis of declination ($\\phi_2$) the figure extends from about -8 to 4 degrees.\n", - "\n", - "Ideally, we would select all stars from this rectangle, but there are more than 10 million of them, so\n", - "\n", - "* That would be difficult to work with,\n", - "\n", - "* As anonymous users, we are limited to 3 million rows in a single query, and\n", - "\n", - "* While we are developing and testing code, it will be faster to work with a smaller dataset.\n", - "\n", - "So we'll start by selecting stars in a smaller rectangle, from -55 to -45 degrees right ascension and -8 to 4 degrees of declination.\n", - "\n", - "But first we let's see how to represent quantities with units like degrees." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Working with coordinates\n", - "\n", - "Coordinates are physical quantities, which means that they have two parts, a value and a unit.\n", - "\n", - "For example, the coordinate $30^{\\circ}$ has value 30 and its units are degrees.\n", - "\n", - "Until recently, most scientific computation was done with values only; units were left out of the program altogether, [often with disastrous results](https://en.wikipedia.org/wiki/Mars_Climate_Orbiter#Cause_of_failure).\n", - "\n", - "Astropy provides tools for including units explicitly in computations, which makes it possible to detect errors before they cause disasters.\n", - "\n", - "To use Astropy units, we import them like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import astropy.units as u\n", - "\n", - "u" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`u` is an object that contains most common units and all SI units.\n", - "\n", - "You can use `dir` to list them, but you should also [read the documentation](https://docs.astropy.org/en/stable/units/)." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['A',\n", - " 'AA',\n", - " 'AB',\n", - " 'ABflux',\n", - " 'ABmag',\n", - " 'AU',\n", - " 'Angstrom',\n", - " 'B',\n", - " 'Ba',\n", - " 'Barye',\n", - " 'Bi',\n", - " 'Biot',\n", - " 'Bol',\n", - " 'Bq',\n", - " 'C',\n", - " 'Celsius',\n", - " 'Ci',\n", - " 'CompositeUnit',\n", - " 'D',\n", - " 'Da',\n", - " 'Dalton',\n", - " 'Debye',\n", - " 'Decibel',\n", - " 'DecibelUnit',\n", - " 'Dex',\n", - " 'DexUnit',\n", - " 'EA',\n", - " 'EAU',\n", - " 'EB',\n", - " 'EBa',\n", - " 'EC',\n", - " 'ED',\n", - " 'EF',\n", - " 'EG',\n", - " 'EGal',\n", - " 'EH',\n", - " 'EHz',\n", - " 'EJ',\n", - " 'EJy',\n", - " 'EK',\n", - " 'EL',\n", - " 'EN',\n", - " 'EOhm',\n", - " 'EP',\n", - " 'EPa',\n", - " 'ER',\n", - " 'ERy',\n", - " 'ES',\n", - " 'ESt',\n", - " 'ET',\n", - " 'EV',\n", - " 'EW',\n", - " 'EWb',\n", - " 'Ea',\n", - " 'Eadu',\n", - " 'Earcmin',\n", - " 'Earcsec',\n", - " 'Eau',\n", - " 'Eb',\n", - " 'Ebarn',\n", - " 'Ebeam',\n", - " 'Ebin',\n", - " 'Ebit',\n", - " 'Ebyte',\n", - " 'Ecd',\n", - " 'Echan',\n", - " 'Ecount',\n", - " 'Ect',\n", - " 'Ed',\n", - " 'Edeg',\n", - " 'Edyn',\n", - " 'EeV',\n", - " 'Eerg',\n", - " 'Eg',\n", - " 'Eh',\n", - " 'EiB',\n", - " 'Eib',\n", - " 'Eibit',\n", - " 'Eibyte',\n", - " 'Ek',\n", - " 'El',\n", - " 'Elm',\n", - " 'Elx',\n", - " 'Elyr',\n", - " 'Em',\n", - " 'Emag',\n", - " 'Emin',\n", - " 'Emol',\n", - " 'Eohm',\n", - " 'Epc',\n", - " 'Eph',\n", - " 'Ephoton',\n", - " 'Epix',\n", - " 'Epixel',\n", - " 'Erad',\n", - " 'Es',\n", - " 'Esr',\n", - " 'Eu',\n", - " 'Evox',\n", - " 'Evoxel',\n", - " 'Eyr',\n", - " 'F',\n", - " 'Farad',\n", - " 'Fr',\n", - " 'Franklin',\n", - " 'FunctionQuantity',\n", - " 'FunctionUnitBase',\n", - " 'G',\n", - " 'GA',\n", - " 'GAU',\n", - " 'GB',\n", - " 'GBa',\n", - " 'GC',\n", - " 'GD',\n", - " 'GF',\n", - " 'GG',\n", - " 'GGal',\n", - " 'GH',\n", - " 'GHz',\n", - " 'GJ',\n", - " 'GJy',\n", - " 'GK',\n", - " 'GL',\n", - " 'GN',\n", - " 'GOhm',\n", - " 'GP',\n", - " 'GPa',\n", - " 'GR',\n", - " 'GRy',\n", - " 'GS',\n", - " 'GSt',\n", - " 'GT',\n", - " 'GV',\n", - " 'GW',\n", - " 'GWb',\n", - " 'Ga',\n", - " 'Gadu',\n", - " 'Gal',\n", - " 'Garcmin',\n", - " 'Garcsec',\n", - " 'Gau',\n", - " 'Gauss',\n", - " 'Gb',\n", - " 'Gbarn',\n", - " 'Gbeam',\n", - " 'Gbin',\n", - " 'Gbit',\n", - " 'Gbyte',\n", - " 'Gcd',\n", - " 'Gchan',\n", - " 'Gcount',\n", - " 'Gct',\n", - " 'Gd',\n", - " 'Gdeg',\n", - " 'Gdyn',\n", - " 'GeV',\n", - " 'Gerg',\n", - " 'Gg',\n", - " 'Gh',\n", - " 'GiB',\n", - " 'Gib',\n", - " 'Gibit',\n", - " 'Gibyte',\n", - " 'Gk',\n", - " 'Gl',\n", - " 'Glm',\n", - " 'Glx',\n", - " 'Glyr',\n", - " 'Gm',\n", - " 'Gmag',\n", - " 'Gmin',\n", - " 'Gmol',\n", - " 'Gohm',\n", - " 'Gpc',\n", - " 'Gph',\n", - " 'Gphoton',\n", - " 'Gpix',\n", - " 'Gpixel',\n", - " 'Grad',\n", - " 'Gs',\n", - " 'Gsr',\n", - " 'Gu',\n", - " 'Gvox',\n", - " 'Gvoxel',\n", - " 'Gyr',\n", - " 'H',\n", - " 'Henry',\n", - " 'Hertz',\n", - " 'Hz',\n", - " 'IrreducibleUnit',\n", - " 'J',\n", - " 'Jansky',\n", - " 'Joule',\n", - " 'Jy',\n", - " 'K',\n", - " 'Kayser',\n", - " 'Kelvin',\n", - " 'KiB',\n", - " 'Kib',\n", - " 'Kibit',\n", - " 'Kibyte',\n", - " 'L',\n", - " 'L_bol',\n", - " 'L_sun',\n", - " 'LogQuantity',\n", - " 'LogUnit',\n", - " 'Lsun',\n", - " 'MA',\n", - " 'MAU',\n", - " 'MB',\n", - " 'MBa',\n", - " 'MC',\n", - " 'MD',\n", - " 'MF',\n", - " 'MG',\n", - " 'MGal',\n", - " 'MH',\n", - " 'MHz',\n", - " 'MJ',\n", - " 'MJy',\n", - " 'MK',\n", - " 'ML',\n", - " 'MN',\n", - " 'MOhm',\n", - " 'MP',\n", - " 'MPa',\n", - " 'MR',\n", - " 'MRy',\n", - " 'MS',\n", - " 'MSt',\n", - " 'MT',\n", - " 'MV',\n", - " 'MW',\n", - " 'MWb',\n", - " 'M_bol',\n", - " 'M_e',\n", - " 'M_earth',\n", - " 'M_jup',\n", - " 'M_jupiter',\n", - " 'M_p',\n", - " 'M_sun',\n", - " 'Ma',\n", - " 'Madu',\n", - " 'MagUnit',\n", - " 'Magnitude',\n", - " 'Marcmin',\n", - " 'Marcsec',\n", - " 'Mau',\n", - " 'Mb',\n", - " 'Mbarn',\n", - " 'Mbeam',\n", - " 'Mbin',\n", - " 'Mbit',\n", - " 'Mbyte',\n", - " 'Mcd',\n", - " 'Mchan',\n", - " 'Mcount',\n", - " 'Mct',\n", - " 'Md',\n", - " 'Mdeg',\n", - " 'Mdyn',\n", - " 'MeV',\n", - " 'Mearth',\n", - " 'Merg',\n", - " 'Mg',\n", - " 'Mh',\n", - " 'MiB',\n", - " 'Mib',\n", - " 'Mibit',\n", - " 'Mibyte',\n", - " 'Mjup',\n", - " 'Mjupiter',\n", - " 'Mk',\n", - " 'Ml',\n", - " 'Mlm',\n", - " 'Mlx',\n", - " 'Mlyr',\n", - " 'Mm',\n", - " 'Mmag',\n", - " 'Mmin',\n", - " 'Mmol',\n", - " 'Mohm',\n", - " 'Mpc',\n", - " 'Mph',\n", - " 'Mphoton',\n", - " 'Mpix',\n", - " 'Mpixel',\n", - " 'Mrad',\n", - " 'Ms',\n", - " 'Msr',\n", - " 'Msun',\n", - " 'Mu',\n", - " 'Mvox',\n", - " 'Mvoxel',\n", - " 'Myr',\n", - " 'N',\n", - " 'NamedUnit',\n", - " 'Newton',\n", - " 'Ohm',\n", - " 'P',\n", - " 'PA',\n", - " 'PAU',\n", - " 'PB',\n", - " 'PBa',\n", - " 'PC',\n", - " 'PD',\n", - " 'PF',\n", - " 'PG',\n", - " 'PGal',\n", - " 'PH',\n", - " 'PHz',\n", - " 'PJ',\n", - " 'PJy',\n", - " 'PK',\n", - " 'PL',\n", - " 'PN',\n", - " 'POhm',\n", - " 'PP',\n", - " 'PPa',\n", - " 'PR',\n", - " 'PRy',\n", - " 'PS',\n", - " 'PSt',\n", - " 'PT',\n", - " 'PV',\n", - " 'PW',\n", - " 'PWb',\n", - " 'Pa',\n", - " 'Padu',\n", - " 'Parcmin',\n", - " 'Parcsec',\n", - " 'Pascal',\n", - " 'Pau',\n", - " 'Pb',\n", - " 'Pbarn',\n", - " 'Pbeam',\n", - " 'Pbin',\n", - " 'Pbit',\n", - " 'Pbyte',\n", - " 'Pcd',\n", - " 'Pchan',\n", - " 'Pcount',\n", - " 'Pct',\n", - " 'Pd',\n", - " 'Pdeg',\n", - " 'Pdyn',\n", - " 'PeV',\n", - " 'Perg',\n", - " 'Pg',\n", - " 'Ph',\n", - " 'PiB',\n", - " 'Pib',\n", - " 'Pibit',\n", - " 'Pibyte',\n", - " 'Pk',\n", - " 'Pl',\n", - " 'Plm',\n", - " 'Plx',\n", - " 'Plyr',\n", - " 'Pm',\n", - " 'Pmag',\n", - " 'Pmin',\n", - " 'Pmol',\n", - " 'Pohm',\n", - " 'Ppc',\n", - " 'Pph',\n", - " 'Pphoton',\n", - " 'Ppix',\n", - " 'Ppixel',\n", - " 'Prad',\n", - " 'PrefixUnit',\n", - " 'Ps',\n", - " 'Psr',\n", - " 'Pu',\n", - " 'Pvox',\n", - " 'Pvoxel',\n", - " 'Pyr',\n", - " 'Quantity',\n", - " 'QuantityInfo',\n", - " 'QuantityInfoBase',\n", - " 'R',\n", - " 'R_earth',\n", - " 'R_jup',\n", - " 'R_jupiter',\n", - " 'R_sun',\n", - " 'Rayleigh',\n", - " 'Rearth',\n", - " 'Rjup',\n", - " 'Rjupiter',\n", - " 'Rsun',\n", - " 'Ry',\n", - " 'S',\n", - " 'ST',\n", - " 'STflux',\n", - " 'STmag',\n", - " 'Siemens',\n", - " 'SpecificTypeQuantity',\n", - " 'St',\n", - " 'Sun',\n", - " 'T',\n", - " 'TA',\n", - " 'TAU',\n", - " 'TB',\n", - " 'TBa',\n", - " 'TC',\n", - " 'TD',\n", - " 'TF',\n", - " 'TG',\n", - " 'TGal',\n", - " 'TH',\n", - " 'THz',\n", - " 'TJ',\n", - " 'TJy',\n", - " 'TK',\n", - " 'TL',\n", - " 'TN',\n", - " 'TOhm',\n", - " 'TP',\n", - " 'TPa',\n", - " 'TR',\n", - " 'TRy',\n", - " 'TS',\n", - " 'TSt',\n", - " 'TT',\n", - " 'TV',\n", - " 'TW',\n", - " 'TWb',\n", - " 'Ta',\n", - " 'Tadu',\n", - " 'Tarcmin',\n", - " 'Tarcsec',\n", - " 'Tau',\n", - " 'Tb',\n", - " 'Tbarn',\n", - " 'Tbeam',\n", - " 'Tbin',\n", - " 'Tbit',\n", - " 'Tbyte',\n", - " 'Tcd',\n", - " 'Tchan',\n", - " 'Tcount',\n", - " 'Tct',\n", - " 'Td',\n", - " 'Tdeg',\n", - " 'Tdyn',\n", - " 'TeV',\n", - " 'Terg',\n", - " 'Tesla',\n", - " 'Tg',\n", - " 'Th',\n", - " 'TiB',\n", - " 'Tib',\n", - " 'Tibit',\n", - " 'Tibyte',\n", - " 'Tk',\n", - " 'Tl',\n", - " 'Tlm',\n", - " 'Tlx',\n", - " 'Tlyr',\n", - " 'Tm',\n", - " 'Tmag',\n", - " 'Tmin',\n", - " 'Tmol',\n", - " 'Tohm',\n", - " 'Tpc',\n", - " 'Tph',\n", - " 'Tphoton',\n", - " 'Tpix',\n", - " 'Tpixel',\n", - " 'Trad',\n", - " 'Ts',\n", - " 'Tsr',\n", - " 'Tu',\n", - " 'Tvox',\n", - " 'Tvoxel',\n", - " 'Tyr',\n", - " 'Unit',\n", - " 'UnitBase',\n", - " 'UnitConversionError',\n", - " 'UnitTypeError',\n", - " 'UnitsError',\n", - " 'UnitsWarning',\n", - " 'UnrecognizedUnit',\n", - " 'V',\n", - " 'Volt',\n", - " 'W',\n", - " 'Watt',\n", - " 'Wb',\n", - " 'Weber',\n", - " 'YA',\n", - " 'YAU',\n", - " 'YB',\n", - " 'YBa',\n", - " 'YC',\n", - " 'YD',\n", - " 'YF',\n", - " 'YG',\n", - " 'YGal',\n", - " 'YH',\n", - " 'YHz',\n", - " 'YJ',\n", - " 'YJy',\n", - " 'YK',\n", - " 'YL',\n", - " 'YN',\n", - " 'YOhm',\n", - " 'YP',\n", - " 'YPa',\n", - " 'YR',\n", - " 'YRy',\n", - " 'YS',\n", - " 'YSt',\n", - " 'YT',\n", - " 'YV',\n", - " 'YW',\n", - " 'YWb',\n", - " 'Ya',\n", - " 'Yadu',\n", - " 'Yarcmin',\n", - " 'Yarcsec',\n", - " 'Yau',\n", - " 'Yb',\n", - " 'Ybarn',\n", - " 'Ybeam',\n", - " 'Ybin',\n", - " 'Ybit',\n", - " 'Ybyte',\n", - " 'Ycd',\n", - " 'Ychan',\n", - " 'Ycount',\n", - " 'Yct',\n", - " 'Yd',\n", - " 'Ydeg',\n", - " 'Ydyn',\n", - " 'YeV',\n", - " 'Yerg',\n", - " 'Yg',\n", - " 'Yh',\n", - " 'Yk',\n", - " 'Yl',\n", - " 'Ylm',\n", - " 'Ylx',\n", - " 'Ylyr',\n", - " 'Ym',\n", - " 'Ymag',\n", - " 'Ymin',\n", - " 'Ymol',\n", - " 'Yohm',\n", - " 'Ypc',\n", - " 'Yph',\n", - " 'Yphoton',\n", - " 'Ypix',\n", - " 'Ypixel',\n", - " 'Yrad',\n", - " 'Ys',\n", - " 'Ysr',\n", - " 'Yu',\n", - " 'Yvox',\n", - " 'Yvoxel',\n", - " 'Yyr',\n", - " 'ZA',\n", - " 'ZAU',\n", - " 'ZB',\n", - " 'ZBa',\n", - " 'ZC',\n", - " 'ZD',\n", - " 'ZF',\n", - " 'ZG',\n", - " 'ZGal',\n", - " 'ZH',\n", - " 'ZHz',\n", - " 'ZJ',\n", - " 'ZJy',\n", - " 'ZK',\n", - " 'ZL',\n", - " 'ZN',\n", - " 'ZOhm',\n", - " 'ZP',\n", - " 'ZPa',\n", - " 'ZR',\n", - " 'ZRy',\n", - " 'ZS',\n", - " 'ZSt',\n", - " 'ZT',\n", - " 'ZV',\n", - " 'ZW',\n", - " 'ZWb',\n", - " 'Za',\n", - " 'Zadu',\n", - " 'Zarcmin',\n", - " 'Zarcsec',\n", - " 'Zau',\n", - " 'Zb',\n", - " 'Zbarn',\n", - " 'Zbeam',\n", - " 'Zbin',\n", - " 'Zbit',\n", - " 'Zbyte',\n", - " 'Zcd',\n", - " 'Zchan',\n", - " 'Zcount',\n", - " 'Zct',\n", - " 'Zd',\n", - " 'Zdeg',\n", - " 'Zdyn',\n", - " 'ZeV',\n", - " 'Zerg',\n", - " 'Zg',\n", - " 'Zh',\n", - " 'Zk',\n", - " 'Zl',\n", - " 'Zlm',\n", - " 'Zlx',\n", - " 'Zlyr',\n", - " 'Zm',\n", - " 'Zmag',\n", - " 'Zmin',\n", - " 'Zmol',\n", - " 'Zohm',\n", - " 'Zpc',\n", - " 'Zph',\n", - " 'Zphoton',\n", - " 'Zpix',\n", - " 'Zpixel',\n", - " 'Zrad',\n", - " 'Zs',\n", - " 'Zsr',\n", - " 'Zu',\n", - " 'Zvox',\n", - " 'Zvoxel',\n", - " 'Zyr',\n", - " '__builtins__',\n", - " '__cached__',\n", - " '__doc__',\n", - " '__file__',\n", - " '__loader__',\n", - " '__name__',\n", - " '__package__',\n", - " '__path__',\n", - " '__spec__',\n", - " 'a',\n", - " 'aA',\n", - " 'aAU',\n", - " 'aB',\n", - " 'aBa',\n", - " 'aC',\n", - " 'aD',\n", - " 'aF',\n", - " 'aG',\n", - " 'aGal',\n", - " 'aH',\n", - " 'aHz',\n", - " 'aJ',\n", - " 'aJy',\n", - " 'aK',\n", - " 'aL',\n", - " 'aN',\n", - " 'aOhm',\n", - " 'aP',\n", - " 'aPa',\n", - " 'aR',\n", - " 'aRy',\n", - " 'aS',\n", - " 'aSt',\n", - " 'aT',\n", - " 'aV',\n", - " 'aW',\n", - " 'aWb',\n", - " 'aa',\n", - " 'aadu',\n", - " 'aarcmin',\n", - " 'aarcsec',\n", - " 'aau',\n", - " 'ab',\n", - " 'abA',\n", - " 'abC',\n", - " 'abampere',\n", - " 'abarn',\n", - " 'abcoulomb',\n", - " 'abeam',\n", - " 'abin',\n", - " 'abit',\n", - " 'abyte',\n", - " 'acd',\n", - " 'achan',\n", - " 'acount',\n", - " 'act',\n", - " 'ad',\n", - " 'add_enabled_equivalencies',\n", - " 'add_enabled_units',\n", - " 'adeg',\n", - " 'adu',\n", - " 'adyn',\n", - " 'aeV',\n", - " 'aerg',\n", - " 'ag',\n", - " 'ah',\n", - " 'ak',\n", - " 'al',\n", - " 'allclose',\n", - " 'alm',\n", - " 'alx',\n", - " 'alyr',\n", - " 'am',\n", - " 'amag',\n", - " 'amin',\n", - " 'amol',\n", - " 'amp',\n", - " 'ampere',\n", - " 'angstrom',\n", - " 'annum',\n", - " 'aohm',\n", - " 'apc',\n", - " 'aph',\n", - " 'aphoton',\n", - " 'apix',\n", - " 'apixel',\n", - " 'arad',\n", - " 'arcmin',\n", - " 'arcminute',\n", - " 'arcsec',\n", - " 'arcsecond',\n", - " 'asr',\n", - " 'astronomical_unit',\n", - " 'astrophys',\n", - " 'attoBarye',\n", - " 'attoDa',\n", - " 'attoDalton',\n", - " 'attoDebye',\n", - " 'attoFarad',\n", - " 'attoGauss',\n", - " 'attoHenry',\n", - " 'attoHertz',\n", - " 'attoJansky',\n", - " 'attoJoule',\n", - " 'attoKayser',\n", - " 'attoKelvin',\n", - " 'attoNewton',\n", - " 'attoOhm',\n", - " 'attoPascal',\n", - " 'attoRayleigh',\n", - " 'attoSiemens',\n", - " 'attoTesla',\n", - " 'attoVolt',\n", - " 'attoWatt',\n", - " 'attoWeber',\n", - " 'attoamp',\n", - " 'attoampere',\n", - " 'attoannum',\n", - " 'attoarcminute',\n", - " 'attoarcsecond',\n", - " 'attoastronomical_unit',\n", - " 'attobarn',\n", - " 'attobarye',\n", - " 'attobit',\n", - " 'attobyte',\n", - " 'attocandela',\n", - " 'attocoulomb',\n", - " 'attocount',\n", - " 'attoday',\n", - " 'attodebye',\n", - " 'attodegree',\n", - " 'attodyne',\n", - " 'attoelectronvolt',\n", - " 'attofarad',\n", - " 'attogal',\n", - " 'attogauss',\n", - " 'attogram',\n", - " 'attohenry',\n", - " 'attohertz',\n", - " 'attohour',\n", - " 'attohr',\n", - " 'attojansky',\n", - " 'attojoule',\n", - " 'attokayser',\n", - " 'attolightyear',\n", - " 'attoliter',\n", - " 'attolumen',\n", - " 'attolux',\n", - " 'attometer',\n", - " 'attominute',\n", - " 'attomole',\n", - " 'attonewton',\n", - " 'attoparsec',\n", - " 'attopascal',\n", - " 'attophoton',\n", - " 'attopixel',\n", - " 'attopoise',\n", - " 'attoradian',\n", - " 'attorayleigh',\n", - " 'attorydberg',\n", - " 'attosecond',\n", - " 'attosiemens',\n", - " 'attosteradian',\n", - " 'attostokes',\n", - " 'attotesla',\n", - " 'attovolt',\n", - " 'attovoxel',\n", - " 'attowatt',\n", - " 'attoweber',\n", - " 'attoyear',\n", - " 'au',\n", - " 'avox',\n", - " 'avoxel',\n", - " 'ayr',\n", - " 'b',\n", - " 'bar',\n", - " 'barn',\n", - " 'barye',\n", - " 'beam',\n", - " 'beam_angular_area',\n", - " 'becquerel',\n", - " 'bin',\n", - " 'binary_prefixes',\n", - " 'bit',\n", - " 'bol',\n", - " 'brightness_temperature',\n", - " 'byte',\n", - " 'cA',\n", - " 'cAU',\n", - " 'cB',\n", - " 'cBa',\n", - " 'cC',\n", - " 'cD',\n", - " 'cF',\n", - " 'cG',\n", - " 'cGal',\n", - " 'cH',\n", - " 'cHz',\n", - " 'cJ',\n", - " 'cJy',\n", - " 'cK',\n", - " 'cL',\n", - " 'cN',\n", - " 'cOhm',\n", - " 'cP',\n", - " 'cPa',\n", - " 'cR',\n", - " 'cRy',\n", - " 'cS',\n", - " 'cSt',\n", - " 'cT',\n", - " 'cV',\n", - " 'cW',\n", - " 'cWb',\n", - " 'ca',\n", - " 'cadu',\n", - " 'candela',\n", - " 'carcmin',\n", - " 'carcsec',\n", - " 'cau',\n", - " 'cb',\n", - " 'cbarn',\n", - " 'cbeam',\n", - " 'cbin',\n", - " 'cbit',\n", - " 'cbyte',\n", - " 'ccd',\n", - " 'cchan',\n", - " 'ccount',\n", - " 'cct',\n", - " 'cd',\n", - " 'cdeg',\n", - " 'cdyn',\n", - " 'ceV',\n", - " 'centiBarye',\n", - " 'centiDa',\n", - " 'centiDalton',\n", - " 'centiDebye',\n", - " 'centiFarad',\n", - " 'centiGauss',\n", - " 'centiHenry',\n", - " 'centiHertz',\n", - " 'centiJansky',\n", - " 'centiJoule',\n", - " 'centiKayser',\n", - " 'centiKelvin',\n", - " 'centiNewton',\n", - " 'centiOhm',\n", - " 'centiPascal',\n", - " 'centiRayleigh',\n", - " 'centiSiemens',\n", - " 'centiTesla',\n", - " 'centiVolt',\n", - " 'centiWatt',\n", - " 'centiWeber',\n", - " 'centiamp',\n", - " 'centiampere',\n", - " 'centiannum',\n", - " 'centiarcminute',\n", - " 'centiarcsecond',\n", - " 'centiastronomical_unit',\n", - " 'centibarn',\n", - " 'centibarye',\n", - " 'centibit',\n", - " 'centibyte',\n", - " 'centicandela',\n", - " 'centicoulomb',\n", - " 'centicount',\n", - " 'centiday',\n", - " 'centidebye',\n", - " 'centidegree',\n", - " 'centidyne',\n", - " 'centielectronvolt',\n", - " 'centifarad',\n", - " 'centigal',\n", - " 'centigauss',\n", - " 'centigram',\n", - " 'centihenry',\n", - " 'centihertz',\n", - " 'centihour',\n", - " 'centihr',\n", - " 'centijansky',\n", - " 'centijoule',\n", - " 'centikayser',\n", - " 'centilightyear',\n", - " 'centiliter',\n", - " 'centilumen',\n", - " 'centilux',\n", - " 'centimeter',\n", - " 'centiminute',\n", - " 'centimole',\n", - " 'centinewton',\n", - " 'centiparsec',\n", - " 'centipascal',\n", - " 'centiphoton',\n", - " 'centipixel',\n", - " 'centipoise',\n", - " 'centiradian',\n", - " 'centirayleigh',\n", - " 'centirydberg',\n", - " 'centisecond',\n", - " 'centisiemens',\n", - " 'centisteradian',\n", - " 'centistokes',\n", - " 'centitesla',\n", - " 'centivolt',\n", - " 'centivoxel',\n", - " 'centiwatt',\n", - " 'centiweber',\n", - " 'centiyear',\n", - " 'cerg',\n", - " 'cg',\n", - " 'cgs',\n", - " 'ch',\n", - " 'chan',\n", - " 'ck',\n", - " 'cl',\n", - " 'clm',\n", - " 'clx',\n", - " 'clyr',\n", - " 'cm',\n", - " 'cmag',\n", - " 'cmin',\n", - " 'cmol',\n", - " 'cohm',\n", - " 'core',\n", - " 'coulomb',\n", - " 'count',\n", - " 'cpc',\n", - " 'cph',\n", - " 'cphoton',\n", - " 'cpix',\n", - " 'cpixel',\n", - " 'crad',\n", - " 'cs',\n", - " 'csr',\n", - " 'ct',\n", - " 'cu',\n", - " 'curie',\n", - " 'cvox',\n", - " 'cvoxel',\n", - " 'cy',\n", - " 'cycle',\n", - " 'cyr',\n", - " 'd',\n", - " 'dA',\n", - " 'dAU',\n", - " 'dB',\n", - " 'dBa',\n", - " 'dC',\n", - " 'dD',\n", - " 'dF',\n", - " 'dG',\n", - " 'dGal',\n", - " 'dH',\n", - " 'dHz',\n", - " 'dJ',\n", - " 'dJy',\n", - " 'dK',\n", - " 'dL',\n", - " 'dN',\n", - " 'dOhm',\n", - " 'dP',\n", - " 'dPa',\n", - " 'dR',\n", - " 'dRy',\n", - " 'dS',\n", - " 'dSt',\n", - " 'dT',\n", - " ...]" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dir(u)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To create a quantity, we multiply a value by a unit." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "astropy.units.quantity.Quantity" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coord = 30 * u.deg\n", - "type(coord)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is a `Quantity` object.\n", - "\n", - "Jupyter knows how to display `Quantities` like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "data": { - "text/latex": [ - "$30 \\; \\mathrm{{}^{\\circ}}$" - ], - "text/plain": [ - "" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "coord" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Selecting a rectangle\n", - "\n", - "Now we'll select a rectangle from -55 to -45 degrees right ascension and -8 to 4 degrees of declination.\n", - "\n", - "We'll define variables to contain these limits." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "phi1_min = -55\n", - "phi1_max = -45\n", - "phi2_min = -8\n", - "phi2_max = 4" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "To represent a rectangle, we'll use two lists of coordinates and multiply by their units." - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "phi1_rect = [phi1_min, phi1_min, phi1_max, phi1_max] * u.deg\n", - "phi2_rect = [phi2_min, phi2_max, phi2_max, phi2_min] * u.deg" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`phi1_rect` and `phi2_rect` represent the coordinates of the corners of a rectangle. \n", - "\n", - "But they are in \"[a Heliocentric spherical coordinate system defined by the orbit of the GD1 stream](https://gala-astro.readthedocs.io/en/latest/_modules/gala/coordinates/gd1.html)\"\n", - "\n", - "In order to use them in a Gaia query, we have to convert them to [International Celestial Reference System](https://en.wikipedia.org/wiki/International_Celestial_Reference_System) (ICRS) coordinates. We can do that by storing the coordinates in a `GD1Koposov10` object provided by [Gala](https://gala-astro.readthedocs.io/en/latest/coordinates/)." - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "gala.coordinates.gd1.GD1Koposov10" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import gala.coordinates as gc\n", - "\n", - "corners = gc.GD1Koposov10(phi1=phi1_rect, phi2=phi2_rect)\n", - "type(corners)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can display the result like this:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "corners" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use `transform_to` to convert to ICRS coordinates." - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "astropy.coordinates.builtin_frames.icrs.ICRS" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import astropy.coordinates as coord\n", - "\n", - "corners_icrs = corners.transform_to(coord.ICRS)\n", - "type(corners_icrs)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is an `ICRS` object." - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "corners_icrs" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that a rectangle in one coordinate system is not necessarily a rectangle in another. In this example, the result is a polygon." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Selecting a polygon\n", - "\n", - "In order to use this polygon as part of an ADQL query, we have to convert it to a string with a comma-separated list of coordinates, as in this example:\n", - "\n", - "```\n", - "\"\"\"\n", - "POLYGON(143.65, 20.98, \n", - " 134.46, 26.39, \n", - " 140.58, 34.85, \n", - " 150.16, 29.01)\n", - "\"\"\"\n", - "```" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "`corners_icrs` behaves like a list, so we can use a `for` loop to iterate through the points." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "\n", - "\n" - ] - } - ], - "source": [ - "for point in corners_icrs:\n", - " print(point)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From that, we can select the coordinates `ra` and `dec`:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "146d16m31.1993s 19d15m42.8754s\n", - "135d25m17.902s 25d52m38.594s\n", - "141d36m09.5337s 34d18m17.3891s\n", - "152d49m00.1576s 27d08m10.0051s\n" - ] - } - ], - "source": [ - "for point in corners_icrs:\n", - " print(point.ra, point.dec)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The results are quantities with units, but if we select the `value` part, we get a dimensionless floating-point number." - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "146.27533313607782 19.261909820533692\n", - "135.42163944306296 25.87738722767213\n", - "141.60264825107333 34.304830296257144\n", - "152.81671044675923 27.136112541397996\n" - ] - } - ], - "source": [ - "for point in corners_icrs:\n", - " print(point.ra.value, point.dec.value)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We can use string `format` to convert these numbers to strings." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['146.27533313607782, 19.261909820533692',\n", - " '135.42163944306296, 25.87738722767213',\n", - " '141.60264825107333, 34.304830296257144',\n", - " '152.81671044675923, 27.136112541397996']" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "point_base = \"{point.ra.value}, {point.dec.value}\"\n", - "\n", - "t = [point_base.format(point=point)\n", - " for point in corners_icrs]\n", - "t" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The result is a list of strings, which we can join into a single string using `join`." - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'146.27533313607782, 19.261909820533692, 135.42163944306296, 25.87738722767213, 141.60264825107333, 34.304830296257144, 152.81671044675923, 27.136112541397996'" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "point_list = ', '.join(t)\n", - "point_list" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Notice that we invoke `join` on a string and pass the list as an argument.\n", - "\n", - "Before we can assemble the query, we need `columns` again (as we saw in the previous notebook)." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "columns = 'source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here's the base for the query, with format specifiers for `columns` and `point_list`." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [], - "source": [ - "query_base = \"\"\"SELECT {columns}\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - " AND bp_rp BETWEEN -0.75 AND 2 \n", - " AND 1 = CONTAINS(POINT(ra, dec), \n", - " POLYGON({point_list}))\n", - "\"\"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "And here's the result:" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "SELECT source_id, ra, dec, pmra, pmdec, parallax, parallax_error, radial_velocity\n", - "FROM gaiadr2.gaia_source\n", - "WHERE parallax < 1\n", - " AND bp_rp BETWEEN -0.75 AND 2 \n", - " AND 1 = CONTAINS(POINT(ra, dec), \n", - " POLYGON(146.27533313607782, 19.261909820533692, 135.42163944306296, 25.87738722767213, 141.60264825107333, 34.304830296257144, 152.81671044675923, 27.136112541397996))\n", - "\n" - ] - } - ], - "source": [ - "query = query_base.format(columns=columns, \n", - " point_list=point_list)\n", - "print(query)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "As always, we should take a minute to proof-read the query before we launch it.\n", - "\n", - "The result will be bigger than our previous queries, so it will take a little longer." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "INFO: Query finished. [astroquery.utils.tap.core]\n", - "
    \n", - " name dtype unit description n_bad \n", - "--------------- ------- -------- ------------------------------------------------------------------ ------\n", - " source_id int64 Unique source identifier (unique within a particular Data Release) 0\n", - " ra float64 deg Right ascension 0\n", - " dec float64 deg Declination 0\n", - " pmra float64 mas / yr Proper motion in right ascension direction 0\n", - " pmdec float64 mas / yr Proper motion in declination direction 0\n", - " parallax float64 mas Parallax 0\n", - " parallax_error float64 mas Standard error of parallax 0\n", - "radial_velocity float64 km / s Radial velocity 139374\n", - "Jobid: 1601903357321O\n", - "Phase: COMPLETED\n", - "Owner: None\n", - "Output file: async_20201005090917.vot\n", - "Results: None\n" - ] - } - ], - "source": [ - "job = Gaia.launch_job_async(query)\n", - "print(job)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here are the results." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "140340" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "results = job.get_results()\n", - "len(results)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "There are more than 100,000 stars in this polygon, but that's a manageable size to work with." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Saving results\n", - "\n", - "This is the set of stars we'll work with in the next step. But since we have a substantial dataset now, this is a good time to save it.\n", - "\n", - "Storing the data in a file means we can shut down this notebook and pick up where we left off without running the previous query again.\n", - "\n", - "Astropy `Table` objects provide `write`, which writes the table to disk." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "filename = 'gd1_results.fits'\n", - "results.write(filename, overwrite=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Because the filename ends with `fits`, the table is written in the [FITS format](https://en.wikipedia.org/wiki/FITS), which preserves the metadata associated with the table.\n", - "\n", - "If the file already exists, the `overwrite` argument causes it to be overwritten.\n", - "\n", - "To see how big the file is, we can use `ls` with the `-lh` option, which prints information about the file including its size in human-readable form." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "-rw-rw-r-- 1 downey downey 8.6M Oct 5 09:09 gd1_results.fits\r\n" - ] - } - ], - "source": [ - "!ls -lh gd1_results.fits" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The file is about 8.6 MB." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Summary\n", - "\n", - "In this notebook, we composed more complex queries to select stars within a polygonal region of the sky. Then we downloaded the results and saved them in a FITS file.\n", - "\n", - "In the next notebook, we'll reload the data from this file and replicate the next step in the analysis, using proper motion to identify stars likely to be in GD-1." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Best practices\n", - "\n", - "* For measurements with units, use `Quantity` objects that represent units explicitly and check for errors.\n", - "\n", - "* Use the `format` function to compose queries; it is often faster and less error-prone.\n", - "\n", - "* Develop queries incrementally: start with something simple, test it, and add a little bit at a time.\n", - "\n", - "* Once you have a query working, save the data in a local file. If you shut down the notebook and come back to it later, you can reload the file; you don't have to run the query again." - ] - }, - { - "cell_type": "raw", - "metadata": {}, - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "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.8.5" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file diff --git a/_sources/last_resort.ipynb b/_sources/last_resort.ipynb index 7982d3c..05c6260 100644 --- a/_sources/last_resort.ipynb +++ b/_sources/last_resort.ipynb @@ -13,7 +13,7 @@ "source": [ "If you are not able to get everything installed that we need for the workshop, you have the option of running this notebook on Colab.\n", "\n", - "Before you get started, you probably want to press the Save button!" + "The following cell installs the libraries we need that are not already in the Colab runtime environment." ] }, { @@ -32,14 +32,21 @@ "IN_COLAB = 'google.colab' in sys.modules\n", "\n", "if IN_COLAB:\n", - " !pip install astroquery astro-gala pyia" + " !pip install astroquery astro-gala" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "That should be everything you need. Now you can type code and run it in the following cells." + "That should be everything you need. \n", + "\n", + "Before you get started, you probably want to press the Save button!\n", + "That will allow you to save your copy of this notebook in your Google Drive.\n", + "\n", + "If you don't save this notebook, any changes you make will be lost if you close the browser window or leave it idle too long.\n", + "\n", + "Now you can type code and run it in the following cells." ] }, { diff --git a/_sources/test_setup.ipynb b/_sources/test_setup.ipynb index f65a554..ece282a 100644 --- a/_sources/test_setup.ipynb +++ b/_sources/test_setup.ipynb @@ -6,16 +6,128 @@ "source": [ "# Data Carpentry Astronomy Workshop\n", "\n", - "This notebook imports the libraries we need for the workshop.\n", + "Please run this notebook before the workshop. There are three sections:\n", "\n", - "If any of them are missing, you'll get an error message.\n", + "1. A short introduction to Jupyter, with pointers to more resources.\n", + "\n", + "2. `import` statements to check whether you have everything installed that we need.\n", + "\n", + "3. A cell where you will paste a line of code you copy from Slack, to check for a potential problem with \"smart\" quotes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction to Jupyter\n", + "\n", + "This is a Jupyter notebook, which is a computational document that contains text, code, and results.\n", + "\n", + "There are several development environments you can use to work with notebooks. Currently the two most common are:\n", + "\n", + "* Jupyter Classic Notebook, and\n", + "\n", + "* JupyterLab, which is a newer environment with some improved features, but also some limitations. \n", + "\n", + "During the workshop, we will use the Classic Notebook environment. If you are new to Jupyter, we suggest you should, too.\n", + "\n", + "If you are familiar with JupyterLab and you would rather use it for the workshop, that's fine. Just be aware that there will be differences between your environment and ours.\n", + "\n", + "If you are new to Jupyter, you can [read about it here](https://jupyter.org/try) and follow the tutorial called \"Try Classic Notebook\".\n", + "\n", + "You also might like [this tutorial from DataQuest](https://www.dataquest.io/blog/jupyter-notebook-tutorial/).\n", + "\n", + "The following sections introduce the features you will need for the workshop." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Selecting and running cells\n", + "\n", + "Notebooks are divided into cells that contain either text or code.\n", + "\n", + "This cell is text; the following cell is code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "print('Hello')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To select a cell, click in the left margin next to the cell. You should see a blue frame surrounding the selected cell.\n", + "\n", + "To edit a code cell, click inside the cell. You should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", + "\n", + "To edit a text cell, double-click inside the cell. Again, you should see a green frame around the selected cell, and you should see a cursor inside the cell.\n", + "\n", + "Text cells use the Markdown typesetting language, which [you can read about here](https://www.markdownguide.org/).\n", + "\n", + "To run a cell, hold down Shift and press Enter.\n", + "\n", + "* If you run a text cell, Jupyter formats the text and displays the result.\n", + "\n", + "* If you run a code cell, Jupyter runs the code in the cell and displays the result, if any.\n", + "\n", + "To try it out, select the previous code cell and press Shift-Enter. It should run the code and print `Hello`.\n", + "\n", + "Then edit this cell, change some of the text, and press Shift-Enter to format it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Adding and removing cells\n", + "\n", + "You can add and remove cells from a notebook using the menu at the top of the page and the tool bar below the menu.\n", + "\n", + "Try the following exercises:\n", + "\n", + "1. From the Insert menu select \"Insert cell below\" to add a cell below this one. By default, you get a code cell, as you can see in the pull-down menu that says \"Code\".\n", + "\n", + "2. In the new cell, add a line of Python code and run it.\n", + "\n", + "3. Add another cell, select the new cell, and then click on the pull-down menu that says \"Code\". Select \"Markdown\". This makes the new cell a text cell.\n", + "\n", + "4. In the new cell, type some text and format it.\n", + "\n", + "5. Use the arrow buttons in the tool bar to move cells up and down.\n", + "\n", + "6. Use the cut, copy, and paste buttons to delete, add, and move cells.\n", + "\n", + "As you make changes, Jupyter saves your notebook automatically, but if you want to make sure, you can press the save button, which looks like a floppy disk from the 1990s.\n", + "\n", + "Finally, when you are done with a notebook, select \"Close and Halt\" from the File menu." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check your installation\n", + "\n", + "Run the following cells to import the libraries we need for the workshop.\n", + "\n", + "If any of the libraries are missing, you'll get an error message.\n", "\n", "If you don't get any error messages, you are all set." ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -24,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -32,9 +144,27 @@ "import numpy as np" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's make sure you have a recent version of Pandas.\n", + "\n", + "If the following cell causes an error, you probably have an old version of Pandas. Please update it before the workshop." + ] + }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pd.Series([0]).to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -46,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -57,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -66,26 +196,9 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: gea.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n", - "Created TAP+ (v1.2.1) - Connection:\n", - "\tHost: geadata.esac.esa.int\n", - "\tUse HTTPS: True\n", - "\tPort: 443\n", - "\tSSL Port: 443\n" - ] - } - ], + "outputs": [], "source": [ "# Note: running this import statement opens a connection\n", "# to a Gaia server, so it will fail if you are not connected\n", @@ -98,11 +211,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "## Check for code-pasting problems\n", + "\n", "During the workshop, we might put code on Slack and ask you to cut and paste it into the notebook.\n", "\n", "If you are on a Mac, you might encounter a problem with smart quotes.\n", "\n", - "To check, following this link to [our Slack workspace](https://app.slack.com/client/T01DJHEP8Q1/C01D2TZA8SH/details/pins) and find the pinned message with the setup instructions.\n", + "To check, following this link to [our Slack workspace](https://app.slack.com/client/T01GF8N96TD/C01G8AS0QBG/details/pins) and find the pinned message with the setup instructions.\n", "It contains a line of Python code.\n", "\n", "Copy the code from Slack and paste it in the cell below.\n", diff --git a/index.html b/index.html index 4b8337a..acf63cd 100644 --- a/index.html +++ b/index.html @@ -97,12 +97,12 @@