Calibration Without Noise Diodes (calseq)#

This tutorial shows how to use 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, Argus, the command used to compute the system temperature is GBTFITSLoad.vanecal, because Argus uses a vane instead of a wheel. An example showing how to use vanecal will be provided elsewhere.

The data in this example contains observations of M82 using the Nod observing procedure.

You can find a copy of this tutorial as a Jupyter notebook here or download it by right clicking here and selecting “Save Link As”.

Loading Modules#

We start by loading the modules we will use for the data reduction.

For display purposes, we use the static (non-interactive) matplotlib backend in this tutorial. However, you can tell matplotlib to use the ipympl backend to enable interactive plots. This is only needed if working on jupyter lab or notebook.

# Set interactive plots in jupyter.
#%matplotlib ipympl

# These modules are required for the data reduction.
from dysh.fits import GBTFITSLoad
from astropy import units as u
import numpy as np
import matplotlib.pyplot as plt

# These modules are only used to download the data.
from pathlib import Path
from dysh.util.download import from_url

Data Retrieval#

Download the example SDFITS data, if necessary.

url = "http://www.gb.nrao.edu/dysh/example_data/nod-W/data/AGBT15B_244_07.raw.vegas.trim.fits"
savepath = Path.cwd() / "data"
savepath.mkdir(exist_ok=True) # Create the data directory if it does not exist.
filename = from_url(url, savepath)

Data Loading#

Next, we use GBTFITSLoad to load the data, and then its summary method to inspect its contents.

sdfits = GBTFITSLoad(filename)
sdfits.summary()
SCAN OBJECT VELOCITY PROC PROCSEQN RESTFREQ DOPFREQ # IF # POL # INT # FEED AZIMUTH ELEVATION
130 M82 0.0 CALSEQ 1 87.645 86.4 4 2 3 2 334.3782 46.5595
131 M82 0.0 Nod 1 87.645 86.4 4 2 1 2 334.3555 46.4977
132 M82 0.0 Nod 2 87.645 86.4 4 2 1 2 334.4400 46.3994
133 M82 0.0 Nod 1 87.645 86.4 4 2 1 2 334.2819 46.2979
134 M82 0.0 Nod 2 87.645 86.4 4 2 1 2 334.3704 46.1996
135 M82 0.0 Nod 1 87.645 86.4 4 2 1 2 334.2152 46.0993
136 M82 0.0 Nod 2 87.645 86.4 4 2 1 2 334.3061 46.0009
137 M82 0.0 Nod 1 87.645 86.4 4 2 1 2 334.1520 45.9003
138 M82 0.0 Nod 2 87.645 86.4 4 2 1 2 334.2438 45.8002
139 M82 0.0 Nod 1 87.645 86.4 4 2 1 2 334.0929 45.6982
140 M82 0.0 Nod 2 87.645 86.4 4 2 1 2 334.1845 45.5991
141 M82 0.0 CALSEQ 1 87.645 86.4 4 2 3 2 334.0287 45.4683

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.

Data Reduction#

System Temperature#

To calibrate the data we need to know the system temperature during the observations. We use the 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.

fdnums = sdfits.udata("FDNUM") # Feeds.
ifnums = sdfits.udata("IFNUM") # Spectral windows.
plnums = sdfits.udata("PLNUM") # Polarizations. 
cscans = [130, 141] # calseq scan numbers.

# Create an array to store the system temperature for each combination.
tsys = np.empty((len(cscans), len(fdnums), len(plnums), len(ifnums)), dtype=float)

# Loop over the combinations.
for s,scan in enumerate(cscans):
    for f,fdnum in enumerate(fdnums):
        for p,plnum in enumerate(plnums):
            for i,ifnum in enumerate(ifnums):
                tsys[s,f,p,i], _ = sdfits.calseq(scan=scan, fdnum=fdnum, plnum=plnum, ifnum=ifnum)

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.

np.diff(tsys, axis=0)/np.mean(tsys, axis=0)*100
array([[[[2.07996041, 2.02069088, 2.01024058, 1.98262645],
         [2.23058483, 2.34203283, 1.97049038, 1.88568961]],

        [[2.18532318, 2.10310376, 2.07058868, 2.0877803 ],
         [2.25814277, 2.1933681 , 2.21046665, 2.12652005]]]])

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.

tsys = np.mean(tsys, axis=0)

Nod Calibration#

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.

The spectra we will save are Spectrum objects, so we set the data type, dtype, of the array to object.

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.

nod_ta = np.empty((len(plnums), len(ifnums)), dtype=object)
nod_scans = [131, 133, 135, 137, 139]

for p,plnum in enumerate(plnums):
    for i,ifnum in enumerate(ifnums):
        # Extract the system temperature for both feeds for this polarization and spectral window.
        t_sys = [[t] for t in tsys[:,p,i]]
        # Call the calibration function.
        nod_ta[p,i] = sdfits.getnod(scan=nod_scans, ifnum=ifnum, plnum=plnum, t_sys=t_sys).timeaverage()

Inspecting the Calibrated Data#

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.

In the following cells we will plot one polarization for the individual spectral windows.

nod_ta[0,0].plot()
<dysh.plot.specplot.SpectrumPlot at 0x7d3296a8d240>
../../_images/44e226fd02b559b85b8457cd2a11cba9123dfe02de4fe0c314ae8ed32c595a48.png
nod_ta[0,1].plot()
<dysh.plot.specplot.SpectrumPlot at 0x7d328d2d25f0>
../../_images/bfdbdfa8ef832ee493ca36d373b10bc108c57668cfcdb810384586c754c0a7b1.png
nod_ta[0,2].plot()
<dysh.plot.specplot.SpectrumPlot at 0x7d3294c9e3b0>
../../_images/a9eb3aec1b4686c38935db9ea9e751af2d61e1a83bc21ba80aa365e3ed38c86a.png
nod_ta[0,3].plot()
<dysh.plot.specplot.SpectrumPlot at 0x7d3294ceb2b0>
../../_images/57c2145b747fefed4f5d7918aa669c53194170018f1fb112045abd5d7aeb767d.png

Now we will plot all of the spectral windows in a single figure. Since we are using matplotlib and it does not know about the units, we must set the labels by hand.

fig = plt.figure(dpi=150)
fig.suptitle("PLNUM=0")
ax = fig.add_subplot(111)
for t in nod_ta[0]:
    # Use an alpha of less than one to see the overlapping regions.
    ax.plot(t.spectral_axis.to("GHz"), t.flux, alpha=0.5, label=f"IFNUM={t.meta['IFNUM']}")
# Show a legend.
ax.legend()
# Limit y-range to focus on data.
ax.set_ylim(0, 0.4)
# Set axis labels by hand.
ax.set_xlabel("Frequency (GHz)")
ax.set_ylabel(f"Antenna temperature ({t.flux.unit})");
../../_images/41968200e9c3645f8a71e1d845d66e5d53e20d5feca5c7398afdbbdf605356af.png
fig = plt.figure(dpi=150)
fig.suptitle("PLNUM=1")
ax = fig.add_subplot(111)
for t in nod_ta[1]:
    # Use an alpha of less than one to see the overlapping regions.
    ax.plot(t.spectral_axis.to("GHz"), t.flux, alpha=0.5, label=f"IFNUM={t.meta['IFNUM']}")
# Show a legend.
ax.legend()
# Limit y-range to focus on data.
ax.set_ylim(0, 0.4)
# Set axis labels by hand.
ax.set_xlabel("Frequency (GHz)")
ax.set_ylabel(f"Antenna temperature ({t.flux.unit})");
../../_images/56a914c3777404877f5a98fad11add646783e1ca3d2271b072fc2fc2fcf1f356.png

We see that spectral windows 1, 2 and 3 have strong detections of spectral lines. We focus on these spectral windows from now on.

nod_ta_lines = nod_ta[:,[1,2,3]]

Baseline Subtraction#

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.

# Define baseline parameters.
order = 15
model = "poly"
edge = 500
exclude = {1: [(nod_ta_lines[0,0].spectral_axis.quantity.min().to("GHz"), 
                nod_ta_lines[0,0].spectral_axis.quantity[edge].to("GHz")),
               (87.2*u.GHz, 87.3*u.GHz),
               (nod_ta_lines[0,0].spectral_axis.quantity[-edge].to("GHz"), 
                nod_ta_lines[0,0].spectral_axis.quantity.max().to("GHz")),
              ],
           2: [(nod_ta_lines[0,1].spectral_axis.quantity.min().to("GHz"), 
                nod_ta_lines[0,1].spectral_axis.quantity[edge].to("GHz")),
               (88.5*u.GHz, 88.65*u.GHz), 
               (nod_ta_lines[0,1].spectral_axis.quantity[-edge].to("GHz"), 
                nod_ta_lines[0,1].spectral_axis.quantity.max().to("GHz"))
              ],
           3: [(nod_ta_lines[0,2].spectral_axis.quantity.min().to("GHz"), 
                nod_ta_lines[0,2].spectral_axis.quantity[edge].to("GHz")),
               (88.5*u.GHz, 88.7*u.GHz), 
               (89*u.GHz, 89.23*u.GHz),
               (nod_ta_lines[0,2].spectral_axis.quantity[-edge].to("GHz"), 
                nod_ta_lines[0,2].spectral_axis.quantity.max().to("GHz"))
              ],
          }
# Loop over spectra and remove the baseline.
for nod_ta_lines_p in nod_ta_lines:
    for spec in nod_ta_lines_p:
        spec.baseline(order, model=model, exclude=exclude[spec.meta["IFNUM"]], remove=True)

Plot again after removing the baseline.

fig = plt.figure(dpi=150)
fig.suptitle("PLNUM=0")
ax = fig.add_subplot(111)
for t in nod_ta_lines[0]:
    # Use an alpha of less than one to see the overlapping regions.
    ax.plot(t.spectral_axis.to("GHz"), t.flux, alpha=0.5, label=f"IFNUM={t.meta['IFNUM']}")
# Show a legend.
ax.legend()
# Limit y-range to focus on data.
ax.set_ylim(-0.4, 0.4)
# Set axis labels by hand.
ax.set_xlabel("Frequency (GHz)")
ax.set_ylabel(f"Antenna temperature ({t.flux.unit})");
../../_images/b184e33e3ccc62796ace8a5cc0912ca8dace5918acab16b1a8a26be0b80dd7bc.png
fig = plt.figure(dpi=150)
fig.suptitle("PLNUM=1")
ax = fig.add_subplot(111)
for t in nod_ta_lines[1]:
    # Use an alpha of less than one to see the overlapping regions.
    ax.plot(t.spectral_axis.to("GHz"), t.flux, alpha=0.5, label=f"IFNUM={t.meta['IFNUM']}")
# Show a legend.
ax.legend()
# Limit y-range to focus on data.
ax.set_ylim(-0.4, 0.4)
# Set axis labels by hand.
ax.set_xlabel("Frequency (GHz)")
ax.set_ylabel(f"Antenna temperature ({t.flux.unit})");
../../_images/e9c53940f1ee9784fe2ebdfae578cc57d98d211ad8986bae171656df3227d62d.png

Correcting for Atmospheric Opacity#

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), Kramer (1997) and Frayer et al. (2019).

If you are working inside the GBO network, in one of the GBO data reduction hosts, then you can use the convenience functions incorporated into dysh to retrieve atmospheric opacity.

from dysh.util.weatherforecast import GBTWeatherForecast
gbwf = GBTWeatherForecast()
spec = nod_ta_lines[0,0]
mjd, freq, tau = gbwf.fetch(vartype="Opacity", 
                            specval=spec.spectral_axis.quantity.mean(), 
                            mjd=spec.obstime.mjd
                           )

If you are not working at GBO, then you can follow these instructions to figure out the opacity.

If you do not have access to the GBO computing environment, you can use the NRAO helpdesk to ask for opacity values for the GBT. Please specify the dates (accurate to the hour) and frequencies for which you require opacities.

Here we will use the following values, in a dictionary with keys corresponding to the spectral window (IFNUM).

tau = {0: 6.28488304e-02,
       1: 5.99070412e-02,
       2: 5.73315943e-02,
       3: 5.51805677e-02
      }

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.

nod_ta_star = np.empty((len(plnums), len(ifnums)), dtype=object)
nod_scans = [131, 133, 135, 137, 139]

for p,plnum in enumerate(plnums):
    for i,ifnum in enumerate(ifnums):
        # Extract the system temperature for both feeds for this polarization and spectral window.
        t_sys = [[t] for t in tsys[:,p,i]]
        # Call the calibration function.
        nod_ta_star[p,i] = sdfits.getnod(scan=nod_scans, ifnum=ifnum, plnum=plnum, 
                                         t_sys=t_sys, 
                                         zenith_opacity=tau[ifnum],
                                         units="Ta*"
                                        ).timeaverage()

Note: there is a known bug, where the y-axis will still show antenna temperature, \(T_{A}\), as the y-axis label even after calibrating to \(T_{A}^{*}\). The bug is being tracked here. For now, we specify the y-axis label by hand:

nod_ta_star[0,0].plot(ylabel=r"$T_{A}^{*}$ (K)")
<dysh.plot.specplot.SpectrumPlot at 0x7d329564f970>
../../_images/607b11bb22c9cfa0911391c7a437adf3095da34cd4edff1aa53ac08ecef5fc6b.png

Now we repeat the baseline subtraction on the spectral windows that show emission lines.

nod_ta_star_lines = nod_ta_star[:,[1,2,3]]
for nod_ta_star_lines_p in nod_ta_star_lines:
    for spec in nod_ta_star_lines_p:
        spec.baseline(order, model=model, exclude=exclude[spec.meta["IFNUM"]], remove=True)
fig = plt.figure(dpi=150)
fig.suptitle("PLNUM=0")
ax = fig.add_subplot(111)
for t in nod_ta_star_lines[0]:
    # Use an alpha of less than one to see the overlapping regions.
    ax.plot(t.spectral_axis.to("GHz"), t.flux, alpha=0.5, label=f"IFNUM={t.meta['IFNUM']}")
# Show a legend.
ax.legend()
# Limit y-range to focus on data.
ax.set_ylim(-0.4, 0.9)
# Set axis labels by hand.
ax.set_xlabel("Frequency (GHz)")
ax.set_ylabel(fr"$T_{{A}}^{{*}}$ ({t.flux.unit})");
../../_images/aeff770b822512dd8c0620d9cfd85387c2668d337dca156af7cb7d1b33e0cdba.png
fig = plt.figure(dpi=150)
fig.suptitle("PLNUM=1")
ax = fig.add_subplot(111)
for t in nod_ta_star_lines[1]:
    # Use an alpha of less than one to see the overlapping regions.
    ax.plot(t.spectral_axis.to("GHz"), t.flux, alpha=0.5, label=f"IFNUM={t.meta['IFNUM']}")
# Show a legend.
ax.legend()
# Limit y-range to focus on data.
ax.set_ylim(-0.4, 0.9)
# Set axis labels by hand.
ax.set_xlabel("Frequency (GHz)")
ax.set_ylabel(fr"$T_{{A}}^{{*}}$ ({t.flux.unit})");
../../_images/e20295a04a26518b2e099f707a0deb6aa035a1044689c8417463b5c28e938e93.png

Polarization Average#

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.

We create a new array ta_star_pol_ave where we store the polarization averages, and then we loop over the spectra averaging polarizations.

ta_star_pol_ave = np.empty(nod_ta_star_lines.shape[1], dtype=object)

for i in range(nod_ta_star_lines.shape[1]):
    ta_star_pol_ave[i] = nod_ta_star_lines[0,i].average(nod_ta_star_lines[1,i])

Plot the polarization averages.

fig = plt.figure(dpi=150)
fig.suptitle("Polarization Average")
ax = fig.add_subplot(111)
for t in ta_star_pol_ave:
    # Use an alpha of less than one to see the overlapping regions.
    ax.plot(t.spectral_axis.to("GHz"), t.flux, alpha=0.5, label=f"IFNUM={t.meta['IFNUM']}")
# Show a legend.
ax.legend()
# Limit y-range to focus on data.
ax.set_ylim(-0.4, 0.9)
# Set axis labels by hand.
ax.set_xlabel("Frequency (GHz)")
ax.set_ylabel(fr"$T_{{A}}^{{*}}$ ({t.flux.unit})");
../../_images/d1b48259ca5e8380225781492aa9847908ac51a8933cff4325c1a72e346509bd.png

Saving the Calibrated Spectra#

Now that we have calibrated our data correcting for atmospheric opacity we save it to FITS files.

First, we create an output directory in the current directory.

products_path = Path.cwd() / "output"
products_path.mkdir(exist_ok=True) 

Now loop over spectral windows saving the data.

for spec in ta_star_pol_ave:
    fnm_out = products_path / f"M82_ifnum_{spec.meta['IFNUM']}_polavg.fits"
    spec.write(fnm_out, format="fits", overwrite=True)
WARNING: Attribute `ZEROCHAN` of type <class 'float'> cannot be added to FITS Header - skipping [astropy.io.fits.convenience]
WARNING: Attribute `ZEROCHAN` of type <class 'float'> cannot be added to FITS Header - skipping [astropy.io.fits.convenience]
WARNING: Attribute `ZEROCHAN` of type <class 'float'> cannot be added to FITS Header - skipping [astropy.io.fits.convenience]

The data is now in FITS tables.

Loading the Calibrated Spectra#

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).

Reading with dysh#

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.

from dysh.spectra import Spectrum
read_spec = Spectrum.read(products_path / "M82_ifnum_1_polavg.fits", format="fits")

The result is a Spectrum object, with all its capabilities.

read_spec_smo = read_spec.smooth("gauss", 16)
read_spec_smo.plot()
<dysh.plot.specplot.SpectrumPlot at 0x7d32956c07c0>
../../_images/3a7ff76b4d25341a48071a955dda5e91d3b1b7fab187ff438aa5a9fc685f6e1e.png

Even the history is available, albeit not easy to read.

read_spec.history
['2026-01-14T21:04:20+0000 - DYSH v0.11.5 : 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 : np.float64(87228489084.0) np.float64(148.93912271827946) np.float64(69.6332217677112) np.float64(1.0)  CRPIX : np.float64(8193.0) np.float64(0.0) np.float64(0.0) np.float64(0.0)  PC1_1 PC1_2 PC1_3 PC1_4  : np.float64(1.0) np.float64(0.0) np.float64(0.0) np.float64(0.0)  PC2_1 PC2_2 PC2_3 PC2_4  : np.float64(0.0) np.float64(1.0) np.float64(0.0) np.float64(0.0)  PC3_1 PC3_2 PC3_3 PC3_4  : np.float64(0.0) np.float64(0.0) np.float64(1.0) np.float64(0.0)  PC4_1 PC4_2 PC4_3 PC4_4  : np.float64(0.0) np.float64(0.0) np.float64(0.0) np.float64(1.0)  CDELT : np.float64(91552.734375) np.float64(1.0) np.float64(1.0) np.float64(1.0)  NAXIS : 16384  0  0  0,meta=OrderedDict([(\'OBJECT\', \'M82\'), (\'BANDWID\', 1500000000.0), (\'DATE-OBS\', \'2017-02-04T10:11:43.00\'), (\'DURATION\', 609.7817230224609), (\'EXPOSURE\', 596.6629532243182), (\'TSYS\', 108.4373706262882), (\'CTYPE1\', \'FREQ-OBS\'), (\'CRVAL1\', 87228489084.0), (\'CRPIX1\', 8193.0), (\'CDELT1\', 91552.734375), (\'CTYPE2\', \'RA\'), (\'CRVAL2\', 148.93912271827946), (\'CTYPE3\', \'DEC\'), (\'CRVAL3\', 69.6332217677112), (\'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.35010735602106374), (\'SURF_ERR\', 230.0), (\'SE_UNIT\', \'micron\'), (\'MEANTSYS\', 137.12980829151758), (\'WTTSYS\', 137.12980829151758), (\'TAU_Z\', 0.059907041200000004), (\'HISTORY\', [\'2026-01-14T21:03:12 - Project ID: AGBT15B_244_07\', \'2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.__init__(/home/docs/checkouts/readthedocs.org/user_builds/dysh/check\', \'outs/release-0.11.5/docs/source/tutorials/examples/data/AGBT15B_244_07.r\', \'aw.vegas.trim.fits,)\', \'2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.flag_vegas_spurs()\', \'2026-01-14T21:03:13+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:14+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:15+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:16+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:17+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:18+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:19+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:20+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:21+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:22+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:23+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:24+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:25+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:26+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:27+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:28+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:29+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:30+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:31+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:32+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:33+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:34+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:35+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:36+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:37+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:38+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:39+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:41+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:43+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:45+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:48+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:50+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:52+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:03:54+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:04:00+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:04:02+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL\', \'oad.apply_flags()\', \'2026-01-14T21:04:02+0000 - DYSH v0.11.5 : dysh.spectra.scan.ScanBlock.__\', \'init__()\', \'2026-01-14T21:04:03+0000 - DYSH v0.11.5 : 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-01-14T21:04:04+0000 - DYSH v0.11.5 : dysh.spectra.scan.ScanBlock.ti\', \'meaverage()\', \'2026-01-14T21:04:04+0000 - DYSH v0.11.5 : 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 : np.float64(87228489084.0) np.float64(14", \'8.94971752154765) np.float64(69.64973941003959) np.float64(-6.0)  CRPIX\', \': np.float64(8193.0) np.float64(0.0) np.float64(0.0) np.float64(0.0)  PC\', \'1_1 PC1_2 PC1_3 PC1_4  : np.float64(1.0) np.float64(0.0) np.float64(0.0)\', \' np.float64(0.0)  PC2_1 PC2_2 PC2_3 PC2_4  : np.float64(0.0) np.float64(\', \'1.0) np.float64(0.0) np.float64(0.0)  PC3_1 PC3_2 PC3_3 PC3_4  : np.floa\', \'t64(0.0) np.float64(0.0) np.float64(1.0) np.float64(0.0)  PC4_1 PC4_2 PC\', \'4_3 PC4_4  : np.float64(0.0) np.float64(0.0) np.float64(0.0) np.float64(\', \'1.0)  CDELT : np.float64(91552.734375) np.float64(1.0) np.float64(1.0) n\', "p.float64(1.0)  NAXIS : 16384  0  0  0,meta={\'OBJECT\': \'M82\', \'BANDWID\':", " 1500000000.0, \'DATE-OBS\': \'2017-02-04T10:11:43.00\', \'DURATION\': np.floa", "t64(304.89086151123047), \'EXPOSURE\': np.float64(298.3314766121591), \'TSY", "S\': np.float64(121.02359518771574), \'TDIM7\': \'(16384,1,1,1)\', \'TUNIT7\':", "\'K\', \'CTYPE1\': \'FREQ-OBS\', \'CRVAL1\': 87228489084.0, \'CRPIX1\': 8193.0, \'C", "DELT1\': 91552.734375, \'CTYPE2\': \'RA\', \'CRVAL2\': np.float64(148.949717521", "54765), \'CTYPE3\': \'DEC\', \'CRVAL3\': np.float64(69.64973941003959), \'CRVAL", "4\': -6, \'OBSERVER\': \'Dom Pesce\', \'OBSID\': \'unknown\', \'SCAN\': 131, \'OBSMO", "DE\': \'Nod:NONE:TPNOCAL\', \'FRONTEND\': \'Rcvr68_92\', \'TCAL\': np.float64(1.0", "), \'VELDEF\': \'OPTI-BAR\', \'VFRAME\': 5241.161782043649, \'RVSYS\': 0.0, \'OBS", "FREQ\': 87228489084.0, \'LST\': 49886.57916905915, \'AZIMUTH\': 334.413242983", "2569, \'ELEVATIO\': 46.497692750558066, \'TAMBIENT\': 261.45001220703125, \'P", "RESSURE\': 699.2300046755845, \'HUMIDITY\': 0.6909999847412109, \'RESTFREQ\':", " 87230000000.0, \'DOPFREQ\': 86400000000.0, \'FREQRES\': 91552.734375, \'EQUI", "NOX\': 2000.0, \'RADESYS\': \'FK5\', \'TRGTLONG\': 148.9695833333333, \'TRGTLAT\'", ": 69.67944444444444, \'SAMPLER\': \'B2_0\', \'FEED\': 1, \'SRFEED\': 0, \'FEEDXOF", "F\': 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.00172", "57548370722825, \'QD_EL\': 0.001033652915095047, \'QD_BAD\': 0, \'QD_METHOD\':", " \'A\', \'VELOCITY\': 0.0, \'FOFFREF1\': 0.0, \'ZEROCHAN\': nan, \'ADCSAMPF\': 300", "0000000.0, \'VSPDELT\': 512.0, \'VSPRVAL\': 16.0, \'VSPRPIX\': 8192.0, \'SIG\':", "\'T\', \'CAL\': \'F\', \'CALTYPE\': \'LOW\', \'TWARM\': 263.18359375, \'TCOLD\': 18.55", "46875, \'CALPOSITION\': \'Observing\', \'BACKEND\': \'VEGAS\', \'PROJID\': \'AGBT15", "B_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\': 52, \'SIMPLE\': True, \'EXTE", "ND\': True, \'DATE\': \'2025-05-27\', \'ORIGIN\': \'NRAO Green Bank\', \'GUIDEVER\'", ": \'GBTIDL ver2.10.1\', \'FITSVER\': \'1.9\', \'EXTNAME\': \'SINGLE DISH\', \'CTYPE", "4\': \'STOKES\', \'FITSINDEX\': 0, \'PROC\': \'Nod\', \'OBSTYPE\': \'NONE\', \'SUBOBSM", "ODE\': \'TPNOCAL\', \'CUNIT1\': \'Hz\', \'CUNIT2\': \'deg\', \'CUNIT3\': \'deg\', \'REST", "FRQ\': np.float64(87230000000.0), \'BUNIT\': \'K\', \'TSCALE\': \'Ta*\', \'NAXIS1\'", ": 16384, \'TSCALFAC\': np.float64(3.132414901397774), \'AP_EFF\': np.float64", "(0.35010735602106374), \'SURF_ERR\': np.float64(229.99999999999994), \'SE_U", "NIT\': \'micron\', \'MEANTSYS\': np.float64(108.22387107748688), \'WTTSYS\': np", ".float64(108.22387107748688), \'TAU_Z\': np.float64(0.05990704119999998)},", \'velocity_convention=optical,radial_velocity=0.0 km / s,rest_value=872300\', \'00000.0 Hz,observer=<ITRS Coordinate (obstime=2017-02-04T10:11:43.000, l\', \'ocation=(0.0, 0.0, 0.0) km): (x, y, z) in m     (882593.9465029, -492489\', \'6.36541728, 3943748.74743984)  (v_x, v_y, v_z) in km / s     (0., 0., 0.\', \')>,target=<SkyCoord (FK5: equinox=J2000.000): (ra, dec, distance) in (de\', \'g, deg, kpc)     (148.94971752, 69.64973941, 1000000.)  (pm_ra_cosdec, p\', \'m_dec, radial_velocity) in (mas / yr, mas / yr, km / s)     (0., 0., 0.)\', \'>,mask=[ True False False ... False False False],)\', \'2026-01-14T21:04:17+0000 - DYSH v0.11.5 : dysh.spectra.spectrum.Spectrum\', \'.baseline(15,model=poly,exclude=[(<Quantity 86.47848908 GHz>, <Quantity\', \'86.52426545 GHz>), (<Quantity 87.2 GHz>, <Quantity 87.3 GHz>), (<Quantit\', \'y 87.93271272 GHz>, <Quantity 87.97839753 GHz>)],remove=True,)\', \'2026-01-14T21:04:19+0000 - DYSH v0.11.5 : 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 : np.float64(87228489084.0) np.float64(14", \'8.93912271827946) np.float64(69.6332217677112) np.float64(1.0)  CRPIX :\', \'np.float64(8193.0) np.float64(0.0) np.float64(0.0) np.float64(0.0)  PC1_\', \'1 PC1_2 PC1_3 PC1_4  : np.float64(1.0) np.float64(0.0) np.float64(0.0) n\', \'p.float64(0.0)  PC2_1 PC2_2 PC2_3 PC2_4  : np.float64(0.0) np.float64(1.\', \'0) np.float64(0.0) np.float64(0.0)  PC3_1 PC3_2 PC3_3 PC3_4  : np.float6\', \'4(0.0) np.float64(0.0) np.float64(1.0) np.float64(0.0)  PC4_1 PC4_2 PC4_\', \'3 PC4_4  : np.float64(0.0) np.float64(0.0) np.float64(0.0) np.float64(1.\', \'0)  CDELT : np.float64(91552.734375) np.float64(1.0) np.float64(1.0) np.\', "float64(1.0)  NAXIS : 16384  0  0  0,meta={\'OBJECT\': \'M82\', \'BANDWID\': 1", "500000000.0, \'DATE-OBS\': \'2017-02-04T10:11:43.00\', \'DURATION\': np.float6", "4(609.7817230224609), \'EXPOSURE\': np.float64(596.6629532243182), \'TSYS\':", " np.float64(108.4373706262882), \'TDIM7\': \'(16384,1,1,1)\', \'TUNIT7\': \'K\',", " \'CTYPE1\': \'FREQ-OBS\', \'CRVAL1\': 87228489084.0, \'CRPIX1\': 8193.0, \'CDELT", "1\': 91552.734375, \'CTYPE2\': \'RA\', \'CRVAL2\': np.float64(148.9391227182794", "6), \'CTYPE3\': \'DEC\', \'CRVAL3\': np.float64(69.6332217677112), \'CRVAL4\': 1", ", \'OBSERVER\': \'Dom Pesce\', \'OBSID\': \'unknown\', \'SCAN\': 131, \'OBSMODE\': \'", "Nod:NONE:TPNOCAL\', \'FRONTEND\': \'Rcvr68_92\', \'TCAL\': np.float64(1.0), \'VE", "LDEF\': \'OPTI-BAR\', \'VFRAME\': 5241.161782043649, \'RVSYS\': 0.0, \'OBSFREQ\':", " 87228489084.0, \'LST\': 49886.57916905915, \'AZIMUTH\': 334.4132429832569,", "\'ELEVATIO\': 46.497692750558066, \'TAMBIENT\': 261.45001220703125, \'PRESSUR", "E\': 699.2300046755845, \'HUMIDITY\': 0.6909999847412109, \'RESTFREQ\': 87230", "000000.0, \'DOPFREQ\': 86400000000.0, \'FREQRES\': 91552.734375, \'EQUINOX\':", "2000.0, \'RADESYS\': \'FK5\', \'TRGTLONG\': 148.9695833333333, \'TRGTLAT\': 69.6", "7944444444444, \'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, \'L", "ASTOFF\': 0, \'TIMESTAMP\': \'2017_02_04_10:11:43\', \'QD_XEL\': -0.00172575483", "70722825, \'QD_EL\': 0.001033652915095047, \'QD_BAD\': 0, \'QD_METHOD\': \'A\',", "\'VELOCITY\': 0.0, \'FOFFREF1\': 0.0, \'ZEROCHAN\': nan, \'ADCSAMPF\': 300000000", "0.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, \'NSA", "VE\': -1, \'HDU\': 1, \'BINTABLE\': 0, \'ROW\': 54, \'SIMPLE\': True, \'EXTEND\': T", "rue, \'DATE\': \'2025-05-27\', \'ORIGIN\': \'NRAO Green Bank\', \'GUIDEVER\': \'GBT", "IDL ver2.10.1\', \'FITSVER\': \'1.9\', \'EXTNAME\': \'SINGLE DISH\', \'CTYPE4\': \'S", "TOKES\', \'FITSINDEX\': 0, \'PROC\': \'Nod\', \'OBSTYPE\': \'NONE\', \'SUBOBSMODE\':", "\'TPNOCAL\', \'CUNIT1\': \'Hz\', \'CUNIT2\': \'deg\', \'CUNIT3\': \'deg\', \'RESTFRQ\':", "np.float64(87230000000.0), \'BUNIT\': \'K\', \'TSCALE\': \'Ta*\', \'NAXIS1\': 1638", "4, \'TSCALFAC\': np.float64(3.132414901397774), \'AP_EFF\': np.float64(0.350", "10735602106374), \'SURF_ERR\': np.float64(230.0), \'SE_UNIT\': \'micron\', \'ME", "ANTSYS\': np.float64(137.12980829151758), \'WTTSYS\': np.float64(137.129808", "29151758), \'TAU_Z\': np.float64(0.059907041200000004)},velocity_conventio", \'n=optical,radial_velocity=0.0 km / s,rest_value=87230000000.0 Hz,observe\', \'r=<ITRS Coordinate (obstime=2017-02-04T10:11:43.000, location=(0.0, 0.0,\', \' 0.0) km): (x, y, z) in m     (882593.9465029, -4924896.36541728, 394374\', \'8.74743984)  (v_x, v_y, v_z) in km / s     (0., 0., 0.)>,target=<SkyCoor\', \'d (FK5: equinox=J2000.000): (ra, dec, distance) in (deg, deg, kpc)     (\', \'148.93912272, 69.63322177, 1000000.)  (pm_ra_cosdec, pm_dec, radial_velo\', \'city) in (mas / yr, mas / yr, km / s)     (0., 0., 0.)>,mask=[ True Fals\', \'e False ... False False False],)\', \'2026-01-14T21:04:19+0000 - DYSH v0.11.5 : 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=<ITRS Coordinate (obstime=2017-02-04T10:11:43.000, location=(0.0, 0.0, 0.0) km): (x, y, z) in m     (882590.62036715, -4924873.54273607, 3943729.15615663)  (v_x, v_y, v_z) in km / s     (0., 0., 0.)>,target=<SkyCoord (FK5: equinox=J2000.000): (ra, dec, distance) in (deg, deg, kpc)     (148.93912272, 69.63322177, 1000000.)  (pm_ra_cosdec, pm_dec, radial_velocity) in (mas / yr, mas / yr, km / s)     (0., 0., 0.)>,)',
 '2026-01-14T21:04:20+0000 - DYSH v0.11.5 : dysh.spectra.spectrum.Spectrum.smooth(gauss,16,)']

Raw Reading#

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.

We start by importing astropy.fits and then loading the file.

from astropy.io import fits
hdu = fits.open(products_path / "M82_ifnum_1_polavg.fits")
hdu
[<astropy.io.fits.hdu.image.PrimaryHDU object at 0x7d32955fdff0>, <astropy.io.fits.hdu.table.BinTableHDU object at 0x7d329424e980>]

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.

header = hdu[1].header
data = hdu[1].data
hdu.close() # Close the file for now.

The header contains all the meta data from the Spectrum, as well as the data reduction history.

header
XTENSION= 'BINTABLE'           / binary table extension                         
BITPIX  =                    8 / array data type                                
NAXIS   =                    2 / number of array dimensions                     
NAXIS1  =                   48 / length of dimension 1                          
NAXIS2  =                16384 / length of dimension 2                          
PCOUNT  =                    0 / number of group parameters                     
GCOUNT  =                    1 / number of groups                               
TFIELDS =                    6 / number of table fields                         
TTYPE1  = 'spectral_axis'                                                       
TFORM1  = 'D       '                                                            
TUNIT1  = 'Hz      '                                                            
TTYPE2  = 'flux    '                                                            
TFORM2  = 'D       '                                                            
TUNIT2  = 'K       '                                                            
TTYPE3  = 'uncertainty'                                                         
TFORM3  = 'D       '                                                            
TTYPE4  = 'weight  '                                                            
TFORM4  = 'D       '                                                            
TTYPE5  = 'mask    '                                                            
TFORM5  = 'K       '                                                            
TTYPE6  = 'baseline'                                                            
TFORM6  = 'D       '                                                            
TUNIT6  = 'K       '                                                            
OBJECT  = 'M82     '                                                            
BANDWID =         1500000000.0                                                  
DATE-OBS= '2017-02-04T10:11:43.00'                                              
DURATION=    609.7817230224609                                                  
EXPOSURE=    596.6629532243182                                                  
TSYS    =    108.4373706262882                                                  
CTYPE1  = 'FREQ-OBS'                                                            
CRVAL1  =        87228489084.0                                                  
CRPIX1  =               8193.0                                                  
CDELT1  =         91552.734375                                                  
CTYPE2  = 'RA      '                                                            
CRVAL2  =   148.93912271827946                                                  
CTYPE3  = 'DEC     '                                                            
CRVAL3  =     69.6332217677112                                                  
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                                                  
HIERARCH SUBREF_STATE = 1                                                       
SIDEBAND= 'U       '                                                            
PROCSEQN=                    1                                                  
PROCSIZE=                    2                                                  
PROCSCAN= 'BEAM1   '                                                            
PROCTYPE= 'SIMPLE  '                                                            
LASTON  =                    0                                                  
LASTOFF =                    0                                                  
HIERARCH TIMESTAMP = '2017_02_04_10:11:43'                                      
QD_XEL  = -0.00172575483707228                                                  
QD_EL   = 0.001033652915095047                                                  
QD_BAD  =                    0                                                  
HIERARCH 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                                                  
HIERARCH 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  =                    T                                                  
EXTEND  =                    T                                                  
DATE    = '2025-05-27'                                                          
ORIGIN  = 'NRAO Green Bank'                                                     
GUIDEVER= 'GBTIDL ver2.10.1'                                                    
FITSVER = '1.9     '                                                            
EXTNAME = 'SINGLE DISH'                                                         
CTYPE4  = 'STOKES  '                                                            
HIERARCH FITSINDEX = 0                                                          
PROC    = 'Nod     '                                                            
OBSTYPE = 'NONE    '                                                            
HIERARCH SUBOBSMODE = 'TPNOCAL '                                                
CUNIT1  = 'Hz      '                                                            
CUNIT2  = 'deg     '                                                            
CUNIT3  = 'deg     '                                                            
RESTFRQ =        87230000000.0                                                  
BUNIT   = 'K       '                                                            
TSCALE  = 'Ta*     '                                                            
TSCALFAC=    3.132414901397774                                                  
AP_EFF  =  0.35010735602106374                                                  
SURF_ERR=                230.0                                                  
SE_UNIT = 'micron  '                                                            
MEANTSYS=   137.12980829151758                                                  
WTTSYS  =   137.12980829151758                                                  
TAU_Z   = 0.059907041200000004                                                  
HISTORY 2026-01-14T21:03:12 - Project ID: AGBT15B_244_07                        
HISTORY 2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.__init__(/home/docs/checkouts/readthedocs.org/user_builds/dysh/check
HISTORY outs/release-0.11.5/docs/source/tutorials/examples/data/AGBT15B_244_07.r
HISTORY aw.vegas.trim.fits,)                                                    
HISTORY 2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.flag_vegas_spurs()                                                  
HISTORY 2026-01-14T21:03:13+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:14+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:15+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:16+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:17+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:18+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:19+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:20+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:21+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:22+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:23+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:24+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:25+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:26+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:27+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:28+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:29+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:30+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:31+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:32+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:33+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:34+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:35+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:36+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:37+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:38+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:39+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:41+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:43+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:45+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:48+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:50+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:52+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:03:54+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:04:00+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:04:02+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.apply_flags()                                                       
HISTORY 2026-01-14T21:04:02+0000 - DYSH v0.11.5 : dysh.spectra.scan.ScanBlock.__
HISTORY init__()                                                                
HISTORY 2026-01-14T21:04:03+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
HISTORY oad.getnod(scan=[131, 133, 135, 137, 139],ifnum=1,plnum=0,t_sys=[[np.flo
HISTORY at64(108.22387107748688)], [np.float64(143.54009942913794)]],zenith_opac
HISTORY ity=0.0599070412,units=Ta*,)                                            
HISTORY 2026-01-14T21:04:04+0000 - DYSH v0.11.5 : dysh.spectra.scan.ScanBlock.ti
HISTORY meaverage()                                                             
HISTORY 2026-01-14T21:04:04+0000 - DYSH v0.11.5 : dysh.spectra.spectrum.Spectrum
HISTORY .__init__(flux=[         -0.07918082 -0.01101417 ...  0.28614683  0.2980
HISTORY 0966   0.64951734] K,wcs=WCS Keywords  Number of WCS axes: 4 CTYPE : 'FR
HISTORY EQ' 'RA' 'DEC' 'STOKES'  CRVAL : np.float64(87228489084.0) np.float64(14
HISTORY 8.94971752154765) np.float64(69.64973941003959) np.float64(-6.0)  CRPIX 
HISTORY : np.float64(8193.0) np.float64(0.0) np.float64(0.0) np.float64(0.0)  PC
HISTORY 1_1 PC1_2 PC1_3 PC1_4  : np.float64(1.0) np.float64(0.0) np.float64(0.0)
HISTORY  np.float64(0.0)  PC2_1 PC2_2 PC2_3 PC2_4  : np.float64(0.0) np.float64(
HISTORY 1.0) np.float64(0.0) np.float64(0.0)  PC3_1 PC3_2 PC3_3 PC3_4  : np.floa
HISTORY t64(0.0) np.float64(0.0) np.float64(1.0) np.float64(0.0)  PC4_1 PC4_2 PC
HISTORY 4_3 PC4_4  : np.float64(0.0) np.float64(0.0) np.float64(0.0) np.float64(
HISTORY 1.0)  CDELT : np.float64(91552.734375) np.float64(1.0) np.float64(1.0) n
HISTORY p.float64(1.0)  NAXIS : 16384  0  0  0,meta={'OBJECT': 'M82', 'BANDWID':
HISTORY  1500000000.0, 'DATE-OBS': '2017-02-04T10:11:43.00', 'DURATION': np.floa
HISTORY t64(304.89086151123047), 'EXPOSURE': np.float64(298.3314766121591), 'TSY
HISTORY S': np.float64(121.02359518771574), 'TDIM7': '(16384,1,1,1)', 'TUNIT7': 
HISTORY 'K', 'CTYPE1': 'FREQ-OBS', 'CRVAL1': 87228489084.0, 'CRPIX1': 8193.0, 'C
HISTORY DELT1': 91552.734375, 'CTYPE2': 'RA', 'CRVAL2': np.float64(148.949717521
HISTORY 54765), 'CTYPE3': 'DEC', 'CRVAL3': np.float64(69.64973941003959), 'CRVAL
HISTORY 4': -6, 'OBSERVER': 'Dom Pesce', 'OBSID': 'unknown', 'SCAN': 131, 'OBSMO
HISTORY DE': 'Nod:NONE:TPNOCAL', 'FRONTEND': 'Rcvr68_92', 'TCAL': np.float64(1.0
HISTORY ), 'VELDEF': 'OPTI-BAR', 'VFRAME': 5241.161782043649, 'RVSYS': 0.0, 'OBS
HISTORY FREQ': 87228489084.0, 'LST': 49886.57916905915, 'AZIMUTH': 334.413242983
HISTORY 2569, 'ELEVATIO': 46.497692750558066, 'TAMBIENT': 261.45001220703125, 'P
HISTORY RESSURE': 699.2300046755845, 'HUMIDITY': 0.6909999847412109, 'RESTFREQ':
HISTORY  87230000000.0, 'DOPFREQ': 86400000000.0, 'FREQRES': 91552.734375, 'EQUI
HISTORY NOX': 2000.0, 'RADESYS': 'FK5', 'TRGTLONG': 148.9695833333333, 'TRGTLAT'
HISTORY : 69.67944444444444, 'SAMPLER': 'B2_0', 'FEED': 1, 'SRFEED': 0, 'FEEDXOF
HISTORY F': 0.0, 'FEEDEOFF': 0.0, 'SUBREF_STATE': 1, 'SIDEBAND': 'U', 'PROCSEQN'
HISTORY : 1, 'PROCSIZE': 2, 'PROCSCAN': 'BEAM1', 'PROCTYPE': 'SIMPLE', 'LASTON':
HISTORY  0, 'LASTOFF': 0, 'TIMESTAMP': '2017_02_04_10:11:43', 'QD_XEL': -0.00172
HISTORY 57548370722825, 'QD_EL': 0.001033652915095047, 'QD_BAD': 0, 'QD_METHOD':
HISTORY  'A', 'VELOCITY': 0.0, 'FOFFREF1': 0.0, 'ZEROCHAN': nan, 'ADCSAMPF': 300
HISTORY 0000000.0, 'VSPDELT': 512.0, 'VSPRVAL': 16.0, 'VSPRPIX': 8192.0, 'SIG': 
HISTORY 'T', 'CAL': 'F', 'CALTYPE': 'LOW', 'TWARM': 263.18359375, 'TCOLD': 18.55
HISTORY 46875, 'CALPOSITION': 'Observing', 'BACKEND': 'VEGAS', 'PROJID': 'AGBT15
HISTORY B_244_07', 'TELESCOP': 'NRAO_GBT', 'SITELONG': -79.83983, 'SITELAT': 38.
HISTORY 43312, 'SITEELEV': 824.595, 'IFNUM': 1, 'PLNUM': 0, 'FDNUM': 0, 'INT': 0
HISTORY , 'NSAVE': -1, 'HDU': 1, 'BINTABLE': 0, 'ROW': 52, 'SIMPLE': True, 'EXTE
HISTORY ND': True, 'DATE': '2025-05-27', 'ORIGIN': 'NRAO Green Bank', 'GUIDEVER'
HISTORY : 'GBTIDL ver2.10.1', 'FITSVER': '1.9', 'EXTNAME': 'SINGLE DISH', 'CTYPE
HISTORY 4': 'STOKES', 'FITSINDEX': 0, 'PROC': 'Nod', 'OBSTYPE': 'NONE', 'SUBOBSM
HISTORY ODE': 'TPNOCAL', 'CUNIT1': 'Hz', 'CUNIT2': 'deg', 'CUNIT3': 'deg', 'REST
HISTORY FRQ': np.float64(87230000000.0), 'BUNIT': 'K', 'TSCALE': 'Ta*', 'NAXIS1'
HISTORY : 16384, 'TSCALFAC': np.float64(3.132414901397774), 'AP_EFF': np.float64
HISTORY (0.35010735602106374), 'SURF_ERR': np.float64(229.99999999999994), 'SE_U
HISTORY NIT': 'micron', 'MEANTSYS': np.float64(108.22387107748688), 'WTTSYS': np
HISTORY .float64(108.22387107748688), 'TAU_Z': np.float64(0.05990704119999998)},
HISTORY velocity_convention=optical,radial_velocity=0.0 km / s,rest_value=872300
HISTORY 00000.0 Hz,observer=<ITRS Coordinate (obstime=2017-02-04T10:11:43.000, l
HISTORY ocation=(0.0, 0.0, 0.0) km): (x, y, z) in m     (882593.9465029, -492489
HISTORY 6.36541728, 3943748.74743984)  (v_x, v_y, v_z) in km / s     (0., 0., 0.
HISTORY )>,target=<SkyCoord (FK5: equinox=J2000.000): (ra, dec, distance) in (de
HISTORY g, deg, kpc)     (148.94971752, 69.64973941, 1000000.)  (pm_ra_cosdec, p
HISTORY m_dec, radial_velocity) in (mas / yr, mas / yr, km / s)     (0., 0., 0.)
HISTORY >,mask=[ True False False ... False False False],)                      
HISTORY 2026-01-14T21:04:17+0000 - DYSH v0.11.5 : dysh.spectra.spectrum.Spectrum
HISTORY .baseline(15,model=poly,exclude=[(<Quantity 86.47848908 GHz>, <Quantity 
HISTORY 86.52426545 GHz>), (<Quantity 87.2 GHz>, <Quantity 87.3 GHz>), (<Quantit
HISTORY y 87.93271272 GHz>, <Quantity 87.97839753 GHz>)],remove=True,)          
HISTORY 2026-01-14T21:04:19+0000 - DYSH v0.11.5 : dysh.spectra.spectrum.Spectrum
HISTORY .__init__(flux=[         -0.38167784 -0.42788408 ...  0.29981571  0.2810
HISTORY 8434  -0.23835116] K,wcs=WCS Keywords  Number of WCS axes: 4 CTYPE : 'FR
HISTORY EQ' 'RA' 'DEC' 'STOKES'  CRVAL : np.float64(87228489084.0) np.float64(14
HISTORY 8.93912271827946) np.float64(69.6332217677112) np.float64(1.0)  CRPIX : 
HISTORY np.float64(8193.0) np.float64(0.0) np.float64(0.0) np.float64(0.0)  PC1_
HISTORY 1 PC1_2 PC1_3 PC1_4  : np.float64(1.0) np.float64(0.0) np.float64(0.0) n
HISTORY p.float64(0.0)  PC2_1 PC2_2 PC2_3 PC2_4  : np.float64(0.0) np.float64(1.
HISTORY 0) np.float64(0.0) np.float64(0.0)  PC3_1 PC3_2 PC3_3 PC3_4  : np.float6
HISTORY 4(0.0) np.float64(0.0) np.float64(1.0) np.float64(0.0)  PC4_1 PC4_2 PC4_
HISTORY 3 PC4_4  : np.float64(0.0) np.float64(0.0) np.float64(0.0) np.float64(1.
HISTORY 0)  CDELT : np.float64(91552.734375) np.float64(1.0) np.float64(1.0) np.
HISTORY float64(1.0)  NAXIS : 16384  0  0  0,meta={'OBJECT': 'M82', 'BANDWID': 1
HISTORY 500000000.0, 'DATE-OBS': '2017-02-04T10:11:43.00', 'DURATION': np.float6
HISTORY 4(609.7817230224609), 'EXPOSURE': np.float64(596.6629532243182), 'TSYS':
HISTORY  np.float64(108.4373706262882), 'TDIM7': '(16384,1,1,1)', 'TUNIT7': 'K',
HISTORY  'CTYPE1': 'FREQ-OBS', 'CRVAL1': 87228489084.0, 'CRPIX1': 8193.0, 'CDELT
HISTORY 1': 91552.734375, 'CTYPE2': 'RA', 'CRVAL2': np.float64(148.9391227182794
HISTORY 6), 'CTYPE3': 'DEC', 'CRVAL3': np.float64(69.6332217677112), 'CRVAL4': 1
HISTORY , 'OBSERVER': 'Dom Pesce', 'OBSID': 'unknown', 'SCAN': 131, 'OBSMODE': '
HISTORY Nod:NONE:TPNOCAL', 'FRONTEND': 'Rcvr68_92', 'TCAL': np.float64(1.0), 'VE
HISTORY LDEF': 'OPTI-BAR', 'VFRAME': 5241.161782043649, 'RVSYS': 0.0, 'OBSFREQ':
HISTORY  87228489084.0, 'LST': 49886.57916905915, 'AZIMUTH': 334.4132429832569, 
HISTORY 'ELEVATIO': 46.497692750558066, 'TAMBIENT': 261.45001220703125, 'PRESSUR
HISTORY E': 699.2300046755845, 'HUMIDITY': 0.6909999847412109, 'RESTFREQ': 87230
HISTORY 000000.0, 'DOPFREQ': 86400000000.0, 'FREQRES': 91552.734375, 'EQUINOX': 
HISTORY 2000.0, 'RADESYS': 'FK5', 'TRGTLONG': 148.9695833333333, 'TRGTLAT': 69.6
HISTORY 7944444444444, 'SAMPLER': 'B1_0', 'FEED': 1, 'SRFEED': 0, 'FEEDXOFF': 0.
HISTORY 0, 'FEEDEOFF': 0.0, 'SUBREF_STATE': 1, 'SIDEBAND': 'U', 'PROCSEQN': 1, '
HISTORY PROCSIZE': 2, 'PROCSCAN': 'BEAM1', 'PROCTYPE': 'SIMPLE', 'LASTON': 0, 'L
HISTORY ASTOFF': 0, 'TIMESTAMP': '2017_02_04_10:11:43', 'QD_XEL': -0.00172575483
HISTORY 70722825, 'QD_EL': 0.001033652915095047, 'QD_BAD': 0, 'QD_METHOD': 'A', 
HISTORY 'VELOCITY': 0.0, 'FOFFREF1': 0.0, 'ZEROCHAN': nan, 'ADCSAMPF': 300000000
HISTORY 0.0, 'VSPDELT': 512.0, 'VSPRVAL': 16.0, 'VSPRPIX': 8192.0, 'SIG': 'T', '
HISTORY CAL': 'F', 'CALTYPE': 'LOW', 'TWARM': 263.18359375, 'TCOLD': 18.5546875,
HISTORY  'CALPOSITION': 'Observing', 'BACKEND': 'VEGAS', 'PROJID': 'AGBT15B_244_
HISTORY 07', 'TELESCOP': 'NRAO_GBT', 'SITELONG': -79.83983, 'SITELAT': 38.43312,
HISTORY  'SITEELEV': 824.595, 'IFNUM': 1, 'PLNUM': 1, 'FDNUM': 0, 'INT': 0, 'NSA
HISTORY VE': -1, 'HDU': 1, 'BINTABLE': 0, 'ROW': 54, 'SIMPLE': True, 'EXTEND': T
HISTORY rue, 'DATE': '2025-05-27', 'ORIGIN': 'NRAO Green Bank', 'GUIDEVER': 'GBT
HISTORY IDL ver2.10.1', 'FITSVER': '1.9', 'EXTNAME': 'SINGLE DISH', 'CTYPE4': 'S
HISTORY TOKES', 'FITSINDEX': 0, 'PROC': 'Nod', 'OBSTYPE': 'NONE', 'SUBOBSMODE': 
HISTORY 'TPNOCAL', 'CUNIT1': 'Hz', 'CUNIT2': 'deg', 'CUNIT3': 'deg', 'RESTFRQ': 
HISTORY np.float64(87230000000.0), 'BUNIT': 'K', 'TSCALE': 'Ta*', 'NAXIS1': 1638
HISTORY 4, 'TSCALFAC': np.float64(3.132414901397774), 'AP_EFF': np.float64(0.350
HISTORY 10735602106374), 'SURF_ERR': np.float64(230.0), 'SE_UNIT': 'micron', 'ME
HISTORY ANTSYS': np.float64(137.12980829151758), 'WTTSYS': np.float64(137.129808
HISTORY 29151758), 'TAU_Z': np.float64(0.059907041200000004)},velocity_conventio
HISTORY n=optical,radial_velocity=0.0 km / s,rest_value=87230000000.0 Hz,observe
HISTORY r=<ITRS Coordinate (obstime=2017-02-04T10:11:43.000, location=(0.0, 0.0,
HISTORY  0.0) km): (x, y, z) in m     (882593.9465029, -4924896.36541728, 394374
HISTORY 8.74743984)  (v_x, v_y, v_z) in km / s     (0., 0., 0.)>,target=<SkyCoor
HISTORY d (FK5: equinox=J2000.000): (ra, dec, distance) in (deg, deg, kpc)     (
HISTORY 148.93912272, 69.63322177, 1000000.)  (pm_ra_cosdec, pm_dec, radial_velo
HISTORY city) in (mas / yr, mas / yr, km / s)     (0., 0., 0.)>,mask=[ True Fals
HISTORY e False ... False False False],)                                        
HISTORY 2026-01-14T21:04:19+0000 - DYSH v0.11.5 : dysh.spectra.spectrum.Spectrum
HISTORY .average(Spectrum (length=16384) Flux=[        nan -0.06004197 -0.185110
HISTORY 69 ...  0.30823558  0.26746191       -0.84623934] K,  mean=0.00415 K Spe
HISTORY ctral Axis=[8.64784891e+10 8.64785806e+10 8.64786722e+10 ...            
HISTORY     8.79782144e+10 8.79783060e+10 8.79783975e+10] Hz,  mean=87228443307.
HISTORY 63281 Hz,)                                                              
COMMENT --BEGIN-ASTROPY-SERIALIZED-COLUMNS--                                    
COMMENT datatype:                                                               
COMMENT - {name: spectral_axis, unit: Hz, datatype: float64, description: Spec\ 
COMMENT tral axis}                                                              
COMMENT - {name: flux, unit: K, datatype: float64, description: Flux}           
COMMENT - {name: uncertainty, datatype: float64, description: Flux uncertainty\ 
COMMENT  (was not defined)}                                                     
COMMENT - {name: weight, datatype: float64, description: Channel weights}       
COMMENT - {name: mask, datatype: int64, description: 'Mask 0=unmasked, 1=maske\ 
COMMENT d'}                                                                     
COMMENT - {name: baseline, unit: K, datatype: float64, description: Fitted bas\ 
COMMENT eline value at given channel (was not defined)}                         
COMMENT meta:                                                                   
COMMENT   __serialized_columns__: {}                                            
COMMENT --END-ASTROPY-SERIALIZED-COLUMNS--                                      
header["HISTORY"]
2026-01-14T21:03:12 - Project ID: AGBT15B_244_07
2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.__init__(/home/docs/checkouts/readthedocs.org/user_builds/dysh/check
outs/release-0.11.5/docs/source/tutorials/examples/data/AGBT15B_244_07.r
aw.vegas.trim.fits,)
2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:12+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.flag_vegas_spurs()
2026-01-14T21:03:13+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:14+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:15+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:16+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:17+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:18+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:19+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:20+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:21+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:22+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:23+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:24+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:25+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:26+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:27+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:28+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:29+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:30+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:31+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:32+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:33+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:34+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:35+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:36+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:37+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:38+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:39+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:41+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:43+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:45+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:48+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:50+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:52+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:03:54+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:04:00+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:04:02+0000 - DYSH v0.11.5 : dysh.fits.gbtfitsload.GBTFITSL
oad.apply_flags()
2026-01-14T21:04:02+0000 - DYSH v0.11.5 : dysh.spectra.scan.ScanBlock.__
init__()
2026-01-14T21:04:03+0000 - DYSH v0.11.5 : 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-01-14T21:04:04+0000 - DYSH v0.11.5 : dysh.spectra.scan.ScanBlock.ti
meaverage()
2026-01-14T21:04:04+0000 - DYSH v0.11.5 : 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 : np.float64(87228489084.0) np.float64(14
8.94971752154765) np.float64(69.64973941003959) np.float64(-6.0)  CRPIX
: np.float64(8193.0) np.float64(0.0) np.float64(0.0) np.float64(0.0)  PC
1_1 PC1_2 PC1_3 PC1_4  : np.float64(1.0) np.float64(0.0) np.float64(0.0)
 np.float64(0.0)  PC2_1 PC2_2 PC2_3 PC2_4  : np.float64(0.0) np.float64(
1.0) np.float64(0.0) np.float64(0.0)  PC3_1 PC3_2 PC3_3 PC3_4  : np.floa
t64(0.0) np.float64(0.0) np.float64(1.0) np.float64(0.0)  PC4_1 PC4_2 PC
4_3 PC4_4  : np.float64(0.0) np.float64(0.0) np.float64(0.0) np.float64(
1.0)  CDELT : np.float64(91552.734375) np.float64(1.0) np.float64(1.0) n
p.float64(1.0)  NAXIS : 16384  0  0  0,meta={'OBJECT': 'M82', 'BANDWID':
 1500000000.0, 'DATE-OBS': '2017-02-04T10:11:43.00', 'DURATION': np.floa
t64(304.89086151123047), 'EXPOSURE': np.float64(298.3314766121591), 'TSY
S': np.float64(121.02359518771574), 'TDIM7': '(16384,1,1,1)', 'TUNIT7':
'K', 'CTYPE1': 'FREQ-OBS', 'CRVAL1': 87228489084.0, 'CRPIX1': 8193.0, 'C
DELT1': 91552.734375, 'CTYPE2': 'RA', 'CRVAL2': np.float64(148.949717521
54765), 'CTYPE3': 'DEC', 'CRVAL3': np.float64(69.64973941003959), 'CRVAL
4': -6, 'OBSERVER': 'Dom Pesce', 'OBSID': 'unknown', 'SCAN': 131, 'OBSMO
DE': 'Nod:NONE:TPNOCAL', 'FRONTEND': 'Rcvr68_92', 'TCAL': np.float64(1.0
), 'VELDEF': 'OPTI-BAR', 'VFRAME': 5241.161782043649, 'RVSYS': 0.0, 'OBS
FREQ': 87228489084.0, 'LST': 49886.57916905915, 'AZIMUTH': 334.413242983
2569, 'ELEVATIO': 46.497692750558066, 'TAMBIENT': 261.45001220703125, 'P
RESSURE': 699.2300046755845, 'HUMIDITY': 0.6909999847412109, 'RESTFREQ':
 87230000000.0, 'DOPFREQ': 86400000000.0, 'FREQRES': 91552.734375, 'EQUI
NOX': 2000.0, 'RADESYS': 'FK5', 'TRGTLONG': 148.9695833333333, 'TRGTLAT'
: 69.67944444444444, 'SAMPLER': 'B2_0', 'FEED': 1, 'SRFEED': 0, 'FEEDXOF
F': 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.00172
57548370722825, 'QD_EL': 0.001033652915095047, 'QD_BAD': 0, 'QD_METHOD':
 'A', 'VELOCITY': 0.0, 'FOFFREF1': 0.0, 'ZEROCHAN': nan, 'ADCSAMPF': 300
0000000.0, 'VSPDELT': 512.0, 'VSPRVAL': 16.0, 'VSPRPIX': 8192.0, 'SIG':
'T', 'CAL': 'F', 'CALTYPE': 'LOW', 'TWARM': 263.18359375, 'TCOLD': 18.55
46875, 'CALPOSITION': 'Observing', 'BACKEND': 'VEGAS', 'PROJID': 'AGBT15
B_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': 52, 'SIMPLE': True, 'EXTE
ND': True, 'DATE': '2025-05-27', 'ORIGIN': 'NRAO Green Bank', 'GUIDEVER'
: 'GBTIDL ver2.10.1', 'FITSVER': '1.9', 'EXTNAME': 'SINGLE DISH', 'CTYPE
4': 'STOKES', 'FITSINDEX': 0, 'PROC': 'Nod', 'OBSTYPE': 'NONE', 'SUBOBSM
ODE': 'TPNOCAL', 'CUNIT1': 'Hz', 'CUNIT2': 'deg', 'CUNIT3': 'deg', 'REST
FRQ': np.float64(87230000000.0), 'BUNIT': 'K', 'TSCALE': 'Ta*', 'NAXIS1'
: 16384, 'TSCALFAC': np.float64(3.132414901397774), 'AP_EFF': np.float64
(0.35010735602106374), 'SURF_ERR': np.float64(229.99999999999994), 'SE_U
NIT': 'micron', 'MEANTSYS': np.float64(108.22387107748688), 'WTTSYS': np
.float64(108.22387107748688), 'TAU_Z': np.float64(0.05990704119999998)},
velocity_convention=optical,radial_velocity=0.0 km / s,rest_value=872300
00000.0 Hz,observer=<ITRS Coordinate (obstime=2017-02-04T10:11:43.000, l
ocation=(0.0, 0.0, 0.0) km): (x, y, z) in m     (882593.9465029, -492489
6.36541728, 3943748.74743984)  (v_x, v_y, v_z) in km / s     (0., 0., 0.
)>,target=<SkyCoord (FK5: equinox=J2000.000): (ra, dec, distance) in (de
g, deg, kpc)     (148.94971752, 69.64973941, 1000000.)  (pm_ra_cosdec, p
m_dec, radial_velocity) in (mas / yr, mas / yr, km / s)     (0., 0., 0.)
>,mask=[ True False False ... False False False],)
2026-01-14T21:04:17+0000 - DYSH v0.11.5 : dysh.spectra.spectrum.Spectrum
.baseline(15,model=poly,exclude=[(<Quantity 86.47848908 GHz>, <Quantity
86.52426545 GHz>), (<Quantity 87.2 GHz>, <Quantity 87.3 GHz>), (<Quantit
y 87.93271272 GHz>, <Quantity 87.97839753 GHz>)],remove=True,)
2026-01-14T21:04:19+0000 - DYSH v0.11.5 : 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 : np.float64(87228489084.0) np.float64(14
8.93912271827946) np.float64(69.6332217677112) np.float64(1.0)  CRPIX :
np.float64(8193.0) np.float64(0.0) np.float64(0.0) np.float64(0.0)  PC1_
1 PC1_2 PC1_3 PC1_4  : np.float64(1.0) np.float64(0.0) np.float64(0.0) n
p.float64(0.0)  PC2_1 PC2_2 PC2_3 PC2_4  : np.float64(0.0) np.float64(1.
0) np.float64(0.0) np.float64(0.0)  PC3_1 PC3_2 PC3_3 PC3_4  : np.float6
4(0.0) np.float64(0.0) np.float64(1.0) np.float64(0.0)  PC4_1 PC4_2 PC4_
3 PC4_4  : np.float64(0.0) np.float64(0.0) np.float64(0.0) np.float64(1.
0)  CDELT : np.float64(91552.734375) np.float64(1.0) np.float64(1.0) np.
float64(1.0)  NAXIS : 16384  0  0  0,meta={'OBJECT': 'M82', 'BANDWID': 1
500000000.0, 'DATE-OBS': '2017-02-04T10:11:43.00', 'DURATION': np.float6
4(609.7817230224609), 'EXPOSURE': np.float64(596.6629532243182), 'TSYS':
 np.float64(108.4373706262882), 'TDIM7': '(16384,1,1,1)', 'TUNIT7': 'K',
 'CTYPE1': 'FREQ-OBS', 'CRVAL1': 87228489084.0, 'CRPIX1': 8193.0, 'CDELT
1': 91552.734375, 'CTYPE2': 'RA', 'CRVAL2': np.float64(148.9391227182794
6), 'CTYPE3': 'DEC', 'CRVAL3': np.float64(69.6332217677112), 'CRVAL4': 1
, 'OBSERVER': 'Dom Pesce', 'OBSID': 'unknown', 'SCAN': 131, 'OBSMODE': '
Nod:NONE:TPNOCAL', 'FRONTEND': 'Rcvr68_92', 'TCAL': np.float64(1.0), 'VE
LDEF': 'OPTI-BAR', 'VFRAME': 5241.161782043649, 'RVSYS': 0.0, 'OBSFREQ':
 87228489084.0, 'LST': 49886.57916905915, 'AZIMUTH': 334.4132429832569,
'ELEVATIO': 46.497692750558066, 'TAMBIENT': 261.45001220703125, 'PRESSUR
E': 699.2300046755845, 'HUMIDITY': 0.6909999847412109, 'RESTFREQ': 87230
000000.0, 'DOPFREQ': 86400000000.0, 'FREQRES': 91552.734375, 'EQUINOX':
2000.0, 'RADESYS': 'FK5', 'TRGTLONG': 148.9695833333333, 'TRGTLAT': 69.6
7944444444444, '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, 'L
ASTOFF': 0, 'TIMESTAMP': '2017_02_04_10:11:43', 'QD_XEL': -0.00172575483
70722825, 'QD_EL': 0.001033652915095047, 'QD_BAD': 0, 'QD_METHOD': 'A',
'VELOCITY': 0.0, 'FOFFREF1': 0.0, 'ZEROCHAN': nan, 'ADCSAMPF': 300000000
0.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, 'NSA
VE': -1, 'HDU': 1, 'BINTABLE': 0, 'ROW': 54, 'SIMPLE': True, 'EXTEND': T
rue, 'DATE': '2025-05-27', 'ORIGIN': 'NRAO Green Bank', 'GUIDEVER': 'GBT
IDL ver2.10.1', 'FITSVER': '1.9', 'EXTNAME': 'SINGLE DISH', 'CTYPE4': 'S
TOKES', 'FITSINDEX': 0, 'PROC': 'Nod', 'OBSTYPE': 'NONE', 'SUBOBSMODE':
'TPNOCAL', 'CUNIT1': 'Hz', 'CUNIT2': 'deg', 'CUNIT3': 'deg', 'RESTFRQ':
np.float64(87230000000.0), 'BUNIT': 'K', 'TSCALE': 'Ta*', 'NAXIS1': 1638
4, 'TSCALFAC': np.float64(3.132414901397774), 'AP_EFF': np.float64(0.350
10735602106374), 'SURF_ERR': np.float64(230.0), 'SE_UNIT': 'micron', 'ME
ANTSYS': np.float64(137.12980829151758), 'WTTSYS': np.float64(137.129808
29151758), 'TAU_Z': np.float64(0.059907041200000004)},velocity_conventio
n=optical,radial_velocity=0.0 km / s,rest_value=87230000000.0 Hz,observe
r=<ITRS Coordinate (obstime=2017-02-04T10:11:43.000, location=(0.0, 0.0,
 0.0) km): (x, y, z) in m     (882593.9465029, -4924896.36541728, 394374
8.74743984)  (v_x, v_y, v_z) in km / s     (0., 0., 0.)>,target=<SkyCoor
d (FK5: equinox=J2000.000): (ra, dec, distance) in (deg, deg, kpc)     (
148.93912272, 69.63322177, 1000000.)  (pm_ra_cosdec, pm_dec, radial_velo
city) in (mas / yr, mas / yr, km / s)     (0., 0., 0.)>,mask=[ True Fals
e False ... False False False],)
2026-01-14T21:04:19+0000 - DYSH v0.11.5 : 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,)

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

x = data["spectral_axis"]*1e-9 # Convert to GHz.
y = np.ma.masked_where(data["mask"], data["flux"]) # We need to mask the flux values.
plt.figure(dpi=150)
plt.plot(x, y)
plt.ylabel(r"$T_{A}^{*}$ (K)")
plt.xlabel(r"Frequency (GHz)");
../../_images/57319e6342da77dadc1167c5e1788f2eeec0cfc556e87d572564ccdd03a4ce50.png