diff --git a/.github/workflows/make_html_from_notebook.yml b/.github/workflows/make_html_from_notebook.yml
index 05ff36f..61abc3a 100644
--- a/.github/workflows/make_html_from_notebook.yml
+++ b/.github/workflows/make_html_from_notebook.yml
@@ -4,21 +4,20 @@ on:
#push:
# paths: "**.ipynb"
# Trigger on PRs that change the notebooks in some way
- #pull_request:
- #branches: [main]
- #paths: "**.ipynb"
- pull_request_review:
- types: [submitted]
+ pull_request:
+ branches: [main]
+ paths: "**.ipynb"
+ #pull_request_review:
+ #types: [submitted]
jobs:
approved:
- if: github.event.review.state == 'APPROVED'
runs-on: ubuntu-latest
steps:
- run: echo "This PR was approved"
- name: Check out repository code
uses: actions/checkout@v4
with:
- #Only checksout the branch that is being merged into master
+ #Only checkout the branch that is being merged into main
ref: ${{ github.head_ref }}
- name: Getting only the changed Notebooks
# Gets only the changed files using an action from the marketplace
@@ -38,7 +37,7 @@ jobs:
jupyter nbconvert --to html ${notebooks[@]}
fi
- name: Push and commit new HTML files
- #Commits changes to the branch being merged into master
+ #Commits changes to the branch being merged into main
run: |
git config user.name github-actions
git config user.email github-actions@github.com
diff --git a/TimeSeriesAnalysisRrLyraeStar/TimeSeriesAnalysisOfRrLyraeStar.ipynb b/TimeSeriesAnalysisRrLyraeStar/TimeSeriesAnalysisOfRrLyraeStar.ipynb
index 7de3a39..ef6315b 100644
--- a/TimeSeriesAnalysisRrLyraeStar/TimeSeriesAnalysisOfRrLyraeStar.ipynb
+++ b/TimeSeriesAnalysisRrLyraeStar/TimeSeriesAnalysisOfRrLyraeStar.ipynb
@@ -1,928 +1,928 @@
-{
- "cells": [
- {
- "cell_type": "code",
- "execution_count": 1,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "__author__ = 'Robert Nikutta , Astro Data Lab Team '\n",
- "__version__ = '20230830' # yyyymmdd\n",
- "__datasets__ = ['smash_dr2']\n",
- "__keywords__ = ['science example', 'lightcurve', 'time-series', 'Lomb-Scargle', 'period', 'vospace:copy', 'RRLyrae']"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "# Time-series analysis of a RR Lyrae star\n",
- "*Robert Nikutta & the Astro Data Lab Team*"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "### Table of contents\n",
- "* [Imports & setup](#import)\n",
- "* [Authentication](#login)\n",
- "* [Query SMASH database for lightcurves](#querysmash)\n",
- "* [Convert result to a convenient format](#convert)\n",
- "* [Plot RA vs Dec](#scatterplot)\n",
- "* [Plot time series](#plottimeseries)\n",
- "* [Find period (Lomb-Scargle)](#lombscargle)\n",
- "* [Fold and plot lightcurve](#fold)\n",
- "* [Combine everything](#combine)\n",
- "* [Store data to local file](#storelocal)\n",
- "* [Copy data to your vospace](#copytovospace)\n",
- "* [Further ideas](#ideas)\n",
- "* [Resouces & references](#resources)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Goals\n",
- "* Query Data Lab for the time-series of a (known) variable star\n",
- "* Make simple diagnostic plots of the data\n",
- "* Find the variability period via Lomb-Scargle periodogram\n",
- "* Phase the time-series and plot the lightcurve\n",
- "* Combine the analysis steps into one routine\n",
- "* Store resulting data into local file\n",
- "* Copy data to the remote virtual storage space"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "# Summary\n",
- "We will study the variability of an astrophysical object as a function of time. In the Hydra II dwarf galaxy, one object is a RR Lyrae star. We will get the lightcurve for it from the SMASH survey's `source` table, and build the analysis step by step."
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "# Disclaimer & attribution\n",
- "If you use this notebook for your published science, please acknowledge the following:\n",
- "\n",
- "* Data Lab concept paper: Fitzpatrick et al., \"The NOAO Data Laboratory: a conceptual overview\", SPIE, 9149, 2014, http://dx.doi.org/10.1117/12.2057445\n",
- "\n",
- "* Data Lab disclaimer: https://datalab.noirlab.edu/disclaimers.php"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "\n",
- "# Imports and setup"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [],
- "source": [
- "# std lib\n",
- "from getpass import getpass\n",
- "\n",
- "# 3rd party\n",
- "import numpy as np\n",
- "import pylab as plt\n",
- "from astropy import stats, units as u\n",
- "from mpl_toolkits.axes_grid1.inset_locator import inset_axes, mark_inset\n",
- "from matplotlib.ticker import MaxNLocator\n",
- "%matplotlib inline\n",
- "\n",
- "# Data Lab\n",
- "from dl import authClient as ac, queryClient as qc, storeClient as sc\n",
- "from dl.helpers.utils import convert\n",
- "\n",
- "# plotting setup\n",
- "fontsize = 14\n",
- "plt.rcParams['font.size'] = fontsize\n",
- "plt.rcParams['axes.titlesize'] = fontsize"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "source": [
- "\n",
- "# Authentication\n",
- "Much of the functionality of Data Lab can be accessed without explicitly logging in (the service then uses an anonymous login). But some capacities, for instance saving the results of your queries to your virtual storage space, require a login (i.e. you will need a registered user account).\n",
- "\n",
- "If you need to log in to Data Lab, un-comment the cell below and execute it:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 3,
- "metadata": {
- "slideshow": {
- "slide_type": "skip"
- }
- },
- "outputs": [
- {
- "data": {
- "text/plain": [
- "'demo00'"
- ]
- },
- "execution_count": 3,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "#token = ac.login(input(\"Enter user name: (+ENTER) \"),getpass(\"Enter password: (+ENTER) \"))\n",
- "ac.whoAmI()"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {
- "slideshow": {
- "slide_type": "slide"
- }
- },
- "source": [
- "\n",
- "# Retrieve multi-band lightcurves of the star from the SMASH survey\n",
- "We retrieve all calibrated magnitudes of a specific object, for all bands, and all epochs, from the `source` table."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 4,
- "metadata": {
- "slideshow": {
- "slide_type": "-"
- }
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "CPU times: user 27.7 ms, sys: 2.79 ms, total: 30.5 ms\n",
- "Wall time: 114 ms\n"
- ]
- }
- ],
- "source": [
- "\n",
- "# Unique ID of a RR Lyrae star in Hydra II dwarf galaxy\n",
- "objID = '169.429960'\n",
- "\n",
- "# Select columns: RA, Dec, modified Julian date, calibrated mag, uncertainties, filter band\n",
- "# Note: this database table encodes 'no measurement' values as 99.99\n",
- "# Order the returned rows by ascending mod. Julian date\n",
- "query = \"\"\"SELECT id,ra,dec,mjd,cmag,cerr,filter\n",
- " FROM smash_dr2.source\n",
- " WHERE id='{:s}' AND cmag<99\n",
- " ORDER BY mjd ASC\"\"\".format(objID)\n",
- "result = qc.query(query) # by default the result is a CSV formatted string"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "# Convert result string to a convenient table format\n",
- "The returned query result is a long string. Let's convert it to a more practical format, e.g. a Pandas dataframe. A Data Lab helper function accomplishes this very easily."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 5,
- "metadata": {
- "scrolled": true
- },
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Number of rows: 2667\n",
- " id ra dec mjd cmag cerr filter\n",
- "0 169.42996 185.431155 -31.995327 56371.327538 21.433147 0.020651 g\n",
- "1 169.42996 185.431146 -31.995324 56371.328563 21.231598 0.022473 r\n",
- "2 169.42996 185.431139 -31.995320 56371.329582 21.149094 0.026192 i\n",
- "3 169.42996 185.431142 -31.995334 56371.330610 21.237938 0.045429 z\n",
- "4 169.42996 185.431145 -31.995325 56371.331633 21.346725 0.015112 g\n"
- ]
- }
- ],
- "source": [
- "df = convert(result,'pandas')\n",
- "print(\"Number of rows:\", df.size)\n",
- "print(df.head()) # print first few rows"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "The columns in the table can now be accessed by name, e.g.:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 6,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "0 185.431155\n",
- "1 185.431146\n",
- "2 185.431139\n",
- "Name: ra, dtype: float64"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df['ra'][:3] # print first 3 elements in the RA column"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "\n",
- "# Plot RA vs Dec\n",
- "We define a small plotting function. It can be re-used later."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 7,
- "metadata": {},
- "outputs": [],
- "source": [
- "def plot_scatter(x,y,ax=None):\n",
- " \n",
- " if ax is None:\n",
- " fig, ax = plt.subplots(figsize=(5,5))\n",
- " \n",
- " # apply units\n",
- " x = (x*u.deg).to('arcsec')\n",
- " y = (y*u.deg).to('arcsec')\n",
- " \n",
- " ax.plot(x-np.median(x),y-np.median(y),'bo',ms=3,alpha=0.6)\n",
- " ax.set_xlabel('RA offset ({:s})'.format(x.unit))\n",
- " ax.set_ylabel('DEC offset ({:s})'.format(y.unit))\n",
- " ax.axvline(0,c='0.5',lw=1)\n",
- " ax.axhline(0,c='0.5',lw=1)"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Plot the RA and Dec coordinates of all observations for our source. They scatter around a median position:"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 8,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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\n",
- "text/plain": [
- "