{ "cells": [ { "cell_type": "markdown", "id": "a13b8653", "metadata": {}, "source": [ "# Observations of Messier 51 from many telescope archives" ] }, { "cell_type": "markdown", "id": "2453f437", "metadata": {}, "source": [ "This case study searches for X-ray observations of the Messier 51 galaxy, taken by a variety of X-ray telescopes. We chose this galaxy because it is active (and thus likely X-ray bright), and nearby - this makes it a priority target for many X-ray observatories. This process could equally be applied to any named object (or object at a specific set of coordinates)." ] }, { "cell_type": "markdown", "id": "5e2a28b1", "metadata": {}, "source": [ "## Import Statements" ] }, { "cell_type": "code", "execution_count": 1, "id": "aa9f16e8", "metadata": {}, "outputs": [], "source": [ "from warnings import warn\n", "\n", "from daxa.mission import XMMPointed, Chandra, ASCA, Suzaku, ROSATPointed, ROSATAllSky\n", "from daxa.archive import Archive\n", "from daxa.exceptions import NoObsAfterFilterError" ] }, { "cell_type": "markdown", "id": "fa824356", "metadata": {}, "source": [ "## Other Tutorials" ] }, { "cell_type": "markdown", "id": "cc8b77fc", "metadata": {}, "source": [ "These case studies are meant to be highly specific examples of how you might acquire data for a particular science case, they do not provide general instruction on how to use DAXA missions or archives. We instead direct you to:\n", "\n", "* [Using DAXA missions](../missions.html) - Here we explain what DAXA mission classes are and how to use them to select only the data you need.\n", "* [Creating a DAXA archive](../archives.html) - This explains how to create an archive, load an existing archive, and the various properties and features of DAXA archives.\n", "* [Processing telescope data](../../../tutorials.process.html) - The processing tutorials for different missions are presented here, though there may not yet be processing support for all missions.\n", "\n", "Reading through these should give you a good understanding of how DAXA can be used to acquire, organise, and process multi-mission X-ray datasets for your specific use case." ] }, { "cell_type": "markdown", "id": "cda7ed3b", "metadata": {}, "source": [ "## Defining missions" ] }, { "cell_type": "markdown", "id": "1db78091", "metadata": {}, "source": [ "We create instances of the XMM, Chandra, ASCA, Suzaku, ROSAT Pointed, and ROSAT All-Sky missions in order to search their archives - other missions are supported by DAXA (and can be found in the missions tutorial), but these are a subset likely to have observations of M51:" ] }, { "cell_type": "code", "execution_count": 2, "id": "032436b4", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/dt237/code/DAXA/daxa/mission/xmm.py:83: UserWarning: 140 of the 17697 observations located for this mission have been removed due to NaN RA or Dec values\n", " self._fetch_obs_info()\n", "/Users/dt237/code/DAXA/daxa/mission/asca.py:91: UserWarning: 5 of the 3079 observations located for ASCA have been removed due to all instrument exposures being zero.\n", " self._fetch_obs_info()\n", "/Users/dt237/code/DAXA/daxa/mission/suzaku.py:96: UserWarning: 14 of the 3055 observations located for Suzaku have been removed due to all instrument exposures being zero.\n", " self._fetch_obs_info()\n" ] } ], "source": [ "xm = XMMPointed()\n", "ch = Chandra()\n", "asc = ASCA()\n", "su = Suzaku()\n", "rp = ROSATPointed()\n", "ra = ROSATAllSky()" ] }, { "cell_type": "markdown", "id": "c7dda794", "metadata": {}, "source": [ "## Searching for observations" ] }, { "cell_type": "markdown", "id": "df78c594", "metadata": {}, "source": [ "In this instance we use the `filter_on_name` method to search for observations of M51 - this will use the Sesame name resolver to look-up the coordinates for the object. Alternatively, we could use the `filter_on_positions` method and supply the coordinate ourselves:" ] }, { "cell_type": "code", "execution_count": 3, "id": "2e622e5a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/dt237/code/DAXA/daxa/mission/base.py:1075: UserWarning: Chandra FoV are difficult to define, as they can be strongly dependant on observation mode; as such take these as very approximate.\n", " fov = self.fov\n", "/Users/dt237/code/DAXA/daxa/mission/base.py:97: UserWarning: There are multiple chosen instruments SIS0, SIS1, GIS2, GIS3 for asca with different FoVs, but they observe simultaneously. As such the search distance has been set to the largest FoV of the chosen instruments.\n", " any_ret = change_func(*args, **kwargs)\n" ] } ], "source": [ "xm.filter_on_name(\"M51\")\n", "ch.filter_on_name(\"M51\")\n", "asc.filter_on_name(\"M51\")\n", "rp.filter_on_name(\"M51\")\n", "ra.filter_on_name(\"M51\")" ] }, { "cell_type": "markdown", "id": "4ba6b610", "metadata": {}, "source": [ "We have deliberately separated the Suzaku search, as we are aware that it will not find any matching data - as such we'll use this to highlight that the standard Python exception-catching statements can be used to stop a failure to find data derailing your script (for instance you might wish to iterate through a list of missions and have a try-except statement like this:" ] }, { "cell_type": "code", "execution_count": 4, "id": "fb181a5a", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/opt/anaconda3/envs/daxa_dev/lib/python3.9/site-packages/IPython/core/interactiveshell.py:3433: UserWarning: The positional search has returned no Suzaku observations.\n", " exec(code_obj, self.user_global_ns, self.user_ns)\n" ] } ], "source": [ "try:\n", " su.filter_on_name(\"M51\")\n", "except NoObsAfterFilterError as err:\n", " warn(err.message, stacklevel=2)" ] }, { "cell_type": "markdown", "id": "a055080c", "metadata": {}, "source": [ "## Example of observations identified from filtering" ] }, { "cell_type": "markdown", "id": "a51d1fac", "metadata": {}, "source": [ "We can use the `filtered_obs_info` property to retrieve the information table describing the accepted observations:" ] }, { "cell_type": "code", "execution_count": 5, "id": "7ff1fc78", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | ra | \n", "dec | \n", "ObsID | \n", "science_usable | \n", "start | \n", "end | \n", "duration | \n", "instrument | \n", "with_filter | \n", "target_category | \n", "target_name | \n", "proc_rev | \n", "fits_type | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 368 | \n", "202.47 | \n", "47.2 | \n", "RH600601N00 | \n", "True | \n", "1994-06-18 13:11:33.000000 | \n", "1994-06-24 08:04:24.000001 | \n", "0 days 10:05:23 | \n", "HRI | \n", "N | \n", "NGS | \n", "M 51 | \n", "2 | \n", "RDF 3_4 | \n", "
| 917 | \n", "202.47 | \n", "47.2 | \n", "RP600158N00 | \n", "True | \n", "1991-11-28 16:07:59.999998 | \n", "1991-12-13 17:50:20.999999 | \n", "0 days 06:39:16 | \n", "PSPCB | \n", "N | \n", "NGS | \n", "N5194/N5195 | \n", "2 | \n", "RDF 3_4 | \n", "
| 2904 | \n", "202.47 | \n", "47.2 | \n", "RH600062A03 | \n", "True | \n", "1994-05-22 05:24:01.000002 | \n", "1994-05-23 07:16:07.000000 | \n", "0 days 02:36:32 | \n", "HRI | \n", "N | \n", "NGS | \n", "M51 | \n", "2 | \n", "RDF 3_4 | \n", "
| 3096 | \n", "202.47 | \n", "47.2 | \n", "RH600062A01 | \n", "True | \n", "1992-05-22 23:44:46.000000 | \n", "1992-06-05 21:50:42.999999 | \n", "0 days 02:27:11 | \n", "HRI | \n", "N | \n", "NGS | \n", "M51 | \n", "2 | \n", "RFITS V3. | \n", "
| 3174 | \n", "202.47 | \n", "47.2 | \n", "RH600062A00 | \n", "True | \n", "1991-12-07 09:46:57.000003 | \n", "1992-01-10 05:10:12.999996 | \n", "0 days 02:22:21 | \n", "HRI | \n", "N | \n", "NGS | \n", "M51 | \n", "2 | \n", "RFITS V3. | \n", "
| 3303 | \n", "202.47 | \n", "47.2 | \n", "RH601115N00 | \n", "True | \n", "1997-12-26 23:37:19.000001 | \n", "1997-12-30 07:46:24.000001 | \n", "0 days 02:15:04 | \n", "HRI | \n", "N | \n", "NGS | \n", "\n", " | 2 | \n", "RDF 4_2 | \n", "