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>
nod_ta[0,1].plot()
<dysh.plot.specplot.SpectrumPlot at 0x7d328d2d25f0>
nod_ta[0,2].plot()
<dysh.plot.specplot.SpectrumPlot at 0x7d3294c9e3b0>
nod_ta[0,3].plot()
<dysh.plot.specplot.SpectrumPlot at 0x7d3294ceb2b0>
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})");
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})");
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})");
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})");
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>
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})");
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})");
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})");
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>
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)");