diff --git a/.renku/renku.ini b/.renku/renku.ini index a0e8998139d96dca274397fd372ada3aed0f175d..e6cfc17c826e4188540ffa9144e21914915dcce1 100644 --- a/.renku/renku.ini +++ b/.renku/renku.ini @@ -1,2 +1,10 @@ -[renku "interactive"] -default_url = /lab \ No newline at end of file +[interactive] +default_url = /lab +cpu_request = 2 +mem_request = 4G +disk_request = 64G + +[renku] +autocommit_lfs = true +lfs_threshold = 100kb + diff --git a/README.md b/README.md index 32f2cd91c591ff58d57ee79c77a11a0b05d57546..fb437c9a3dc863eca06609c6cf4cccc4cd05ec9b 100644 --- a/README.md +++ b/README.md @@ -1,38 +1,43 @@ -# course-materials +# Saas-Fee 2022 hand-on session materials -## Introduction +This repository will contain materials for Saas-Fee 2022 hands-on sessions. -This is a Renku project - basically a git repository with some -bells and whistles. You'll find we have already created some -useful things like `data` and `notebooks` directories and -a `Dockerfile`. +For now, feel free to [start a session](https://renkulab.io/projects/saasfee2022/course-materials/sessions/new?autostart=1), find the *Welcome.ipynb* notebook, and experiment with it: -## Working with the project +<img src="renku-saas-nb-tutorial.png"/> -The simplest way to start your project is right from the Renku -platform - just click on the `Environments` tab and start a new session. -This will start an interactive environment right in your browser. +## Using RenkuLab -To work with the project anywhere outside the Renku platform, -click the `Settings` tab where you will find the -git repo URLs - use `git` to clone the project on whichever machine you want. +Although it is possible to start a session for quick investigation without a `renku` account, it is advisable that your create one. +This way, you will be able to see list of your session (https://renkulab.io/sessions/) and even commit your work in your own fork of the course materials repository. -### Changing interactive environment dependencies +Please visit https://renkulab.io and create an account. You can also login with GitHub, ORCID, etc. -Initially we install a very minimal set of packages to keep the images small. -However, you can add python and conda packages in `requirements.txt` and -`environment.yml` to your heart's content. If you need more fine-grained -control over your environment, please see [the documentation](https://renku.readthedocs.io/en/latest/user/advanced_interfaces.html#dockerfile-modifications). +To start new session: -## Project configuration +https://renkulab.io/projects/saasfee2022/course-materials/sessions/new?autostart=1 -Project options can be found in `.renku/renku.ini`. In this -project there is currently only one option, which specifies -the default type of environment to open, in this case `/lab` for -JupyterLab. You may also choose `/tree` to get to the "classic" Jupyter -interface. -## Moving forward -Once you feel at home with your project, we recommend that you replace -this README file with your own project documentation! Happy data wrangling! \ No newline at end of file +## Offline container image (slow or unavailable network) + +### Preparation before the course + +You will recieve a container image on an USB stick, including all of the needed data and software for the course. + +As previously requested, every participant should have docker installed. +In addition, to avoid any dependency on the network, we ask everyone to download this small image in advance + +```bash +$ docker pull odahub/saasfee22-offline-bootstrap:latest +``` + +Also, please download this small test image and put it in the current directory (mouse right click and "save link as" or equivalent; take care that the file is saved with the original name - some browsers add an extra extension to it, like ".txt"): + +https://www.isdc.unige.ch/~savchenk/saasfee22-welcome-and-test.sif + +To test that you are able to use the image, run: + +```bash +$ docker run -it -v $PWD/saasfee22-welcome-and-test.sif:/image.sif -it --rm --privileged odahub/saasfee22-offline-bootstrap:latest +``` diff --git a/Welcome.ipynb b/Welcome.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..6b053b3621a714edbfa6669181ff680c4e5bc9a5 --- /dev/null +++ b/Welcome.ipynb @@ -0,0 +1,58 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "fccedb29-f64e-4301-96ce-8d2bfea21398", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-info\">\n", + " <h1>Welcome to Saas Fee 2022!</h1>\n", + " Course materials will appear in this repository.<br>\n", + " For now, you could try to run some simple <b>python</b> code.\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "6b11336a-9565-48c7-85da-a4e2d4876649", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1 + 1" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/courses/course-for-prof-Mandel/.metadata.yaml b/courses/course-for-prof-Mandel/.metadata.yaml new file mode 100644 index 0000000000000000000000000000000000000000..5dd922bd47dabcfede77bef4d86e55b0fdd95ec1 --- /dev/null +++ b/courses/course-for-prof-Mandel/.metadata.yaml @@ -0,0 +1,4 @@ +Responsible: https://renkulab.io/gitlab/floor.broekgaarden +Resources: + comment: + execution_time: diff --git a/courses/course-for-prof-Mandel/CHE_evolution_demo.ipynb b/courses/course-for-prof-Mandel/CHE_evolution_demo.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..bf9f125abc2336c307c93c1ce0b2e9eab93a691b --- /dev/null +++ b/courses/course-for-prof-Mandel/CHE_evolution_demo.ipynb @@ -0,0 +1,1148 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d69d65d0", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-info\">\n", + "\n", + " \n", + "# Saas Fee Gravitational Wave School: Formation channels of Gravitational Waves (GWs)\n", + " \n", + "In this jupyter notebook we will walk through and re-create some of the figures from https://arxiv.org/pdf/2010.00002.pdf on **Chemically Homogeneous Evolution** by Jeff Riley. A PDF of this paper can be found in the directory under the name CHE_paper.pdf. <br>\n", + "\n", + "\n", + "\n", + "Notebook by Floor Broekgaarden, Jeff Riley and Ilya Mandel <br>\n", + "<br>\n", + "\n", + "The original data can be found on Zenodo https://zenodo.org/record/5595426 <br>\n", + "For this tutorial we have downloaded COMPAS_Output.h5 from the auhtor's dataset and slightly reduced the datafile (removed the Common Envelope information) and rewritten the file to COMPAS_Output_reduced.h5. \n", + "\n", + "___\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "480b8a96", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + "\n", + "Throughout this notebook and in class we will use several acronyms and definitions listed below \n", + " \n", + " \n", + " \n", + "### Definitions: \n", + " \n", + " \n", + " - CHE: Chemically Homogeneous Evolution, \n", + " - GW: Gravitational Waves \n", + " - DCO: Double Compact Object \n", + " - BH: Black Hole\n", + " - NS: Neutron Star\n", + " - Primary: in this notebook always refers to the star that was most massive at the zero age main sequence (ZAMS)\n", + " - Secondary: in this notebook always refers to the star that was least massive at the zero age main sequence (ZAMS)\n", + " - ZAMS: Zero Age Main Sequence: this is in COMPAS where stars start their lives. \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ed54cf65", + "metadata": {}, + "outputs": [], + "source": [ + "# first we will import some of the packages that we will use \n", + "import h5py as h5\n", + "import numpy as np\n", + "import os\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# we will use astropy for some useful constants and units \n", + "from astropy import units as u\n", + "from astropy import constants as const\n", + "from matplotlib.ticker import (FormatStrFormatter,\n", + " AutoMinorLocator)\n", + "from IPython.display import Image # to open images in Ipython \n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "64224ff3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['DoubleCompactObjects', 'Supernovae', 'SystemParameters']" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "# add path to where the COMPASOutput.h5 file is stored. \n", + "# For you the part '/Volumes/Andromeda/SAAS-FEE_CHE/' is probably different\n", + "path = '../../data/COMPAS_Output_reduced.h5' # change this line! \n", + "\n", + "# the following line reads in the data \n", + "fdata = h5.File(path, 'r')\n", + "list(fdata.keys()) # print the different files within the hdf5 folder: \n", + "\n", + "\n", + "\n", + "# to close the file you will have to use fdata.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "8c1a0e92", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-success\"> \n", + "\n", + "\n", + "\n", + "the files above 'DoubleCompactObjects', 'Supernovae', 'SystemParameters' store the properties of the simulated binaries at the stages of the 'commen enevelope' (in case there is one), the moment of double object formation, the moment of the supernova, and the initial conditions (at the zero-age main sequence).\n", + "\n", + "#### We can view what parameters are stored by again using the command .keys()\n", + " \n", + " \n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "af4c3be7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Coalescence_Time', 'Eccentricity@DCO', 'MT_Case_1', 'MT_Case_2', 'Mass_1', 'Mass_2', 'Merges_Hubble_Time', 'Recycled_NS_1', 'Recycled_NS_2', 'SEED', 'Separation@DCO', 'Stellar_Type_1', 'Stellar_Type_2', 'Time']\n", + "\n", + "['CE_Alpha', 'CH_on_MS_1', 'CH_on_MS_2', 'Eccentricity@ZAMS', 'Equilibrated', 'Equilibrated_At_Birth', 'Error', 'Experienced_RLOF_1', 'Experienced_RLOF_2', 'Experienced_SN_Type_1', 'Experienced_SN_Type_2', 'LBV_Multiplier', 'LBV_Phase_Flag_1', 'LBV_Phase_Flag_2', 'Mass@ZAMS_1', 'Mass@ZAMS_2', 'Merger', 'Merger_At_Birth', 'Metallicity@ZAMS_1', 'Metallicity@ZAMS_2', 'Omega@ZAMS_1', 'Omega@ZAMS_2', 'SEED', 'SN_Kick_Magnitude_Random_Number_1', 'SN_Kick_Magnitude_Random_Number_2', 'SN_Kick_Mean_Anomaly_1', 'SN_Kick_Mean_Anomaly_2', 'SN_Kick_Phi_1', 'SN_Kick_Phi_2', 'SN_Kick_Theta_1', 'SN_Kick_Theta_2', 'Separation@ZAMS', 'Sigma_Kick_CCSN_BH', 'Sigma_Kick_CCSN_NS', 'Sigma_Kick_ECSN', 'Sigma_Kick_USSN', 'Stellar_Type@ZAMS_1', 'Stellar_Type@ZAMS_2', 'Stellar_Type_1', 'Stellar_Type_2', 'Time', 'Unbound', 'WR_Multiplier']\n", + "\n", + "['Applied_Kick_Velocity_SN', 'Drawn_Kick_Velocity_SN', 'Eccentricity', 'Eccentricity<SN', 'Experienced_RLOF_SN', 'Fallback_Fraction_SN', 'Hydrogen_Poor_SN', 'Hydrogen_Rich_SN', 'Kick_Velocity(uK)', 'Mass_CO_Core@CO_SN', 'Mass_CP', 'Mass_Core@CO_SN', 'Mass_He_Core@CO_SN', 'Mass_SN', 'Mass_Total@CO_SN', 'Orb_Velocity<SN', 'Runaway_CP', 'SEED', 'SN_Kick_Phi_SN', 'SN_Kick_Theta_SN', 'SN_Type_SN', 'Separation', 'Separation<SN', 'Stellar_Type_Prev_CP', 'Stellar_Type_Prev_SN', 'Stellar_Type_SN', 'Supernova_State', 'Systemic_Velocity', 'Time', 'True_Anomaly(psi)_SN', 'Unbound']\n" + ] + } + ], + "source": [ + "print(list(fdata['DoubleCompactObjects'].keys()))\n", + "\n", + "print()\n", + "\n", + "print(list(fdata['SystemParameters'].keys()))\n", + "\n", + "print()\n", + "\n", + "print(list(fdata['Supernovae'].keys()))" + ] + }, + { + "cell_type": "markdown", + "id": "81186863", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-success\"> \n", + "\n", + "#### The meaning of all parameters and files are described here https://compas.readthedocs.io/en/latest/pages/User%20guide/COMPAS%20output/standard-logfiles.html\n", + "\n", + "\n", + "Now that we have the data, we can do some data investigation. Here is an example of how to read the \"SEED\" parameter, which is a unique number for each binary that is run. \n", + " \n", + "<div>" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b83022e4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 400047 400065 400101 ... 11599854 11599926 11599965]\n" + ] + } + ], + "source": [ + "SEED_DCO = fdata['DoubleCompactObjects'][\"SEED\"][...].squeeze()\n", + "print(SEED_DCO)" + ] + }, + { + "cell_type": "markdown", + "id": "30966640", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + "\n", + "## Question 1\n", + "#### - a: check and write down the number of rows (entries) of each of the dataset groups, 'DoubleCompactObjects', 'Supernovae', 'SystemParameters'. <br>\n", + " \n", + "#### - b: If the lengths of the rows are different why is this so? And does it make sense which group has the most/least rows? <br>\n", + "\n", + "*Hint*: you might want to look at table 1 in the paper CHE_paper.pdf and the descriptions at https://compas.readthedocs.io/en/latest/pages/User%20guide/COMPAS%20output/standard-logfiles.html\n", + " \n", + "#### - c: Why is the number of rows in 'DoubleCompactObjects' not the same as the total number of 'BBHs formed' in Table 1 from this paper?" + ] + }, + { + "cell_type": "markdown", + "id": "96e2bf75", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\"> \n", + "\n", + "# Answer 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29489b28", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a01f693e", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e4cc16c7", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5ffcb1f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97c05125", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "d051687d", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + "\n", + " \n", + "## Example 1: plotting BH masses \n", + "___\n", + "below we show an example of how to obtain and plot the compact object masses in the dataset \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "d142978f", + "metadata": {}, + "outputs": [], + "source": [ + "# this is just a little function that we will use to make the plot more beautiful (bigger ticks, labels)\n", + "# However, you do not have to use this (just uncommoment \"layoutAxes\" everywhere)\n", + "\n", + "def layoutAxes(ax, nameX='', nameY='', \\\n", + " labelSizeMajor = 10, fontsize = 25, second=False, labelpad=None, setMinor=True):\n", + " \"\"\"\n", + " Tiny code to do the layout for axes in matplotlib\n", + " \"\"\"\n", + " tickLengthMajor = 10\n", + " tickLengthMinor = 5\n", + " tickWidthMajor = 1.5\n", + " tickWidthMinor = 1.5\n", + " \n", + " #rc('axes', linewidth=2)\n", + " #label1 always refers to first axis not the twin \n", + " if not second:\n", + " for tick in ax.xaxis.get_major_ticks():\n", + " tick.label1.set_fontsize(fontsize)\n", + " #tick.label1.set_fontweight('bold')\n", + " for tick in ax.yaxis.get_major_ticks():\n", + " tick.label1.set_fontsize(fontsize)\n", + " #tick.label1.set_fontweight('bold')\n", + " if second:\n", + " for tick in ax.xaxis.get_major_ticks():\n", + " tick.label2.set_fontsize(fontsize)\n", + " #tick.label1.set_fontweight('bold')\n", + " for tick in ax.yaxis.get_major_ticks():\n", + " tick.label2.set_fontsize(fontsize)\n", + " #tick.label1.set_fontweight('bold')\n", + " for axis in ['top','bottom','left','right']:\n", + " ax.spines[axis].set_linewidth(1.2)\n", + " ax.tick_params(length=tickLengthMajor, width=tickWidthMajor, which='major')\n", + " ax.tick_params(length=tickLengthMinor, width=tickWidthMinor, which='minor')\n", + " ax.set_xlabel(nameX, fontsize=fontsize,labelpad=labelpad)#,fontweight='bold')\n", + " ax.set_ylabel(nameY, fontsize=fontsize,labelpad=labelpad)#, fontweight='bold') \n", + " \n", + " if setMinor==True:\n", + " # add minor ticks:\n", + " ax.xaxis.set_minor_locator(AutoMinorLocator())\n", + " ax.yaxis.set_minor_locator(AutoMinorLocator())\n", + "\n", + " return ax\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "869c90d1", + "metadata": {}, + "outputs": [], + "source": [ + "fDCO = fdata['DoubleCompactObjects']\n", + "\n", + "\n", + "M1 = fDCO['Mass_1'][...].squeeze() # mass in Msun of the compact object resulting from the *primary star*\n", + "M2 = fDCO['Mass_2'][...].squeeze() # mass in Msun of the compact object resulting from the *secondary star*\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ff02ea16", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 720x720 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "f, ax= plt.subplots(1, 1, figsize=(10,10)) \n", + "\n", + "plt.scatter(M1, M2)\n", + "plt.xlabel('Mass of compact object from primary star [Msun]', fontsize=20)\n", + "plt.ylabel('Mass of compact object from secondary star [Msun]', fontsize=20)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "0db7f21e", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + "\n", + "### Question 2: \n", + " \n", + " - a): can you explain some of the features in the plot above? E.g., where are the gaps, where are the most datapoints?\n", + " \n", + " \n", + " - b): Are there any BH+NS or NS+NS in the dataset? If so, plot them\n", + " \n", + " \n", + " - c): extra: how many BH+NS, vs. NS+NS vs. BH-BH systems are there? And what is the total? \n", + "\n", + "*Hint*: A NS in this COMPAS simulation is defined as a compact object with mass < 2.5 Msun \n", + " \n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "51727576", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\"> \n", + "\n", + "# Answer 2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "42a75636", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "48bd18ce", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f1181d94", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a252ea2", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dc00bc37", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9f09ef6", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d3421fd", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "131d98f5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ad78bc31", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "c850bd60", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + " \n", + "### Question 3: \n", + " \n", + " \n", + " - a): Using the parameters in the 'DoubleCompactObjects' dataset and the example above, try to make a scatter plot of Total Mass (M1+M2) versus orbital Period of the BBH systems that merge within a Hubble time (13.7 Gyr) \n", + " \n", + " Plot the period on the y-axis and the total mass on the x-axis. Plot the period in days. \n", + " \n", + "*Hint: You might want to use Kerpler's III law to complete the function below *\n", + " \n", + " \n", + "*Hint:* you will have to select BH+BH systems, and only systems that merge within a Hubble time " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2a2e21da", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "def separation_to_period_circular_case(separation=10*u.AU, M1=1*u.M_sun, M2=1*u.M_sun):\n", + " \"\"\"calculate Period from separation\n", + " separation is separation of the binary (needs to be given in astropy units)\n", + " M1 and M2 are masses of the binary\n", + " This is based on Kepler's law, using a circular orbit\n", + " \n", + " \"\"\"\n", + " G = const.G # [g cm s^2]\n", + " \n", + " ## use Kepler;s III law to calculate the period here \n", + " \n", + " \n", + " \n", + " ###\n", + " \n", + " return period\n" + ] + }, + { + "cell_type": "markdown", + "id": "30ad2751", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\"> \n", + "\n", + "# Answer 3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6f3c8674", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ecec29a5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "62cc5edc", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b23ac61", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "201763f3", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + " \n", + "## Question 4: \n", + " \n", + " \n", + " - a): Why does the plot that you created look different compared to the figure 6 in https://arxiv.org/pdf/2010.00002.pdf? (you may ignore the metallicity axes) \n", + " \n", + " \n", + " \n", + " - b): There is a tail of systems at rather large orbital periods that are merging. How is this possible? \n", + "\n", + "*Hint 4b: plot the eccentricity as a color gradient on the marker using the \"c=\" option of plt.scatter. \n", + "How is eccentricity imparted to these systems?* " + ] + }, + { + "cell_type": "markdown", + "id": "c3322c83", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\"> \n", + "\n", + "# Answer 4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3fba311f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "0e08bfed", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-success\"> \n", + " \n", + "## Selecting CHE binaries: \n", + " \n", + " \n", + " For binaries, Stellar_Type@ZAMS(1) and Stellar_Type@ZAMS(2) will tell you the initial stellar type of each star - type 16 is CH.\n", + "CH_on_MS(1) and CH_on_MS(2) are each true if the star remained as CH for the entire MS - they will be false if the star spun down and stopped being CH on the MS. So any star that was initially CH, and stayed CH on the entire MS is considered to be CHE. We can check which of our binary black holes is a \"CHE\" by using this information stored in the 'systemParameters' file, and matching it with the double compact object files using the randomSeed.\n", + "\n", + "Note that we also have to remove binaries that merged on the ZAMS as stars, since we are not interested in these\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "714118e5", + "metadata": {}, + "outputs": [], + "source": [ + "fsys = fdata['SystemParameters']\n", + "\n", + "CH_on_MS_1 = fsys['CH_on_MS_1'][...].squeeze() # mass in Msun of the compact object resulting from the primary\n", + "CH_on_MS_2 = fsys['CH_on_MS_2'][...].squeeze() # mass in Msun of the compact object resulting from the secondary\n", + "Stellar_TypeZAMS_1 = fsys['Stellar_Type@ZAMS_1'][...].squeeze() # mass in Msun of the compact object resulting from the primary\n", + "Stellar_TypeZAMS_2 = fsys['Stellar_Type@ZAMS_2'][...].squeeze() # mass in Msun of the compact object resulting from the secondary\n", + "\n", + "# binaries that merge at birth as stars\n", + "Merger_At_Birth = fsys['Merger_At_Birth'][...].squeeze()\n", + "\n", + "# SEED of the system Parameters (unique number corresponding to each binary)\n", + "SEED = fsys['SEED'][...].squeeze() # mass in Msun of the compact object resulting from the secondary\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "99057a0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "13644 are CHE out of 12000000 systems run\n", + "[ 400378 400412 402049 ... 11589507 11589863 11594670]\n" + ] + } + ], + "source": [ + "\n", + "# the CHE systems are then selected by systems that are CHE on ZAMS (stellar type 16) AND remain CHE on the MS (main sequence)\n", + "# in addition we do not want systems that Merged at Birth \n", + "mask_CHE = (CH_on_MS_1==1) & (CH_on_MS_2==1) & (Stellar_TypeZAMS_1==16) & (Stellar_TypeZAMS_2==16) & (Merger_At_Birth==0)\n", + "\n", + "print(np.sum(mask_CHE), 'are CHE out of ', len(mask_CHE), 'systems run')\n", + "\n", + "\n", + "# let's find the seed of the CHE systems: \n", + "SEED_CHE = SEED[mask_CHE]\n", + "print(SEED_CHE)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "3c8919d0", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-success\"> \n", + " \n", + "We find 13644 total CHE binaries in our simulation, note that this is the same as the number quoted in the CHE paper under \"Both stars remained on the CH\" and \"Total\" in Table 1\n", + " \n" + ] + }, + { + "cell_type": "markdown", + "id": "f2115984", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + " \n", + "## Question 5: \n", + " \n", + " - a): Using the code above, recreate figure 6 in https://arxiv.org/pdf/2010.00002.pdf? (you may ignore the metallicity axes) \n", + " \n", + " - b): Explain what you see \n", + " \n", + "#### Hint: A useful line of code is: np.in1d(), below is an example of how it works" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6ba613a0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ True False True]\n" + ] + } + ], + "source": [ + "# example of np.in1d() function\n", + "\n", + "A = [1,2,3]\n", + "B = [1,3,5,7,9]\n", + "\n", + "print(np.in1d(A, B))" + ] + }, + { + "cell_type": "markdown", + "id": "4405bc29", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\"> \n", + "\n", + "# Answer 5" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2724ab2d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "27f0c3e5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b5cb307", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0bb15a45", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "a25df87b", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + " \n", + "## Question 6: \n", + " \n", + " - a): Try to recreeat the figure 4 in https://arxiv.org/pdf/2010.00002.pdf? \n", + " \n", + " \n", + " - b): Explain what you see " + ] + }, + { + "cell_type": "markdown", + "id": "0175ec47", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\"> \n", + "\n", + "# Answer 6" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a7c16f01", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f745cda9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7cca1041", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "544dc9c9", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + "\n", + " \n", + "For the last part of this excersize we will use the code 'FastCosmicIntegrator'. Our goal will be to calculate the merger rate for BBHs, so that we can compare to the analytical estimate we made earlier on. \n", + "\n", + "## Question 7: \n", + " \n", + " \n", + "Using the code below, plot the merger rate of CHE BBHs as a function of redshift. You should at the end of running this code create a plot with four panels that show the properties of the CHE binaries \n", + " \n", + " - a) what do the panels show? What are the differences between the panels? \n", + " - b): please write down the local (z=0) BBH merger rate, and compare this with your analytically calculated rate \n", + " - c): compare both rates with the other BBH rates as reported in Mandel & Broekgaarden et al. (2021) (Fig 3)\n", + "\n", + " \n", + " - d): Repeat the excersize above, and answer 7a & 7b above, but now for all BBHs (including non CHE). You can do this by changing dco_type to 'BBH'. What are the differences\n", + "\n", + " \n", + " \n", + " *Hint* we can do an approximate calculation by combining the Wolf Rayet factors. If you want to do the more expert version you can modify the code in ClassCOMPAS (setCOMPASDCOmask) and add the mask of a specific f_WR factor" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "681a2767", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "FastCosmicIntegration.py:746: UserWarning: Maximum chirp mass used for detectability calculation is below maximum binary chirp mass * (1+maximum redshift for detectability calculation)\n", + " detection_rate, formation_rate, merger_rate, redshifts, COMPAS = find_detection_rate(args.path, dco_type=args.dco_type, weight_column=args.weight_column,\n", + "Average_SF_mass_needed = 1220730153.620652 solMass\n", + "Figure(2000x2000)\n", + "CI took 13.712784051895142 s\n", + "plot took 2.9398140907287598 s\n" + ] + } + ], + "source": [ + "!python3 FastCosmicIntegration.py \\\n", + "--dco_type 'CHE_BBH' \\\n", + "--path '../../data/COMPAS_Output_reduced.h5' \\\n", + "--maxz 15 \\\n", + "--dontAppend" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "285095f6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CHE_evolution_demo.ipynb\r\n", + "CHE_evolution_demo_ANSWERS.ipynb\r\n", + "CHE_paper.pdf\r\n", + "COMPAS_Documentation.pdf\r\n", + "ClassCOMPAS.py\r\n", + "FastCosmicIntegration.py\r\n", + "GWTC-3-catalog.pdf\r\n", + "GWTC-3-population.pdf\r\n", + "MandelBroekgaarden.pdf\r\n", + "Rate_Infomu00.035_muz-0.23_alpha0.0_sigma00.39_sigmaz0.0.png\r\n", + "SNR_Grid_IMRPhenomPv2_FD_all_noise.hdf5\r\n", + "\u001b[34m__pycache__\u001b[m\u001b[m\r\n", + "selection_effects.py\r\n", + "test.py\r\n", + "test2.py\r\n", + "totalMassEvolvedPerZ.py\r\n" + ] + } + ], + "source": [ + "!ls " + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "0b87ce45", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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Bu7du4fWrVsjOjoav/32Gz799FP8/fffiI6ORnR0tDSW0aNHQ09PT3oeY2NjeHh4YOjQofjrr78QGhqK8ePHQyQS4ejRo7h58yYcHR1x5swZmJubV+wPUYnyiFE2+aTMp59+iujoaKxduxa9e/fGtGnT4OzsjGfPnmH37t1IS0vD4sWLsXjxYoXzmzdvDk1NTURHR6NDhw4YPnw42rdvD1tbW7x58wYXLlyQlujr0KEDjh8/Lvj3yNeiRQtcu3YN/v7+aNasGdzc3NCqVSsAb/dw+uOPP5CamorGjRvjxIkTsLOzK/HPk4iIiIiIiIiIiKi2EkmK+gtxLZSdnQ0PDw94eHjgzp07CA4ORkZGBoyMjNCsWTMMHz4c06dPh6mpqdJzJCUlYdOmTThx4gSCg4Ohp6eHVq1aYfr06fjwww+LjSEyMhIbNmyAh4cHIiIiYGRkhI4dO2LOnDkYOHBgmT5XcnIyjI2NkZSUBCMjozKdo7w5ODggJCREYZ9EIkFwcDAcHR0V9vfs2RNXr17F/v37MWXKFIVjVq1aJbfaJicnB5s3b4a7uzsCAgKgq6uLdu3aYdGiRRg8eDB69eolVxotLCxM4UqatLQ07Ny5E0eOHJHu39OgQQOMHTsWc+fOrRI/53eJMTw8HCNGjEBoaCh+/vln6X5Iynh5eWH79u24ceMGYmNjYW5ujs6dO2PWrFno3bt3kXOjoqJw4sQJXLp0CU+ePEFkZCQyMjKgp6cHGxsbtGvXDuPGjcOIESOgpqZ8IWVQUBCOHz8OT09PPHnyBDExMRCLxTAzM0Pbtm0xatQoTJw4Edra2kXGQ0RERNVfVfz+S1Ubf2eIiIiIqLYp6XdgJpJqCd4UEREREVFtwu+/VFr8nSEiIiKi2qak34G5RxIREREREREREREREREpxEQSERERERERERERERERKcREEhERERERERERERERESnERBIREREREREREREREREpxEQSERERERERERERERERKcREEhERERERERERERERESnERBIREREREREREREREREpxEQSERERERERERERERERKcREEhERERERERERERERESnERBJRLeXl5YUJEybA3t4eOjo6sLOzw/vvv4+rV6+Wy/lTUlLwxx9/4IMPPkCjRo2gr68vvc57772HgwcPIicnp9jzBAcHY+fOnRg7diyaNGkC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bS12OqTFui4/hMyCUsXxusk9ENzGScSMSN+di8nESz+cEsR+ndYbfVo6iJQRERHpA334+7c+z0zUePrwb0YfDPj8KB6kFyiOV/2jE8Z29xQxIyLtMWXdORy5lao47u5th23/elbEjIiISNfV9W9grVyRpCwhIQEymazWa2QyGRISEpooIyL9VFBSLigiAWxtR5rX3dsOfk6WgjYmv56NYyGJiIioDjIzM1FcXAxXV1fFat6///4bJ06cULm2U6dOGDJkSFOnSFRnJeUViM0UttrmiiSiJ/7RzUNQSDofm4Wbyblo58riNxERaZZOFJI8PDwQHh6O5cuXV1tQKiwsRHh4ODw8uJyXqDESs4tUYmxtR5omkUgwrocnPtpzUxHbf+0hMgtKYW/Bft9EREQ1yczMhK+vL7p164a//vpLET906BBCQ0Oh3HzCxsYG9+/fh729fVOnSlQnMemFqKgU/rvlHklETzzf3hlOVmZIzStRxDadjsXHL/qLmBURERkCqdgJ1MXUqVPx4MEDBAQE4M8//0RGRgYAICMjAzt27EDfvn0RExODadOmiZwpkW5LyBLO/nO0NIPMxEikbMiQjOnqAVOjJ7+SSisq8cdFrjIlIiKqzcaNG5GXl4dVq1ZVe37t2rWK15dffomcnBxs2rSpibMkqru7qXmCYxdrGaxkJiJlQ6R9TIykGNfTSxDbcSkRecVlImVERESGQidWJM2fPx937tzB2rVrMXr0aACAVCpFZeWjDQblcjkmT56M+fPni5kmkc5LyBKuSOJqJGoqdhamGOrvgj8vJyliv56Nw+t9Wyja9BAREZHQ3r170a5dO3Tr1q3a8xMnThQcb9myBXv27MHbb7/dFOkR1VvVVscAVyMRVWd8T098F3FPsXqvoLQCOy4l4rU+PuImRkREek0nViRJpVKEhYUhIiICEydORJcuXeDj44MuXbpg0qRJiIiIQFhYGD9sJGqkRKVCkjsLSdSExivNrLufVoBzMVkiZUNERKT9rl69imefrfsm68888wyuXr2qwYyIGueuUiGplTMLSUTKXG2aYWA7J0Fs0+k4lXamRERE6iTaiqSG/IILCgpCUFCQBrIhIoArkkhcvVrYw9fRAg/SCxSxX8/GoWcL7uNARERUnYyMDDg5OanEAwMDsWjRIpW4k5MTMjMzmyI1oga5l6JUSHKyEikT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02s/7qislVUYuvmDXzX9xjPVKynWwnQA4HliYmL02GOP6e9//7tee+01TZkyRWeddZYGDhyoBx54QOeff77VEdEA7cs9qvTD5gvZBrfnghAA3ulPvVqYGkkH8ou1Iu2w+iU3tjAVAHgXt01tVxcRERFq1aqV1TEAj7TbYSDXimklAHio/zu/vcb2Nb+eHy2r0LXTVmrjvnyLUgGAZwsPD9f999+vtLQ0vfrqq9qzZ48uvPBC9ejRQ5988gnrIqFerTphYfpjhnVsYkESADh9fZMbKzzI31T7/NcMi9IAgHdyWyOprKysVncjSdLIkSOVlpbmpkSAd3NcI4k7kgB4KpvNpidHdtGl3Zub6gXF5frLOyu081ChRckAwPMFBQXplltu0bZt2zRhwgStWbNGY8aMUWpqqtXR0ICsTDts2h7aIUF+fkwBBcA7+fvZNH5Aa1Pt818zdKS03JpAAOCF3NZI8vf3r1LLzs7WL7/8onnz5umXX35Rdna2u3484FPKK+zKyOGOJADew8/Ppheu7K4hHRJM9azCUo17a4X2ONxlCQA4buXKlbr88sv13HPPyWazyTAM7dy5U3a73epoaCBW7jI3knq3ZmpaAN7tz31aVqnN33TQgiQA4J3qZWq79957Tz179lRCQoL69++vCy64QP3791dCQoJ69uyp999/vz5iAF5rf16xyirM05kkxdJIAuDZAv39NHVsT/VtY/7waV9esca8tVz7co9alAwAPNOCBQs0bNgw9evXT998843sdrsMw1BMTIwefvhh+fl51Mzk8FFFJeXakllgqvVpHWNRGgBwjaTG4WoSFWyq/biZRhIA1JRbRyJFRUW68MILdf3112vNmjUyDKPK15o1a3Tdddfpwgsv1JEjXJ0MOJOWVWTajgwOUGx4kEVpAKDmQgL99db43urWItpU33P4qMa8uVwH8ootSgYAnuPrr79Wv379dN5552nhwoWVY6XExEQ9//zzSk9P1+OPP251TDQQG/bl68QluQL8bOqSGF39CQDgJW44u41p+4vVe3Uwn/EIANSEWxtJV199tebMmSPDMBQaGqq+ffvq8ssv17hx43T55Zerb9++CgsLk2EY+u9//6urr77anXEAr+XYSGoTHy6bjTnKAXiHyJBAvXfdmerQNNJU35V9RGPeWq6DBQzeADQ8drtd06dPV9euXTV6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Tb///rt+//13NWrUSHfffXddfj0AAAAAtcSYyYwxEwDUPxpJAACP0bp1a+3evVtJSUnatWuX02O2bNmiAQMG6PDhwwoICNDy5cvVq1ev+g36P4899pgef/xxSa4bFB3z448/avDgwZLqPiiSpOuuu06fffaZ7rnnHj355JNOj9m0aZM6d+4swzA0c+ZMjR49unLf1KlTddtttyktLU2PPfaY3nvvvZP+/wEAAADgPoyZjmPMBAD1h6ntAABepX379rr//vslSeXl5XrhhRcsTuTZpk2bpsLCwmoHRJK0YMGCykHd0KFDTfvGjx+vdevWKTEx0a05AQAAALgGY6baYcwEAKcWYHUAAABq69hVZ5K0aNEiC5P4huzs7Mrvo6OjTfvCw8PVpUuX+o4EAAAA4DQwZnItxkwAGjruSAIAeJ1jc1hL0sGDBy1M4hvsdrvVEQAAAAC4EGMm12LMBKCho5EEAPA6RUVFld9HRERUe1xhYaEmT56svn37KiYmRsHBwUpMTNTIkSP1ySefnHIwUFRUpMcee0xdunRRWFiYYmNjNWDAAL3++us1Hkjs2bNH99xzj7p06aKIiAgFBQWpRYsWuuiii/Tiiy8qIyOjRo+Tm5ur//u//1O7du0UEhKi+Ph4jR49WmvWrHF6/KBBg2Sz2UxfjnN0t27dWjabrXLOcklVzjnxsd577z1J0u7du6scd+2119bo9wAAAADgfoyZGDMBgCsxtR0AwOv8+uuvld/37dvX6TG//fabLrnkEu3bt09nnXWWHn30UUVFRWnLli1655139M033+g///mPZs6cqZiYmCrnp6ena+jQodq+fbvi4uJ05513KjU1Vfv379eLL76oWbNmqUePHifNuWTJEl144YU6cuSIRo0apRtuuEERERHavn27pk2bpu+//1733Xefli5dWu3vIUmZmZnq27ev+vXrpwkTJqioqEjTp0/Xl19+qblz52rJkiU644wzTOc89NBDuvHGG7V48WK98cYbTh/3xRdfVGFhob744gt9+eWXkqQPPvigynHHHuuNN97Q4sWLFRcXpylTppiOadu27UmfCwAAAAD1hzETYyYAcCkDAAAPkZSUZEgykpKSqj3m6NGjRteuXQ1Jhs1mMxYsWFDlmLS0NCMmJsaQZNx9991V9u/bt89o3bq1Icm44IILDLvdbtpfWlpqdOvW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cezm8QAAAAAKx6aNpBvq1KlT6htGliQkJGjTpk2SpJdffjnPsSNGjNCLL76oCRMmyMXFRQcPHtS0adPUr18//ec//9GqVavyXPkEALg9aRlZmrT2qFnNp4KzXnikYFvwAABgC2PHjlXv3r01fPhw+fj45GvOokWL1L9/f2VlZRVxur81b95chw8fzvX46tWr9dprr0mSvv/+e9WoUUPSXyuLJCkoKEj169fX77//rj179mjgwIE5zpGVlaX9+/dLksLCwqz8DgAAAICyxyaNpOjoaFWpUiVfW7kNGTJELi4uGjx4sJo1a2aDdLbz/vvv6/r163r88cfVo0cPi2MqVqyoTp06ac6cOfLz+/v+G/fee6+eeOIJPfDAA9q6dat69uypH3/8Mddrpaenm+0LnpycbL03AgBlwKc/nVbMpWtmtVc615eXa3k7JQIAIHf333+/pk2bpoceekgvvviiunTpku+Gki25u7vrrrvuyvX4nj17sp/XrVtXgYGBOcYMGTJEL730klatWqWZM2fKwcF8x/aNGzcqJSVFLi4uevLJJ62WHQAAACirbHKPpKCgIK1cuTJfY3/++WfNnj1b999/v3bu3FnEyWxn69atev/991W3bl3NnTs313F33323vv/+e7Mm0g1eXl6aMmWKJGnz5s1av359rueZMmWKvLy8sh/cNBYA8u9sQqo+/fm0Wa15oLceb1q4e+gBAFDUatWqpXHjxikmJkZPP/20qlWrpsqVKyswMFC1atWy+CjMPYqKg+eff15169ZVXFycPvnkE7NjGRkZeuONNyRJ48aNK/T9bwEAAAD8zSYrkm7e5/pW1q9fr927d2v06NGaOHGifvjhhyJMZhu///67unfvrho1amjTpk3Z2zIUxiOPPCJHR0dlZWVp7dq16tixo8Vx48ePN/tgmJycTDMJAPJp8ne/6XqmMfu1o4NBk7veJYPBYMdUAADkztL9gi5fvqzLly/nOa84/NuWmpqqyMhISVJcXFx2/cSJE7py5Yokma1icnZ2Vnh4uNq1a6fRo0crPj5eXbp00eXLlzVt2jTt3r1bffv21euvv27bNwIAAACUUna5R1Jeateurdq1aysuLk7vvfeevePctuPHj6tdu3Zyd3fXjz/+eNvNHFdXV1WpUkV//vln9octS5ydnS3evBYAkLdNv53Xj7/Hm9X6twxQ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tm2bNeMVuejo6OznVapUyXXcjWOXL19Wamqq3N3dCzU/JibmtvICQFE4c+GKVh+IM6sNeCBAFd2c7JQIAICyISkpSU8++aTWr18vSTKZTDIYDDLdtNfswoULtWDBAnXs2FHffPONvLy87BUXAAAAQAlh9a3tfvzxR7Vr1y7HsWHDhunJJ5/M97kWLVpU4hpJKSkp2c9dXFxyHXfzseTk5OxGUkHnJycn5zomPT1d6enpZtcBAFv4JMJ8NZKbk6Oebl3wLU4BAED+mUwmde/eXT/99FN248jd3V1Xr141G/fll19qzpw5WrdunR599FH9/PPPJW4nCAAAAAC25WDNk3l5eal79+6qWLGiVc538zfnSpOb31dhPrTdmJ/X3ClTpsjLyyv7UbNmzYIHBYACirqYqtUHzO+N1L9loCq5sxoJAICitHTpUkVERCggIECLFy9WYmKiIiMjc3ymeuqpp7R161a98sor2r59uxYuXGinxAAAAABKCqs2knJjNBoLtBpJkvr27Suj0VhEiYqGh4dH9vO0tLRcx928UujmOQWdf/P4fxo/frySkpKyH2yDB8AWZkWcUtZNy5FcyztqaBvujQQAQFH75ptv5OPjo507d+r//u//5OnpmecXz9566y3dc889NJIAAAAA3JJNGknR0dG6du1avsYOGTJEzz//vPbv31/EqazP398/+/mFCxdyHXfjmLe3d/a2doWZn9cqI2dnZ3l6epo9AKAoRSdc1Yr95vdG6t8yQJUrONspEQAAZceePXs0ePBgVatWLd9zunbtqgMHDhRdKAAAAAClgk0aSUFBQVq5cmW+xv7888+aPXu27rvvPu3cubOIk1lX48aNs59HRUXlOu7GsZvHW2M+ANjTP1cjuZR30JA23BsJAABbuHjxourVq1egOdWrV1diYmLRBAIAAABQatikkVSQex2tX78+e4hkPe8AALeKSURBVFuGiRMnFl2oIhAUFKT69etL+usbgZZkZWVlr7YKCwszO9aqVSt5eXnlOT8+Pl7R0dEW5wOAvcRcuqrl+2LNav3uC1AVD1YjAQBgC25ubkpOTi7QnMjIyDy3ywYAAAAAyUaNpIKoXbu2evfurRdffFEHDx60d5wCGzJkiCRp1apVFu/xtHHjRqWkpMjFxSXHfaOcnJz01FNPSZKWL19u8fwrVqyQJFWrVk1dunSx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d911lwYOHKhZs2apY8eO1o55SzeaPN99950efPDB7Hrz5s3Vo0cPPfroo1q7dq0GDRqkDh06yNXVNXtMenq6unTpopiYGE2fPl2jRo3KPhYaGqpWrVpp0aJFCg4O1oQJE2z2ngAAAIDSyiZfI/f09NTFixcLNCchIUEeHh5FlAgAUBBRF1MVfuicWW3QA4FydcrfSlMAAGAdISEhqlq1ao76tm3b1LRp0wKd6+6779bevXutFa1A/Pz89Oijj5o1kW7Wr18/SVJiYqKOHDliduyTTz7R8ePHVaNGDY0YMcLsmJOTkyZPnixJevfdd3XunPnvLwAAAAAKziaNpAYNGmjRokX53logKytL33zzjcVv2gEAbO8/W87IaPr7tbuTo/q3DLRbHgAAYO7ChQtKTk4u0JyUlBRdunSpiBLl7a233tKaNWtyPe7s7Jz9/J9fMJw7d64kqVu3bha3T2/fvr08PDx07do1LVq0yEqJAQAAgLLLJo2kbt266fDhw3ryySeVmJiY59ikpCT169dPhw8f1uOPP26LeACAPMQnp2n53lizWt/7A+TlVt5OiQAAwD9VrlxZS5cuzfd4k8mkb7/9VpUrVy7CVIW3ePFiSVKrVq1Uv3797HpkZKSOHTsm6a9t8CxxdHTMXp0VHh5exEkBAACA0s8m90gaPny4ZsyYoaVLl2r9+vUKCwtT8+bN5efnJxcXF6WlpSk2NlZ79uxReHi4kpOT5efnp+eee84W8QAAeZi7LVLXs/5eUerk6KCnWwfZMREAAPintm3basmSJRo6dKhmzJghd3f3XMdeuXJFo0aN0q+//qo+ffrYMGXerly5ooMHD2rmzJn673//q27dumnOnDlmYw4dOpT9PDAwMNdzBQYGasuWLWbjAQAAABSOTRpJrq6uWrNmjR5++GElJiZqyZIlWrJkicWxJpNJ3t7eWrNmjdkNVQEAtpd0NUMLd501q/W4x1fVPF3slAgAAFgybtw4LV26VF9++aVWrFihLl266J577lGNGjWyv7wXFxenvXv3Kjw8XImJiSpXrpzGjRtn7+g6ffq06tatm70Vep06dbRs2TL16NEjx9jo6Ojs51WqVMn1nDeOXb58WampqRYba+np6UpPT89+XdCtAQEAAICywiaNJElq2rSp9u/fr2effVY//PBDruM6deqk2bNnKyAgwFbRAAC5+HpXlFKvZ2W/djBIwx6sbcdEAADAkkaNGumLL77Q4MGDdfnyZS1cuFALFy60ONZkMsnBwUFz587VXXfdZeOkOdWsWVMHDx7UtWvXdPz4cc2ZM0dPPPGEQkNDNXfuXPn7+2ePTUlJyX7u4pL7F1tuPpacnGyxkTRlyhRNmjTJSu8CAAAAKL1s1kiSpICAAK1bt04nT57Upk2bdOrUKaWkpMjDw0N16tRRaGiogoODbRkJAJCLa9ez9OX2KLNa50bVFeiT+1Y5AADAfvr376/g4GD9+9//1t69e3Mdd++992rmzJm6//77bZgud05OTtkNrebNm6tv374aOnSo5s6dq9atW2vv3r15rj6yxGQyZT83GAwWx4wfP16jR4/Ofp2cnKyaNWsW4h0AAAAApZtNG0k3BAcH0zACgGLu293RupR63az2bAirkQAAKM5atmyp3bt36+DBg9q6davOnDmT/eW9WrVqqU2bNmrSpIm9Y+bJYDDoww8/1JIlSxQTE6O33npLH330kSTJw8Mje1xaWlqu57h5y7qb59zM2dlZzs7OVkoNAMDtCRwXbu8IAJAruzSSAADFW0aWUZ9vjTSrhdStort8veyUCAAAFESTJk2KfcMoL56enrr//vv1448/as2aNdmNpJu3ubtw4UKu828c8/b2tritHQAAAID8c7D1BTdu3KgBAwaofv36qlixoiIiIrKPDRo0SJs2bbJ1JADAP6w5cE5xidfMas+1ZTUSAACwnWrVqkmS4uLismuNGzfOfh4VFZXr3BvHbh4PAAAAoHBs1khKSkpSWFiYOnbsqIULF+rEiRNKSUkx27t64cKF6tChg8LCwpSUlGSraACAmxiNJn3682mzWjP/irovqJKdEgEAgNIkLi5O9evX17Zt2/Icd+MzoZfX3yuig4KCVL9+fUnSnj17LM7LysrS/v37JUlhYWHWiAwAAACUaTZpJJlMJnXv3l3r16+XyWSSyWSyuL3Al19+qQceeEDr1q3To48+atZkAgDYxqZj53Uq/opZbfj/s3fncVGW+//H3wMIyCKouCuyuVDuZWZmKlmZWmme+uWSpmkuaZnW0epU6jll2Sk9pdbxlFrhdszUklJTySXtpOUeubIomiLIIgkCc//+6Bs6AQo2zM0Mr+fjMY+Yz33d17ynIWL4zHXdXSNKvFA1AABAWeTl5enQoUP67rvvShxz8eJF7dixQ9Jv13260vDhwyVJq1atktVqLXLu119/raysLHl7e2vAgAF2TA4AAABUTg5pJC1fvlyxsbFq3LixlixZovT0dMXHxxdpFD366KPaunWrXnjhBX377beKjo52RDwAwP8xDENzv7FdjdS0jp+imtc2KREAAHBV//rXv3TmzJlijz3//PNKS0uTxWLRc889Z3Ns7Nixatq0qZKTkzV79mybY3l5eXr55ZclSZMnT1aDBg3KJzwAAABQiXg44kEWL16soKAg7dixo3Cf69TU1BLH/+Mf/9D69esVHR2tRx991BERAQCSdhxP1Z4T6Ta10V3D5ebGaiQAAGAfnp6e8vLy0smTJ3XDDTdo/Pjxat++verUqaOEhAT95z//0VdffSUvLy/NmTNHnTt3tjnfy8tLMTExioqK0oQJE3T27Fn17t1b58+f14wZM7Rz504NHDhQL730kknPEAAAAHAtDmkk7dq1S8OGDStsIpXGAw88oHfeeaccUwEA/ui9P6xGali9qu5rVd+kNAAAwBXVr19fycnJ+vTTT/X111/rk08+0euvv67c3Fz5+/srIiJCzz33nEaOHKnw8PBi54iIiND+/fs1Y8YMrVixQm+99ZZ8fHzUunVrLVmyRI888oiDnxUAAADguhzSSDp37pyaNWtWpnPq1aun9PT08gkEAChi/8kMbT1yzqb2xB1h8nB3yC6oAACgEqlZs6ZGjhypkSNHXvccAQEBevXVV/Xqq6/aMRkAAACAP3LIXwd9fHyUmZlZpnPi4+Pl7+9fTokAAH/03uajNveD/Dz18M2NTEoDAACK8+abb8rd3V3u7u766aefzI4DAAAAoBJwSCOpadOmWrFiRanHZ2dn6+OPP9YNN9xQjqkAAL87nnJBXx34xaY2tFOovKu4m5QIAAAUZ/369fLw8NCzzz6rBg0amB0HAAAAQCXgkEZSnz599O233+rZZ59VQUHBVccmJyerd+/eOnnypB588EFHxAOASu/fm4/LMC7f9/Py0KBbG5sXCAAAFOvnn3/WmDFj9MYbbyggIKCwHhYWps8//7xMc128eFFJSUn2jggAAADAxTjkGknjxo3Tu+++q5kzZ2r58uV6+OGHFRERIUnavn27UlJSlJiYqO3bt2v9+vXKzc1VcHCwRo0a5Yh4AFCpnc64qM92n7SpDbq1sQKq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ok2tT5v6atkwwKREAAAAlUt6erpeeukl3X///Ro0aJBiYvgUNwAAAIDSsevWdpJ0yy23aOHChRo4cKAOHDigxx9/XJIUHBysZs2aqVq1avLx8dHFixeVkZGhw4cPKykpSYZhyDAMeXt7a/HixWrVqpW9owEwyYx1PyvfenmFoqe7m569p5mJiQAAAFxLdna26tevrwsXLkiSvvrqK919992SpJMnT+rWW2/V6dOnC8cvWbJEzz33nF5//XVT8gIAAABwHnZvJEnSww8/rDp16uiRRx7RmTNnJElJSUlKSkoqdvzvW+A1atRIn376qdq3b18esQCY4IfE8/py/y82tcc6hahhdR+TEgEAALielStXKisrS97e3urbt6/Cw8MLj02YMEGnTp2SJNWtW1e1atXSTz/9pDfffFP33XefOnXqZFZsAAAAAE7A7lvb/a5Lly46cuSIpk+frsaNGxeuOCruFhoaqjfffFOHDh2iiQS4EMMwNP3LOJtaQNUqerJrhEmJAAAAXNPatWvl5eWl7du3a9GiRYWNpOTkZH322WeyWCx66KGHlJiYqL1792rbtm2qWrWq5s2bZ3JyAAAAABVduaxI+p2fn58mTZqkSZMm6dixY9q1a5dSUlKUmZmpgIAA1apVSzfffLPCwsLKMwYAk6w7eEa7Es/b1MZFRSjAp4pJiQAAAFzTzp079eijj6pNmzY29RUrVshqtcrT01PvvPOOqlT57fewDh066JFHHtHmzZtNSAsAAADAmZRrI+lK4eHhNtsrAHBteQVWvbH2Z5taoxpV9WjHxiYlAgAAcF0nT55U27Zti9RXr14ti8Winj17qk6dOjbHWrdurcWLFzsqIgAAAAAnVW5b2wGo3JZ8n6T4c9k2tefuaS4vD3eTEgEAALguq9Uqi8ViU0tLS9PWrVsl/XYd2z/y9vaW1Wp1SD4AAAAAzotGEgC7y7iYp1kbjtjUWjcMUO+W9UxKBAAA4Nrq1aungwcP2tQ+/vhj5efny9PTU7169SpyTlJSkqpXr+6oiAAAAACcFI0kO8vLy9OKFSs0ePBgNW/eXL6+vvL29lZwcLD69eunL774osRzExISZLFYrnn75z//6cBnBJTdnNijSsu+ZFN7vmek3NwsJZwBAACAP+O2225TdHS0fvzxR0lSXFycpk+fLovFoh49esjf399mvNVq1bJly9SsWTMz4trkmDNnjqpVqyaLxaKEhIRSn5uRkaEXX3xRkZGR8vHxUVBQkKKiorR06dLyCwwAAABUQjSS7OjkyZMKDQ3VX/7yF23evFljx47VV199pc2bN+vpp5/W5s2bdf/996tv377Kzc0tcR4fHx/5+vqWePP09HTgswLKJjE1Wwu+jbep3X1DHd0aVtOkRAAAAK5v3LhxyszMVPv27VW7dm21bNlSKSkpkqSJEycWjisoKNDBgwf1l7/8RceOHVPnzp3NiqyDBw/q9ttv19ixY5WVlVWmc48ePaqWLVvq9ddfV9++fbVp0yZ9/PHHslqt6t+/vwYNGsS2fQAAAICdeJgdwJWkp6crOTlZDRo00O7du1WjRo3CYx06dNBdd92lm266SatWrdLEiRM1e/bsYuc5ePCgQkJCHJQasK/pX/6svAKj8H4Vd4te6BlpYiIAAADX16FDB7311lt67rnndO7cOUmSxWLRCy+8oNtvv71w3JQpU/Taa6/JMAxZLBb169fPlLyvvPKKXn/9dd1yyy2aPHmyXn/99VKfm5ubq969e+vEiROaOXOmxo8fX3ise/fu6tSpkxYtWqQmTZrolVdeKYf0AAAAQOVCI6kcTJgwwaaJ9LtWrVqpf//++uSTT/TBBx/o9ddfl5+fnwkJgfLx3fFUrT34i01tSMcQhQT5mpQIAACg8hg/frx69eqltWvXymq1qnPnzmrXrp3NmKioKHl4/PY20N/fX23atDEhqTRr1izNnDlTo0eP1kcffVSmc2fPnq1Dhw6pfv36GjdunM0xT09PTZs2TT179tQbb7yhESNGqH79+vaMDgAAAFQ6NJLsKCgoSBMnTtQDDzxQ4pjWrVvrk08+UW5urg4dOqSbbrrJgQmB8mO1GvpHzE82teo+VTTuziYmJQIAAKh8mjRpoiZNSv79q1u3burWrZsDExXvp59+UoMGDa7r3A8//FCS1KdPH7m7uxc5fvfdd8vf319ZWVlatGiRnnvuuT+VFQAAAKjsuEaSHdWtW1f//Oc/FR4eXuKYK9/osBoJrmTFjyd1IDnTpvbMXU0VULWKSYkAAABQUV1vEyk+Pl5xcXGSpPbt2xc7xt3dXW3btpUkxcTEXF9AAAAAAIVoJDnYkSNHJEn16tVTREREsWPWrl2r+++/X2FhYfL19VXdunXVvXt3vffee8rJyXFkXKBUsnPz9ea6Qza1iNp+GnBLsEmJAAAAcC0bNmxQVFSU2THKZN++fYVfX+26sr8fu3I8AAAAgOtDI8mB8vPztWLFCknSxIkTi92GQZKeffZZtWzZUvPnz9eWLVs0c+ZMZWRkaMyYMbr55puVkJDgwNTAtf178zGdzcq1qb3YK1Ie7vyIAQAAqKjOnDmjzZs3mx2jTJKSkgq/rlWrVonjfj92/vx5ZWdnl3suAAAAwJVxjSQH+vDDD3XmzBndcssteuqpp4oc9/b2VlRUlGbOnKlWrVoV1m+66Sb169dPPXr0UGxsrHr27Kndu3fLy8urxMfKzc1Vbu7lP+xnZmaWOBb4M06lX9S8rcdtanc0raVuzWqblAgAAKByS0pK0pYtW3Tq1Kmr7miwd+9eB6ayj6ysrMKvvb29Sxx35bHMzEz5+voWGcN7JgAAAKB0aCQ5yOHDh/Xcc8+pdu3aWrp0qapUKXrdmLp162rjxo3Fnu/p6alZs2apdevWiouL04IFCzRq1KgSH2/69OmaOnWq3fIDJZmx9mfl5FkL77u7WfS3XpEmJgIAAKicMjIyNHLkSH366acyDOOa4w3DkMVicUAyx7vy+Zf0HHnPBAAAAJQO+045wJkzZ9SrVy+5u7tr/fr1Cg0Nva55WrVqpfr160uS1qxZc9Wxzz//vDIyMgpvJ06cuK7HBK5mz4l0rdpzyqY24JZgNa3jb1IiAACAyikvL0933323li9fLqvVKsMwrnlzRv7+l3/PvNpqqytXGl15zpV4zwQAAACUDo2kcvbLL78oKipKqampWr9+vVq3bv2n5gsODpYkxcfHX3Wcl5eXqlWrZnMD7MlqNTT1i4M2NX9vDz1zV1OTEgEAAFReCxcu1M6dOxUZGam1a9cqLS1NZ8+elSRt2LBBVqtVVqtVWVlZ2rhxo9q2bavIyEhduHDB5ORl8/v7IUlKSUkpcdzvx6pXr17stnYS75kAAACA0qKRVI5OnjypLl266OzZs9q0aZPat2//p+d01k8OwvV8tjtZu5PSbWpPRTVRDV9PcwIBAABUYsuWLVPNmjW1detW3X333QoMDCx2SzdfX19169ZNsbGxyszM1Pvvv29C2ut35bVkExISShz3+7ErxwMAAAC4PjSSyklCQoLuuOMOZWVlafPmzWrTpk2R43/89F+fPn0UExNz1XmTkpIkSSEhIfaMC5RJZk6eXv/qZ5taSE0fDb6tsUmJAAAAKrd9+/ZpyJAhql69eqnGV6tWTY899pg+/fTTck5mX6GhoWrevLkkadeuXcWOKSgo0O7duyVJvXr1clg2AAAAwFXRSCoHR44c0R133KH8/Hxt3rxZN9xwQ5ExoaGhRd60rV69Wl999VWJ8+7Zs0enT5+WxBsimOudDUd07kKuTe2V+26Ul4e7SYkAAAAqt/T0dDVtarvFsLv7b7+bXbx4sdhzGjdurLi4uHLPZm/Dhw+XJK1atUpWq7XI8a+//lpZWVny9vbWgAEDHB0PAAAAcDkeZgdwNT/99JO6d++uqlWratOmTWrcuGwrND766CM988wzCg8Pt6nn5uZq/PjxkqSIiAgNGzbMXpGBMjlyJksLtyfY1O5sXlvdmtc2JxAAAADk4+NTZMcDPz8/SVJiYmKx5yQmJio7O7vcs9nb2LFjNW/ePB0+fFizZ8/WU089VXgsLy9PL7/8siRp8uTJatCggVkxAaBCCpl89Z1w7CXhdT4ADQCuhEaSHR07dkxdu3ZVSkqKPD09deONN5bpfH9/f2VlZal9+/aaOHGibrnlFtWoUUNxcXF6++23tXv3bjVr1kxr1qyRt7d3OT0LoGSGYWjKFweVb718rS5Pdze91LvoqjsAAAA4Tnh4uNatW6cJEyYU1jw8PNSoUSMtXLhQY8aMsRl/4cIFLViwoNRb4dnb2bNndfbsWUlScnJyYf3w4cOFDbHQ0FD5+voWOdfLy0sxMTGKiorShAkTdPbsWfXu3Vvnz5/XjBkztHPnTg0cOFAvvfSSY54MAAAA4OLY2s6O9u/fr5SUFEnSpUuXlJ2dXeKtOKdPn9Ynn3yinj17Kjo6Wn379tWtt96qCRMmqEaNGpozZ452796tiIgIRz4toNDaA7/o26OpNrURd4QqJKjoG3wAAAA4TqdOnbRhwwa99tprNtu9de3aVT/88IN69+6tDRs26Oeff9aqVavUqVMnnT59Wh07djQl79y5c9WyZUu1bNlSf/vb3wrr99xzT2F9586dJZ4fERGh/fv3a9KkSVqxYoW6deumQYMGyWKxaMmSJYqOjpabG293AQAAAHuwGIZhXHsYnF1mZqYCAgKUkZGhatWqmR0HTujipQJ1f3uzktMv77FfL8BbGyd2kY8nixsBAEDFUtl+/920aZO6d+8ui8Wi6tWr66efflLt2rX1448/6pZbbtEf3/YZhiGLxaKNGzeqa9eu5oSuYCrb9wyAyslRW9sBjsAWisCfV9rfgfnrL4BSeW/zMZsmkiS92CuSJhIAAEAFEBUVpalTp+rSpUuSVLgVdrt27TRz5kxNmDBBBQUFhePd3Nz02muv0UQCAAAAcE38BRjANZ1I+1Xvbz5mU+sYVlO9WtYzKREAAAD+qKRrAo0bN05RUVH673//q19++UX16tXTQw89VOZrugIAAAConGgkAbgqwzD0yucHdSn/8l777m4WTbn/RlksFhOTAQAAoLRuvPFGTZ061ewYAAAAAJwQVx8FcFXrDv6iTT+ftak9emtjNavrb1IiAAAAAAAAAICj0EgCUKILufma8vlPNrUgPy89c1dTkxIBAABUbu7u7lq8eLFd5lq9erXCwsLsMhcAAAAA10UjCUCJ3l5/WL9k5tjUXuodqYCqVUxKBAAAULkZhmG3uS5cuKDExES7zQcAAADANXGNJADFOpCcoYXb421qnZsE6f7W9U1KBAAAAEnaunWr8vPz//Q827dvt0MaAAAAAK6ORhKAIgqshl5cuV/WKz7w6unhpr8/0EIWi8W8YAAAANC8efM0b948s2MAAAAAqCRoJAEoYvH/ErX3ZIZNbWy3CIUE+ZqUCAAAAFey1xZ3fEgIAAAAwLXQSAJg42xmjmasPWRTC6vlq5FduBAzAACA2e677z6tWbNGktSiRQs98cQT8vf3v665duzYof/85z/2jAcAAADABdFIAmBj6hc/KSvXds/9f/RpIS8Pd5MSAQAA4HerV6/WwYMH9dprr+m///2vXn75ZY0dO1ZPPfWUgoKCyjSXh4cHjSQAAAAA1+RmdgAAFcfaA78oZv9pm9qD7RrotvCy/VECAAAA5efGG2/UokWLdPjwYT300EN688031bhxYz311FNKSkoq01z22iIPAAAAgOuikQRAkpTxa55eWn3Aplbdp4pe7BlpUiIAAABcTWhoqP79738rPj5eo0aN0sKFC9WkSRMNGTJEP/300zXPHzhwoKxWqwOSAgAAAHBmNJIASJL+HvOTUrJybWqv3Hejavp5mZQIAAAApVG3bl299dZbSkxM1PPPP6+YmBi1atVKffr00XfffWd2PAAAAABOjkYSAH1z6Kw+/eGkTS2qeW090Ka+SYkAAABQVtWrV9eUKVOUmJio119/XTt37lSnTp3UtWtXrVu3zux4AAAAAJwUjSSgkruQm68XV9puaefv5aFX+7aQxWIxKRUAAACul6+vr5599lnFx8drzpw5OnHihHr27Km2bdtq2bJlXBcJAAAAQJnQSAIquTe++lnJ6Rdtas/3jFS9gKomJQIAAIA9eHp6atSoUTpy5IgmTZqkvXv3asCAAWratKnZ0QAAAAA4ERpJQCX2v+Op+uS7RJtax7Ca6n9LI5MSAQAAwJ527typfv36acaMGbJYLDIMQ8ePH5fVajU7GgAAAAAn4WF2AADmyM7N119X7LOpeVdx0+v9WrKlHQAAgJPbtGmTXnvtNcXGxkpS4XZ21atX19ixY+XmxmcKAQAAAJQOjSSgknr1yzglpv5qU3v27mZqXNPXpEQAAAD4s1avXq3p06dr586dki43kBo0aKBnnnlGI0eOlK8vv+8BAAAAKD0aSUAlFPvzWS3+X5JNrV1woIZ2CjUpEQAAAK6X1WrV4sWL9cYbb+inn36SdLmB1LRpUz333HMaPHiwqlSpYmZMAAAAAE6KRhJQyZzPvlRkSzsfT3e9/XAbubuxpR0AAICzuHTpkubPn68333xTCQkJki43kG666SZNnjxZDz74INsWAwAAAPhTaCQBlYhhGPrbqgNKycq1qb/YK1IhQWxxAgAA4AwuXLig9957TzNnztSZM2ckXW4gRUVFafLkyerevfs154mPj9fWrVs1ePDgcs0LAAAAwLlxhVWgEvl87ynF7D9tU+vWrJYG3BJsUiIAAACUxcsvv6zGjRtr8uTJ+uWXX2QYhiwWi/r27avvv/9eGzZsKFUTSZK2b9+uoUOHlnNiAAAAAM6OFUlAJZGcflEvrTpgUwv0qaI3+rViuxMAAAAn8Y9//EMWi0WGYcjT01MDBw7UpEmT1LRpU7OjAQAAAHBRNJKASiC/wKqnl+xWZk6+Tf3VPi1Vu5q3SakAAABwvSwWixo3bqz4+HiNGjXquub4fVs8AAAAALgaGklAJfDOxiPalXjeptanTX31alXPpEQAAAC4XjVr1pSvr68uXbqk+Pj4654nOzvbjqkAwHWFTI5xyOMkvN7LIY8DAEBZ0UgCXNz2Y+f0buxRm1qjGlU1rU8LkxIBAADgz5g1a5YGDBjwp+eJjo7WkCFD7JAIAAAAgCtzMzsAgPKTeiFXzyzbI8O4XPNws+jd/u1UzbuKecEAAABgOq6TCQAAAKA0aCQBLsowDD336T6dycy1qT97TzO1aRRoTigAAAD8KUOGDFF4eLhd5mrVqpVefvllu8wFAAAAwHWxtR3gouZ/m6BNP5+1qXVuEqQnOoeZlAgAAAB/1oIFC+w2V8uWLdWyZUu7zQcAAADANbEiCXBBe0+k6/Wv4mxqQX5eevvhNnJzYwsTAAAAAAAAAEDp0EgCXExa9iWNWfSj8goMm/rM/9datfy9TEoFAAAAAAAAAHBGNJIAF1JgNfT00t1KTr9oUx/VJVydm9QyKRUAAAAAAAAAwFnRSAJcyKwNh7X1yDmb2i0hNTTx7qYmJQIAAAAAAAAAODMaSYCL2Bh3Ru9uOmpTq+3vpdkD26qKO/+pAwAAAAAAAADKjr8uAy4gMTVbzyzbY1PzcLNozsB2qu3vbU4oAAAAAAAAAIDTo5EEOLkLufka+ckPyszJt6k/3zNS7UNqmJQKAAAAAAAAAOAKaCQBTsxqNTR+6R79/EuWTb13q3oa1inEnFAAAAAAAAAAAJdBIwlwYjPWHdKGuDM2tSa1/fRGv1ayWCwmpQIAAAAAAAAAuAoaSYCTWvHDSb2/+ZhNLdCnij4YcrN8vTxMSgUAAAAAAAAAcCU0kgAntCshTc9/tt+m5uFm0XsDb1Ljmr4mpQIAAAAAAAAAuBoaSYCTOXr2goZ/vEuXCqw29b/3aaGO4TVNSgUAAAAAAAAAcEU0kgAnciYzR0Pmf6/0X/Ns6sM6har/LcEmpQIAAAAAAAAAuCoaSYCTyMzJ02MLdio5/aJNvVuzWnqhZ3OTUgEAAAAAAAAAXBmNJMAJ5OYXaNQnPyjudKZNvXWjQM0Z2E4e7vynDAAAAAAAAACwP/76DFRweQVWPbVkt7YfS7Wphwb5av6Qm+Xj6WFSMgAAAAAAAACAq6ORBFRgBVZDzyzbo3UHz9jUg/y89NHQW1TTz8ukZAAAAAAAAACAyoClDEAFZbUaeu7TvVqz77RN3dfTXQuHtldwTR+TkgEAAAAAAHsLmRxjdgQAAIrFiiSgArJaDb246oA++zHZpl61irsWDL1FLRoEmJQMAAAAAAAAAFCZsCIJqGAKrIae/2yf/rvrpE3d08NNHwy5WbeE1jApGQAAAAAAAACgsqGRBFQgl/Kteua/exTzh+3sqrhb9O9BN6lTRJBJyQAAAAAAAAAAlRGNJKCCyMkr0JhFP2rTz2dt6h5uFs0e0E7dmtc2KRkAAAAAAAAAoLKikQRUABkX8zTqkx+043iqTd3Tw01zB7RT9xvqmJQMAAAAAAAAAFCZ0UgCTHby/K8atnCnDp+5YFP38XTXfwbfzHZ2AAAAAAAAAADT0EgCTLTvZLoe/2iXUrJyber+3h5aOLS9bmpcw6RkAAAAAAAAAADQSAJM8/VPZ/TUkt26mFdgUw/y89LCoe3VokGASckAAAAAAAAAAPgNjSTAwaxWQ+9sOqJZG44UORZR208LHmuvRjV8TEgGAAAAAAAAAIAtGkmAA2VczNMzy/Zo089nixy7Lbym3ht0kwKqVjEhGQAAAAAAAAAARdFIAhwk7nSmRkX/oMTUX4sc69euoaY/2FKeHm4mJAMAAAAAwPmETI4xOwIAAJUCjSSgnBmGoYXbEzT9q591Kd9qc8zdzaLn722ux28PlcViMSkhAAAAAAAAAADFo5EElKOUrFw9u3yvNh9OKXKspq+nZg9op47hNU1IBgAAAAAAAADAtdFIAsrJ2gO/6G+r9uvchUtFjrVuFKj3B7VTvYCqJiQDAAAAAAAAAKB0aCQBdnY2M0cvrz6otQd/Kfb4iM6hevaeZvLycHdwMgAAAAAAAAAAyoZGEmAnVquh5T+c0KsxccrMyS9yvJa/l95+uLU6N6llQjoAAAAAAAAAAMqORhJgB7uTzmvKFz9p74n0Yo93j6ytN/q1Uk0/L8cGAwAAAAAAAADgT6CRBPwJZzJz9MZXP+uz3cnFHq/uU0Wv3HejHmhTXxaLxcHpAAAAAAAAAAD4c2gkAdfhfPYl/XvLcX20PUEX8wqKHdOnTX291PsGViEBAAAAAAAAAJwWjSSgDLJy8vThtnh9uDVeWblFr4MkSaFBvnr5vhvUrVltB6cDAAAAAAAAAMC+aCQBpXA2M0fzv03Qov8lKiun+AaSv5eHnrqziYbcFiJPDzcHJwQAAAAAAAAAwP5oJAFX8fMvmZq/LV6rdp/SpQJrsWPc3Sx6+OaGmnBXM9XyZxs7AAAAAAAAAIDroJFUQeXm5mrWrFlaunSpjh49Knd3d0VGRmrIkCF64okn5ObGipfykpNXoJh9p7X4+yT9kHi+xHEWi3R/6/oa372pQoN8HZgQAAAAAAAAAADHoJFUAZ07d05RUVHav3+/nnjiCb377ru6dOmSZs+erdGjR2v58uWKiYmRt7e32VFdhtVq6PuENH2+95Ri9p1WxsW8EsdaLNI9N9TVM3c1VbO6/g5MCQAAAAAAAACAY9FIqoAeeugh7d+/X08//bRmzZpVWO/WrZv69u2r1atXa/To0VqwYIF5IV1AXoFVPySe14afzihm/2mdzsi56nhPDzf1a9dQIzqHKqyWn4NSAgAAAAAAAABgHhpJFcyKFSv0zTffyNvbW1OmTLE5ZrFYNH36dK1evVofffSRxo4dq5tuusmcoE7IMAydSLuo/8WnavPhFG05nKLMnPxrnlfL30uPtG+kwR1DuAYSAAAAAAAAAKBSoZFUwXzwwQeSpKioKAUGBhY5HhkZqcjISMXFxWn+/Pk0kq7iQm6+Dv2SpYOnMvR9fJp2JqTpTGZuqc/v3CRIAzsE687IOqrizjWpAAAAAAAAAACVD42kCuTSpUvauHGjJKl9+/Yljmvfvr3i4uIUExOjOXPmOCpehZRfYNXpjBydSPtVJ87/qqS0X3X07AXFnc5SUtqvZZ6veV1/3de6vu5vXV+NaviUQ2IAAAAAAAAAAJwHjaQKJC4uTnl5eZKkkJCQEsf9fiwxMVEZGRkKCAhwQLrrk5tfoMTUX1VgNWQ1DBmGCr+2Gvrtn9YrvjYM5RVY9eulAv2aW6BfL+Ur+9L//TO3QGnZl5SanavUC5d07sIlpWXnymr8uYw31q+mO5vXVq9W9dWsrr99njgAAAAAAAAAAC6ARlIFkpSUVPh1rVq1Shx35bGTJ09W6EbSibRfdffMLWbHsFHT11PtQ2qoS7Na6tastuoGeJsdCQAAAAAAAACAColGUgWSlZVV+LW3d8nNjSuPZWZmFjsmNzdXubm51xxX3iwWiymP+zt3N4vCa/mqRYMA3RJSQ+1DaygsyNf0XAAAAAAAAAAAOAMaSU7IMC7v5VZSQ2T69OmaOnWqoyKVyN1BDRtfT3c1quGj4Bo+alzTR83qVlPzuv6KqO0n7yruDskAAAAAAAAAAICroZFUgfj7X74+T05OTonjrlxpdOU5V3r++ec1YcKEwvuZmZlq1KiRHVKWjdv/NZIslt+aSm4Wy29fu/32tZtFcnOzyN1ikeX/7ldxd1NVT3f5err/3z89VNXTXT6e7qru66kgXy/V9PNUTT8v1fT1VP3AqqruU4VVRgAAAAAAAAAA2BmNpAokODi48OuUlJQSx115rGHDhsWO8fLykpeXl/3CXadGNaoqfnpPmjwAAAAAAAAAADghN7MD4LLIyEhVqVJFkpSQkFDiuN+PNW7cWAEBAQ5Idv0s/7fSCAAAAAAAAAAAOB8aSRWIp6en7rzzTknSrl27Shy3c+dOSVKvXr0ckgsAAAAAAAAAAFRONJIqmOHDh0uSNm7cqIyMjCLHf/75Z8XFxclisWjYsGGOjgcAAAAAAAAAACoRGkkVTL9+/dS1a1fl5ORo6tSpNscMw9ALL7wgSRoyZIhuuukmMyICAAAAAAAAAIBKwsPsAChq+fLlioqK0syZM3Xx4kUNGjRIly5d0pw5c7Ry5UpFRUXpvffeMzsmAAAAAAAAAABwcaxIqoCCgoK0c+dOvf7669qxY4fuuece9enTRydPntTcuXP19ddfy9vb2+yYAAAAAAAAAADAxbEiqYLy8vLSpEmTNGnSJLOjAAAAAAAAAACASopGEgAAAAAAAOwqZHKM2REAAICdsLUdAAAAAAAAAAAAikUjCQAAAAAAAAAAAMWikQQAAAAAAAAAAIBi0UgCAAAAAAAAAABAsWgkAQAAAAAAAAAAoFg0kgAAAAAAAAAAAFAsGkkAAAAAAAAAAAAoFo0kAAAAAAAAAAAAFItGEgAAAAAAAAAAAIpFIwkAAAAAAAAAAADFopEEAAAAAAAAAACAYtFIAgAAAAAAAAAAQLFoJAEAAAAAnE5ubq7eeOMNtW3bVv7+/goMDFTHjh31/vvvy2q1mh0PAAAAcBk0kgAAAAAATuXcuXNq3769Jk+erFtuuUVfffWVPvvsM9WrV0+jR4/WXXfdpZycHLNjAgAAAC7Bw+wAAAAAAACUxUMPPaT9+/fr6aef1qxZswrr3bp1U9++fbV69WqNHj1aCxYsMC8kAAAA4CJYkQQAAAAAcBorVqzQN998I29vb02ZMsXmmMVi0fTp0yVJH330kX744QcTEgIAAACuhUYSAAAAAMBpfPDBB5KkqKgoBQYGFjkeGRmpyMhIGYah+fPnOzgdAAAA4HpoJAEAAAAAnMKlS5e0ceNGSVL79u1LHPf7sZiYGIfkAgAAAFwZjSQAAAAAgFOIi4tTXl6eJCkkJKTEcb8fS0xMVEZGhgOSAQAAAK6LRhIAAAAAwCkkJSUVfl2rVq0Sx1157OTJk+WaCQAAAHB1HmYHgGMYhiFJyszMNDkJAAAAUP5+/73399+D4RqysrIKv/b29i5x3JXHSnoPlJubq9zc3ML7v69c4j0TXF2LV9aZHQEA7IL/ZwN/XmnfN9FIqiR+f8PVqFEjk5MAAAAAjpOVlaWAgACzY8DBrnwjbLFYih0zffp0TZ06tUid90wAADiHgFlmJwBcx7XeN9FIqiTq16+vEydOyN/fv8Q3UuUpMzNTjRo10okTJ1StWjWHPz7MxetfufH6g++Byo3Xv3Iz8/U3DENZWVmqX7++Qx8X5cvf37/w65ycnBLHXbnS6MpzrvT8889rwoQJhfetVqvS0tJUs2ZN3jPB4Xj9wfdA5cbrX7nx+lduZr/+pX3fRCOpknBzc1PDhg3NjqFq1arxA7ES4/Wv3Hj9wfdA5cbrX7mZ9fqzEsn1BAcHF36dkpJS4rgrj5X0PsjLy0teXl42tcDAwD8X0A74eVm58fqD74HKjde/cuP1r9zMfP1L877JzQE5AAAAAAD40yIjI1WlShVJUkJCQonjfj/WuHFjGooAAADAn0QjCQAAAADgFDw9PXXnnXdKknbt2lXiuJ07d0qSevXq5ZBcAAAAgCujkQSH8PLy0iuvvFJk6whUDrz+lRuvP/geqNx4/Ss3Xn+Uh+HDh0uSNm7cqIyMjCLHf/75Z8XFxclisWjYsGGOjnfd+O+lcuP1B98DlRuvf+XG61+5OcvrbzEMwzA7BAAAAAAApdWtWzd98803euaZZ/T2228X1g3DUL9+/bRy5Uo99thjWrBggYkpAQAAANdAIwkAAAAA4FTOnTunqKgo7d+/X6NGjdKgQYN06dIlzZkzRytWrFBUVJRiYmLk7e1tdlQAAADA6dFIAgAAAAA4ndzcXM2aNUtLlizR0aNH5e7ursjISA0ZMkQjR46Umxs7uQMAAAD2QCMJAAAAAAAAAAAAxeIjWiiT3NxcvfHGG2rbtq38/f0VGBiojh076v3335fVav1Tc2dkZOjFF19UZGSkfHx8FBQUpKioKC1dutRO6fFnlcfrn52drU8++UQPP/ywwsLCVLVqVfn4+Cg8PFyDBg3Sli1b7PwscL3K87//KxUUFKhDhw6yWCyyWCx2mxd/Tnm//nv27NHo0aPVtGlT+fn5yd/fX02aNFGfPn301ltv6cKFC3Z4FvgzyvN7YM2aNerTp48aNGggT09P+fr66sYbb9RTTz2l48eP2+kZ4M+wWq2aM2eOqlWrJovFooSEBLvNze+AqOwc9TsWzPNnfobyM9I55eXlacWKFRo8eLCaN28uX19feXt7Kzg4WP369dMXX3xxzTl47Z1bXl6eYmNj9de//lUdO3ZUzZo15eHhIX9/f7Vq1Urjx4/XsWPHrjoH3wOu5y9/+Uvh3zqu9f8CXn/n9ftrfLXb2LFjSzy/wr72BlBKKSkpRsuWLQ1JxhNPPGFs3brV2Lhxo9G3b19DkhEVFWVcvHjxuuY+cuSI0ahRI8PNzc14/vnnjR07dhgxMTFGly5dDEnGwIEDjYKCAjs/I5RFebz+u3btMmrUqGFIMm688Ubjww8/NL799ltj27ZtxiuvvGL4+PgYkowxY8YYVqu1nJ4ZSqM8//v/oxkzZhiSCm8wX3m//n/7298Md3d3o1+/fsZnn31m7Nq1y1i3bp0xbNiwwu+DuLg4Oz4jlFV5fQ9YrdbC17latWrGm2++aWzbts2IiYkxBg0aZEgyqlataqxevbocnhVK68CBA0bHjh1tfjbHx8fbZW5+B0Rl58jfsWCOP/MzlJ+RzunEiRNGgwYNDElGcHCw8e677xqbN282vvvuO+Of//ynUbNmTUOS0adPHyMnJ6fYOXjtnd/QoUMLf8d98cUXjfXr1xvff/+98emnnxp33323Icnw8vIyVq5c+f/bu/O4nNL/f+CvlEp7KYak0mKZFDOSLRI+Y4/wsWtmbIMZhMFYPhrLjN0wxm4yYzcRGTGiRPZdBhGJopBQkVTX7w+/+3y73ffdfrd5PR+P+/E4nWs51znX6dzn3O9zrqO0PPeBimfXrl35/i5g/5dvAISurq7Q19dX+ZkwYYLSsmW57/kLHeWbh4eHACDGjRsnNz87O1t4eXkJAOLLL78scL3p6emibt26AoBYtmyZXNrbt29FkyZNBADh5+dXhNZTUamj//fv3y8AiEaNGik9gT5w4ID0Bbto0aKiNJ+KSF3//x+KiooSurq6wsDAgIGkMkSd/T9r1iylx3+ZkSNHMpBUBqhrH/D39xcAhIaGhjh58qRC+ogRI6QL8KdPnxa2+VQE//vf/4S2trZo1aqVmDp1arEGkngOSFRy51hUOopyDOUxsvyKjIwUAISlpaVISkpSSL969arQ0tISAMSYMWMU0tn3FYOPj48AIMLDw5Wmd+3aVQAQJiYm4vXr13Jp3AcqnqdPn4pq1arJ/dah6ruA/V/+ARBhYWEFLlfW+56/0FG+BAQESNHU5ORkhfQbN25IPwRduHChQHUvXrxYABA1a9YUmZmZCunBwcHSHcnx8fGFXQUqAnX1vyyQtHv3bpV53N3dpZNwKh3q/P/PKSsrS7Rs2VLY2NiISZMmMZBURqiz/2UX0c2bN1eZJyYmRqxevVrpsqlkqHMf8PT0FACEq6ur0vR///1XOhZs2rSpMM2nIjIyMhK//fabyM7OlgJ/xRVI4jkgfexK6hyLSk9RjqE8RpZfskDSkiVLVOYZPHiw9ERKSkqKXBr7vmKYPn266Natm8r0HTt2SMeEc+fOyaVxH6h4+vXrJ4yNjcW8efPy/C5g/5d/hQ0klfW+5zuSKF82bNgAAPD09ISJiYlCev369VG/fn0IIfD7778XqO6NGzcCAHr06AFNTU2F9P/85z8wNDTEmzdvsHXr1oI3nopMXf1vZ2eHiRMnwsPDQ2UeFxcXAEB8fDySkpIK1G4qHur8/89pxYoVOHnyJNavXw99ff1C10PFS539v2jRImRmZuLLL79UmcfGxgbffPON0mVTyVDnPhAfHw8AsLW1VZpuY2MjTSckJBSobioeN27cwOjRo9XyzjqeA9LHrqTOsaj0FOUYymNk+WVubo6JEyfCy8tLZR7Zde7bt28RFRUll8a+rxjmzp2LoKAglek6OjrStKGhoVwa94GKZe/evdixYweWLFmCmjVr5pmf/f/xKut9z0AS5SkjIwNHjx4FALi6uqrMJ0s7cOBAvuuOiYnBzZs3c61bU1MTjRs3LnDdVDzU2f/169fH4sWLYWZmpjKP7MBZqVIlVKlSJd91U/FQZ//ndPfuXUyfPh3Dhg1D+/btC1UHFT919v/bt2+xZ88eAECzZs2K0EpSJ3UfA6ytrQGoDhLlnG9vb1+guql4WFpaqqVengPSx66kzrGodBX2GMpjZPn2ySefYPHixbCzs1OZJ+cPhAYGBtI0+/7jsX37dgBAy5YtUa9ePWk+94GKJTk5GaNGjUKHDh0wdOjQPPOz/z9e5aHvGUiiPN28eRPv3r0DIH9n8IdkabGxsXj58mW+6r527ZpC+dzqzpmfSoY6+z8/7ty5AwBo0qQJ9PT0iq1eyp+S6H8hBIYOHQpTU1MsXry4sE0lNVD38f/169cA3gcT/vrrL/znP/+BhYUF9PX1YWdnh6FDh+L69etFWgcqGnUfA4YMGQIAOHv2LO7du6eQLrvAtre3R+fOnfNdL5V9PAekj11pn2NT2cZjZMUnu86tUaOG3M0y7PuKLTU1FSdPnkTfvn2xa9cu9OjRA4GBgXJ5uA9ULOPGjUNqairWr1+fr/zs/4rj9OnT6N+/PxwdHWFgYAALCwu0atUKCxcuVHpOVx76noEkytODBw+kaQsLC5X5cqbFxcWppe7k5GSkpaXlq24qHurs/7wkJSXhyJEjAIDJkycXS51UMCXR/6tWrUJ4eDjWrFkDY2PjgjeS1Ead/X/jxg1pevjw4Rg6dCg8PT3x999/459//oG3tzf+/PNPfPbZZ/D39y9E66k4qPsYMHDgQEybNg3v3r1Dt27dEBoaitevXyMhIQHLli3D3Llz0bRpUwQHB/Op1AqG54D0sSvNc2wq+3iMrNgyMzOxe/duAMDEiRPlnk5i31dMd+/ehaamJgwNDdGqVStcunQJAQEBCAwMVOhn7gMVx4EDB7B582b8/PPP0kgMeWH/VxyzZs1C1apV8dtvv+H48eNYu3Yt9PT0MGXKFDg5OeHy5cty+ctD32uV6NKoXEpJSZGmdXV1VebLmfbq1Su11s33p5QcdfZ/XhYvXoyMjAz07NkTvXr1KpY6qWDU3f+xsbGYOnUqBg4ciK5duxaukaQ26uz/58+fS9MBAQEIDw+Hu7u7NK9Vq1aws7PDqFGjMGLECHz66ado2rRpQZpPxaAkvgPmzZuH3r17Y+LEiWjXrp00X1tbG2PHjsWkSZNQvXr1AtVJZR/PAeljV5rn2FT28RhZsW3cuBGJiYlo2rQpxo4dK5fGvq+YrKyscPXqVbx58wZRUVFYt24devfujfbt22Pjxo2oXbu2lJf7QMXw8uVLjBw5Eq1atcKYMWPyXY79XzF4eHhgxowZcte3n332GXr27IkhQ4Zgy5Yt6NSpEyIjI6XAUHnoez6RRMVGCCFNF/cLmdVZNxWP4u6jEydOYPHixXB0dJReNkdlV2H7f9iwYdDT08Py5cvV0SwqIYXp/5x3znTo0EEuiCQzcuRIWFtbIzMzE/PmzSt6Q0ltCnsMyMjIwLRp0+Dm5ob79+9j7dq1OHnyJA4ePIhx48Zh+fLlsLW1xcqVK9XRbCoHeA5IHzv+D1BuuH+UP7dv38b333+PatWqYceOHahcuXKh6mHfly/a2tpwcnKCq6srBg0ahPDwcAwdOhRHjhxBq1at8PTp0wLXyX2gbJs4cSKSkpKwceNGtfQP+79sCwsLkwsiyWhoaGDZsmXQ1tZGYmIilixZUuC6S7PvGUiiPBkaGkrT6enpKvO9fftWaZnSqpuKR2n00a1bt+Dt7Y2aNWviyJEjMDU1LVJ9VHjq7P/169fjyJEjWLlyJapWrVr4RpLaqLP/cw5T1rp1a6V5NDQ00KZNGwDA0aNHkZ2dna+6qfio+zugT58++Pnnn2FlZYXIyEiMGDECLVq0QMeOHbFw4ULs27cPb968wXfffYc1a9YUbiWoTOI5IH3s+D9AueH+UTElJiaiS5cu0NTUxOHDh2Fra6uQh33/cdDQ0MDSpUuhr6+Phw8fYu7cuVIa94Hy7/Dhw9i4cSNmz54NR0fHApVl/1d85ubmaNKkCQDg77//luaXh75nIInylPMR29zuksiZVqtWLbXUbWpqysc1S5g6+1+ZqKgoeHp6Ql9fH6GhobCysip0XVR06ur/uLg4TJo0CT179kSfPn2K1khSG3X+/5uZmUnTuQ1bZmlpCeD9E0xJSUn5qpuKjzr3gVOnTiEoKAgAMGPGDKXf7506dZKeVst5gU3lH88B6WNX0ufYVL7wGFnxJCQkwNPTE0lJSTh8+DBcXFyU5mPffzyMjIzQrFkzAJDOiQHuA+VdSkoKhg8fDldXV0yYMKHA5dn/HwdZP8fExCjMA8pu3zOQRHmqX7++9Lj1/fv3VeaTpVlbW8PY2DhfdTs7OyuUz63unPmpZKiz/z8UGRmJ1q1bQ09PD8ePH4ednV2h6qHio67+P3LkCF69eoV9+/ZBS0tL4TN79mwpr6r5pH7q/P93cnKSprOyslTmy/nYNpU8de4Dp06dkqZz+36X/dASHx+PJ0+e5KtuKvt4Dkgfu5I8x6byh8fIiiUuLg5t2rTBkydPEBoaCldXV5V52fcfF9kNdfHx8dI87gPl28WLF/HgwQNcvHgROjo6Cr91DB06VMprb2+vMJ/9/3FQ9jtHeeh7BpIoT9ra2tK4jhcuXFCZ7/z58wCALl265LtuW1tb1KtXL9e6s7KycPny5QLXTcVDnf2f06VLl9C2bVtUrVoVx48fl4vEZ2Zm4v79+7k+2knqoa7+79GjByIjI3H16lVcuXJF4fPNN99IeVXNJ/VT5/+/i4sLTExMAAAPHjxQmU92UWVkZMQhEEuBOveB/I7tnDOflpZWvuunso3ngPSxK6lzbCqfeIysOO7fv4/WrVsjJSUF4eHhaNSokUJ6amqq9Df7vmKIj49HvXr1EBERkWu+ly9fAoDcjQLcB8o3V1fXXH/ryHlzbHBwsMJ89n/5N2LECPj7++eaR/YbiI2NjTSvXPS9IMqHgIAAAUDo6uqKFy9eKKTfvHlTABAaGhriwoULBap78eLFAoCwtLQUWVlZCukHDx6Ulh0XF1fodaDCU2f/CyHE6dOnhYmJiXB2dhaJiYkK6TExMQKACAsLK0zzqYjU3f/KzJo1SwAQ/Joqfers/1GjRgkAws3NTWl6dna2qF27tgAg+vXrV6j2U9Gpax8IDg6W/s9///13lfnc3d0FAFGrVq1CtZ+Kj7+/v9RnMTExRa6P54D0sSuNcywqPQU9hvIYWf7dvn1bWFlZCSsrK3H79m2leQAIf39/uXns+/JP9hvGokWLVOZ5/fq1MDMzEwBEt27d5NK4D1Rc+fkuYP+Xb9bW1qJLly4q0xMTE0XlypUFAPH999/LpZX1vucvdJRvHh4eAoDw9fWVm5+dnS169uwpAIgvv/xSoVxQUJAwNzcXn376qdKDZHp6unB0dBQAxPLly+XSMjIyhKurqwAg/Pz8inV9qGDU1f/h4eHC0NBQNGnSRCQlJSldNgNJpU9d/a8KA0lli7r6PyEhQZiYmAgAIigoSCF99erVAoDQ09MTN2/eLLb1oYJTxz6QkZEh6tatKwAIOzs7kZqaqlA+Z7Bp/vz5xbpOVHAF/RGU54BEeSvs8ZXKn4IeQ3mMLN/+/fdfUaNGDVGnTh1x//59lfmUBZLY9+Wf7DeMWrVqiYSEBKV5xo0bJ90scPz4cbk07gMVV36+C9j/5Zu1tbXQ1NQUJ0+eVEjLzs4W/fv3FwCEubm5wvGhrPc9f6GjfHv69Klo2LChACC++eYbERERIUJDQ0WvXr0EAOHp6SnevHmjUK5r167SQXLJkiVK675z546wsrISmpqaYvr06eL06dMiODhYurAaOHCg0kgslRx19P/p06eFnp6eFE3X19dX+pHlYSCp9Kjz/18mOTlZREZGisjISOlJFQDSvKioKHWtHuVBnf0fEREhjI2NhZ6enpg9e7Y4c+aMiIiIEJMmTRJaWlrCyMhIBAcHq3sVKQ/q2gdu3LghPXVma2sr1q1bJ06ePCkOHTokJk+eLN2p5ePjIzIzM0tiVekDiYmJ0nF47ty5Un/+888/0nxlQUAheA5IlB+FPb5S+VCUY6gQPEaWV9HR0cLCwkIAENra2iqvc/X19ZUGkoRg35d38fHxQkdHRwAQZmZmYvbs2eLgwYPi0qVLYs+ePaJTp04CgNDR0REbNmxQWgf3gYojNTU1z++CD7H/yy/ZeV2VKlXElClTRHBwsLh48aIICAgQnp6eAoCoWbOmOHv2rNLyZbnvGUiiAklPTxfz588XLi4uQl9fXxgZGQk3NzexatUqlTtxUFCQqFq1qmjQoEGud169ePFCTJs2TdSrV0/o6uoKMzMz0bZtW7F9+3Y1rQ0VVHH3/7Jly6Qv0Px8GEgqXer8/xdC/s4cZR9ra+viXynKN3X2/6NHj4Svr69wdHQUVapUEfr6+sLJyUlMmjSJj+qXIeraB1JSUsTSpUuFh4eHMDc3F1paWqJKlSqiTp06on///uLw4cNqXCvKS84nRAv6/cxzQKL8KczxlcqHohxDZXiMLH8CAwMLdJ2rLJAkBPu+vHv27JlYs2aN6NWrl3BwcBB6enpCU1NTmJiYiCZNmojvv/9eREdH51oH94GKISwsLM/jgDLs//Lp7du3Ys+ePWLo0KGiYcOGwtDQUGhpaQkzMzPRsmVLMX/+fPH8+fNc6yirfa8hRI43GBMRERERERERERERERH9f5VKuwFERERERERERERERERUNjGQREREREREREREREREREoxkERERERERERERERERERKMZBERERERERERERERERESjGQREREREREREREREREREoxkERERERERERERERERERKMZBERERERERERERERERESjGQREREREREREREREREREoxkERERERERERERERERERKMZBERESlys/PDxoaGvn6GBoaokGDBvj2228RFRVVam22sbFRaFtxGTRokELdx44dK3R9w4YNg6GhIWbPnp1n3m3btqFt27YwMzODtrY2atSoAXd3d/z4449IS0srdBuIiIiIiIiIiKj80hBCiNJuBBERfbyuXbuGa9euAQB8fX3x7NkzmJubY9myZXL5UlNTcfnyZWzduhVpaWnQ0dHB2rVr4ePjU+Jt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\n", + "text/plain": [ + "<IPython.core.display.Image object>" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# show the image in the notebook:\n", + "Image(filename='./Rate_Infomu00.035_muz-0.23_alpha0.0_sigma00.39_sigmaz0.0.png') \n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "ee442a0e", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\"> \n", + "\n", + "# Answer 7\n", + " \n", + " \n", + " \n", + " \n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a3597ac3", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d85530d5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d1b8225c", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "6c657d0a", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + "\n", + "## Extra Question 8: \n", + " \n", + " \n", + "Play around with some of the parameters in the code FastCosmicIntegrater, do the rates go up or down? Is this expected?" + ] + }, + { + "cell_type": "markdown", + "id": "00e3011c", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-danger\"> \n", + "\n", + "# Answer 8\n", + " \n", + " \n", + "\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c64aa01", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "66ebbb5a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "921b84b0", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "93c376a5", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-warning\">\n", + "\n", + " \n", + " \n", + "\n", + "## EXTRA using the CHE data: \n", + " \n", + "If there is time left, try to plot some other BBH or ZAMS properties of the BBH, (or NSBH or BNS), examples include chirp mass, mass ratio, individual masses. How do these compare with LIGOs observations (paper is attached to this directory)\n", + "\n", + " \n", + " \n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a647b78", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c370cf85", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4a02ec4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "017418fc", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "3e78c305", + "metadata": {}, + "source": [ + " <div class=\"alert alert-block alert-info\">\n", + " \n", + " # Extra material:" + ] + }, + { + "cell_type": "markdown", + "id": "0b84006f", + "metadata": {}, + "source": [ + "[//]: ## (grip -b README.md)\n", + "\n", + "\n", + "\n", + "# Compact Object Mergers: Population Astrophysics & Statistics\n", + "\n", + "[](https://github.com/TeamCOMPAS/COMPAS/blob/Documentation/COMPAS_Documentation.pdf)\n", + "\n", + "[//]: ## (Outline features)\n", + "COMPAS is a publicly available rapid binary population synthesis code (https://compas.science/) that is designed so that evolution prescriptions and model parameters are easily \n", + "adjustable. COMPAS draws properties for a binary star system from a set of initial distributions, and evolves it from zero-age main sequence to the end of its life as two compact \n", + "remnants. It has been used for inference from observations of gravitational-wave mergers, Galactic neutron stars, X-ray binaries, and luminous red novae.\n", + "\n", + "## Documentation\n", + "https://compas.science/docs\n", + "\n", + "## Contact\n", + "Please email your queries to compas-user@googlegroups.com. You are also welcome to join the [COMPAS User Google Group](https://groups.google.com/forum/#!members/compas-user) to engage in discussions with COMPAS users and developers.\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "## Example of additional excersizes\n", + "\n", + "If you are interested, you can download the COMPAS code from Github and do any of the following excersizes: \n", + "\n", + "\n", + "1). Try to run any of the demos that are provided (I recommend the Chirp mass distribution demo, and/or the detailed evolution demo)\n", + "\n", + "2.) Try to use the code, and the data above, to plot a detailed evolution plot of a CHE BBH. \n", + "\n", + "3.) Run a larger COMPAS simulation with your own favorite settings, compare this to the data given in this demo. \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f54328e3", + "metadata": {}, + "outputs": [], + "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.7.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/courses/course-for-prof-Mandel/CHE_paper.pdf b/courses/course-for-prof-Mandel/CHE_paper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c1db10043f2dc720f207cdc97ed84d0eaad0052a Binary files /dev/null and b/courses/course-for-prof-Mandel/CHE_paper.pdf differ diff --git a/courses/course-for-prof-Mandel/COMPAS_Documentation.pdf b/courses/course-for-prof-Mandel/COMPAS_Documentation.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9b4232f7bd553bec68ec103d5bbad3a4d3ee38b1 Binary files /dev/null and b/courses/course-for-prof-Mandel/COMPAS_Documentation.pdf differ diff --git a/courses/course-for-prof-Mandel/ClassCOMPAS.py b/courses/course-for-prof-Mandel/ClassCOMPAS.py new file mode 100644 index 0000000000000000000000000000000000000000..7f87016cfce6bceeec78c65cc4eafb85f23bd307 --- /dev/null +++ b/courses/course-for-prof-Mandel/ClassCOMPAS.py @@ -0,0 +1,396 @@ +#!/usr/bin/env python3 +import numpy as np +import h5py as h5 +import os +import totalMassEvolvedPerZ as MPZ +import astropy.units as u + +class COMPASData(object): + def __init__( + self, + path=None, + lazyData=True, + Mlower=None, + Mupper=None, + m2_min=None, + binaryFraction=None, + suppress_reminder=False, + ): + self.path = path + if self.path is None: + print("Template COMPASData object created with no data path") + elif not os.path.isfile(path): + raise ValueError( "h5 file not found. Wrong path given? {}".format(path)) + + # Crucial values to be able to calculate MSSFR + self.metallicityGrid = None + self.metallicitySystems = None + self.delayTimes = None # Myr + # Crucial values I need for selection effects + self.mass1 = None # Msun + self.mass2 = None # Msun + self.DCOmask = None + self.allTypesMask = None + self.BBHmask = None + self.DNSmask = None + self.BHNSmask = None + self.CHE_mask = None + self.CHE_BBHmask = None + self.NonCHE_BBHmask = None + self.initialZ = None + self.sw_weights = None + self.n_systems = None + + # Additional arrays that might be nice to store + # to more quickly make some plots. + # If you need more memory might help a tiny bit to not do + self.lazyData = lazyData + self.mChirp = None # Msun + self.q = None + self.optimisticmask = None + + # Needed to recover true solar mass evolved + self.Mlower = Mlower # Msun + self.Mupper = Mupper # Msun + self.m2_min = m2_min # Msun + self.binaryFraction = binaryFraction + self.totalMassEvolvedPerZ = None # Msun + self.mass_evolved_per_binary = None # Msun + + if not suppress_reminder: + print("ClassCOMPAS: Remember to self.setCOMPASDCOmask()") + print(" then self.setCOMPASData()") + print(" and optionally self.setGridAndMassEvolved() if using a metallicity grid") + + def setCOMPASDCOmask( + self, types="BBH", withinHubbleTime=True, pessimistic=True, noRLOFafterCEE=True + ): + # By default, we mask for BBHs that merge within a Hubble time, assumming + # the pessimistic CEE prescription (HG donors cannot survive a CEE) and + # not allowing immediate RLOF post-CEE + + stellar_type_1, stellar_type_2, hubble_flag, dco_seeds = \ + self.get_COMPAS_variables("DoubleCompactObjects", ["Stellar_Type_1", "Stellar_Type_2", "Merges_Hubble_Time", "SEED"]) + + if types == "CHE_BBH" or types == "NON_CHE_BBH": + stellar_type_1_zams, stellar_type_2_zams, che_ms_1, che_ms_2, sys_seeds = \ + self.get_COMPAS_variables("SystemParameters", ["Stellar_Type@ZAMS_1", "Stellar_Type@ZAMS_2", "CH_on_MS_1", "CH_on_MS_2", "SEED"]) + + che_mask = np.logical_and.reduce((stellar_type_1_zams == 16, stellar_type_2_zams == 16, che_ms_1 == True, che_ms_2 == True)) + che_seeds = sys_seeds[()][che_mask] + + self.CHE_mask = np.in1d(dco_seeds, che_seeds) if types == "CHE_BBH" or types == "NON_CHE_BBH" else np.repeat(False, len(dco_seeds)) + + # if user wants to mask on Hubble time use the flag, otherwise just set all to True + hubble_mask = hubble_flag.astype(bool) if withinHubbleTime else np.repeat(True, len(dco_seeds)) + + # mask on stellar types (where 14=BH and 13=NS), BHNS can be BHNS or NSBH + type_masks = { + "all": np.repeat(True, len(dco_seeds)), + "BBH": np.logical_and(stellar_type_1 == 14, stellar_type_2 == 14), + "BHNS": np.logical_or(np.logical_and(stellar_type_1 == 14, stellar_type_2 == 13), np.logical_and(stellar_type_1 == 13, stellar_type_2 == 14)), + "BNS": np.logical_and(stellar_type_1 == 13, stellar_type_2 == 13), + } + type_masks["CHE_BBH"] = np.logical_and(self.CHE_mask, type_masks["BBH"]) if types == "CHE_BBH" else np.repeat(False, len(dco_seeds)) + type_masks["NON_CHE_BBH"] = np.logical_and(np.logical_not(self.CHE_mask), type_masks["BBH"]) if types == "NON_CHE_BBH" else np.repeat(True, len(dco_seeds)) + + # if the user wants to make RLOF or optimistic CEs + if noRLOFafterCEE or pessimistic: + + # get the flags and unique seeds from the Common Envelopes file + ce_seeds = self.get_COMPAS_variables("BSE_Common_Envelopes", "SEED") + dco_from_ce = np.in1d(ce_seeds, dco_seeds) + dco_ce_seeds = ce_seeds[dco_from_ce] + + # if masking on RLOF, get flag and match seeds to dco seeds + if noRLOFafterCEE: + rlof_flag = self.get_COMPAS_variables("BSE_Common_Envelopes", "Immediate_RLOF>CE")[dco_from_ce].astype(bool) + rlof_seeds = np.unique(dco_ce_seeds[rlof_flag]) + rlof_mask = np.logical_not(np.in1d(dco_seeds, rlof_seeds)) + else: + rlof_mask = np.repeat(True, len(dco_seeds)) + + # if masking on pessimistic CE, get flag and match seeds to dco seeds + if pessimistic: + pessimistic_flag = self.get_COMPAS_variables("BSE_Common_Envelopes", "Optimistic_CE")[dco_from_ce].astype(bool) + pessimistic_seeds = np.unique(dco_ce_seeds[pessimistic_flag]) + pessimistic_mask = np.logical_not(np.in1d(dco_seeds, pessimistic_seeds)) + else: + pessimistic_mask = np.repeat(True, len(dco_seeds)) + else: + rlof_mask = np.repeat(True, len(dco_seeds)) + pessimistic_mask = np.repeat(True, len(dco_seeds)) + + # create a mask for each dco type supplied + self.DCOmask = type_masks[types] * hubble_mask * rlof_mask * pessimistic_mask + self.BBHmask = type_masks["BBH"] * hubble_mask * rlof_mask * pessimistic_mask + self.BHNSmask = type_masks["BHNS"] * hubble_mask * rlof_mask * pessimistic_mask + self.DNSmask = type_masks["BNS"] * hubble_mask * rlof_mask * pessimistic_mask + self.CHE_BBHmask = type_masks["CHE_BBH"] * hubble_mask * rlof_mask * pessimistic_mask + self.NonCHE_BBHmask = type_masks["NON_CHE_BBH"] * hubble_mask * rlof_mask * pessimistic_mask + self.allTypesMask = type_masks["all"] * hubble_mask * rlof_mask * pessimistic_mask + self.optimisticmask = pessimistic_mask + + def setGridAndMassEvolved(self): + # The COMPAS simulation does not evolve all stars + # give me the correction factor for the total mass evolved + # I assume each metallicity has the same limits, and does correction + # factor, but the total mass evolved might be different. + # This does not change when we change types and other masks this is + # general to the entire simulation so calculate once + _, self.totalMassEvolvedPerZ = MPZ.totalMassEvolvedPerZ( + path=self.path, + Mlower=self.Mlower, + Mupper=self.Mupper, + binaryFraction=self.binaryFraction, + ) + # Want to recover entire metallicity grid, assume that every metallicity + # evolved shows in all systems again should not change within same run + # so dont redo if we reset the data + Data = h5.File(self.path, "r") + if self.initialZ is None: + self.initialZ = Data["SystemParameters"]["Metallicity@ZAMS_1"][()] + self.metallicityGrid = np.unique(self.initialZ) + Data.close() + + def setCOMPASData(self): + + primary_masses, secondary_masses, formation_times, coalescence_times, dco_seeds = \ + self.get_COMPAS_variables("DoubleCompactObjects", ["Mass_1", "Mass_2", "Time", "Coalescence_Time", "SEED"]) + + initial_seeds, initial_Z = self.get_COMPAS_variables("SystemParameters", ["SEED", "Metallicity@ZAMS_1"]) + + # Get metallicity grid of DCOs + self.seedsDCO = dco_seeds[self.DCOmask] + if self.initialZ is None: + self.initialZ = initial_Z + maskMetallicity = np.in1d(initial_seeds, self.seedsDCO) + self.metallicitySystems = self.initialZ[maskMetallicity] + self.n_systems = len(initial_seeds) + + self.delayTimes = np.add(formation_times[self.DCOmask], coalescence_times[self.DCOmask]) + self.mass1 = primary_masses[self.DCOmask] + self.mass2 = secondary_masses[self.DCOmask] + + # Stuff of data I dont need for integral + # but I might be to laze to read in myself + # and often use. Might turn it of for memory efficiency + if self.lazyData: + self.q = np.divide(self.mass2, self.mass1) + boolq = self.mass2 > self.mass1 + self.q[boolq] = np.divide(self.mass1[boolq], self.mass2[boolq]) + self.mChirp = np.divide( + (np.multiply(self.mass2, self.mass1) ** (3.0 / 5.0)), + (np.add(self.mass2, self.mass1) ** (1.0 / 5.0)), + ) + self.Hubble = self.get_COMPAS_variables("DoubleCompactObjects", "Merges_Hubble_Time")[self.DCOmask] + + def recalculateTrueSolarMassEvolved(self, Mlower, Mupper, binaryFraction): + # Possibility to test assumptions of True solar mass evolved + self.Mlower = Mlower + self.Mupper = Mupper + self.binaryFraction = binaryFraction + _, self.totalMassEvolvedPerZ = MPZ.totalMassEvolvedPerZ( + pathCOMPASh5=self.path, + Mlower=self.Mlower, + Mupper=self.Mupper, + binaryFraction=self.binaryFraction, + ) + + def get_COMPAS_variables(self, hdf5_file, var_names): + """ + Get a variable or variables from a COMPAS file + Args: + hdf5_file --> [string] Name of HDF5 subfile (e.g. "DoubleCompactObjects") + var_names --> [string or string list] A variable name or list of variables names to return + Returns: + var_list --> [list of lists] A list of variables (or a single variable if only one name supplied) + """ + # open the COMPAS file + with h5.File(self.path, "r") as compas_file: + # if the list is only a string (i.e. one variable) then don't return a list + if isinstance(var_names, str): + return compas_file[hdf5_file][var_names][...].squeeze() + # else return each variable in a list + else: + return [compas_file[hdf5_file][var_name][...].squeeze() for var_name in var_names] + + def set_sw_weights(self, column_name): + """ Set STROOPWAFEL adaptive sampling weights given a column name in the DoubleCompactObjects file """ + if column_name is not None: + self.sw_weights = self.get_COMPAS_variables("DoubleCompactObjects", column_name)[self.DCOmask] + + def find_star_forming_mass_per_binary_sampling(self, m1=0.01, m2=0.08, m3=0.5, m4=200.0, a12=0.3, a23=1.3, a34=2.3, + primary_mass_inverse_CDF=None, mass_ratio_inverse_CDF=None, SAMPLES=20000000): + """ + Calculate the star forming mass evolved for each binary in the file. + This function does this by sampling from the IMF and mass ratio distributions + Args: + mi --> [float] masses at which to transition the slope of the IMF (ignored if primary_mass_inverse_CDF is not None) + aij --> [float] slope of the IMF between mi and mj (ignored if primary_mass_inverse_CDF is not None) + primary_mass_inverse_CDF --> [function] a function that computes the inverse CDF functoin for the primary mass distribution + this defaults to the Kroupa IMF (which can be varied using mi, aij) + mass_ratio_inverse_CDF --> [function] a function that computes the inverse CDF function for the mass ratio distribution + this defaults to assuming a uniform mass ratio on [0, 1] + SAMPLES --> [int] number of samples to draw when creating a mock universe + """ + # if primary mass inverse CDF is None, assume the Kroupa IMF + if primary_mass_inverse_CDF is None: + primary_mass_inverse_CDF = lambda U: inverse_CDF_IMF(U, m1=m1, m2=m2, m3=m3, m4=m4, a12=a12, a23=a23, a34=a34) + + # if mass ratio inverse CDF function is None, assume uniform + if mass_ratio_inverse_CDF is None: + mass_ratio_inverse_CDF = lambda q: q + + # randomly sample a large number of masses from IMF, mass ratios from supplied function, binary for boolean + primary_mass = primary_mass_inverse_CDF(np.random.rand(SAMPLES)) * u.Msun + mass_ratio = mass_ratio_inverse_CDF(np.random.rand(SAMPLES)) + binary = np.random.rand(SAMPLES) + + # only fbin fraction of stars have a secondary (in a binary) + binary_mask = binary < self.binaryFraction + + # assign each a random secondary mass, default 0 because single stars have m2=0 (surprisingly :P) + secondary_mass = np.zeros(SAMPLES) * u.Msun + secondary_mass[binary_mask] = primary_mass[binary_mask] * mass_ratio[binary_mask] + + # find the total mass of the whole population + total_mass = np.sum(primary_mass) + np.sum(secondary_mass) + + # apply the COMPAS cuts on primary and secondary mass + primary_mask = np.logical_and(primary_mass >= self.Mlower, primary_mass <= self.Mupper) + secondary_mask = secondary_mass > self.m2_min + full_mask = np.logical_and(primary_mask, secondary_mask) + + # find the total mass with COMPAS cuts + total_mass_COMPAS = np.sum(primary_mass[full_mask]) + np.sum(secondary_mass[full_mask]) + + # use the totals to find the ratio and return the average mass as well + f_mass_sampled = total_mass_COMPAS / total_mass + average_mass_COMPAS = total_mass_COMPAS / len(primary_mass[full_mask]) + + # find the average star forming mass evolved per binary in the Universe + self.mass_evolved_per_binary = average_mass_COMPAS / f_mass_sampled + +# ============================================== # +# Initial Mass Function PDF, CDF and inverse CDF # +# ============================================== # + +def IMF(m, m1=0.01, m2=0.08, m3=0.5, m4=200.0, a12=0.3, a23=1.3, a34=2.3): + """ + Calculate the fraction of stellar mass between m and m + dm for a three part broken power law. + Default values follow Kroupa (2001) + zeta(m) ~ m^(-a_ij) + + Args: + m --> [float, list of floats] mass or masses at which to evaluate + mi --> [float] masses at which to transition the slope + aij --> [float] slope of the IMF between mi and mj + + Returns: + zeta(m) --> [float, list of floats] value or values of the IMF at m + """ + # calculate normalisation constants that ensure the IMF is continuous + b1 = 1 / ( + (m2**(1 - a12) - m1**(1 - a12)) / (1 - a12) \ + + m2**(-(a12 - a23)) * (m3**(1 - a23) - m2**(1 - a23)) / (1 - a23) \ + + m2**(-(a12 - a23)) * m3**(-(a23 - a34)) * (m4**(1 - a34) - m3**(1 - a34)) / (1 - a34) + ) + b2 = b1 * m2**(-(a12 - a23)) + b3 = b2 * m3**(-(a23 - a34)) + + # evaluate IMF either at a point or for a list of points + if isinstance(m, float): + if m < m1: + return 0 + elif m < m2: + return b1 * m**(-a12) + elif m < m3: + return b2 * m**(-a23) + elif m < m4: + return b3 * m**(-a34) + else: + return 0 + else: + imf_vals = np.zeros(len(m)) + imf_vals[np.logical_and(m >= m1, m < m2)] = b1 * m[np.logical_and(m >= m1, m < m2)]**(-a12) + imf_vals[np.logical_and(m >= m2, m < m3)] = b2 * m[np.logical_and(m >= m2, m < m3)]**(-a23) + imf_vals[np.logical_and(m >= m3, m < m4)] = b3 * m[np.logical_and(m >= m3, m < m4)]**(-a34) + return imf_vals + +def CDF_IMF(m, m1=0.01, m2=0.08, m3=0.5, m4=200.0, a12=0.3, a23=1.3, a34=2.3): + """ + Calculate the fraction of stellar mass between 0 and m for a three part broken power law. + Default values follow Kroupa (2001) + F(m) ~ int_0^m zeta(m) dm + + Args: + m --> [float, list of floats] mass or masses at which to evaluate + mi --> [float] masses at which to transition the slope + aij --> [float] slope of the IMF between mi and mj + + Returns: + zeta(m) --> [float, list of floats] value or values of the IMF at m + NOTE: this is implemented recursively, probably not the most efficient if you're using this + intensively but I'm not and it looks prettier so I'm being lazy ¯\_(ツ)_/¯ + """ + + # calculate normalisation constants that ensure the IMF is continuous + b1 = 1 / ( + (m2**(1 - a12) - m1**(1 - a12)) / (1 - a12) \ + + m2**(-(a12 - a23)) * (m3**(1 - a23) - m2**(1 - a23)) / (1 - a23) \ + + m2**(-(a12 - a23)) * m3**(-(a23 - a34)) * (m4**(1 - a34) - m3**(1 - a34)) / (1 - a34) + ) + b2 = b1 * m2**(-(a12 - a23)) + b3 = b2 * m3**(-(a23 - a34)) + + if isinstance(m, float): + if m <= m1: + return 0 + elif m <= m2: + return b1 / (1 - a12) * (m**(1 - a12) - m1**(1 - a12)) + elif m <= m3: + return CDF_IMF(m2) + b2 / (1 - a23) * (m**(1 - a23) - m2**(1 - a23)) + elif m <= m4: + return CDF_IMF(m3) + b3 / (1 - a34) * (m**(1 - a34) - m3**(1 - a34)) + else: + return 0 + else: + CDF = np.zeros(len(m)) + CDF[np.logical_and(m >= m1, m < m2)] = b1 / (1 - a12) * (m[np.logical_and(m >= m1, m < m2)]**(1 - a12) - m1**(1 - a12)) + CDF[np.logical_and(m >= m2, m < m3)] = CDF_IMF(m2) + b2 / (1 - a23) * (m[np.logical_and(m >= m2, m < m3)]**(1 - a23) - m2**(1 - a23)) + CDF[np.logical_and(m >= m3, m < m4)] = CDF_IMF(m3) + b3 / (1 - a34) * (m[np.logical_and(m >= m3, m < m4)]**(1 - a34) - m3**(1 - a34)) + CDF[m >= m4] = np.ones(len(m[m >= m4])) + return CDF + +def inverse_CDF_IMF(U, m1=0.01, m2=0.08, m3=0.5, m4=200, a12=0.3, a23=1.3, a34=2.3): + """ + Calculate the inverse CDF for a three part broken power law. + Default values follow Kroupa (2001) + + Args: + U --> [float, list of floats] A uniform random variable on [0, 1] + mi --> [float] masses at which to transition the slope + aij --> [float] slope of the IMF between mi and mj + + Returns: + zeta(m) --> [float, list of floats] value or values of the IMF at m + NOTE: this is implemented recursively, probably not the most efficient if you're using this intensively but I'm not so I'm being lazy ¯\_(ツ)_/¯ + """ + # calculate normalisation constants that ensure the IMF is continuous + b1 = 1 / ( + (m2**(1 - a12) - m1**(1 - a12)) / (1 - a12) \ + + m2**(-(a12 - a23)) * (m3**(1 - a23) - m2**(1 - a23)) / (1 - a23) \ + + m2**(-(a12 - a23)) * m3**(-(a23 - a34)) * (m4**(1 - a34) - m3**(1 - a34)) / (1 - a34) + ) + b2 = b1 * m2**(-(a12 - a23)) + b3 = b2 * m3**(-(a23 - a34)) + + # find the probabilities at which the gradient changes + F1, F2, F3, F4 = CDF_IMF(np.array([m1, m2, m3, m4]), m1=0.01, m2=0.08, m3=0.5, m4=200, a12=0.3, a23=1.3, a34=2.3) + + masses = np.zeros(len(U)) + masses[np.logical_and(U > F1, U <= F2)] = np.power((1 - a12) / b1 * (U[np.logical_and(U > F1, U <= F2)] - F1) + m1**(1 - a12), 1 / (1 - a12)) + masses[np.logical_and(U > F2, U <= F3)] = np.power((1 - a23) / b2 * (U[np.logical_and(U > F2, U <= F3)] - F2) + m2**(1 - a23), 1 / (1 - a23)) + masses[np.logical_and(U > F3, U <= F4)] = np.power((1 - a34) / b3 * (U[np.logical_and(U > F3, U <= F4)] - F3) + m3**(1 - a34), 1 / (1 - a34)) + return masses \ No newline at end of file diff --git a/courses/course-for-prof-Mandel/FastCosmicIntegration.py b/courses/course-for-prof-Mandel/FastCosmicIntegration.py new file mode 100644 index 0000000000000000000000000000000000000000..7487aab46c192824682b1408824e97aa0af4662d --- /dev/null +++ b/courses/course-for-prof-Mandel/FastCosmicIntegration.py @@ -0,0 +1,783 @@ +import numpy as np +import h5py as h5 +import os +import time +import matplotlib.pyplot as plt +from astropy.cosmology import WMAP9 as cosmology +import scipy +from scipy.interpolate import interp1d +from scipy.stats import norm as NormDist +import ClassCOMPAS +import selection_effects +import warnings +import astropy.units as u +import argparse + +def calculate_redshift_related_params(max_redshift=10.0, max_redshift_detection=1.0, redshift_step=0.001, z_first_SF = 10.0): + """ + Given limits on the redshift, create an array of redshifts, times, distances and volumes + Args: + max_redshift --> [float] Maximum redshift to use for calculations + max_redshift_detection --> [float] Maximum redshift to calculate detection rates (must be <= max_redshift) + redshift_step --> [float] size of step to take in redshift + z_first_SF --> [float] redshift of first star formation + Returns: + redshifts --> [list of floats] List of redshifts between limits supplied + n_redshifts_detection --> [int] Number of redshifts in list that should be used to calculate detection rates + times --> [list of floats] Equivalent of redshifts but converted to age of Universe + distances --> [list of floats] Equivalent of redshifts but converted to luminosity distances + shell_volumes --> [list of floats] Equivalent of redshifts but converted to shell volumes + """ + # create a list of redshifts and record lengths + redshifts = np.arange(0, max_redshift + redshift_step, redshift_step) + n_redshifts_detection = int(max_redshift_detection / redshift_step) + + # convert redshifts to times and ensure all times are in Myr + times = cosmology.age(redshifts).to(u.Myr).value + + # and time of first Sf + time_first_SF = cosmology.age(z_first_SF).to(u.Myr).value + + # convert redshifts to distances and ensure all distances are in Mpc (also avoid D=0 because division by 0) + distances = cosmology.luminosity_distance(redshifts).to(u.Mpc).value + distances[0] = 0.001 + + # convert redshifts to volumnes and ensure all volumes are in Gpc^3 + volumes = cosmology.comoving_volume(redshifts).to(u.Gpc**3).value + + # split volumes into shells and duplicate last shell to keep same length + shell_volumes = np.diff(volumes) + shell_volumes = np.append(shell_volumes, shell_volumes[-1]) + + return redshifts, n_redshifts_detection, times, time_first_SF, distances, shell_volumes + + +def find_sfr(redshifts, a = 0.01, b =2.77, c = 2.90, d = 4.70): + """ + Calculate the star forming mass per unit volume per year following + Neijssel+19 Eq. 6, using functional form of Madau & Dickinson 2014 + Args: + redshifts --> [list of floats] List of redshifts at which to evaluate the sfr + Returns: + sfr --> [list of floats] Star forming mass per unit volume per year for each redshift + """ + # get value in mass per year per cubic Mpc and convert to per cubic Gpc then return + sfr = a * ((1+redshifts)**b) / (1 + ((1+redshifts)/c)**d) * u.Msun / u.yr / u.Mpc**3 + return sfr.to(u.Msun / u.yr / u.Gpc**3).value + + +def find_metallicity_distribution(redshifts, min_logZ_COMPAS, max_logZ_COMPAS, + mu0=0.035, muz=-0.23, sigma_0=0.39, sigma_z=0.0, alpha =0.0, + min_logZ =-12.0, max_logZ =0.0, step_logZ = 0.01): + + """ + Calculate the distribution of metallicities at different redshifts using a log skew normal distribution + the log-normal distribution is a special case of this log skew normal distribution distribution, and is retrieved by setting + the skewness to zero (alpha = 0). + Based on the method in Neijssel+19. Default values of mu0=0.035, muz=-0.23, sigma_0=0.39, sigma_z=0.0, alpha =0.0, + retrieve the dP/dZ distribution used in Neijssel+19 + NOTE: This assumes that metallicities in COMPAS are drawn from a flat in log distribution! + Args: + max_redshift --> [float] max redshift for calculation + redshift_step --> [float] step used in redshift calculation + min_logZ_COMPAS --> [float] Minimum logZ value that COMPAS samples + max_logZ_COMPAS --> [float] Maximum logZ value that COMPAS samples + + mu0 = 0.035 --> [float] location (mean in normal) at redshift 0 + muz = -0.25 --> [float] redshift scaling/evolution of the location + sigma_0 = 0.39 --> [float] Scale (variance in normal) at redshift 0 + sigma_z = 0.00 --> [float] redshift scaling of the scale (variance in normal) + alpha = 0.00 --> [float] shape (skewness, alpha = 0 retrieves normal dist) + min_logZ --> [float] Minimum logZ at which to calculate dPdlogZ (influences normalization) + max_logZ --> [float] Maximum logZ at which to calculate dPdlogZ (influences normalization) + step_logZ --> [float] Size of logZ steps to take in finding a Z range + Returns: + dPdlogZ --> [2D float array] Probability of getting a particular logZ at a certain redshift + metallicities --> [list of floats] Metallicities at which dPdlogZ is evaluated + p_draw_metallicity --> float Probability of drawing a certain metallicity in COMPAS (float because assuming uniform) + """ + ################################## + # Log-Linear redshift dependence of sigma + sigma = sigma_0* 10**(sigma_z*redshifts) + + ################################## + # Follow Langer & Norman 2007? in assuming that mean metallicities evolve in z as: + mean_metallicities = mu0 * 10**(muz * redshifts) + + # Now we re-write the expected value of ou log-skew-normal to retrieve mu + beta = alpha/(np.sqrt(1 + (alpha)**2)) + PHI = NormDist.cdf(beta * sigma) + mu_metallicities = np.log(mean_metallicities/2. * 1./(np.exp(0.5*sigma**2) * PHI ) ) + + ################################## + # create a range of metallicities (thex-values, or random variables) + log_metallicities = np.arange(min_logZ, max_logZ + step_logZ, step_logZ) + metallicities = np.exp(log_metallicities) + + + ################################## + # probabilities of log-skew-normal (without the factor of 1/Z since this is dp/dlogZ not dp/dZ) + dPdlogZ = 2./(sigma[:,np.newaxis]) * NormDist.pdf((log_metallicities - mu_metallicities[:,np.newaxis])/sigma[:,np.newaxis]) * NormDist.cdf(alpha * (log_metallicities - mu_metallicities[:,np.newaxis])/sigma[:,np.newaxis] ) + + ################################## + # normalise the distribution over al metallicities + norm = dPdlogZ.sum(axis=-1) * step_logZ + dPdlogZ = dPdlogZ /norm[:,np.newaxis] + + ################################## + # assume a flat in log distribution in metallicity to find probability of drawing Z in COMPAS + p_draw_metallicity = 1 / (max_logZ_COMPAS - min_logZ_COMPAS) + + return dPdlogZ, metallicities, p_draw_metallicity + + + + +def find_formation_and_merger_rates(n_binaries, redshifts, times, time_first_SF, n_formed, dPdlogZ, metallicities, p_draw_metallicity, + COMPAS_metallicites, COMPAS_delay_times, COMPAS_weights=None): + """ + Find both the formation and merger rates for each binary at each redshift + Args: + n_binaries --> [int] Number of DCO binaries in the arrays + redshifts --> [list of floats] Redshifts at which to evaluate the rates + times --> [list of floats] Equivalent of the redshifts in terms of age of the Universe + n_formed --> [float] Binary formation rate (number of binaries formed per year per cubic Gpc) represented by each simulated COMPAS binary + dPdlogZ --> [2D float array] Probability of getting a particular logZ at a certain redshift + metallicities --> [list of floats] Metallicities at which dPdlogZ is evaluated + p_draw_metallicity --> [float] Probability of drawing a certain metallicity in COMPAS (float because assuming uniform) + COMPAS_metallicites --> [list of floats] Metallicity of each binary in COMPAS data + COMPAS_delay_times --> [list of floats] Delay time of each binary in COMPAS data + COMPAS_weights --> [list of floats] Adaptive sampling weights for each binary in COMPAS data (defaults to all 1s for unweighted samples) + Returns: + formation_rate --> [2D float array] Formation rate for each binary at each redshift + merger_rate --> [2D float array] Merger rate for each binary at each redshift + """ + # check if weights were provided, if not use uniform weights + if COMPAS_weights is None: + COMPAS_weights = np.ones(n_binaries) + + # initalise rates to zero + n_redshifts = len(redshifts) + redshift_step = redshifts[1] - redshifts[0] + formation_rate = np.zeros(shape=(n_binaries, n_redshifts)) + merger_rate = np.zeros(shape=(n_binaries, n_redshifts)) + + # interpolate times and redshifts for conversion + times_to_redshifts = interp1d(times, redshifts) + + # make note of the first time at which star formation occured + age_first_sfr = time_first_SF + + # go through each binary in the COMPAS data + for i in range(n_binaries): + # calculate formation rate (see Neijssel+19 Section 4) - note this uses dPdlogZ for *closest* metallicity + formation_rate[i, :] = n_formed * dPdlogZ[:, np.digitize(COMPAS_metallicites[i], metallicities)] / p_draw_metallicity * COMPAS_weights[i] + + # calculate the time at which the binary formed if it merges at this redshift + time_of_formation = times - COMPAS_delay_times[i] + + # we have only calculated formation rate up to z=max(redshifts), so we need to only find merger rates for formation times at z<max(redshifts) + # first locate the index above which the binary would have formed before z=max(redshifts) + first_too_early_index = np.digitize(age_first_sfr, time_of_formation) + + # include the whole array if digitize returns end of array and subtract one so we don't include the time past the limit + first_too_early_index = first_too_early_index + 1 if first_too_early_index == n_redshifts else first_too_early_index + + # as long as that doesn't preclude the whole range + if first_too_early_index > 0: + # work out the redshift at the time of formation + z_of_formation = times_to_redshifts(time_of_formation[:first_too_early_index - 1]) + + # calculate which index in the redshift array these redshifts correspond to + z_of_formation_index = np.ceil(z_of_formation / redshift_step).astype(int) + + # set the merger rate at z (with z<10) to the formation rate at z_form + merger_rate[i, :first_too_early_index - 1] = formation_rate[i, z_of_formation_index] + return formation_rate, merger_rate + +def compute_snr_and_detection_grids(sensitivity="O1", snr_threshold=8.0, Mc_max=300.0, Mc_step=0.1, + eta_max=0.25, eta_step=0.01, snr_max=1000.0, snr_step=0.1): + """ + Compute a grid of SNRs and detection probabilities for a range of masses and SNRs + These grids are computed to allow for interpolating the values of the snr and detection probability. This function + combined with find_detection_probability() could be replaced by something like + for i in range(n_binaries): + detection_probability = selection_effects.detection_probability(COMPAS.mass1[i],COMPAS.mass2[i], + redshifts, distances, GWdetector_snr_threshold, GWdetector_sensitivity) + if runtime was not important. + Args: + sensitivity --> [string] Which detector sensitivity to use: one of ["design", "O1", "O3"] + snr_threshold --> [float] What SNR threshold required for a detection + Mc_max --> [float] Maximum chirp mass in grid + Mc_step --> [float] Step in chirp mass to use in grid + eta_max --> [float] Maximum symmetric mass ratio in grid + eta_step --> [float] Step in symmetric mass ratio to use in grid + snr_max --> [float] Maximum snr in grid + snr_step --> [float] Step in snr to use in grid + Returns: + snr_grid_at_1Mpc --> [2D float array] The snr of a binary with masses (Mc, eta) at a distance of 1 Mpc + detection_probability_from_snr --> [list of floats] A list of detection probabilities for different SNRs + """ + # get interpolator given sensitivity + interpolator = selection_effects.SNRinterpolator(sensitivity) + + # create chirp mass and eta arrays + Mc_array = np.arange(Mc_step, Mc_max + Mc_step, Mc_step) + eta_array = np.arange(eta_step, eta_max + eta_step, eta_step) + + # convert to total, primary and secondary mass arrays + Mt_array = Mc_array / eta_array[:,np.newaxis]**0.6 + M1_array = Mt_array * 0.5 * (1. + np.sqrt(1. - 4 * eta_array[:,np.newaxis])) + M2_array = Mt_array - M1_array + + # interpolate to get snr values if binary was at 1Mpc + snr_grid_at_1Mpc = interpolator(M1_array, M2_array) + + # precompute a grid of detection probabilities as a function of snr + snr_array = np.arange(snr_step, snr_max + snr_step, snr_step) + detection_probability_from_snr = selection_effects.detection_probability_from_snr(snr_array, snr_threshold) + + return snr_grid_at_1Mpc, detection_probability_from_snr + +def find_detection_probability(Mc, eta, redshifts, distances, n_redshifts_detection, n_binaries, snr_grid_at_1Mpc, detection_probability_from_snr, + Mc_step=0.1, eta_step=0.01, snr_step=0.1): + """ + Compute the detection probability given a grid of SNRs and detection probabilities with masses + Args: + Mc --> [list of floats] Chirp mass of binaries in COMPAS + eta --> [list of floats] Symmetric mass ratios of binaries in COMPAS + redshifts --> [list of floats] List of redshifts + distances --> [list of floats] List of distances corresponding to redshifts + n_redshifts_detection --> [int] Index (in redshifts) to which we evaluate detection probability + n_binaries --> [int] Number of merging binaries in the COMPAS file + snr_grid_at_1Mpc --> [2D float array] The snr of a binary with masses (Mc, eta) at a distance of 1 Mpc + detection_probability_from_snr --> [list of floats] A list of detection probabilities for different SNRs + Mc_step --> [float] Step in chirp mass to use in grid + eta_step --> [float] Step in symmetric mass ratio to use in grid + snr_step --> [float] Step in snr to use in grid + """ + # by default, set detection probability to one + detection_probability = np.ones(shape=(n_binaries, n_redshifts_detection)) + + # for each binary in the COMPAS file + for i in range(n_binaries): + # shift frames for the chirp mass + Mc_shifted = Mc[i] * (1 + redshifts[:n_redshifts_detection]) + + # work out the closest index to the given values of eta and Mc + eta_index = np.round(eta[i] / eta_step).astype(int) - 1 + Mc_index = np.round(Mc_shifted / Mc_step).astype(int) - 1 + + # lookup values for the snr (but make sure you don't go over the top of the array) + snrs = np.ones(n_redshifts_detection) * 0.00001 + Mc_below_max = Mc_index < snr_grid_at_1Mpc.shape[1] + snrs[Mc_below_max] = snr_grid_at_1Mpc[eta_index, Mc_index[Mc_below_max]] + + # convert these snr values to the correct distances + snrs = snrs / distances[:n_redshifts_detection] + + # lookup values for the detection probability (but make sure you don't go over the top of the array) + detection_list_index = np.round(snrs / snr_step).astype(int) - 1 + snr_below_max = detection_list_index < len(detection_probability_from_snr) + snr_below_min = detection_list_index < 0 + + # remember we set probability = 1 by default? Because if we don't set it here, we have snr > max snr + # which is 1000 by default, meaning very detectable + detection_probability[i, snr_below_max] = detection_probability_from_snr[detection_list_index[snr_below_max]] + #on the other hand, if SNR is too low, the detection probability is effectively zero + detection_probability[i, snr_below_min] = 0 + + return detection_probability + +def find_detection_rate(path, dco_type="BBH", weight_column=None, + merges_hubble_time=True, pessimistic_CEE=False, no_RLOF_after_CEE=False, + max_redshift=10.0, max_redshift_detection=1.0, redshift_step=0.001, z_first_SF = 10, + m1_min=5 * u.Msun, m1_max=150 * u.Msun, m2_min=0.1 * u.Msun, fbin=0.7, + aSF = 0.01, bSF = 2.77, cSF = 2.90, dSF = 4.70, + mu0=0.035, muz=-0.23, sigma0=0.39,sigmaz=0., alpha=0.0, + min_logZ=-12.0, max_logZ=0.0, step_logZ=0.01, + sensitivity="O1", snr_threshold=8, + Mc_max=300.0, Mc_step=0.1, eta_max=0.25, eta_step=0.01, + snr_max=1000.0, snr_step=0.1): + """ + The main function of this file. Finds the detection rate, formation rate and merger rate for each + binary in a COMPAS file at a series of redshifts defined by intput. Also returns relevant COMPAS + data. + NOTE: This code assumes that assumes that metallicities in COMPAS are drawn from a flat in log distribution + Args: + =================================================== + == Arguments for finding and masking COMPAS file == + =================================================== + path --> [string] Path to the COMPAS data file that contains the output + dco_type --> [string] Which DCO type to calculate rates for: one of ["all", "BBH", "BHNS", "BNS", "BBHandCHE"] + weight_column --> [string] Name of column in "DoubleCompactObjects" file that contains adaptive sampling weights + (Leave this as None if you have unweighted samples) + merges_in_hubble_time --> [bool] whether to mask binaries that don't merge in a Hubble time + no_RLOF_after_CEE --> [bool] whether to mask binaries that have immediate RLOF after a CCE + pessimistic_CEE --> [bool] whether to mask binaries that go through Optimistic CE scenario + =========================================== + == Arguments for creating redshift array == + =========================================== + max_redshift --> [float] Maximum redshift to use in array + max_redshift_detection --> [float] Maximum redshift to calculate detection rates (must be <= max_redshift) + redshift_step --> [float] Size of step to take in redshift + ==================================================================== + == Arguments for determining star forming mass per sampled binary == + ==================================================================== + m1_min --> [float] Minimum primary mass sampled by COMPAS + m1_max --> [float] Maximum primary mass sampled by COMPAS + m2_min --> [float] Minimum secondary mass sampled by COMPAS + fbin --> [float] Binary fraction used by COMPAS + ======================================================================= + == Arguments for creating metallicity distribution and probabilities == + ======================================================================= + mu0 --> [float] metallicity dist: expected value at redshift 0 + muz --> [float] metallicity dist: redshift evolution of expected value + sigma0 --> [float] metallicity dist: width at redshhift 0 + sigmaz --> [float] metallicity dist: redshift evolution of width + alpha --> [float] metallicity dist: skewness (0 = lognormal) + min_logZ --> [float] Minimum logZ at which to calculate dPdlogZ + max_logZ --> [float] Maximum logZ at which to calculate dPdlogZ + step_logZ --> [float] Size of logZ steps to take in finding a Z range + ======================================================= + == Arguments for determining detection probabilities == + ======================================================= + sensitivity --> [string] Which detector sensitivity to use: one of ["design", "O1", "O3"] + snr_threshold --> [float] What SNR threshold required for a detection + Mc_max --> [float] Maximum chirp mass in grid + Mc_step --> [float] Step in chirp mass to use in grid + eta_max --> [float] Maximum symmetric mass ratio in grid + eta_step --> [float] Step in symmetric mass ratio to use in grid + snr_max --> [float] Maximum snr in grid + snr_step --> [float] Step in snr to use in grid + Returns: + detection_rate --> [2D float array] Detection rate for each binary at each redshift in 1/yr + formation_rate --> [2D float array] Formation rate for each binary at each redshift in 1/yr/Gpc^3 + merger_rate --> [2D float array] Merger rate for each binary at each redshift in 1/yr/Gpc^3 + redshifts --> [list of floats] List of redshifts + COMPAS --> [Object] Relevant COMPAS data in COMPASData Class + """ + + # assert that input will not produce errors + assert max_redshift_detection <= max_redshift, "Maximum detection redshift cannot be below maximum redshift" + assert m1_min <= m1_max, "Minimum sampled primary mass cannot be above maximum sampled primary mass" + assert np.logical_and(fbin >= 0.0, fbin <= 1.0), "Binary fraction must be between 0 and 1" + assert Mc_step < Mc_max, "Chirp mass step size must be less than maximum chirp mass" + assert eta_step < eta_max, "Symmetric mass ratio step size must be less than maximum symmetric mass ratio" + assert snr_step < snr_max, "SNR step size must be less than maximum SNR" + + nonnegative_args = [(max_redshift, "max_redshift"), (max_redshift_detection, "max_redshift_detection"), (m1_min.value, "m1_min"), (m1_max.value, "m1_max"), + (m2_min.value, "m2_min"), (mu0, "mu0"), (sigma0, "sigma0"), + (step_logZ, "step_logZ"), (snr_threshold, "snr_threshold"), (Mc_max, "Mc_max"), + (Mc_step, "Mc_step"), (eta_max, "eta_max"), (eta_step, "eta_step"), (snr_max, "snr_max"), (snr_step, "snr_step")] + + + for arg, arg_str in nonnegative_args: + assert arg >= 0.0, "{} must be nonnegative".format(arg_str) + + # warn if input is not advisable + if redshift_step > max_redshift_detection: + warnings.warn("Redshift step is greater than maximum detection redshift", stacklevel=2) + if Mc_step > 1.0: + warnings.warn("Chirp mass step is greater than 1.0, large step sizes can produce unpredictable results", stacklevel=2) + if eta_step > 0.1: + warnings.warn("Symmetric mass ratio step is greater than 0.1, large step sizes can produce unpredictable results", stacklevel=2) + if snr_step > 1.0: + warnings.warn("SNR step is greater than 1.0, large step sizes can produce unpredictable results", stacklevel=2) + + # start by getting the necessary data from the COMPAS file + COMPAS = ClassCOMPAS.COMPASData(path, Mlower=m1_min, Mupper=m1_max, m2_min=m2_min, binaryFraction=fbin, suppress_reminder=True) + COMPAS.setCOMPASDCOmask(types=dco_type, withinHubbleTime=merges_hubble_time, pessimistic=pessimistic_CEE, noRLOFafterCEE=no_RLOF_after_CEE) + COMPAS.setCOMPASData() + COMPAS.set_sw_weights(weight_column) + COMPAS.find_star_forming_mass_per_binary_sampling() + + + assert np.log(np.min(COMPAS.initialZ)) != np.log(np.max(COMPAS.initialZ)), "You cannot perform cosmic integration with just one metallicity" + + + # compute the chirp masses and symmetric mass ratios only for systems of interest + chirp_masses = (COMPAS.mass1*COMPAS.mass2)**(3/5) / (COMPAS.mass1 + COMPAS.mass2)**(1/5) + etas = COMPAS.mass1 * COMPAS.mass2 / (COMPAS.mass1 + COMPAS.mass2)**2 + n_binaries = len(chirp_masses) + # another warning on poor input + if max(chirp_masses)*(1+max_redshift_detection) < Mc_max: + warnings.warn("Maximum chirp mass used for detectability calculation is below maximum binary chirp mass * (1+maximum redshift for detectability calculation)", stacklevel=2) + + # calculate the redshifts array and its equivalents + redshifts, n_redshifts_detection, times, time_first_SF, distances, shell_volumes = calculate_redshift_related_params(max_redshift, max_redshift_detection, redshift_step, z_first_SF) + + # find the star forming mass per year per Gpc^3 and convert to total number formed per year per Gpc^3 + sfr = find_sfr(redshifts, a = aSF, b = bSF, c = cSF, d = dSF) # functional form from Madau & Dickinson 2014 + + # Calculate the representative SF mass + Average_SF_mass_needed = (COMPAS.mass_evolved_per_binary * COMPAS.n_systems) + print('Average_SF_mass_needed = ', Average_SF_mass_needed) # print this, because it might come in handy to know when writing up results :) + n_formed = sfr / Average_SF_mass_needed # Divide the star formation rate density by the representative SF mass + + + # work out the metallicity distribution at each redshift and probability of drawing each metallicity in COMPAS + dPdlogZ, metallicities, p_draw_metallicity = find_metallicity_distribution(redshifts, min_logZ_COMPAS = np.log(np.min(COMPAS.initialZ)), + max_logZ_COMPAS = np.log(np.max(COMPAS.initialZ)), + mu0=mu0, muz=muz, sigma_0=sigma0, sigma_z=sigmaz, alpha = alpha, + min_logZ=min_logZ, max_logZ=max_logZ, step_logZ = step_logZ) + + + # calculate the formation and merger rates using what we computed above + formation_rate, merger_rate = find_formation_and_merger_rates(n_binaries, redshifts, times, time_first_SF, n_formed, dPdlogZ, + metallicities, p_draw_metallicity, COMPAS.metallicitySystems, + COMPAS.delayTimes, COMPAS.sw_weights) + + # create lookup tables for the SNR at 1Mpc as a function of the masses and the probability of detection as a function of SNR + snr_grid_at_1Mpc, detection_probability_from_snr = compute_snr_and_detection_grids(sensitivity, snr_threshold, Mc_max, Mc_step, + eta_max, eta_step, snr_max, snr_step) + + # use lookup tables to find the probability of detecting each binary at each redshift + detection_probability = find_detection_probability(chirp_masses, etas, redshifts, distances, n_redshifts_detection, n_binaries, + snr_grid_at_1Mpc, detection_probability_from_snr, Mc_step, eta_step, snr_step) + + # finally, compute the detection rate using Neijssel+19 Eq. 2 + detection_rate = np.zeros(shape=(n_binaries, n_redshifts_detection)) + detection_rate = merger_rate[:, :n_redshifts_detection] * detection_probability \ + * shell_volumes[:n_redshifts_detection] / (1 + redshifts[:n_redshifts_detection]) + + return detection_rate, formation_rate, merger_rate, redshifts, COMPAS + + +def append_rates(path, detection_rate, formation_rate, merger_rate, redshifts, COMPAS, n_redshifts_detection, + maxz=1., sensitivity="O1", dco_type="BHBH", mu0=0.035, muz=-0.23, sigma0=0.39, sigmaz=0., alpha=0., + append_binned_by_z = False, redshift_binsize=0.1): + """ + Append the formation rate, merger rate, detection rate and redshifts as a new group to your COMPAS output with weights hdf5 file + Args: + path --> [string] Path to the COMPAS file that contains the output + detection_rate --> [2D float array] Detection rate for each binary at each redshift in 1/yr + formation_rate --> [2D float array] Formation rate for each binary at each redshift in 1/yr/Gpc^3 + merger_rate --> [2D float array] Merger rate for each binary at each redshift in 1/yr/Gpc^3 + redshifts --> [list of floats] List of redshifts + COMPAS --> [Object] Relevant COMPAS data in COMPASData Class + n_redshifts_detection --> [int] Number of redshifts in list that should be used to calculate detection rates + maxz --> [float] Maximum redshhift up to where we would like to store the data + sensitivity --> [string] Which detector sensitivity you used to calculate rates + dco_type --> [string] Which DCO type you used to calculate rates + mu0 --> [float] metallicity dist: expected value at redshift 0 + muz --> [float] metallicity dist: redshift evolution of expected value + sigma0 --> [float] metallicity dist: width at redshhift 0 + sigmaz --> [float] metallicity dist: redshift evolution of width + alpha --> [float] metallicity dist: skewness (0 = lognormal) + append_binned_by_z --> [Bool] to save space, bin rates by redshiftbin and append binned rates + redshift_binsize --> [float] if append_binned_by_z, how big should your redshift bin be + Returns: + h_new --> [hdf5 file] Compas output file with a new group "rates" with the same shape as DoubleCompactObjects x redshifts + """ + print('shape redshifts', np.shape(redshifts)) + print('shape COMPAS.sw_weights', np.shape(COMPAS.sw_weights) ) + print('COMPAS.DCOmask', COMPAS.DCOmask, ' was set for dco_type', dco_type) + print('shape COMPAS COMPAS.DCOmask', np.shape(COMPAS.DCOmask) ) + + ################################################# + #Open hdf5 file that we will write on + print('pathToData', path) + with h5.File(path, 'r+') as h_new: + # The rate info is shaped as Double_Compact_Objects[COMPAS.DCOmask] , len(redshifts) + DCO = h_new['Double_Compact_Objects']# + print('shape DCO[SEED]', np.shape(DCO['SEED'][()]) ) + + ################################################# + # Create a new group where we will store data + new_rate_group = 'Rates_mu0{}_muz{}_alpha{}_sigma0{}_sigmaz{}'.format(mu0, muz, alpha, sigma0, sigmaz) + if append_binned_by_z: + new_rate_group = new_rate_group + '_zBinned' + + if new_rate_group not in h_new: + h_new.create_group(new_rate_group) + else: + print(new_rate_group, 'exists, we will overrwrite the data') + + + ################################################# + # Bin rates by redshifts + ################################################# + if append_binned_by_z: + # Choose how you want to bin the redshift, these represent the left and right boundaries + redshift_bins = np.arange(0, redshifts[-1]+redshift_binsize, redshift_binsize) + fine_binsize = np.diff(redshifts)[0] #Assunming your redshift bins are equally spaced!! + print('fine_binsize', fine_binsize) + #Assuming your crude redshift bin is made up of an integer number of fine z-bins!!! + i_per_crude_bin = redshift_binsize/fine_binsize + i_per_crude_bin = int(i_per_crude_bin) + + ################### + # convert crude redshift bins to volumnes and ensure all volumes are in Gpc^3 + crude_volumes = cosmology.comoving_volume(redshift_bins).to(u.Gpc**3).value + # split volumes into shells + crude_shell_volumes = np.diff(crude_volumes) + + ################### + # convert redshifts to volumnes and ensure all volumes are in Gpc^3 + fine_volumes = cosmology.comoving_volume(redshifts).to(u.Gpc**3).value + fine_shell_volumes = np.diff(fine_volumes) + fine_shell_volumes = np.append(fine_shell_volumes, fine_shell_volumes[-1]) + + # Convert your merger_rate back to 1/yr by multiplying by the fine_shell_volumes + N_dco_in_z_bin = (merger_rate[:,:] * fine_shell_volumes[:]) + print('fine_shell_volumes', fine_shell_volumes) + + # The number of merging BBHs that need a weight + N_dco = len(merger_rate[:,0]) + + #################### + # binned_merger_rate will be the (observed) weights, binned by redshhift + binned_merger_rate = np.zeros( (N_dco, len(redshift_bins)-1) )# create an empty list to fill + binned_detection_rate = np.zeros( (N_dco, len(redshift_bins)-1) )# create an empty list to fill + + # loop over all redshift redshift_bins + for i in range(len(redshift_bins)-1): + # Sum the number of mergers per year, and divide by the new dz volume to get a density + # binned_merger_rate[:,i] = np.sum(N_dco_in_z_bin[:,digitized == i+1], axis = 1)/crude_shell_volumes[i] + binned_merger_rate[:,i] = np.sum(N_dco_in_z_bin[:,i*i_per_crude_bin:(i+1)*i_per_crude_bin], axis = 1)/crude_shell_volumes[i] + + # only add detected rates for the 'detectable' redshifts + if redshift_bins[i] < redshifts[n_redshifts_detection]: + # The detection rate was already multiplied by the shell volumes, so we can sum it directly + binned_detection_rate[:,i] = np.sum(detection_rate[:,i*i_per_crude_bin:(i+1)*i_per_crude_bin], axis = 1) + save_redshifts = redshift_bins + save_merger_rate = binned_merger_rate + save_detection_rate = binned_detection_rate + else: + # To avoid huge filesizes, we don't really wan't All the data, + # so we're going to save up to some redshift + z_index = np.digitize(maxz, redshifts) -1 + + # The detection_rate is a smaller array, make sure you don't go beyond the end + detection_index = z_index if z_index < n_redshifts_detection else n_redshifts_detection + + print('You will only save data up to redshift ', maxz, ', i.e. index', z_index) + save_redshifts = redshifts + save_merger_rate = merger_rate[:,:z_index] + save_detection_rate = detection_rate[:,:detection_index] + + print('save_redshifts', save_redshifts) + + ################################################# + # Write the rates as a seperate dataset + # re-arrange your list of rate parameters + DCO_to_rate_mask = COMPAS.DCOmask #save this bool for easy conversion between Double_Compact_Objects, and CI weights + rate_data_list = [DCO['SEED'][DCO_to_rate_mask], DCO_to_rate_mask , save_redshifts, save_merger_rate, merger_rate[:,0], save_detection_rate] + rate_list_names = ['SEED', 'DCOmask', 'redshifts', 'merger_rate','merger_rate_z0', 'detection_rate'+sensitivity] + for i, data in enumerate(rate_data_list): + print('Adding rate info of shape', np.shape(data)) + # Check if dataset exists, if so, just delete it + if rate_list_names[i] in h_new[new_rate_group].keys(): + del h_new[new_rate_group][rate_list_names[i]] + # write rates as a new data set + dataNew = h_new[new_rate_group].create_dataset(rate_list_names[i], data=data) + + #Always close your files again ;) + h_new.close() + print(('Done with append_rates :) your new files are here: {}'.format(path))) + + + +def delete_rates(path, mu0=0.035, muz=-0.23, sigma0=0.39, sigmaz=0., alpha=0., append_binned_by_z=False): + """ + Delete the group containing all the rate information from your COMPAS output with weights hdf5 file + Args: + path --> [string] Path to the COMPAS file that contains the output + mu0 --> [float] metallicity dist: expected value at redshift 0 + muz --> [float] metallicity dist: redshift evolution of expected value + sigma0 --> [float] metallicity dist: width at redshhift 0 + sigmaz --> [float] metallicity dist: redshift evolution of width + alpha --> [float] metallicity dist: skewness (0 = lognormal) + append_binned_by_z --> [Bool] to save space, bin rates by redshiftbin and append binned rates + """ + ################################################# + #Open hdf5 file that we will write on + print('pathToData', path) + with h5.File(path, 'r+') as h_new: + # The rate info is shaped as Double_Compact_Objects[COMPAS.DCOmask] , len(redshifts) + DCO = h_new['Double_Compact_Objects']# + + ################################################# + # Name of the group that has the data stored + new_rate_group = 'Rates_mu0{}_muz{}_alpha{}_sigma0{}_sigmaz{}'.format(mu0, muz, alpha, sigma0, sigmaz) + if append_binned_by_z: + new_rate_group = new_rate_group + '_zBinned' + + if new_rate_group not in h_new: + print(new_rate_group, 'Does not exist, nothing to do here...') + #Always close your files again ;) + h_new.close() + return + else: + print('You want to remove this group, %s, from the hdf5 file, removing now..'%(new_rate_group)) + del h_new[new_rate_group] + #Always close your files again ;) + h_new.close() + print('Done with delete_rates :) your files are here: ', path) + return + + + + +def plot_rates(save_dir, formation_rate, merger_rate, detection_rate, redshifts, chirp_masses, show_plot = False, mu0=0.035, muz=-0.23, sigma0=0.39, sigmaz=0., alpha=0): + """ + Show a summary plot of the results, it also returns the summaries that it computes + Args: + save_dir --> [string] path where you would like to save your plot + formation_rate --> [2D float array] Formation rate for each binary at each redshift in 1/yr/Gpc^3 + merger_rate --> [2D float array] Merger rate for each binary at each redshift in 1/yr/Gpc^3 + detection_rate --> [2D float array] Detection rate for each binary at each redshift in 1/yr + redshifts --> [list of floats] List of redshifts + chirp_masses --> [list of floats] Chrirp masses of merging DCO's + show_plot --> [bool] Bool whether to show plot or not + mu0 --> [float] metallicity dist: expected value at redshift 0 + muz --> [float] metallicity dist: redshift evolution of expected value + sigma0 --> [float] metallicity dist: width at redshhift 0 + sigmaz --> [float] metallicity dist: redshift evolution of width + alpha --> [float] metallicity dist: skewness (0 = lognormal) + Returns: + matplotlib figure + """ + # sum things up across binaries + total_formation_rate = np.sum(formation_rate, axis=0) + total_merger_rate = np.sum(merger_rate, axis=0) + total_detection_rate = np.sum(detection_rate, axis=0) + + # and across redshifts + cumulative_detection_rate = np.cumsum(total_detection_rate) + detection_rate_by_binary = np.sum(detection_rate, axis=1) + + ########################### + #Start plotting + + # set some constants for the plots + plt.rc('font', family='serif') + fs = 20 + lw = 3 + + fig, axes = plt.subplots(2, 2, figsize=(20, 20)) + + axes[0,0].plot(redshifts, total_formation_rate, lw=lw) + axes[0,0].set_xlabel('Redshift', fontsize=fs) + axes[0,0].set_ylabel(r'Formation rate $[\rm \frac{\mathrm{d}N}{\mathrm{d}Gpc^3 \mathrm{d}yr}]$', fontsize=fs) + + axes[0,1].plot(redshifts, total_merger_rate, lw=lw) + axes[0,1].set_xlabel('Redshift', fontsize=fs) + axes[0,1].set_ylabel(r'Merger rate $[\rm \frac{\mathrm{d}N}{\mathrm{d}Gpc^3 \mathrm{d}yr}]$', fontsize=fs) + + axes[1,0].plot(redshifts[:len(cumulative_detection_rate)], cumulative_detection_rate, lw=lw) + axes[1,0].set_xlabel('Redshift', fontsize=fs) + axes[1,0].set_ylabel(r'Cumulative detection rate $[\rm \frac{\mathrm{d}N}{\mathrm{d}yr}]$', fontsize=fs) + + axes[1,1].hist(chirp_masses, weights=detection_rate_by_binary, bins=25, range=(0, 50)) + axes[1,1].set_xlabel(r'Chirp mass, $\mathcal{M}_c$', fontsize=fs) + axes[1,1].set_ylabel(r'Mass distrbution of detections $[\rm \frac{\mathrm{d}N}{\mathrm{d}\mathcal{M}_c \mathrm{d}yr}]$', fontsize=fs) + + ######################### + #Plotvalues + + # Add text upper left corner + axes[0,0].text(0.05,0.8, "mu0=%s \nmuz=%s \nsigma0=%s \nsigmaz=%s \nalpha=%s"%(mu0,muz,sigma0,sigmaz,alpha), transform=axes[0,0].transAxes, size = fs) + + for ax in axes.flatten(): + ax.tick_params(labelsize=0.9*fs) + + # Save and show :) + plt.savefig(save_dir +'Rate_Info'+"mu0%s_muz%s_alpha%s_sigma0%s_sigmaz%s"%(mu0,muz,alpha,sigma0, sigmaz)+'.png', bbox_inches='tight') + plt.savefig( './Rate_Info'+"mu0%s_muz%s_alpha%s_sigma0%s_sigmaz%s"%(mu0,muz,alpha,sigma0, sigmaz)+'.png', bbox_inches='tight') + if show_plot: + plt.show() + else: + plt.close() + + + + +################################################################## +### +### Run it! +### +################################################################## +if __name__ == "__main__": + + ##################################### + # Define command line options for the most commonly varied options + parser = argparse.ArgumentParser() + parser.add_argument("--path", dest= 'path', help="Path to the COMPAS file that contains the output",type=str, default = "COMPAS_Output.h5") + # For what DCO would you like the rate? options: ALL, BHBH, BHNS NSNS + parser.add_argument("--dco_type", dest= 'dco_type', help="Which DCO type you used to calculate rates, one of: ['all', 'BBH', 'BHNS', 'BNS', 'CHE_BBH', 'NON_CHE_BBH'] ",type=str, default = "BBH") + parser.add_argument("--weight", dest= 'weight_column', help="Name of column w AIS sampling weights, i.e. 'mixture_weight'(leave as None for unweighted samples) ",type=str, default = None) + + # Options for the redshift evolution and detector sensitivity + parser.add_argument("--maxz", dest= 'max_redshift', help="Maximum redshift to use in array",type=float, default=10) + parser.add_argument("--zSF", dest= 'z_first_SF', help="redshift of first star formation",type=float, default=10) + parser.add_argument("--maxzdet", dest= 'max_redshift_detection', help="Maximum redshift to calculate detection rates",type=float, default=1) + parser.add_argument("--zstep", dest= 'redshift_step', help="size of step to take in redshift",type=float, default=0.001) + parser.add_argument("--sens", dest= 'sensitivity', help="Which detector sensitivity to use: one of ['design', 'O1', 'O3']",type=str, default = "O3") + parser.add_argument("--snr", dest= 'snr_threshold', help="What SNR threshold required for a detection",type=float, default=8) + + # Parameters to calculate the representing SF mass (make sure these match YOUR simulation!) + parser.add_argument("--m1min", dest= 'm1_min', help="Minimum primary mass sampled by COMPAS",type=float, default=5.) + parser.add_argument("--m1max", dest= 'm1_max', help="Maximum primary mass sampled by COMPAS",type=float, default=150.) + parser.add_argument("--m2min", dest= 'm2_min', help="Minimum secondary mass sampled by COMPAS",type=float, default=0.1) + parser.add_argument("--fbin", dest= 'fbin', help="Binary fraction used by COMPAS",type=float, default=0.7) + + # Parameters determining dP/dZ and SFR(z), default options from Neijssel 2019 + parser.add_argument("--mu0", dest= 'mu0', help="mean metallicity at redshhift 0",type=float, default=0.035) + parser.add_argument("--muz", dest= 'muz', help="redshift evolution of mean metallicity, dPdlogZ",type=float, default=-0.23) + parser.add_argument("--sigma0", dest= 'sigma0', help="variance in metallicity density distribution, dPdlogZ",type=float, default=0.39) + parser.add_argument("--sigmaz", dest= 'sigmaz', help="redshift evolution of variance, dPdlogZ",type=float, default=0.0) + parser.add_argument("--alpha", dest= 'alpha', help="skewness of mtallicity density distribution, dPdlogZ",type=float, default=0.0) + parser.add_argument("--aSF", dest= 'aSF', help="Parameter for shape of SFR(z)",type=float, default=0.01) + parser.add_argument("--bSF", dest= 'bSF', help="Parameter for shape of SFR(z)",type=float, default=2.77) + parser.add_argument("--cSF", dest= 'cSF', help="Parameter for shape of SFR(z)",type=float, default=2.90) + parser.add_argument("--dSF", dest= 'dSF', help="Parameter for shape of SFR(z)",type=float, default=4.70) + + # Options for the redshift evolution and detector sensitivity + parser.add_argument("--dontAppend", dest= 'append_rates', help="Prevent the script from appending your rates to the hdf5 file.", action='store_false', default=True) + parser.add_argument("--delete", dest= 'delete_rates', help="Delete the rate group from your hdf5 output file (groupname based on dP/dZ parameters)", action='store_true', default=False) + + args = parser.parse_args() + + ##################################### + # Run the cosmic integration + start_CI = time.time() + detection_rate, formation_rate, merger_rate, redshifts, COMPAS = find_detection_rate(args.path, dco_type=args.dco_type, weight_column=args.weight_column, + max_redshift=args.max_redshift, max_redshift_detection=args.max_redshift_detection, redshift_step=args.redshift_step, z_first_SF= args.z_first_SF, + m1_min=args.m1_min*u.Msun, m1_max=args.m1_max*u.Msun, m2_min=args.m2_min*u.Msun, fbin=args.fbin, + aSF = args.aSF, bSF = args.bSF, cSF = args.cSF, dSF = args.dSF, + mu0=args.mu0, muz=args.muz, sigma0=args.sigma0, sigmaz=args.sigmaz, alpha=args.alpha, + sensitivity=args.sensitivity, snr_threshold=args.snr_threshold, + min_logZ=-12.0, max_logZ=0.0, step_logZ=0.01, + Mc_max=300.0, Mc_step=0.1, eta_max=0.25, eta_step=0.01, + snr_max=1000.0, snr_step=0.1) + end_CI = time.time() + + ##################################### + # Append your freshly calculated merger rates to the hdf5 file + start_append = time.time() + if args.append_rates: + n_redshifts_detection = int(args.max_redshift_detection / args.redshift_step) + append_rates(args.path, args.fname, detection_rate, formation_rate, merger_rate, redshifts, COMPAS, n_redshifts_detection, + maxz=args.max_redshift_detection, sensitivity=args.sensitivity, dco_type=args.dco_type, mu0=args.mu0, muz=args.muz, sigma0=args.sigma0, sigmaz=args.sigmaz, alpha=args.alpha, + append_binned_by_z = False, redshift_binsize=0.05) + + # or just delete this group if your hdf5 file is getting too big + if args.delete_rates: + delete_rates(args.path, args.fname, mu0=args.mu0, muz=args.muz, sigma0=args.sigma0, sigmaz=args.sigmaz, alpha=args.alpha, append_binned_by_z=False) + + end_append = time.time() + + + + ##################################### + # Plot your result + start_plot = time.time() + chirp_masses = (COMPAS.mass1*COMPAS.mass2)**(3./5.) / (COMPAS.mass1 + COMPAS.mass2)**(1./5.) + plot_rates(args.path, formation_rate, merger_rate, detection_rate, redshifts, chirp_masses, show_plot = True, mu0=args.mu0, muz=args.muz, sigma0=args.sigma0, sigmaz=args.sigmaz, alpha=args.alpha) + end_plot = time.time() + + print('CI took ', end_CI - start_CI, 's') + # print('Appending rates took ', end_append - start_append, 's') + print('plot took ', end_plot - start_plot, 's') diff --git a/courses/course-for-prof-Mandel/GWTC-3-catalog.pdf b/courses/course-for-prof-Mandel/GWTC-3-catalog.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8f7419008e58516613c4f83ce34b53c838f96456 Binary files /dev/null and b/courses/course-for-prof-Mandel/GWTC-3-catalog.pdf differ diff --git a/courses/course-for-prof-Mandel/GWTC-3-population.pdf b/courses/course-for-prof-Mandel/GWTC-3-population.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a314a1bc45867f237b79cf0523fd5e49e805586b Binary files /dev/null and b/courses/course-for-prof-Mandel/GWTC-3-population.pdf differ diff --git a/courses/course-for-prof-Mandel/MandelBroekgaarden.pdf b/courses/course-for-prof-Mandel/MandelBroekgaarden.pdf new file mode 100644 index 0000000000000000000000000000000000000000..efa7be349fbd3c855a7dff2b8dbf6ab07b294f48 Binary files /dev/null and b/courses/course-for-prof-Mandel/MandelBroekgaarden.pdf differ diff --git a/courses/course-for-prof-Mandel/Rate_Infomu00.035_muz-0.23_alpha0.0_sigma00.39_sigmaz0.0.png b/courses/course-for-prof-Mandel/Rate_Infomu00.035_muz-0.23_alpha0.0_sigma00.39_sigmaz0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..0cca419fb968c01fc39a74678f0eb7b876671178 Binary files /dev/null and b/courses/course-for-prof-Mandel/Rate_Infomu00.035_muz-0.23_alpha0.0_sigma00.39_sigmaz0.0.png differ diff --git a/courses/course-for-prof-Mandel/SNR_Grid_IMRPhenomPv2_FD_all_noise.hdf5 b/courses/course-for-prof-Mandel/SNR_Grid_IMRPhenomPv2_FD_all_noise.hdf5 new file mode 100644 index 0000000000000000000000000000000000000000..34e89c7eb66153bbb4afa19942e50e2f626f27d1 Binary files /dev/null and b/courses/course-for-prof-Mandel/SNR_Grid_IMRPhenomPv2_FD_all_noise.hdf5 differ diff --git a/courses/course-for-prof-Mandel/selection_effects.py b/courses/course-for-prof-Mandel/selection_effects.py new file mode 100644 index 0000000000000000000000000000000000000000..85f062a39a93f1de9870a2d1a7fda5a5fe2a38d5 --- /dev/null +++ b/courses/course-for-prof-Mandel/selection_effects.py @@ -0,0 +1,301 @@ +# ! /usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created for Python 3 +@author: Sebastian M. Gaebel +@email: sgaebel@star.sr.bham.ac.uk +""" + +from __future__ import division, print_function +import h5py +import numpy as np +import os +import scipy.interpolate + + +# Global variables to reuse objects for multiple calls +_random_thetas = None +_interpolator = None +_sens = None + +def detection_probability(m1, m2, redshift, distance, snr_threshold,sensitivity='design'): + """ + Returns the detection probability of a CBC event with given + masses and distance. + This function is a convenience function to generate the + interpolator with 'SNR_Grid_IMRPhenomPv2_FD_all_noise.hdf5' + and 'SimNoisePSDaLIGODesignSensitivityP1200087', redshift the + masses, rescale the SNR using the distance, and then call + 'detection_probability_from_snr' to return the probability. + Parameters + ---------- + m1, m2 : float > 0 + Primary and secondary mass in source frame. + redshift : float >= 0 + Redshift of the waveform through cosmology. + distance : float > 0 + Luminosity Distance in Mpc to the source. + snr_threshold : float > 0 + Threshold above which an event is considered to be detected. + sensitivity : str + Which detector sensitivity PSD to use. Options are 'design' and 'O1' + Returns + ------- + out : float + Estimate of the detection probability. + Notes + ----- + The interpolator is only initialized once and then stored in a + module level global variable to be reused. + """ + + global _interpolator + global _sens + if (_interpolator is None) or (_sens is not sensitivity): + _sens = sensitivity + _interpolator = SNRinterpolator(_sens) + interpolated_snr = _interpolator(m1*(1+redshift), m2*(1+redshift)) + # SNR scales as 1/distance + interpolated_snr /= distance + + return detection_probability_from_snr(snr_value=interpolated_snr, + snr_threshold=snr_threshold) + +def SNRinterpolator(sensitivity='design'): + """ + Returns an Interpolator class instance for a given sensitivity + + This function is a convenience function to generate the + interpolator with 'SNR_Grid_IMRPhenomPv2_FD_all_noise.hdf5' + and 'SimNoisePSDaLIGODesignSensitivityP1200087'. + + Parameters + ---------- + sensitivity : str + Which detector sensitivity PSD to use. Options are 'design' and 'O1' + + Returns + ------- + out : Interpolator + Interpolator class instance + + Notes + ----- + The interpolator is only initialized once and then stored in a + module level global variable to be reused. + """ + path = os.path.dirname(os.path.abspath(__file__)) + + if sensitivity == 'design': + hdfDatasetName = 'SimNoisePSDaLIGODesignSensitivityP1200087' + elif sensitivity == 'O1': + hdfDatasetName = 'P1500238_GW150914_H1-GDS-CALIB_STRAIN.txt' + elif sensitivity == 'O3': + hdfDatasetName = 'SimNoisePSDaLIGOMidHighSensitivityP1200087' + + global _interpolator + global _sens + if (_interpolator is None) or (_sens is not sensitivity): + _sens = sensitivity + _interpolator = Interpolator( + path+'/SNR_Grid_IMRPhenomPv2_FD_all_noise.hdf5', + hdfDatasetName, mode='scipy') + return _interpolator + +class Interpolator: + """ + Interpolation class to estimate the values of arbitrary points + from a given grid. The interpolator class is initialized with + a mass axis defining the (symmetric) grid, a grid of values + which are used as reference points, and a operation mode. + The operation mode determines the interpolation method used and + may be either 'scipy', which uses 'RectBivariateSpline' from + 'scipy.interpolate', or 'custom' where all non-NaN points adjacent + to the call are averaged while being weighed by the inverse of + the distance between the given corner point and queried position. + The grid is generally assumed to be spaced uniformly in log, + therefore mass_axis and evaluation masses are transformed to + log space before interpolating. + """ + def __init__(self, first_arg, second_arg, mode='scipy'): + """ + Initialize the interpolator by definig the used reference + values and interpolation mode. + The interpolator may be initialized by providing the mass + axis and SNR grid, or via a path to a stored precomputed + grid and a string specifying the noise spectrum to use. + Parameters + ---------- + first_arg : mass axis as 1D ndarray or path as string + If given as mass axis, must be a one dimensional + ndarray. If given as string, must be a valid path + to a HDF5 file containing mass axis and SNR grid + as produced by 'generate_SNR_files.py'. + second_arg : SNR grid as 2D ndarray or noise spectrum as string + If given as SNR grid, must be a two dimensional + ndarray with each dimension being the length of the mass + axis. If given as noise curve, must be the string specifying + a valid group of the HDF5 file given above. + mode : str, optional + Valid values are 'scipy' and 'custom', all other will + raise a ValueError. + Returns + ------- + out : None + """ + if isinstance(first_arg, str) and isinstance(second_arg, str): + if not os.path.isfile(first_arg): + raise FileNotFoundError('HDF5 file expected: %r' % first_arg) + with h5py.File(first_arg, 'r') as hdf: + mass_axis = hdf['mass_axis'][...] + if second_arg not in hdf['snr_values']: + raise ValueError('Group %r not found.' % second_arg) + snr_grid = hdf['snr_values'][second_arg][...] + else: + mass_axis = first_arg + snr_grid = second_arg + + if mode == 'scipy': + self.use_scipy = True + self.interpolator = scipy.interpolate.RectBivariateSpline( + np.log(mass_axis), np.log(mass_axis), snr_grid) + elif mode == 'custom': + self.use_scipy = False + self.mass_axis = np.log(mass_axis) + self.snr_grid = snr_grid + else: + raise ValueError('Invalid mode: %r' % mode) + + def __call__(self, m1, m2): + """ + Obtain an interpolated value for the given position. + Parameters + ---------- + m1, m2 : float + Positive values for which the interpolated SNR is calculated. + Returns + ------- + out : float + Estimate for the SNR at (m1, m2). + """ + if self.use_scipy: + return self.interpolator(np.log(m1), np.log(m2), grid=False) + else: + return self._custom(np.log(m1), np.log(m2)) + + def _custom(self, m1, m2): + """ + Custom function to approximate the value of any given point + within the limits of the grid. The value is calculated as the + average value of the 4 corners of the grid, weighed by the + inverse distance to (m1, m2). Points for which the SNR is + NaN are ignored. + Parameters + ---------- + m1, m2 : float + Positive values for which the interpolated SNR is calculated. + Returns + ------- + out : float + Estimate for the SNR at (m1, m2). + """ + # The point is in the lower triangle by definition + if isinstance(m1, np.ndarray): + ret_values = np.empty_like(m1) + for i, (m1_, m2_) in enumerate(zip(m1, m2)): + ret_values[i] = self._custom(m1_, m2_) + return ret_values + elif m1 < m2: + m1, m2 = m2, m1 + assert np.min(self.mass_axis) < m1 < np.max(self.mass_axis) + assert np.min(self.mass_axis) < m2 < np.max(self.mass_axis) + # Find the indices of the next higher element in the axis + # this ensures mass_axis[i-1] < m1 < mass_axis[i] + # Edge cases are covered by the assertions, which ensure no pair are on + # the outer bondary. + i, j = np.searchsorted(self.mass_axis, [m1, m2]) + m1_selection = self.mass_axis[[i-1, i-1, i, i]] + m2_selection = self.mass_axis[[j-1, j, j-1, j]] + snr_selection = self.snr_grid[[i-1, i-1, i, i], [j-1, j, j-1, j]] + distance = np.sqrt((m1_selection - m1)**2 + (m2_selection - m2)**2) + # If the distance is zero, return the value at that position + if np.any(distance == 0): + return snr_selection[distance == 0] + # Ensure there are no NaN in the SNR values,which may happen for the + # upper triangle. + distance = distance[~np.isnan(snr_selection)] + snr_selection = snr_selection[~np.isnan(snr_selection)] + if snr_selection.size == 0: + raise ValueError('No non-NaN values surrounding (m1, m2).') + return np.average(snr_selection, weights=1./distance) + + +def detection_probability_from_snr(snr_value, snr_threshold, n_thetas=1e6): + """ + Compute the probability of detecting an CBC with given SNR and + threshold, averaging over all orientations and sky positions. + Based of Finn & Chernoff 1993 (https://arxiv.org/abs/gr-qc/9301003). + Parameters + ---------- + snr_value : float or array of floats + SNR value of the event under ideal conditions. Must be positive. + snr_threshold : float + SNR threshold for detection. Must be positive. + n_thetas : unsigned int + Number of random realizations of inclination and sky position + used to calculate the average probability of detecting the + event. Default: 1e6. + Returns + ------- + out : float or array of floats (same as 'snr_value') + Probability of the received signal to be above the threshold. + """ + # Check input values + assert np.all(snr_value > 0), repr(snr_value) + assert snr_threshold > 0, repr(snr_threshold) + assert n_thetas > 0, repr(n_thetas) + n_thetas = int(n_thetas) + + # Generate thetas if necessary + global _random_thetas + if _random_thetas is None or _random_thetas.size != n_thetas: + cos_thetas = np.random.uniform(low=-1, high=1, size=n_thetas) + cos_incs = np.random.uniform(low=-1, high=1, size=n_thetas) + phis = np.random.uniform(low=0, high=2*np.pi, size=n_thetas) + zetas = np.random.uniform(low=0, high=2*np.pi, size=n_thetas) + + Fps = (0.5 * np.cos(2*zetas) * (1+cos_thetas**2)*np.cos(2*phis) - + np.sin(2*zetas) * cos_thetas*np.sin(2*phis)) # 3.29a + Fxs = (0.5 * np.sin(2*zetas) * (1+cos_thetas**2)*np.cos(2*phis) + + np.cos(2*zetas) * cos_thetas*np.sin(2*phis)) # 3.29b + _random_thetas = np.sqrt(0.25 * Fps**2 * (1 + cos_incs**2)**2 + + Fxs**2 * cos_incs**2) # 3.31 + _random_thetas = np.sort(_random_thetas) + + # Calculate and return the probability of detection + # From Finn & Chernoff 1993, we have SNR ~ theta*integrand, assuming + # that the polarisations are orthogonal. + # Remember: snr_value is the maximum possible SNR + theta_min = snr_threshold / snr_value + # theta_min is converted to a 1-dimensional array so this function + # can be used with array and scalar arguments. + + + #I have replaced this easy to read for loop with an unreadable (but much faster) one liner. Leaving it commented so + #that future people can understand what the hell it's doing + + # theta_min = np.atleast_1d(theta_min).flatten() + # detection_prob = np.zeros_like(theta_min) + # for i, theta_min_value in enumerate(theta_min): + # if theta_min_value <= 1: + # detection_prob[i] = np.mean(_random_thetas > theta_min_value) + + theta_min = np.atleast_1d(theta_min).flatten() + detection_prob = np.zeros_like(theta_min) + detection_prob[theta_min <= 1] = 1.-((np.digitize(theta_min[theta_min <= 1], _random_thetas)-1.)/float(n_thetas)) + + if len(detection_prob) == 1 and np.array(snr_value).ndim == 0: + # If the original arg was 0-dimensional (scalar), return a scalar. + return detection_prob[0] + return detection_prob.reshape(np.array(snr_value).shape) + diff --git a/courses/course-for-prof-Mandel/test.py b/courses/course-for-prof-Mandel/test.py new file mode 100644 index 0000000000000000000000000000000000000000..4be3c45084e3b954a7e43fab4f3d2f3660308ab4 --- /dev/null +++ b/courses/course-for-prof-Mandel/test.py @@ -0,0 +1 @@ +test test \ No newline at end of file diff --git a/courses/course-for-prof-Mandel/test2.py b/courses/course-for-prof-Mandel/test2.py new file mode 100644 index 0000000000000000000000000000000000000000..9e018b3784a1e3cea8cee588af90210e5f124526 --- /dev/null +++ b/courses/course-for-prof-Mandel/test2.py @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/courses/course-for-prof-Mandel/totalMassEvolvedPerZ.py b/courses/course-for-prof-Mandel/totalMassEvolvedPerZ.py new file mode 100644 index 0000000000000000000000000000000000000000..5d591be7316d3c038832d338690582e4dbe41eb6 --- /dev/null +++ b/courses/course-for-prof-Mandel/totalMassEvolvedPerZ.py @@ -0,0 +1,195 @@ +import numpy as np +import h5py as h5 #for reading in data +import os + +def threePartBrokenPowerLaw(x, x1=0.01, x2=0.08, x3=0.5, x4=200, a1=-0.3, \ + a2=-1.3, a3=-2.3, C1=1): + #Not that everything outside the range x1<x4 is set to zero + yvalues = np.zeros(len(x)) + + #calculate values of the x values that are x1<=x<x2 + mask1 = (x>=x1) & (x<x2) + yvalues[mask1] = C1 * (x[mask1]**a1) + + #calculate values of the x values that are x2<=x<x3 + mask2 = (x>=x2) & (x<x3) + C2 = C1 * (x2**(a1-a2)) + yvalues[mask2] = C2 * (x[mask2]**a2) + + #calculate values of the x values that are x3<=x<=x4 + mask3 = (x>=x3) & (x<=x4) + C3 = C1 * (x2**(a1-a2)) * (x3**(a2-a3)) + yvalues[mask3] = C3 * (x[mask3]**a3) + + return yvalues + +def CDFbrokenPowerLaw(x, x1, x2, x3, x4, a1, a2, a3, C1): + yvalues = np.zeros(len(x)) + + C2 = float(C1 * (x2**(a1-a2))) + C3 = float(C2 * (x3**(a2-a3))) + + N1 = float(((1./(a1+1)) * C1 * (x2**(a1+1))) - ((1./(a1+1)) * C1 * (x1**(a1+1)))) + N2 = float(((1./(a2+1)) * C2 * (x3**(a2+1))) - ((1./(a2+1)) * C2 * (x2**(a2+1)))) + N3 = float(((1./(a3+1)) * C3 * (x4**(a3+1))) - ((1./(a3+1)) * C3 * (x3**(a3+1)))) + + bottom = N1+N2+N3 + + mask1 = (x>=x1) & (x<x2) + top1 = (((1./(a1+1)) * C1 * (x[mask1]**(a1+1)) - (1./(a1+1)) * C1 * (x1**(a1+1)))) + yvalues[mask1] = top1/bottom + + #calculate values of the x values that are x2<=x<x3 + mask2 = (x>=x2) & (x<x3) + top2 = N1 + (((1./(a2+1)) * C2 * (x[mask2]**(a2+1)) - (1./(a2+1)) * C2 * (x2**(a2+1)))) + yvalues[mask2] = top2/bottom + + #calculate values of the x values that are x3<=x<=x4 + mask3 = (x>=x3) & (x<=x4) + top3 = N1 + N2 + (((1./(a3+1)) * C3 * (x[mask3]**(a3+1)) - (1./(a3+1)) * C3 * (x3**(a3+1)))) + yvalues[mask3] = top3/bottom + return yvalues + + +def invertCDFbrokenPowerLaw(CDF, x1, x2, x3, x4, a1, a2, a3, C1): + #I specifically do floats against python rounding when dividing + + #The constants needed + C2 = float(C1 * (x2**(a1-a2))) + C3 = float(C2 * (x3**(a2-a3))) + + N1 = float(((1./(a1+1)) * C1 * (x2**(a1+1))) - ((1./(a1+1)) * C1 * (x1**(a1+1)))) + N2 = float(((1./(a2+1)) * C2 * (x3**(a2+1))) - ((1./(a2+1)) * C2 * (x2**(a2+1)))) + N3 = float(((1./(a3+1)) * C3 * (x4**(a3+1))) - ((1./(a3+1)) * C3 * (x3**(a3+1)))) + + bottom = N1+N2+N3 + + CDFx2 = CDFbrokenPowerLaw(np.array([x2,x2]), x1, x2, x3, x4, a1, a2, a3, C1)[0] + CDFx3 = CDFbrokenPowerLaw(np.array([x3,x3]), x1, x2, x3, x4, a1, a2, a3, C1)[0] + + + xvalues = np.zeros(len(CDF)) + + mask1 = (CDF < CDFx2) + xvalues[mask1] = (((CDF[mask1]*(N1+N2+N3)) + \ + ( (1./(a1+1))*C1*(x1**(a1+1))))/((1./(a1+1))*C1))**(1./(a1+1)) + + mask2 = (CDFx2<= CDF) & (CDF < CDFx3) + xvalues[mask2] = ((((CDF[mask2]*(N1+N2+N3))-(N1)) + \ + ( (1./(a2+1))*C2*(x2**(a2+1))))/((1./(a2+1))*C2))**(1./(a2+1)) + + mask3 = (CDFx3<= CDF) + xvalues[mask3] = ((((CDF[mask3]*(N1+N2+N3))-(N1+N2)) + \ + ((1./(a3+1))*C3*(x3**(a3+1))))/((1./(a3+1))*C3))**(1./(a3+1)) + + return xvalues + + + + + +def createSampleUniverse(binaryFraction=1., x1=0.01, x2=0.08, x3=0.5, x4=200, a1=-0.3, \ + a2=-1.3, a3=-2.3, C1=1, sampleSize=5000000, Mmin=0.01, Mmax=200): + + binaryFraction = binaryFraction + + #Given the defined three-part broken powerlaw, + #We can sample a subset by using Mmin, Mmax. + #We convert it to the respective values between + #0-1 and only sample uniformly between those (woohoo :D) + #Mmin and Mmax have to be between x1 and x4 + CDFmin = CDFbrokenPowerLaw(np.array([Mmin]), x1, x2, x3, x4, a1, a2, a3, C1) + CDFmax = CDFbrokenPowerLaw(np.array([Mmax]), x1, x2, x3, x4, a1, a2, a3, C1) + + #All the random drawing that we need + drawM1 = np.random.uniform(CDFmin,CDFmax,sampleSize) + drawBinary = np.random.uniform(0,1,sampleSize) + drawM2 = np.random.uniform(0,1,sampleSize) + + #All the arrays we want to fill + M1 = np.zeros(sampleSize) + M2 = np.zeros(sampleSize) + + #Define the IMF broken powerlaw and calculate masses from inverted CDF + + + M1 = invertCDFbrokenPowerLaw(drawM1, x1, x2, x3, x4, a1, a2, a3, C1) + + #Binary fraction is easier, since we draw between 0-1, every draw with + #value above binary fraction = single star and every value below is binary + #for a single star we set M2=0 Msun. + #Note that we assume that the binary Fraction is mass indepent + #Future work to implenet Max Moe ps and qs options + maskBinary = drawBinary < binaryFraction #booleans + + #again for the secondary we assume the mass ratio distribution to be flat across + #the whole parameter range so then the drawM2 (if it is in a binary) + #just becomes the mass fraction. + + M2[maskBinary] = np.multiply(drawM2[maskBinary],M1[maskBinary]) + #all the ones outside the mask remain zero + return M1, M2 + + +def inverseCDF(C, CDF, index, xmin, xmax): + #CDF sincle powerlaw + a = (1./(index + 1)) * C * CDF**(index+1) + b = (1./(index + 1)) * C * xmin**(index+1) + c = (1./(index + 1)) * C * xmax**(index+1) + top = ((CDF * (c-b))+b)*(index + 1) + bottom = C + return (top/bottom)**(1./(index+1)) + + + +def retrieveMassEvolvedPerZ(path): + f = h5.File(path, 'r') # open in read-only + + allSystems = f['BSE_System_Parameters'] + metals = (allSystems['Metallicity@ZAMS(1)'])[()] + m1s = (allSystems['Mass@ZAMS(1)'])[()] + m2s = (allSystems['Mass@ZAMS(2)'])[()] + total = [] + for Z in np.unique(metals): + mask = metals == Z + total.append(np.sum(m1s[mask]) + np.sum(m2s[mask])) + f.close() + return np.array(total) + + + +def totalMassEvolvedPerZ(path=None, Mlower=None, Mupper=None, binaryFraction=0.7, \ + x1=0.01, x2=0.08, x3=0.5, x4=200., a1=-0.3, a2=-1.3, a3=-2.3, C1=1., Mmax=200): + + #the default values assume a Kroupa IMF for M1 + if path is None: + raise TypeError("\n Need to give path to data") + if Mlower is None: + raise TypeError("\n Need to give lower limit M1 of pythonSubmit") + if Mupper is None: + raise TypeError("\n Need to give upper limit M1 of pythonSubmit") + + + M1, M2 = createSampleUniverse(binaryFraction=binaryFraction, x1=x1, x2=x2, x3=x3, x4=x4, \ + a1=a1, a2=a2, a3=a3, C1=C1, Mmax=Mmax) + + totalMassInStarFormation = np.sum(M1) + np.sum(M2) + + #Now mask M1 and M2 to see what lies in the range of COMPAS + maskM1 = (M1>=Mlower) & (M1<=Mupper) + maskBinaries = (M2!=0) + mask = maskM1 & maskBinaries + + totalMassEvolvedCOMPAS = np.sum(M1[mask]) + np.sum(M2[mask]) + + #multiplication fraction + fraction = totalMassEvolvedCOMPAS/float(totalMassInStarFormation) + + #so we need to muliplu the mass evolved per metallicity times (1/fraction) + #to know the total mass evolved per metallicity + MassEvolvedPerZ = retrieveMassEvolvedPerZ(path) + + multiplicationFactor = 1./fraction + + totalMassEvolvedPerMetallicity = (MassEvolvedPerZ)/(fraction) + return multiplicationFactor, totalMassEvolvedPerMetallicity diff --git a/notebooks/.gitkeep b/courses/course-for-prof-Nissanke/.gitkeep similarity index 100% rename from notebooks/.gitkeep rename to courses/course-for-prof-Nissanke/.gitkeep diff --git a/courses/course-for-prof-Nissanke/.metadata.yaml b/courses/course-for-prof-Nissanke/.metadata.yaml new file mode 100644 index 0000000000000000000000000000000000000000..d2365fd0c4713d0cce5b75886e6704f31839f5f8 --- /dev/null +++ b/courses/course-for-prof-Nissanke/.metadata.yaml @@ -0,0 +1,5 @@ +Responsible: Geert Raaijmakers +Prof: Nissanke +Resources: Works when setting the memory >=4Gb and the CPU>=1 + + diff --git a/courses/course-for-prof-Nissanke/Saas-Fee_Tutorial_1.ipynb b/courses/course-for-prof-Nissanke/Saas-Fee_Tutorial_1.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..38341ecf80e31f82360c070632797cd3e3d224ef --- /dev/null +++ b/courses/course-for-prof-Nissanke/Saas-Fee_Tutorial_1.ipynb @@ -0,0 +1,1718 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "emvgHmhCmZJv" + }, + "source": [ + "# Gravitational Wave Data Analysis 2: Characterising Signals\n", + "\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "In this notebook we will use the gravitational wave data analysis toolkit called `PyCBC` to download, read and process real gravitational wave data.\n", + "\n", + "In this tutorial we will look at how to interpret a candidate signal via Bayesian analysis tools available to us. This tutorial is based on tutorials from the [Gravitational Wave Open Data Workshop](https://github.com/gw-odw) and [`PyCBC` Tutorials](https://github.com/gwastro/PyCBC-Tutorials) repositories, taking code and inspiration heavily from both. I recommend looking at these resources for other examples as we will not cover all of the same things here. </div>" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "rKgf-2PsjmFU" + }, + "source": [ + "## 0. Setting up the environment\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "If you're using this notebook inside the Renku environment all the required packages should be installed already, and you can leave the commented line as it is in the next block. \n", + " You can also run this notebook outside the Renku environment, but then we need to make sure all the correct packages are installed. The notebook can either be run on a remote server in Google Collaboratory, but you can also download to your own machine, so long as you have a working `python` installation with all the required packages.\n", + "\n", + "We want to have `PyCBC` and all its dependencies. These include the `lalsuite` and `ligo-common` packages, which contain a lot of the underlying code for handling the data and generating model gravitational wave signals.\n", + "</div>\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OEraQYeLjmFV", + "outputId": "b3f5aea0-a5f3-4ede-f922-6343e3070c3d", + "scrolled": true + }, + "outputs": [], + "source": [ + "import sys\n", + "# !{sys.executable} -m pip install pycbc==1.17.0 lalsuite ligo-common --no-cache-dir\n", + "from IPython.display import Math\n", + "from matplotlib import pyplot as plt, rc, cycler\n", + "import seaborn as sns\n", + "palette = sns.color_palette(\"colorblind\")\n", + "palette[3], palette[5] = palette[5], palette[3]\n", + "rc(\"axes\", prop_cycle=cycler(color=palette))\n", + "alpha=0.5\n", + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MuGUtVTtjmFc" + }, + "source": [ + "## 1. Models\n", + "\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "A `model` in pycbc inference represents the problem you are trying to solve. It contains the definition of the likelihood function you want to explore and details the parameters you are using. In this section, we'll walk through using models with pycbc inference and see how to create your own.\n", + "\n", + "Let's see what models are available. All models are accessible via a dictionary in the `models` module. Each model has a unique name:\n", + " \n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BYAeSjUsjmFd", + "outputId": "b7ddf8a6-3034-46e7-d637-167d7de73e7c" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "PyCBC.libutils: pkg-config call failed, setting NO_PKGCONFIG=1\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "test_eggbox\n", + "test_normal\n", + "test_rosenbrock\n", + "test_volcano\n", + "test_posterior\n", + "test_prior\n", + "gaussian_noise\n", + "marginalized_phase\n", + "marginalized_polarization\n", + "marginalized_hmpolphase\n", + "brute_parallel_gaussian_marginalize\n", + "gated_gaussian_noise\n", + "gated_gaussian_margpol\n", + "single_template\n", + "relative\n" + ] + } + ], + "source": [ + "from pycbc.inference import models\n", + "\n", + "for model_name in models.models:\n", + " print(model_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "QIvx-TWKjmFf" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "The models starting with `test_` are analytic models. These have predefined likelihood functions that are given by some standard distributions used in testing samplers. The other models are for gravitational-wave astronomy: they take in data and calculate a likelihood using an inner product between the data and a signal model. Currently, all of the gravitational-wave models in PyCBC assume that the data is stationary Gaussian noise in the absence of a signal. The difference between the models is they make varying simplfying assumptions, in order to speed up likelihood evaluation.\n", + "\n", + "Below, we'll start with an analytic model to illustrate some basics of how PyCBC Inference works. We'll then use one of the simplified models to quickly estimate some parameters of GW170817.\n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "h_JjuLQWjmFh" + }, + "source": [ + "### 1.1 One-dimensional Analytic Model ###\n", + "\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "The simplest case is a problem with a single parameter. We'll go through how to estimate this parameter using an analytic model. In this case, we'll use the normal distribution.\n", + "\n", + "Create an instance of a pre-made Model. This is an analytic model (i.e. no data used)\n", + "that we employ largely for testing the capabilities of different samplers. \n", + "This will create a likelihood surface in one dimensions (x) with zero mean and unit variance\n", + " </div>" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "r3BoTL1WjmFj" + }, + "outputs": [], + "source": [ + "from pycbc.inference import models, sampler\n", + "from pycbc import distributions as dists\n", + "\n", + "my_model = models.TestNormal(('x'), mean=(0))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nThHbaACjmFk" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "We need to choose a sampler, in this case *emcee*. We need to provide the model we are using along with the prior and number of walkers. Emcee is an 'ensemble' sampler so it consists of many points which are traversing the space and help each other explore the likelihood surface.\n", + "\n", + "Before we start we need to decide the initial positions of the walkers. In this case we choose that they be distributed randomly between -1 and 1. We use the 'Uniform' distribution class. It is a common feature that these classes take the parameter name along with parameters that may define the distribution itself (such as bounds and other distribution-specific shape determining variables).\n", + " </div>" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "VDdhggoFjmFl" + }, + "outputs": [], + "source": [ + "from pycbc.inference.sampler import emcee\n", + "engine = sampler.emcee.EmceeEnsembleSampler(my_model, nwalkers=1000, nprocesses=1)\n", + "_ = engine.set_p0(prior=(dists.Uniform(x=(-1, 1))))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jLn9mJUvjmFq" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> Run the mcmc for 200 iterations </div>" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "id": "mTvzDhKXjmFq" + }, + "outputs": [], + "source": [ + "engine.run_mcmc(200)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jZapaVcvjmFr" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "We can get the entire history of where the \"walkers\" have been by looking at the samples\n", + "attribute. For each variable parameter, we get an array with \n", + "dimensions nwalkers x num_iterations. This is the format for the 'Emcee' sampler. Other samples may have other formats for their parameter chains. For example, parallel tempered samplers will have an additional dimension which represents the temperature. The chain has 2 dimensions, the first axis is the walker\n", + "and the second is the iteration. We'll plot the final position of each walker\n", + " </div>" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 296 + }, + "id": "GIwpCvp7jmFs", + "outputId": "2df52b5e-0ebc-4c7c-94b2-74cebc3ca7f3" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Estimated mean = -0.019; variance = 1.021\n" + ] + } + ], + "source": [ + "xchain = engine.samples['x']\n", + "values = xchain[:,-1] \n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "ax.hist(values, density=True)\n", + "ax.set_xlabel('x')\n", + "plt.show()\n", + "plt.close()\n", + "\n", + "print(\"Estimated mean = {:.3f}; variance = {:.3f}\".format(values.mean(), np.var(values)))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U_AzyF90jmFu" + }, + "source": [ + "#### Suggested Problem ####\n", + "\n", + "<div class=\"alert alert-block alert-success\"> Try changing the mean of the analytic distribution. We've provided a random number below (no peaking!) What do you estimate for the mean of the distribution? </div>" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "VrCmKseAjmFv" + }, + "outputs": [], + "source": [ + "from numpy.random import uniform, seed\n", + "seed(0)\n", + "a_number = uniform(-100, 100)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "avtlTgf8jmFw" + }, + "source": [ + "### 1.2 Using a model with priors ###\n", + "\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "You may have noticed that in the previous example we did not specify any prior. If you do not specify a prior, a flat prior (with no boundaries) will be used. Let's now specify a prior. To do so, we will use the [distributions](http://pycbc.org/pycbc/latest/html/pycbc.distributions.html#pycbc-distributions-package) package. This contains many pre-made pdfs which can be used to build a prior. In fact we've been using this already to set initial walker positions.\n", + "\n", + "Let's create a prior on our variable that is uniform between $[0, 10)$. The resulting posterior should be a truncated normal distribution. </div>" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "X5WFYU5AjmFx" + }, + "outputs": [], + "source": [ + "prior_x = dists.Uniform(x=(0, 10))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "LV5DYK-2jmFz" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "In order to provide the prior to the model, we need to wrap it in a [JointDistribution](http://pycbc.org/pycbc/latest/html/pycbc.distributions.html#pycbc.distributions.joint.JointDistribution). The JointDistribution provides a common API for the models to evaluate the prior at a given point. If we had a problem with multiple parameters, each with their own prior distribution, we could provide the different distributions `JointDistribution`; it will take the product over all the distributions, providing the model a single number for the prior pdf. The `JointDistribution` also allows you to provide arbitrary constraints on parameters, although we will not cover that here. </div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "k1_B9a3MjmF1" + }, + "outputs": [], + "source": [ + "prior = dists.JointDistribution(['x'], prior_x)\n", + "\n", + "# Prior is a standard keyword that models which inherit from BaseModel \n", + "# can take.\n", + "my_model = models.TestNormal('x', prior=prior)\n", + "\n", + "engine = sampler.EmceeEnsembleSampler(my_model, nwalkers=1000, nprocesses=8)\n", + "\n", + "# Note that we do not need to provide anything to `set_p0` to set the initial positions\n", + "# this time. By default, the sampler will draw from the prior in this case.\n", + "engine.set_p0()\n", + "engine.run_mcmc(400)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "4vjGsUWXjmF1" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Since the `TestNormal` model's likelihood has zero mean and unit variance, forcing $x$ to only accept positive values via the prior means that our posterior should be a $\\chi$ distribution with 1 degree of freedom. Let's check: </div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FZ7WC28DjmF4", + "outputId": "8e904024-4ae2-46d2-814c-2ffa022e0927" + }, + "outputs": [], + "source": [ + "xchain = engine.samples['x']\n", + "values = xchain[:,-1] \n", + "\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "ax.hist(values, density=True, label='measured')\n", + "\n", + "from scipy import stats as spst\n", + "xpts = np.linspace(0, 3, num=100)\n", + "y = spst.chi.pdf(xpts, 1.)\n", + "ax.plot(xpts, y, label='$\\chi$ dist. with 1 d.o.f.')\n", + "\n", + "ax.set_xlabel('x')\n", + "ax.legend()\n", + "plt.show()\n", + "plt.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "txpeWsjwjmGG" + }, + "source": [ + "## 2. Estimating the distance of GW170817 ##\n", + "\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Now that we have some experience with models in pycbc inference, let's take a look at some of the existing models that pycbc inference provides targeted at gravitational-wave data analysis. We'll start with the `SingleTemplate` model. This model is useful when we know the intrinsic parameters of a source (i.e. component masses, spins), but we don't know the extrinsic parameters (i.e. sky location, distance, binary orientation). This will allow us to estimate the distance to GW170817 and the inclination angle (angle between the orbital angular momentum and our line-of-sight). \n", + "\n", + "This model requires a specifc set of data products.\n", + " * Dictionary of frequency-domain data (keyed by observatory short name such as 'H1', 'L1', 'V1').\n", + " * Dictionary of power spectral density estimates\n", + " * Low frequency cutoff to use for internal filtering in the model\n", + " \n", + "We will make use of PyCBC gw signal processing tools to prepare this data. </div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gEQyiKdajpbu", + "outputId": "94dca06a-e856-4da7-c99d-b886f161b16f" + }, + "outputs": [], + "source": [ + "from pycbc.catalog import Merger\n", + "from pycbc import psd, frame, filter as filt\n", + "from astropy.utils.data import download_file\n", + "\n", + "m = Merger(\"GW170817\")\n", + "\n", + "# List of observatories we'll analyze\n", + "ifos = [\"H1\", \"L1\", \"V1\"]\n", + "\n", + "# we'll keep track of the filename locations as we'll need them later\n", + "data_filenames = {}\n", + "\n", + "# The single template waveform model needs these data products\n", + "psds = {}\n", + "data = {}\n", + "channel_name = \"{}:LOSC-STRAIN\"\n", + "\n", + "for ifo in ifos:\n", + " print(\"Processing {} data\".format(ifo))\n", + " \n", + " # Download the gravitational wave data for GW170817\n", + " # Note: The GWOSC frames feature a huge glitch in L1 that significantly\n", + " # impacts parameter inference. We will use \"cleaned\" frames here,\n", + " # which have had the glitch removed.\n", + " #url = \"https://www.gw-openscience.org/eventapi/html/GWTC-1-confident/GW170817/v3/{}-{}_GWOSC_4KHZ_R1-1187006835-4096.gwf\"\n", + " url = \"https://dcc.ligo.org/public/0146/P1700349/001/{}-{}_LOSC_CLN_4_V1-1187007040-2048.gwf\"\n", + " fname = download_file(url.format(ifo[0], ifo), cache=\"update\")\n", + " data_filenames[ifo] = fname\n", + " \n", + " # Read the gravitational wave data and do some minimal\n", + " # conditioning of the data.\n", + " ts = frame.read_frame(fname, channel_name.format(ifo),\n", + " start_time=int(m.time - 260),\n", + " end_time=int(m.time + 40))\n", + " ts = filt.highpass(ts, 15.0) # Remove low frequency content\n", + " ts = filt.resample_to_delta_t(ts, 1.0/2048) # Resample data to 2048 Hz\n", + " ts = ts.time_slice(m.time-112, m.time + 16) # Limit to times around the signal\n", + " data[ifo] = ts.to_frequencyseries() # Convert to a frequency series by taking the data's FFT\n", + "\n", + " # Estimate the power spectral density of the data\n", + " PSD = psd.interpolate(ts.psd(4), ts.delta_f)\n", + " PSD = psd.inverse_spectrum_truncation(PSD, int(4 * PSD.sample_rate), \n", + " trunc_method='hann',\n", + " low_frequency_cutoff=20.0)\n", + " psds[ifo] = PSD\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bXHMHZjIjmGH" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "A number of parameters must also be provided as 'static' parameters. These include \n", + " * mass1 (Units in solar masses)\n", + " * mass2 (Units in solar masses)\n", + " * f_lower (used for where to start our gravitational waveform model generation from)\n", + " * approximant (This sets which waveform model we are using)\n", + "\n", + "If a model supports other intrinsic parameters (such as components spins), they may \n", + "also optionally be provided.\n", + "\n", + "There are also a fixed set of 'variable' parameters. These are the only ones which we\n", + "can obtain estimates of with this model. These are\n", + " * ra (Units in radians)\n", + " * dec (Units in radians)\n", + " * distance (Units in Megaparsecs)\n", + " * inclination (Units in radians)\n", + " * polarization (Units in radians)\n", + " * tc (Units in seconds): This parameter is roughly the time of merger.\n", + " \n", + "It's important to note that anything which could be a variable paramater, can be transformed\n", + "into a static parameter by supplying a specific value for it. We take advantage of this below\n", + "to limit our analyis to only sample over 'distance', 'inclination', and 'tc'. We set the sky location\n", + "to the location of NGC 4993, the galaxy where an electromagnetic counterpart to GW170817 was observed. </div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "JtVKVS1ijmGK" + }, + "outputs": [], + "source": [ + "# Parameters to keep fixed\n", + "static = {'mass1':1.3757,\n", + " 'mass2':1.3757,\n", + " 'approximant':\"TaylorF2\",\n", + " 'f_lower':25.0,\n", + " 'polarization':0,\n", + " 'ra': 3.44615914,\n", + " 'dec': -0.40808407\n", + " }\n", + "\n", + "# Parameters to vary\n", + "variable = ('distance',\n", + " 'inclination',\n", + " 'tc')\n", + "\n", + "# Set priors\n", + "inclination_prior = dists.SinAngle(inclination=None)\n", + "distance_prior = dists.Uniform(distance=(10, 100))\n", + "tc_prior = dists.Uniform(tc=(m.time-0.1, m.time+0.1))\n", + "\n", + "prior = dists.JointDistribution(variable, inclination_prior, distance_prior,\n", + " tc_prior)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "5tjRu3RSjmGL" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "We are not ready to create our SingleTemplate model instance. Note how the variable and static parameters\n", + "are passed to the model. This is a common way this information can be passed for built-in pycbc inference models.\n", + "\n", + "Notice that we are no longer using the Emcee sampler. While Emcee is sufficient for many problems, EmceePT, a parallel tempered version of Emcee is more effective at most gravitational-wave data analysis problems. There is one additional parameter we need to give to EmcceePT which is the number of temperatures. The output of this sampler will thus be 3-dimensional (temps x walkers x iterations). The 'coldest' temperature (0) will contain our actual results. </div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "PSphAuk_jmGO" + }, + "outputs": [], + "source": [ + "import copy\n", + "\n", + "f_lows = {ifo: 25.0 for ifo in ifos}\n", + "datacopy = copy.deepcopy(data)\n", + "model = models.SingleTemplate(variable, datacopy, f_lows, static_params=static,\n", + " psds=psds, prior=prior, sample_rate=8192)\n", + "\n", + "engine = sampler.EmceePTSampler(model, 3, 200, nprocesses=8)\n", + "_ = engine.set_p0() # If we don't set p0, it will use the models prior to draw initial points!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "iseSEHkhjmGQ" + }, + "outputs": [], + "source": [ + "# Note it may take ~1-3 minutes for this to run\n", + "engine.run_mcmc(200)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "sxV68ymUjmGR" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> In addition to the sampled parameters, we can also get the likelihood values our model produces. We don't go into it here, but it is also possible for models to make arbitrary auxiliary information about each sample available. </div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 290 + }, + "id": "mbHNuw2wjmGS", + "outputId": "423dc70a-2060-4972-9800-d3ae7bbf5809" + }, + "outputs": [], + "source": [ + "loglike = engine.model_stats['loglikelihood']\n", + "samps = engine.samples\n", + "\n", + "# Note how we have to access the arrays differently that before since there is an additional dimension. \n", + "# The zeroth element of that dimension represents the 'coldest' and is the one we want for our results.\n", + "# The other temperatures represent a modified form of the likelihood that allows walkers to traverse\n", + "# the space more freely.\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "p = ax.scatter(samps['distance'][0,:,-1],\n", + " samps['inclination'][0,:,-1],\n", + " c=loglike[0,:,-1])\n", + "ax.set_xlabel('Distance (Mpc)')\n", + "ax.set_ylabel('Inclination (Radians)')\n", + "\n", + "c = plt.colorbar(p)\n", + "c.set_label('Loglikelihood')\n", + "plt.show()\n", + "plt.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 452 + }, + "id": "bAcDiAd-jmGT", + "outputId": "2ca3e2fe-061b-4906-ba2e-9ce2b9981b44" + }, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "ax.hist(samps['distance'][0,:,-1].flatten(), bins=30)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "IBqSFutmjmGU" + }, + "source": [ + "#### 2.1 Watch how the position of the walkers evolves in time ###\n", + "\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "We can see how our ensemble of walkers evolves with time using the animation utilities of matplotlib. We haven't covered the concept of \"burn-in\" in this tutorial, however, if you watch the animation, you can see the point\n", + "that the distribution is effectively burned-in. \n", + "\n", + "</div>" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 279 + }, + "id": "HHawTVqsjmGU", + "outputId": "8796de3c-6dc2-4ca7-c927-5b2e7bd68812" + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "from matplotlib import animation\n", + "\n", + "# We'll plot the initial position of the walkers\n", + "fig = plt.figure()\n", + "ax = fig.gca()\n", + "a = ax.scatter(samps['distance'][0,:,0],\n", + " samps['inclination'][0,:,0],\n", + " c=loglike[0,:,0])\n", + "ax.set_xlabel('Distance (Megaparsecs)')\n", + "ax.set_ylabel('Inclination (radians)')\n", + "c = plt.colorbar(a)\n", + "c.set_label('Loglikelihood')\n", + "\n", + "# This function will update the plot with the ith iteration of our mcmc chain.\n", + "def animate(i):\n", + " dat = np.array([samps['distance'][0,:,i], samps['inclination'][0,:,i]])\n", + " a.set_offsets(dat.T)\n", + " a.set_array(loglike[0,:,i])\n", + " a.set_clim(vmin=min(loglike[0,:,i]), vmax=max(loglike[0,:,i]))\n", + " return (a, )\n", + " \n", + "nsamples = len(samps['distance'][0,0,:])\n", + "ani = animation.FuncAnimation(fig, animate, frames=nsamples,\n", + " interval=200, blit=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 305 + }, + "id": "U2b_p9EMjmGV", + "outputId": "f5112b58-d93f-4ef2-d454-ad29d3b348d7" + }, + "outputs": [], + "source": [ + "from matplotlib.animation import PillowWriter\n", + "from IPython.display import Image\n", + "\n", + "# Note to get this to play, you may need to right click on the image and\n", + "# download to your computer or open the image in a new tab of your browser\n", + "ani.save('move.gif', writer=PillowWriter(fps=5))\n", + "with open('move.gif','rb') as f:\n", + " display(Image(data=f.read(), format='png'))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "dcYpFlrIjmGV" + }, + "source": [ + "#### Suggested Problems ####\n", + "<div class=\"alert alert-block alert-success\"> \n", + " \n", + "1. If we exclude Virgo and Livingston how is the recovery of distance and inclination affected? How about if we just exclude Virgo? Hint: you can do this by modifying the 'ifos' list of the first cell in this section. \n", + "2. GW170817 was identified with a counterpart in NGC4993. If we use the distance to NG4993 as a prior (41 +-3 Mpc) can we improve our estimate of the source binary inclination? Try setting a Gaussian prior based on this additional information.\n", + "3. How well measured is the time of coalesence ('tc') ?\n", + "3. (For the curious) Try the EmceeSampler like we've used in previous examples. How do the results compare after the same number of iterations? Note, remember that the Emcee and EmceePT samplers don't have the same format sample chains. Ecmee uses a walker x iteration chain, while EmceePT will have a temp x walker x iteration format.\n", + " \n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GfCfGAQBjmGV" + }, + "source": [ + "## 3. Using the `pycbc_inference` command-line script\n", + "\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "The examples above illustrated how the models and samplers are used in the inference module. While this is useful for quick checks, it's not feasible to do large-scale parameter estimation problems in a jupyter notebook. Instead, when actually doing parameter estimation, we use the command-line script `pycbc_inference`. This pulls together the sampler, models, and distributions modules so that we may perform Bayesian inference.\n", + "\n", + "The key arguments that `pycbc_inference` takes are an output file and one or more `config-files` (run `pycbc_inference --help` to see all of the arguments it takes). The config files entirely specify the problem that you will be analyzing. In them, you specify the model to use, the variable parameters, and the prior on each of the parameters. If the model involves gravitational-wave data, you also specify what data to load and how to estimate the PSD. To see how this works, let's repeat the above analysis where we estimate the distance and inclination of GW170817 using the `SingleTempate` model.\n", + "</div>" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GfCfGAQBjmGV" + }, + "source": [ + "### 3.1 Setting up the config file ###\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "*Note: in order to do everything from within the notebook, we'll create the config files by echoing a python string to a file. In a normal situation, you would just use your favorite text editor to create the config files.*" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "GfCfGAQBjmGV" + }, + "source": [ + "#### The model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "jcKrGUcejmGW" + }, + "outputs": [], + "source": [ + "model_config = \"\"\"\n", + "[model]\n", + "name = single_template\n", + "low-frequency-cutoff = 25.\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "WwZQAtVqjmGX", + "outputId": "23da4e85-e62d-4224-8de5-73cb67460f92" + }, + "outputs": [], + "source": [ + "!echo '{model_config}' > model.ini\n", + "!cat model.ini" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ooDUAmdijmGX" + }, + "source": [ + "#### The data\n", + "\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Since this model uses data, we also need to create a data section that specifies what data to read for the analysis and the PSD estimation. See the [PyCBC Inference docs](https://pycbc.org/pycbc/latest/html/inference.html#setting-data) for more information about what options are available and what they mean." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "vTdhOuemjmGY" + }, + "outputs": [], + "source": [ + "data_config = \"\"\"\n", + "[data]\n", + "instruments = H1 L1 V1\n", + "trigger-time = {event_tc}\n", + "analysis-start-time = -260\n", + "analysis-end-time = 40\n", + "psd-estimation = median\n", + "psd-start-time = -260\n", + "psd-end-time = 40\n", + "psd-segment-length = 4\n", + "psd-segment-stride = 2\n", + "psd-inverse-length = 4\n", + "strain-high-pass = 15\n", + "pad-data = 8\n", + "sample-rate = 2048\n", + "frame-files = H1:{h1file} L1:{l1file} V1:{v1file}\n", + "channel-name = H1:{chan} L1:{chan} V1:{chan}\n", + "\"\"\".format(event_tc=Merger(\"GW170817\").time,\n", + " h1file=data_filenames['H1'],\n", + " l1file=data_filenames['L1'],\n", + " v1file=data_filenames['V1'],\n", + " chan=channel_name[3:])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BAnuc_d2jmGa", + "outputId": "3bd5a52a-af90-40e6-99f4-6ce7cbf34670" + }, + "outputs": [], + "source": [ + "!echo '{data_config}' > data.ini\n", + "!cat data.ini" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "G9Cr5BLYjmGc" + }, + "source": [ + "#### The prior\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Now let's specify the prior. We need to provide a section that lists the variable parameters and another that specifies the static parameters. For every variable parameter we have to provide one or more `prior` section(s) that specifies the prior distribution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "NnMvdUb7jmGd" + }, + "outputs": [], + "source": [ + "prior_config = \"\"\"\n", + "[variable_params]\n", + "distance =\n", + "inclination =\n", + "delta_tc =\n", + "\n", + "[static_params]\n", + "mass1 = 1.3757\n", + "mass2 = 1.3757\n", + "f_lower = 25.0\n", + "approximant = TaylorF2\n", + "polarization = 0\n", + "ra = 3.44615914\n", + "dec = -0.40808407\n", + "\n", + "[prior-distance]\n", + "name = uniform\n", + "min-distance = 10\n", + "max-distance = 100\n", + "\n", + "[prior-inclination]\n", + "name = sin_angle\n", + "\n", + "[prior-delta_tc]\n", + "name = uniform\n", + "min-delta_tc = -0.1\n", + "max-delta_tc = 0.1\n", + "\n", + "[waveform_transforms-tc]\n", + "name = custom\n", + "inputs = delta_tc\n", + "tc = ${data|trigger-time} + delta_tc\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "onndUM75jmGf", + "outputId": "170dc4ad-867c-4fbf-ac94-45eb31dcb224" + }, + "outputs": [], + "source": [ + "!echo '{prior_config}' > prior.ini\n", + "!cat prior.ini" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "jJLfhDDfjmHL" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + " *But wait!* There's something odd here: the list of variable parameters contains a `delta_tc`, whereas we need to provide a `tc` for the coalescence time. This illustrates that the `variable_params` can be anything we like them to be with any name (we could have called `delta_tc` `foobar` if we liked). They do not need to be predefined in code anywhere. However, the waveform models do need specific parameters to be provided in order to generate a template waveform. If we use a parameter that is not recognized by the waveform model (see [here](https://pycbc.org/pycbc/latest/html/inference.html#waveform-transforms) for a list of known parameters), then we must provide a `waveform_transforms` section that tells the code how to convert that parameter into something that the waveform model recognizes. In this case, `delta_tc` is not recognized by the waveform model, but `tc` is. So, we've provided a section that converts `delta_tc` into `tc` by adding the trigger time. Also note that when providing the trigger time we used `${data|trigger-time}`. We can use variable substitution in config files. In this case, we've told the config file to get the trigger time that's stored in the `[data]` section. This illustrates why we've chosen to make `delta_tc` the variable parameter: we do not need to copy and paste hard-to-read GPS times all over the place. Instead, we only need provide a time in one location, then refer to it elsewhere. This makes it clear and easy to specify the tc prior, which is just a uniform window +/- 0.1s around the estimated time. Another advantage of this is we could analyze other events using the same prior file, just swapping out data files.\n", + "\n", + "We will see some other, more advanced uses of waveform transforms below. </div>" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "VOpnwpmajmHL" + }, + "source": [ + "#### The sampler\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Finally, we need to specify the sampler settings. To do that, we need to provide a `sampler` section." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "Ou1gT5T5jmHV" + }, + "outputs": [], + "source": [ + "sampler_config = \"\"\"\n", + "[sampler]\n", + "name = emcee_pt\n", + "ntemps = 3\n", + "nwalkers = 200\n", + "niterations = 400\n", + "max-samples-per-chain = 1000\n", + "\n", + "[sampler-burn_in]\n", + "burn-in-test = halfchain\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-lsUarMFjmHX", + "outputId": "970984eb-b70a-4dc3-cdd9-5324037d5e99" + }, + "outputs": [], + "source": [ + "!echo '{sampler_config}' > sampler.ini\n", + "!cat sampler.ini" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "oK19elKHjmHX" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Note that we've also provided a burn-in test. Here, we're telling it just use the second half of the chain. This means that at the end of the run, it will consider the second half of the chains to be post-burn in. An autocorrelation time will be computed over this and a posterior extracted. More sophisticated burn-in tests are available; see the [pycbc.inference.burn_in module](https://pycbc.org/pycbc/latest/html/pycbc.inference.html#module-pycbc.inference.burn_in) for more details." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mlth6kyQjmHX" + }, + "source": [ + "### 3.2 Run `pycbc_inference`\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Now that we've set up our config files, we can run `pycbc_inference`. You can either run it directly from the notebook as in the following block or open a terminal and run the command there: " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0FhEtFILjmHX", + "outputId": "5a8f12f8-0846-4b07-ba0f-56d041914104" + }, + "outputs": [], + "source": [ + "!pycbc_inference --verbose \\\n", + " --config-files model.ini data.ini prior.ini sampler.ini \\\n", + " --output-file inference.hdf \\\n", + " --seed 28572013 \\\n", + " --nprocesses 1 \\\n", + " --force " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H4sJwxfrjmHY" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Now that it's done, we can see that an `inference.hdf` file exists in our directory:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "HHjpCd9WjmHZ", + "outputId": "6f39f44e-9a83-4016-e6f5-47dc4c761333" + }, + "outputs": [], + "source": [ + "!ls -lh inference.hdf" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "XGhFgi9hjmHa" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "This contains all of the samples, and the information needed to extract the posterior from it, along with other diagnostic information about the sampler. Below, we show how to plot a posterior from this." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "nOpi8Q8IjmHa" + }, + "source": [ + "## 4. Plotting the posterior using `pycbc_inference_plot_posterior`\n", + "<div class=\"alert alert-block alert-info\"> \n", + "\n", + "The command-line tool `pycbc_inference_plot_posterior` is used to make corner and posterior plots of our results. We can give it either the direct output of `pycbc_inference` (here, `inference.hdf`) or a posterior file created using `pycbc_inference_extract_samples`. There are several plotting configuration options available (see `pycbc_inference_plot_posterior --help` for the list of options). Here we'll illustrate a few." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "aUex5QBnjmHa" + }, + "source": [ + "### 4.1 Corner scatter plot\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Let's create a corner plot of our results. We'll show every sample in our posterior colored by the signal-to-noise ratio (here defined as $\\sqrt{2\\mathcal{L}}$ where $\\mathcal{L}$ is the log likelihood ratio)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FxYjdEfUjmHa", + "outputId": "f54595ba-4e99-41f1-ecd7-30982792dc70" + }, + "outputs": [], + "source": [ + "!pycbc_inference_plot_posterior --verbose \\\n", + " --input-file inference.hdf \\\n", + " --output-file posterior.png \\\n", + " --plot-scatter --plot-marginal --z-arg snr" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 497 + }, + "id": "dxQCoSvojmHb", + "outputId": "1c5c1ecc-645a-473d-d1f7-875a16e115f9" + }, + "outputs": [], + "source": [ + "Image('posterior.png', height=480)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SEeHoQfkjmHd" + }, + "source": [ + "### 4.2 2D density plot\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "By default, we see that it has plotted all of the `variable_params`. Let's just plot distance vs inclination instead. We can do that via the `--parameters` argument. Let's also make a density plot with 2D marginal contours rather than a scatter plot. We'll do that by dropping the `--plot-scatter` and `--z-arg` commands, adding `--plot-density` and `--plot-contours` instead." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "7l9zQnzGjmHe", + "outputId": "0b24819d-6961-4880-f9a0-7219ae1a2185" + }, + "outputs": [], + "source": [ + "!pycbc_inference_plot_posterior --verbose \\\n", + " --input-file inference.hdf \\\n", + " --output-file posterior-dist_inc.png \\\n", + " --plot-density --plot-contours --plot-marginal \\\n", + " --parameters inclination distance" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 497 + }, + "id": "AlBBjC99jmHe", + "outputId": "79371161-c2c5-4931-c424-934097cd66e6" + }, + "outputs": [], + "source": [ + "Image('posterior-dist_inc.png', height=480)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "vmIRUDwLjmHg" + }, + "source": [ + "### 4.3 Manipulating parameters on the command line\n", + "<div class=\"alert alert-block alert-info\"> \n", + "\n", + "The `--parameters` can be used to do more than just turn certain parameters on or off. We can also apply math functions to parameters using standard python syntax. Any numpy function may be used. Functions from the [pycbc.conversions](http://pycbc.org/pycbc/latest/html/pycbc.html#module-pycbc.conversions), [pycbc.coordinates](http://pycbc.org/pycbc/latest/html/pycbc.html#module-pycbc.coordinates), or [pycbc.cosmology](http://pycbc.org/pycbc/latest/html/pycbc.html#module-pycbc.cosmology) modules are also available. To see all of the parameters in our results file, along with all the functions that may be carried out on them, we can use the `--file-help` argument. This will print a message to screen then exit:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8yxjQcUgjmHg", + "outputId": "942e85ee-fda6-4a51-c801-3c1521c48564" + }, + "outputs": [], + "source": [ + "!pycbc_inference_plot_posterior --input-file inference.hdf --file-help" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HXHN_DgTjmHg" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "One of the available functions, [redshift](https://pycbc.org/pycbc/latest/html/pycbc.html#pycbc.cosmology.redshift), takes in luminosity distance and converts it to redshift assuming a standard cosmology. Let's use that, and some of the numpy functions, to plot redshift versus inclination angle in degrees. Let's also add a line at the redshift of [NGC4993](https://en.wikipedia.org/wiki/NGC_4993) to see how well our results agree. We'll do that using the `--expected-parameters` command." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FgJ8uG1ljmHr", + "outputId": "252915ca-6a7a-4b22-b7fa-74f2c6a15bb7" + }, + "outputs": [], + "source": [ + "!pycbc_inference_plot_posterior --verbose \\\n", + " --input-file inference.hdf \\\n", + " --output-file posterior-redshift_inc.png \\\n", + " --plot-density --plot-contours --plot-marginal \\\n", + " --parameters 'inclination*180/pi:$\\iota$ (deg)' 'redshift(distance):redshift' \\\n", + " --expected-parameters 'redshift(distance):0.009727'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 497 + }, + "id": "1IhOtnBTjmHs", + "outputId": "06e02591-b6bc-4695-8695-55b3addc041e" + }, + "outputs": [], + "source": [ + "Image('posterior-redshift_inc.png', height=480)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "bgarWmf8jmHs" + }, + "source": [ + "## 5. Using waveform transforms in the config file\n", + "<div class=\"alert alert-block alert-info\"> \n", + "\n", + "The functions available to the `--parameters` argument of `pycbc_inference_plot_posterior` are actually used throughout the `inference` module (if you're curious, this is made possible via [FieldArrays](https://pycbc.org/pycbc/latest/html/pycbc.io.html#pycbc.io.record.FieldArray), which is a custom wrapping of numpy record arrays; see the `inference_5_results_io` notebook for more details). Of particular note, you can use the same set of functions in the `waveform_transforms` section(s) of the config file. This allows you to carry out more complicated inference without needing to modify the PyCBC source code.\n", + "\n", + "To illustrate this, let's modify the prior in the above problem to use a prior uniform in comoving volume rather than a prior uniform in distance.\n", + "\n", + "First, we'll need boundaries for our comoving volume prior. Let's use the cosmology module to get the comoving volume corresponding to a luminosity distance of 10 and 100 Mpc:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tatIAZyOjmHt", + "outputId": "9702aff6-5a28-44a5-d512-479306b14ab7" + }, + "outputs": [], + "source": [ + "from pycbc import cosmology\n", + "\n", + "vmin, vmax = cosmology.cosmological_quantity_from_redshift(cosmology.redshift([10., 100.]), 'comoving_volume')\n", + "print(vmin, vmax)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Q0fiOzSLjmHu" + }, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "Now let's modify our prior. We'll swap `distance` for `comoving_volume`. Since the waveform's require luminosity distance, we'll provide a waveform transform that uses the [distance_from_comoving_volume](https://pycbc.org/pycbc/latest/html/pycbc.html#pycbc.cosmology.distance_from_comoving_volume) function in the cosmology module:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "sCRKXFeZjmHu" + }, + "outputs": [], + "source": [ + "prior_config = \"\"\"\n", + "[variable_params]\n", + "comoving_volume =\n", + "inclination =\n", + "delta_tc =\n", + "\n", + "[static_params]\n", + "mass1 = 1.3757\n", + "mass2 = 1.3757\n", + "f_lower = 25.0\n", + "approximant = TaylorF2\n", + "polarization = 0\n", + "ra = 3.44615914\n", + "dec = -0.40808407\n", + "\n", + "[prior-comoving_volume]\n", + "name = uniform\n", + "min-comoving_volume = 4160\n", + "max-comoving_volume = 3921536\n", + "\n", + "[waveform_transforms-distance]\n", + "name = custom\n", + "inputs = comoving_volume\n", + "distance = distance_from_comoving_volume(comoving_volume)\n", + "\n", + "[prior-inclination]\n", + "name = sin_angle\n", + "\n", + "[prior-delta_tc]\n", + "name = uniform\n", + "min-delta_tc = -0.1\n", + "max-delta_tc = 0.1\n", + "\n", + "[waveform_transforms-tc]\n", + "name = custom\n", + "inputs = delta_tc\n", + "tc = ${data|trigger-time} + delta_tc\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "txHXSIXZjmHu", + "outputId": "d5e6fdac-6343-447b-b936-47f2ae485491" + }, + "outputs": [], + "source": [ + "!echo '{prior_config}' > prior.ini\n", + "!cat prior.ini" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "mE_pOk_pjmHv" + }, + "source": [ + "### Suggested problems:\n", + "<div class=\"alert alert-block alert-success\"> \n", + " \n", + " \n", + " 1. Rerun the above script (starting from section 3.2) with the uniform in comoving volume prior. Note that when you plot the posterior, you'll get `comoving_volume` if you do not provide a `--parameters` argument. Add the parameters argument to plot distance instead. Do the same for redshift.\n", + " 2. Repeat, but estimate the sky location. To do this, you'll want to move `ra` and `dec` into the `[variable_params]`. What prior should you use? Take a look at the [list of available distributions](https://pycbc.org/pycbc/latest/html/inference.html#configuring-the-prior). Answer [here](https://github.com/gwastro/pycbc/blob/v1.16.12/examples/inference/priors/bbh-uniform_comoving_volume.ini#L160-L161) (no peaking!)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PSWa2SQnjmHw" + }, + "source": [ + "## 6. Estimate the masses of GW170817 ##\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + " \n", + "In the previous example we quickly estimated the extrinsic parameters of GW170817 by fixing the intrinsic. This was fast, since it did not require regenerating a waveform for each likelihood evaluation. Now let's try estimating the masses of GW170817. This is generally slower, since it requires generating a waveform on each likelihood call. However, in the example below, we'll use the [relative binning model](https://pycbc.org/pycbc/latest/html/pycbc.inference.models.html#pycbc.inference.models.relbin.Relative). This uses a technique presented in [Zackay et al.](https://arxiv.org/abs/1806.08792). Basically, a reference waveform is used that's close to the peak likelihood. A linear approximation is used to interpolate the likelihood around this waveform, reducing the number of frequency points that we need to evaluate, and speeding up the analysis.\n", + "\n", + "To do this, we'll use the same `data.ini` and `sampler.ini` files as above. We'll change the `model` to the `relative` one and provide the necessary arguments to generate the fiducial waveform. We'll make the chirp mass (`mchirp`) and symmetric mass ratio (`eta`) the variable parameters; for speed, we'll fix the extrinsic parameters." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "q3PPVjHLjmHw" + }, + "source": [ + "### 6.1 Get the extrinsic parameters\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + "For speed, we'll fix the extrinsic parameters. We'll use our previous results using the `SingleTemplate` model to get the maximum likelihood values of the distance, inclination, and coalescence time. To do that, we'll use `pycbc_inference_table_summary` to print out a table of the values." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "O6GTRVnIjmHw", + "outputId": "fb10de5c-bde2-4cd8-ba57-af63b4a404dc" + }, + "outputs": [], + "source": [ + "!pycbc_inference_table_summary \\\n", + " --input-file inference.hdf \\\n", + " --output-file posterior_summary.html \\\n", + " --verbose" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 196 + }, + "id": "qwX15ZJRjmHw", + "outputId": "fa20896a-b662-439f-9960-bd9238fd398e" + }, + "outputs": [], + "source": [ + "from IPython.display import HTML\n", + "HTML('posterior_summary.html')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "RTU26dPhjmHx" + }, + "source": [ + "### 6.1 Setup the config files" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "InMkn8rcjmHx" + }, + "outputs": [], + "source": [ + "model_config = \"\"\"\n", + "[model]\n", + "name = relative\n", + "low-frequency-cutoff = 25.0\n", + "high-frequency-cutoff = 1024.0\n", + "epsilon = 0.03\n", + "mass1_ref = 1.3757\n", + "mass2_ref = 1.3757\n", + "tc_ref = ${data|trigger-time}\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "eMjk-zRQjmHy", + "outputId": "bc2058ae-0cec-4511-8867-13aa4886c12d" + }, + "outputs": [], + "source": [ + "!echo '{model_config}' > model.ini\n", + "!cat model.ini" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "T1ORZO2AjmHz" + }, + "outputs": [], + "source": [ + "prior_config = \"\"\"\n", + "[variable_params]\n", + "mass1 =\n", + "mass2 =\n", + "\n", + "[static_params]\n", + "f_lower = 25.0\n", + "approximant = TaylorF2\n", + "polarization = 0\n", + "ra = 3.44615914\n", + "dec = -0.40808407\n", + "distance = 48\n", + "inclination = 3\n", + "delta_tc = 0.028365\n", + "\n", + "[prior-mass1]\n", + "name = uniform\n", + "min-mass1 = 1\n", + "max-mass1 = 2\n", + "\n", + "[prior-mass2]\n", + "name = uniform\n", + "min-mass2 = 1\n", + "max-mass2 = 2\n", + "\n", + "[waveform_transforms-tc]\n", + "name = custom\n", + "inputs = delta_tc\n", + "tc = ${data|trigger-time} + delta_tc\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "z7V-zu6GjmH1" + }, + "outputs": [], + "source": [ + "prior_config = \"\"\"\n", + "[variable_params]\n", + "mchirp =\n", + "eta =\n", + "\n", + "[static_params]\n", + "f_lower = 25.0\n", + "approximant = TaylorF2\n", + "polarization = 0\n", + "ra = 3.44615914\n", + "dec = -0.40808407\n", + "distance = 48\n", + "inclination = 3.0\n", + "delta_tc = 0.028365\n", + "\n", + "[prior-mchirp]\n", + "name = uniform\n", + "min-mchirp = 1.1876\n", + "max-mchirp = 1.2076\n", + "\n", + "[prior-eta]\n", + "name = uniform\n", + "min-eta = 0.23\n", + "max-eta = 0.25\n", + "\n", + "[waveform_transforms-mass1+mass2]\n", + "; transform from mchirp, eta to mass1, mass2 for waveform generation\n", + "name = mchirp_eta_to_mass1_mass2\n", + "\n", + "[waveform_transforms-tc]\n", + "name = custom\n", + "inputs = delta_tc\n", + "tc = ${data|trigger-time} + delta_tc\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "8RzKv9cOjmH2", + "outputId": "7a20b07a-f04e-45f2-c7ed-2aa4ee390a97" + }, + "outputs": [], + "source": [ + "!echo '{prior_config}' > prior.ini\n", + "!cat prior.ini" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2QNjJC4djmH4" + }, + "source": [ + "### 6.2 Run\n", + "<div class=\"alert alert-block alert-info\"> \n", + " \n", + " \n", + "*Note: this may take several minutes to run.*" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ge06jfFhjmH5", + "outputId": "721c65db-14fe-4147-a138-ac1f24e7a30a" + }, + "outputs": [], + "source": [ + "!pycbc_inference --verbose \\\n", + " --config-files model.ini data.ini prior.ini sampler.ini \\\n", + " --output-file inference-masses.hdf \\\n", + " --seed 3214897 \\\n", + " --nprocesses 1 \\\n", + " --force " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_fEECnBcjmH5" + }, + "source": [ + "### 6.3 Plot the posterior" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4W_1BxnmjmH6", + "outputId": "6d0ad813-d3ba-4a29-dcc9-641ccb456945" + }, + "outputs": [], + "source": [ + "!pycbc_inference_plot_posterior --verbose \\\n", + " --input-file inference-masses.hdf \\\n", + " --output-file posterior.png \\\n", + " --plot-scatter --plot-marginal --z-arg snr \\\n", + " --parameters mchirp eta" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 497 + }, + "id": "7tyJV1hajmH6", + "outputId": "a30a7fdf-f1d6-4b1d-aa1e-a093be91bf93" + }, + "outputs": [], + "source": [ + "Image('posterior.png', height=480)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qZ4ElrLNjmH7" + }, + "source": [ + "### Suggested problems:\n", + "<div class=\"alert alert-block alert-success\"> \n", + "\n", + " 1. Plot source-frame chirp mass instead.\n", + " 2. Repeat the above, but use a prior uniform in mass1 and mass2. Do the results look converged after just 400 iterations? If not, try increasing the number of iterations. Also try increasing the number of temperatures. Note that this will take longer to analyze as a result. When plotting the results, notice that there are points where mass2 > mass1. Replot with mass1 > mass2. You can do that by using the `primary_mass` and `secondary_mass` functions.\n", + " 3. Repeat the same, but use a prior uniform in source-frame masses. See the example BBH prior config [here](https://github.com/gwastro/pycbc/blob/v1.16.12/examples/inference/priors/bbh-uniform_comoving_volume.ini) for help." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "colab": { + "collapsed_sections": [ + "rKgf-2PsjmFU", + "h_JjuLQWjmFh", + "U_AzyF90jmFu", + "avtlTgf8jmFw", + "dcYpFlrIjmGV", + "mE_pOk_pjmHv", + "qZ4ElrLNjmH7" + ], + "name": "tutorial_2-inference.ipynb", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/courses/course-for-prof-Nissanke/Saas-Fee_Tutorial_2.ipynb b/courses/course-for-prof-Nissanke/Saas-Fee_Tutorial_2.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..fa66fdd1caa810a0972af87ac2239dc946f02c29 --- /dev/null +++ b/courses/course-for-prof-Nissanke/Saas-Fee_Tutorial_2.ipynb @@ -0,0 +1,148 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 21, + "id": "b16759cd", + "metadata": {}, + "outputs": [], + "source": [ + "import pycbc\n", + "import numpy as np\n", + "from matplotlib import pyplot\n", + "from IPython.display import Image" + ] + }, + { + "cell_type": "markdown", + "id": "78e5bb2a", + "metadata": {}, + "source": [ + "### Gravitational wave data analysis on a simulated signal" + ] + }, + { + "cell_type": "markdown", + "id": "37dc0aa3", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + "\n", + "For this exercise we are going to perform data analysis on a simulated binary neutron star or black hole - neutron star signal. We again use the relative binning method that is built-in PyCBC to speed up the analysis, that is otherwise too expensive to run within a feasible time on a laptop. \n", + "\n", + "In the \"Injections\" directory you'll find 60 different simulated signals. Because the relative binning method requires a reference waveform the masses of the two components are available in the masses_{i}.txt file. Use what you have seen in the previous notebook to generate a posterior distribution on parameters of your choice, like the masses, tidal deformability (deformabilities), distance, inclination and spins. Note that the more parameters you choose to infer, the longer a run will take. For simplicity we've fixed the sky position to ra = 3.44 and dec = -0.41 and the polarization to 0. A starting point for the configuration file is below. (The injection parameters can be found if necessary in the directory \"InjectionParameters\", but try first without looking at these." + ] + }, + { + "cell_type": "markdown", + "id": "b0991701", + "metadata": {}, + "source": [ + "<div class=\"alert alert-block alert-info\"> \n", + "\n", + "*Useful tips:* \n", + "- *Since the chirp mass is measured very precisely, sampling in this parameter speeds up the inference (`pycbc.transforms` can be useful here)* \n", + "- *Use pycbc to get a rough estimate of the duration of the signal*\n", + "- *Use a very small value for the epsilon parameter for the relative binning, i.e. ~0.001 - 0.01*" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "436f8920", + "metadata": {}, + "outputs": [], + "source": [ + "config_file = \"\"\"\n", + "[data]\n", + "instruments = H1 L1 V1 \n", + "trigger-time = 1234567890\n", + "analysis-start-time = \n", + "analysis-end-time = \n", + "sample-rate = 4096\n", + "fake-strain = H1:aLIGOZeroDetHighPower L1:aLIGOZeroDetHighPower V1:AdvVirgo \n", + "fake-strain-seed = H1:44 L1:45 V1:46\n", + "psd-estimation = median-mean\n", + "psd-inverse-length = 8\n", + "psd-segment-length = 8\n", + "psd-segment-stride = 4\n", + "psd-start-time = -256\n", + "psd-end-time = 256\n", + "channel-name = H1:STRAIN L1:STRAIN V1:STRAIN \n", + "injection-file = \n", + "strain-high-pass = 15\n", + "pad-data = 8\n", + "\n", + "Add your own code here\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e2d4c362", + "metadata": {}, + "outputs": [], + "source": [ + "!echo '{config_file}' > config.ini" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "acff7aa6", + "metadata": {}, + "outputs": [], + "source": [ + "!pycbc_inference --verbose \\\n", + "--config-files config.ini \\\n", + "--output-file posterior.hdf \\\n", + "--seed 32148 \\\n", + "--nprocesses 2 \\\n", + "--force" + ] + }, + { + "cell_type": "markdown", + "id": "65210a49", + "metadata": {}, + "source": [ + "### Optional questions: \n", + "<div class=\"alert alert-block alert-success\"> \n", + "\n", + "1. What are the most important degeneracies between different parameters? \n", + "2. What happens with different network configurations (for example only LIGO Livingston or with the addition of Kagra) \n", + "3. How does the choice of waveform approximant affect the posterior distribution? " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd08dfe6", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/courses/course-for-prof-Nissanke/requirements.txt b/courses/course-for-prof-Nissanke/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..62a375434849019740b619d06d9d71898232fc93 --- /dev/null +++ b/courses/course-for-prof-Nissanke/requirements.txt @@ -0,0 +1,9 @@ +numpy +scipy +matplotlib +pycbc=1.17.0 +lalsuite +ligo-common +astropy +seaborn +emcee<3.0.0 diff --git a/courses/course-for-prof-margutti/.gitkeep b/courses/course-for-prof-margutti/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/courses/course-for-prof-margutti/.metadata.yaml b/courses/course-for-prof-margutti/.metadata.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8f29f182b506d17d8805dc2ca5bc8d4698f6eac7 --- /dev/null +++ b/courses/course-for-prof-margutti/.metadata.yaml @@ -0,0 +1,8 @@ +Responsible: https://renkulab.io/gitlab/kate.alexander + +Resources: + comment: + runtime: + extra: + - js9 + - ciao diff --git a/courses/course-for-prof-margutti/GW170817_data.txt b/courses/course-for-prof-margutti/GW170817_data.txt new file mode 100644 index 0000000000000000000000000000000000000000..2b9ce777941b2ae04287f0c5045bdb959280aeb9 --- /dev/null +++ b/courses/course-for-prof-margutti/GW170817_data.txt @@ -0,0 +1,125 @@ +# Time_sec Flux_mJy FluxErrP_mJy FluxErrN_mJy Freq_Hz Obs Ref Det_Nondet +# +#------------------------------------------------------------------------------ +#NOTES on how to use this compilation of afterglow data for model fitting: +#------------------------------------------------------------------------------ +#Time of GW trigger: 2017-08-17 12:41:04 UTC GW trigger= Aug 17.528519UT MJD=57982.528519 +#All the times below are referred to this one. +# +#References: +#0 - Alexander et al 2018 Uncertainties are from the flux density fit, not the local RMS (which can be smaller) +#1 - Hallinan et al 2017: VLA upper limits are flux at transient location +2*RMS. For VLA detections the flux measurements errors are sqrt(RMS^2+ 5%^2) +#2 - Mooley+2018a 2018Natur.554..207M UL are 3*RMS (local). Uncertainties on fluxes are RMS (5% systematic not included) +#3 - Dobie+2018 +#4 - Margutti et al 2018 Uncertainties are from the flux density fit, not the local RMS (which can be smaller) +#5 - Alexander et al 2017 Uncertainties are from the flux density fit, not the local RMS (which can be smaller) +#6 - Mooley et al 2018b Unclear how they did the flux errors +#7 - Hajela et al 2019 +#8 - Fong et al 2019 +#9 - Hajela et al 2021 +# +#For radio upper limits those are 3*RMS unless otherwise stated above. +#The most recent Chandra analysis from Hajela+2021 uses asymmetrical error bars and we use the best fitting Gamma from the spectrum from a 1.5†region at all times #t<900 days. At t>900 days we use Gamma=1.66 for the spectral calibration (i.e. common X-ray index of all the X-ray obs from this re-analysis). +# +9546336 1.10E-04 1.90E-05 0 5.00E+14 WFC3/UVIS2 Fong+2019 1 +11840256 8.40E-05 1.80E-05 0 5.00E+14 ACS/WFC Fong+2019 1 +14272416 9.10E-05 1.60E-05 0 5.00E+14 WFC3/UVIS Fong+2019 1 +14878944 8.50E-05 1.70E-05 0 5.00E+14 WFC3/UVIS2 Fong+2019 1 +18066240 8.20E-05 2.00E-05 0 5.00E+14 WFC2/UVIS Fong+2019 1 +18867168 6.30E-05 1.80E-05 0 5.00E+14 ACS/WFC Fong+2019 1 +25643520 4.40E-05 1.40E-05 0 5.00E+14 WFC3/UVIS2 Fong+2019 1 +28358208 3.40E-05 1.10E-05 0 5.00E+14 WFC3/UVIS2 Fong+2019 1 +29102112 4.80E-05 0.00E+00 0 5.00E+14 ACS/WFC Fong+2019 0 +31304448 2.70E-05 7.20E-06 0 5.00E+14 WFC3/UVIS2 Fong+2019 1 +50468832 1.90E-05 0.00E+00 0 5.00E+14 ACS/WFC Fong+2019 0 +106829280.0 0.000144553 0.00E+00 0 2.13E+14 WFC3/IR Kilpatrick+2021 0 + +189216 1.40E-07 0.00E+00 0.00E+00 2.42E+17 Chandra Hajela+2019 0 +794603 2.10E-07 8.72E-08 -9.02E-08 2.42E+17 Chandra Hajela+2021 1 +1329696 6.44E-07 1.72E-07 -1.20E-07 2.42E+17 Chandra Hajela+2021 1 +9364560.034 2.21E-06 2.14E-07 -2.02E-07 2.42E+17 Chandra Hajela+2021 1 +13630038.47 2.41E-06 2.62E-07 -2.11E-07 2.42E+17 Chandra Hajela+2021 1 +22435076.8 1.07E-06 1.64E-07 -1.55E-07 2.42E+17 Chandra Hajela+2021 1 +30983788 9.12E-07 2.10E-07 -1.73E-07 2.42E+17 Chandra Hajela+2021 1 +50269030.43 2.14E-07 1.09E-07 -7.72E-08 2.42E+17 Chandra Hajela+2021 1 +64063689.87 1.26E-07 6.64E-08 -5.39E-08 2.42E+17 Chandra Hajela+2021 1 +81156384 1.54977e-07 8.46022e-08 -6.26098e-08 2.42E+17 Chandra Hajela+2021 1 +106627103.9 1.948e-07 5.4640343e-08 -5.7780354e-08 2.42E+17 Chandra Hajela+2021 1 + +288576 3.20E-02 0.00E+00 0.00E+00 3.00E+09 VLA Hallinan+2017 0 +462240 1.90E-02 0.00E+00 0.00E+00 6.20E+09 VLA Hallinan+2017 0 +1162080 2.30E-02 0.00E+00 0.00E+00 6.20E+09 VLA Hallinan+2017 0 +1327968 1.30E-02 0.00E+00 0.00E+00 6.20E+09 VLA Hallinan+2017 0 +1418688 1.87E-02 6.30E-03 0.00E+00 3.00E+09 VLA Hallinan+2017 1 +1423872 2.83E-02 5.40E-03 0.00E+00 6.20E+09 VLA Hallinan+2017 1 +1502496 1.51E-02 3.90E-03 0.00E+00 3.00E+09 VLA Hallinan+2017 1 +1583712 1.45E-02 3.70E-03 0.00E+00 3.00E+09 VLA Hallinan+2017 1 +1671840 1.59E-02 5.50E-03 0.00E+00 6.20E+09 VLA Hallinan+2017 1 +1845504 1.36E-02 2.90E-03 0.00E+00 6.20E+09 VLA Hallinan+2017 1 +1931904 2.25E-02 3.40E-03 0.00E+00 3.00E+09 VLA Hallinan+2017 1 +2018304 2.26E-02 3.40E-03 0.00E+00 6.00E+09 VLA Hallinan+2017 1 +2096064 2.56E-02 2.90E-03 0.00E+00 3.00E+09 VLA Hallinan+2017 1 +2706048 3.40E-02 3.60E-03 0.00E+00 3.00E+09 VLA Mooley+2018a 1 +3053376 4.40E-02 1.00E-02 0.00E+00 1.50E+09 VLA Mooley+2018a 1 +3398976 1.44E-02 0.00E+00 0.00E+00 1.50E+10 VLA Mooley+2018a 0 +3996864 4.40E-02 4.00E-03 0.00E+00 3.00E+09 VLA Mooley+2018a 1 +4601664 3.20E-02 4.00E-03 0.00E+00 6.00E+09 VLA Mooley+2018a 1 +4688928 4.80E-02 6.00E-03 0.00E+00 3.00E+09 VLA Mooley+2018a 1 +4943808 6.10E-02 9.00E-03 0.00E+00 3.00E+09 VLA Mooley+2018a 1 +5802624 4.26E-02 4.10E-03 0.00E+00 6.00E+09 VLA Mooley+2018a 1 +6238080 5.46E-02 5.50E-03 0.00E+00 4.50E+09 VLA Mooley+2018a 1 +8041248 9.80E-02 1.40E-02 0.00E+00 1.60E+09 VLA Mooley+2018a 1 +8046432 7.00E-02 5.70E-03 0.00E+00 3.00E+09 VLA Mooley+2018a 1 +8051616 1.86E-02 3.10E-03 0.00E+00 1.50E+10 VLA Mooley+2018a 1 +17002656 9.10E-02 9.10E-03 0.00E+00 2.50E+09 VLA Dobie+2018 1 +17002656 6.69E-02 6.10E-03 0.00E+00 3.50E+09 VLA Dobie+2018 1 +6922368 3.74E-02 4.20E-03 0.00E+00 6.00E+09 VLA Margutti+2018 1 +9681984 6.97E-02 7.50E-03 0.00E+00 5.00E+09 VLA Margutti+2018 1 +9681984 5.77E-02 4.70E-03 0.00E+00 7.00E+09 VLA Margutti+2018 1 +9953280 8.23E-02 2.07E-02 0.00E+00 2.60E+09 VLA Margutti+2018 1 +9953280 9.58E-02 1.10E-02 0.00E+00 3.40E+09 VLA Margutti+2018 1 +9950688 5.64E-02 1.04E-02 0.00E+00 9.00E+09 VLA Margutti+2018 1 +9950688 5.25E-02 1.01E-02 0.00E+00 1.10E+10 VLA Margutti+2018 1 +9945504 4.32E-02 5.70E-03 0.00E+00 1.30E+10 VLA Margutti+2018 1 +9945504 4.52E-02 7.00E-03 0.00E+00 1.50E+10 VLA Margutti+2018 1 +9945504 4.40E-02 7.90E-03 0.00E+00 1.70E+10 VLA Margutti+2018 1 +14089248 1.05E-01 2.23E-02 0.00E+00 2.60E+09 VLA Margutti+2018 1 +14089248 9.12E-02 1.74E-02 0.00E+00 3.40E+09 VLA Margutti+2018 1 +14086656 8.08E-02 1.25E-02 0.00E+00 5.00E+09 VLA Margutti+2018 1 +14086656 6.11E-02 7.30E-03 0.00E+00 7.00E+09 VLA Margutti+2018 1 +14084064 5.50E-02 9.90E-03 0.00E+00 9.00E+09 VLA Margutti+2018 1 +14084064 3.44E-02 1.00E-02 0.00E+00 1.10E+10 VLA Margutti+2018 1 +14078880 4.17E-02 6.30E-03 0.00E+00 1.30E+10 VLA Margutti+2018 1 +14078880 3.89E-02 7.20E-03 0.00E+00 1.50E+10 VLA Margutti+2018 1 +14078880 4.35E-02 7.70E-03 0.00E+00 1.70E+10 VLA Margutti+2018 1 +49248 1.44E-01 0.00E+00 0.00E+00 1.00E+10 VLA Alexander+2017 0 +124416 1.38E-02 0.00E+00 0.00E+00 1.00E+10 VLA Alexander+2017 0 +209088 1.77E-02 0.00E+00 0.00E+00 1.50E+10 VLA Alexander+2017 0 +210816 1.71E-02 0.00E+00 0.00E+00 1.00E+10 VLA Alexander+2017 0 +212544 2.19E-02 0.00E+00 0.00E+00 6.00E+09 VLA Alexander+2017 0 +473472 2.85E-02 0.00E+00 0.00E+00 1.00E+10 VLA Alexander+2017 0 +716256 1.74E-02 0.00E+00 0.00E+00 1.00E+10 VLA Alexander+2017 0 +1158624 1.98E-02 0.00E+00 0.00E+00 1.00E+10 VLA Alexander+2017 0 +1678752 1.35E-02 0.00E+00 0.00E+00 1.00E+10 VLA Alexander+2017 0 +1682208 1.90E-02 6.00E-03 0.00E+00 6.00E+09 VLA Alexander+2017 1 +3389472 2.69E-02 6.20E-03 0.00E+00 6.00E+09 VLA Alexander+2017 1 +18741024 6.90E-02 1.50E-02 0.00E+00 3.00E+09 VLA Alexander+2018 1 +18738432 3.86E-02 8.70E-03 0.00E+00 6.00E+09 VLA Alexander+2018 1 +18735840 2.75E-02 6.60E-03 0.00E+00 1.00E+10 VLA Alexander+2018 1 +18731520 2.09E-02 5.30E-03 0.00E+00 1.50E+10 VLA Alexander+2018 1 +22184064 5.50E-02 1.23E-02 0.00E+00 3.00E+09 VLA Alexander+2018 1 +23558688 4.39E-02 1.05E-02 0.00E+00 3.00E+09 VLA Alexander+2018 1 +23553504 3.61E-02 6.60E-03 0.00E+00 6.00E+09 VLA Alexander+2018 1 +24935904 4.64E-02 1.14E-02 0.00E+00 3.00E+09 VLA Alexander+2018 1 +24930720 3.54E-02 6.60E-03 0.00E+00 6.00E+09 VLA Alexander+2018 1 +18662400 3.63E-02 3.60E-03 0.00E+00 1.00E+10 VLA Mooley+2018b 1 +19008000 6.47E-02 2.70E-03 0.00E+00 3.00E+09 VLA Mooley+2018b 1 +23068800 4.03E-02 2.70E-03 0.00E+00 3.00E+09 VLA Mooley+2018b 1 +25401600 3.12E-02 3.60E-03 0.00E+00 3.00E+09 VLA Mooley+2018b 1 +48072096 5.90E-03 1.90E-03 0.00E+00 6.00E+09 VLA Hajela+2019 1 +63936000 8.40E-03 0.00E+00 0.00E+00 6.00E+09 VLA Hajela+2019 0 +105537600.0 5.10E-03 0.00E+00 0.00E+00 3.00E+09 VLA Hajela+2021 0 +109976796.5 4.80E-03 0.00E+00 0.00E+00 15.00E+09 VLA Hajela+2021 0 +42249600 14.8E-03 2.9E-03 0.00E+00 3.00E+09 VLA Makhatini+2020 1 +66268800 4.9E-03 1.8E-03 0.00E+00 3.00E+09 VLA Makhatini+2020 1 + diff --git a/courses/course-for-prof-margutti/MarguttiActivity1.ipynb b/courses/course-for-prof-margutti/MarguttiActivity1.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..2c384e28697d284ad00d423af44ee92aefe82cca --- /dev/null +++ b/courses/course-for-prof-margutti/MarguttiActivity1.ipynb @@ -0,0 +1,1968 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d55de707-e705-4e95-aa56-e2a0e34f7325", + "metadata": {}, + "source": [ + "# X-ray Data Analysis of point sources" + ] + }, + { + "cell_type": "markdown", + "id": "315c2460-d71c-42da-9ca8-c1f8cf016894", + "metadata": {}, + "source": [ + "Today we will perform some basic analysis on an X-ray dataset of GW170817. The goal is to understand how the raw data from a telescope must be processed to extract flux densities, which can then be used for modeling. This observation was taken with the Chandra X-ray Observatory on 2017 December 3. The data were independently published by several teams, including Margutti et al. (2018) and Ruan et al. (2018). As we will see in the extension activity, X-ray observations of GW170817 and other multi-messenger sources probe the fastest-moving ejecta from the merger. In the case of GW170817, these X-ray data helped prove that GW170817 launched a short GRB-like relativistic jet, viewed off-axis. For additional background, see Margutti & Chornock (2021) for an overview of the wide variety of science enabled by electromagnetic observations of GW170817.\n", + "\n", + "__Goals:__ Understand the very basics of data formats in X-ray Astronomy; get familiar with event files; understand the difference between an event and a photon; learn to filter events in time, space and energy; source detection; source counts and count-rates. " + ] + }, + { + "cell_type": "markdown", + "id": "b6819e85-2d3a-418c-8de1-ec8931adec7b", + "metadata": {}, + "source": [ + "## 1) Getting started\n", + "\n", + "In this tutorial, we will use CIAO (Chandra's custom data reduction software) and ds9. ds9 is a very useful tool for interacting with astronomical images (particularly those in FITS format), and we recommend that you download it for your personal use if you expect to do data analysis in the future. If ds9 is not compatible with your operating system, you can access an online version here: https://js9.si.edu/. This tool should have all of the functionality required for this tutorial, but some of the menu options are different from the standalone application; please ask the TA for help if anything is unclear.\n", + "\n", + "All public Chandra data can be accessed online via the data archive browser: http://cda.harvard.edu/chaser/. Each Chandra observation is associated to an ID; you can search for data by this ID number, or by the target name, coordinates, observation date, etc. In this case, we are using the observation with ID= 20860. To expedite things, we have already downloaded the dataset that we will use in this tutorial.\n", + "\n", + "The data for this activity is contained in the file package_7697_220112160139.tar. In the directory where you would like to work, run:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "c094b215-7a9a-425f-be43-f176706db1ca", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "20860/oif.fits\n", + "20860/00README\n", + "20860/primary/acisf20860N002_evt2.fits.gz\n", + "20860/primary/acisf20860N002_cntr_img2.fits.gz\n", + "20860/primary/acisf20860N002_cntr_img2.jpg\n", + "20860/primary/acisf20860N002_full_img2.fits.gz\n", + "20860/primary/acisf20860N002_full_img2.jpg\n", + "20860/primary/pcadf20860_000N001_asol1.fits.gz\n", + "20860/primary/acisf20860_000N002_bpix1.fits.gz\n", + "20860/primary/acisf20860_000N002_fov1.fits.gz\n", + "20860/primary/orbitf628344305N001_eph1.fits.gz\n", + "20860/axaff20860N002_VV001_vv2.pdf\n", + "20860/secondary/aspect/pcadf628653496N002_aqual1.fits.gz\n", + "20860/secondary/aspect/pcadf628651462N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628658022N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628664582N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628677702N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628671142N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628684262N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628686755N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628693315N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628699875N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628706435N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628712995N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628726115N002_osol1.fits.gz\n", + "20860/secondary/aspect/pcadf628719555N002_osol1.fits.gz\n", + "20860/secondary/ephem/anglesf20860_000N002_eph1.fits.gz\n", + "20860/secondary/ephem/solarf628344305N001_eph1.fits.gz\n", + "20860/secondary/ephem/lunarf628344305N001_eph1.fits.gz\n", + "20860/secondary/acisf20860_000N002_stat1.fits.gz\n", + "20860/secondary/acisf20860_000N002_flt1.fits.gz\n", + "20860/secondary/acisf20860_000N002_msk1.fits.gz\n", + "20860/secondary/acisf20860_000N002_mtl1.fits.gz\n", + "20860/secondary/acisf20860_000N002_evt1.fits.gz\n", + "20860/secondary/acisf628652475N002_1_bias0.fits.gz\n", + "20860/secondary/acisf628652475N002_2_bias0.fits.gz\n", + "20860/secondary/acisf628652475N002_3_bias0.fits.gz\n", + "20860/secondary/acisf628652475N002_4_bias0.fits.gz\n", + "20860/secondary/acisf628653549N002_pbk0.fits.gz\n", + "20860/secondary/axaff20860N002_VV001_vvref2.pdf.gz\n" + ] + } + ], + "source": [ + "%%bash\n", + "tar -xvf package_7697_220112160139.tar" + ] + }, + { + "cell_type": "markdown", + "id": "488f24d5-1cfd-4222-98de-0ce285ff1edc", + "metadata": {}, + "source": [ + "You should now see a new directory with the observation ID for the downloaded dataset." + ] + }, + { + "cell_type": "markdown", + "id": "061b4f8a-a137-4ec3-abad-460cc89c8eb3", + "metadata": {}, + "source": [ + "## 2) Structure of Chandra ACIS-S data\n", + "We will work with Chandra ACIS-S data. Chandra has different instruments onboard. We will use ACIS-S that has the best performance when it comes to detect and characterize faint sources (we will see that the gravitational wave source is one of them).\n", + "\n", + "Go inside the /20860/ directory and list the items there." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8e731d2e-abc5-440c-b6fb-9920574c1678", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "00README\n", + "axaff20860N002_VV001_vv2.pdf\n", + "oif.fits\n", + "primary\n", + "secondary\n" + ] + } + ], + "source": [ + "%%bash\n", + "cd 20860\n", + "ls" + ] + }, + { + "cell_type": "markdown", + "id": "18d4a668-0106-489f-b3d1-e5740d8da608", + "metadata": {}, + "source": [ + "Go into the /primary/ folder and list the content: it contains the results from a dataset that has been already re-processed. The automatic reprocessing is good for the majority of cases (however for publication level products it is always good practice to re-process the data). For your /20860/ data the automatic processing is good enough and we will not reprocess the data ourselves. Most of the files that we need are there already." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "f5b7faf5-a96e-4c2e-bb6c-99d544f81ed0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acisf20860N002_cntr_img2.fits.gz\n", + "acisf20860N002_cntr_img2.jpg\n", + "acisf20860N002_evt2.fits.gz\n", + "acisf20860N002_full_img2.fits.gz\n", + "acisf20860N002_full_img2.jpg\n", + "acisf20860_000N002_bpix1.fits.gz\n", + "acisf20860_000N002_fov1.fits.gz\n", + "orbitf628344305N001_eph1.fits.gz\n", + "pcadf20860_000N001_asol1.fits.gz\n" + ] + } + ], + "source": [ + "%%bash\n", + "ls 20860/primary" + ] + }, + { + "cell_type": "markdown", + "id": "6b9e4b9e-dff9-4515-8a5f-07de300c8f68", + "metadata": {}, + "source": [ + "Most of the files in the directory are fits files (that we will use for our analysis) but we also have .jpg files that offer a very quick view of the results of the observation -but they are not useful for almost anything else-\n", + "\n", + "Now go into the /secondary/ folder and list:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "023bfa72-f26f-4bf7-82e3-9c9d69b62330", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "acisf20860_000N002_evt1.fits.gz\n", + "acisf20860_000N002_flt1.fits.gz\n", + "acisf20860_000N002_msk1.fits.gz\n", + "acisf20860_000N002_mtl1.fits.gz\n", + "acisf20860_000N002_stat1.fits.gz\n", + "acisf628652475N002_1_bias0.fits.gz\n", + "acisf628652475N002_2_bias0.fits.gz\n", + "acisf628652475N002_3_bias0.fits.gz\n", + "acisf628652475N002_4_bias0.fits.gz\n", + "acisf628653549N002_pbk0.fits.gz\n", + "aspect\n", + "axaff20860N002_VV001_vvref2.pdf.gz\n", + "ephem\n", + "20860\n", + "GW170817_data.txt\n", + "MarguttiActivity1.ipynb\n", + "MarguttiExtensions.ipynb\n", + "Xspec_tutorial.pdf\n", + "benchmark_outputs\n", + "fig1.png\n", + "fig2.png\n", + "fig3.png\n", + "fig4.png\n", + "package_7697_220112160139.tar\n" + ] + } + ], + "source": [ + "%%bash\n", + "ls 20860/secondary\n", + "ls" + ] + }, + { + "cell_type": "markdown", + "id": "b974edc5-f838-48b1-8d73-68e465680c67", + "metadata": {}, + "source": [ + "This folder contains a rich set of information about the specifics of the instrument at the time of data acquisition which are necessary to process the data correctly. You can think about /primary/ and /secondary/ as already re-processed and cleaned files (primary) vs. original data products and instrumental info (secondary).\n", + "\n", + "Open with ds9 the file /primary/acisf20860_000N002_evt2.fits.gz in one frame and open the file /secondary/acisf20860_000N002_evt1.fits.gz in a different frame, align the two frames (if you are using the desktop version of ds9: go into the menu Frame --> Match --> Frame --> WCS. If you are using js9: go to View --> Sync Images and check the boxes for alignment, zoom, scale) and blink the two frames. Remember to use log scale in both frames and adjust the contrast. What do you notice? This simple exercise is meant to make you appreciate the “beauty†of data re-processing and cleaning. Show the result to your instructor." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "02479f38-4feb-4930-b9cd-016c756f43e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " <iframe id=\"js9frame\" src='/js9html' width=\"100%\" height=\"700px\" frameBorder=\"0\" scrolling=\"no\"></iframe>\n", + "\n", + " <script> \n", + " frame = document.getElementById('js9frame');\n", + " \n", + " if ( document.URL.includes('renkulab') ) {\n", + " detected_session_id = document.URL.split('/lab/')[0].split('/').pop(); \n", + " console.log(detected_session_id);\n", + " \n", + " frame.src = 'https://renkulab.io/sessions/' + detected_session_id + '/js9html';\n", + " console.log(frame);\n", + " } else {\n", + " console.log('no renku - no need to detect long URL');\n", + " }\n", + " </script>\n", + " " + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# OR: open ds9 in on your laptop or in the VNC session, load the files there (please refer to instructions in https://renkulab.io/gitlab/saasfee2022/course-materials/) load the files there).\n", + "import jpjs9\n", + "jpjs9.JS9.show_js9()" + ] + }, + { + "cell_type": "markdown", + "id": "36989d56-5eb7-4a71-ad91-d55d24d87ca9", + "metadata": {}, + "source": [ + "Open with ds9 the file /primary/acisf20860_000N002_evt2.fits.gz in one frame and open the file /secondary/acisf20860_000N002_evt1.fits.gz in a different frame, align the two frames (if you are using the desktop version of ds9: go into the menu Frame --> Match --> Frame --> WCS. If you are using js9: go to View --> Sync Images and check the boxes for alignment, zoom, scale) and blink the two frames. Remember to use log scale in both frames and adjust the contrast. What do you notice? This simple exercise is meant to make you appreciate the “beauty†of data re-processing and cleaning. Show the result to your instructor." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "06416d05-19ab-478d-b0a3-9a715b83567f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "J = jpjs9.JS9()\n", + "J.Load('20860/primary/acisf20860N002_evt2.fits.gz')\n" + ] + }, + { + "cell_type": "markdown", + "id": "cdb67369-524b-4bf7-bec5-99f2bd9466c4", + "metadata": { + "tags": [] + }, + "source": [ + "Next, we are going to use astropy to further explore the structure and contents of this fits file:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "eabcc274-44c4-49e4-bcaf-47a19350626f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filename: 20860/primary/acisf20860N002_evt2.fits.gz\n", + "No. Name Ver Type Cards Dimensions Format\n", + " 0 PRIMARY 1 PrimaryHDU 30 () \n", + " 1 EVENTS 1 BinTableHDU 884 438489R x 19C [1D, 1I, 1I, 1J, 1I, 1I, 1I, 1I, 1E, 1E, 1E, 1E, 1J, 1J, 1E, 1J, 1I, 1I, 32X] \n", + " 2 GTI 7 BinTableHDU 28 1R x 2C [1D, 1D] \n", + " 3 GTI 6 BinTableHDU 28 4R x 2C [1D, 1D] \n", + " 4 GTI 3 BinTableHDU 28 4R x 2C [1D, 1D] \n", + " 5 GTI 2 BinTableHDU 28 4R x 2C [1D, 1D] \n" + ] + } + ], + "source": [ + "from astropy.io import fits\n", + "evt2 = fits.open('20860/primary/acisf20860N002_evt2.fits.gz')\n", + "evt2.info()" + ] + }, + { + "cell_type": "markdown", + "id": "ce37134d-41bf-4019-bf07-1e229979f4fe", + "metadata": {}, + "source": [ + "ds9 visualizes the image, astropy.io.fits shows the “bones†of the structure of the fits file. But it is the very same file viewed in two different ways.\n", + "\n", + "From the header of the first extension, named EVENTS, find out what is the exposure time of this observation. What do you find? A few lines below, you can see that there is a “dead-time†correction. What is that?" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "f3cddf5b-1cd1-4676-868a-d89d13f1ecd7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "XTENSION= 'BINTABLE' / binary table extension \n", + "BITPIX = 8 / 8-bit bytes \n", + "NAXIS = 2 / 2-dimensional binary table \n", + "NAXIS1 = 64 / width of table in bytes \n", + "NAXIS2 = 438489 / number of rows in table \n", + "PCOUNT = 0 / size of special data area \n", + "GCOUNT = 1 / one data group (required keyword) \n", + "TFIELDS = 19 / number of fields in each row \n", + "EXTNAME = 'EVENTS ' / name of this binary table extension \n", + "HDUNAME = 'EVENTS ' / ASCDM block name \n", + "TTYPE1 = 'time ' / S/C TT corresponding to mid-exposure \n", + "TFORM1 = '1D ' / format of field \n", + "TUNIT1 = 's ' \n", + "TTYPE2 = 'ccd_id ' / CCD reporting event \n", + "TFORM2 = '1I ' / format of field \n", + "TLMIN2 = 0 \n", + "TLMAX2 = 9 \n", + "TTYPE3 = 'node_id ' / CCD serial readout amplifier node \n", + "TFORM3 = '1I ' / format of field \n", + "TLMIN3 = 0 \n", + "TLMAX3 = 3 \n", + "TTYPE4 = 'expno ' / Exposure number of CCD frame containing event \n", + "TFORM4 = '1J ' / format of field \n", + "TLMIN4 = 0 \n", + "TTYPE5 = 'chipx ' / Chip coords \n", + "TFORM5 = '1I ' / format of field \n", + "TUNIT5 = 'pixel ' \n", + "TTYPE6 = 'chipy ' / Chip coords \n", + "TFORM6 = '1I ' / format of field \n", + "TUNIT6 = 'pixel ' \n", + "TLMIN5 = 1 \n", + "TLMAX5 = 1024 \n", + "TLMIN6 = 1 \n", + "TLMAX6 = 1024 \n", + "TTYPE7 = 'tdetx ' / ACIS tiled detector coordinates \n", + "TFORM7 = '1I ' / format of field \n", + "TUNIT7 = 'pixel ' \n", + "TTYPE8 = 'tdety ' / ACIS tiled detector coordinates \n", + "TFORM8 = '1I ' / format of field \n", + "TUNIT8 = 'pixel ' \n", + "TLMIN7 = 1 \n", + "TLMAX7 = 8192 \n", + "TLMIN8 = 1 \n", + "TLMAX8 = 8192 \n", + "TNULL7 = 9999 \n", + "TNULL8 = 9999 \n", + "TTYPE9 = 'detx ' / ACIS detector coordinates \n", + "TFORM9 = '1E ' / format of field \n", + "TUNIT9 = 'pixel ' \n", + "TTYPE10 = 'dety ' / ACIS detector coordinates \n", + "TFORM10 = '1E ' / format of field \n", + "TUNIT10 = 'pixel ' \n", + "TLMIN9 = 5.0000000E-01 \n", + "TLMAX9 = 8.1925000E+03 \n", + "TLMIN10 = 5.0000000E-01 \n", + "TLMAX10 = 8.1925000E+03 \n", + "TTYPE11 = 'x ' / sky coordinates \n", + "TFORM11 = '1E ' / format of field \n", + "TUNIT11 = 'pixel ' \n", + "TTYPE12 = 'y ' / sky coordinates \n", + "TFORM12 = '1E ' / format of field \n", + "TUNIT12 = 'pixel ' \n", + "TLMIN11 = 5.0000000E-01 \n", + "TLMAX11 = 8.1925000E+03 \n", + "TLMIN12 = 5.0000000E-01 \n", + "TLMAX12 = 8.1925000E+03 \n", + "TTYPE13 = 'pha ' / total pulse height of event \n", + "TFORM13 = '1J ' / format of field \n", + "TUNIT13 = 'adu ' \n", + "TLMIN13 = 0 \n", + "TLMAX13 = 36855 \n", + "TNULL13 = 0 \n", + "TTYPE14 = 'pha_ro ' / total read-out pulse height of event \n", + "TFORM14 = '1J ' / format of field \n", + "TUNIT14 = 'adu ' \n", + "TLMIN14 = 0 \n", + "TLMAX14 = 36855 \n", + "TNULL14 = 0 \n", + "TTYPE15 = 'energy ' / nominal energy of event (eV) \n", + "TFORM15 = '1E ' / format of field \n", + "TUNIT15 = 'eV ' \n", + "TLMIN15 = 0.0000000E+00 \n", + "TLMAX15 = 1.0000000E+06 \n", + "TTYPE16 = 'pi ' / pulse invariant energy of event \n", + "TFORM16 = '1J ' / format of field \n", + "TUNIT16 = 'chan ' \n", + "TLMIN16 = 1 \n", + "TLMAX16 = 1024 \n", + "TNULL16 = 0 \n", + "TTYPE17 = 'fltgrade' / event grade, flight system \n", + "TFORM17 = '1I ' / format of field \n", + "TLMIN17 = 0 \n", + "TLMAX17 = 255 \n", + "TTYPE18 = 'grade ' / binned event grade \n", + "TFORM18 = '1I ' / format of field \n", + "TLMIN18 = 0 \n", + "TLMAX18 = 7 \n", + "TTYPE19 = 'status ' / event status bits \n", + "TFORM19 = '32X ' / format of field \n", + "COMMENT +------------------+ \n", + "COMMENT | AXAF FITS File | \n", + "COMMENT +------------------+ \n", + "COMMENT ********************************************************* \n", + "COMMENT > This file is written following certain AXAF-ASC < \n", + "COMMENT > conventions which are documented in ASC-FITS-2.0 < \n", + "COMMENT ********************************************************* \n", + "COMMENT \n", + "COMMENT / Configuration control block--------------------\n", + "COMMENT \n", + "ORIGIN = 'ASC ' / Source of FITS file \n", + "CREATOR = 'cxc - Version DS10.9' / tool that created this output \n", + "ASCDSVER= '10.9.2 ' / Processing system revision \n", + "ASOLFILE= 'pcadf20860_000N001_asol1.fits' \n", + "THRFILE = 'acisD2005-07-01evtspltN0002.fits' \n", + "TLMVER = 'P014 ' / Telemetry revision number (IP&CL) \n", + "REVISION= 2 / Processing version of data \n", + "CHECKSUM= '31JmA0Im40ImA0Im' / HDU checksum updated 2020-11-22T14:04:20 \n", + "DATASUM = '54159813' / data unit checksum updated 2020-11-22T14:04:05 \n", + "CONTENT = 'EVT2 ' / What data product \n", + "HDUSPEC = 'ACIS Telemetry Products: Level 0 to ASC Archive ICD Rev 2.11' / ICD r\n", + "HDUDOC = 'ASC-FITS-2.0: McDowell, Rots: ASC FITS File Designers Guide' \n", + "HDUVERS = '1.0.0 ' \n", + "HDUCLASS= 'OGIP ' \n", + "HDUCLAS1= 'EVENTS ' \n", + "HDUCLAS2= 'ACCEPTED' \n", + "PIX_ADJ = 'EDSER ' / Subpixel adjustment algorithm \n", + "RAND_SKY= 0.0000000000000E+00 \n", + "SUBPIXFL= 'acisD1999-07-22subpixN0001.fits' \n", + "RAND_PI = 1.0000000000000E+00 \n", + "COMMENT This FITS file may contain long string keyword values that are \n", + "COMMENT continued over multiple keywords. This convention uses the '&' \n", + "COMMENT character at the end of a string which is then continued \n", + "COMMENT on subsequent keywords whose name = 'CONTINUE' \n", + "COMMENT \n", + "COMMENT / Time information block-------------------------\n", + "COMMENT \n", + "DATE = '2020-11-22T14:04:01' / Date and time of file creation \n", + "MJD-OBS = 5.8090069377230E+04 / Modified Julian date of observation \n", + "DATE-OBS= '2017-12-03T01:39:54' / Observation start date \n", + "DATE-END= '2017-12-03T23:07:27' / Observation end date \n", + "TIMESYS = 'TT ' / Time system \n", + "MJDREF = 5.0814000000000E+04 / [d] MJD zero point for times \n", + "TIMEZERO= 0.0000000000000E+00 / [s] Clock correction \n", + "TIMEUNIT= 's ' / Time unit \n", + "BTIMNULL= 6.2502955505521E+08 / Basic Time offset (s) \n", + "BTIMRATE= 2.5625001500668E-01 / Basic Time clock rate (s / VCDUcount) \n", + "BTIMDRFT= 2.8395307567764E-18 / Basic Time clock drift (s / VCDUcount^2) \n", + "BTIMCORR= 0.0000000000000E+00 / Correction applied to Basic Time rate (s) \n", + "TIMEREF = 'LOCAL ' / Time reference (barycenter/local) \n", + "TASSIGN = 'SATELLITE' / Time assigned by clock \n", + "CLOCKAPP= T / default \n", + "TIERRELA= 1.0000000000000E-09 / default \n", + "TIERABSO= 5.0000000000000E-05 / default \n", + "TIMVERSN= 'ASC-FITS-2' / Timing system definition \n", + "TSTART = 6.2865239419265E+08 / [s] Observation start time (MET) \n", + "TSTOP = 6.2872964793469E+08 / [s] Observation end time (MET) \n", + "OBS_MODE= 'POINTING' / Observation mode \n", + "STARTOBT= 0.0000000000000E+00 / On-Board MET close to STARTMJF and STARTMNF \n", + "TIMEPIXR= 5.0000000000000E-01 / default \n", + "DATACLAS= 'OBSERVED' / default \n", + "RADESYS = 'ICRS ' / default \n", + "TIMEDEL = 3.1410400000000E+00 / [s] timedel Lev1 \n", + "COMMENT \n", + "COMMENT / Observation information block------------------\n", + "COMMENT \n", + "MISSION = 'AXAF ' / Mission \n", + "TELESCOP= 'CHANDRA ' / Telescope \n", + "SIM_X = -6.8282252473119E-01 / [mm] SIM focus pos \n", + "SIM_Y = 0.0000000000000E+00 / [mm] SIM orthogonal axis pos \n", + "SIM_Z = -1.9014006604987E+02 / [mm] SIM translation stage pos \n", + "FOC_LEN = 1.0070000000000E+04 / [mm] HRMA focal length \n", + "INSTRUME= 'ACIS ' / Instrument \n", + "GRATING = 'NONE ' / Grating \n", + "DETNAM = 'ACIS-2367' / Detector \n", + "RA_PNT = 1.9745215966375E+02 / [deg] Pointing RA \n", + "DEC_PNT = -2.3382219860164E+01 / [deg] Pointing Dec \n", + "ROLL_PNT= 8.0958789660570E+01 / [deg] Pointing Roll \n", + "RA_TARG = 1.9745041700000E+02 / [deg] Observer's specified target RA \n", + "DEC_TARG= -2.3381472000000E+01 / [deg] Observer's specified target Dec \n", + "DEFOCUS = 1.4449365687057E-03 / [mm] SIM defocus \n", + "RA_NOM = 1.9745215966375E+02 / [deg] Nominal RA \n", + "DEC_NOM = -2.3382219860164E+01 / [deg] Nominal Dec \n", + "ROLL_NOM= 8.0958789660570E+01 / [deg] Nominal Roll \n", + "COMMENT \n", + "COMMENT AXAF FITS File ACIS specific keywords \n", + "COMMENT \n", + "READMODE= 'TIMED ' / Read mode \n", + "ACSYS1 = 'CHIP:AXAF-ACIS-1.0' / reference for chip coord system \n", + "ACSYS2 = 'TDET:ACIS-2.2' / reference for tiled detector coord system \n", + "ACSYS3 = 'DET:ASC-FP-1.1' / reference for focal plane coord system \n", + "ACSYS4 = 'SKY:ASC-FP-1.1' / reference for sky coord system \n", + "GAINFILE= 'acisD2000-01-29gain_ctiN0008.fits' \n", + "CTI_CORR= T \n", + "CTI_APP = 'PPPPPBPBPP' \n", + "CTIFILE = 'acisD2015-01-01ctiN0009.fits' \n", + "MTLFILE = 'acisf20860_000N002_mtl1.fits' \n", + "TGAINCOR= 'T ' \n", + "TGAINFIL= 'acisD2017-11-01t_gainN0008.fits' \n", + "GRD_FILE= 'acisD1996-11-01gradeN0004.fits' \n", + "CORNERS = 2 / num adjacent side pix > threshold to include co\n", + "GRADESYS= 'ASCA ' / grade system: ASCA, ACIS, or USER \n", + "BPIXFILE= 'acisf20860_000N002_bpix1.fits' \n", + "DATAMODE= 'VFAINT ' / Data mode \n", + "RUN_ID = 1 / Science run index \n", + "FSW_VERS= 53 / ACIS flight software version number \n", + "STARTBEP= 2013964540 / BEP timer value at TSTART \n", + "STOPBEP = 931429652 / BEP timer value at TSTOP \n", + "COMMENT \n", + "COMMENT Product specific keywords are inserted here \n", + "COMMENT \n", + "TIMEDELA= 3.1410400000000E+00 / Inferred duration of primary exposure (s) \n", + "TIMEDELB= 0.0000000000000E+00 / Inferred duration of secondary exp. (s) \n", + "FLSHTIME= 0.0000000000000E+00 / [s] \n", + "EXPTIME = 3.1000000000000E+00 / [s] \n", + "DTYCYCLE= 0 \n", + "FIRSTROW= 1 / Index of first row of CCD (sub)array readout \n", + "NROWS = 1024 / Number of rows in (sub)array readout \n", + "FLSHTIMA= 0.0000000000000E+00 / Inferred duration of flush before primary fram \n", + "FLSHTIMB= 0.0000000000000E+00 / Inferred duration of flush before secondary fr \n", + "CYCLE = 'P ' / events from which exps? Prim/Second/Both \n", + "COMMENT \n", + "COMMENT / Column format information block----------------\n", + "COMMENT \n", + "COMMENT \n", + "COMMENT / History information block----------------------\n", + "COMMENT \n", + "HISTNUM = 533 \n", + "HISTORY TOOL :ade ASC00001\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//TP_ADE____7ASC00002\n", + "HISTORY CONT :22319011n055/input/acisf628652392N002_SR0.strip ASC00003\n", + "HISTORY PARM :template=/vobs/ASC_DR_TLM/src/dr/tlm/template_dir/acis_sASC00004\n", + "HISTORY CONT :trip_file_info.dat@@/main/2 ASC00005\n", + "HISTORY PARM :template=/vobs/ASC_DR_TLM/src/dr/tlm/template_dir/acis_fASC00006\n", + "HISTORY CONT :ile_info.dat@@/main/12 ASC00007\n", + "HISTORY PARM :template=/vobs/ASC_DR_TLM/src/dr/tlm/template_dir/acis_cASC00008\n", + "HISTORY CONT :onfig_file.dat@@/main/2 ASC00009\n", + "HISTORY PARM :template=/vobs/ASC_DR_TLM/src/dr/tlm/template_dir/acis_gASC00010\n", + "HISTORY CONT :roup_info.dat@@/main/12 ASC00011\n", + "HISTORY PARM :template=/vobs/ASC_DR_TLM/src/dr/tlm/template_dir/acis_dASC00012\n", + "HISTORY CONT :p_info.dat@@/main/21 ASC00013\n", + "HISTORY PARM :template=/vobs/ASC_DR_TLM/src/dr/tlm/template_dir/acis_dASC00014\n", + "HISTORY CONT :eahk_dp_info.dat@@/main/1 ASC00015\n", + "HISTORY PARM :template=/vobs/ASC_DR_TLM/src/dr/tlm/template_dir/acis_cASC00016\n", + "HISTORY CONT :ommon_dp_info.dat@@/main/9 ASC00017\n", + "HISTORY PARM :template=/vobs/ASC_DR_TLM/src/dr/tlm/template_dir/acis_cASC00018\n", + "HISTORY CONT :al_info.dat@@/main/2 ASC00019\n", + "LONGSTRN= 'OGIP 1.0' / The HEASARC Long String Convention may be used.\n", + "COMMENT This FITS file may contain long string keyword values that are \n", + "COMMENT continued over multiple keywords. The HEASARC convention uses the & \n", + "COMMENT character at the end of each substring which is then continued \n", + "COMMENT on the next keyword which has the name CONTINUE. \n", + "TITLE = 'GW170817: Tracking the X-ray light curve to study the origin of the&'\n", + "CONTINUE ' emission' / Proposal title \n", + "OBSERVER= 'Belinda Wilkes' / Principal investigator \n", + "OBJECT = 'GW170817' / Source name \n", + "DS_IDENT= '10.25574/20860' / Dataset Identifier: DOI \n", + "OBS_ID = '20860 ' / Observation id \n", + "SEQ_NUM = '402012 ' / Sequence number \n", + "ONTIME = 7.5066016994715E+04 / [s] Sum of GTIs \n", + "ONTIME7 = 7.5066016994715E+04 / [s] Sum of GTIs \n", + "ONTIME6 = 7.5056553143501E+04 / [s] Sum of GTIs \n", + "ONTIME3 = 7.5056512004018E+04 / [s] Sum of GTIs \n", + "ONTIME2 = 7.5056471023560E+04 / [s] Sum of GTIs \n", + "LIVETIME= 7.4085224219881E+04 / [s] Livetime \n", + "LIVTIME7= 7.4085224219881E+04 / [s] Livetime \n", + "LIVTIME6= 7.4075884020851E+04 / [s] Livetime \n", + "LIVTIME3= 7.4075843418885E+04 / [s] Livetime \n", + "LIVTIME2= 7.4075802973867E+04 / [s] Livetime \n", + "EXPOSURE= 7.4085224219881E+04 / [s] Exposure time \n", + "EXPOSUR7= 7.4085224219881E+04 / [s] Exposure time \n", + "EXPOSUR6= 7.4075884020851E+04 / [s] Exposure time \n", + "EXPOSUR3= 7.4075843418885E+04 / [s] Exposure time \n", + "EXPOSUR2= 7.4075802973867E+04 / [s] Exposure time \n", + "DTCOR = 9.8693426381071E-01 / Dead time correction \n", + "HISTORY TOOL :acis_format_events 2020-11-22T13:53:19 ASC00020\n", + "HISTORY PARM :infile=@/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00021\n", + "HISTORY CONT :722335439n477/input/acisf20860_000N002_evt0.lis ASC00022\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00023\n", + "HISTORY CONT :9n477/input/acisf628653549N002_1_evt0.fits[time=62865239ASC00024\n", + "HISTORY CONT :4.1926500:628729647.9346900] ASC00025\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00026\n", + "HISTORY CONT :9n477/input/acisf628653549N002_2_evt0.fits[time=62865239ASC00027\n", + "HISTORY CONT :4.1926500:628729647.9346900] ASC00028\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00029\n", + "HISTORY CONT :9n477/input/acisf628653549N002_3_evt0.fits[time=62865239ASC00030\n", + "HISTORY CONT :4.1926500:628729647.9346900] ASC00031\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00032\n", + "HISTORY CONT :9n477/input/acisf628653549N002_4_evt0.fits[time=62865239ASC00033\n", + "HISTORY CONT :4.1926500:628729647.9346900] ASC00034\n", + "HISTORY PARM :biasfile=@/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_LASC00035\n", + "HISTORY CONT :1_722335439n477/input/acisf20860_000N002_bias0.lis ASC00036\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00037\n", + "HISTORY CONT :9n477/input/acisf628652475N002_1_bias0.fits ASC00038\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00039\n", + "HISTORY CONT :9n477/input/acisf628652475N002_2_bias0.fits ASC00040\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00041\n", + "HISTORY CONT :9n477/input/acisf628652475N002_3_bias0.fits ASC00042\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00043\n", + "HISTORY CONT :9n477/input/acisf628652475N002_4_bias0.fits ASC00044\n", + "HISTORY PARM :exrfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00045\n", + "HISTORY CONT :722335439n477/output/acisf628653549N002_1_deltexr0.fits ASC00046\n", + "HISTORY CONT :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00047\n", + "HISTORY CONT :9n477/output/acisf628653549N002_2_deltexr0.fits /dsops/rASC00048\n", + "HISTORY CONT :epro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_722335439n477/ouASC00049\n", + "HISTORY CONT :tput/acisf628653549N002_3_deltexr0.fits /dsops/repro5/sdASC00050\n", + "HISTORY CONT :p.1/opus/prs_run/tmp//ACIS_F_L1_722335439n477/output/aciASC00051\n", + "HISTORY CONT :sf628653549N002_4_deltexr0.fits ASC00052\n", + "HISTORY PARM :outfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00053\n", + "HISTORY CONT :722335439n477/output/acisf20860_000N002_epr1.fits ASC00054\n", + "HISTORY PARM :outbias=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00055\n", + "HISTORY CONT :722335439n477/output/acisf20860_000N002 ASC00056\n", + "HISTORY PARM :expstatsfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_ASC00057\n", + "HISTORY CONT :F_L1_722335439n477/output/acisf20860_000N002_stat1.fits ASC00058\n", + "HISTORY PARM :obsfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00059\n", + "HISTORY CONT :722335439n477/input/axaff20860_000N001_obs1.par ASC00060\n", + "HISTORY PARM :logfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00061\n", + "HISTORY CONT :722335439n477/output/acis_format_events.log ASC00062\n", + "HISTORY PARM :pbkfile=@/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1ASC00063\n", + "HISTORY CONT :_722335439n477/input/acisf20860_000N002_pbk0.lis ASC00064\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00065\n", + "HISTORY CONT :9n477/input/acisf628653549N002_pbk0.fits[time=628652394.ASC00066\n", + "HISTORY CONT :1926500:628729647.9346900] ASC00067\n", + "HISTORY PARM :bias_correct=yes ASC00068\n", + "HISTORY PARM :oc_correct=yes ASC00069\n", + "HISTORY PARM :badoclkfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_FASC00070\n", + "HISTORY CONT :_L1_722335439n477/output/acisf20860_000N002_badoclk1.fitASC00071\n", + "HISTORY CONT :s ASC00072\n", + "HISTORY PARM :geompar=geom ASC00073\n", + "HISTORY PARM :eventdef={d:time,i:expno,s:chipx,s:chipy,s:phas,s:ccd_idASC00074\n", + "HISTORY CONT :,s:node_id,x:status} ASC00075\n", + "HISTORY PARM :telev1={d:time,i:expno,s:chipx,s:chipy,s:phas,s:ccd_id,sASC00076\n", + "HISTORY CONT ::node_id,x:status} ASC00077\n", + "HISTORY PARM :vflev1={d:time,i:expno,s:chipx,s:chipy,s:phas,s:ccd_id,sASC00078\n", + "HISTORY CONT ::node_id,x:status} ASC00079\n", + "HISTORY PARM :cclev1={d:time,i:expno,s:chipx,s:chipy,s:phas,s:ccd_id,sASC00080\n", + "HISTORY CONT ::node_id,x:status} ASC00081\n", + "HISTORY PARM :tegrflev1={d:time,i:expno,s:chipx,s:chipy,l:pha,s:fltgraASC00082\n", + "HISTORY CONT :de,s:corn_pha,s:ccd_id,s:node_id,x:status} ASC00083\n", + "HISTORY PARM :ccgrlev1={d:time,i:expno,s:chipx,s:chipy,l:pha,s:fltgradASC00084\n", + "HISTORY CONT :e,s:corn_pha,s:ccd_id,s:node_id,x:status} ASC00085\n", + "HISTORY PARM :verbose=0 ASC00086\n", + "HISTORY PARM :tempbias=no ASC00087\n", + "TIME_ADJ= 'NONE ' / time adjustment algorithm \n", + "ASPTYPE = 'KALMAN ' \n", + "HISTORY PARM :clobber=no ASC00088\n", + "HISTORY PARM :PIXLIB Version: 4.0.0 ASC00089\n", + "HISTORY PARM :****** PIXLIB Parameter File ***** ASC00090\n", + "HISTORY PARM :/dsops/repro5/sdp.1/opus/prs_run/tmp/ACIS_F_L1_722335439ASC00091\n", + "HISTORY CONT :n477/output/param/geom.par: ASC00092\n", + "HISTORY PARM :instruments = /data/chandra_caldb/sdp/data/chandra/defaASC00093\n", + "HISTORY CONT :ult/geom/telD1999-07-23geomN0006.fits(CALDB) ASC00094\n", + "HISTORY PARM :aimpoints = /data/chandra_caldb/sdp/data/chandra/defaASC00095\n", + "HISTORY CONT :ult/aimpts/telD1999-07-23aimptsN0002.fits(CALDB) ASC00096\n", + "HISTORY PARM :tdet = /data/chandra_caldb/sdp/data/chandra/defaASC00097\n", + "HISTORY CONT :ult/tdet/telD1999-07-23tdetN0001.fits(CALDB) ASC00098\n", + "HISTORY PARM :sky = /data/chandra_caldb/sdp/data/chandra/defaASC00099\n", + "HISTORY CONT :ult/sky/telD1999-07-23skyN0002.fits(CALDB) ASC00100\n", + "HISTORY PARM :shell = /data/chandra_caldb/sdp/data/chandra/defaASC00101\n", + "HISTORY CONT :ult/sgeom/telD1999-07-23sgeomN0001.fits(CALDB) ASC00102\n", + "HISTORY PARM :obsfile = 2017-12-03T01:39:54(/dsops/repro5/sdp.1/oASC00103\n", + "HISTORY CONT :pus/prs_run/tmp//ACIS_F_L1_722335439n477/input/axaff2086ASC00104\n", + "HISTORY CONT :0_000N001_obs1.par) ASC00105\n", + "HISTORY PARM :****** PIXLIB System Configuration ****** ASC00106\n", + "HISTORY PARM :Telescope = axaf ASC00107\n", + "HISTORY PARM :Focal Length (mm) = 10070.000 ASC00108\n", + "HISTORY PARM :Detector = ACIS ASC00109\n", + "HISTORY PARM :Focal Plane Sys. = FP-1.1 ASC00110\n", + "HISTORY PARM :Tiled Detector Plane Sys. = ACIS-2.2 ASC00111\n", + "HISTORY PARM :SIM Offset (mm) = (0.684 0.75 236.552) ASC00112\n", + "HISTORY PARM :Aim Point(AI1) (mm) = (-0.782348 0 -237.5) ASC00113\n", + "HISTORY PARM :Grating Arm = HEG ASC00114\n", + "HISTORY PARM :Grating Order = 1 ASC00115\n", + "HISTORY PARM :Dispersion Plane Sys. = ASC-GDP-1.1 ASC00116\n", + "HISTORY PARM :Rowland Circle (mm) = 8632.48 ASC00117\n", + "BIASFIL7= 'acisf628652475N002_1_bias0.fits' / bias file used: CCD 7 \n", + "BIASFIL6= 'acisf628652475N002_2_bias0.fits' / bias file used: CCD 6 \n", + "BIASFIL3= 'acisf628652475N002_3_bias0.fits' / bias file used: CCD 3 \n", + "BIASFIL2= 'acisf628652475N002_4_bias0.fits' / bias file used: CCD 2 \n", + "HISTORY TOOL :acis_sort_time 2020-11-22T13:53:36 ASC00118\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00119\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_epr1.fits ASC00120\n", + "HISTORY PARM :outfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00121\n", + "HISTORY CONT :722335439n477/output/acisf20860_000N002_tim1.fits ASC00122\n", + "HISTORY PARM :clobber=no ASC00123\n", + "HISTORY PARM :verbose=0 ASC00124\n", + "HISTORY TOOL :destreak 2020-11-22T13:53:50 ASC00125\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00126\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_tim1.fits ASC00127\n", + "HISTORY PARM :outfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00128\n", + "HISTORY CONT :722335439n477/output/acisf20860_000N002_tmp_evt1.fits ASC00129\n", + "HISTORY PARM :max= ASC00130\n", + "HISTORY PARM :max_rowloss_fraction=5e-05 ASC00131\n", + "HISTORY PARM :num_sigma=1 ASC00132\n", + "HISTORY PARM :filter=no ASC00133\n", + "HISTORY PARM :mask= ASC00134\n", + "HISTORY PARM :ccd_id=8 ASC00135\n", + "HISTORY PARM :ccd_col=ccd_id ASC00136\n", + "HISTORY PARM :node_col=node_id ASC00137\n", + "HISTORY PARM :exptime=-1 ASC00138\n", + "HISTORY PARM :countfile= ASC00139\n", + "HISTORY PARM :fracfile= ASC00140\n", + "HISTORY PARM :timefile= ASC00141\n", + "HISTORY PARM :verbose=0 ASC00142\n", + "HISTORY PARM :clobber=no ASC00143\n", + "HISTORY TOOL :dmhedit 2020-11-22T13:53:59 ASC00144\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00145\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_tmp_evt1.fits ASC00146\n", + "HISTORY PARM :filelist= ASC00147\n", + "HISTORY PARM :operation=add ASC00148\n", + "HISTORY PARM :key=CONTENT ASC00149\n", + "HISTORY PARM :value=EVT1 ASC00150\n", + "HISTORY PARM :datatype=string ASC00151\n", + "HISTORY PARM :unit= ASC00152\n", + "HISTORY PARM :comment= ASC00153\n", + "HISTORY PARM :verbose=0 ASC00154\n", + "FP_TEMP = 1.5344601440000E+02 / [K] Focal Plane Temperature \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:54:16 ASC00155\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00156\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_tmp_evt1.fits ASC00157\n", + "HISTORY PARM :filelist= ASC00158\n", + "HISTORY PARM :operation=add ASC00159\n", + "HISTORY PARM :key=FP_TEMP ASC00160\n", + "HISTORY PARM :value=153.4460144 ASC00161\n", + "HISTORY PARM :datatype=double ASC00162\n", + "HISTORY PARM :unit=K ASC00163\n", + "HISTORY PARM :comment=Focal Plane Temperature ASC00164\n", + "HISTORY PARM :verbose=0 ASC00165\n", + "HISTORY TOOL :acis_process_events 2020-11-22T13:54:24 ASC00166\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00167\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_tmp_evt1.fits ASC00168\n", + "HISTORY PARM :outfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00169\n", + "HISTORY CONT :722335439n477/output/acisf20860_000N002_evt1.fits ASC00170\n", + "HISTORY PARM :acaofffile=@/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_FASC00171\n", + "HISTORY CONT :_L1_722335439n477/input/pcadf20860_000N002_asol1.lis ASC00172\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00173\n", + "HISTORY CONT :9n477/input/pcadf20860_000N001_asol1.fits[time=628652394ASC00174\n", + "HISTORY CONT :.1926500:628729647.9346900] ASC00175\n", + "HISTORY PARM :apply_cti=yes ASC00176\n", + "HISTORY PARM :apply_tgain=yes ASC00177\n", + "HISTORY PARM :obsfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00178\n", + "HISTORY CONT :722335439n477/output/axaff20860_000N001_obs1.par ASC00179\n", + "HISTORY PARM :geompar=geom ASC00180\n", + "HISTORY PARM :logfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00181\n", + "HISTORY CONT :722335439n477/output/acis_process_events.log ASC00182\n", + "HISTORY PARM :gradefile=CALDB ASC00183\n", + "HISTORY PARM :grade_image_file=CALDB ASC00184\n", + "HISTORY PARM :gainfile=CALDB ASC00185\n", + "HISTORY PARM :badpixfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_ASC00186\n", + "HISTORY CONT :L1_722335439n477/output/acisf20860_000N002_bpix1.fits ASC00187\n", + "HISTORY PARM :threshfile=CALDB ASC00188\n", + "HISTORY PARM :ctifile=CALDB ASC00189\n", + "HISTORY PARM :tgainfile=CALDB ASC00190\n", + "HISTORY PARM :mtlfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00191\n", + "HISTORY CONT :722335439n477/output/acisf20860_000N002_fptemp_egti1.fitASC00192\n", + "HISTORY CONT :s ASC00193\n", + "HISTORY PARM :eventdef={d:time,s:ccd_id,s:node_id,i:expno,s:chip,s:tdeASC00194\n", + "HISTORY CONT :t,f:det,f:sky,s:phas,l:pha,l:pha_ro,f:energy,l:pi,s:fltgASC00195\n", + "HISTORY CONT :rade,s:grade,x:status} ASC00196\n", + "HISTORY PARM :doevtgrade=yes ASC00197\n", + "HISTORY PARM :check_vf_pha=no ASC00198\n", + "HISTORY PARM :trail=0.027 ASC00199\n", + "HISTORY PARM :calculate_pi=yes ASC00200\n", + "HISTORY PARM :pi_bin_width=14.6 ASC00201\n", + "HISTORY PARM :pi_num_bins=1024 ASC00202\n", + "HISTORY PARM :max_cti_iter=15 ASC00203\n", + "HISTORY PARM :cti_converge=0.1 ASC00204\n", + "HISTORY PARM :clobber=no ASC00205\n", + "HISTORY PARM :verbose=0 ASC00206\n", + "HISTORY PARM :stop=sky ASC00207\n", + "HISTORY PARM :rand_seed=1 ASC00208\n", + "HISTORY PARM :rand_pha=yes ASC00209\n", + "HISTORY PARM :pix_adj=EDSER ASC00210\n", + "HISTORY PARM :subpixfile=CALDB ASC00211\n", + "HISTORY PARM :stdlev1={d:time,l:expno,s:ccd_id,s:node_id,s:chip,s:tdetASC00212\n", + "HISTORY CONT :,f:det,f:sky,s:phas,l:pha,l:pha_ro,f:energy,l:pi,s:fltgrASC00213\n", + "HISTORY CONT :ade,s:grade,x:status} ASC00214\n", + "HISTORY PARM :grdlev1={d:time,l:expno,s:ccd_id,s:node_id,s:chip,s:tdetASC00215\n", + "HISTORY CONT :,f:det,f:sky,l:pha,l:pha_ro,s:corn_pha,f:energy,l:pi,s:fASC00216\n", + "HISTORY CONT :ltgrade,s:grade,x:status} ASC00217\n", + "HISTORY PARM :cclev1={d:time,d:time_ro,l:expno,s:ccd_id,s:node_id,s:chASC00218\n", + "HISTORY CONT :ip,s:tdet,f:det,f:sky,f:sky_1d,s:phas,l:pha,l:pha_ro,f:eASC00219\n", + "HISTORY CONT :nergy,l:pi,s:fltgrade,s:grade,x:status} ASC00220\n", + "HISTORY PARM :ccgrdlev1={d:time,d:time_ro,l:expno,s:ccd_id,s:node_id,sASC00221\n", + "HISTORY CONT ::chip,s:tdet,f:det,f:sky,f:sky_1d,l:pha,l:pha_ro,s:corn_ASC00222\n", + "HISTORY CONT :pha,f:energy,l:pi,s:fltgrade,s:grade,x:status} ASC00223\n", + "HISTORY PARM :cclev1a={d:time,d:time_ro,l:expno,s:ccd_id,s:node_id,s:cASC00224\n", + "HISTORY CONT :hip,f:chipy_tg,f:chipy_zo,s:tdet,f:det,f:sky,f:sky_1d,s:ASC00225\n", + "HISTORY CONT :phas,l:pha,l:pha_ro,f:energy,l:pi,s:fltgrade,s:grade,f:rASC00226\n", + "HISTORY CONT :d,s:tg_m,f:tg_lam,f:tg_mlam,s:tg_srcid,s:tg_part,s:tg_smASC00227\n", + "HISTORY CONT :ap,x:status} ASC00228\n", + "HISTORY PARM :ccgrdlev1a={d:time,d:time_ro,l:expno,s:ccd_id,s:node_id,ASC00229\n", + "HISTORY CONT :s:chip,f:chipy_tg,f:chipy_zo,s:tdet,f:det,f:sky,f:sky_1dASC00230\n", + "HISTORY CONT :,l:pha,l:pha_ro,s:corn_pha,f:energy,l:pi,s:fltgrade,s:grASC00231\n", + "HISTORY CONT :ade,f:rd,s:tg_m,f:tg_lam,f:tg_mlam,s:tg_srcid,s:tg_part,ASC00232\n", + "HISTORY CONT :s:tg_smap,x:status} ASC00233\n", + "HISTORY PARM :PIXLIB Version: 4.0.0 ASC00234\n", + "HISTORY PARM :****** PIXLIB Parameter File ***** ASC00235\n", + "HISTORY PARM :/dsops/repro5/sdp.1/opus/prs_run/tmp/ACIS_F_L1_722335439ASC00236\n", + "HISTORY CONT :n477/output/param/geom.par: ASC00237\n", + "HISTORY PARM :instruments = /data/chandra_caldb/sdp/data/chandra/defaASC00238\n", + "HISTORY CONT :ult/geom/telD1999-07-23geomN0006.fits(CALDB) ASC00239\n", + "HISTORY PARM :aimpoints = /data/chandra_caldb/sdp/data/chandra/defaASC00240\n", + "HISTORY CONT :ult/aimpts/telD1999-07-23aimptsN0002.fits(CALDB) ASC00241\n", + "HISTORY PARM :tdet = /data/chandra_caldb/sdp/data/chandra/defaASC00242\n", + "HISTORY CONT :ult/tdet/telD1999-07-23tdetN0001.fits(CALDB) ASC00243\n", + "HISTORY PARM :sky = /data/chandra_caldb/sdp/data/chandra/defaASC00244\n", + "HISTORY CONT :ult/sky/telD1999-07-23skyN0002.fits(CALDB) ASC00245\n", + "HISTORY PARM :shell = /data/chandra_caldb/sdp/data/chandra/defaASC00246\n", + "HISTORY CONT :ult/sgeom/telD1999-07-23sgeomN0001.fits(CALDB) ASC00247\n", + "HISTORY PARM :obsfile = 2017-12-03T01:39:54(/dsops/repro5/sdp.1/oASC00248\n", + "HISTORY CONT :pus/prs_run/tmp//ACIS_F_L1_722335439n477/input/axaff2086ASC00249\n", + "HISTORY CONT :0_000N001_obs1.par) ASC00250\n", + "HISTORY PARM :****** PIXLIB System Configuration ****** ASC00251\n", + "HISTORY PARM :Telescope = FLIGHT ASC00252\n", + "HISTORY PARM :Focal Length (mm) = 10070.000 ASC00253\n", + "HISTORY PARM :Detector = ACIS ASC00254\n", + "HISTORY PARM :Focal Plane Sys. = FP-1.1 ASC00255\n", + "HISTORY PARM :Tiled Detector Plane Sys. = ACIS-2.2 ASC00256\n", + "HISTORY PARM :SIM Offset (mm) = (0.684 0.75 236.552) ASC00257\n", + "HISTORY PARM :Aim Point(NONE) (mm) = (-0.682823 0 -190.14) ASC00258\n", + "HISTORY PARM :Grating Arm = HEG ASC00259\n", + "HISTORY PARM :Grating Order = 1 ASC00260\n", + "HISTORY PARM :Dispersion Plane Sys. = ASC-GDP-1.1 ASC00261\n", + "HISTORY PARM :Rowland Circle (mm) = 8632.48 ASC00262\n", + "HISTORY PARM :Stage Ang (arc-mins) = (0 0 0) ASC00263\n", + "HISTORY PARM :Stage Pos (mm) = (0 0 0) ASC00264\n", + "HISTORY PARM :Pitch-Yaw (arc-mins) = (0 0 ) ASC00265\n", + "HISTORY TOOL :acis_build_chip_gti 2020-11-22T13:57:09 ASC00266\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00267\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_stat1.fits ASC00268\n", + "HISTORY PARM :outfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_ASC00269\n", + "HISTORY CONT :722335439n477/output/acisf20860_000N002_evt1.fits ASC00270\n", + "HISTORY PARM :pbkfile=@/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1ASC00271\n", + "HISTORY CONT :_722335439n477/input/acisf20860_000N002_pbk0.lis ASC00272\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00273\n", + "HISTORY CONT :9n477/input/acisf628653549N002_pbk0.fits[time=628652394.ASC00274\n", + "HISTORY CONT :1926500:628729647.9346900] ASC00275\n", + "HISTORY PARM :exrfile=@/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1ASC00276\n", + "HISTORY CONT :_722335439n477/input/acisf20860_000N002_exr0.lis ASC00277\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00278\n", + "HISTORY CONT :9n477/input/acisf628653549N002_1_exr0.fits[time=62865239ASC00279\n", + "HISTORY CONT :4.1926500:628729647.9346900] ASC00280\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00281\n", + "HISTORY CONT :9n477/input/acisf628653549N002_2_exr0.fits[time=62865239ASC00282\n", + "HISTORY CONT :4.1926500:628729647.9346900] ASC00283\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00284\n", + "HISTORY CONT :9n477/input/acisf628653549N002_3_exr0.fits[time=62865239ASC00285\n", + "HISTORY CONT :4.1926500:628729647.9346900] ASC00286\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00287\n", + "HISTORY CONT :9n477/input/acisf628653549N002_4_exr0.fits[time=62865239ASC00288\n", + "HISTORY CONT :4.1926500:628729647.9346900] ASC00289\n", + "HISTORY PARM :aspfile=@/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1ASC00290\n", + "HISTORY CONT :_722335439n477/input/pcadf20860_000N002_asol1.lis ASC00291\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_72233543ASC00292\n", + "HISTORY CONT :9n477/input/pcadf20860_000N001_asol1.fits[time=628652394ASC00293\n", + "HISTORY CONT :.1926500:628729647.9346900] ASC00294\n", + "HISTORY PARM :geompar=geom ASC00295\n", + "HISTORY PARM :nominalchip=7 ASC00296\n", + "HISTORY PARM :verbose=0 ASC00297\n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:15 ASC00298\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00299\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00300\n", + "HISTORY CONT :,/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7223354ASC00301\n", + "HISTORY CONT :39n477/output/acisf20860_000N002_aoff1.fits[ASPOFF],/dsoASC00302\n", + "HISTORY CONT :ps/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_722335439n47ASC00303\n", + "HISTORY CONT :7/output/acisf20860_000N002_soff1.fits[ALIGN],/dsops/repASC00304\n", + "HISTORY CONT :ro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_722335439n477/outpASC00305\n", + "HISTORY CONT :ut/acisf20860_000N002_std_flt1.fits[FILTER],/dsops/reproASC00306\n", + "HISTORY CONT :5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_722335439n477/outputASC00307\n", + "HISTORY CONT :/acisf20860_000N002_flt1.fits[FILTER],/dsops/repro5/sdp.ASC00308\n", + "HISTORY CONT :1/opus/prs_run/tmp//ACIS_F_L1_722335439n477/output/acisfASC00309\n", + "HISTORY CONT :20860_000N002_bpix1.fits[2],/dsops/repro5/sdp.1/opus/prsASC00310\n", + "HISTORY CONT :_run/tmp//ACIS_F_L1_722335439n477/output/acisf20860_000NASC00311\n", + "HISTORY CONT :002_msk1.fits[2] ASC00312\n", + "HISTORY PARM :filelist= ASC00313\n", + "HISTORY PARM :operation=add ASC00314\n", + "HISTORY PARM :key=REVISION ASC00315\n", + "HISTORY PARM :value=2 ASC00316\n", + "HISTORY PARM :datatype=long ASC00317\n", + "HISTORY PARM :unit= ASC00318\n", + "HISTORY PARM :comment= ASC00319\n", + "HISTORY PARM :verbose=0 ASC00320\n", + "AIMPFILE= 'telD1999-07-23aimptsN0002.fits' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:24 ASC00321\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00322\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00323\n", + "HISTORY PARM :filelist= ASC00324\n", + "HISTORY PARM :operation=add ASC00325\n", + "HISTORY PARM :key=AIMPFILE ASC00326\n", + "HISTORY PARM :value=telD1999-07-23aimptsN0002.fits ASC00327\n", + "HISTORY PARM :datatype=string ASC00328\n", + "HISTORY PARM :unit= ASC00329\n", + "HISTORY PARM :comment= ASC00330\n", + "HISTORY PARM :verbose=0 ASC00331\n", + "GEOMFILE= 'telD1999-07-23geomN0006.fits' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:25 ASC00332\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00333\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00334\n", + "HISTORY PARM :filelist= ASC00335\n", + "HISTORY PARM :operation=add ASC00336\n", + "HISTORY PARM :key=GEOMFILE ASC00337\n", + "HISTORY PARM :value=telD1999-07-23geomN0006.fits ASC00338\n", + "HISTORY PARM :datatype=string ASC00339\n", + "HISTORY PARM :unit= ASC00340\n", + "HISTORY PARM :comment= ASC00341\n", + "HISTORY PARM :verbose=0 ASC00342\n", + "SKYFILE = 'telD1999-07-23skyN0002.fits' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:34 ASC00343\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00344\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00345\n", + "HISTORY PARM :filelist= ASC00346\n", + "HISTORY PARM :operation=add ASC00347\n", + "HISTORY PARM :key=SKYFILE ASC00348\n", + "HISTORY PARM :value=telD1999-07-23skyN0002.fits ASC00349\n", + "HISTORY PARM :datatype=string ASC00350\n", + "HISTORY PARM :unit= ASC00351\n", + "HISTORY PARM :comment= ASC00352\n", + "HISTORY PARM :verbose=0 ASC00353\n", + "TDETFILE= 'telD1999-07-23tdetN0001.fits' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:35 ASC00354\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00355\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00356\n", + "HISTORY PARM :filelist= ASC00357\n", + "HISTORY PARM :operation=add ASC00358\n", + "HISTORY PARM :key=TDETFILE ASC00359\n", + "HISTORY PARM :value=telD1999-07-23tdetN0001.fits ASC00360\n", + "HISTORY PARM :datatype=string ASC00361\n", + "HISTORY PARM :unit= ASC00362\n", + "HISTORY PARM :comment= ASC00363\n", + "HISTORY PARM :verbose=0 ASC00364\n", + "SHELLFIL= 'telD1999-07-23sgeomN0001.fits' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:38 ASC00365\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00366\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00367\n", + "HISTORY PARM :filelist= ASC00368\n", + "HISTORY PARM :operation=add ASC00369\n", + "HISTORY PARM :key=SHELLFIL ASC00370\n", + "HISTORY PARM :value=telD1999-07-23sgeomN0001.fits ASC00371\n", + "HISTORY PARM :datatype=string ASC00372\n", + "HISTORY PARM :unit= ASC00373\n", + "HISTORY PARM :comment= ASC00374\n", + "HISTORY PARM :verbose=0 ASC00375\n", + "FLTFILE = 'acisf20860_000N002_flt1.fits' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:44 ASC00376\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00377\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00378\n", + "HISTORY CONT :[EVENTS] ASC00379\n", + "HISTORY PARM :filelist= ASC00380\n", + "HISTORY PARM :operation=add ASC00381\n", + "HISTORY PARM :key=FLTFILE ASC00382\n", + "HISTORY PARM :value=acisf20860_000N002_flt1.fits ASC00383\n", + "HISTORY PARM :datatype=string ASC00384\n", + "HISTORY PARM :unit= ASC00385\n", + "HISTORY PARM :comment= ASC00386\n", + "HISTORY PARM :verbose=0 ASC00387\n", + "MASKFILE= 'acisf20860_000N002_msk1.fits' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:45 ASC00388\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00389\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00390\n", + "HISTORY CONT :[EVENTS] ASC00391\n", + "HISTORY PARM :filelist= ASC00392\n", + "HISTORY PARM :operation=add ASC00393\n", + "HISTORY PARM :key=MASKFILE ASC00394\n", + "HISTORY PARM :value=acisf20860_000N002_msk1.fits ASC00395\n", + "HISTORY PARM :datatype=string ASC00396\n", + "HISTORY PARM :unit= ASC00397\n", + "HISTORY PARM :comment= ASC00398\n", + "HISTORY PARM :verbose=0 ASC00399\n", + "PBKFILE = 'acisf628653549N002_pbk0.fits' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:51 ASC00400\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00401\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00402\n", + "HISTORY CONT :[EVENTS] ASC00403\n", + "HISTORY PARM :filelist= ASC00404\n", + "HISTORY PARM :operation=add ASC00405\n", + "HISTORY PARM :key=PBKFILE ASC00406\n", + "HISTORY PARM :value=acisf628653549N002_pbk0.fits ASC00407\n", + "HISTORY PARM :datatype=string ASC00408\n", + "HISTORY PARM :unit= ASC00409\n", + "HISTORY PARM :comment= ASC00410\n", + "HISTORY PARM :verbose=0 ASC00411\n", + "DY_AVG = 0 / [mm] Mean DY during observation \n", + "DZ_AVG = 0 / [mm] Mean DZ during observation \n", + "DTH_AVG = 0 / [deg] Mean DTHETA during observation \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:57 ASC00412\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00413\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00414\n", + "HISTORY CONT :[events] ASC00415\n", + "HISTORY PARM :filelist=.//17515.hdr ASC00416\n", + "HISTORY PARM :operation=add ASC00417\n", + "HISTORY PARM :key=BPIXFILE ASC00418\n", + "HISTORY PARM :value=acisD2000-11-28badpixN0004.fits ASC00419\n", + "HISTORY PARM :datatype=indef ASC00420\n", + "HISTORY PARM :unit= ASC00421\n", + "HISTORY PARM :comment= ASC00422\n", + "HISTORY PARM :verbose=0 ASC00423\n", + "OCLKPAIR= 8 / # of pairs of overclock pixels per output \n", + "ORC_MODE= 0 / Output register clocking mode \n", + "SUM_2X2 = 0 / On-chip summing. 0:None; 1:Sum 2x2 \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:58:58 ASC00424\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00425\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00426\n", + "HISTORY CONT :[events] ASC00427\n", + "HISTORY PARM :filelist=.//18246.hdr ASC00428\n", + "HISTORY PARM :operation=add ASC00429\n", + "HISTORY PARM :key=BPIXFILE ASC00430\n", + "HISTORY PARM :value=acisD2000-11-28badpixN0004.fits ASC00431\n", + "HISTORY PARM :datatype=indef ASC00432\n", + "HISTORY PARM :unit= ASC00433\n", + "HISTORY PARM :comment= ASC00434\n", + "HISTORY PARM :verbose=0 ASC00435\n", + "FEP_CCD = 'x7632x ' / CCD to FEPID mapping, fep0 is left most digit \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:59:03 ASC00436\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00437\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits[EVENTS]ASC00438\n", + "HISTORY CONT :[events] ASC00439\n", + "HISTORY PARM :filelist= ASC00440\n", + "HISTORY PARM :operation=add ASC00441\n", + "HISTORY PARM :key=FEP_CCD ASC00442\n", + "HISTORY PARM :value=x7632x ASC00443\n", + "HISTORY PARM :datatype=string ASC00444\n", + "HISTORY PARM :unit= ASC00445\n", + "HISTORY PARM :comment=CCD to FEPID mapping, fep0 is left most digit ASC00446\n", + "HISTORY PARM :verbose=0 ASC00447\n", + "CALDBVER= '4.9.3 ' \n", + "HISTORY TOOL :dmhedit 2020-11-22T13:59:12 ASC00448\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00449\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits,/dsops/ASC00450\n", + "HISTORY CONT :repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_722335439n477/oASC00451\n", + "HISTORY CONT :utput/acisf20860_000N002_bpix1.fits,/dsops/repro5/sdp.1/ASC00452\n", + "HISTORY CONT :opus/prs_run/tmp//ACIS_F_L1_722335439n477/output/acisf20ASC00453\n", + "HISTORY CONT :860_000N002_mtl1.fits,/dsops/repro5/sdp.1/opus/prs_run/tASC00454\n", + "HISTORY CONT :mp//ACIS_F_L1_722335439n477/output/acisf20860_000N002_mtASC00455\n", + "HISTORY CONT :l1.fits[MTL_S],/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIASC00456\n", + "HISTORY CONT :S_F_L1_722335439n477/output/acisf20860_000N002_mtl1.fitsASC00457\n", + "HISTORY CONT :[LIMITS],/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1ASC00458\n", + "HISTORY CONT :_722335439n477/output/acisf20860_000N002_fov1.fits[FOV] ASC00459\n", + "HISTORY PARM :filelist= ASC00460\n", + "HISTORY PARM :operation=add ASC00461\n", + "HISTORY PARM :key=CALDBVER ASC00462\n", + "HISTORY PARM :value=' 4.9.3 ' ASC00463\n", + "HISTORY PARM :datatype=string ASC00464\n", + "HISTORY PARM :unit= ASC00465\n", + "HISTORY PARM :comment= ASC00466\n", + "HISTORY PARM :verbose=0 ASC00467\n", + "HISTORY TOOL :dmhedit 2020-11-22T13:59:14 ASC00468\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_F_L1_7ASC00469\n", + "HISTORY CONT :22335439n477/output/acisf20860_000N002_evt1.fits ASC00470\n", + "HISTORY PARM :filelist= ASC00471\n", + "HISTORY PARM :operation=add ASC00472\n", + "HISTORY PARM :key=MTLFILE ASC00473\n", + "HISTORY PARM :value=acisf20860_000N002_mtl1.fits ASC00474\n", + "HISTORY PARM :datatype=string ASC00475\n", + "HISTORY PARM :unit= ASC00476\n", + "HISTORY PARM :comment= ASC00477\n", + "HISTORY PARM :verbose=0 ASC00478\n", + "HISTORY TOOL :dmmerge 2020-11-22T14:04:02 ASC00479\n", + "HISTORY PARM :infile=@/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_L2___ASC00480\n", + "HISTORY CONT :722336652n581/output/acisf20860N002_evt1.lis[cols !PHAS,ASC00481\n", + "HISTORY CONT :!CORN_PHA] ASC00482\n", + "HISTORY STCK :/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_L2___72233665ASC00483\n", + "HISTORY CONT :2n581/input/acisf20860_000N002_evt1.fits[@/dsops/repro5/ASC00484\n", + "HISTORY CONT :sdp.1/opus/prs_run/tmp//ACIS_L2___722336652n581/input/acASC00485\n", + "HISTORY CONT :isf20860_000N002_flt1.fits[subspace -expno]][subspace -eASC00486\n", + "HISTORY CONT :xpno][cols !PHAS,!CORN_PHA] ASC00487\n", + "HISTORY PARM :outfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_L2___ASC00488\n", + "HISTORY CONT :722336652n581/output/tmp_acisf20860N002_evt2.fits ASC00489\n", + "HISTORY PARM :outBlock= ASC00490\n", + "HISTORY PARM :lookupTab=/home/ascds/DS.rap/data/lev2_dmmerge_lookup.txASC00491\n", + "HISTORY CONT :t ASC00492\n", + "HISTORY PARM :columnList= ASC00493\n", + "HISTORY PARM :clobber=no ASC00494\n", + "HISTORY PARM :verbose=0 ASC00495\n", + "MTYPE1 = 'chip ' / DM Keyword: Descriptor name. \n", + "MFORM1 = 'chipx,chipy' / [pixel] \n", + "MTYPE2 = 'tdet ' / DM Keyword: Descriptor name. \n", + "MFORM2 = 'tdetx,tdety' / [pixel] \n", + "MTYPE3 = 'det ' / DM Keyword: Descriptor name. \n", + "MFORM3 = 'detx,dety' / [pixel] \n", + "MTYPE4 = 'sky ' / DM Keyword: Descriptor name. \n", + "MFORM4 = 'x,y ' / [pixel] \n", + "DSTYP1 = 'time ' / DM Keyword: Descriptor name. \n", + "DSVAL1 = 'TABLE ' / [s] \n", + "DSFORM1 = 'D ' / DM Keyword: Descriptor datatype. \n", + "DSUNIT1 = 's ' / DM Keyword: Descriptor unit. \n", + "DSREF1 = ':GTI7 ' \n", + "2DSREF1 = ':GTI6 ' \n", + "3DSREF1 = ':GTI3 ' \n", + "4DSREF1 = ':GTI2 ' \n", + "DSTYP2 = 'ccd_id ' / DM Keyword: Descriptor name. \n", + "DSVAL2 = '7:7 ' / DM Keyword: Descriptor value. \n", + "DSFORM2 = 'I ' / DM Keyword: Descriptor datatype. \n", + "2DSVAL2 = '6:6 ' / \n", + "3DSVAL2 = '3:3 ' / \n", + "4DSVAL2 = '2:2 ' / \n", + "DSTYP3 = 'grade ' / DM Keyword: Descriptor name. \n", + "DSVAL3 = '0:0,2:2,3:3,4:4,6:6' / DM Keyword: Descriptor value. \n", + "DSFORM3 = 'I ' / DM Keyword: Descriptor datatype. \n", + "2DSVAL3 = '0:0,2:2,3:3,4:4,6:6' / \n", + "3DSVAL3 = '0:0,2:2,3:3,4:4,6:6' / \n", + "4DSVAL3 = '0:0,2:2,3:3,4:4,6:6' / \n", + "DSTYP4 = 'phas ' / DM Keyword: Descriptor name. \n", + "DSVAL4 = '-4096:4095' / DM Keyword: Descriptor value. \n", + "DSFORM4 = 'I ' / DM Keyword: Descriptor datatype. \n", + "2DSVAL4 = '-4096:4095' / \n", + "3DSVAL4 = '-4096:4095' / \n", + "4DSVAL4 = '-4096:4095' / \n", + "MTYPE5 = 'CPC ' / DM Keyword: Descriptor name. \n", + "MFORM5 = 'CPCX,CPCY' / [mm] \n", + "TCTYP5 = 'CPCX ' \n", + "TCRVL5 = 0.0000000000000E+00 \n", + "TCRPX5 = 5.0000000000000E-01 \n", + "TCDLT5 = 2.3987000000000E-02 \n", + "TCUNI5 = 'mm ' \n", + "TCTYP6 = 'CPCY ' \n", + "TCRVL6 = 0.0000000000000E+00 \n", + "TCRPX6 = 5.0000000000000E-01 \n", + "TCDLT6 = 2.3987000000000E-02 \n", + "TCUNI6 = 'mm ' \n", + "MTYPE6 = 'MSC ' / DM Keyword: Descriptor name. \n", + "MFORM6 = 'PHI,THETA' / [deg] \n", + "TCTYP9 = 'LONG-TAN' \n", + "TCRVL9 = 0.0000000000000E+00 \n", + "TCRPX9 = 4.0965000000000E+03 \n", + "TCDLT9 = 1.3666666666667E-04 \n", + "TCNA9 = 'PHI ' \n", + "TCUNI9 = 'deg ' \n", + "LONP9 = 2.7000000000000E+02 \n", + "LATP9 = 9.0000000000000E+01 \n", + "TCTYP10 = 'NPOL-TAN' \n", + "TCRVL10 = 0.0000000000000E+00 \n", + "TCRPX10 = 4.0965000000000E+03 \n", + "TCDLT10 = 1.3666666666667E-04 \n", + "TCNA10 = 'THETA ' \n", + "TCUNI10 = 'deg ' \n", + "MTYPE7 = 'EQPOS ' / DM Keyword: Descriptor name. \n", + "MFORM7 = 'RA,DEC ' / [deg] \n", + "TCTYP11 = 'RA---TAN' \n", + "TCRVL11 = 1.9745215966375E+02 \n", + "TCRPX11 = 4.0965000000000E+03 \n", + "TCDLT11 = -1.3666666666667E-04 \n", + "TCUNI11 = 'deg ' \n", + "TCTYP12 = 'DEC--TAN' \n", + "TCRVL12 = -2.3382219860164E+01 \n", + "TCRPX12 = 4.0965000000000E+03 \n", + "TCDLT12 = 1.3666666666667E-04 \n", + "TCUNI12 = 'deg ' \n", + "HISTORY TOOL :dmcopy 2020-11-22T14:04:05 ASC00496\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_L2___7ASC00497\n", + "HISTORY CONT :22336652n581/output/tmp_acisf20860N002_evt2.fits[status=ASC00498\n", + "HISTORY CONT :0,grade=0,2,3,4,6] ASC00499\n", + "HISTORY PARM :outfile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_L2___ASC00500\n", + "HISTORY CONT :722336652n581/output/acisf20860N002_evt2.fits ASC00501\n", + "HISTORY PARM :kernel=default ASC00502\n", + "HISTORY PARM :option= ASC00503\n", + "HISTORY PARM :verbose=0 ASC00504\n", + "HISTORY PARM :clobber=no ASC00505\n", + "HISTORY TOOL :dmhedit 2020-11-22T14:04:18 ASC00506\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_L2___7ASC00507\n", + "HISTORY CONT :22336652n581/output/acisf20860N002_evt2.fits[EVENTS] ASC00508\n", + "HISTORY PARM :filelist= ASC00509\n", + "HISTORY PARM :operation=add ASC00510\n", + "HISTORY PARM :key=HDUCLAS2 ASC00511\n", + "HISTORY PARM :value=ACCEPTED ASC00512\n", + "HISTORY PARM :datatype=string ASC00513\n", + "HISTORY PARM :unit= ASC00514\n", + "HISTORY PARM :comment= ASC00515\n", + "HISTORY PARM :verbose=0 ASC00516\n", + "HISTORY TOOL :dmhedit 2020-11-22T14:04:20 ASC00517\n", + "HISTORY PARM :infile=/dsops/repro5/sdp.1/opus/prs_run/tmp//ACIS_L2___7ASC00518\n", + "HISTORY CONT :22336652n581/output/acisf20860N002_evt2.fits[EVENTS],/dsASC00519\n", + "HISTORY CONT :ops/repro5/sdp.1/opus/prs_run/tmp//ACIS_L2___722336652n5ASC00520\n", + "HISTORY CONT :81/output/acisf20860N002_full_img2.fits[1],/dsops/repro5ASC00521\n", + "HISTORY CONT :/sdp.1/opus/prs_run/tmp//ACIS_L2___722336652n581/output/ASC00522\n", + "HISTORY CONT :acisf20860N002_cntr_img2.fits[1],/dsops/repro5/sdp.1/opuASC00523\n", + "HISTORY CONT :s/prs_run/tmp//ACIS_L2___722336652n581/output/acisf20860ASC00524\n", + "HISTORY CONT :N002_fov2.fits[FOV] ASC00525\n", + "HISTORY PARM :filelist= ASC00526\n", + "HISTORY PARM :operation=add ASC00527\n", + "HISTORY PARM :key=REVISION ASC00528\n", + "HISTORY PARM :value=2 ASC00529\n", + "HISTORY PARM :datatype=long ASC00530\n", + "HISTORY PARM :unit= ASC00531\n", + "HISTORY PARM :comment= ASC00532\n", + "HISTORY PARM :verbose=0 ASC00533" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "evt2[1].header # display full header for the first extension (in this case 'EVENTS')\n", + "#evt2['EVENTS'].header['EXPOSURE'] # you can also display a specific value stored in the header (in this case the exposure length in seconds)" + ] + }, + { + "cell_type": "markdown", + "id": "b65ebc60-1441-4dd1-863b-b4bc78326a88", + "metadata": {}, + "source": [ + "Now we will look at the data contained in the EVENTS extension:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "6cc38dce-a8e0-4e32-a963-e2b74427502b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FITS_rec([(6.28653560e+08, 7, 1, 3, 492, 20, 4409, 1722, 4367.9414, 4607.473 , 4633.4424, 3891.8208, 956, 920, 4502.2505 , 309, 80, 6, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " (6.28653560e+08, 7, 2, 3, 647, 103, 4564, 1805, 4522.034 , 4524.4033, 4575.6235, 3726.5872, 2747, 2670, 12709.028 , 871, 104, 6, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " (6.28653560e+08, 7, 3, 3, 900, 336, 4817, 2038, 4774.943 , 4291.964 , 4385.821 , 3440.2903, 64, 50, 321.74658, 23, 0, 0, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " ...,\n", + " (6.28728624e+08, 3, 3, 23901, 919, 215, 4917, 3980, 4873.797 , 2352.5034, 2480.8862, 3046.7876, 2877, 2820, 11245.087 , 771, 64, 2, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " (6.28728624e+08, 2, 1, 23901, 366, 185, 3246, 3720, 3207.6765, 2611.5374, 2474.899 , 4732.9136, 521, 503, 1971.6624 , 136, 64, 2, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),\n", + " (6.28728624e+08, 2, 0, 23901, 120, 584, 3645, 3966, 3604.6306, 2365.815 , 2294.6035, 4302.28 , 289, 215, 1110.133 , 77, 8, 3, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])],\n", + " dtype=(numpy.record, [('time', '>f8'), ('ccd_id', '>i2'), ('node_id', '>i2'), ('expno', '>i4'), ('chipx', '>i2'), ('chipy', '>i2'), ('tdetx', '>i2'), ('tdety', '>i2'), ('detx', '>f4'), ('dety', '>f4'), ('x', '>f4'), ('y', '>f4'), ('pha', '>i4'), ('pha_ro', '>i4'), ('energy', '>f4'), ('pi', '>i4'), ('fltgrade', '>i2'), ('grade', '>i2'), ('status', 'u1', (4,))]))" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "evt2[1].data" + ] + }, + { + "cell_type": "markdown", + "id": "9a625bb5-23a7-44df-9b62-928c4efb2077", + "metadata": {}, + "source": [ + "Each line in the table represents an “eventâ€. This list of events has been already “cleaned†-the comparison of the evt1 to the evt2 file should have clarified what this means- and you can think about each line in the table as a count associated to some photon arriving at the detector.\n", + "\n", + "IMPORTANT: in X-ray Astronomy we use photon counting detectors, so we can really count the number of photons that arrived to the detector. For each photon (or things thought to be a photon), we record different info, including: the time of arrival, the location in the detector where the event arrived and the “gradeâ€. In the table above you will find a column that contains the grade information for each event that passed the re-processing cut, and it it thus very likely associated with photons arriving at the detector.\n", + "\n", + "An __event__ = anything that creates a displacement of charge in the CCD (i.e. in your detector).\n", + "\n", + "The __grade__ is a number assigned to every event based on which pixels in its 3x3 island are above their threshold value. The initial grade is assigned by on-board processing, which first finds local maxima, then analyzes the values of the surrounding 3x3 neighboring pixels. Based on this pattern, the event is\n", + "assigned a grade. For example, a single-pixel event has a grade of 0. There are grades that are typical of photons (Good!) and grades which are created when something else happens (bad!), like particles etc. These events will be discarded in the processing (i.e. will not pass the quality cut during the processing)." + ] + }, + { + "cell_type": "markdown", + "id": "a9e2177c-5766-4b39-b017-7548930ab0e1", + "metadata": {}, + "source": [ + "<img src=\"fig1.png\" class=\"bg-primary\" width=\"800px\">" + ] + }, + { + "cell_type": "markdown", + "id": "e1828d28-a8d0-4ad7-9816-1be1730df133", + "metadata": {}, + "source": [ + "__Figure 1:__ Chandra flight grades. Do not pay attention to the color (which just describes the mapping of Chandra grades into ASCA grades, not important for you)." + ] + }, + { + "cell_type": "markdown", + "id": "d877e121-8132-4d0d-af46-4db48253ff7e", + "metadata": {}, + "source": [ + "## 4) More on evt files\n", + "\n", + "Go back to the ds9 view of the evt2 file and bin out (or zoom out if you are using js9). This way you will be able to appreciate the structure of the CCDs that we used. You should see something like this:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "e71522c5-654e-4775-b52a-0601192e49db", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " <iframe id=\"js9frame\" src='/js9html' width=\"100%\" height=\"700px\" frameBorder=\"0\" scrolling=\"no\"></iframe>\n", + "\n", + " <script> \n", + " frame = document.getElementById('js9frame');\n", + " \n", + " if ( document.URL.includes('renkulab') ) {\n", + " detected_session_id = document.URL.split('/lab/')[0].split('/').pop(); \n", + " console.log(detected_session_id);\n", + " \n", + " frame.src = 'https://renkulab.io/sessions/' + detected_session_id + '/js9html';\n", + " console.log(frame);\n", + " } else {\n", + " console.log('no renku - no need to detect long URL');\n", + " }\n", + " </script>\n", + " " + ], + "text/plain": [ + "<IPython.core.display.HTML object>" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "jpjs9.JS9.show_js9()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "a6de9114-bc06-469a-9b45-f7845271def9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "J.Load('20860/primary/acisf20860N002_evt2.fits.gz')\n" + ] + }, + { + "cell_type": "markdown", + "id": "f39f7a08-faf5-4402-86dd-7d308cb12343", + "metadata": {}, + "source": [ + "<img src=\"fig2.png\" class=\"bg-primary\" width=\"300px\">\n", + "\n", + "__Figure 2:__ binned-out view of the evt2 file.\n", + "\n", + "<img src=\"fig3.png\" class=\"bg-primary\" width=\"800px\">\n", + "\n", + "__Figure 3:__ ACIS focal plane.\n", + "\n", + "Figure 3 above will help you understanding what you are looking at. We are using S2 and S3 on ACIS-S and I2 and I3 from ACIS-I. From this simple exercise you can clearly appreciate the different levels of background of the different chips." + ] + }, + { + "cell_type": "markdown", + "id": "b8377731-9bdb-4778-8ab6-8191b872f745", + "metadata": {}, + "source": [ + "## 5) Filtering event files in energy and in space.\n", + "\n", + "Using ds9 we can filter the events into a particular energy range using “Bin†(for js9, the binning functionality is under the View menu). However, now we will do something a little more refined. The goal is to create a new evt file that is filtered in energy and in a given region.\n", + "\n", + "We will use the CIAO task dmcopy. To find out more about the syntax, you can use the online help:\n", + "http://cxc.harvard.edu/ciao/ahelp/dmcopy.html" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "9fbde20e-b095-497a-9e3f-cc25a320757e", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "cd 20860/primary\n", + "dmcopy \"acisf20860N002_evt2.fits.gz[ccd_id=7][energy=500:8000][bin x=3848:4360:1.0,y=3860:4372:1.0]\" evt_500_8000_img.fits" + ] + }, + { + "cell_type": "markdown", + "id": "7065efc4-4058-410d-ad33-f5f7688fd807", + "metadata": {}, + "source": [ + "Comments:\n", + "\n", + "• [ccd_id=7] → we are telling CIAO that the x an y coordinates are on the CCD with id=7. Go back to Fig. 3 and see if it makes sense. Our source of interest is in S3.\n", + "\n", + "• [energy=500:8000] this means: filter in energy between 0.5 keV and 8 keV, which is the range where Chandra is better calibrated. \n", + "\n", + "• [bin x=3848:4360:1.0,y=3860:4372:1.0] this means: filter out between those xmin and xmax, ymin and ymax. In this way we are effectively reducing the size of the evt file that we will use for the following analysis, so that any operation that follows will be appreciably faster. However, we need to make sure that the the size of the final evt file is not too small around the source, or we will not have enough statistics to understand the properties of the background around the source, and hence do a reliable source detection.\n", + "\n", + "• evt_500_8000_img.fits: this is the name of the output file. It is good practice to save it with a name that reflects the nature of its content.\n", + "Open evt_500_8000_img.fits with ds9 and visualize the content (always log scale with X-rays!). Check the size of the new file and that the file has been filtered in energy (compare the same region of the original evt file in ds9)." + ] + }, + { + "cell_type": "markdown", + "id": "d0065766-d692-43f5-909c-f7f297e4945d", + "metadata": {}, + "source": [ + "Check the structure of the new evt file with astropy.io.fits. How many extensions do you have? Do you notice differences with respect to the original evt file? This is because this fits file is an image (this is why I put an .img extension), i.e. we have lost the “table†structure, which means that we lost the info about the details of the arrival time of each photon. We lost the “time†coordinate and merged everything into an image." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "ab107997-21ec-4503-9106-387934e3a67f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filename: 20860/primary/evt_500_8000_img.fits\n", + "No. Name Ver Type Cards Dimensions Format\n", + " 0 PRIMARY 1 PrimaryHDU 819 (512, 512) int16 \n", + " 1 GTI 7 BinTableHDU 28 1R x 2C [1D, 1D] \n" + ] + } + ], + "source": [ + "from astropy.io import fits \n", + "evt_img = fits.open('20860/primary/evt_500_8000_img.fits')\n", + "evt_img.info()" + ] + }, + { + "cell_type": "markdown", + "id": "411e6e2f-a197-4ecf-9b3f-646da12b0571", + "metadata": {}, + "source": [ + "As a final step we will need to compute the PSF (Point Spread Function) at each position in our image. We will use the task: mkpsfmap. As always you can find out more about the task going online on the CIAO help page." + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "4347d292-567e-4eae-81eb-8394111202d7", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "cd 20860/primary\n", + "mkpsfmap evt_500_8000_img.fits outfile=evt_500_8000_psfmap.fits energy=1.4967 ecf=0.90" + ] + }, + { + "cell_type": "markdown", + "id": "f4e3017d-5143-4819-9862-9beeca26828f", + "metadata": {}, + "source": [ + "Comments:\n", + "\n", + "• mkpsfmap expects as input a fits file, in this case evt_500_8000_img.fits.\n", + "\n", + "• The output file is also a fits file. I gave it the name evt_500_8000_psfmap.fits, so that it is easy to\n", + "remember which image is the PSF map for.\n", + "\n", + "• Energy=1.4967 (keV) specifies the energy at which to compute the PSF. This is important because the PSF varies as a function of energy, so we need to specify a “typical†energy for computing the PSF. The best choice will depend on the nature of the source we are interested in. From experience I know that an energy ~1.5 keV is fine for the PSF map for the majority of cases.\n", + "\n", + "• Ecf= encircled energy fraction. Here we are specifying that we want the output number to be the radius, (in arcsec!) that contains the 90% of energy.\n", + "\n", + "Now open the newly created fits file evt_500_8000_psfmap.fits with ds9. You should see something like in Figure 4 below:" + ] + }, + { + "cell_type": "markdown", + "id": "6cf5780b-3583-4bab-a3e9-32450c80d983", + "metadata": {}, + "source": [ + "<img src=\"fig4.png\" class=\"bg-primary\" width=\"300px\">\n", + "\n", + "__Figure 4:__ PSF map" + ] + }, + { + "cell_type": "markdown", + "id": "56d53ab7-c8d9-442f-b800-1e3d24ebd6d7", + "metadata": {}, + "source": [ + "If you go with your mouse over the map you will see that the values vary from ~0.9'' in the central black region to ~1.7'' in the outer regions. What you are looking at is the effect of deterioration of the PSF as we go further away from the on-axis condition . At the center an angular region as small as 0.9'' contains 90% of energy, while going further away the 90% ECF becomes significantly larger.\n", + "\n", + "Note: this angular resolution is AMAZING for X-ray astronomy. No other satellite can do better. Other satellites like Swift-XRT or XMM have much larger PSFs, of several arcsec (XRT has an 18 arcsec PSF)!" + ] + }, + { + "cell_type": "markdown", + "id": "24321a98-4415-41fd-91b9-79266c8bae28", + "metadata": {}, + "source": [ + "## Counts and count-rates from a region (for our source, and the background).\n", + "We will create two regions, one for our source of interest and one that we will use to estimate the background (i.e. the number of spurious counts).\n", + "Our source of interest is GW170817, which, from optical observations we know has coordinates: \n", + "\n", + "RA= 13:09:48.08, \n", + "dec= -23:22:53.3\n", + "\n", + "In ds9, create a region of 3 arcsec around GW170817 and name it GW170817_3arcsec_optical.reg. (Go to Edit --> Region, click on the image so a green circle appears, double click on the circle, enter the desired coordinates and radius, and click Apply). Save a version in fk5 coordinates (GW170817_3arcsec_optical.reg) and a version in physical coordinates (GW170817_3arcsec_optical_physical.reg) by going to Region --> Save Regions.\n", + "\n", + "Now create a circular background region. Important specs for the background region:\n", + "\n", + "• Must be far away from any source that you can identify with your eyes in the ds9 image when\n", + "the scale is in log units.\n", + "\n", + "• Must be far away from chip gaps.\n", + "\n", + "• Must be reasonably close to the source of interest, and preferentially in the centre of the chip.\n", + "\n", + "• Must be significantly larger than the source region, to protect ourselves against statistical\n", + "fluctuations. Select a radius of ~35 arcsec or more. Do you understand what this means?\n", + "\n", + "As before save a version of the background region in fk5 coordinates (bk.reg) and one in physical coordinates (bk_physical.reg). Then run:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "392650a8-c848-4364-ae9f-a970e99fb3fb", + "metadata": {}, + "outputs": [], + "source": [ + "J.LoadRegions(\"js9.reg\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "e7a2e258-62f0-40e8-a1ec-9ddcc35b8f46", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-rw-r--r-- 1 jovyan jovyan 50 Jan 19 16:29 GW170817_3arcsec_optical.reg\n", + "-rw-r--r-- 1 jovyan jovyan 50 Jan 19 16:29 GW170817_3arcsec_optical_physical.reg\n", + "-rw-r--r-- 1 jovyan jovyan 50 Jan 19 16:29 bk_physical.reg\n", + "-rw-r--r-- 1 jovyan jovyan 88 Jan 19 16:24 js9.reg\n", + "FK5; circle(13:09:49.126,-23:23:07.307,14.760000\")" + ] + } + ], + "source": [ + "J.SaveRegionFile(\"GW170817_3arcsec_optical.reg\")\n", + "J.SaveRegionFile(\"GW170817_3arcsec_optical_physical.reg\")\n", + "J.SaveRegionFile(\"bk_physical.reg\")\n", + "! ls -l *.reg\n", + "!cat GW170817_3arcsec_optical.reg" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "eb780c26-9422-4921-a285-67cb7914dc3f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'../../GW170817_3arcsec_optical.reg' -> './GW170817_3arcsec_optical.reg'\n", + "'../../GW170817_3arcsec_optical_physical.reg' -> './GW170817_3arcsec_optical_physical.reg'\n", + "'../../bk_physical.reg' -> './bk_physical.reg'\n", + "'../../js9.reg' -> './js9.reg'\n", + "110 \n" + ] + } + ], + "source": [ + "%%bash\n", + "cd 20860/primary\n", + "cp -fv ../../*.reg .\n", + "dmlist 'acisf20860N002_evt2.fits.gz[energy=500:8000][sky=region(GW170817_3arcsec_optical_physical.reg)]' counts" + ] + }, + { + "cell_type": "markdown", + "id": "03cc930a-061a-48e9-a30d-772b71c168ea", + "metadata": {}, + "source": [ + "The CIAO dmlist task, with the option “counts†at the end, will produce as output the number of counts that are in the evt file that you provide as input, after applying all the filters you want. Each filter is defined in a “[filter]†structure. Here we are filtering in energy with [energy=500:8000](which energy band is this??) and we will only accept the counts within the SN2014C_3arcsec_optical_physical.reg region. Another way to visualize the number of photons in a region is by double clicking on the region file, Analysis, Statistics.\n", + "\n", + "Now estimate your “background level†in the source region, by calculating the number of 0.5-8 keV counts that you have in the background region, and then renormalize them by the size of the source region. The goal is to be able to answer to the question: how many 0.5-8 keV counts from the background do you expect to have in the source region? Compare it to the number of photons that you effectively have in the source region." + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "b208681e-67b8-49d1-8fe3-e5e5d928f544", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "110 \n" + ] + } + ], + "source": [ + "%%bash\n", + "cd 20860/primary\n", + "dmlist 'acisf20860N002_evt2.fits.gz[energy=500:8000][sky=region(bk_physical.reg)]' counts" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "4d769f7b-ffa8-4685-b2a1-7df1de0400fe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4.812244897959184\n" + ] + } + ], + "source": [ + "# sample renormalization to get expected number of background counts\n", + "expected_counts = 655*(3/35)**2\n", + "print(expected_counts) " + ] + }, + { + "cell_type": "markdown", + "id": "01b0451d-ec80-4cf7-bc9c-c68234795bfd", + "metadata": {}, + "source": [ + "Note that this is much less than the number of counts in our actual source region -- so we have a significant detection! We can also convert to an average count rate by subtracting the number of expected background counts from the number of observed counts in our source region, and then dividing by the exposure length (do you remember how to extract this from the image header, as we did above?)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "85083ce2-1cbd-4c02-910b-6bb170c5e5d5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.001473812845297969\n" + ] + } + ], + "source": [ + "# students will fill this in\n", + "from astropy.io import fits\n", + "evt2 = fits.open('20860/primary/acisf20860N002_evt2.fits.gz')\n", + "print((114-expected_counts)/evt2['EVENTS'].header['EXPOSURE']) # units are counts per second" + ] + }, + { + "cell_type": "markdown", + "id": "8c678236-1d84-4778-903c-25953c466241", + "metadata": {}, + "source": [ + "If you have chosen a good background region, this should be consistent with the count rate reported in Margutti et al (2018). In the next section, we'll explore the image a bit more and provide some tips for improving your background region if necessary." + ] + }, + { + "cell_type": "markdown", + "id": "ff148ad2-77f9-4bac-ac53-026944ce0f91", + "metadata": {}, + "source": [ + "## 7) Source Detection with wavedetect\n", + "\n", + "Goal: we want to find all the point-like sources in our image. Since our input is an image filtered in the energy range 0.5-8 keV, the output will be a list of point-like sources in the 0.5-8 keV range. We will use the wavedetect task within CIAO." + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "88713dcf-165c-499e-bb35-42c95e6b9c0f", + "metadata": {}, + "outputs": [], + "source": [ + "%%bash\n", + "cd 20860/primary\n", + "wavdetect infile=\"evt_500_8000_img.fits\" outfile=\"evt_500_8000_src.fits\" scellfile=\"evt_500_8000_scell.fits\" imagefile=\"evt_500_8000_imgfile.fits\" defnbkgfile=\"evt_500_8000_nbgd.fits\" regfile=\"evt_500_8000_src.reg\" scales=\" 1.0 2.0 4.0 8.0 16.0\" clobber=y sigthresh=\"4e-06\" psffile=\"evt_500_8000_psfmap.fits\"" + ] + }, + { + "cell_type": "markdown", + "id": "06c4cfe3-c6a8-4cd6-98e4-9724c6291ca8", + "metadata": {}, + "source": [ + "There are many different algorithms that can be used to detect sources. Here we will use wavelets. For fainter sources, it is possible to implement very basic and simple Poisson statistics to get solid results in the realm of source detection in the regime of very low number statistics.\n", + "\n", + "IMPORTANT: A source detection is always a statement about the background/noise. In a nutshell, we say that we have detected a source IF the observed counts at a certain location in the sky are in excess with respect to what we expect from the background alone (the background can be astronomical or instrumental, it does not matter here). (We will learn more in class in the next 2 lectures). Wavelets allows you to explore such deviations with respect to the background over different pixel scales.\n", + "\n", + "Comments about the syntax:\n", + "\n", + "• infile: this is your filtered image\n", + "\n", + "• outfile: it is going to be a fits file that contains the list of sources found. I call it “_srcâ€\n", + "\n", + "• regfile: region files with the regions associated to the detected sources. The sizes of these\n", + "regions are optimized by the algorithm to maximize the signal-to-noise in the region.\n", + "\n", + "• Scales: all different pixels scales over which I want to run the tool and see if I find a source. Is it\n", + "clear why using different scales I might be able to find sources that were not appearing obvious\n", + "before?\n", + "\n", + "• clobber=yes. This is just a parameter that allow the tool to overwrite on files.\n", + "\n", + "• Sighthresh: this is the signal threshold to define something a detection. The number I chose is good enough not to throw away potential detections, but also ok in the sense of not having too many false positives.\n", + "\n", + "• Psffile: this is the psfmap that we just generated with mkpsfmap. This is a necessary input as this is the way we are telling the algorithm how a point source looks like on the detector.\n", + "\n", + "Open evt_500_8000_img.fits with ds9 (delete the psfmap frame), log scale. Now we want to see which sources have been detected: “Region†“Loadâ€, select: evt_500_8000_src.reg\n", + "Now open evt_500_8000_src.reg with your favorite text editor to see the structure of the file (it is a list of regions).\n", + "\n", + "Is GW170817 detected in this Chandra observation? Load your GW170817_3arcsec_optical.reg region and see if you have a green region around it, which means: detected! (The answer is obvious for GW170817, but it is not always this obvious, especially if we push the instrument to the very limit of its performance, which is necessary to track the full light curve evolution of gravitational wave sources.)\n", + "\n", + "The file evt_500_8000_src.fits contains all the relevant information for each source. Sources appear in the file in order of detection significance, from the most significant to the least:" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "668a455d-12c3-4747-8ae3-2c85041c8642", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Filename: 20860/primary/evt_500_8000_src.fits\n", + "No. Name Ver Type Cards Dimensions Format\n", + " 0 PRIMARY 1 PrimaryHDU 7 () \n", + " 1 SRCLIST 1 BinTableHDU 271 13R x 33C [1D, 1D, 1D, 1D, 1D, 1D, 1D, 1D, 1J, 1E, 1E, 1E, 1E, 1E, 1E, 1E, 1E, 1E, 1E, 1E, 1E, 1J, 10A, 2E, 1E, 1E, 1J, 1D, 1D, 1D, 1D, 1E, 1E] \n" + ] + } + ], + "source": [ + "from astropy.io import fits\n", + "src_img = fits.open('20860/primary/evt_500_8000_src.fits')\n", + "src_img.info()" + ] + }, + { + "cell_type": "markdown", + "id": "59c0ed65-56f9-4076-ba69-56372b8f3c67", + "metadata": {}, + "source": [ + "You have two extensions. Look at the data in the SRCLIST extension. Each line of this table is a detected source. " + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "8a10340e-41f2-4420-91ac-83f42dcd4100", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "FITS_rec([(197.44790881, -23.40788535, 1.01918035e-05, 9.48318422e-06, 4125.04395604, 3908.7032967 , 0.06843877, 0.06938715, 121, 186.77264 , 13.856429 , 5.227352 , 0.0250978 , 186.77264 , 13.856429 , 5.227352 , 0.0250978 , 1., 0., 54.21774 , 2.1299467, 0, 'ellipse', [3.15459 , 2.3679123], 4.6412415e+01, 0.42772466, 1, 4125.5, 3908.5, 4125.5, 3908.5, 2., 2.),\n", + " (197.43517847, -23.40254384, 2.02656506e-05, 1.93244638e-05, 4210.53125 , 3947.78125 , 0.13610353, 0.14138251, 52, 29.746717 , 5.656878 , 2.2532825, 0.0164109 , 29.746717 , 5.656878 , 2.2532825, 0.0164109 , 1., 0., 10.88428 , 2.1143086, 0, 'ellipse', [2.5177586, 2.180066 ], 5.2711082e+01, 0.36936203, 2, 4210.5, 3947.5, 4210.5, 3947.5, 2., 2.),\n", + " (197.42252978, -23.40216212, 3.85375419e-05, 4.61015500e-05, 4295.46969697, 3950.56060606, 0.25885546, 0.3372753 , 90, 29.331089 , 5.7446 , 3.668912 , 0.02067912, 29.331089 , 5.7446 , 3.668912 , 0.02067912, 1., 0., 9.455173 , 2.4344752, 0, 'ellipse', [6.8682203, 2.5521557], 5.4983593e+01, 0.5732566 , 3, 4295.5, 3951.5, 4295.5, 3950.5, 2., 2.),\n", + " (197.44438316, -23.38513936, 3.44169293e-05, 5.01204388e-05, 4148.72727273, 4075.13636364, 0.23116502, 0.36672244, 65, 18.969393 , 4.6904545, 3.0306065, 0.01905417, 18.969393 , 4.6904545, 3.0306065, 0.01905417, 1., 0., 6.4425807, 1.9065418, 0, 'ellipse', [5.7033973, 2.1633167], 6.2593170e+01, 0.61412853, 4, 4148.5, 4075.5, 4148.5, 4075.5, 2., 2.),\n", + " (197.44653138, -23.38417409, 5.07102406e-05, 4.75413968e-05, 4134.3 , 4082.2 , 0.34058773, 0.34785054, 42, 7.947732 , 3.1623151, 2.052268 , 0.01537952, 7.947732 , 3.1623151, 2.052268 , 0.01537952, 1., 0., 2.9722285, 1.9048756, 0, 'ellipse', [3.729987 , 2.723453 ], 1.3301375e+02, 0.5577322 , 5, 4134.5, 4082.5, 4134.5, 4082.5, 2., 2.),\n", + " (197.4487454 , -23.383782 , 2.11549890e-05, 2.42828711e-05, 4119.43055556, 4085.06944444, 0.14208325, 0.17767617, 130, 81.42516 , 9.434031 , 7.5748363, 0.03038623, 81.42516 , 9.434031 , 7.5748363, 0.03038623, 1., 0., 20.957352 , 1.9038998, 0, 'ellipse', [4.565373 , 3.5630834], 7.7427383e+01, 0.7061318 , 6, 4119.5, 4084.5, 4119.5, 4084.5, 2., 2.),\n", + " (197.46874815, -23.38370045, 2.29817719e-05, 1.65923101e-05, 3985.09 , 4085.66 , 0.15433405, 0.12142487, 120, 95.567635 , 10.000026 , 4.432366 , 0.02266396, 95.567635 , 10.000026 , 4.432366 , 0.02266396, 1., 0., 29.167767 , 1.9535719, 0, 'ellipse', [4.6417923, 3.6277356], 6.5505433e+00, 0.7001805 , 7, 3985.5, 4085.5, 3985.5, 4085.5, 2., 2.),\n", + " (197.45024165, -23.38135761, 1.36342928e-05, 1.03571653e-05, 4109.38181818, 4102.80909091, 0.09157196, 0.07578292, 86, 108.49155 , 10.630171 , 4.5084543, 0.02314076, 108.49155 , 10.630171 , 4.5084543, 0.02314076, 1., 0., 32.94479 , 1.9124016, 0, 'ellipse', [2.8812447, 2.3844535], 3.2582197e-02, 0.45686108, 8, 4109.5, 4102.5, 4109.5, 4102.5, 2., 2.),\n", + " (197.47182746, -23.41227675, 4.45834408e-05, 3.07177120e-05, 3964.4375 , 3876.5625 , 0.29933194, 0.2248046 , 52, 13.955614 , 4.0000434, 2.0443854, 0.01860132, 13.955614 , 4.0000434, 2.0443854, 0.01860132, 1., 0., 5.2236104, 2.452184 , 0, 'ellipse', [3.8021257, 2.3923895], 1.5505046e+02, 0.40997264, 9, 3964.5, 3876.5, 3964.5, 3876.5, 2., 2.),\n", + " (197.44297734, -23.38972487, 6.40735141e-05, 5.68532108e-05, 4158.16666667, 4041.58333333, 0.43033148, 0.41597164, 55, 9.5707855, 3.4641435, 2.429214 , 0.01705553, 9.5707855, 3.4641435, 2.429214 , 0.01705553, 1., 0., 3.4389741, 1.9179821, 0, 'ellipse', [5.1597857, 3.4733427], 1.3758607e+02, 0.7357391 , 10, 4157.5, 4041.5, 4157.5, 4041.5, 2., 2.),\n", + " (197.4823438 , -23.38089742, 4.91977067e-05, 3.21443774e-05, 3893.77586207, 4106.15517241, 0.33037489, 0.23527181, 85, 25.727165 , 5.385202 , 3.2728345, 0.0200056 , 25.727165 , 5.385202 , 3.2728345, 0.0200056 , 1., 0., 8.559458 , 2.20401 , 0, 'ellipse', [5.389876 , 3.726102 ], 1.6888910e+02, 0.6777694 , 11, 3893.5, 4106.5, 3893.5, 4106.5, 2., 2.),\n", + " (197.46011019, -23.37522233, 9.03203612e-05, 2.44431375e-05, 4043.1 , 4147.7 , 0.60663004, 0.17888544, 30, 3.9009092, 2.2360969, 1.0990908, 0.01136356, 3.9009092, 2.2360969, 1.0990908, 0.01136356, 1., 0., 1.6530588, 1.9470135, 0, 'ellipse', [4.078818 , 1.1675816], 1.7593495e+02, 0.37361178, 12, 4042.5, 4147.5, 4042.5, 4147.5, 2., 2.),\n", + " (197.44702401, -23.35143561, 3.72137448e-05, 2.95904109e-05, 4131. , 4321.75 , 0.25 , 0.21650635, 30, 3.4742625, 2.000016 , 0.5257376, 0.00798589, 3.4742625, 2.000016 , 0.5257376, 0.00798589, 1., 0., 1.6315031, 2.4584813, 0, 'ellipse', [1.7687209, 0.8995146], 1.4201813e+02, 0.17101948, 13, 4131.5, 4321.5, 4131.5, 4321.5, 2., 2.)],\n", + " dtype=(numpy.record, [('RA', '>f8'), ('DEC', '>f8'), ('RA_ERR', '>f8'), ('DEC_ERR', '>f8'), ('X', '>f8'), ('Y', '>f8'), ('X_ERR', '>f8'), ('Y_ERR', '>f8'), ('NPIXSOU', '>i4'), ('NET_COUNTS', '>f4'), ('NET_COUNTS_ERR', '>f4'), ('BKG_COUNTS', '>f4'), ('BKG_COUNTS_ERR', '>f4'), ('NET_RATE', '>f4'), ('NET_RATE_ERR', '>f4'), ('BKG_RATE', '>f4'), ('BKG_RATE_ERR', '>f4'), ('EXPTIME', '>f4'), ('EXPTIME_ERR', '>f4'), ('SRC_SIGNIFICANCE', '>f4'), ('PSF_SIZE', '>f4'), ('MULTI_CORREL_MAX', '>i4'), ('SHAPE', 'S10'), ('R', '>f4', (2,)), ('ROTANG', '>f4'), ('PSFRATIO', '>f4'), ('COMPONENT', '>i4'), ('X_CORRELATION_MAX', '>f8'), ('Y_CORRELATION_MAX', '>f8'), ('X_FLUX_MAX', '>f8'), ('Y_FLUX_MAX', '>f8'), ('X_WAVELET_SCALE', '>f4'), ('Y_WAVELET_SCALE', '>f4')]))" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "src_img[1].data" + ] + }, + { + "cell_type": "markdown", + "id": "ef1b58e6-8695-4b72-be5f-50124344b672", + "metadata": {}, + "source": [ + "The table contains important information, including:\n", + "\n", + "• Coordinates of the sources detected (RA, dec) and their absolute uncertainties (RA_err, dec_err)\n", + "\n", + "• X,Y: coordinates on the detector and error bar.\n", + "\n", + "• NET_COUNTS: background subtracted counts and uncertainty.==> Net-counts: total counts in\n", + "the region – background counts in the region. Since we filtered the events into the 0.5-8 keV\n", + "energy range, these are the source counts in that energy band.\n", + "\n", + "• BKG_COUNTS: counts from the background in the region and error bar.\n", + "\n", + "• RATE columns: discard. This is not a count-rate.\n", + "\n", + "• EXP-TIME: 1. Discard.\n", + "\n", + "• SRC_SIGNIFICANCE: this is an important column. It gives you the statistical information\n", + "about the significance of the detection in units of Gaussian sigma. We will learn more about the meaning of Gaussian sigmas in the next lectures. For now, just learn that something with >= 3 sigma detection means: pretty solid detection.\n", + "\n", + "• PSF-SIZE (in pixels!): at the location of the source. It tells you the angular resolution of your detector at that location on the detector.\n", + "\n", + "• You also have some info on the shape of the regions. In the ds9 you can load the evt_500_8000_img.fits file together with the region file evt_500_8000_src.reg. If you click o one of the regions, you will find information about the size and shape of the region. Note that not all the regions are circular.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "973f84e8-92f4-48b9-b1e3-ed3d3213565c", + "metadata": {}, + "source": [ + "Load the GW170817_3arcsec_optical.reg into ds9 (use a different color for the GW170817 region – you\n", + "can change the color of the region double clicking on the region and changing the settings in the menu that appears).\n", + "\n", + "Final step: identify GW170817 in the list of sources in evt_500_8000_img.fits. Which source number is GW170817? What is the easiest way to identify GW170817 in the list?" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "81ed1f1b-a275-4f71-bfd5-ee6ab4ab518f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Fontconfig warning: ignoring UTF-8: not a valid region tag\n" + ] + } + ], + "source": [ + "# ANSWER: GW170817 is the 8th source in the list. It can be identified by its RA and dec (which are very close to those in the region file)." + ] + }, + { + "cell_type": "markdown", + "id": "14c23afe-b617-456e-b771-d05a51877af2", + "metadata": {}, + "source": [ + "Finally load your background region on the ds9 and check if it contains any of the detected sources. If it does, it means that your initial choice of background is not an ideal one and you will need to redefine the background region and re-do your estimates above with a new background region that does NOT contain any source (and it is far away from the chip gaps). The background region needs to be source- free!!\n", + "\n", + "Note on “event†vs. “counts†vs. “photonsâ€: there is a reason why until now we have been speaking of counts and not of “photons†yet. A quick recap:\n", + "\n", + "Event= anything that creates a displacement of charge in the CCD. By assigning a grade, we effectively filter out events that have high probability of not being photons.\n", + "\n", + "Count= an event that is produced by photon(s), but not necessarily one photon.\n", + "\n", + "What happens in CCDs that are photon counting detectors, two photons that arrive very close in time to to the same pixel (or close too), can be mistakenly interpreted as one single photon with higher energy. This effect is called pile-up. Pile-up:\n", + "\n", + "• Is important only when the rate of photons arriving to the detector is large (how large depends on the CCD and on the mode of operation of a CCD). For the sources that we will use and our set up, pile up is not important.\n", + "\n", + "• Pile-up affects different portions of the PSF of a source in a different way: since most of the photons will tend to concentrate in the core of the PSF, and fewer photons will be part of the PSF tail, pile-up more severely affects the core of the PSF [this actually gives us an easy way for correct for pile-up, see reading in the folder].\n", + "\n", + "• By recording 2 photons as 1 photon, pile-up leads to an underestimation of the actual photon rate by the source. This directly affects the light-curve of an object.\n", + "\n", + "• By recording 2 lower energy photons as 1 higher energy photon, pile-up also causes a deformation of the spectrum (a spectral hardening in this case, as it goes in the direction of more energy).\n", + "\n", + "__VERY IMPORTANT: in X-ray astronomy you always have to report the energy band you use to extract your results. Reporting a number of counts or count-rate or any other quantity without providing the energy range is effectively is of no scientific use!!!!__" + ] + }, + { + "cell_type": "markdown", + "id": "65b54845-39e6-4db8-96a1-f2da379048a0", + "metadata": {}, + "source": [ + "The final step in the data reduction process is to convert the number of counts we received to a flux density. To do this properly, X-ray astronomers need to use information about the __spectrum__ of the X-ray emission within the given energy range. (This can either be measured directly from the data if the source has enough counts, or a specific model must be assumed, e.g. a power law.) This is beyond the scope of today's activity, although we provide instructions on how to install and use a tool called Xspec to do this on your own if you are interested. The outcome of the spectrum analysis allows us to accurately convert from the observed count rate to a flux density, which can then be used for science. For the extension activity, we will explore some of the science that can be done with the full X-ray light curve of GW170817 (in combination with radio and late-time optical data)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9158b59-72c4-4b71-bf91-ccca8b9b21f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/courses/course-for-prof-margutti/MarguttiExtensions.ipynb b/courses/course-for-prof-margutti/MarguttiExtensions.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..a37e43b9a92acbd9739465ad64db31df7cf61bd0 --- /dev/null +++ b/courses/course-for-prof-margutti/MarguttiExtensions.ipynb @@ -0,0 +1,251 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a873ac6d-2fa9-4d0c-abe9-c545a529e5ec", + "metadata": { + "tags": [] + }, + "source": [ + "# Extension Activities" + ] + }, + { + "cell_type": "markdown", + "id": "0ee957c3-054f-46eb-bbca-33b565c622af", + "metadata": {}, + "source": [ + "Here, we list a couple of extension activities to further use the concepts covered in Prof. Margutti's lectures. Some of these exercises are optional, because they involve installing additional software and thus may not work for all participants." + ] + }, + { + "cell_type": "markdown", + "id": "4d6ebcd5-c60e-4395-8abf-fcee50c6ead3", + "metadata": {}, + "source": [ + "## 1) Basic Light Curve Analysis\n", + "\n", + "In our previous activity, we learned how to extract an X-ray count rate from Chandra data. Here, we will take a closer look at a compilation of flux density measurements extracted from observations of GW170817 and perform some basic calculations using this data. We also provide a couple of optional extra activities for students desiring to further explore data analysis relevant for multi-messenger science.\n", + "\n", + "All of the data for this activity is contained in the file GW170817_data.txt. Let's start by reading in this file and taking a look at the X-ray light curve:" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "413c754c-8f4e-41ef-a04d-6a4693d2ef5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Flux density (mJy)')" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEKCAYAAAAMzhLIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAVY0lEQVR4nO3df5BdZ33f8ffHAhvUAaXBTuMaS4sjYjAlYEeQYEyidiBjJpadMEyxsxAqFFQYCJMyHQrjeCDteAgkQ4YfJolc/ANHgaRgqEVNnBSQnA64WHIJ2CEurpGNwg9D0whSubKBb/84d4f1snv23tU9e8/efb9mdnTPc8+99ysdXX30nOec50lVIUnSUk6adAGSpH4zKCRJrQwKSVIrg0KS1MqgkCS1MigkSa0eNekCunDqqafWzMzMpMuQpDXl0KFD36qq0xa2T2VQzMzMcPDgwUmXIUlrSpL7Fmv31JMkqdVUBUWSHUn2HD16dNKlSNLUmKqgqKp9VbV706ZNky5FkqbGVAWFJGn8DApJUiuDQpLUyqCQJLUyKCSdkO3bmx9NL4NCktTKoJAktTIoJK3Y3r1w221w4ADMzDTbmj4GhaQV2bsXdu+G48eb7fvua7YNi+ljUEhakcsvh2PHHtl27FjTruliUEjr1IlerXT//aO1a+0yKCStyObNo7Vr7TIopHVoHIPQV14JGzc+sm3jxqZd08WgkNaZcQ1Cz87Cnj1wyinN9pYtzfbs7Hjr1eSlqiZdw9ht27atXOFOWtzMTBMOC23ZAocPj/5+c+Mc+/evvCb1Q5JDVbVtYftULoUqaWnjHoQ2IKafp56kdcZBaI3KoJDWGQehNSqDQlpnHITWqByjkNah2Vm4+urmsWMMWs5UBUWSHcCOrVu3TroUqfcMCA1rqk49VdW+qtq9adOmSZciSVNjqoJCkjR+BoUkqZVBIUlqZVBIkloZFJKkVgaFJKmVQSFJamVQSJJaGRSSpFYGhSSplUEhSWplUEiSWhkUkqRWBoUkqZVBIUlqZVBIkloZFJKkVgaFJKmVQSFJamVQSJJaGRSSpFYGhSSplUEhSWplUEiSWhkUkqRWBoWkXtu+vfnR5BgUkqRWBoUkqZVBIUlqZVBIkloZFJJ6a+9euO02OHAAZmaa7VE4ED4eBoWkXtq7F3bvhuPHm+377mu2Rw0LnTiDQlIvXX45HDv2yLZjx5p2ra5HTbqA5SQ5CfgPwOOBg1V1/YRLkrQK7r9/tHZ1p9MeRZJrkjyQ5M4F7RcmuTvJPUneuMzbXAKcATwMHOmqVkn9snnzaO3qTtennq4DLpzfkGQDcBXwQuAc4LIk5yR5epKPLfj5MeBs4DNV9Xrg1R3XK6knrrwSNm58ZNvGjU27Vlenp56q6tYkMwuanw3cU1X3AiT5IHBJVb0VuGjheyQ5Ajw02PzeUp+VZDewG2Cz/+WQ1rzZ2ebXXbuaAe0tW5qQmGvX6pnEGMUZwFfmbR8BfqZl/xuBdyd5HnDrUjtV1R5gD8C2bdtqDHVKmrDZWbj66ubx/v0TLWVdGyookvxj4J8CDwKHq+r7J/CZWaRtyX/Yq+oYsOsEPk/SOjR3D8bx4809GPZGVm7JoEiyCXgNcBlwMvBN4DHAP0lyG/DeqvrUCj7zCHDmvO0nAl9dwftI0qKWugcDDIuVaBvM/hDNKaLnVdXZVXVBVW2rqjOB3wYuSbKS/+nfDjw5yZOSnAxcCty0gveRpEV5D8Z4LdmjqKoXtDx3CDi03Jsn+QCwHTh1MCj95qp6X5LXArcAG4BrququUQuXtD6sZGzCezDGa9kxiiQfBq4BPj7q2ERVXbZE+83AzaO81zCS7AB2bN26ddxvLWkN2by5Od20WLtGN8x9FL8P/ArwpSS/neQpHde0YlW1r6p2b9q0adKlSJog78EYr2WDoqr+a1XNAucBh4G/SPLpJDuTPLrrAiVpVLOzsGcPnHJKs71lS7PtQPbKDHt57BOAlwIvA/4HsBe4AHg5zRiEJPWK92CMzzBjFDcCTwFuAHZU1dcGT/1JkoNdFidJmrxhehTvqapPLvZEVW0bcz1ah+YWlvF/fVI/td1w96LFHg8cB+6tqi92VdhKeNWTJI1fW49ixzKve2qST1fV68Zc04pV1T5g37Zt21456VokaVq03XC3s+2FgwWFvjD2iiRJvTLMYPaPAL8KzMzfv6pel+T53ZUmSeqDYQazbwZuo+k9POLO7HlXQEmSptQwQfGYwepykrSmeCXdeAwzhccNSV6Z5PQkPzr303llkqReGKZH8RDwO8Dl/GCBoQLO6qooSVJ/DBMUrwe2VtW3ui7mRHkfhSSN3zCnnu4Cji27Vw84e+zaM7dc5YEDzXKVe/dOuiJJCw3To/ge8Lkkn6K5IxtoLo/trCqtCy5XKa0Nqar2HZKXL9ZeVdd3UtEYbNu2rQ4edL7CvpuZWXxxmS1b4PDh1a5GUpJDi83ht2yPos+BoLXN5SqltWHJMYok+5LsWGxxoiRnJfn3SV7RbXmaZkstS+lylVK/tA1mvxJ4HvA3SW5PcnOSTyb5MvCHwKGqumZVqtRUcrlKaW1omxTw68AbgDckmQFOBx4E/mdVrYmroNRvcwPWu3Y1A9pbtjQh4UC21C9DLYVaVYdp1svuNe+jWHtcrlLqv2Huo1gzvI9CksZvqoJCkjR+ywZFkosGixRJktahYQLgUuBLSd6e5KldFyRJ6pdlg6KqXgqcC/wv4Nokn0myO8njOq9OkjRxQ51SqqpvAx8GPkhzmewvA3ck+fUOa5Mk9cAwYxQXJ/kI8Eng0cCzq+qFwDOAf9txfZKkCRvmPooXA79XVbfOb6yqY07hoXHw/gmp34Y59fS1hSGR5G0AVfWJTqqSJPXGMEHxgkXaXjjuQsZhMInhnqNHj066FEmaGm2zx746yReApyT5/LyfLwOfX70Sh+ed2ZI0fm1jFH8MfBx4K/DGee3fqaq/67QqSVJvtAVFVdXhJK9Z+ESSHzUsJGl9WK5HcRFwCCgg854r4KwO65Ik9UTbehQXDX590uqVI0nqm2FuuHtukn80ePzSJO9I4mKVkrRODHN57O8Dx5I8g2bFu/uAGzqtSpLUG8MExXerqoBLgHdW1TsBJwSUpHVimCk8vpPkTcBLgZ9LsoFmzidJ0jowTI/iJcBxYFdVfR04A/idTquSJPXGsj2KQTi8Y972/cD7uyxKktQfw1z19KIkX0pyNMm3k3wnybdXo7hROdeTJI3fMKee3g5cXFWbqurxVfW4qnp814WthHM9SdL4DRMU36iqL3ZeiSSpl4a56ulgkj8BPkozqA1AVd3YWVWSpN4YJigeDxwDfmFeWwEGhSStA8Nc9bRzNQqRJPXTMFc9/WSSTyS5c7D9U0l+s/vSJEl9MMxg9tXAm4CHAarq88ClXRYlSeqPYYJiY1V9dkHbd7soRpLUP8MExbeS/ATNADZJXgx8rdOqJEm9McxVT68B9gBPSfK3wJdpJgiUJK0Dw1z1dC/w/MHiRSdV1Xe6L0uS1BdLBkWS1y/RDkBVvWOx5yVpPdi+vfl1//5JVrE62noUc4sTnQ08C7hpsL0DuLXLoiRJ/bFkUFTVbwEk+XPgvLlTTkneAvynValOkjRxw1z1tBl4aN72Q8BMJ9VIknpnmKuebgA+m+QjNJfI/jJwfadVrVCSHcCOrVu3TroUSZoay/YoqupKYCfwf4C/B3ZW1Vu7LmwlXI9i/LZv/8GgnaT1aZgeBVV1B3BHx7VIknpomDEKSdI6ZlBIkloNM834OYu0be+kGklS7wzTo/jTJP8ujccmeTfQy8FsSdL4DRMUPwOcCXwauB34KvDcLouSJPXHMEHxMPAg8FjgMcCXq+r7nVYlSeqNYYLidpqgeBZwAXBZkg91WpUkqTeGuY9iV1UdHDz+OnBJkpd1WJMkaURdzmY7TFA8kGTzgrYD4y9FktRHwwTFf6GZ4yk0YxRPAu4GntZhXZK0bvVtrYthVrh7+vztJOcB/7qziiRJvTLyndmDeZ+e1UEtkqQeWrZHsWBJ1JOA84BvdlaRJKlXhulRPG7ezyk0YxaXdFmUJPXZ3r1w221w4ADMzDTb02yYMYrfWo1C1D9zX4bjx5svw5VXwuzspKuSJmvvXti9u/leANx3X7MN0/v9WDIokuyjudppUVV1cScVqRfW45dBGsbll8OxY49sO3asaZ/W70Zbj+J3V60K9c56/DJIw7j//tHap0FbUHy5qqb4t6426/HLIA1j8+amh71Y+7RqG8z+6NyDJB9ehVrUI0v9pZ/mL4M0jCuvhI0bH9m2cWPTPildD663BUXmPT5rvB/bjSQ7kuw5evTopEtZ8/r4ZZD6YHYW9uyBU05ptrdsabYndUp2qfHEcYZFW1DUEo97q6r2VdXuTZs2TbqUNa9vXwapT2Zn4Wd/Fn7+5+Hw4cl+L9rGE8elbYziGUm+TdOzeOzgMYPtqqrHj68M9dHsLFx9dfO4L3POSGtVV/M3rcZ44pJBUVUbxvcxkqQurMbg+shzPUmS+mM1xhMNCklaw1ZjPHGY9SgkST3W9XiiPQpJUiuDQpLUyqCQJLUyKCRJrQwKSeqRPi6KZFBIUk+sxrxNK2FQSFJPrMa8TSthUEhST/R1HRiDQpJ6oq/rwBgUktQTfV0HxqAAzj0Xkh/+OffcSVcmaT3p6zowzvUEPOc58Nd/DQ899IO2k0+G88+fXE2S1qc+rgNjjwK44go4acGfxIYNTbskrXcGBXD66bBzZ9OLgObXnTvhx398snVJUh946mngiivg2mubx/YmJC2nL6eF5nRZjz2KgblexUkn2ZuQpPkMinmuuAIuuMDehKTx6uP8TaPw1NM8p5/eHEhJGpel5m+CyV/2Oix7FJLUob7O3zQKg0KSOtTX+ZtGYVBIUof6On/TKAwKtdq/v3+XAUprSV/nbxqFQSFJHerr/E2j8KonSepYH+dvGoU9CklSK4NCktTKoJAktTIoJEmtej+YneR5wCxNredUlcsJSdIq6rRHkeSaJA8kuXNB+4VJ7k5yT5I3tr1HVf1lVb0K+BhwfZf1SpJ+WNc9iuuA9wDvn2tIsgG4CngBcAS4PclNwAbgrQte/4qqemDw+FeAX+u4XknSAp0GRVXdmmRmQfOzgXuq6l6AJB8ELqmqtwIXLfY+STYDR6vq20t9VpLdwG6AzWvp3nhJ6rlJDGafAXxl3vaRQVubXcC1bTtU1Z6q2lZV20477bQTLFGSNGcSg9lZpK3aXlBVb+6oFknSMibRozgCnDlv+4nAVydQhyRpCJMIituBJyd5UpKTgUuBmyZQhyRpCJ2eekryAWA7cGqSI8Cbq+p9SV4L3EJzpdM1VXVXl3VI0lrSt4kDu77q6bIl2m8Gbh735yXZAezYunXruN9aktatqZrCo6r2VdXuTZs2TboUSZoaUxUUkqTxMygkSa0MCklSK4NCktRqqoIiyY4ke44ePTrpUiRpakxVUHjVkySN31QFhSRp/AwKSVIrg0KS1MqgkCS1msR6FJK07vRtor9R2KOQJLWaqqDwPgpJGr+pCgrvo5Ck8ZuqoJAkjZ9BIUlqZVBIkloZFJKkVgaFJKmVQSFJapWqmnQNY5fkm8B9Q+6+CRjXjRcrfa9RXjfMvm37LPXcKO2nAt9apoaujfO4ncj7Dfu6Ez1ubc977EZ/vz5855Z6bpLHbUtVnfZDrVW1rn+APZN+r1FeN8y+bfss9dwo7cDBaTpuq3HsTvS4eezG+359+M61HKPeHTdPPcG+HrzXKK8bZt+2fZZ6btT2SRt3XV0fuxM9bm3Pe+y6fU1X37mlnuvdcZvKU0/qVpKDVbVt0nVodB67tWnSx80ehVZiz6QL0Ip57NamiR43exSSpFb2KCRJrQwKSVIrg0KS1Mqg0AlLclaS9yX50KRr0fCS/FKSq5P85yS/MOl6NLwkT03yB0k+lOTVXX+eQaFFJbkmyQNJ7lzQfmGSu5Pck+SNAFV1b1Xtmkylmm/E4/bRqnol8K+Al0ygXM0z4rH7YlW9CviXQOeXzRoUWsp1wIXzG5JsAK4CXgicA1yW5JzVL00trmP04/abg+c1WdcxwrFLcjHw34BPdF2YQaFFVdWtwN8taH42cM+gB/EQ8EHgklUvTksa5bil8Tbg41V1x2rXqkca9TtXVTdV1fnAbNe1GRQaxRnAV+ZtHwHOSPKEJH8AnJvkTZMpTS0WPW7ArwPPB16c5FWTKEzLWuo7tz3Ju5L8IXBz10U8qusP0FTJIm1VVf8b8B+a/lrquL0LeNdqF6ORLHXs9gP7V6sIexQaxRHgzHnbTwS+OqFaNDyP29rVi2NnUGgUtwNPTvKkJCcDlwI3TbgmLc/jtnb14tgZFFpUkg8AnwHOTnIkya6q+i7wWuAW4IvAn1bVXZOsU4/kcVu7+nzsnBRQktTKHoUkqZVBIUlqZVBIkloZFJKkVgaFJKmVQSFJamVQaN0azFH1ucHP15P87eDxPyR5b0ef+RtJfnWR9pmF00uf4OecnOTWJE7ToxPmXyKtW4M5qp4JkOQtwD9U1e929XmDf7RfAZzX1WfMqaqHknyCZp2JvV1/nqabPQppgcHMnB8bPH5LkuuT/HmSw0lelOTtSb6Q5M+SPHqw308nOZDkUJJbkpy+yFv/C+COwd22c6/5qySfAV4z7/NnkvxlkjsGP+cP2m9Icsm8/fYmuTjJ05J8dtAb+nySJw92+SirMAW1pp9BIS3vJ4BfpFkH4I+AT1XV04EHgV8chMW7gRdX1U8D1wBXLvI+zwUOzdu+FnhdVT1nwX4PAC+oqvNoegRzM7z+R2AnQJJNwPk0U0y/CnhnVT2TZrWzI4P97wSetdLftDTHU0/S8j5eVQ8n+QKwAfizQfsXgBngbOCfAX+RhME+X1vkfU6nma9n7h/6H6mqA4PnbqBZxQzg0cB7kjwT+B7wkwBVdSDJVUl+DHgR8OGq+u6gR3J5kicCN1bVlwb7fy/JQ0keV1XfGdcfhtYfg0Ja3nGAqvp+kofrBxOkfZ/mOxTgrkV6Bgs9CDxm8DjAUhOt/RvgG8AzaHr9/2/eczfQnE66lGa8g6r64yT/nabXc0uSX6uqTw72P2XB66WReepJOnF3A6cleQ5Akkcnedoi+30R2ApQVX8PHE1yweC5+WMJm4CvVdX3gZfR9FDmXAf8xuA97hp83lnAvYOFiG4CfmrQ/gTgm1X18Dh+k1q/DArpBA3WMn4x8LYkfwV8jmb8YKGPAz83b3sncNXg1NGD89rfC7w8yW00p53+77zP+gZN4Fw7b/+XAHcm+RzwFOD9g/Z/ziosk6np5zTj0ipK8hHgDXPjCCt4/UaasZHzquroMvveCLypqu5eyWdJc+xRSKvrjTSD2iNL8nzgb4B3DxESJwMfNSQ0DvYoJEmt7FFIkloZFJKkVgaFJKmVQSFJamVQSJJaGRSSpFb/H3U9wQHxct88AAAAAElFTkSuQmCC\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import astropy\n", + "import astropy.io.ascii as ascii\n", + "\n", + "data = ascii.read('GW170817_data.txt')\n", + "\n", + "# split out the X-ray light curve\n", + "xrays = data[data['Freq_Hz'] == 2.42E+17]\n", + "xray_dets = xrays[xrays['Det_Nondet']==1]\n", + "\n", + "plt.figure()\n", + "plt.errorbar(xray_dets['Time_sec']/(3600*24),xray_dets['Flux_mJy'],yerr=[-1*xray_dets['FluxErrN_mJy'],xray_dets['FluxErrP_mJy']],fmt='bo')\n", + "plt.plot(xrays['Time_sec'][0]/(3600*24),xrays['Flux_mJy'][0],'bv')\n", + "plt.xscale('log')\n", + "plt.yscale('log')\n", + "plt.xlabel('Time (days)')\n", + "plt.ylabel('Flux density (mJy)')" + ] + }, + { + "cell_type": "markdown", + "id": "6793eda7-7f97-49c7-86d1-a2e396a58101", + "metadata": {}, + "source": [ + "Note that the X-ray observation we reduced earlier was taken $\\sim160$ days after GW170817 was discovered, so it is near the peak of this light curve!\n", + "\n", + "Now, see if you can create a similar plot showing the radio light curve at 3 GHz. Note that the radio data have symmetric errors (unlike the X-ray data above), so the plotting command should only use the errors in the FluxErrP_mJy column of the data file." + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "83499873-36cc-4f23-af31-07a5257211f3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Flux density (mJy)')" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Students to fill this in. Example solution:\n", + "radio_3GHz = data[data['Freq_Hz'] == 3.0E+9]\n", + "\n", + "det_3GHz = radio_3GHz[radio_3GHz['Det_Nondet']==1]\n", + "ndet_3GHz = radio_3GHz[radio_3GHz['Det_Nondet']==0]\n", + "\n", + "plt.figure()\n", + "plt.errorbar(det_3GHz['Time_sec']/(3600*24),det_3GHz['Flux_mJy'],yerr=det_3GHz['FluxErrP_mJy'],fmt='ro') \n", + "plt.loglog(ndet_3GHz['Time_sec']/(3600*24),ndet_3GHz['Flux_mJy'],'rv')\n", + "plt.xlabel('Time (days)')\n", + "plt.ylabel('Flux density (mJy)')" + ] + }, + { + "cell_type": "markdown", + "id": "c8526724-ca04-4cbc-b51d-a688d62029c2", + "metadata": {}, + "source": [ + "Note that both light curves have the same simple shape: the flux density can be described as a broken power law in time, rising to a peak around 200 days post-discovery and then rapidly declining. This behavior is characteristic of __synchrotron radiation__ (see e.g. Granot & Sari 2002). When two neutron stars collide, a jet of material is launched at high speed by the merger. As this jet slams into the external medium, a shock is created, enhancing magnetic fields and accelerating electrons into a power-law distribution of energies, $N(E) \\propto E^{-p}$. The observed value of $p$ tests our understanding of particle acceleration in shocks. Other important parameters that can be determined by fitting a synchrotron emission model to the observations include the jet energy, the density of the ambient medium, and the fractions of energy carried by electrons and by magnetic fields. For an on-axis observer (i.e. an observer looking straight down the jet), this problem can be solved analytically. For an off-axis observer, the geometry is more complicated (this is the situation for GW170817). Relativistically-moving material is initially Doppler beamed away from the observer, so the jet initially appears much fainter than it would on-axis. As the jet decelerates, the relativistic beaming effect reduces and the jet becomes brighter. While a complete understanding requires numerical simulations, we can nevertheless obtain some key insights from some basic analytic calculations.\n", + "\n", + "We will use the 3 GHz radio light curve for our model fitting, as it is the best-sampled. Fit a broken power law to the dataset you plotted above." + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "id": "3d2bfda7-5f96-4152-a9b6-a2011d269247", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Parameter('alpha_1', value=-0.8807742597263386) Parameter('alpha_2', value=2.6463327640620853)\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# Students to fill this in. Sample answer:\n", + "from astropy.modeling import models, fitting\n", + "\n", + "bpl = models.SmoothlyBrokenPowerLaw1D()\n", + "fit = fitting.LevMarLSQFitter()\n", + "\n", + "bpl_fit = fit(bpl,det_3GHz['Time_sec']/(3600*24),det_3GHz['Flux_mJy'])\n", + "\n", + "x=np.arange(1,1000,1)\n", + "\n", + "plt.figure()\n", + "plt.errorbar(det_3GHz['Time_sec']/(3600*24),det_3GHz['Flux_mJy'],yerr=det_3GHz['FluxErrP_mJy'],fmt='ro') \n", + "plt.loglog(ndet_3GHz['Time_sec']/(3600*24),ndet_3GHz['Flux_mJy'],'rv')\n", + "plt.loglog(x,bpl_fit(x),'k-')\n", + "plt.xlabel('Time (days)')\n", + "plt.ylabel('Flux density (mJy)')\n", + "\n", + "print(bpl_fit.alpha_1, bpl_fit.alpha_2) # careful of negative signs: SmoothlyBrokenPowerLaw1D defines alpha1 as F~t^-alpha1" + ] + }, + { + "cell_type": "markdown", + "id": "21b2b672-0084-47e4-acb6-b846806888e9", + "metadata": {}, + "source": [ + "Before the time of peak flux, the light curve from a __uniform__ or __top-hat jet__ (i.e. a narrow cone of relativistic material all moving exactly the same speed with sharp edges) is expected to rise as $\\sim t^3$ (Granot et al. 2002). How does this compare to the value you found? Why do you think this is?\n", + "\n", + "(Answer: The students should have found a much shallower rise ($\\sim t^{-0.9}$). This is because GW170817's jet is not uniform, but instead has some angular structure; an ultra-relativistic core is surrounded by slower-moving material. This slower moving material comes into an off-axis observer's line of sight first, so the light curve appears to rise more slowly.)\n", + "\n", + "After the time of peak flux, the light curve is expected to decline as $\\sim t^{-p}$. Based on your fit, what is $p$ for GW170817? How does the value from your fit compare to the theoretically expected value derived from numerical simulations ($p\\approx2.2$)?" + ] + }, + { + "cell_type": "markdown", + "id": "f94d029a-36e6-4348-8f61-8e1c968489b8", + "metadata": {}, + "source": [ + "## 2) Further synchrotron modeling with JetFit (optional)\n", + "\n", + "The simple analytic calculations we completed above are useful, but numerical simulations of relativistic jets can provide additional insights (into e.g. the jet structure). One easy-to-use code is JetFit (Wu & MacFadyen 2018). JetFit can be downloaded here: https://github.com/NYU-CAL/JetFit. Their Example_Fitter.py file applies the code to a subset of the GW170817 dataset that we looked at above. Try playing around with the code, to see the effect of varying different model parameters. Can you try updating the fits in Wu & MacFadyen (2018) using the more complete dataset we provided?\n", + "\n", + "## 3) Continued X-ray data analysis (optional)\n", + "\n", + "In the hands-on session, we learned how to extract an X-ray count rate from Chandra data. Here, you may choose to explore another tutorial that explains how to convert this count rate to an X-ray flux that can be used for science. This exercise will use observations of a nearby supernova, SN 2014C, which was bright in X-rays. The instructions for this tutorial can be found in the pdf included in this folder.\n", + "\n", + "Note: you will need to install the xspec software. Instructions for doing so are here: https://heasarc.gsfc.nasa.gov/lheasoft/" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d241f29-b212-4f53-b2f0-e89489f66566", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.7.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/courses/course-for-prof-margutti/Xspec_tutorial.pdf b/courses/course-for-prof-margutti/Xspec_tutorial.pdf new file mode 100644 index 0000000000000000000000000000000000000000..45cc811d461dfc5de4df80bfb4d2ab90a6c4a459 Binary files /dev/null and b/courses/course-for-prof-margutti/Xspec_tutorial.pdf differ diff --git a/courses/course-for-prof-margutti/fig1.png b/courses/course-for-prof-margutti/fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..4affc67a5e25f84bd7e861fbd9572243bf052c5d Binary files /dev/null and b/courses/course-for-prof-margutti/fig1.png differ diff --git a/courses/course-for-prof-margutti/fig2.png b/courses/course-for-prof-margutti/fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..78a21d92c23cc0e5dffd707b03a279a9f4b0b45f Binary files /dev/null and b/courses/course-for-prof-margutti/fig2.png differ diff --git a/courses/course-for-prof-margutti/fig3.png b/courses/course-for-prof-margutti/fig3.png new file mode 100644 index 0000000000000000000000000000000000000000..cf839932bfbc1f29a2ebc98d146a80dcb47e90c3 Binary files /dev/null and b/courses/course-for-prof-margutti/fig3.png differ diff --git a/courses/course-for-prof-margutti/fig4.png b/courses/course-for-prof-margutti/fig4.png new file mode 100644 index 0000000000000000000000000000000000000000..20383df8500e335a11d264cc17c603141db9d141 Binary files /dev/null and b/courses/course-for-prof-margutti/fig4.png differ diff --git a/courses/course-for-prof-margutti/package_7697_220112160139.tar b/courses/course-for-prof-margutti/package_7697_220112160139.tar new file mode 100644 index 0000000000000000000000000000000000000000..b8b19db2badbace87fc63d7b9b0a5a7a8cea2152 --- /dev/null +++ b/courses/course-for-prof-margutti/package_7697_220112160139.tar @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47d802e28f5271fe9f93d0735dc5d144f6ee55357df2158d8cee92f523c08718 +size 350750720 diff --git a/courses/course-for-prof-ramirez-ruiz/MOSFit_notes_SaasFee.pdf b/courses/course-for-prof-ramirez-ruiz/MOSFit_notes_SaasFee.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1e78132ec1aa5206f990580bfc33b4c8204ef317 Binary files /dev/null and b/courses/course-for-prof-ramirez-ruiz/MOSFit_notes_SaasFee.pdf differ diff --git a/courses/course-for-prof-ramirez-ruiz/kilonova_notes_SaasFee.pdf b/courses/course-for-prof-ramirez-ruiz/kilonova_notes_SaasFee.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b10305a22463de384cc74a569783db4c488c2f15 Binary files /dev/null and b/courses/course-for-prof-ramirez-ruiz/kilonova_notes_SaasFee.pdf differ diff --git a/data/COMPAS_Output_reduced.h5 b/data/COMPAS_Output_reduced.h5 new file mode 100644 index 0000000000000000000000000000000000000000..acf2a2012eb421d17dbdf4acc8d5de2716a735e2 --- /dev/null +++ b/data/COMPAS_Output_reduced.h5 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:354f65ccfb3d2cbd7efb5df98620318c94b95bd313909d4fcfe5169db8ee211d +size 1838207477 diff --git a/data/COMPAS_Output_reduced.h5Rate_Infomu00.035_muz-0.23_alpha0.0_sigma00.39_sigmaz0.0.png b/data/COMPAS_Output_reduced.h5Rate_Infomu00.035_muz-0.23_alpha0.0_sigma00.39_sigmaz0.0.png new file mode 100644 index 0000000000000000000000000000000000000000..0cca419fb968c01fc39a74678f0eb7b876671178 Binary files /dev/null and b/data/COMPAS_Output_reduced.h5Rate_Infomu00.035_muz-0.23_alpha0.0_sigma00.39_sigmaz0.0.png differ diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_0.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_0.ini new file mode 100644 index 0000000000000000000000000000000000000000..4340ec50ecb48ffa9f1071b55507c7740d927f84 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_0.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.6811785902964322 + mass2 = 1.6306555668298208 + lambda1 = 181.5280193084202 + lambda2 = 219.7189970874733 + spin1z = 0.013486245973646088 + spin2z = -0.04063198666149657 + ra = 3.44 + dec = -0.41 + inclination = 1.3586108703958337 + polarization = 0. + distance = 79.1924283630726 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_1.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_1.ini new file mode 100644 index 0000000000000000000000000000000000000000..d0f99a1ce8ca8a4609b8f8f384aa8c403ade9dd3 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_1.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.545749104873916 + mass2 = 1.4788372238363814 + lambda1 = 298.5209058955483 + lambda2 = 387.52537627847585 + spin1z = -0.023285084660031687 + spin2z = 0.0316779615410379 + ra = 3.44 + dec = -0.41 + inclination = 1.9993814070094926 + polarization = 0. + distance = 65.18558037686617 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_10.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_10.ini new file mode 100644 index 0000000000000000000000000000000000000000..1d8a5caa80b10d82cb920faaeb70641e7298b2a8 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_10.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 2.0393084191146023 + mass2 = 1.4863608816214149 + lambda1 = 48.35690391084675 + lambda2 = 392.1418052562691 + spin1z = -0.018384005852151997 + spin2z = 0.007927096604537068 + ra = 3.44 + dec = -0.41 + inclination = 1.9512871474786713 + polarization = 0. + distance = 98.3292439969532 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_11.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_11.ini new file mode 100644 index 0000000000000000000000000000000000000000..e1514c347b5b1fefc29d322c71e0c297e55a9014 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_11.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 2.079491783693446 + mass2 = 1.462441313499426 + lambda1 = 40.817836197078165 + lambda2 = 427.2905823574821 + spin1z = -0.011294474228891481 + spin2z = -0.0003836561257434118 + ra = 3.44 + dec = -0.41 + inclination = 2.322243226816636 + polarization = 0. + distance = 91.738093446958 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_12.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_12.ini new file mode 100644 index 0000000000000000000000000000000000000000..2850a2b67152555c8dbaffce43af4bd92b9247c0 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_12.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.529745500842825 + mass2 = 1.6068954042010957 + lambda1 = 0.0 + lambda2 = 243.88882017070702 + spin1z = 0.17349423572274558 + ra = 3.44 + dec = -0.41 + inclination = 1.27390613879876 + polarization = 0. + distance = 89.86704579503304 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_13.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_13.ini new file mode 100644 index 0000000000000000000000000000000000000000..139ddadb09b039eb9560b34325d8f2fac26e0046 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_13.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 6.850425657659692 + mass2 = 1.6771663271157655 + lambda1 = 0.0 + lambda2 = 198.21159721472634 + spin1z = 0.34390191503560374 + ra = 3.44 + dec = -0.41 + inclination = 0.9714034680734861 + polarization = 0. + distance = 133.559562704315 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_14.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_14.ini new file mode 100644 index 0000000000000000000000000000000000000000..7f639c99eb75e73679202bdcc48c90b84f2a0e67 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_14.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.7116857132263257 + mass2 = 1.6636548930428035 + lambda1 = 161.26801641017187 + lambda2 = 193.23964197190608 + spin1z = -0.0018347483899027878 + spin2z = 0.038941726621392544 + ra = 3.44 + dec = -0.41 + inclination = 2.595422832370046 + polarization = 0. + distance = 76.4083180400251 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_15.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_15.ini new file mode 100644 index 0000000000000000000000000000000000000000..9f515848e570517960bcf5be51083a7d52f9e67f --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_15.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.6853402532158201 + mass2 = 1.0863102694582645 + lambda1 = 178.86087677159225 + lambda2 = 2105.587501847456 + spin1z = 0.02223501450028434 + spin2z = 0.0070583705772697125 + ra = 3.44 + dec = -0.41 + inclination = 0.8311210638628205 + polarization = 0. + distance = 79.94849042123404 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_16.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_16.ini new file mode 100644 index 0000000000000000000000000000000000000000..b1b5f53796d45a3d9dc868bceee464797cebfa41 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_16.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 6.8859064535632895 + mass2 = 1.4809664843388861 + lambda1 = 0.0 + lambda2 = 379.1965023391518 + spin1z = -0.06189297933699367 + ra = 3.44 + dec = -0.41 + inclination = 1.249234752906218 + polarization = 0. + distance = 54.651126808701 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_17.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_17.ini new file mode 100644 index 0000000000000000000000000000000000000000..a3529e7e5ca0e86017db8bb26ff4df95c6e04ec2 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_17.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.215433586091219 + mass2 = 1.1920474209941352 + lambda1 = 0.0 + lambda2 = 1365.447472064727 + spin1z = -0.49639687335494875 + ra = 3.44 + dec = -0.41 + inclination = 1.7255242875464396 + polarization = 0. + distance = 123.7221397657056 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_18.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_18.ini new file mode 100644 index 0000000000000000000000000000000000000000..926e54e77c612c03b56208120a3be8db2c95be55 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_18.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.5805406791420447 + mass2 = 1.539668839799361 + lambda1 = 250.0796660693987 + lambda2 = 292.97439456893096 + spin1z = -0.041158281683005685 + spin2z = 0.01961555193502773 + ra = 3.44 + dec = -0.41 + inclination = 1.6985293510689137 + polarization = 0. + distance = 32.95188258191227 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_19.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_19.ini new file mode 100644 index 0000000000000000000000000000000000000000..c94921cecdb2a6cb6a9b154085676b40a021e268 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_19.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 4.54068795161642 + mass2 = 1.6190208307941751 + lambda1 = 0.0 + lambda2 = 242.0704449874264 + spin1z = 0.23890837954856936 + ra = 3.44 + dec = -0.41 + inclination = 1.0928098374428865 + polarization = 0. + distance = 119.41791270894876 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_2.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_2.ini new file mode 100644 index 0000000000000000000000000000000000000000..a9b31143845e8c3f2f30a54920d0d91413dc85ec --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_2.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 7.828139913531147 + mass2 = 1.7238717231923233 + lambda1 = 0.0 + lambda2 = 155.2260187375347 + spin1z = -0.13930979825830536 + ra = 3.44 + dec = -0.41 + inclination = 1.5231794414242752 + polarization = 0. + distance = 81.3000356871235 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_20.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_20.ini new file mode 100644 index 0000000000000000000000000000000000000000..073e08b7e0edb9554b26d16e9c1553f230b7d673 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_20.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.6811446542724986 + mass2 = 1.5978453442879998 + lambda1 = 185.20614001955354 + lambda2 = 253.59258199658225 + spin1z = -0.022356379434010067 + spin2z = -0.0406243346143009 + ra = 3.44 + dec = -0.41 + inclination = 2.1833937281697535 + polarization = 0. + distance = 93.52078926084148 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_21.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_21.ini new file mode 100644 index 0000000000000000000000000000000000000000..37ac066f6559597808e340c1a1878627f72faa5a --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_21.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 6.103237375071991 + mass2 = 1.383858824978658 + lambda1 = 0.0 + lambda2 = 622.5464747357084 + spin1z = -0.01837353352893545 + ra = 3.44 + dec = -0.41 + inclination = 1.6466421396733415 + polarization = 0. + distance = 143.89524991723297 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_22.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_22.ini new file mode 100644 index 0000000000000000000000000000000000000000..24cb1c9981be88cd73307f689bbc5bbaaf5e80a1 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_22.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.5791225932620294 + mass2 = 1.5681284036951486 + lambda1 = 273.5988969320849 + lambda2 = 285.41275927046917 + spin1z = 0.00982770538239991 + spin2z = -0.025172142653464735 + ra = 3.44 + dec = -0.41 + inclination = 2.600298483753749 + polarization = 0. + distance = 97.07523899919829 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_23.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_23.ini new file mode 100644 index 0000000000000000000000000000000000000000..a7a1908280ba095770a4aad221d14cb4541bea50 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_23.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.9061453722641988 + mass2 = 1.584830372665742 + lambda1 = 79.60245914176524 + lambda2 = 265.7019023812053 + spin1z = 0.026199065857296158 + spin2z = 0.0297743360765078 + ra = 3.44 + dec = -0.41 + inclination = 1.299821179179825 + polarization = 0. + distance = 91.075327830463 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_24.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_24.ini new file mode 100644 index 0000000000000000000000000000000000000000..6021313686cf26e74a7679199aaf6e73a92c13e9 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_24.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 7.984901468488201 + mass2 = 1.4194880274261217 + lambda1 = 0.0 + lambda2 = 536.1538270146498 + spin1z = 0.11391636052865994 + ra = 3.44 + dec = -0.41 + inclination = 1.41172846619747 + polarization = 0. + distance = 138.0780532994942 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_25.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_25.ini new file mode 100644 index 0000000000000000000000000000000000000000..d22b500fadb2b85920b8d3c091abfefbbdf75dd5 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_25.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.546640102065545 + mass2 = 1.68778143151967 + lambda1 = 0.0 + lambda2 = 193.47891949512686 + spin1z = 0.006829522506015873 + ra = 3.44 + dec = -0.41 + inclination = 1.0461595945369124 + polarization = 0. + distance = 145.04707818672452 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_26.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_26.ini new file mode 100644 index 0000000000000000000000000000000000000000..9df51a41a3a4212279ba439f4df7cc91079a5e77 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_26.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 8.157193311742464 + mass2 = 1.7701958334850856 + lambda1 = 0.0 + lambda2 = 140.76071456591907 + spin1z = 0.14097035292736337 + ra = 3.44 + dec = -0.41 + inclination = 1.5348042141484266 + polarization = 0. + distance = 135.42233415998382 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_27.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_27.ini new file mode 100644 index 0000000000000000000000000000000000000000..3a7ab40d34ff4dcfba74f72002ee774cd2a892ea --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_27.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 7.701962382908485 + mass2 = 1.5320042682349158 + lambda1 = 0.0 + lambda2 = 348.1216646891295 + spin1z = 0.058408712698278964 + ra = 3.44 + dec = -0.41 + inclination = 0.8283453386107674 + polarization = 0. + distance = 144.53475512017062 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_28.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_28.ini new file mode 100644 index 0000000000000000000000000000000000000000..78aaac921c56412c23dc7d10c257a230c8895812 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_28.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.602324101473903 + mass2 = 1.416203696264237 + lambda1 = 238.78096579713872 + lambda2 = 494.6365365142417 + spin1z = 0.045082495765366604 + spin2z = -0.045552945692662564 + ra = 3.44 + dec = -0.41 + inclination = 1.7733995230857271 + polarization = 0. + distance = 60.800337423508815 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_29.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_29.ini new file mode 100644 index 0000000000000000000000000000000000000000..15cc6bbc598714a895d18b17bab1566ae786ed0e --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_29.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 5.450841086463546 + mass2 = 0.9685802368954416 + lambda1 = 0.0 + lambda2 = 3889.6571749067 + spin1z = -0.1559516025895139 + ra = 3.44 + dec = -0.41 + inclination = 1.0512671984363573 + polarization = 0. + distance = 113.00025389288277 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_3.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_3.ini new file mode 100644 index 0000000000000000000000000000000000000000..0fd669fe43df37439f8aa2ca721f13a051c6ca64 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_3.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.6158685450934758 + mass2 = 1.3190948707085683 + lambda1 = 231.12274238331557 + lambda2 = 748.5254210635428 + spin1z = -0.01777466113858755 + spin2z = 0.03410052653805344 + ra = 3.44 + dec = -0.41 + inclination = 1.6550610226150515 + polarization = 0. + distance = 74.9609629963451 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_30.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_30.ini new file mode 100644 index 0000000000000000000000000000000000000000..ef71f538ec24666e0a95a306604aee4f131bfb00 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_30.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 3.671933539132414 + mass2 = 1.424404366315736 + lambda1 = 0.0 + lambda2 = 504.12113404871343 + spin1z = -0.15444078136042105 + ra = 3.44 + dec = -0.41 + inclination = 1.104131814827646 + polarization = 0. + distance = 103.10419091134938 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_31.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_31.ini new file mode 100644 index 0000000000000000000000000000000000000000..be15ddcf530354269adb6b113b34b5b566edbf00 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_31.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 8.486455757470523 + mass2 = 1.1612029508611177 + lambda1 = 0.0 + lambda2 = 1462.2962295346667 + spin1z = 0.4766297962068554 + ra = 3.44 + dec = -0.41 + inclination = 2.9725249424382922 + polarization = 0. + distance = 62.66922294598612 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_32.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_32.ini new file mode 100644 index 0000000000000000000000000000000000000000..95acceb93794c737b018fa24857b37b0b4520939 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_32.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.4415044016291956 + mass2 = 0.9739746841933209 + lambda1 = 454.11459737286486 + lambda2 = 3628.7620725065176 + spin1z = 0.03714374640310068 + spin2z = 0.02445110040952088 + ra = 3.44 + dec = -0.41 + inclination = 0.24762174163478923 + polarization = 0. + distance = 73.99156820275812 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_33.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_33.ini new file mode 100644 index 0000000000000000000000000000000000000000..94bab127dec1014d06cec461b25c481d02e1d012 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_33.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.035360979845285 + mass2 = 1.5053095754204442 + lambda1 = 0.0 + lambda2 = 359.39699720052494 + spin1z = 0.10777432761616534 + ra = 3.44 + dec = -0.41 + inclination = 2.1836814260852133 + polarization = 0. + distance = 87.12174772843916 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_34.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_34.ini new file mode 100644 index 0000000000000000000000000000000000000000..2632dfbc5ca1144a15e53580f50f1fb8924d6fd0 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_34.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.7502461691847293 + mass2 = 1.241600754637288 + lambda1 = 131.70736673129522 + lambda2 = 992.7265632340291 + spin1z = 0.04389309698005822 + spin2z = -0.028749413289732906 + ra = 3.44 + dec = -0.41 + inclination = 2.1937185977278615 + polarization = 0. + distance = 35.46981125677948 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_35.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_35.ini new file mode 100644 index 0000000000000000000000000000000000000000..a216a78875c64db6a06dd17c8748ed67e111f5ac --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_35.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.846875204523412 + mass2 = 1.386525927276015 + lambda1 = 0.0 + lambda2 = 593.3721552667696 + spin1z = 0.07633852429692245 + ra = 3.44 + dec = -0.41 + inclination = 2.076377823953123 + polarization = 0. + distance = 112.4461013843104 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_36.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_36.ini new file mode 100644 index 0000000000000000000000000000000000000000..7a08cab2bea87047913a0eb6d5e4bbd597f7cc53 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_36.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.5434781299125973 + mass2 = 1.260170364468657 + lambda1 = 312.8700624097838 + lambda2 = 982.6591822951649 + spin1z = 0.0496091626010582 + spin2z = -0.006775511922775111 + ra = 3.44 + dec = -0.41 + inclination = 0.9440509125806668 + polarization = 0. + distance = 94.78826278222046 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_37.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_37.ini new file mode 100644 index 0000000000000000000000000000000000000000..a6e5e913b21af6d8e587afed66f2755082ae9a3f --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_37.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.505032377936653 + mass2 = 2.2259545564001235 + lambda1 = 0.0 + lambda2 = 24.622095934198462 + spin1z = -0.07085422518572648 + ra = 3.44 + dec = -0.41 + inclination = 1.4725402903185218 + polarization = 0. + distance = 144.215876028712 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_38.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_38.ini new file mode 100644 index 0000000000000000000000000000000000000000..687fbc9996c2d50fac8840d481499154da323bf1 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_38.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.3889573484066906 + mass2 = 1.319040212966407 + lambda1 = 536.5392479953216 + lambda2 = 715.2895919283075 + spin1z = -0.02942879410529722 + spin2z = -0.018564021640302908 + ra = 3.44 + dec = -0.41 + inclination = 2.040890670866516 + polarization = 0. + distance = 37.66508674295339 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_39.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_39.ini new file mode 100644 index 0000000000000000000000000000000000000000..61d0bd84777fb606066bb274003dbc947888af15 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_39.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.583301377090298 + mass2 = 1.3027060808906883 + lambda1 = 259.88815418531505 + lambda2 = 796.8631187071971 + spin1z = -0.04216079275668651 + spin2z = -0.028111546009178468 + ra = 3.44 + dec = -0.41 + inclination = 1.4207405471269767 + polarization = 0. + distance = 70.25213379687177 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_4.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_4.ini new file mode 100644 index 0000000000000000000000000000000000000000..255bea324e0b4b6cc9230a06ba1e32bc911b4239 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_4.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.6691015385977115 + mass2 = 1.3970415183537264 + lambda1 = 194.70613187966342 + lambda2 = 558.1335542497965 + spin1z = 0.0359877309016607 + spin2z = 0.011977277198782922 + ra = 3.44 + dec = -0.41 + inclination = 1.5621198788437751 + polarization = 0. + distance = 97.22802851122687 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_40.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_40.ini new file mode 100644 index 0000000000000000000000000000000000000000..dea30b0d05fef4d0e7fb703b2750064abea6de69 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_40.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.175774822058283 + mass2 = 0.7689553525170704 + lambda1 = 1362.3233371184645 + lambda2 = 4204.9165090255065 + spin1z = 0.036284579049411694 + spin2z = -0.012783689265383667 + ra = 3.44 + dec = -0.41 + inclination = 1.2275379610839239 + polarization = 0. + distance = 57.726708533094346 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_41.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_41.ini new file mode 100644 index 0000000000000000000000000000000000000000..2fd45677d28f680baf066da7b7efe66695a56fe0 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_41.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.987646791084698 + mass2 = 1.450740575507886 + lambda1 = 0.0 + lambda2 = 447.1341159850326 + spin1z = 0.1312718893375252 + ra = 3.44 + dec = -0.41 + inclination = 1.9519615815247804 + polarization = 0. + distance = 90.9608395195195 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_42.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_42.ini new file mode 100644 index 0000000000000000000000000000000000000000..5a7b3f421e42f28370ba219f4360bbe24e1be392 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_42.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.5513698931479416 + mass2 = 1.1133795003985405 + lambda1 = 304.51571463587084 + lambda2 = 1893.3225818887959 + spin1z = -0.029682884945048428 + spin2z = -0.018124331437640064 + ra = 3.44 + dec = -0.41 + inclination = 0.6537004101041093 + polarization = 0. + distance = 97.52567946635517 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_43.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_43.ini new file mode 100644 index 0000000000000000000000000000000000000000..fdcef2b24ca3be38add9f3cf3fb209f718d475d7 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_43.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 7.981097439297093 + mass2 = 1.2283804834194871 + lambda1 = 0.0 + lambda2 = 1192.872183666713 + spin1z = 0.4699592988353264 + ra = 3.44 + dec = -0.41 + inclination = 2.646606708222772 + polarization = 0. + distance = 144.59211402589742 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_44.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_44.ini new file mode 100644 index 0000000000000000000000000000000000000000..9f53d9dfd9161b2bbfec3e460a0c5ebf92ee5a3b --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_44.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.8334924289898307 + mass2 = 1.0198022877150241 + lambda1 = 104.40923676452914 + lambda2 = 2933.799234056062 + spin1z = -0.01467526143919795 + spin2z = 0.0013923650478884012 + ra = 3.44 + dec = -0.41 + inclination = 1.6534942019437673 + polarization = 0. + distance = 90.11624042682844 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_45.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_45.ini new file mode 100644 index 0000000000000000000000000000000000000000..319aeee5130d9dd330a50c5fdf352b9b38609a61 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_45.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.377103721776821 + mass2 = 1.1728760169185062 + lambda1 = 597.0664138206753 + lambda2 = 1424.730687114493 + spin1z = -0.036167905188648736 + spin2z = 0.018987321800773546 + ra = 3.44 + dec = -0.41 + inclination = 1.0618506015355114 + polarization = 0. + distance = 85.74273952719815 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_46.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_46.ini new file mode 100644 index 0000000000000000000000000000000000000000..89f2d1b78c53ce215d0d82e714ecee34457f6e45 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_46.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.728812977781125 + mass2 = 1.3568352936040884 + lambda1 = 0.0 + lambda2 = 698.7296402638387 + spin1z = 0.09482898394908135 + ra = 3.44 + dec = -0.41 + inclination = 2.5642914981635583 + polarization = 0. + distance = 149.08847564737482 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_47.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_47.ini new file mode 100644 index 0000000000000000000000000000000000000000..0c227f0468ebafc1e114708c5663c67be9d28cae --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_47.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.7241636192969605 + mass2 = 1.1698881058400494 + lambda1 = 156.22239016948726 + lambda2 = 1445.513537941157 + spin1z = 0.041271455405868435 + spin2z = 0.04438170337903473 + ra = 3.44 + dec = -0.41 + inclination = 2.4672040901591923 + polarization = 0. + distance = 86.81233279944904 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_48.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_48.ini new file mode 100644 index 0000000000000000000000000000000000000000..57bce378fbc18081695d408dbf244d53f2012eca --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_48.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.3538793501780624 + mass2 = 1.2803658521330061 + lambda1 = 663.5894975222901 + lambda2 = 901.5906186644594 + spin1z = 0.047903471668637954 + spin2z = 0.002515502147154805 + ra = 3.44 + dec = -0.41 + inclination = 1.587941056556422 + polarization = 0. + distance = 94.68676492674248 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_49.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_49.ini new file mode 100644 index 0000000000000000000000000000000000000000..a92791f4095c6123d0fe17ddec30b49710693a41 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_49.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 5.275667579794763 + mass2 = 1.3129560927486783 + lambda1 = 0.0 + lambda2 = 789.6922279638422 + spin1z = 0.023380482203227193 + ra = 3.44 + dec = -0.41 + inclination = 1.283698279740665 + polarization = 0. + distance = 98.86800169977391 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_5.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_5.ini new file mode 100644 index 0000000000000000000000000000000000000000..546c5522766cc5668d96cf5c8c6aec130ec2d870 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_5.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.7104767442803643 + mass2 = 1.6557983629597295 + lambda1 = 158.0785406906371 + lambda2 = 194.34115625197964 + spin1z = 0.008581642228690234 + spin2z = -0.004062750725453555 + ra = 3.44 + dec = -0.41 + inclination = 0.8676030113780752 + polarization = 0. + distance = 58.84627913349551 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_50.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_50.ini new file mode 100644 index 0000000000000000000000000000000000000000..4af32675602aad80147a7d13a69558d69487927a --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_50.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.8024156019602962 + mass2 = 1.5236506755565355 + lambda1 = 117.09677562018794 + lambda2 = 335.43729209657795 + spin1z = -0.046114693645912655 + spin2z = 0.03153140894547757 + ra = 3.44 + dec = -0.41 + inclination = 1.8638369944811082 + polarization = 0. + distance = 89.4319960333353 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_51.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_51.ini new file mode 100644 index 0000000000000000000000000000000000000000..9c634997a37cde198c49ca6a97ce8d8dd1329760 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_51.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.8238246831364706 + mass2 = 1.1877758760297725 + lambda1 = 105.25030813164292 + lambda2 = 1311.1240931910418 + spin1z = 0.037289359098316946 + spin2z = -0.007950818033364657 + ra = 3.44 + dec = -0.41 + inclination = 1.756508990988336 + polarization = 0. + distance = 70.98220156685302 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_52.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_52.ini new file mode 100644 index 0000000000000000000000000000000000000000..7d62e7e5aa1d3192f641e29d4bf4483caac59f3e --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_52.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.8297611888103316 + mass2 = 1.342493251914305 + lambda1 = 104.33901895511806 + lambda2 = 683.633591293349 + spin1z = 0.0011992354344215056 + spin2z = 0.03803902972438947 + ra = 3.44 + dec = -0.41 + inclination = 1.3826458276472693 + polarization = 0. + distance = 80.21856869341886 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_53.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_53.ini new file mode 100644 index 0000000000000000000000000000000000000000..b1a94b6a4d8737fcfc2cb8724c11b113902abc0c --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_53.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.6822487868147797 + mass2 = 1.1239566293511434 + lambda1 = 180.2796623055271 + lambda2 = 1761.9566589178748 + spin1z = 0.029116838461332076 + spin2z = -0.016126417501706306 + ra = 3.44 + dec = -0.41 + inclination = 2.124014428710648 + polarization = 0. + distance = 77.23340239752649 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_54.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_54.ini new file mode 100644 index 0000000000000000000000000000000000000000..ca2ec9185ff056411cd4844a926ebc7071dc27a8 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_54.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 5.024272002357675 + mass2 = 1.5111850598635117 + lambda1 = 0.0 + lambda2 = 354.6825895205702 + spin1z = -0.4759569028551712 + ra = 3.44 + dec = -0.41 + inclination = 0.9006328269655952 + polarization = 0. + distance = 94.69773358309665 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_55.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_55.ini new file mode 100644 index 0000000000000000000000000000000000000000..78a5d66075435686b834eb2244e4cb97bcd53781 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_55.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.7881649499807857 + mass2 = 1.5947158181004177 + lambda1 = 124.75136924674004 + lambda2 = 257.5871872846821 + spin1z = 0.010490764219084923 + spin2z = 0.028342375019887497 + ra = 3.44 + dec = -0.41 + inclination = 1.2797520265531612 + polarization = 0. + distance = 96.69734713608578 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_56.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_56.ini new file mode 100644 index 0000000000000000000000000000000000000000..bea631d792a07c6a346eb401270ac63138427bfc --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_56.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.848662019560434 + mass2 = 0.6925983207373596 + lambda1 = 97.44162322393592 + lambda2 = 4204.9165090255065 + spin1z = -0.03330906906231629 + spin2z = 0.01991446807952614 + ra = 3.44 + dec = -0.41 + inclination = 0.8512323081030291 + polarization = 0. + distance = 81.72426595172797 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_57.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_57.ini new file mode 100644 index 0000000000000000000000000000000000000000..f1978761c271ae1553e8856b8e0c472506a2a76b --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_57.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.196335348634598 + mass2 = 1.3751294450764788 + lambda1 = 0.0 + lambda2 = 618.8011364708051 + spin1z = -0.2901821708942428 + ra = 3.44 + dec = -0.41 + inclination = 0.9003585313122857 + polarization = 0. + distance = 108.76994006903715 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_58.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_58.ini new file mode 100644 index 0000000000000000000000000000000000000000..2cae019d74303a561b59afe253fdf3e8dcec2002 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_58.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.75494299611157 + mass2 = 1.7097142755091486 + lambda1 = 139.71557818770643 + lambda2 = 165.5846679423678 + spin1z = -0.04508162479011303 + spin2z = 0.04984563346442304 + ra = 3.44 + dec = -0.41 + inclination = 2.441691730888638 + polarization = 0. + distance = 89.50411428922737 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_59.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_59.ini new file mode 100644 index 0000000000000000000000000000000000000000..6ddb156714d4e5cc07032e76f898c81ce8405a22 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_59.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 6.220738614156291 + mass2 = 1.934903100720504 + lambda1 = 0.0 + lambda2 = 73.59696905500094 + spin1z = -0.08652864971282626 + ra = 3.44 + dec = -0.41 + inclination = 1.3219080856746515 + polarization = 0. + distance = 110.29240957365276 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_6.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_6.ini new file mode 100644 index 0000000000000000000000000000000000000000..ea7649b2750f527937b1c6d0a1d4eb4e9ca57941 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_6.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 4.414740446514272 + mass2 = 1.67096920936322 + lambda1 = 0.0 + lambda2 = 204.06978084600087 + spin1z = -0.2413039235164427 + ra = 3.44 + dec = -0.41 + inclination = 0.2114693315013254 + polarization = 0. + distance = 138.06457423480197 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_7.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_7.ini new file mode 100644 index 0000000000000000000000000000000000000000..0311c1b2a7cebf1394e9e09674e5652366aca0c6 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_7.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 3.4928135521316364 + mass2 = 1.5015296044359905 + lambda1 = 0.0 + lambda2 = 366.22811376765287 + spin1z = 0.1003804748580196 + ra = 3.44 + dec = -0.41 + inclination = 0.5601604953156123 + polarization = 0. + distance = 90.64743907482632 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_8.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_8.ini new file mode 100644 index 0000000000000000000000000000000000000000..fe220e3b24f881b5f50b81f9dc38072074bdb775 --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_8.ini @@ -0,0 +1,20 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 1.5000884704125497 + mass2 = 1.1956658600491485 + lambda1 = 370.7735707387757 + lambda2 = 1302.9470537407358 + spin1z = -0.015503617482751884 + spin2z = 0.004109499243461642 + ra = 3.44 + dec = -0.41 + inclination = 0.2063745926262872 + polarization = 0. + distance = 96.23434446922347 + f_lower = 15. + approximant = IMRPhenomD_NRTidalv2 + taper = start + diff --git a/data/data-for-course-Nissanke/InjectionParameters/injection_9.ini b/data/data-for-course-Nissanke/InjectionParameters/injection_9.ini new file mode 100644 index 0000000000000000000000000000000000000000..4e6ccf3d7a223337b2aa70a8ed264ce220f576aa --- /dev/null +++ b/data/data-for-course-Nissanke/InjectionParameters/injection_9.ini @@ -0,0 +1,19 @@ + + [variable_params] + + [static_params] + tc = 1234567890.0 + mass1 = 9.893224503650835 + mass2 = 2.1681803361133865 + lambda1 = 0.0 + lambda2 = 31.327544692556483 + spin1z = -0.09980109369998202 + ra = 3.44 + dec = -0.41 + inclination = 1.6114586088855085 + polarization = 0. + distance = 143.43933041650016 + f_lower = 15. + approximant = IMRPhenomNSBH + taper = start + diff --git a/data/data-for-course-Nissanke/Injections/injection_0.hdf b/data/data-for-course-Nissanke/Injections/injection_0.hdf new file mode 100644 index 0000000000000000000000000000000000000000..ac729eb17a6c0ea172b2900e41446b27c068d36a Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_0.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_1.hdf b/data/data-for-course-Nissanke/Injections/injection_1.hdf new file mode 100644 index 0000000000000000000000000000000000000000..7f3ba31a5dc4ea2e1026e08b8788474f17fb5350 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_1.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_10.hdf b/data/data-for-course-Nissanke/Injections/injection_10.hdf new file mode 100644 index 0000000000000000000000000000000000000000..249215970b36efa2e74c25ce6816eabf6187c035 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_10.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_11.hdf b/data/data-for-course-Nissanke/Injections/injection_11.hdf new file mode 100644 index 0000000000000000000000000000000000000000..075a0ad094bb9fc31f5c0b4b152d22a485bb7993 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_11.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_12.hdf b/data/data-for-course-Nissanke/Injections/injection_12.hdf new file mode 100644 index 0000000000000000000000000000000000000000..dc275b5b0d1e1632694a8c088450e3d0e2768f6c Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_12.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_13.hdf b/data/data-for-course-Nissanke/Injections/injection_13.hdf new file mode 100644 index 0000000000000000000000000000000000000000..3e6b3762e27ffde75841bf05786133cae71d3b74 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_13.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_14.hdf b/data/data-for-course-Nissanke/Injections/injection_14.hdf new file mode 100644 index 0000000000000000000000000000000000000000..f0b76be8382dc7a92cf6ca18cdc97887cac492ac Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_14.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_15.hdf b/data/data-for-course-Nissanke/Injections/injection_15.hdf new file mode 100644 index 0000000000000000000000000000000000000000..02e20c7f11c36b0294656d746e2696ab4a8fa186 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_15.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_16.hdf b/data/data-for-course-Nissanke/Injections/injection_16.hdf new file mode 100644 index 0000000000000000000000000000000000000000..c87fe964f68bb233c0ca48c0550ca75cec463b49 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_16.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_17.hdf b/data/data-for-course-Nissanke/Injections/injection_17.hdf new file mode 100644 index 0000000000000000000000000000000000000000..d273c73ece652a346b217f11daec2bcf23b306e4 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_17.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_18.hdf b/data/data-for-course-Nissanke/Injections/injection_18.hdf new file mode 100644 index 0000000000000000000000000000000000000000..e07e113692ef38dbdde2ec51c9299b1dc260a739 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_18.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_19.hdf b/data/data-for-course-Nissanke/Injections/injection_19.hdf new file mode 100644 index 0000000000000000000000000000000000000000..eb6331a21fbde21e1e644813078b913c9d21b0fb Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_19.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_2.hdf b/data/data-for-course-Nissanke/Injections/injection_2.hdf new file mode 100644 index 0000000000000000000000000000000000000000..0872edeaead42f94b1d9afc0175e1e19d226efe7 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_2.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_20.hdf b/data/data-for-course-Nissanke/Injections/injection_20.hdf new file mode 100644 index 0000000000000000000000000000000000000000..7f1f5bf2b2af98ca34203609e80c249eb13c14b0 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_20.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_21.hdf b/data/data-for-course-Nissanke/Injections/injection_21.hdf new file mode 100644 index 0000000000000000000000000000000000000000..d707682bd98bb7e0432616b6684075d7dc507a5d Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_21.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_22.hdf b/data/data-for-course-Nissanke/Injections/injection_22.hdf new file mode 100644 index 0000000000000000000000000000000000000000..9428e7a5da6348fa94a757b0f08829847f9460b4 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_22.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_23.hdf b/data/data-for-course-Nissanke/Injections/injection_23.hdf new file mode 100644 index 0000000000000000000000000000000000000000..993a0421c83a985e0b9a07e5ddf49713d01780a4 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_23.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_24.hdf b/data/data-for-course-Nissanke/Injections/injection_24.hdf new file mode 100644 index 0000000000000000000000000000000000000000..cbfde6ccb91f6a0679ad6e84c0edeb1faed8c0ad Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_24.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_25.hdf b/data/data-for-course-Nissanke/Injections/injection_25.hdf new file mode 100644 index 0000000000000000000000000000000000000000..8950e92c0e07ccff7b4d99c66d18fa9d8220e539 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_25.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_26.hdf b/data/data-for-course-Nissanke/Injections/injection_26.hdf new file mode 100644 index 0000000000000000000000000000000000000000..c0181997ef3d948ec3548633dd89e508caf41b05 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_26.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_27.hdf b/data/data-for-course-Nissanke/Injections/injection_27.hdf new file mode 100644 index 0000000000000000000000000000000000000000..1da488b3b6c5f051feef22c23a3b10330eec8e31 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_27.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_28.hdf b/data/data-for-course-Nissanke/Injections/injection_28.hdf new file mode 100644 index 0000000000000000000000000000000000000000..23b669a3c3d52097f307966148bca35578caab61 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_28.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_29.hdf b/data/data-for-course-Nissanke/Injections/injection_29.hdf new file mode 100644 index 0000000000000000000000000000000000000000..e4231bec9aa06dfae4b65780071e9f3133b759e6 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_29.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_3.hdf b/data/data-for-course-Nissanke/Injections/injection_3.hdf new file mode 100644 index 0000000000000000000000000000000000000000..7c45546e83031ab9c0f0c9690ed8bc909417ac41 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_3.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_30.hdf b/data/data-for-course-Nissanke/Injections/injection_30.hdf new file mode 100644 index 0000000000000000000000000000000000000000..ab14d66a506af68552fb7b7d44ae3d9158fb283b Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_30.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_31.hdf b/data/data-for-course-Nissanke/Injections/injection_31.hdf new file mode 100644 index 0000000000000000000000000000000000000000..1b109a08722c6bf694674d40a5b4e1822b8fec8b Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_31.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_32.hdf b/data/data-for-course-Nissanke/Injections/injection_32.hdf new file mode 100644 index 0000000000000000000000000000000000000000..d2ee47b3d1989bc4bd81657e2f0db08cd21b522d Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_32.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_33.hdf b/data/data-for-course-Nissanke/Injections/injection_33.hdf new file mode 100644 index 0000000000000000000000000000000000000000..d8975f61ab9164c1d1bb70d3400c666efd4177fc Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_33.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_34.hdf b/data/data-for-course-Nissanke/Injections/injection_34.hdf new file mode 100644 index 0000000000000000000000000000000000000000..412d35affc1febbeb6fa0dcfbb86f89a0496e98f Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_34.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_35.hdf b/data/data-for-course-Nissanke/Injections/injection_35.hdf new file mode 100644 index 0000000000000000000000000000000000000000..12b676c12f4b456943fa747f8deb08b6e1a8a41d Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_35.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_36.hdf b/data/data-for-course-Nissanke/Injections/injection_36.hdf new file mode 100644 index 0000000000000000000000000000000000000000..46e3d4dec6d7f174ecb96adb9f8258d34bbcebd7 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_36.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_37.hdf b/data/data-for-course-Nissanke/Injections/injection_37.hdf new file mode 100644 index 0000000000000000000000000000000000000000..24b9c986c81cb07f8792dadc9ee314a838a43d8a Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_37.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_38.hdf b/data/data-for-course-Nissanke/Injections/injection_38.hdf new file mode 100644 index 0000000000000000000000000000000000000000..c07c64cd49a974fc6be472d8f3f070fe66752607 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_38.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_39.hdf b/data/data-for-course-Nissanke/Injections/injection_39.hdf new file mode 100644 index 0000000000000000000000000000000000000000..bf779a62c3b865a628d9377a90103dbc0ceadad5 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_39.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_4.hdf b/data/data-for-course-Nissanke/Injections/injection_4.hdf new file mode 100644 index 0000000000000000000000000000000000000000..9d5d09b1df7489ab0d5bd60aa6c92cc51e2005d8 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_4.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_40.hdf b/data/data-for-course-Nissanke/Injections/injection_40.hdf new file mode 100644 index 0000000000000000000000000000000000000000..24af19341d2feeb587e7290d5e5310939283d668 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_40.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_41.hdf b/data/data-for-course-Nissanke/Injections/injection_41.hdf new file mode 100644 index 0000000000000000000000000000000000000000..21ab76018179eea2a99f81741ffe3b343cab59cc Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_41.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_42.hdf b/data/data-for-course-Nissanke/Injections/injection_42.hdf new file mode 100644 index 0000000000000000000000000000000000000000..361a796de41e957f56f58067d178d4737b4f8aaf Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_42.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_43.hdf b/data/data-for-course-Nissanke/Injections/injection_43.hdf new file mode 100644 index 0000000000000000000000000000000000000000..307bbd197927fccbf574aaa4b712fef1ecb357db Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_43.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_44.hdf b/data/data-for-course-Nissanke/Injections/injection_44.hdf new file mode 100644 index 0000000000000000000000000000000000000000..9c379d21626fabe630365220fc14ad54d8680b5b Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_44.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_45.hdf b/data/data-for-course-Nissanke/Injections/injection_45.hdf new file mode 100644 index 0000000000000000000000000000000000000000..f6bb83189add2459368f8d5977c2e2b4c6cb6261 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_45.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_46.hdf b/data/data-for-course-Nissanke/Injections/injection_46.hdf new file mode 100644 index 0000000000000000000000000000000000000000..bc1e1ddf650febb084bda29bb85fa2ce68058846 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_46.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_47.hdf b/data/data-for-course-Nissanke/Injections/injection_47.hdf new file mode 100644 index 0000000000000000000000000000000000000000..5de87cde64de9edd8478ae66eeabd7d19b94e9e4 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_47.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_48.hdf b/data/data-for-course-Nissanke/Injections/injection_48.hdf new file mode 100644 index 0000000000000000000000000000000000000000..9ea37fbf72bb46a67535e64f38ed391322a356e0 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_48.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_49.hdf b/data/data-for-course-Nissanke/Injections/injection_49.hdf new file mode 100644 index 0000000000000000000000000000000000000000..53c5fea585763ac4c9e298840a8d85e2ea783502 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_49.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_5.hdf b/data/data-for-course-Nissanke/Injections/injection_5.hdf new file mode 100644 index 0000000000000000000000000000000000000000..787e0c594fea9beb7cd73778872bc6f529663df6 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_5.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_50.hdf b/data/data-for-course-Nissanke/Injections/injection_50.hdf new file mode 100644 index 0000000000000000000000000000000000000000..1dab9c450e921853e2020aba6c516d444aa40273 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_50.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_51.hdf b/data/data-for-course-Nissanke/Injections/injection_51.hdf new file mode 100644 index 0000000000000000000000000000000000000000..acf4a096f1fba65805fe36d99add30cb31f61fea Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_51.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_52.hdf b/data/data-for-course-Nissanke/Injections/injection_52.hdf new file mode 100644 index 0000000000000000000000000000000000000000..9ad7611a70f4cb313288a8f8339ccf170c24f73a Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_52.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_53.hdf b/data/data-for-course-Nissanke/Injections/injection_53.hdf new file mode 100644 index 0000000000000000000000000000000000000000..b0cc2a62d384adfd2cb6f20a95301f0b281c8572 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_53.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_54.hdf b/data/data-for-course-Nissanke/Injections/injection_54.hdf new file mode 100644 index 0000000000000000000000000000000000000000..0df4bbac972eb20df576a11146730c1b3142acfe Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_54.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_55.hdf b/data/data-for-course-Nissanke/Injections/injection_55.hdf new file mode 100644 index 0000000000000000000000000000000000000000..dc4ab5b096f7eaaf4c3046fa1f92c6a8b1822a45 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_55.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_56.hdf b/data/data-for-course-Nissanke/Injections/injection_56.hdf new file mode 100644 index 0000000000000000000000000000000000000000..fee63bf14c1e513127c47c12d97ce6e53ceebb45 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_56.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_57.hdf b/data/data-for-course-Nissanke/Injections/injection_57.hdf new file mode 100644 index 0000000000000000000000000000000000000000..4e037c8892d65e45b81cb877a207f4777c0dd34e Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_57.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_58.hdf b/data/data-for-course-Nissanke/Injections/injection_58.hdf new file mode 100644 index 0000000000000000000000000000000000000000..51f5b0c88fa57e9eb35c4718ecb876a83fd29047 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_58.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_59.hdf b/data/data-for-course-Nissanke/Injections/injection_59.hdf new file mode 100644 index 0000000000000000000000000000000000000000..804f740de918b235c33253a580a9765139ed885d Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_59.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_6.hdf b/data/data-for-course-Nissanke/Injections/injection_6.hdf new file mode 100644 index 0000000000000000000000000000000000000000..43b0668cac609ce630621d889b8ce6fe939f1906 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_6.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_7.hdf b/data/data-for-course-Nissanke/Injections/injection_7.hdf new file mode 100644 index 0000000000000000000000000000000000000000..cd6c33ede8db2d40a2b8d3dc3888aa221b0b8981 Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_7.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_8.hdf b/data/data-for-course-Nissanke/Injections/injection_8.hdf new file mode 100644 index 0000000000000000000000000000000000000000..256fbcb293af881a720695dfb9bd2624af85ea4b Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_8.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/injection_9.hdf b/data/data-for-course-Nissanke/Injections/injection_9.hdf new file mode 100644 index 0000000000000000000000000000000000000000..47253ea6475c4d3d2e97645e73038a42ab242b3b Binary files /dev/null and b/data/data-for-course-Nissanke/Injections/injection_9.hdf differ diff --git a/data/data-for-course-Nissanke/Injections/masses_0.txt b/data/data-for-course-Nissanke/Injections/masses_0.txt new file mode 100644 index 0000000000000000000000000000000000000000..72d3f96fa68e3c04f796e00028601ebf20d88e26 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_0.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.681178590296432240e+00 +1.630655566829820824e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_1.txt b/data/data-for-course-Nissanke/Injections/masses_1.txt new file mode 100644 index 0000000000000000000000000000000000000000..75429cfaa0e398457c2470a5ddada11d1d9139a8 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_1.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.545749104873916036e+00 +1.478837223836381387e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_10.txt b/data/data-for-course-Nissanke/Injections/masses_10.txt new file mode 100644 index 0000000000000000000000000000000000000000..9f8a2137a6cefa788fab1dbf03f2c1d010bddf55 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_10.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +2.039308419114602255e+00 +1.486360881621414887e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_11.txt b/data/data-for-course-Nissanke/Injections/masses_11.txt new file mode 100644 index 0000000000000000000000000000000000000000..f856d4be7171028af0693a0d80039ae9af9c83d3 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_11.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +2.079491783693446116e+00 +1.462441313499426077e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_12.txt b/data/data-for-course-Nissanke/Injections/masses_12.txt new file mode 100644 index 0000000000000000000000000000000000000000..714294c2a23356db8ca828911238988125357c93 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_12.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.529745500842825123e+00 +1.606895404201095667e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_13.txt b/data/data-for-course-Nissanke/Injections/masses_13.txt new file mode 100644 index 0000000000000000000000000000000000000000..e578c758e1e6bfc45ac0161aae4c09d7d0991b21 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_13.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +6.850425657659691581e+00 +1.677166327115765521e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_14.txt b/data/data-for-course-Nissanke/Injections/masses_14.txt new file mode 100644 index 0000000000000000000000000000000000000000..ff295a4d2b65b44c7a077de62c45dae75361cc49 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_14.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.711685713226325678e+00 +1.663654893042803451e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_15.txt b/data/data-for-course-Nissanke/Injections/masses_15.txt new file mode 100644 index 0000000000000000000000000000000000000000..05af09ef696c101f7508d27434a81c5cba2cf8de --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_15.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.685340253215820150e+00 +1.086310269458264477e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_16.txt b/data/data-for-course-Nissanke/Injections/masses_16.txt new file mode 100644 index 0000000000000000000000000000000000000000..49568e0fb813b668cbf9716e1afe71edcab1b55a --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_16.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +6.885906453563289453e+00 +1.480966484338886113e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_17.txt b/data/data-for-course-Nissanke/Injections/masses_17.txt new file mode 100644 index 0000000000000000000000000000000000000000..62fa746432275489d175a01047f15f61d4ce3941 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_17.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.215433586091219098e+00 +1.192047420994135187e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_18.txt b/data/data-for-course-Nissanke/Injections/masses_18.txt new file mode 100644 index 0000000000000000000000000000000000000000..6ce57c44d1e35667cdd9c8e525e588589429d903 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_18.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.580540679142044658e+00 +1.539668839799360978e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_19.txt b/data/data-for-course-Nissanke/Injections/masses_19.txt new file mode 100644 index 0000000000000000000000000000000000000000..34e05907057fb14ce3383ef0c1d9c5b3f3fbbb5e --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_19.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +4.540687951616419582e+00 +1.619020830794175136e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_2.txt b/data/data-for-course-Nissanke/Injections/masses_2.txt new file mode 100644 index 0000000000000000000000000000000000000000..719cda05f773f59abe13f395bccc1ca1c5bea2d2 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_2.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +7.828139913531146910e+00 +1.723871723192323291e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_20.txt b/data/data-for-course-Nissanke/Injections/masses_20.txt new file mode 100644 index 0000000000000000000000000000000000000000..a7076b7ebc17170423e240f417650ff8bc8f2e90 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_20.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.681144654272498595e+00 +1.597845344287999847e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_21.txt b/data/data-for-course-Nissanke/Injections/masses_21.txt new file mode 100644 index 0000000000000000000000000000000000000000..e2c573150c410e1b535d8ad3da27f31be379eacd --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_21.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +6.103237375071991266e+00 +1.383858824978658086e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_22.txt b/data/data-for-course-Nissanke/Injections/masses_22.txt new file mode 100644 index 0000000000000000000000000000000000000000..d4dd345022e26848a3c09dc01b84475c233057d3 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_22.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.579122593262029417e+00 +1.568128403695148609e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_23.txt b/data/data-for-course-Nissanke/Injections/masses_23.txt new file mode 100644 index 0000000000000000000000000000000000000000..1aa83d21007725f274b9bf3270d4abf59a96eec6 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_23.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.906145372264198778e+00 +1.584830372665742004e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_24.txt b/data/data-for-course-Nissanke/Injections/masses_24.txt new file mode 100644 index 0000000000000000000000000000000000000000..075340f387b1e94ba92c7c9703ebc0b578ccee27 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_24.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +7.984901468488200926e+00 +1.419488027426121679e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_25.txt b/data/data-for-course-Nissanke/Injections/masses_25.txt new file mode 100644 index 0000000000000000000000000000000000000000..9a89cc199e9553b7826db5c66da06ed3f607c1b1 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_25.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.546640102065545364e+00 +1.687781431519669972e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_26.txt b/data/data-for-course-Nissanke/Injections/masses_26.txt new file mode 100644 index 0000000000000000000000000000000000000000..7de6855961401c216d0441637b781504e1e60b99 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_26.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +8.157193311742464203e+00 +1.770195833485085579e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_27.txt b/data/data-for-course-Nissanke/Injections/masses_27.txt new file mode 100644 index 0000000000000000000000000000000000000000..182e82c3af68c2027a9c70a020ec368521116769 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_27.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +7.701962382908485338e+00 +1.532004268234915756e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_28.txt b/data/data-for-course-Nissanke/Injections/masses_28.txt new file mode 100644 index 0000000000000000000000000000000000000000..4a83e6043b3d33518d6aa2f05e70a552883f9634 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_28.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.602324101473902918e+00 +1.416203696264237033e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_29.txt b/data/data-for-course-Nissanke/Injections/masses_29.txt new file mode 100644 index 0000000000000000000000000000000000000000..1d4f297258eff9822a457470482d9649040e919a --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_29.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +5.450841086463546148e+00 +9.685802368954415931e-01 diff --git a/data/data-for-course-Nissanke/Injections/masses_3.txt b/data/data-for-course-Nissanke/Injections/masses_3.txt new file mode 100644 index 0000000000000000000000000000000000000000..3e2fa7a06b484affdb4a77fd4080f3fdf29ffb21 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_3.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.615868545093475772e+00 +1.319094870708568346e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_30.txt b/data/data-for-course-Nissanke/Injections/masses_30.txt new file mode 100644 index 0000000000000000000000000000000000000000..004ffb7287ed3dc998103e4525f4fea237f8102d --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_30.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +3.671933539132413937e+00 +1.424404366315735970e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_31.txt b/data/data-for-course-Nissanke/Injections/masses_31.txt new file mode 100644 index 0000000000000000000000000000000000000000..9047aff9f1aa20d3b091ed5f5ea2e23cb57f9ab7 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_31.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +8.486455757470523054e+00 +1.161202950861117689e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_32.txt b/data/data-for-course-Nissanke/Injections/masses_32.txt new file mode 100644 index 0000000000000000000000000000000000000000..1f8f715089ab0c77435dca2dcf2e4480e53b4300 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_32.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.441504401629195575e+00 +9.739746841933208943e-01 diff --git a/data/data-for-course-Nissanke/Injections/masses_33.txt b/data/data-for-course-Nissanke/Injections/masses_33.txt new file mode 100644 index 0000000000000000000000000000000000000000..21fb9be2ea1ab78dfcf7be606cd4f44d563d4969 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_33.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.035360979845284746e+00 +1.505309575420444190e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_34.txt b/data/data-for-course-Nissanke/Injections/masses_34.txt new file mode 100644 index 0000000000000000000000000000000000000000..6b5b89ce8eff4db6b03fd4b03ffd47b962c9d30f --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_34.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.750246169184729306e+00 +1.241600754637288029e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_35.txt b/data/data-for-course-Nissanke/Injections/masses_35.txt new file mode 100644 index 0000000000000000000000000000000000000000..5856493f38721ffe0b60958cee16faebb400fe3c --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_35.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.846875204523412251e+00 +1.386525927276015091e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_36.txt b/data/data-for-course-Nissanke/Injections/masses_36.txt new file mode 100644 index 0000000000000000000000000000000000000000..5778ac36bf77c0f93e2232b9ba387282704e1282 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_36.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.543478129912597252e+00 +1.260170364468657045e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_37.txt b/data/data-for-course-Nissanke/Injections/masses_37.txt new file mode 100644 index 0000000000000000000000000000000000000000..323faac345d9ac81661db9d7230620120bfc8186 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_37.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.505032377936652566e+00 +2.225954556400123519e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_38.txt b/data/data-for-course-Nissanke/Injections/masses_38.txt new file mode 100644 index 0000000000000000000000000000000000000000..4617e16c85675c0ff0237b3461619954e60ca79c --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_38.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.388957348406690606e+00 +1.319040212966406944e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_39.txt b/data/data-for-course-Nissanke/Injections/masses_39.txt new file mode 100644 index 0000000000000000000000000000000000000000..730baeb08413c4a47b269b4b941b649c4dcdae8a --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_39.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.583301377090297946e+00 +1.302706080890688289e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_4.txt b/data/data-for-course-Nissanke/Injections/masses_4.txt new file mode 100644 index 0000000000000000000000000000000000000000..a2a0081c9a62a7b29495a66dbd09f1cc903aeac2 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_4.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.669101538597711487e+00 +1.397041518353726364e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_40.txt b/data/data-for-course-Nissanke/Injections/masses_40.txt new file mode 100644 index 0000000000000000000000000000000000000000..dedcb077bc35df3468cd5f6fa1e11a66b4a2b864 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_40.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.175774822058283098e+00 +7.689553525170703674e-01 diff --git a/data/data-for-course-Nissanke/Injections/masses_41.txt b/data/data-for-course-Nissanke/Injections/masses_41.txt new file mode 100644 index 0000000000000000000000000000000000000000..bec76f50e22f906e37cc2c6e4c8d2559d548d7dd --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_41.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.987646791084697995e+00 +1.450740575507885932e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_42.txt b/data/data-for-course-Nissanke/Injections/masses_42.txt new file mode 100644 index 0000000000000000000000000000000000000000..af382c1e0436715ad3a8a10813273e95b4b42431 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_42.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.551369893147941603e+00 +1.113379500398540500e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_43.txt b/data/data-for-course-Nissanke/Injections/masses_43.txt new file mode 100644 index 0000000000000000000000000000000000000000..29ed0d970e4150c3c2a107223a595051387819ab --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_43.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +7.981097439297093032e+00 +1.228380483419487135e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_44.txt b/data/data-for-course-Nissanke/Injections/masses_44.txt new file mode 100644 index 0000000000000000000000000000000000000000..b3785428eb36c9800796100e5808ff9dae93692f --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_44.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.833492428989830669e+00 +1.019802287715024125e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_45.txt b/data/data-for-course-Nissanke/Injections/masses_45.txt new file mode 100644 index 0000000000000000000000000000000000000000..b052a3765f9e9a1a6e9e1e64c7eb26e68bd8b29a --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_45.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.377103721776820944e+00 +1.172876016918506181e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_46.txt b/data/data-for-course-Nissanke/Injections/masses_46.txt new file mode 100644 index 0000000000000000000000000000000000000000..14ea48466fc1e69a23bb5c76926ca418bdbe15ee --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_46.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.728812977781124971e+00 +1.356835293604088388e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_47.txt b/data/data-for-course-Nissanke/Injections/masses_47.txt new file mode 100644 index 0000000000000000000000000000000000000000..6cda57cf38718c04925196d6565b4dddcfcf9210 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_47.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.724163619296960492e+00 +1.169888105840049430e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_48.txt b/data/data-for-course-Nissanke/Injections/masses_48.txt new file mode 100644 index 0000000000000000000000000000000000000000..ca2beecfdc3a765782d2ac9af6b9be3336c25ac9 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_48.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.353879350178062380e+00 +1.280365852133006133e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_49.txt b/data/data-for-course-Nissanke/Injections/masses_49.txt new file mode 100644 index 0000000000000000000000000000000000000000..136e56e3fc61a6510d66565c76d0fd9d4f73bd2a --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_49.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +5.275667579794762752e+00 +1.312956092748678305e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_5.txt b/data/data-for-course-Nissanke/Injections/masses_5.txt new file mode 100644 index 0000000000000000000000000000000000000000..aa5e359ff750ec02643e40dc583359b8fe06f5e7 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_5.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.710476744280364336e+00 +1.655798362959729486e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_50.txt b/data/data-for-course-Nissanke/Injections/masses_50.txt new file mode 100644 index 0000000000000000000000000000000000000000..dd0998d5743321a992284bf26a78ab699fbc15d5 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_50.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.802415601960296154e+00 +1.523650675556535550e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_51.txt b/data/data-for-course-Nissanke/Injections/masses_51.txt new file mode 100644 index 0000000000000000000000000000000000000000..ae1c007293555a65120b936cb19135594c8dae5b --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_51.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.823824683136470615e+00 +1.187775876029772526e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_52.txt b/data/data-for-course-Nissanke/Injections/masses_52.txt new file mode 100644 index 0000000000000000000000000000000000000000..848a9e179fedbb7a875767e155cc71a225428807 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_52.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.829761188810331562e+00 +1.342493251914304908e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_53.txt b/data/data-for-course-Nissanke/Injections/masses_53.txt new file mode 100644 index 0000000000000000000000000000000000000000..0ac919541695a18ae370a4ad5628cf4265191f16 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_53.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.682248786814779740e+00 +1.123956629351143377e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_54.txt b/data/data-for-course-Nissanke/Injections/masses_54.txt new file mode 100644 index 0000000000000000000000000000000000000000..07419ed479cb8a54dac58187d681941d467b3f1f --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_54.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +5.024272002357674793e+00 +1.511185059863511704e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_55.txt b/data/data-for-course-Nissanke/Injections/masses_55.txt new file mode 100644 index 0000000000000000000000000000000000000000..2d874bd860577d21d944fbab99b8de621349be65 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_55.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.788164949980785678e+00 +1.594715818100417737e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_56.txt b/data/data-for-course-Nissanke/Injections/masses_56.txt new file mode 100644 index 0000000000000000000000000000000000000000..3cd8f8fb7badc7922ce3b1b104971cf370ece3f5 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_56.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.848662019560433967e+00 +6.925983207373596073e-01 diff --git a/data/data-for-course-Nissanke/Injections/masses_57.txt b/data/data-for-course-Nissanke/Injections/masses_57.txt new file mode 100644 index 0000000000000000000000000000000000000000..4ef0d18eda0a5861aed3a58f6688ec9b7d0d48f8 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_57.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.196335348634598006e+00 +1.375129445076478829e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_58.txt b/data/data-for-course-Nissanke/Injections/masses_58.txt new file mode 100644 index 0000000000000000000000000000000000000000..44a7433fb492acc04c705bbe5c21ab070170a45a --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_58.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.754942996111569897e+00 +1.709714275509148562e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_59.txt b/data/data-for-course-Nissanke/Injections/masses_59.txt new file mode 100644 index 0000000000000000000000000000000000000000..74b26055760ca20394cd451a2a5fb211af882bda --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_59.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +6.220738614156291035e+00 +1.934903100720503977e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_6.txt b/data/data-for-course-Nissanke/Injections/masses_6.txt new file mode 100644 index 0000000000000000000000000000000000000000..99dbbf3fc98c4fe5732fb45370b7142be076e6ed --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_6.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +4.414740446514271888e+00 +1.670969209363220020e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_7.txt b/data/data-for-course-Nissanke/Injections/masses_7.txt new file mode 100644 index 0000000000000000000000000000000000000000..8922fd4ca17ff95845ce693e43ebf7856b8b8b79 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_7.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +3.492813552131636357e+00 +1.501529604435990484e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_8.txt b/data/data-for-course-Nissanke/Injections/masses_8.txt new file mode 100644 index 0000000000000000000000000000000000000000..59108c7592279a963216762c8ed3b9415836ba15 --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_8.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +1.500088470412549668e+00 +1.195665860049148543e+00 diff --git a/data/data-for-course-Nissanke/Injections/masses_9.txt b/data/data-for-course-Nissanke/Injections/masses_9.txt new file mode 100644 index 0000000000000000000000000000000000000000..5bcf7798fb064bc9d77a6d71f7e0f07c7b8b574c --- /dev/null +++ b/data/data-for-course-Nissanke/Injections/masses_9.txt @@ -0,0 +1,3 @@ +# mass1 mass2 +9.893224503650834833e+00 +2.168180336113386453e+00 diff --git a/renku-saas-nb-tutorial.png b/renku-saas-nb-tutorial.png new file mode 100644 index 0000000000000000000000000000000000000000..f5cc283f9f9cc532913d14c4c9a204458e81ee5d Binary files /dev/null and b/renku-saas-nb-tutorial.png differ