{ "cells": [ { "cell_type": "markdown", "id": "bc9ac4ed-4f39-46e4-bb1d-61f94d238363", "metadata": {}, "source": [ "# Calibration Without Noise Diodes \n", "\n", "This notebook shows how to use [`GBTFITSLoad.calseq`](https://dysh.readthedocs.io/en/latest/reference/modules/dysh.fits.html#dysh.fits.gbtfitsload.GBTFITSLoad.calseq) to derive the system temperature for observations taken with the W-Band receiver of the GBT. The W-Band receiver has two feeds (beams) and covers the frequency range from 67 to 92 GHz, and, unlike most of the GBT receivers, it does not have noise diodes for calibration. Instead it uses a wheel to put hot and cold loads in front of the receiver, in what we call a calibration sequence (calseq). For the other spectral line receiver that does not use noise diodes, Argus, the command used to compute the system temperature is [`GBTFITSLoad.vanecal`](https://dysh.readthedocs.io/en/latest/reference/modules/dysh.fits.html#dysh.fits.gbtfitsload.GBTFITSLoad.vanecal), because Argus uses a vane instead of a wheel. An example showing how to use `vanecal` will be provided elsewhere.\n", "\n", "The data in this example contains observations of M82 using the [Nod observing procedure](https://gbtdocs.readthedocs.io/en/latest/references/software/scheduling-blocks.html#astrid_commands.Nod).\n", "\n", "## Dysh commands\n", "\n", "The following dysh commands are introduced (leaving out all the function arguments):\n", "\n", " filename = dysh_data()\n", " sdf = GBTFITSLoad()\n", " sdf.udata()\n", " sdf.select()\n", " sb = sdf.getnod()\n", " sb = sdf.getps()\n", " ta = sb.timeaverage()\n", " ta.baseline()\n", " ta.average()\n", " pp = ta.plot()\n", " tt.oshow(ta1)\n", " \n", "## Loading Modules\n", "We start by loading the modules we will use for the data reduction. \n" ] }, { "cell_type": "code", "execution_count": 1, "id": "220b176f-a383-4539-aed0-f85b73c436fa", "metadata": {}, "outputs": [], "source": [ "# These modules are required for the data reduction.\n", "from dysh.fits import GBTFITSLoad\n", "from dysh.log import init_logging\n", "from astropy import units as u\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# These modules are used for file I/O\n", "from dysh.util.files import dysh_data\n", "from pathlib import Path" ] }, { "cell_type": "markdown", "id": "7827e730-9399-4704-9121-b3ce4cee53fa", "metadata": {}, "source": [ "## Setup\n", "We start the dysh logging, so we get more information about what is happening.\n", "This is only needed if working on a notebook.\n", "If using the CLI through the ``dysh`` command, then logging is setup for you." ] }, { "cell_type": "code", "execution_count": 2, "id": "0d35a9cc-a8bc-4cb5-abce-8fdf72aa49dc", "metadata": {}, "outputs": [], "source": [ "init_logging(2)\n", "\n", "# also create a local \"output\" directory where temporary notebook files can be stored.\n", "output_dir = Path.cwd() / \"output\"\n", "output_dir.mkdir(exist_ok=True)" ] }, { "cell_type": "markdown", "id": "92eee316-70f3-4676-9808-fa39d347dea3", "metadata": {}, "source": [ "## Data Retrieval\n", "\n", "Download the example SDFITS data, if necessary." ] }, { "cell_type": "code", "execution_count": 3, "id": "e6a7c6cb-005c-4873-893b-b70b7bf468ce", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "22:36:47.261 I Resolving example=nod3 -> nod-W/data/AGBT15B_244_07.raw.vegas.trim.fits\n", "22:36:47.262 I url: http://www.gb.nrao.edu/dysh//example_data/nod-W/data/AGBT15B_244_07.raw.vegas.trim.fits\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "AGBT15B_244_07.raw.vegas.trim.fits already downloaded\n" ] } ], "source": [ "filename = dysh_data(example=\"nod3\")" ] }, { "cell_type": "markdown", "id": "756a53a6-ca52-4484-9fc1-a696e8388459", "metadata": {}, "source": [ "## Data Loading\n", "\n", "Next, we use `GBTFITSLoad` to load the data, and then its `summary` method to inspect its contents." ] }, { "cell_type": "code", "execution_count": 4, "id": "867d44d3-3676-4d12-8476-55d9c864faf0", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SCANOBJECTVELOCITYPROCPROCSEQNRESTFREQ# IF# POL# INT# FEEDAZIMUTHELEVATION
130M820.0CALSEQ187.6454232334.378246.5595
131M820.0Nod187.6454212334.355546.4977
132M820.0Nod287.6454212334.440046.3994
133M820.0Nod187.6454212334.281946.2979
134M820.0Nod287.6454212334.370446.1996
135M820.0Nod187.6454212334.215246.0993
136M820.0Nod287.6454212334.306146.0009
137M820.0Nod187.6454212334.152045.9003
138M820.0Nod287.6454212334.243845.8002
139M820.0Nod187.6454212334.092945.6982
140M820.0Nod287.6454212334.184545.5991
141M820.0CALSEQ187.6454232334.028745.4683
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sdfits = GBTFITSLoad(filename)\n", "sdfits.summary()" ] }, { "cell_type": "markdown", "id": "38c2f632-ab0a-4118-a8df-8cbb8c152f69", "metadata": {}, "source": [ "There are 12 scans in this dataset. Using four spectral windows, two feeds and two polarizations. There are two calseq procedures at the start and end of the observation, and in between a series of five Nod observations.\n", "\n", "## Data Reduction\n", "\n", "### System Temperature\n", "\n", "To calibrate the data we need to know the system temperature during the observations. We use the [`GBTFITSLoad.calseq`](https://dysh.readthedocs.io/en/latest/reference/modules/dysh.fits.html#dysh.fits.gbtfitsload.GBTFITSLoad.calseq) function to derive the system temperature from the CALSEQ observations. We do this for both feeds, the four spectral windows, and both polarizations." ] }, { "cell_type": "code", "execution_count": 5, "id": "cc554cd4-aacc-4af9-a437-80d57845fe82", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "22:36:47.588 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:49.212 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:49.694 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:50.091 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:50.534 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:50.930 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:51.356 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:51.782 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:52.179 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:52.637 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:53.029 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:53.494 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:53.869 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:54.283 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:54.699 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:55.279 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:55.723 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:56.113 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:56.624 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:57.018 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:57.413 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:57.820 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:58.252 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:58.666 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:59.144 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:59.531 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:36:59.972 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:00.374 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:00.780 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:01.218 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:01.607 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:02.062 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:02.443 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:02.901 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:03.312 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:03.693 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:04.123 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:04.517 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:05.010 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:05.400 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:05.854 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:06.240 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:06.616 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:07.067 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:07.460 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:07.894 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:08.294 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:08.722 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:09.168 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:09.598 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:10.011 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:10.466 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:10.852 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:11.255 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:11.687 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:12.101 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:12.487 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:12.915 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:13.317 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:13.784 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:14.099 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:14.493 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:14.951 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:15.340 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:15.946 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:16.367 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:16.775 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:17.189 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:17.666 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:18.008 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:18.402 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:18.866 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:19.256 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:19.710 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:20.138 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:20.578 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:21.002 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:21.401 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:21.873 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:22.267 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:22.698 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:23.102 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:23.508 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:23.946 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:24.342 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:24.798 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:25.201 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:25.639 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:26.009 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:26.413 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:26.876 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:27.281 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:27.762 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:28.245 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:28.691 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "22:37:29.152 I Using TSYS column\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n" ] } ], "source": [ "fdnums = sdfits.udata(\"FDNUM\") # Feeds.\n", "ifnums = sdfits.udata(\"IFNUM\") # Spectral windows.\n", "plnums = sdfits.udata(\"PLNUM\") # Polarizations. \n", "cscans = [130, 141] # calseq scan numbers.\n", "\n", "# Create an array to store the system temperature for each combination.\n", "tsys = np.empty((len(cscans), len(fdnums), len(plnums), len(ifnums)), dtype=float)\n", "\n", "# Loop over the combinations.\n", "for s,scan in enumerate(cscans):\n", " for f,fdnum in enumerate(fdnums):\n", " for p,plnum in enumerate(plnums):\n", " for i,ifnum in enumerate(ifnums):\n", " tsys[s,f,p,i], _ = sdfits.calseq(scan=scan, fdnum=fdnum, plnum=plnum, ifnum=ifnum)" ] }, { "cell_type": "markdown", "id": "c52fc3c9-99be-4b5d-b4b1-4725559f8728", "metadata": {}, "source": [ "We check how much the system temperature changed between the start and end of the observations. We evaluate this in the form of a percentage relative to the time average of the system temperature." ] }, { "cell_type": "code", "execution_count": 6, "id": "425a95d3-a733-417b-be71-a08133174ec8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[[[2.07996041, 2.02069088, 2.01024058, 1.98262645],\n", " [2.23058483, 2.34203283, 1.97049038, 1.88568961]],\n", "\n", " [[2.18532318, 2.10310376, 2.07058868, 2.0877803 ],\n", " [2.25814277, 2.1933681 , 2.21046665, 2.12652005]]]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.diff(tsys, axis=0)/np.mean(tsys, axis=0)*100" ] }, { "cell_type": "markdown", "id": "f30e8a32-cd2c-4146-b923-53649a803e95", "metadata": {}, "source": [ "From the above we see that the system temperature changed by $\\approx2\\%$. We will take the mean of the system temperatures as a function of time for the calibration." ] }, { "cell_type": "code", "execution_count": 7, "id": "3b8ce6e7-bd2d-45be-9b58-395eea2cac35", "metadata": {}, "outputs": [], "source": [ "tsys = np.mean(tsys, axis=0)" ] }, { "cell_type": "markdown", "id": "6b4e8000-1060-4f4f-8735-215d504870b1", "metadata": {}, "source": [ "### Nod Calibration\n", "\n", "Now we proceed to calibrate the Nod observations. We will use a similar startegy as before, looping over the possible combinations of spectral window, polarization and feeds. However, we will time average the calibrated data, so in the end we will only have one spectrum per spectral window and polarization. Since the data is observed using Nod, the processing will combine the spectra for both beams. The scans we calibrate are all the Nod scans, but we only need to provide the number of one of them per pair, since dysh will automatically figure out which scan is the corresponding pair.\n", "\n", "The spectra we will save are `Spectrum` objects, so we set the data type, `dtype`, of the array to `object`.\n", "\n", "In the call to `GBTFITSLoad.getnod` we must provide a value for the system temperature, one for each beam. In this case, the system temperature for each beam must be in a separate list, like `[[120],[160]]`, where the first feed would use a system temperature of 120 K and the second 160 K. So we take the two system temperatures an pack them into a list or lists before calling the calibration function `getnod`." ] }, { "cell_type": "code", "execution_count": 8, "id": "d4dc49a6-f951-49c8-9c09-a3e2c7864ac8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n" ] } ], "source": [ "nod_ta = np.empty((len(plnums), len(ifnums)), dtype=object)\n", "nod_scans = [131, 133, 135, 137, 139]\n", "\n", "for p,plnum in enumerate(plnums):\n", " for i,ifnum in enumerate(ifnums):\n", " # Extract the system temperature for both feeds for this polarization and spectral window.\n", " t_sys = [[t] for t in tsys[:,p,i]]\n", " # Call the calibration function.\n", " nod_ta[p,i] = sdfits.getnod(scan=nod_scans, ifnum=ifnum, plnum=plnum, t_sys=t_sys).timeaverage()" ] }, { "cell_type": "markdown", "id": "e9863e56-ea87-4d8c-9025-a80dd4b4d13d", "metadata": {}, "source": [ "### Inspecting the Calibrated Data\n", "\n", "Now that we have calibrated our observations, we plot the results to view the calibrated data. We start by plotting things using the built-in plotting functions for `Spectrum` objects, then we proceed to plot the spectra using custom `matplotlib` commands.\n", "\n", "In the following cells we will plot one polarization for the individual spectral windows." ] }, { "cell_type": "code", "execution_count": 9, "id": "737f8582-838a-49ab-af9c-7288cbd163e1", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b33c65503b8149bd9673a6b62dec9838", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nod_ta[0,0].plot();" ] }, { "cell_type": "code", "execution_count": 10, "id": "48e91153-da3b-4d72-ad5a-0aa56e06e5cb", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "bbb5d188dd7a4c98840b631804c4713a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nod_ta[0,1].plot();" ] }, { "cell_type": "code", "execution_count": 11, "id": "e45444bc-3ae5-4fc9-ad9f-176aa0f0ee36", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0c5f25b6573e4ed79c9dac06f4f07324", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nod_ta[0,2].plot();" ] }, { "cell_type": "code", "execution_count": 12, "id": "8984ce7b-e18a-4b02-a7c2-0efcf280f33c", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2b8f4df5676745d392a04792d6ab6c2c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nod_ta[0,3].plot();" ] }, { "cell_type": "markdown", "id": "5ea4ccf9-a7ad-4663-9e8f-d7a0e7be0020", "metadata": {}, "source": [ "Now we will plot all of the spectral windows in a single figure.\n", "We start with the first polarization." ] }, { "cell_type": "code", "execution_count": 13, "id": "35aa3497-49c3-46b4-90fc-4d6333290a28", "metadata": { "tags": [ "remove-output" ] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f847fa0f674d4f3999f0287daf2ed03a", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p0 = nod_ta[0,0].plot(ymin=0.0, ymax=0.4, xaxis_unit=\"GHz\", alpha=0.5, \n", " title=\"PLNUM=0\", label=f\"IFNUM={nod_ta[0,0].meta['IFNUM']}\")\n", "pl0_specs = nod_ta[0,1:]\n", "p0.oshow(pl0_specs, alpha=[0.5]*len(pl0_specs), \n", " label=[f\"IFNUM={s.meta['IFNUM']}\" for s in pl0_specs])" ] }, { "cell_type": "code", "execution_count": null, "id": "d52290fb-182c-4a24-9ebe-c9e31cdb09e1", "metadata": { "tags": [ "remove-input" ] }, "outputs": [], "source": [ "p0.show() # This should only be needed for the documentation." ] }, { "cell_type": "markdown", "id": "36143d39-692b-4aa7-b9e3-a695dd08d8dd", "metadata": {}, "source": [ "The same code if you wanted more manual control\n", "```\n", "fig = plt.figure(dpi=150)\n", "fig.suptitle(\"PLNUM=0\")\n", "ax = fig.add_subplot(111)\n", "for t in nod_ta[0]:\n", " # Use an alpha of less than one to see the overlapping regions.\n", " ax.plot(t.spectral_axis.to(\"GHz\"), t.flux, alpha=0.5, label=f\"IFNUM={t.meta['IFNUM']}\")\n", "# Show a legend.\n", "ax.legend()\n", "# Limit y-range to focus on data.\n", "ax.set_ylim(0, 0.4)\n", "# Set axis labels by hand.\n", "ax.set_xlabel(\"Frequency (GHz)\")\n", "ax.set_ylabel(f\"Antenna temperature ({t.flux.unit})\")\n", "plt.show()\n", "```\n", "\n", "Now the second polarization." ] }, { "cell_type": "code", "execution_count": 14, "id": "6bf2e68c-48b2-4c69-9869-5b3d24b17fc2", "metadata": { "tags": [ "remove-output" ] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "0235e14b51cc446d81776c2926d5fb10", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p1 = nod_ta[1,0].plot(ymin=0.0, ymax=0.4, xaxis_unit=\"GHz\", alpha=0.5, \n", " title=\"PLNUM=1\", label=f\"IFNUM={nod_ta[1,0].meta['IFNUM']}\")\n", "pl1_specs = nod_ta[1,1:]\n", "p1.oshow(pl1_specs, alpha=[0.5]*len(pl0_specs), \n", " label=[f\"IFNUM={s.meta['IFNUM']}\" for s in pl1_specs])" ] }, { "cell_type": "code", "execution_count": null, "id": "1232a2cd-2e08-4bd7-a46d-c0d544a7e70f", "metadata": { "tags": [ "remove-input" ] }, "outputs": [], "source": [ "p1.show() # This should only be needed for the documentation." ] }, { "cell_type": "markdown", "id": "434f8b89-f034-4c29-9fe8-0a85101c7eac", "metadata": {}, "source": [ "The same code if you wanted more manual control\n", "```\n", "fig = plt.figure(dpi=150)\n", "fig.suptitle(\"PLNUM=1\")\n", "ax = fig.add_subplot(111)\n", "for t in nod_ta[1]:\n", " # Use an alpha of less than one to see the overlapping regions.\n", " ax.plot(t.spectral_axis.to(\"GHz\"), t.flux, alpha=0.5, label=f\"IFNUM={t.meta['IFNUM']}\")\n", "# Show a legend.\n", "ax.legend()\n", "# Limit y-range to focus on data.\n", "ax.set_ylim(0, 0.4)\n", "# Set axis labels by hand.\n", "ax.set_xlabel(\"Frequency (GHz)\")\n", "ax.set_ylabel(f\"Antenna temperature ({t.flux.unit})\")\n", "plt.show()\n", "```" ] }, { "cell_type": "markdown", "id": "04614824-c95a-4a41-83d0-6a913188c607", "metadata": {}, "source": [ "We see that spectral windows 1, 2 and 3 have strong detections of spectral lines. We focus on these spectral windows from now on." ] }, { "cell_type": "code", "execution_count": 15, "id": "fa86f9be-0bb7-4d59-bf65-7a19f7fba835", "metadata": {}, "outputs": [], "source": [ "nod_ta_lines = nod_ta[:,[1,2,3]]" ] }, { "cell_type": "markdown", "id": "c1ea1a6e-1edd-46f9-b281-17bd721ce385", "metadata": {}, "source": [ "### Baseline Subtraction\n", "\n", "Now we proceed to remove the baseline from the spectral windows. For this, we will ignore the channels where we see the spectral lines. The ranges we will ignore are: ifnum=1 from 87.2 to 87.3 GHz, ifnum=2 from 88.5 to 88.7 GHz, and for ifnum=3 from 88.5 to 88.7 and 89 to 89.23 GHz. We will also ignore the first and last 500 channels of each spectra. The exclusion regions must be specified as a list of tuples, like `[(1,10),(50,100)]`, and they can include units as well, however, only one unit per exclusion region is supported. We use an order 15 polynomial as the baseline model. This is a high order, but it captures most of the structure on the spectra for both polarizations." ] }, { "cell_type": "code", "execution_count": 16, "id": "bb9910b0-3c32-4c43-ad28-27eefd97b4d6", "metadata": {}, "outputs": [], "source": [ "# Define baseline parameters.\n", "order = 15\n", "model = \"poly\"\n", "edge = 500\n", "exclude = {1: [(nod_ta_lines[0,0].spectral_axis.quantity.min().to(\"GHz\"), \n", " nod_ta_lines[0,0].spectral_axis.quantity[edge].to(\"GHz\")),\n", " (87.2*u.GHz, 87.3*u.GHz),\n", " (nod_ta_lines[0,0].spectral_axis.quantity[-edge].to(\"GHz\"), \n", " nod_ta_lines[0,0].spectral_axis.quantity.max().to(\"GHz\")),\n", " ],\n", " 2: [(nod_ta_lines[0,1].spectral_axis.quantity.min().to(\"GHz\"), \n", " nod_ta_lines[0,1].spectral_axis.quantity[edge].to(\"GHz\")),\n", " (88.5*u.GHz, 88.65*u.GHz), \n", " (nod_ta_lines[0,1].spectral_axis.quantity[-edge].to(\"GHz\"), \n", " nod_ta_lines[0,1].spectral_axis.quantity.max().to(\"GHz\"))\n", " ],\n", " 3: [(nod_ta_lines[0,2].spectral_axis.quantity.min().to(\"GHz\"), \n", " nod_ta_lines[0,2].spectral_axis.quantity[edge].to(\"GHz\")),\n", " (88.5*u.GHz, 88.7*u.GHz), \n", " (89*u.GHz, 89.23*u.GHz),\n", " (nod_ta_lines[0,2].spectral_axis.quantity[-edge].to(\"GHz\"), \n", " nod_ta_lines[0,2].spectral_axis.quantity.max().to(\"GHz\"))\n", " ],\n", " }" ] }, { "cell_type": "code", "execution_count": 17, "id": "30020238-3b70-4aef-be76-0efcb6cd669f", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "22:40:01.998 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (86478489084.0 Hz, 86524265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (87200000000.0 Hz, 87300000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (87932712716.8125 Hz, 87978397531.26562 Hz) \n", "]\n", "22:40:02.455 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (87308489084.0 Hz, 87354265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88500000000.0 Hz, 88650000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88762712716.8125 Hz, 88808397531.26562 Hz) \n", "]\n", "22:40:02.852 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (88138489084.0 Hz, 88184265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88500000000.0 Hz, 88700000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (89000000000.0 Hz, 89230000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (89592712716.8125 Hz, 89638397531.26562 Hz) \n", "]\n", "22:40:03.219 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (86478489084.0 Hz, 86524265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (87200000000.0 Hz, 87300000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (87932712716.8125 Hz, 87978397531.26562 Hz) \n", "]\n", "22:40:03.628 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (87308489084.0 Hz, 87354265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88500000000.0 Hz, 88650000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88762712716.8125 Hz, 88808397531.26562 Hz) \n", "]\n", "22:40:03.806 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (88138489084.0 Hz, 88184265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88500000000.0 Hz, 88700000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (89000000000.0 Hz, 89230000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (89592712716.8125 Hz, 89638397531.26562 Hz) \n", "]\n" ] } ], "source": [ "# Loop over spectra and remove the baseline.\n", "for nod_ta_lines_p in nod_ta_lines:\n", " for spec in nod_ta_lines_p:\n", " spec.baseline(order, model=model, exclude=exclude[spec.meta[\"IFNUM\"]], remove=True)" ] }, { "cell_type": "markdown", "id": "c747fc8c-c70d-430d-8be5-a8b1daee989a", "metadata": {}, "source": [ "Plot again after removing the baseline." ] }, { "cell_type": "code", "execution_count": 20, "id": "8c218161-20a0-4b3a-a85c-a6fcd44d2568", "metadata": { "tags": [ "remove-output" ] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2d52cce228634aeba3cdd8d3487af1e3", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p0 = nod_ta_lines[0,0].plot(ymin=-0.4, ymax=0.4, xaxis_unit=\"GHz\", alpha=0.5, \n", " title=\"PLNUM=0\", label=f\"IFNUM={nod_ta_lines[0,0].meta['IFNUM']}\")\n", "pl0_specs = nod_ta_lines[0,1:]\n", "p0.oshow(pl0_specs, alpha=[0.5]*len(pl0_specs), \n", " label=[f\"IFNUM={s.meta['IFNUM']}\" for s in pl0_specs])" ] }, { "cell_type": "code", "execution_count": null, "id": "d27659ea-7a74-4c29-96c4-e34f80ebd2a3", "metadata": { "tags": [ "remove-input" ] }, "outputs": [], "source": [ "p0.show() # This should only be needed for the documentation." ] }, { "cell_type": "markdown", "id": "2a2cd94c-7da2-42d4-bfe9-65bd48873b15", "metadata": { "scrolled": true }, "source": [ "The same code if you want more manual control\n", "```\n", "fig = plt.figure(dpi=150)\n", "fig.suptitle(\"PLNUM=0\")\n", "ax = fig.add_subplot(111)\n", "for t in nod_ta_lines[0]:\n", " # Use an alpha of less than one to see the overlapping regions.\n", " ax.plot(t.spectral_axis.to(\"GHz\"), t.flux, alpha=0.5, label=f\"IFNUM={t.meta['IFNUM']}\")\n", "# Show a legend.\n", "ax.legend()\n", "# Limit y-range to focus on data.\n", "ax.set_ylim(-0.4, 0.4)\n", "# Set axis labels by hand.\n", "ax.set_xlabel(\"Frequency (GHz)\")\n", "ax.set_ylabel(f\"Antenna temperature ({t.flux.unit})\")\n", "plt.show()\n", "```" ] }, { "cell_type": "code", "execution_count": 21, "id": "8cfb1e0c-85d6-4cf9-bc62-62d762d08c00", "metadata": { "tags": [ "remove-output" ] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6248d7f9be334d52ae51e308b0beabf1", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p1 = nod_ta_lines[1,0].plot(ymin=-0.4, ymax=0.4, xaxis_unit=\"GHz\", alpha=0.5, \n", " title=\"PLNUM=1\", label=f\"IFNUM={nod_ta_lines[0,0].meta['IFNUM']}\")\n", "pl1_specs = nod_ta_lines[1,1:]\n", "p1.oshow(pl1_specs, alpha=[0.5]*len(pl1_specs), \n", " label=[f\"IFNUM={s.meta['IFNUM']}\" for s in pl1_specs])" ] }, { "cell_type": "code", "execution_count": null, "id": "10199602-93bc-4be1-a815-6d5e2afe62dc", "metadata": { "tags": [ "remove-input" ] }, "outputs": [], "source": [ "p1.show() # This should only be needed for the documentation." ] }, { "cell_type": "markdown", "id": "b2e1ab7c-1ade-4dd6-8c03-4c06619a5bd1", "metadata": {}, "source": [ "The same code if you want more manual control\n", "```\n", "fig = plt.figure(dpi=150)\n", "fig.suptitle(\"PLNUM=1\")\n", "ax = fig.add_subplot(111)\n", "for t in nod_ta_lines[1]:\n", " # Use an alpha of less than one to see the overlapping regions.\n", " ax.plot(t.spectral_axis.to(\"GHz\"), t.flux, alpha=0.5, label=f\"IFNUM={t.meta['IFNUM']}\")\n", "# Show a legend.\n", "ax.legend()\n", "# Limit y-range to focus on data.\n", "ax.set_ylim(-0.4, 0.4)\n", "# Set axis labels by hand.\n", "ax.set_xlabel(\"Frequency (GHz)\")\n", "ax.set_ylabel(f\"Antenna temperature ({t.flux.unit})\")\n", "plt.show()\n", "```" ] }, { "cell_type": "markdown", "id": "57a4d574-fea2-4635-9cad-4bcd47f58577", "metadata": {}, "source": [ "### Correcting for Atmospheric Opacity\n", "\n", "So far the calibrated data has been in the antenna temperature scale, which does not take into account the effects of the atmosphere in the temperature scale. To calibrate taking these effects into account we need to specify an opacity and request a different brightness scale. The scales currently supported by dysh are **\"Ta\\*\"** (antenna temperature corrected for atmospheric opacity) and **\"Jy\"** (flux density). More details about the calibration can be found in the articles by [Kutner & Ulich (1981)](https://ui.adsabs.harvard.edu/abs/1981ApJ...250..341K/abstract), [Kramer (1997)](https://publicwiki.iram.es/CalibrationPapers?action=AttachFile&do=view&target=kramer_1997_cali_rep.pdf) and [Frayer et al. (2019)](https://library.nrao.edu/public/memos/gbt/GBT_302.pdf).\n", "\n", "If you are working inside the GBO network, in one of the [GBO data reduction hosts](https://greenbankobservatory.org/portal/gbt/processing/), then you can use the convenience functions incorporated into dysh to retrieve atmospheric opacity.\n", "\n", "```Python\n", "from dysh.util.weatherforecast import GBTWeatherForecast\n", "gbwf = GBTWeatherForecast()\n", "spec = nod_ta_lines[0,0]\n", "mjd, freq, tau = gbwf.fetch(vartype=\"Opacity\", \n", " specval=spec.spectral_axis.quantity.mean(), \n", " mjd=spec.obstime.mjd\n", " )\n", "```\n", "\n", "If you are not working at GBO, then you can follow [these instructions](https://gbtdocs.readthedocs.io/en/latest/how-tos/data_reduction/calculate_opacity.html) to figure out the opacity.\n", "\n", "If you do not have access to the GBO computing environment, you can use the [NRAO helpdesk](https://help.nrao.edu/) to ask for opacity values for the GBT. Please specify the dates (accurate to the hour) and frequencies for which you require opacities.\n", "\n", "Here we will use the following values, in a dictionary with keys corresponding to the spectral window (IFNUM)." ] }, { "cell_type": "code", "execution_count": 22, "id": "f9b3a4c4-c5eb-41fa-9898-73d4b77b5122", "metadata": {}, "outputs": [], "source": [ "tau = {0: 6.28488304e-02,\n", " 1: 5.99070412e-02,\n", " 2: 5.73315943e-02,\n", " 3: 5.51805677e-02\n", " }" ] }, { "cell_type": "markdown", "id": "54f048dd-d21f-4b5e-b3d4-b04ffa8234d0", "metadata": {}, "source": [ "We repeat the calibration specifying the opacity with the `zenith_opacity` argument and requesting that the data be calibrated to \"Ta*\" with the `units` argument." ] }, { "cell_type": "code", "execution_count": 23, "id": "a7f27c05-a1cf-4c7b-a2b2-60f09066ce22", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n", "we used fits returning\n" ] } ], "source": [ "nod_ta_star = np.empty((len(plnums), len(ifnums)), dtype=object)\n", "nod_scans = [131, 133, 135, 137, 139]\n", "\n", "for p,plnum in enumerate(plnums):\n", " for i,ifnum in enumerate(ifnums):\n", " # Extract the system temperature for both feeds for this polarization and spectral window.\n", " t_sys = [[t] for t in tsys[:,p,i]]\n", " # Call the calibration function.\n", " nod_ta_star[p,i] = sdfits.getnod(scan=nod_scans, ifnum=ifnum, plnum=plnum, \n", " t_sys=t_sys, \n", " zenith_opacity=tau[ifnum],\n", " units=\"Ta*\"\n", " ).timeaverage()" ] }, { "cell_type": "code", "execution_count": 24, "id": "ef36e50e-063a-4e11-b0a2-8ba967cf4b86", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "86db244221764e0a9c1cca64a9ae63af", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nod_ta_star[0,0].plot();" ] }, { "cell_type": "markdown", "id": "492f42ec-5c6d-46c0-bcb1-e0e2dcce907b", "metadata": {}, "source": [ "Now we repeat the baseline subtraction on the spectral windows that show emission lines." ] }, { "cell_type": "code", "execution_count": 25, "id": "95e04b4f-1009-4422-842e-0565a0c1da2c", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "22:43:18.782 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (86478489084.0 Hz, 86524265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (87200000000.0 Hz, 87300000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (87932712716.8125 Hz, 87978397531.26562 Hz) \n", "]\n", "22:43:19.148 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (87308489084.0 Hz, 87354265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88500000000.0 Hz, 88650000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88762712716.8125 Hz, 88808397531.26562 Hz) \n", "]\n", "22:43:19.389 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (88138489084.0 Hz, 88184265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88500000000.0 Hz, 88700000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (89000000000.0 Hz, 89230000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (89592712716.8125 Hz, 89638397531.26562 Hz) \n", "]\n", "22:43:19.614 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (86478489084.0 Hz, 86524265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (87200000000.0 Hz, 87300000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (87932712716.8125 Hz, 87978397531.26562 Hz) \n", "]\n", "22:43:19.946 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (87308489084.0 Hz, 87354265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88500000000.0 Hz, 88650000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88762712716.8125 Hz, 88808397531.26562 Hz) \n", "]\n", "22:43:20.200 I EXCLUDING [Spectral Region, 1 sub-regions:\n", " (88138489084.0 Hz, 88184265451.1875 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (88500000000.0 Hz, 88700000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (89000000000.0 Hz, 89230000000.0 Hz) \n", ", Spectral Region, 1 sub-regions:\n", " (89592712716.8125 Hz, 89638397531.26562 Hz) \n", "]\n" ] } ], "source": [ "nod_ta_star_lines = nod_ta_star[:,[1,2,3]]\n", "for nod_ta_star_lines_p in nod_ta_star_lines:\n", " for spec in nod_ta_star_lines_p:\n", " spec.baseline(order, model=model, exclude=exclude[spec.meta[\"IFNUM\"]], remove=True)" ] }, { "cell_type": "code", "execution_count": 26, "id": "9040d3cc-7930-4cf4-ae46-2b22f3935b5a", "metadata": { "tags": [ "remove-output" ] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e523966907394187a044b69494db3db6", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p0 = nod_ta_star_lines[0,0].plot(ymin=-0.4, ymax=0.9, xaxis_unit=\"GHz\", alpha=0.5, \n", " title=\"PLNUM=0\", label=f\"IFNUM={nod_ta_star_lines[0,0].meta['IFNUM']}\")\n", "pl0_specs = nod_ta_star_lines[0,1:]\n", "p0.oshow(pl0_specs, alpha=[0.5]*len(pl0_specs), \n", " label=[f\"IFNUM={s.meta['IFNUM']}\" for s in pl0_specs])" ] }, { "cell_type": "code", "execution_count": null, "id": "664470ff-b258-4885-8ce0-f8bc6c9cc04e", "metadata": { "tags": [ "remove-input" ] }, "outputs": [], "source": [ "p0.show() # This should only be needed for the documentation." ] }, { "cell_type": "markdown", "id": "d1d9d9ea-03da-4e1d-b0b9-58edb8bb83fc", "metadata": {}, "source": [ "The same figure could be plotted using the following code:\n", "```\n", "fig = plt.figure(dpi=150)\n", "fig.suptitle(\"PLNUM=0\")\n", "ax = fig.add_subplot(111)\n", "for t in nod_ta_star_lines[0]:\n", " # Use an alpha of less than one to see the overlapping regions.\n", " ax.plot(t.spectral_axis.to(\"GHz\"), t.flux, alpha=0.5, label=f\"IFNUM={t.meta['IFNUM']}\")\n", "# Show a legend.\n", "ax.legend()\n", "# Limit y-range to focus on data.\n", "ax.set_ylim(-0.4, 0.9)\n", "# Set axis labels by hand.\n", "ax.set_xlabel(\"Frequency (GHz)\")\n", "ax.set_ylabel(fr\"$T_{{A}}^{{*}}$ ({t.flux.unit})\")\n", "plt.show()\n", "```\n", "\n", "Now the second polarization." ] }, { "cell_type": "code", "execution_count": 27, "id": "75520773-e903-4a2b-a7d0-64b135920e70", "metadata": { "tags": [ "remove-output" ] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a69b2824cc124fe6b5c47005db554c56", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "p1 = nod_ta_star_lines[1,0].plot(ymin=-0.4, ymax=0.9, xaxis_unit=\"GHz\", alpha=0.5, \n", " title=\"PLNUM=1\", label=f\"IFNUM={nod_ta_star_lines[1,0].meta['IFNUM']}\")\n", "pl1_specs = nod_ta_star_lines[1,1:]\n", "p1.oshow(pl1_specs, alpha=[0.5]*len(pl1_specs), \n", " label=[f\"IFNUM={s.meta['IFNUM']}\" for s in pl1_specs])" ] }, { "cell_type": "code", "execution_count": null, "id": "8e31fa6f-4837-4007-b2f0-3ede124b45be", "metadata": { "tags": [ "remove-input" ] }, "outputs": [], "source": [ "p1.show() # This should only be needed for the documentation." ] }, { "cell_type": "markdown", "id": "9a77e233-d628-4f5c-b3b1-0a9fe14d7161", "metadata": {}, "source": [ "### Polarization Average\n", "\n", "We are now in a position to average the polarizations. This reduces the noise in the spectra. To average spectra we use the `Spectrum.average` function. It takes as input a list of other `Spectrum` objects. It does not check if the spectra are repeated.\n", "\n", "We create a new array `ta_star_pol_ave` where we store the polarization averages, and then we loop over the spectra averaging polarizations." ] }, { "cell_type": "code", "execution_count": 28, "id": "de8b324b-ac08-46d1-8674-97e48dd15ee9", "metadata": {}, "outputs": [], "source": [ "ta_star_pol_ave = np.empty(nod_ta_star_lines.shape[1], dtype=object)\n", "\n", "for i in range(nod_ta_star_lines.shape[1]):\n", " ta_star_pol_ave[i] = nod_ta_star_lines[0,i].average(nod_ta_star_lines[1,i])" ] }, { "cell_type": "markdown", "id": "4fc4b5ac-15c1-495f-a3c9-b2a3a090235a", "metadata": {}, "source": [ "Plot the polarization averages." ] }, { "cell_type": "code", "execution_count": 30, "id": "80cb706e-c561-4a6a-bebc-c390a90a20a8", "metadata": { "tags": [ "remove-output" ] }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "69b1f761a883439d942bda604e430034", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pa = ta_star_pol_ave[0].plot(ymin=-0.4, ymax=0.9, xaxis_unit=\"GHz\", alpha=0.5, \n", " title=\"Polarization Average\", label=f\"IFNUM={nod_ta_star_lines[0,0].meta['IFNUM']}\")\n", "avg_specs = ta_star_pol_ave[1:]\n", "pa.oshow(avg_specs, alpha=[0.5]*len(avg_specs), \n", " label=[f\"IFNUM={s.meta['IFNUM']}\" for s in avg_specs])" ] }, { "cell_type": "code", "execution_count": null, "id": "7b2474d8-d844-42e0-8428-61a8f3e02d19", "metadata": { "tags": [ "remove-input" ] }, "outputs": [], "source": [ "pa.show() # This should only be needed for the documentation." ] }, { "cell_type": "markdown", "id": "4c4256bb-df50-4a17-88e3-c42597d594b8", "metadata": {}, "source": [ "## Saving the Calibrated Spectra\n", "\n", "Now that we have calibrated our data correcting for atmospheric opacity we save it to FITS files.\n", "\n", "We use previously defined output directory. We loop over spectral windows saving the data." ] }, { "cell_type": "code", "execution_count": 28, "id": "0541af76-7a22-49d9-a0e4-9b106c1d3fac", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: Attribute `ZEROCHAN` of type cannot be added to FITS Header - skipping [astropy.io.fits.convenience]\n", "WARNING: Attribute `ZEROCHAN` of type cannot be added to FITS Header - skipping [astropy.io.fits.convenience]\n", "WARNING: Attribute `ZEROCHAN` of type cannot be added to FITS Header - skipping [astropy.io.fits.convenience]\n" ] } ], "source": [ "for spec in ta_star_pol_ave:\n", " fnm_out = output_dir / f\"M82_ifnum_{spec.meta['IFNUM']}_polavg.fits\"\n", " spec.write(fnm_out, format=\"fits\", overwrite=True)" ] }, { "cell_type": "markdown", "id": "931af88e-6910-4e27-a482-af5057ba73cf", "metadata": {}, "source": [ "The data is now in FITS tables." ] }, { "cell_type": "markdown", "id": "4cbcc779-3692-414d-9243-4abdf9aa0896", "metadata": {}, "source": [ "## Loading the Calibrated Spectra\n", "\n", "Now that we have saved the calibrated spectra to FITS files, we can read it back in. There are multiple ways of reading back FITS spectra, here we show how to using the built in `dysh` reader `dysh.spectra.Spectrum.read` and `astropy.io.fits` (raw reading).\n", "\n", "### Reading with dysh\n", "\n", "To read a FITS file written by dysh we use the `dysh.spectra.Spectrum.read` function. When calling the function we must specify the format of the file, otherwise an error might occur. The following cell will show how to." ] }, { "cell_type": "code", "execution_count": 29, "id": "51c57e96-097c-4443-91a2-0fee088a750b", "metadata": {}, "outputs": [], "source": [ "from dysh.spectra import Spectrum\n", "read_spec = Spectrum.read(output_dir / \"M82_ifnum_1_polavg.fits\", format=\"fits\")" ] }, { "cell_type": "markdown", "id": "eace5481-04bd-4bd9-b2f8-a0faa4c0bdec", "metadata": {}, "source": [ "The result is a `Spectrum` object, with all its capabilities." ] }, { "cell_type": "code", "execution_count": 30, "id": "5abe79aa-9f13-482b-ad71-4dce38bcdd16", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d3d94c82e0134972b03f7ab05817854e", "version_major": 2, "version_minor": 0 }, "text/plain": [ "VBox(children=(HBox(children=(Button(description='Clear All Regions', style=ButtonStyle(), tooltip='Clear all …" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read_spec_smo = read_spec.smooth(\"gauss\", 16)\n", "read_spec_smo.plot()" ] }, { "cell_type": "markdown", "id": "925eaea9-1aad-4b17-9d25-83b0dcf39fbf", "metadata": {}, "source": [ "Even the history is available, albeit not easy to read. In a resulting FITS file (see below) it will be easier to read." ] }, { "cell_type": "code", "execution_count": 31, "id": "1d46d6a6-cc6c-4b5d-b7a6-6176618f37a8", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "['2026-03-04T18:30:18-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum.__init__(flux=[ nan -0.38167784 -0.42788408 ... 0.29981571 0.28108434 -0.23835116] K,wcs=WCS Keywords Number of WCS axes: 4 CTYPE : \\'FREQ\\' \\'RA\\' \\'DEC\\' \\'STOKES\\' CRVAL : 87228489084.0 148.93912271827946 69.63322176771119 1.0 CRPIX : 8193.0 0.0 0.0 0.0 PC1_1 PC1_2 PC1_3 PC1_4 : 1.0 0.0 0.0 0.0 PC2_1 PC2_2 PC2_3 PC2_4 : 0.0 1.0 0.0 0.0 PC3_1 PC3_2 PC3_3 PC3_4 : 0.0 0.0 1.0 0.0 PC4_1 PC4_2 PC4_3 PC4_4 : 0.0 0.0 0.0 1.0 CDELT : 91552.734375 1.0 1.0 1.0 NAXIS : 16384 0 0 0,meta={\\'OBJECT\\': \\'M82\\', \\'BANDWID\\': 1500000000.0, \\'DATE-OBS\\': \\'2017-02-04T10:11:43.00\\', \\'DURATION\\': 609.7817230224609, \\'EXPOSURE\\': 596.6629532243182, \\'TSYS\\': 108.43737062628821, \\'CTYPE1\\': \\'FREQ-OBS\\', \\'CRVAL1\\': 87228489084.0, \\'CRPIX1\\': 8193.0, \\'CDELT1\\': 91552.734375, \\'CTYPE2\\': \\'RA\\', \\'CRVAL2\\': 148.93912271827946, \\'CTYPE3\\': \\'DEC\\', \\'CRVAL3\\': 69.63322176771119, \\'CRVAL4\\': 1, \\'OBSERVER\\': \\'Dom Pesce\\', \\'OBSID\\': \\'unknown\\', \\'SCAN\\': 131, \\'OBSMODE\\': \\'Nod:NONE:TPNOCAL\\', \\'FRONTEND\\': \\'Rcvr68_92\\', \\'TCAL\\': 1.0, \\'VELDEF\\': \\'OPTI-BAR\\', \\'VFRAME\\': 5241.161782043649, \\'RVSYS\\': 0.0, \\'OBSFREQ\\': 87228489084.0, \\'LST\\': 49886.57916905915, \\'AZIMUTH\\': 334.4132429832569, \\'ELEVATIO\\': 46.497692750558066, \\'TAMBIENT\\': 261.45001220703125, \\'PRESSURE\\': 699.2300046755845, \\'HUMIDITY\\': 0.6909999847412109, \\'RESTFREQ\\': 87230000000.0, \\'DOPFREQ\\': 86400000000.0, \\'FREQRES\\': 91552.734375, \\'EQUINOX\\': 2000.0, \\'RADESYS\\': \\'FK5\\', \\'TRGTLONG\\': 148.9695833333333, \\'TRGTLAT\\': 69.67944444444444, \\'SAMPLER\\': \\'B1_0\\', \\'FEED\\': 1, \\'SRFEED\\': 0, \\'FEEDXOFF\\': 0.0, \\'FEEDEOFF\\': 0.0, \\'SUBREF_STATE\\': 1, \\'SIDEBAND\\': \\'U\\', \\'PROCSEQN\\': 1, \\'PROCSIZE\\': 2, \\'PROCSCAN\\': \\'BEAM1\\', \\'PROCTYPE\\': \\'SIMPLE\\', \\'LASTON\\': 0, \\'LASTOFF\\': 0, \\'TIMESTAMP\\': \\'2017_02_04_10:11:43\\', \\'QD_XEL\\': -0.00172575483707228, \\'QD_EL\\': 0.001033652915095047, \\'QD_BAD\\': 0, \\'QD_METHOD\\': \\'A\\', \\'VELOCITY\\': 0.0, \\'FOFFREF1\\': 0.0, \\'ADCSAMPF\\': 3000000000.0, \\'VSPDELT\\': 512.0, \\'VSPRVAL\\': 16.0, \\'VSPRPIX\\': 8192.0, \\'SIG\\': \\'T\\', \\'CAL\\': \\'F\\', \\'CALTYPE\\': \\'LOW\\', \\'TWARM\\': 263.18359375, \\'TCOLD\\': 18.5546875, \\'CALPOSITION\\': \\'Observing\\', \\'BACKEND\\': \\'VEGAS\\', \\'PROJID\\': \\'AGBT15B_244_07\\', \\'TELESCOP\\': \\'NRAO_GBT\\', \\'SITELONG\\': -79.83983, \\'SITELAT\\': 38.43312, \\'SITEELEV\\': 824.595, \\'IFNUM\\': 1, \\'PLNUM\\': 1, \\'FDNUM\\': 0, \\'INT\\': 0, \\'NSAVE\\': -1, \\'HDU\\': 1, \\'BINTABLE\\': 0, \\'ROW\\': 54, \\'SIMPLE\\': True, \\'EXTEND\\': True, \\'DATE\\': \\'2025-05-27\\', \\'ORIGIN\\': \\'NRAO Green Bank\\', \\'GUIDEVER\\': \\'GBTIDL ver2.10.1\\', \\'FITSVER\\': \\'1.9\\', \\'EXTNAME\\': \\'SINGLE DISH\\', \\'CTYPE4\\': \\'STOKES\\', \\'FITSINDEX\\': 0, \\'PROC\\': \\'Nod\\', \\'OBSTYPE\\': \\'NONE\\', \\'SUBOBSMODE\\': \\'TPNOCAL\\', \\'CUNIT1\\': \\'Hz\\', \\'CUNIT2\\': \\'deg\\', \\'CUNIT3\\': \\'deg\\', \\'RESTFRQ\\': 87230000000.0, \\'BUNIT\\': \\'K\\', \\'TSCALE\\': \\'Ta*\\', \\'TSCALFAC\\': 3.132414901397774, \\'AP_EFF\\': 0.3501073560210638, \\'SURF_ERR\\': 230.0, \\'SE_UNIT\\': \\'micron\\', \\'MEANTSYS\\': 137.12980829151758, \\'WTTSYS\\': 137.12980829151758, \\'TAU_Z\\': 0.05990704119999999, \\'HISTORY\\': [\\'2026-03-04T18:29:47 - Project ID: AGBT15B_244_07\\', \\'2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.__init__(AGBT15B_244_07.raw.vegas.trim.fits,)\\', \\'2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.flag_vegas_spurs()\\', \\'2026-03-04T18:29:48-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:49-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:50-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:51-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:52-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:53-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:54-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:55-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:56-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:57-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:58-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:29:59-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:00-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:01-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:02-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:03-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:04-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:05-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:06-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:08-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:09-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.apply_flags()\\', \\'2026-03-04T18:30:09-0500 - DYSH v0.12.1 : dysh.spectra.scan.ScanBlock.__\\', \\'init__()\\', \\'2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\\', \\'oad.getnod(scan=[131, 133, 135, 137, 139],ifnum=1,plnum=0,t_sys=[[np.flo\\', \\'at64(108.22387107748688)], [np.float64(143.54009942913794)]],zenith_opac\\', \\'ity=0.0599070412,units=Ta*,)\\', \\'2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.spectra.scan.ScanBlock.ti\\', \\'meaverage()\\', \\'2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\\', \\'.__init__(flux=[ -0.07918082 -0.01101417 ... 0.28614683 0.2980\\', \"0966 0.64951734] K,wcs=WCS Keywords Number of WCS axes: 4 CTYPE : \\'FR\", \"EQ\\' \\'RA\\' \\'DEC\\' \\'STOKES\\' CRVAL : 87228489084.0 148.94971752154765 69.649\", \\'73941003959 -6.0 CRPIX : 8193.0 0.0 0.0 0.0 PC1_1 PC1_2 PC1_3 PC1_4 :\\', \\' 1.0 0.0 0.0 0.0 PC2_1 PC2_2 PC2_3 PC2_4 : 0.0 1.0 0.0 0.0 PC3_1 PC3_\\', \\'2 PC3_3 PC3_4 : 0.0 0.0 1.0 0.0 PC4_1 PC4_2 PC4_3 PC4_4 : 0.0 0.0 0.0\\', \" 1.0 CDELT : 91552.734375 1.0 1.0 1.0 NAXIS : 16384 0 0 0,meta={\\'OB\", \"JECT\\': \\'M82\\', \\'BANDWID\\': 1500000000.0, \\'DATE-OBS\\': \\'2017-02-04T10:11:43.\", \"00\\', \\'DURATION\\': np.float64(304.89086151123047), \\'EXPOSURE\\': np.float64(\", \"298.3314766121591), \\'TSYS\\': np.float64(121.02359518771574), \\'TDIM7\\': \\'(1\", \"6384,1,1,1)\\', \\'TUNIT7\\': \\'K\\', \\'CTYPE1\\': \\'FREQ-OBS\\', \\'CRVAL1\\': 87228489084\", \".0, \\'CRPIX1\\': 8193.0, \\'CDELT1\\': 91552.734375, \\'CTYPE2\\': \\'RA\\', \\'CRVAL2\\':\", \"np.float64(148.94971752154765), \\'CTYPE3\\': \\'DEC\\', \\'CRVAL3\\': np.float64(69\", \".64973941003959), \\'CRVAL4\\': -6, \\'OBSERVER\\': \\'Dom Pesce\\', \\'OBSID\\': \\'unkno\", \"wn\\', \\'SCAN\\': 131, \\'OBSMODE\\': \\'Nod:NONE:TPNOCAL\\', \\'FRONTEND\\': \\'Rcvr68_92\\'\", \", \\'TCAL\\': np.float64(1.0), \\'VELDEF\\': \\'OPTI-BAR\\', \\'VFRAME\\': 5241.16178204\", \"3649, \\'RVSYS\\': 0.0, \\'OBSFREQ\\': 87228489084.0, \\'LST\\': 49886.57916905915,\", \"\\'AZIMUTH\\': 334.4132429832569, \\'ELEVATIO\\': 46.497692750558066, \\'TAMBIENT\\'\", \": 261.45001220703125, \\'PRESSURE\\': 699.2300046755845, \\'HUMIDITY\\': 0.69099\", \"99847412109, \\'RESTFREQ\\': 87230000000.0, \\'DOPFREQ\\': 86400000000.0, \\'FREQR\", \"ES\\': 91552.734375, \\'EQUINOX\\': 2000.0, \\'RADESYS\\': \\'FK5\\', \\'TRGTLONG\\': 148.\", \"9695833333333, \\'TRGTLAT\\': 69.67944444444444, \\'SAMPLER\\': \\'B2_0\\', \\'FEED\\':\", \"1, \\'SRFEED\\': 0, \\'FEEDXOFF\\': 0.0, \\'FEEDEOFF\\': 0.0, \\'SUBREF_STATE\\': 1, \\'SI\", \"DEBAND\\': \\'U\\', \\'PROCSEQN\\': 1, \\'PROCSIZE\\': 2, \\'PROCSCAN\\': \\'BEAM1\\', \\'PROCTY\", \"PE\\': \\'SIMPLE\\', \\'LASTON\\': 0, \\'LASTOFF\\': 0, \\'TIMESTAMP\\': \\'2017_02_04_10:11\", \":43\\', \\'QD_XEL\\': -0.0017257548370722825, \\'QD_EL\\': 0.001033652915095047, \\'\", \"QD_BAD\\': 0, \\'QD_METHOD\\': \\'A\\', \\'VELOCITY\\': 0.0, \\'FOFFREF1\\': 0.0, \\'ZEROCHA\", \"N\\': nan, \\'ADCSAMPF\\': 3000000000.0, \\'VSPDELT\\': 512.0, \\'VSPRVAL\\': 16.0, \\'V\", \"SPRPIX\\': 8192.0, \\'SIG\\': \\'T\\', \\'CAL\\': \\'F\\', \\'CALTYPE\\': \\'LOW\\', \\'TWARM\\': 263.\", \"18359375, \\'TCOLD\\': 18.5546875, \\'CALPOSITION\\': \\'Observing\\', \\'BACKEND\\': \\'V\", \"EGAS\\', \\'PROJID\\': \\'AGBT15B_244_07\\', \\'TELESCOP\\': \\'NRAO_GBT\\', \\'SITELONG\\': -\", \"79.83983, \\'SITELAT\\': 38.43312, \\'SITEELEV\\': 824.595, \\'IFNUM\\': 1, \\'PLNUM\\':\", \" 0, \\'FDNUM\\': 0, \\'INT\\': 0, \\'NSAVE\\': -1, \\'HDU\\': 1, \\'BINTABLE\\': 0, \\'ROW\\': 5\", \"2, \\'SIMPLE\\': True, \\'EXTEND\\': True, \\'DATE\\': \\'2025-05-27\\', \\'ORIGIN\\': \\'NRAO\", \" Green Bank\\', \\'GUIDEVER\\': \\'GBTIDL ver2.10.1\\', \\'FITSVER\\': \\'1.9\\', \\'EXTNAME\", \"\\': \\'SINGLE DISH\\', \\'CTYPE4\\': \\'STOKES\\', \\'FITSINDEX\\': 0, \\'PROC\\': \\'Nod\\', \\'OB\", \"STYPE\\': \\'NONE\\', \\'SUBOBSMODE\\': \\'TPNOCAL\\', \\'CUNIT1\\': \\'Hz\\', \\'CUNIT2\\': \\'deg\\'\", \", \\'CUNIT3\\': \\'deg\\', \\'RESTFRQ\\': np.float64(87230000000.0), \\'BUNIT\\': \\'K\\', \\'\", \"TSCALE\\': \\'Ta*\\', \\'NAXIS1\\': 16384, \\'TSCALFAC\\': np.float64(3.13241490139777\", \"4), \\'AP_EFF\\': np.float64(0.35010735602106374), \\'SURF_ERR\\': np.float64(22\", \"9.99999999999994), \\'SE_UNIT\\': \\'micron\\', \\'MEANTSYS\\': np.float64(108.22387\", \"107748688), \\'WTTSYS\\': np.float64(108.22387107748688), \\'TAU_Z\\': np.float6\", \\'4(0.05990704119999998)},velocity_convention=optical,radial_velocity=0.0\\', \\'km / s,rest_value=87230000000.0 Hz,observer=,target=,mask=[ True False False ... False False False]\\', \\',)\\', \\'2026-03-04T18:30:16-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\\', \\'.baseline(15,model=poly,exclude=[(, ), (, ), (, )],remove=True,)\\', \\'2026-03-04T18:30:17-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\\', \\'.__init__(flux=[ -0.38167784 -0.42788408 ... 0.29981571 0.2810\\', \"8434 -0.23835116] K,wcs=WCS Keywords Number of WCS axes: 4 CTYPE : \\'FR\", \"EQ\\' \\'RA\\' \\'DEC\\' \\'STOKES\\' CRVAL : 87228489084.0 148.93912271827946 69.633\", \\'22176771119 1.0 CRPIX : 8193.0 0.0 0.0 0.0 PC1_1 PC1_2 PC1_3 PC1_4 :\\', \\'1.0 0.0 0.0 0.0 PC2_1 PC2_2 PC2_3 PC2_4 : 0.0 1.0 0.0 0.0 PC3_1 PC3_2\\', \\' PC3_3 PC3_4 : 0.0 0.0 1.0 0.0 PC4_1 PC4_2 PC4_3 PC4_4 : 0.0 0.0 0.0\\', \"1.0 CDELT : 91552.734375 1.0 1.0 1.0 NAXIS : 16384 0 0 0,meta={\\'OBJ\", \"ECT\\': \\'M82\\', \\'BANDWID\\': 1500000000.0, \\'DATE-OBS\\': \\'2017-02-04T10:11:43.0\", \"0\\', \\'DURATION\\': np.float64(609.7817230224609), \\'EXPOSURE\\': np.float64(59\", \"6.6629532243182), \\'TSYS\\': np.float64(108.43737062628821), \\'TDIM7\\': \\'(163\", \"84,1,1,1)\\', \\'TUNIT7\\': \\'K\\', \\'CTYPE1\\': \\'FREQ-OBS\\', \\'CRVAL1\\': 87228489084.0\", \", \\'CRPIX1\\': 8193.0, \\'CDELT1\\': 91552.734375, \\'CTYPE2\\': \\'RA\\', \\'CRVAL2\\': np\", \".float64(148.93912271827946), \\'CTYPE3\\': \\'DEC\\', \\'CRVAL3\\': np.float64(69.6\", \"3322176771119), \\'CRVAL4\\': 1, \\'OBSERVER\\': \\'Dom Pesce\\', \\'OBSID\\': \\'unknown\\'\", \", \\'SCAN\\': 131, \\'OBSMODE\\': \\'Nod:NONE:TPNOCAL\\', \\'FRONTEND\\': \\'Rcvr68_92\\', \\'\", \"TCAL\\': np.float64(1.0), \\'VELDEF\\': \\'OPTI-BAR\\', \\'VFRAME\\': 5241.16178204364\", \"9, \\'RVSYS\\': 0.0, \\'OBSFREQ\\': 87228489084.0, \\'LST\\': 49886.57916905915, \\'AZ\", \"IMUTH\\': 334.4132429832569, \\'ELEVATIO\\': 46.497692750558066, \\'TAMBIENT\\': 2\", \"61.45001220703125, \\'PRESSURE\\': 699.2300046755845, \\'HUMIDITY\\': 0.69099998\", \"47412109, \\'RESTFREQ\\': 87230000000.0, \\'DOPFREQ\\': 86400000000.0, \\'FREQRES\\'\", \": 91552.734375, \\'EQUINOX\\': 2000.0, \\'RADESYS\\': \\'FK5\\', \\'TRGTLONG\\': 148.969\", \"5833333333, \\'TRGTLAT\\': 69.67944444444444, \\'SAMPLER\\': \\'B1_0\\', \\'FEED\\': 1,\", \"\\'SRFEED\\': 0, \\'FEEDXOFF\\': 0.0, \\'FEEDEOFF\\': 0.0, \\'SUBREF_STATE\\': 1, \\'SIDEB\", \"AND\\': \\'U\\', \\'PROCSEQN\\': 1, \\'PROCSIZE\\': 2, \\'PROCSCAN\\': \\'BEAM1\\', \\'PROCTYPE\\'\", \": \\'SIMPLE\\', \\'LASTON\\': 0, \\'LASTOFF\\': 0, \\'TIMESTAMP\\': \\'2017_02_04_10:11:43\", \"\\', \\'QD_XEL\\': -0.0017257548370722825, \\'QD_EL\\': 0.001033652915095047, \\'QD_\", \"BAD\\': 0, \\'QD_METHOD\\': \\'A\\', \\'VELOCITY\\': 0.0, \\'FOFFREF1\\': 0.0, \\'ZEROCHAN\\':\", \" nan, \\'ADCSAMPF\\': 3000000000.0, \\'VSPDELT\\': 512.0, \\'VSPRVAL\\': 16.0, \\'VSPR\", \"PIX\\': 8192.0, \\'SIG\\': \\'T\\', \\'CAL\\': \\'F\\', \\'CALTYPE\\': \\'LOW\\', \\'TWARM\\': 263.183\", \"59375, \\'TCOLD\\': 18.5546875, \\'CALPOSITION\\': \\'Observing\\', \\'BACKEND\\': \\'VEGA\", \"S\\', \\'PROJID\\': \\'AGBT15B_244_07\\', \\'TELESCOP\\': \\'NRAO_GBT\\', \\'SITELONG\\': -79.\", \"83983, \\'SITELAT\\': 38.43312, \\'SITEELEV\\': 824.595, \\'IFNUM\\': 1, \\'PLNUM\\': 1,\", \" \\'FDNUM\\': 0, \\'INT\\': 0, \\'NSAVE\\': -1, \\'HDU\\': 1, \\'BINTABLE\\': 0, \\'ROW\\': 54,\", \"\\'SIMPLE\\': True, \\'EXTEND\\': True, \\'DATE\\': \\'2025-05-27\\', \\'ORIGIN\\': \\'NRAO Gr\", \"een Bank\\', \\'GUIDEVER\\': \\'GBTIDL ver2.10.1\\', \\'FITSVER\\': \\'1.9\\', \\'EXTNAME\\':\", \"\\'SINGLE DISH\\', \\'CTYPE4\\': \\'STOKES\\', \\'FITSINDEX\\': 0, \\'PROC\\': \\'Nod\\', \\'OBSTY\", \"PE\\': \\'NONE\\', \\'SUBOBSMODE\\': \\'TPNOCAL\\', \\'CUNIT1\\': \\'Hz\\', \\'CUNIT2\\': \\'deg\\', \\'\", \"CUNIT3\\': \\'deg\\', \\'RESTFRQ\\': np.float64(87230000000.0), \\'BUNIT\\': \\'K\\', \\'TSC\", \"ALE\\': \\'Ta*\\', \\'NAXIS1\\': 16384, \\'TSCALFAC\\': np.float64(3.132414901397774),\", \" \\'AP_EFF\\': np.float64(0.3501073560210638), \\'SURF_ERR\\': np.float64(230.0)\", \", \\'SE_UNIT\\': \\'micron\\', \\'MEANTSYS\\': np.float64(137.12980829151758), \\'WTTS\", \"YS\\': np.float64(137.12980829151758), \\'TAU_Z\\': np.float64(0.0599070411999\", \\'9999)},velocity_convention=optical,radial_velocity=0.0 km / s,rest_value\\', \\'=87230000000.0 Hz,observer=,target=,mask=[ True False False ... False False False],)\\', \\'2026-03-04T18:30:17-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\\', \\'.average(Spectrum (length=16384) Flux=[ nan -0.06004197 -0.185110\\', \\'69 ... 0.30823558 0.26746191 -0.84623934] K, mean=0.00415 K Spe\\', \\'ctral Axis=[8.64784891e+10 8.64785806e+10 8.64786722e+10 ...\\', \\' 8.79782144e+10 8.79783060e+10 8.79783975e+10] Hz, mean=87228443307.\\', \\'63281 Hz,)\\']},velocity_convention=optical,radial_velocity=0.0 km / s,rest_value=87230000000.0 Hz,observer=,target=,)',\n", " '2026-03-04T18:30:18-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum.smooth(gauss,16,)']" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "read_spec.history" ] }, { "cell_type": "markdown", "id": "289ce50b-8979-47ea-a33f-e1842f39db24", "metadata": {}, "source": [ "### Raw Reading\n", "\n", "To read the file we use the `astropy.fits.open` function. This will read the FITS file as a data table, not a `Spectrum` object. This makes it more flexible, but it also requires knowledge about how to work with FITS tables.\n", "\n", "We start by importing `astropy.fits` and then loading the file." ] }, { "cell_type": "code", "execution_count": 32, "id": "271712cb-829a-49dd-9dde-dbd5aa2aa82b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[, ]" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from astropy.io import fits\n", "hdu = fits.open(output_dir / \"M82_ifnum_1_polavg.fits\")\n", "hdu" ] }, { "cell_type": "markdown", "id": "32d6dcf9-bfa3-4edf-a08b-938ee375f136", "metadata": {}, "source": [ "The data is in the second element of the opened file. We can retrieve the header and table data using the `header` and `data` properties." ] }, { "cell_type": "code", "execution_count": 33, "id": "e586c16c-69ef-4987-ab89-57937a0a3214", "metadata": {}, "outputs": [], "source": [ "header = hdu[1].header\n", "data = hdu[1].data\n", "hdu.close() # Close the file for now." ] }, { "cell_type": "markdown", "id": "5787c8a3-1300-4132-b189-0f93924c5e40", "metadata": {}, "source": [ "The header contains all the meta data from the `Spectrum`, as well as the data reduction history." ] }, { "cell_type": "code", "execution_count": 34, "id": "76d21fe5-abd2-4b29-b9bf-523753601b88", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "XTENSION= 'BINTABLE' / binary table extension \n", "BITPIX = 8 / array data type \n", "NAXIS = 2 / number of array dimensions \n", "NAXIS1 = 48 / length of dimension 1 \n", "NAXIS2 = 16384 / length of dimension 2 \n", "PCOUNT = 0 / number of group parameters \n", "GCOUNT = 1 / number of groups \n", "TFIELDS = 6 / number of table fields \n", "TTYPE1 = 'spectral_axis' \n", "TFORM1 = 'D ' \n", "TUNIT1 = 'Hz ' \n", "TTYPE2 = 'flux ' \n", "TFORM2 = 'D ' \n", "TUNIT2 = 'K ' \n", "TTYPE3 = 'uncertainty' \n", "TFORM3 = 'D ' \n", "TTYPE4 = 'weight ' \n", "TFORM4 = 'D ' \n", "TTYPE5 = 'mask ' \n", "TFORM5 = 'K ' \n", "TTYPE6 = 'baseline' \n", "TFORM6 = 'D ' \n", "TUNIT6 = 'K ' \n", "OBJECT = 'M82 ' \n", "BANDWID = 1500000000.0 \n", "DATE-OBS= '2017-02-04T10:11:43.00' \n", "DURATION= 609.7817230224609 \n", "EXPOSURE= 596.6629532243182 \n", "TSYS = 108.43737062628821 \n", "CTYPE1 = 'FREQ-OBS' \n", "CRVAL1 = 87228489084.0 \n", "CRPIX1 = 8193.0 \n", "CDELT1 = 91552.734375 \n", "CTYPE2 = 'RA ' \n", "CRVAL2 = 148.93912271827946 \n", "CTYPE3 = 'DEC ' \n", "CRVAL3 = 69.63322176771119 \n", "CRVAL4 = 1 \n", "OBSERVER= 'Dom Pesce' \n", "OBSID = 'unknown ' \n", "SCAN = 131 \n", "OBSMODE = 'Nod:NONE:TPNOCAL' \n", "FRONTEND= 'Rcvr68_92' \n", "TCAL = 1.0 \n", "VELDEF = 'OPTI-BAR' \n", "VFRAME = 5241.161782043649 \n", "RVSYS = 0.0 \n", "OBSFREQ = 87228489084.0 \n", "LST = 49886.57916905915 \n", "AZIMUTH = 334.4132429832569 \n", "ELEVATIO= 46.497692750558066 \n", "TAMBIENT= 261.45001220703125 \n", "PRESSURE= 699.2300046755845 \n", "HUMIDITY= 0.6909999847412109 \n", "RESTFREQ= 87230000000.0 \n", "DOPFREQ = 86400000000.0 \n", "FREQRES = 91552.734375 \n", "EQUINOX = 2000.0 \n", "RADESYS = 'FK5 ' \n", "TRGTLONG= 148.9695833333333 \n", "TRGTLAT = 69.67944444444444 \n", "SAMPLER = 'B1_0 ' \n", "FEED = 1 \n", "SRFEED = 0 \n", "FEEDXOFF= 0.0 \n", "FEEDEOFF= 0.0 \n", "HIERARCH SUBREF_STATE = 1 \n", "SIDEBAND= 'U ' \n", "PROCSEQN= 1 \n", "PROCSIZE= 2 \n", "PROCSCAN= 'BEAM1 ' \n", "PROCTYPE= 'SIMPLE ' \n", "LASTON = 0 \n", "LASTOFF = 0 \n", "HIERARCH TIMESTAMP = '2017_02_04_10:11:43' \n", "QD_XEL = -0.00172575483707228 \n", "QD_EL = 0.001033652915095047 \n", "QD_BAD = 0 \n", "HIERARCH QD_METHOD = 'A ' \n", "VELOCITY= 0.0 \n", "FOFFREF1= 0.0 \n", "ADCSAMPF= 3000000000.0 \n", "VSPDELT = 512.0 \n", "VSPRVAL = 16.0 \n", "VSPRPIX = 8192.0 \n", "SIG = 'T ' \n", "CAL = 'F ' \n", "CALTYPE = 'LOW ' \n", "TWARM = 263.18359375 \n", "TCOLD = 18.5546875 \n", "HIERARCH CALPOSITION = 'Observing' \n", "BACKEND = 'VEGAS ' \n", "PROJID = 'AGBT15B_244_07' \n", "TELESCOP= 'NRAO_GBT' \n", "SITELONG= -79.83983 \n", "SITELAT = 38.43312 \n", "SITEELEV= 824.595 \n", "IFNUM = 1 \n", "PLNUM = 1 \n", "FDNUM = 0 \n", "INT = 0 \n", "NSAVE = -1 \n", "HDU = 1 \n", "BINTABLE= 0 \n", "ROW = 54 \n", "SIMPLE = T \n", "EXTEND = T \n", "DATE = '2025-05-27' \n", "ORIGIN = 'NRAO Green Bank' \n", "GUIDEVER= 'GBTIDL ver2.10.1' \n", "FITSVER = '1.9 ' \n", "EXTNAME = 'SINGLE DISH' \n", "CTYPE4 = 'STOKES ' \n", "HIERARCH FITSINDEX = 0 \n", "PROC = 'Nod ' \n", "OBSTYPE = 'NONE ' \n", "HIERARCH SUBOBSMODE = 'TPNOCAL ' \n", "CUNIT1 = 'Hz ' \n", "CUNIT2 = 'deg ' \n", "CUNIT3 = 'deg ' \n", "RESTFRQ = 87230000000.0 \n", "BUNIT = 'K ' \n", "TSCALE = 'Ta* ' \n", "TSCALFAC= 3.132414901397774 \n", "AP_EFF = 0.3501073560210638 \n", "SURF_ERR= 230.0 \n", "SE_UNIT = 'micron ' \n", "MEANTSYS= 137.12980829151758 \n", "WTTSYS = 137.12980829151758 \n", "TAU_Z = 0.05990704119999999 \n", "HISTORY 2026-03-04T18:29:47 - Project ID: AGBT15B_244_07 \n", "HISTORY 2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.__init__(AGBT15B_244_07.raw.vegas.trim.fits,) \n", "HISTORY 2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.flag_vegas_spurs() \n", "HISTORY 2026-03-04T18:29:48-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:49-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:50-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:51-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:52-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:53-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:54-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:55-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:56-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:57-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:58-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:29:59-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:00-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:01-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:02-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:03-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:04-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:05-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:06-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:08-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:09-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.apply_flags() \n", "HISTORY 2026-03-04T18:30:09-0500 - DYSH v0.12.1 : dysh.spectra.scan.ScanBlock.__\n", "HISTORY init__() \n", "HISTORY 2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "HISTORY oad.getnod(scan=[131, 133, 135, 137, 139],ifnum=1,plnum=0,t_sys=[[np.flo\n", "HISTORY at64(108.22387107748688)], [np.float64(143.54009942913794)]],zenith_opac\n", "HISTORY ity=0.0599070412,units=Ta*,) \n", "HISTORY 2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.spectra.scan.ScanBlock.ti\n", "HISTORY meaverage() \n", "HISTORY 2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\n", "HISTORY .__init__(flux=[ -0.07918082 -0.01101417 ... 0.28614683 0.2980\n", "HISTORY 0966 0.64951734] K,wcs=WCS Keywords Number of WCS axes: 4 CTYPE : 'FR\n", "HISTORY EQ' 'RA' 'DEC' 'STOKES' CRVAL : 87228489084.0 148.94971752154765 69.649\n", "HISTORY 73941003959 -6.0 CRPIX : 8193.0 0.0 0.0 0.0 PC1_1 PC1_2 PC1_3 PC1_4 :\n", "HISTORY 1.0 0.0 0.0 0.0 PC2_1 PC2_2 PC2_3 PC2_4 : 0.0 1.0 0.0 0.0 PC3_1 PC3_\n", "HISTORY 2 PC3_3 PC3_4 : 0.0 0.0 1.0 0.0 PC4_1 PC4_2 PC4_3 PC4_4 : 0.0 0.0 0.0\n", "HISTORY 1.0 CDELT : 91552.734375 1.0 1.0 1.0 NAXIS : 16384 0 0 0,meta={'OB\n", "HISTORY JECT': 'M82', 'BANDWID': 1500000000.0, 'DATE-OBS': '2017-02-04T10:11:43.\n", "HISTORY 00', 'DURATION': np.float64(304.89086151123047), 'EXPOSURE': np.float64(\n", "HISTORY 298.3314766121591), 'TSYS': np.float64(121.02359518771574), 'TDIM7': '(1\n", "HISTORY 6384,1,1,1)', 'TUNIT7': 'K', 'CTYPE1': 'FREQ-OBS', 'CRVAL1': 87228489084\n", "HISTORY .0, 'CRPIX1': 8193.0, 'CDELT1': 91552.734375, 'CTYPE2': 'RA', 'CRVAL2': \n", "HISTORY np.float64(148.94971752154765), 'CTYPE3': 'DEC', 'CRVAL3': np.float64(69\n", "HISTORY .64973941003959), 'CRVAL4': -6, 'OBSERVER': 'Dom Pesce', 'OBSID': 'unkno\n", "HISTORY wn', 'SCAN': 131, 'OBSMODE': 'Nod:NONE:TPNOCAL', 'FRONTEND': 'Rcvr68_92'\n", "HISTORY , 'TCAL': np.float64(1.0), 'VELDEF': 'OPTI-BAR', 'VFRAME': 5241.16178204\n", "HISTORY 3649, 'RVSYS': 0.0, 'OBSFREQ': 87228489084.0, 'LST': 49886.57916905915, \n", "HISTORY 'AZIMUTH': 334.4132429832569, 'ELEVATIO': 46.497692750558066, 'TAMBIENT'\n", "HISTORY : 261.45001220703125, 'PRESSURE': 699.2300046755845, 'HUMIDITY': 0.69099\n", "HISTORY 99847412109, 'RESTFREQ': 87230000000.0, 'DOPFREQ': 86400000000.0, 'FREQR\n", "HISTORY ES': 91552.734375, 'EQUINOX': 2000.0, 'RADESYS': 'FK5', 'TRGTLONG': 148.\n", "HISTORY 9695833333333, 'TRGTLAT': 69.67944444444444, 'SAMPLER': 'B2_0', 'FEED': \n", "HISTORY 1, 'SRFEED': 0, 'FEEDXOFF': 0.0, 'FEEDEOFF': 0.0, 'SUBREF_STATE': 1, 'SI\n", "HISTORY DEBAND': 'U', 'PROCSEQN': 1, 'PROCSIZE': 2, 'PROCSCAN': 'BEAM1', 'PROCTY\n", "HISTORY PE': 'SIMPLE', 'LASTON': 0, 'LASTOFF': 0, 'TIMESTAMP': '2017_02_04_10:11\n", "HISTORY :43', 'QD_XEL': -0.0017257548370722825, 'QD_EL': 0.001033652915095047, '\n", "HISTORY QD_BAD': 0, 'QD_METHOD': 'A', 'VELOCITY': 0.0, 'FOFFREF1': 0.0, 'ZEROCHA\n", "HISTORY N': nan, 'ADCSAMPF': 3000000000.0, 'VSPDELT': 512.0, 'VSPRVAL': 16.0, 'V\n", "HISTORY SPRPIX': 8192.0, 'SIG': 'T', 'CAL': 'F', 'CALTYPE': 'LOW', 'TWARM': 263.\n", "HISTORY 18359375, 'TCOLD': 18.5546875, 'CALPOSITION': 'Observing', 'BACKEND': 'V\n", "HISTORY EGAS', 'PROJID': 'AGBT15B_244_07', 'TELESCOP': 'NRAO_GBT', 'SITELONG': -\n", "HISTORY 79.83983, 'SITELAT': 38.43312, 'SITEELEV': 824.595, 'IFNUM': 1, 'PLNUM':\n", "HISTORY 0, 'FDNUM': 0, 'INT': 0, 'NSAVE': -1, 'HDU': 1, 'BINTABLE': 0, 'ROW': 5\n", "HISTORY 2, 'SIMPLE': True, 'EXTEND': True, 'DATE': '2025-05-27', 'ORIGIN': 'NRAO\n", "HISTORY Green Bank', 'GUIDEVER': 'GBTIDL ver2.10.1', 'FITSVER': '1.9', 'EXTNAME\n", "HISTORY ': 'SINGLE DISH', 'CTYPE4': 'STOKES', 'FITSINDEX': 0, 'PROC': 'Nod', 'OB\n", "HISTORY STYPE': 'NONE', 'SUBOBSMODE': 'TPNOCAL', 'CUNIT1': 'Hz', 'CUNIT2': 'deg'\n", "HISTORY , 'CUNIT3': 'deg', 'RESTFRQ': np.float64(87230000000.0), 'BUNIT': 'K', '\n", "HISTORY TSCALE': 'Ta*', 'NAXIS1': 16384, 'TSCALFAC': np.float64(3.13241490139777\n", "HISTORY 4), 'AP_EFF': np.float64(0.35010735602106374), 'SURF_ERR': np.float64(22\n", "HISTORY 9.99999999999994), 'SE_UNIT': 'micron', 'MEANTSYS': np.float64(108.22387\n", "HISTORY 107748688), 'WTTSYS': np.float64(108.22387107748688), 'TAU_Z': np.float6\n", "HISTORY 4(0.05990704119999998)},velocity_convention=optical,radial_velocity=0.0 \n", "HISTORY km / s,rest_value=87230000000.0 Hz,observer=,target=,mask=[ True False False ... False False False]\n", "HISTORY ,) \n", "HISTORY 2026-03-04T18:30:16-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\n", "HISTORY .baseline(15,model=poly,exclude=[(, ), (, ), (, )],remove=True,) \n", "HISTORY 2026-03-04T18:30:17-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\n", "HISTORY .__init__(flux=[ -0.38167784 -0.42788408 ... 0.29981571 0.2810\n", "HISTORY 8434 -0.23835116] K,wcs=WCS Keywords Number of WCS axes: 4 CTYPE : 'FR\n", "HISTORY EQ' 'RA' 'DEC' 'STOKES' CRVAL : 87228489084.0 148.93912271827946 69.633\n", "HISTORY 22176771119 1.0 CRPIX : 8193.0 0.0 0.0 0.0 PC1_1 PC1_2 PC1_3 PC1_4 : \n", "HISTORY 1.0 0.0 0.0 0.0 PC2_1 PC2_2 PC2_3 PC2_4 : 0.0 1.0 0.0 0.0 PC3_1 PC3_2\n", "HISTORY PC3_3 PC3_4 : 0.0 0.0 1.0 0.0 PC4_1 PC4_2 PC4_3 PC4_4 : 0.0 0.0 0.0 \n", "HISTORY 1.0 CDELT : 91552.734375 1.0 1.0 1.0 NAXIS : 16384 0 0 0,meta={'OBJ\n", "HISTORY ECT': 'M82', 'BANDWID': 1500000000.0, 'DATE-OBS': '2017-02-04T10:11:43.0\n", "HISTORY 0', 'DURATION': np.float64(609.7817230224609), 'EXPOSURE': np.float64(59\n", "HISTORY 6.6629532243182), 'TSYS': np.float64(108.43737062628821), 'TDIM7': '(163\n", "HISTORY 84,1,1,1)', 'TUNIT7': 'K', 'CTYPE1': 'FREQ-OBS', 'CRVAL1': 87228489084.0\n", "HISTORY , 'CRPIX1': 8193.0, 'CDELT1': 91552.734375, 'CTYPE2': 'RA', 'CRVAL2': np\n", "HISTORY .float64(148.93912271827946), 'CTYPE3': 'DEC', 'CRVAL3': np.float64(69.6\n", "HISTORY 3322176771119), 'CRVAL4': 1, 'OBSERVER': 'Dom Pesce', 'OBSID': 'unknown'\n", "HISTORY , 'SCAN': 131, 'OBSMODE': 'Nod:NONE:TPNOCAL', 'FRONTEND': 'Rcvr68_92', '\n", "HISTORY TCAL': np.float64(1.0), 'VELDEF': 'OPTI-BAR', 'VFRAME': 5241.16178204364\n", "HISTORY 9, 'RVSYS': 0.0, 'OBSFREQ': 87228489084.0, 'LST': 49886.57916905915, 'AZ\n", "HISTORY IMUTH': 334.4132429832569, 'ELEVATIO': 46.497692750558066, 'TAMBIENT': 2\n", "HISTORY 61.45001220703125, 'PRESSURE': 699.2300046755845, 'HUMIDITY': 0.69099998\n", "HISTORY 47412109, 'RESTFREQ': 87230000000.0, 'DOPFREQ': 86400000000.0, 'FREQRES'\n", "HISTORY : 91552.734375, 'EQUINOX': 2000.0, 'RADESYS': 'FK5', 'TRGTLONG': 148.969\n", "HISTORY 5833333333, 'TRGTLAT': 69.67944444444444, 'SAMPLER': 'B1_0', 'FEED': 1, \n", "HISTORY 'SRFEED': 0, 'FEEDXOFF': 0.0, 'FEEDEOFF': 0.0, 'SUBREF_STATE': 1, 'SIDEB\n", "HISTORY AND': 'U', 'PROCSEQN': 1, 'PROCSIZE': 2, 'PROCSCAN': 'BEAM1', 'PROCTYPE'\n", "HISTORY : 'SIMPLE', 'LASTON': 0, 'LASTOFF': 0, 'TIMESTAMP': '2017_02_04_10:11:43\n", "HISTORY ', 'QD_XEL': -0.0017257548370722825, 'QD_EL': 0.001033652915095047, 'QD_\n", "HISTORY BAD': 0, 'QD_METHOD': 'A', 'VELOCITY': 0.0, 'FOFFREF1': 0.0, 'ZEROCHAN':\n", "HISTORY nan, 'ADCSAMPF': 3000000000.0, 'VSPDELT': 512.0, 'VSPRVAL': 16.0, 'VSPR\n", "HISTORY PIX': 8192.0, 'SIG': 'T', 'CAL': 'F', 'CALTYPE': 'LOW', 'TWARM': 263.183\n", "HISTORY 59375, 'TCOLD': 18.5546875, 'CALPOSITION': 'Observing', 'BACKEND': 'VEGA\n", "HISTORY S', 'PROJID': 'AGBT15B_244_07', 'TELESCOP': 'NRAO_GBT', 'SITELONG': -79.\n", "HISTORY 83983, 'SITELAT': 38.43312, 'SITEELEV': 824.595, 'IFNUM': 1, 'PLNUM': 1,\n", "HISTORY 'FDNUM': 0, 'INT': 0, 'NSAVE': -1, 'HDU': 1, 'BINTABLE': 0, 'ROW': 54, \n", "HISTORY 'SIMPLE': True, 'EXTEND': True, 'DATE': '2025-05-27', 'ORIGIN': 'NRAO Gr\n", "HISTORY een Bank', 'GUIDEVER': 'GBTIDL ver2.10.1', 'FITSVER': '1.9', 'EXTNAME': \n", "HISTORY 'SINGLE DISH', 'CTYPE4': 'STOKES', 'FITSINDEX': 0, 'PROC': 'Nod', 'OBSTY\n", "HISTORY PE': 'NONE', 'SUBOBSMODE': 'TPNOCAL', 'CUNIT1': 'Hz', 'CUNIT2': 'deg', '\n", "HISTORY CUNIT3': 'deg', 'RESTFRQ': np.float64(87230000000.0), 'BUNIT': 'K', 'TSC\n", "HISTORY ALE': 'Ta*', 'NAXIS1': 16384, 'TSCALFAC': np.float64(3.132414901397774),\n", "HISTORY 'AP_EFF': np.float64(0.3501073560210638), 'SURF_ERR': np.float64(230.0)\n", "HISTORY , 'SE_UNIT': 'micron', 'MEANTSYS': np.float64(137.12980829151758), 'WTTS\n", "HISTORY YS': np.float64(137.12980829151758), 'TAU_Z': np.float64(0.0599070411999\n", "HISTORY 9999)},velocity_convention=optical,radial_velocity=0.0 km / s,rest_value\n", "HISTORY =87230000000.0 Hz,observer=,target=,mask=[ True False False ... False False False],) \n", "HISTORY 2026-03-04T18:30:17-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\n", "HISTORY .average(Spectrum (length=16384) Flux=[ nan -0.06004197 -0.185110\n", "HISTORY 69 ... 0.30823558 0.26746191 -0.84623934] K, mean=0.00415 K Spe\n", "HISTORY ctral Axis=[8.64784891e+10 8.64785806e+10 8.64786722e+10 ... \n", "HISTORY 8.79782144e+10 8.79783060e+10 8.79783975e+10] Hz, mean=87228443307.\n", "HISTORY 63281 Hz,) \n", "COMMENT --BEGIN-ASTROPY-SERIALIZED-COLUMNS-- \n", "COMMENT datatype: \n", "COMMENT - {name: spectral_axis, unit: Hz, datatype: float64, description: Spec\\ \n", "COMMENT tral axis} \n", "COMMENT - {name: flux, unit: K, datatype: float64, description: Flux} \n", "COMMENT - {name: uncertainty, datatype: float64, description: Flux uncertainty\\ \n", "COMMENT (was not defined)} \n", "COMMENT - {name: weight, datatype: float64, description: Channel weights} \n", "COMMENT - {name: mask, datatype: int64, description: 'Mask 0=unmasked, 1=maske\\ \n", "COMMENT d'} \n", "COMMENT - {name: baseline, unit: K, datatype: float64, description: Fitted bas\\ \n", "COMMENT eline value at given channel (was not defined)} \n", "COMMENT meta: !!omap \n", "COMMENT - __serialized_columns__: {} \n", "COMMENT --END-ASTROPY-SERIALIZED-COLUMNS-- " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "header" ] }, { "cell_type": "code", "execution_count": 35, "id": "c680fd08-faef-4013-aabf-2a506c4c5fb8", "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "2026-03-04T18:29:47 - Project ID: AGBT15B_244_07\n", "2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.__init__(AGBT15B_244_07.raw.vegas.trim.fits,)\n", "2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:47-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.flag_vegas_spurs()\n", "2026-03-04T18:29:48-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:49-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:50-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:51-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:52-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:53-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:54-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:55-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:56-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:57-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:58-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:29:59-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:00-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:01-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:02-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:03-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:04-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:05-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:06-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:08-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:09-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.apply_flags()\n", "2026-03-04T18:30:09-0500 - DYSH v0.12.1 : dysh.spectra.scan.ScanBlock.__\n", "init__()\n", "2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.fits.gbtfitsload.GBTFITSL\n", "oad.getnod(scan=[131, 133, 135, 137, 139],ifnum=1,plnum=0,t_sys=[[np.flo\n", "at64(108.22387107748688)], [np.float64(143.54009942913794)]],zenith_opac\n", "ity=0.0599070412,units=Ta*,)\n", "2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.spectra.scan.ScanBlock.ti\n", "meaverage()\n", "2026-03-04T18:30:10-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\n", ".__init__(flux=[ -0.07918082 -0.01101417 ... 0.28614683 0.2980\n", "0966 0.64951734] K,wcs=WCS Keywords Number of WCS axes: 4 CTYPE : 'FR\n", "EQ' 'RA' 'DEC' 'STOKES' CRVAL : 87228489084.0 148.94971752154765 69.649\n", "73941003959 -6.0 CRPIX : 8193.0 0.0 0.0 0.0 PC1_1 PC1_2 PC1_3 PC1_4 :\n", " 1.0 0.0 0.0 0.0 PC2_1 PC2_2 PC2_3 PC2_4 : 0.0 1.0 0.0 0.0 PC3_1 PC3_\n", "2 PC3_3 PC3_4 : 0.0 0.0 1.0 0.0 PC4_1 PC4_2 PC4_3 PC4_4 : 0.0 0.0 0.0\n", " 1.0 CDELT : 91552.734375 1.0 1.0 1.0 NAXIS : 16384 0 0 0,meta={'OB\n", "JECT': 'M82', 'BANDWID': 1500000000.0, 'DATE-OBS': '2017-02-04T10:11:43.\n", "00', 'DURATION': np.float64(304.89086151123047), 'EXPOSURE': np.float64(\n", "298.3314766121591), 'TSYS': np.float64(121.02359518771574), 'TDIM7': '(1\n", "6384,1,1,1)', 'TUNIT7': 'K', 'CTYPE1': 'FREQ-OBS', 'CRVAL1': 87228489084\n", ".0, 'CRPIX1': 8193.0, 'CDELT1': 91552.734375, 'CTYPE2': 'RA', 'CRVAL2':\n", "np.float64(148.94971752154765), 'CTYPE3': 'DEC', 'CRVAL3': np.float64(69\n", ".64973941003959), 'CRVAL4': -6, 'OBSERVER': 'Dom Pesce', 'OBSID': 'unkno\n", "wn', 'SCAN': 131, 'OBSMODE': 'Nod:NONE:TPNOCAL', 'FRONTEND': 'Rcvr68_92'\n", ", 'TCAL': np.float64(1.0), 'VELDEF': 'OPTI-BAR', 'VFRAME': 5241.16178204\n", "3649, 'RVSYS': 0.0, 'OBSFREQ': 87228489084.0, 'LST': 49886.57916905915,\n", "'AZIMUTH': 334.4132429832569, 'ELEVATIO': 46.497692750558066, 'TAMBIENT'\n", ": 261.45001220703125, 'PRESSURE': 699.2300046755845, 'HUMIDITY': 0.69099\n", "99847412109, 'RESTFREQ': 87230000000.0, 'DOPFREQ': 86400000000.0, 'FREQR\n", "ES': 91552.734375, 'EQUINOX': 2000.0, 'RADESYS': 'FK5', 'TRGTLONG': 148.\n", "9695833333333, 'TRGTLAT': 69.67944444444444, 'SAMPLER': 'B2_0', 'FEED':\n", "1, 'SRFEED': 0, 'FEEDXOFF': 0.0, 'FEEDEOFF': 0.0, 'SUBREF_STATE': 1, 'SI\n", "DEBAND': 'U', 'PROCSEQN': 1, 'PROCSIZE': 2, 'PROCSCAN': 'BEAM1', 'PROCTY\n", "PE': 'SIMPLE', 'LASTON': 0, 'LASTOFF': 0, 'TIMESTAMP': '2017_02_04_10:11\n", ":43', 'QD_XEL': -0.0017257548370722825, 'QD_EL': 0.001033652915095047, '\n", "QD_BAD': 0, 'QD_METHOD': 'A', 'VELOCITY': 0.0, 'FOFFREF1': 0.0, 'ZEROCHA\n", "N': nan, 'ADCSAMPF': 3000000000.0, 'VSPDELT': 512.0, 'VSPRVAL': 16.0, 'V\n", "SPRPIX': 8192.0, 'SIG': 'T', 'CAL': 'F', 'CALTYPE': 'LOW', 'TWARM': 263.\n", "18359375, 'TCOLD': 18.5546875, 'CALPOSITION': 'Observing', 'BACKEND': 'V\n", "EGAS', 'PROJID': 'AGBT15B_244_07', 'TELESCOP': 'NRAO_GBT', 'SITELONG': -\n", "79.83983, 'SITELAT': 38.43312, 'SITEELEV': 824.595, 'IFNUM': 1, 'PLNUM':\n", " 0, 'FDNUM': 0, 'INT': 0, 'NSAVE': -1, 'HDU': 1, 'BINTABLE': 0, 'ROW': 5\n", "2, 'SIMPLE': True, 'EXTEND': True, 'DATE': '2025-05-27', 'ORIGIN': 'NRAO\n", " Green Bank', 'GUIDEVER': 'GBTIDL ver2.10.1', 'FITSVER': '1.9', 'EXTNAME\n", "': 'SINGLE DISH', 'CTYPE4': 'STOKES', 'FITSINDEX': 0, 'PROC': 'Nod', 'OB\n", "STYPE': 'NONE', 'SUBOBSMODE': 'TPNOCAL', 'CUNIT1': 'Hz', 'CUNIT2': 'deg'\n", ", 'CUNIT3': 'deg', 'RESTFRQ': np.float64(87230000000.0), 'BUNIT': 'K', '\n", "TSCALE': 'Ta*', 'NAXIS1': 16384, 'TSCALFAC': np.float64(3.13241490139777\n", "4), 'AP_EFF': np.float64(0.35010735602106374), 'SURF_ERR': np.float64(22\n", "9.99999999999994), 'SE_UNIT': 'micron', 'MEANTSYS': np.float64(108.22387\n", "107748688), 'WTTSYS': np.float64(108.22387107748688), 'TAU_Z': np.float6\n", "4(0.05990704119999998)},velocity_convention=optical,radial_velocity=0.0\n", "km / s,rest_value=87230000000.0 Hz,observer=,target=,mask=[ True False False ... False False False]\n", ",)\n", "2026-03-04T18:30:16-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\n", ".baseline(15,model=poly,exclude=[(, ), (, ), (, )],remove=True,)\n", "2026-03-04T18:30:17-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\n", ".__init__(flux=[ -0.38167784 -0.42788408 ... 0.29981571 0.2810\n", "8434 -0.23835116] K,wcs=WCS Keywords Number of WCS axes: 4 CTYPE : 'FR\n", "EQ' 'RA' 'DEC' 'STOKES' CRVAL : 87228489084.0 148.93912271827946 69.633\n", "22176771119 1.0 CRPIX : 8193.0 0.0 0.0 0.0 PC1_1 PC1_2 PC1_3 PC1_4 :\n", "1.0 0.0 0.0 0.0 PC2_1 PC2_2 PC2_3 PC2_4 : 0.0 1.0 0.0 0.0 PC3_1 PC3_2\n", " PC3_3 PC3_4 : 0.0 0.0 1.0 0.0 PC4_1 PC4_2 PC4_3 PC4_4 : 0.0 0.0 0.0\n", "1.0 CDELT : 91552.734375 1.0 1.0 1.0 NAXIS : 16384 0 0 0,meta={'OBJ\n", "ECT': 'M82', 'BANDWID': 1500000000.0, 'DATE-OBS': '2017-02-04T10:11:43.0\n", "0', 'DURATION': np.float64(609.7817230224609), 'EXPOSURE': np.float64(59\n", "6.6629532243182), 'TSYS': np.float64(108.43737062628821), 'TDIM7': '(163\n", "84,1,1,1)', 'TUNIT7': 'K', 'CTYPE1': 'FREQ-OBS', 'CRVAL1': 87228489084.0\n", ", 'CRPIX1': 8193.0, 'CDELT1': 91552.734375, 'CTYPE2': 'RA', 'CRVAL2': np\n", ".float64(148.93912271827946), 'CTYPE3': 'DEC', 'CRVAL3': np.float64(69.6\n", "3322176771119), 'CRVAL4': 1, 'OBSERVER': 'Dom Pesce', 'OBSID': 'unknown'\n", ", 'SCAN': 131, 'OBSMODE': 'Nod:NONE:TPNOCAL', 'FRONTEND': 'Rcvr68_92', '\n", "TCAL': np.float64(1.0), 'VELDEF': 'OPTI-BAR', 'VFRAME': 5241.16178204364\n", "9, 'RVSYS': 0.0, 'OBSFREQ': 87228489084.0, 'LST': 49886.57916905915, 'AZ\n", "IMUTH': 334.4132429832569, 'ELEVATIO': 46.497692750558066, 'TAMBIENT': 2\n", "61.45001220703125, 'PRESSURE': 699.2300046755845, 'HUMIDITY': 0.69099998\n", "47412109, 'RESTFREQ': 87230000000.0, 'DOPFREQ': 86400000000.0, 'FREQRES'\n", ": 91552.734375, 'EQUINOX': 2000.0, 'RADESYS': 'FK5', 'TRGTLONG': 148.969\n", "5833333333, 'TRGTLAT': 69.67944444444444, 'SAMPLER': 'B1_0', 'FEED': 1,\n", "'SRFEED': 0, 'FEEDXOFF': 0.0, 'FEEDEOFF': 0.0, 'SUBREF_STATE': 1, 'SIDEB\n", "AND': 'U', 'PROCSEQN': 1, 'PROCSIZE': 2, 'PROCSCAN': 'BEAM1', 'PROCTYPE'\n", ": 'SIMPLE', 'LASTON': 0, 'LASTOFF': 0, 'TIMESTAMP': '2017_02_04_10:11:43\n", "', 'QD_XEL': -0.0017257548370722825, 'QD_EL': 0.001033652915095047, 'QD_\n", "BAD': 0, 'QD_METHOD': 'A', 'VELOCITY': 0.0, 'FOFFREF1': 0.0, 'ZEROCHAN':\n", " nan, 'ADCSAMPF': 3000000000.0, 'VSPDELT': 512.0, 'VSPRVAL': 16.0, 'VSPR\n", "PIX': 8192.0, 'SIG': 'T', 'CAL': 'F', 'CALTYPE': 'LOW', 'TWARM': 263.183\n", "59375, 'TCOLD': 18.5546875, 'CALPOSITION': 'Observing', 'BACKEND': 'VEGA\n", "S', 'PROJID': 'AGBT15B_244_07', 'TELESCOP': 'NRAO_GBT', 'SITELONG': -79.\n", "83983, 'SITELAT': 38.43312, 'SITEELEV': 824.595, 'IFNUM': 1, 'PLNUM': 1,\n", " 'FDNUM': 0, 'INT': 0, 'NSAVE': -1, 'HDU': 1, 'BINTABLE': 0, 'ROW': 54,\n", "'SIMPLE': True, 'EXTEND': True, 'DATE': '2025-05-27', 'ORIGIN': 'NRAO Gr\n", "een Bank', 'GUIDEVER': 'GBTIDL ver2.10.1', 'FITSVER': '1.9', 'EXTNAME':\n", "'SINGLE DISH', 'CTYPE4': 'STOKES', 'FITSINDEX': 0, 'PROC': 'Nod', 'OBSTY\n", "PE': 'NONE', 'SUBOBSMODE': 'TPNOCAL', 'CUNIT1': 'Hz', 'CUNIT2': 'deg', '\n", "CUNIT3': 'deg', 'RESTFRQ': np.float64(87230000000.0), 'BUNIT': 'K', 'TSC\n", "ALE': 'Ta*', 'NAXIS1': 16384, 'TSCALFAC': np.float64(3.132414901397774),\n", " 'AP_EFF': np.float64(0.3501073560210638), 'SURF_ERR': np.float64(230.0)\n", ", 'SE_UNIT': 'micron', 'MEANTSYS': np.float64(137.12980829151758), 'WTTS\n", "YS': np.float64(137.12980829151758), 'TAU_Z': np.float64(0.0599070411999\n", "9999)},velocity_convention=optical,radial_velocity=0.0 km / s,rest_value\n", "=87230000000.0 Hz,observer=,target=,mask=[ True False False ... False False False],)\n", "2026-03-04T18:30:17-0500 - DYSH v0.12.1 : dysh.spectra.spectrum.Spectrum\n", ".average(Spectrum (length=16384) Flux=[ nan -0.06004197 -0.185110\n", "69 ... 0.30823558 0.26746191 -0.84623934] K, mean=0.00415 K Spe\n", "ctral Axis=[8.64784891e+10 8.64785806e+10 8.64786722e+10 ...\n", " 8.79782144e+10 8.79783060e+10 8.79783975e+10] Hz, mean=87228443307.\n", "63281 Hz,)" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "header[\"HISTORY\"]" ] }, { "cell_type": "markdown", "id": "55a692ad-4813-4dd7-bdc8-8e61a02c0c55", "metadata": {}, "source": [ "The data table contains the spectral axis, flux, mask and other columns which are not used at the moment. For example, if we want to plot the data we can use the following" ] }, { "cell_type": "code", "execution_count": 36, "id": "8dc48086-0031-42e2-bd51-7513ef44163f", "metadata": { "scrolled": true }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/teuben/GBT/dyshp/dysh/.venv/lib/python3.13/site-packages/traitlets/traitlets.py:1385: DeprecationWarning: Passing unrecognized arguments to super(Toolbar).__init__().\n", "NavigationToolbar2WebAgg.__init__() missing 1 required positional argument: 'canvas'\n", "This is deprecated in traitlets 4.2.This error will be raised in a future release of traitlets.\n", " warn(\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2ec5212f47bd4cf9b0f7d4b9cb17f0a0", "version_major": 2, "version_minor": 0 }, "image/png": "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nz56/fXXFRERoeXLl6tTp04aP358KVcOAAAAAHCUMtkFetOmTWrZsuVlP79z587666+/tHnz5uIrCgAAAADg1MpkC/CVhN/cWrVqVSyvAwAAAABwfmUyAAMAAAAAcKkIwAAAAAAAUyiTATghIeGyn7tp06ZirAQAAAAAUFaUyQDcrVs3HT9+/JKek5KSoieffFIdOnQooaoAAAAAAM6sTAbgbdu2qVOnTjpw4ECR1l+yZImaNWumd955R5mZmSVcHQAAAADAGZXJAPzss88qMjJSXbp00caNGwtcLz4+XuPGjVOfPn0UERGhunXr6p9//inFSgEAAAAAzqJMBuBXX31VH3zwgU6dOqVevXppwYIF+daZOXOmGjdurGnTpsnd3V3PPfecdu7cqb59+zqgYgAAAACAo5XJACxJDzzwgH788Uelpqbq+uuv148//ihJOnbsmIYOHaqbb75ZR48eVffu3bV161a98sor8vT0dHDVAAAAAABHcXN0AVfi5ptvVsWKFTVo0CCNGjVKixYt0syZMxUXF6fKlStrypQpGjVqlKPLBAAAAAA4gTLbApyjV69e+vfff1WpUiVNmzZN8fHxuvPOO7Vnzx7CLwAAAADAqswHYElq1aqVVq9erbCwMEmSYRgKCgpybFEAAAAAAKdSJrtAT5w40e7ya665RhEREfryyy8VHR2tTp062V3vxRdfLMnyAAAAAABOqEwG4AkTJshisdh9zDAMSdL8+fPzzQ5tGIYsFgsBGAAAAABMqEwG4P/7v/8rMAADAAAAAGBPmQzAX3/9taNLAAAAAACUMeViEiwAAAAAAC6GAAwAAAAAMAUCMAAAAADAFAjAAAAAAABTKJMBuG3btvr777+v6DVmzZqlNm3aFFNFKMsMRxcAAAAAoFSUyQCclJSkG264Qc2bN9eUKVMUExNTpOdFR0frzTffVNOmTTVo0CClpqaWcKUAAAAAAGdRJm+DtH37dn3++eeaOHGixo8fr6eeekp169ZV+/btFR4ergoVKsjf318JCQk6ffq09uzZo7Vr1yoqKkqGYahatWr65JNPNG7cOEe/FQAAAABAKSmTAdjV1VX33HOPxo4dq19//VWfffaZVqxYoYMHD0qSLBaLdV3DMKzP6dmzp+666y4NHjxY7u7uDqkdAAAAAOAYZTIA53B3d9fw4cM1fPhwnT17VqtW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", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", " \n", "
\n", " " ], "text/plain": [ "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = data[\"spectral_axis\"]*1e-9 # Convert to GHz.\n", "y = np.ma.masked_where(data[\"mask\"], data[\"flux\"]) # We need to mask the flux values.\n", "plt.figure(dpi=150)\n", "plt.plot(x, y)\n", "plt.ylabel(r\"$T_{A}^{*}$ (K)\")\n", "plt.xlabel(r\"Frequency (GHz)\")\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "14e2c702-25e9-41aa-a235-eba99f84dafb", "metadata": {}, "source": [ "## Final Stats\n", "\n", "Finally, at the end we compute some statistics over a spectrum, merely as a checksum if the notebook is reproducible.\n" ] }, { "cell_type": "code", "execution_count": 37, "id": "e606e03e-6203-49b6-b730-5184caf2370d", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "18:30:18.384 I Note: found 92 NaN (masked) values\n", "18:30:18.385 I rms is OK \n" ] } ], "source": [ "read_spec_smo.check_stats(0.04375961 * u.K)" ] }, { "cell_type": "code", "execution_count": 38, "id": "2fdd5891-3607-4369-8e83-a9a693d22d1d", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "18:30:18.622 I Note: found 20 NaN (masked) values\n" ] }, { "data": { "text/plain": [ "np.float64(1.0398178385707268)" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# radiometer on one pre-Ta* corrected window\n", "nod_ta[0,0][2000:7000].radiometer(roll=1) # 1.0398" ] } ], "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.11.6" } }, "nbformat": 4, "nbformat_minor": 5 }