Chapter 4 — Antennas & Receivers¶
!!! info "Before you start" Prerequisites: Ch 3 (Signals, Noise & the Radiometer Equation) · Maths Lab: Lab F (Special Functions & Beams) · ~40 min · Beginner
In Chapter 3 we treated the telescope as a black box that delivers band-limited noise, and the radiometer equation told us how quickly a signal climbs out of that noise. But two black-box numbers were smuggled in without explanation: how much of the sky does the antenna actually see (its beam), and how well does it convert incoming flux into measurable power (its effective area)? This chapter opens the box.
An antenna is a diffraction-limited optical instrument that happens to work at centimetre and metre wavelengths instead of optical ones. Because radio wavelengths are $10^5$–$10^6$ times longer than visible light, a radio dish has terrible angular resolution for its size — which is why radio dishes are enormous, and why radio astronomers eventually had to invent interferometry (Chapter 8) to do any better.
What you'll learn¶
- The antenna power pattern: the main lobe, the half-power beamwidth (FWHM), and the sidelobes — and why a uniformly illuminated dish produces an Airy pattern.
- Angular resolution and the diffraction limit $\theta \approx 1.22\,\lambda/D$, the same formula that governs an optical telescope or a camera lens.
- Effective area $A_\mathrm{eff}$, antenna gain, and aperture efficiency $\eta$, with $A_\mathrm{eff} = \eta\,\pi D^2/4$.
- How collecting area sets sensitivity through the system equivalent flux density, $\mathrm{SEFD} = 2k_B T_\mathrm{sys} / A_\mathrm{eff}$, and the figure of merit $G/T$.
We will work a concrete example throughout: a 25 m dish observing the 21 cm hydrogen line at 1.4 GHz — roughly a single antenna of the VLA or the Westerbork array.
The references¶
There is no single "discovery paper" for antenna theory — it grew out of the optics of Airy and Rayleigh in the 19th century and the radar engineering of the 1940s. The two standing references for everything in this chapter are:
Condon, J. J. & Ransom, S. M. Essential Radio Astronomy. Princeton University Press, 2016. Chapter 3 ("Radio Telescopes and Radiometers"). Free online: cv.nrao.edu/~sransom/web/Ch3.html
Wilson, T. L., Rohlfs, K. & Hüttemeister, S. Tools of Radio Astronomy (6th ed., Springer, 2013). Chapters 5–7. DOI: 10.1007/978-3-642-39950-3
The diffraction limit itself traces to:
Airy, G. B. (1835). On the Diffraction of an Object-glass with Circular Aperture. Trans. Cambridge Phil. Soc. 5, 283. — The Airy pattern and the first dark ring.
Lord Rayleigh (1879). Investigations in optics, with special reference to the spectroscope. Phil. Mag. 8, 261. — The Rayleigh criterion for resolving two point sources.
Condon & Ransom is the one to keep open beside this notebook: every formula below appears there, usually with a clearer derivation than we have room for here.
The physics¶
The antenna as a Fourier transform¶
A fundamental result of diffraction theory: the far-field radiation pattern of an aperture is the (squared magnitude of the) Fourier transform of the aperture illumination. A radio dish with a circular, uniformly illuminated aperture of diameter $D$ therefore radiates — and, by reciprocity, receives — with the classic Airy pattern:
$$ P(\theta) \;=\; \left[\frac{2 J_1(x)}{x}\right]^2, \qquad x \;=\; \frac{\pi D}{\lambda}\sin\theta, $$
where $J_1$ is the first-order Bessel function and $\theta$ is the angle off boresight.
We'll evaluate this directly below with scipy.special.j1, in the open, and only later
cross-check it against the packaged jansky.signals.airy_beam. The pattern has a bright
main lobe surrounded by progressively fainter sidelobes, the first of which peaks
at only $-17.6$ dB (about 1.7% of the main-lobe power).
The first null and the resolution limit¶
The first dark ring of the Airy pattern — the first null of $J_1(x)$ — occurs at $x = 3.8317$, i.e. when
$$ \sin\theta_\mathrm{null} \;=\; 1.220\,\frac{\lambda}{D}. $$
The factor $3.8317/\pi = 1.220$ is the origin of the famous $1.22\,\lambda/D$. By the Rayleigh criterion, two point sources are just resolved when one sits on the first null of the other, so the angular resolution of a filled circular aperture is
$$ \boxed{\;\theta_\mathrm{res} \;\approx\; 1.22\,\frac{\lambda}{D}\;}. $$
In practice dishes are tapered (illuminated more weakly at the edge to suppress sidelobes), which widens the main beam slightly; the half-power beamwidth (FWHM) of a real dish is usually written $\theta_\mathrm{FWHM} \approx k\,\lambda/D$ with $k \approx 1.0$–$1.3$. For a uniformly illuminated aperture the Airy main lobe has $\theta_\mathrm{FWHM} \approx 1.029\,\lambda/D$.
Effective area, gain, and aperture efficiency¶
An antenna pointed at a source of flux density $S$ (W m$^{-2}$ Hz$^{-1}$) collects a power per unit bandwidth of $\tfrac{1}{2} A_\mathrm{eff} S$ (the $\tfrac12$ because a single receiver chain measures one polarisation). The effective area is smaller than the geometric area $A_\mathrm{geom} = \pi D^2/4$ by the aperture efficiency $\eta$:
$$ A_\mathrm{eff} \;=\; \eta \,\frac{\pi D^2}{4}, \qquad 0 < \eta \lesssim 1. $$
Typical dishes achieve $\eta \approx 0.5$–$0.7$, the shortfall coming from illumination taper, surface roughness, blockage by the feed legs, and spillover. Effective area and the beam solid angle $\Omega_A$ are tied together by the antenna theorem $A_\mathrm{eff}\,\Omega_A = \lambda^2$.
From area to sensitivity: SEFD and G/T¶
The antenna temperature produced by a source of flux density $S$ is $T_A = A_\mathrm{eff} S / (2 k_B)$. A source is detectable when $T_A$ rivals the system temperature $T_\mathrm{sys}$; the flux density that produces $T_A = T_\mathrm{sys}$ is the system equivalent flux density:
$$ \boxed{\;\mathrm{SEFD} \;=\; \frac{2 k_B T_\mathrm{sys}}{A_\mathrm{eff}}\;}. $$
SEFD (in janskys) is the single most useful sensitivity figure of merit for a telescope: small is good. Combined with the radiometer equation, the $1\sigma$ flux sensitivity of a single dish in time $\tau$ over bandwidth $B$ is $\Delta S = \mathrm{SEFD}/\sqrt{n_\mathrm{pol} B \tau}$. The closely related engineering figure of merit is the gain-to-noise-temperature ratio $G/T \propto A_\mathrm{eff}/T_\mathrm{sys}$, which is just the inverse of SEFD up to constants.
Back of the envelope¶
Before any code: how faint a source can our 25 m dish even sense? Later in this chapter we'll grind through the full sensitivity chain -- geometric area, aperture efficiency, system temperature -- to arrive at a system equivalent flux density (SEFD) in janskys. You can beat that derivation to an order-of-magnitude answer with one line of arithmetic.
The question: roughly what SEFD does a 25 m dish present, with a typical aperture efficiency $\eta = 0.6$ and a cryogenic system temperature $T_\mathrm{sys} = 30$ K?
Rules of the napkin: decades matter, factors of two don't. You already have everything you need -- the boxed $\mathrm{SEFD} = 2 k_B T_\mathrm{sys} / A_\mathrm{eff}$, with $A_\mathrm{eff} = \eta\,\pi D^2/4$. Work it out on paper first, then write it as code below.
D = 25.0 # m -- our running example dish
eta = 0.6 # aperture efficiency (illumination, surface, blockage, spillover)
T_sys = 30.0 # K -- cryogenic L-band receiver
k_B = 1.380649e-23 # J/K -- Boltzmann's constant
jansky_si = 1.0e-26 # W/m^2/Hz -- the definition of 1 Jy
pi = 3.141592653589793 # -- no numpy yet, this section comes before any imports
# Your one line: A_eff = eta * pi * D^2 / 4, then SEFD = 2 k_B T_sys / A_eff, in Jy.
sefd_guess_jy = None # <- replace None with an expression in D, eta, T_sys, k_B, jansky_si
The order-of-magnitude checker, jansky.envelope.check -- introduced back in
Chapter 1 -- grades a guess by decades, not decimal places, and never raises even
while your guess is still None.
from jansky.envelope import check
# The answer is worked in the reveal below -- commit to your own number first.
# The check stores only its base-10 logarithm, so a stray glance can't spoil it.
check(sefd_guess_jy, expected_log10=2.4492, name="SEFD of a 25 m dish", units="Jy")
[SEFD of a 25 m dish] no guess yet — fill in the cell above, then re-run this one.
False
Reveal — the envelope answer
$$ A_\mathrm{eff} \;=\; \eta\,\frac{\pi D^2}{4} \;=\; 0.6 \times \frac{\pi\,(25\ \mathrm{m})^2}{4} \;\approx\; 295\ \mathrm{m}^2. $$
$$ \mathrm{SEFD} \;=\; \frac{2 k_B T_\mathrm{sys}}{A_\mathrm{eff}} \;=\; \frac{2 \times 1.381\times10^{-23} \times 30}{295}\ \mathrm{W\,m^{-2}\,Hz^{-1}} \;\approx\; 281\ \mathrm{Jy}. $$
A_eff_guess = eta * pi * D**2 / 4 # ~295 m^2
sefd_guess_jy = 2 * k_B * T_sys / A_eff_guess / jansky_si # = 281 Jy
About 280 Jy -- a source that bright would raise the antenna temperature by a full $T_\mathrm{sys}$; the faint sources we actually chase are hundreds to thousands of times fainter still.
Where the envelope leaks (and where this chapter patches it):
- We assumed $\eta = 0.6$ without asking where it comes from -- illumination taper, surface accuracy, feed-leg blockage, and spillover each shave off a few percent; see "Effective area, gain, and aperture efficiency" above.
- SEFD alone isn't a detection threshold: it has to be divided by $\sqrt{n_\mathrm{pol}\,B\,\tau}$ (the radiometer equation from Chapter 3) to become an actual flux sensitivity $\Delta S$ -- worked out in "From collecting area to SEFD" below.
- We treated $T_\mathrm{sys} = 30$ K as a fixed number, but it is itself a sum of receiver, sky, spillover, and CMB contributions (Chapter 3) that varies with frequency and elevation.
Turn the knob¶
Same receiver, same $T_\mathrm{sys}$ -- but swap the 25 m dish for the 100 m Green Bank Telescope. Since $\mathrm{SEFD} \propto D^{-2}$, reuse your expression with the new diameter.
D_gbt = 100.0 # m -- the Green Bank Telescope
sefd_gbt_guess_jy = None # <- your line again, with the new diameter
# The answer is worked in the reveal below -- commit to your own number first.
# The check stores only its base-10 logarithm, so a stray glance can't spoil it.
check(sefd_gbt_guess_jy, expected_log10=1.2455, name="SEFD of the 100 m GBT", units="Jy")
[SEFD of the 100 m GBT] no guess yet — fill in the cell above, then re-run this one.
False
Reveal — the scaling answer
$\mathrm{SEFD} \propto D^{-2}$, and $(100/25)^2 = 16$, so the GBT's SEFD is sixteen times smaller than the 25 m dish's: $281/16 \approx 17.6$ Jy.
A_eff_gbt = eta * pi * D_gbt**2 / 4
sefd_gbt_guess_jy = 2 * k_B * T_sys / A_eff_gbt / jansky_si # = 17.6 Jy
That quadratic payoff in diameter is exactly why the biggest single dishes -- Green Bank, Effelsberg, FAST -- are prized for continuum sensitivity even though interferometers win on resolution (Chapter 8).
Setting up¶
This chapter writes its own physics: the Airy diffraction pattern is a few lines of Bessel-function arithmetic, and it stays in the open. What we import upfront is plumbing, not physics:
plotting.use_jansky_style()-- the course's shared figure styling.scipy.special.j1-- the Bessel function itself, the one piece ofscipywe lean on rather than reimplementing it from a series expansion.
Once we've written the Airy and Gaussian beam patterns ourselves, we'll cross-check them
against the packaged, unit-tested copies in jansky.signals -- proving with an assert
that they compute exactly the lines we wrote. Abstraction earned, then confirmed.
Everything physical is carried in astropy.units so the dimensional bookkeeping is
automatic.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import astropy.units as u
from astropy.constants import k_B, c
from scipy import special
from jansky import plotting
plotting.use_jansky_style()
# Our running example: a 25 m dish at the 21 cm HI line.
D = 25 * u.m
freq = 1.4 * u.GHz
wavelength = (c / freq).to(u.m) # lambda = c / nu
print(f"Dish diameter D = {D}")
print(f"Frequency nu = {freq}")
print(f"Wavelength lambda = {wavelength:.4f}")
Dish diameter D = 25.0 m Frequency nu = 1.4 GHz Wavelength lambda = 0.2141 m
The beam pattern: main lobe and sidelobes¶
Let's plot the Airy power pattern of our 25 m dish on a decibel scale, where the faint sidelobes become visible, and overlay a Gaussian beam matched to the same FWHM. The first null — the $1.22\,\lambda/D$ point — is marked explicitly.
# First-null half-angle: sin(theta) = 1.22 lambda / D (small angle => theta ~ 1.22 l/D).
theta_null = (1.220 * wavelength / D).to(u.dimensionless_unscaled).value * u.rad
# Airy main-lobe FWHM for a uniform aperture: 1.029 lambda / D.
theta_fwhm_airy = (1.029 * wavelength / D).to(u.dimensionless_unscaled).value * u.rad
print(f"first null theta_null = {theta_null.to(u.arcmin):.3f}")
print(f"Airy FWHM theta_FWHM = {theta_fwhm_airy.to(u.arcmin):.3f}")
# Angular grid, a few beamwidths wide, in radians for the helper calls.
theta = np.linspace(-4 * theta_null.value, 4 * theta_null.value, 2000) # rad
# Airy power pattern: P(theta) = [2 J1(x)/x]^2, x = pi D/lambda * sin(theta) (derived above).
x = np.pi * D.to(u.m).value / wavelength.to(u.m).value * np.sin(theta)
with np.errstate(invalid="ignore", divide="ignore"):
airy_amp = np.where(x == 0.0, 1.0, 2.0 * special.j1(x) / x) # limit -> 1 at x = 0
airy = airy_amp**2
# Gaussian beam matched to the same FWHM: sigma = FWHM / (2 sqrt(2 ln 2)),
# a common analytic stand-in for a real (tapered) dish's main lobe.
sigma = theta_fwhm_airy.value / (2.0 * np.sqrt(2.0 * np.log(2.0)))
gauss = np.exp(-0.5 * (theta / sigma) ** 2)
# Convert to dB (clip the zeros at the nulls so log is finite).
airy_db = 10 * np.log10(np.clip(airy, 1e-6, None))
gauss_db = 10 * np.log10(np.clip(gauss, 1e-6, None))
theta_arcmin = (theta * u.rad).to(u.arcmin).value
fig, ax = plt.subplots(figsize=(9, 5))
ax.plot(theta_arcmin, airy_db, color="#1f77b4", lw=2, label="Airy (uniform dish)")
ax.plot(theta_arcmin, gauss_db, color="#d62728", lw=1.5, ls="--", label="Gaussian (matched FWHM)")
for sign in (-1, 1):
ax.axvline(sign * theta_null.to(u.arcmin).value, color="k", ls=":", alpha=0.6)
ax.axhline(-3, color="grey", ls=":", alpha=0.5)
ax.annotate(
"first null\n$1.22\\,\\lambda/D$",
xy=(theta_null.to(u.arcmin).value, -30),
xytext=(theta_null.to(u.arcmin).value + 8, -22),
arrowprops=dict(arrowstyle="->", color="k"),
fontsize=10,
)
ax.annotate(
"first sidelobe ($-17.6$ dB)",
xy=(0, -17.6),
xytext=(0.55, 0.45),
textcoords="axes fraction",
fontsize=9,
color="#1f77b4",
)
ax.set_xlabel(r"angle off boresight [arcmin]")
ax.set_ylabel("power response [dB]")
ax.set_title(f"Beam pattern of a {D:.0f} dish at {freq:.1f}")
ax.set_ylim(-45, 3)
ax.legend(loc="upper right")
plt.tight_layout()
plt.show()
first null theta_null = 35.924 arcmin Airy FWHM theta_FWHM = 30.300 arcmin
The Airy pattern's main lobe is the part we observe with; the sidelobes are a nuisance, letting in radiation (and interference, and ground noise) from well off-axis. The first-null markers sit exactly at $\pm 1.22\,\lambda/D$, and the Gaussian approximation tracks the main lobe well but knows nothing of the sidelobes — a reminder that the Gaussian is only a model of the central beam.
Let's confirm the sidelobe level and the position of the first null numerically against the Bessel-function theory.
# The first null of J1 is at x = 3.8317; the first sidelobe peak is near x = 5.1356.
x_null = special.jn_zeros(1, 1)[0]
print(f"first zero of J1: x = {x_null:.4f} (=> 1.22 factor = {x_null / np.pi:.4f})")
# Peak of the first sidelobe of the Airy pattern.
x = np.linspace(x_null + 0.1, 8, 5000)
sidelobe = (2 * special.j1(x) / x) ** 2
x_peak = x[np.argmax(sidelobe)]
peak_db = 10 * np.log10(sidelobe.max())
print(f"first sidelobe peak: x = {x_peak:.3f}, level = {peak_db:.1f} dB")
print(f" (textbook value: -17.6 dB)")
assert np.isclose(x_null / np.pi, 1.2197, atol=1e-3)
print("\nThe 1.22 factor and -17.6 dB sidelobe are reproduced.")
first zero of J1: x = 3.8317 (=> 1.22 factor = 1.2197)
first sidelobe peak: x = 5.135, level = -17.6 dB
(textbook value: -17.6 dB)
The 1.22 factor and -17.6 dB sidelobe are reproduced.
Angular resolution of a real dish¶
Now the headline number: what can a 25 m dish actually resolve at 1.4 GHz? We compute the diffraction limit $1.22\,\lambda/D$ with full units, and compare it to the FWHM.
def resolution(diameter, frequency, factor=1.22):
"""Diffraction-limited resolution theta = factor * lambda / D, with units.
Parameters
----------
diameter : ~astropy.units.Quantity
Dish diameter (length).
frequency : ~astropy.units.Quantity
Observing frequency.
factor : float
1.22 for the Rayleigh/first-null limit; ~1.0 for the FWHM.
"""
lam = (c / frequency).to(u.m)
theta = (factor * lam / diameter).to(u.dimensionless_unscaled).value * u.rad
return theta.to(u.arcmin)
theta_res = resolution(D, freq) # Rayleigh / first-null
theta_fwhm = resolution(D, freq, factor=1.029) # Airy main-lobe FWHM
print(f"25 m @ 1.4 GHz:")
print(f" Rayleigh limit (1.22 l/D): {theta_res:.3f} = {theta_res.to(u.deg):.3f}")
print(f" Airy FWHM (1.03 l/D): {theta_fwhm:.3f}")
print()
print(f"For scale, the full Moon is about 30 arcmin across, so this single dish")
print(
f"smears the Moon into roughly {(30 * u.arcmin / theta_fwhm).to(u.dimensionless_unscaled):.0f} resolution elements."
)
25 m @ 1.4 GHz: Rayleigh limit (1.22 l/D): 35.924 arcmin = 0.599 deg Airy FWHM (1.03 l/D): 30.300 arcmin For scale, the full Moon is about 30 arcmin across, so this single dish smears the Moon into roughly 1 resolution elements.
From collecting area to SEFD¶
Finally, the sensitivity chain. We take a realistic aperture efficiency $\eta = 0.6$ and a modern system temperature $T_\mathrm{sys} = 30$ K, compute the effective area, and convert it to a system equivalent flux density in janskys.
eta = 0.6 # aperture efficiency (illumination, surface, blockage, spillover)
T_sys = 30 * u.K # cryogenic L-band receiver
A_geom = np.pi * D**2 / 4
A_eff = eta * A_geom
# SEFD = 2 k_B T_sys / A_eff. k_B has units J/K = W/(Hz K), so SEFD comes out in W/m^2/Hz.
SEFD = (2 * k_B * T_sys / A_eff).to(u.Jy)
print(f"geometric area A_geom = {A_geom:.1f}")
print(f"effective area A_eff = {A_eff:.1f} (eta = {eta})")
print(f"system temp T_sys = {T_sys}")
print(f"SEFD = {SEFD:.0f}")
print()
# Cross-check: antenna temperature from a 1 Jy source.
S = 1 * u.Jy
T_A = (A_eff * S / (2 * k_B)).to(u.K)
print(f"A 1 Jy source raises the antenna temperature by T_A = {T_A:.4f}")
print(f" (so a source equal to SEFD = {SEFD.to(u.Jy):.0f} would give T_A = T_sys)")
geometric area A_geom = 490.9 m2 effective area A_eff = 294.5 m2 (eta = 0.6) system temp T_sys = 30.0 K SEFD = 281 Jy A 1 Jy source raises the antenna temperature by T_A = 0.1067 K (so a source equal to SEFD = 281 Jy would give T_A = T_sys)
The SEFD ties the abstract radiometer equation of Chapter 3 to a real instrument: with the SEFD in hand, the $1\sigma$ flux sensitivity after integrating for time $\tau$ over bandwidth $B$ with both polarisations is simply $\Delta S = \mathrm{SEFD}/\sqrt{2 B \tau}$. Let's evaluate it for a typical L-band setup.
B = 100 * u.MHz
tau = 1 * u.hour
n_pol = 2
dS = (SEFD / np.sqrt(n_pol * B * tau)).to(u.uJy)
print(f"1-sigma sensitivity after {tau} over {B}: Delta_S = {dS:.2f}")
print(f" (={dS.to(u.mJy):.4f} per beam)")
# G/T figure of merit (proportional to A_eff / T_sys, the inverse of SEFD).
G_over_T = (A_eff / T_sys).to(u.m**2 / u.K)
print(f"\nG/T figure of merit ~ A_eff/T_sys = {G_over_T:.2f}")
1-sigma sensitivity after 1.0 h over 100.0 MHz: Delta_S = 331.47 uJy (=0.3315 mJy per beam) G/T figure of merit ~ A_eff/T_sys = 9.82 m2 / K
From napkin to package¶
Both beam patterns above were typed out in the open, because this chapter is where
they belong. But later chapters reuse them without re-deriving Bessel functions every
time -- the synthesised beam of an interferometer (Chapter 8) and the drift-scan
simulations elsewhere in the course both lean on these same two shapes. The course
keeps one tested copy of each in jansky.signals, and calls it by name from here on.
Two asserts prove the packaged versions compute exactly the arrays we already have:
from jansky import signals
packaged_airy = signals.airy_beam(theta, D.to(u.m).value, wavelength.to(u.m).value)
packaged_gauss = signals.gaussian_beam(theta, theta_fwhm_airy.value)
assert np.allclose(airy, packaged_airy)
assert np.allclose(gauss, packaged_gauss)
print("inline Airy/Gaussian beams == jansky.signals.airy_beam / gaussian_beam -- promoted.")
inline Airy/Gaussian beams == jansky.signals.airy_beam / gaussian_beam -- promoted.
Try it yourself¶
The cells below are scaffolds: they run as-is and return placeholder values, but the
real work is left for you, marked with # TODO. Replace the stubbed return values with
real calculations using the helpers above (resolution, signals.airy_beam, the SEFD
formula). The notebook will still execute end-to-end before you do — the stubs just print a
clear "not implemented yet" note.
Exercise 1 — Resolution of the VLA and a 100 m dish¶
The VLA in its most extended A-configuration has a maximum baseline of about $B_\mathrm{max} = 36$ km; for an interferometer the resolution is set by the baseline rather than the dish diameter, so use $\theta \approx 1.22\,\lambda/B_\mathrm{max}$. The GBT (Green Bank Telescope) is a 100 m single dish.
Compute, at 1.4 GHz:
- the resolution of the VLA-A (treat $B_\mathrm{max}$ in place of $D$), and
- the resolution of the 100 m GBT,
and compare both to our 25 m dish. Which resolves the Moon (30 arcmin) into the most elements?
def exercise_resolutions():
"""TODO: compute resolutions at 1.4 GHz for the VLA-A and the GBT.
Returns a dict mapping instrument name -> resolution (an astropy Quantity in arcmin).
"""
freq = 1.4 * u.GHz
# TODO: use the `resolution(...)` helper defined above.
# - VLA-A: pass B_max = 36 km as the "diameter".
# - GBT: pass D = 100 m.
# TODO: replace the placeholder values below with the real calculations.
results = {
"VLA-A (36 km)": np.nan * u.arcmin, # TODO
"GBT (100 m)": np.nan * u.arcmin, # TODO
"Our 25 m": resolution(25 * u.m, freq), # worked example, for comparison
}
return results
_res = exercise_resolutions()
for name, theta in _res.items():
flag = " <-- TODO (placeholder)" if not np.isfinite(theta.value) else ""
print(f"{name:16s}: {theta:.4f}{flag}")
VLA-A (36 km) : nan arcmin <-- TODO (placeholder) GBT (100 m) : nan arcmin <-- TODO (placeholder) Our 25 m : 35.9241 arcmin
Solution
Just call the existing resolution(...) helper, substituting the relevant baseline or diameter for $D$. For an interferometer the resolution is set by the longest baseline, so the VLA-A's 36 km baseline replaces the dish diameter; the GBT is a true 100 m single dish.
def exercise_resolutions():
freq = 1.4 * u.GHz
results = {
"VLA-A (36 km)": resolution(36 * u.km, freq),
"GBT (100 m)": resolution(100 * u.m, freq),
"Our 25 m": resolution(25 * u.m, freq),
}
return results
_res = exercise_resolutions()
for name, theta in _res.items():
elems = (30 * u.arcmin / theta).to(u.dimensionless_unscaled)
print(f"{name:16s}: {theta:.4f} -> Moon = {elems:.1f} elements")
Expected: VLA-A $\approx 0.025$ arcmin, GBT $\approx 8.98$ arcmin, 25 m $\approx 35.9$ arcmin. The 36 km baseline of the VLA-A resolves the Moon into roughly 1200 elements — over a thousand times finer than the 100 m GBT (about 3 elements) — because resolution scales as $\lambda/B$, and the baseline, not the dish, is what counts for an interferometer.
Exercise 2 — SEFD vs aperture efficiency and dish size¶
Sensitivity scales as $\mathrm{SEFD} \propto T_\mathrm{sys} / (\eta D^2)$. Build a small study: for a fixed $T_\mathrm{sys} = 30$ K, compute the SEFD for dish diameters of 25 m, 64 m (Parkes), and 100 m (GBT) at $\eta = 0.6$, and see how a poorer efficiency ($\eta = 0.4$) inflates the SEFD. Plot SEFD vs diameter on log–log axes — it should be a straight line of slope $-2$.
def exercise_sefd(diameter, eta=0.6, t_sys=30 * u.K):
"""TODO: return the SEFD (in Jy) for a dish of the given diameter and efficiency.
SEFD = 2 k_B T_sys / A_eff, with A_eff = eta * pi D^2 / 4.
"""
# TODO: implement using A_eff = eta * pi * diameter**2 / 4
# and SEFD = (2 * k_B * t_sys / A_eff).to(u.Jy).
# Placeholder so the notebook runs:
return np.nan * u.Jy
diameters = [25, 64, 100] * u.m
print("SEFD at eta = 0.6:")
for d in diameters:
sefd = exercise_sefd(d)
flag = " <-- TODO (placeholder)" if not np.isfinite(sefd.value) else ""
print(f" D = {d:6.0f}: SEFD = {sefd:.0f}{flag}")
# TODO: once exercise_sefd is implemented, plot SEFD vs diameter on log-log axes
# and confirm the slope is -2.
SEFD at eta = 0.6: D = 25 m: SEFD = nan Jy <-- TODO (placeholder) D = 64 m: SEFD = nan Jy <-- TODO (placeholder) D = 100 m: SEFD = nan Jy <-- TODO (placeholder)
Solution
Implement the effective area $A_\mathrm{eff} = \eta\,\pi D^2/4$ and feed it into $\mathrm{SEFD} = 2 k_B T_\mathrm{sys}/A_\mathrm{eff}$, then sweep the three diameters and overlay both efficiencies on log–log axes.
def exercise_sefd(diameter, eta=0.6, t_sys=30 * u.K):
A_eff = eta * np.pi * diameter**2 / 4
return (2 * k_B * t_sys / A_eff).to(u.Jy)
diameters = [25, 64, 100] * u.m
for label, e in [("eta = 0.6", 0.6), ("eta = 0.4", 0.4)]:
print(label)
for d in diameters:
print(f" D = {d:6.0f}: SEFD = {exercise_sefd(d, eta=e):.0f}")
# log-log: SEFD vs diameter should be a straight line of slope -2.
dd = np.linspace(20, 110, 100) * u.m
fig, ax = plt.subplots(figsize=(7, 5))
for e in (0.6, 0.4):
ax.loglog(dd.value, [exercise_sefd(d, eta=e).value for d in dd],
label=f"$\\eta$ = {e}")
ax.loglog([d.value for d in diameters],
[exercise_sefd(d).value for d in diameters], "o", color="k")
ax.set_xlabel("dish diameter [m]")
ax.set_ylabel("SEFD [Jy]")
ax.legend()
plt.tight_layout(); plt.show()
slope = np.polyfit(np.log10(dd.value),
np.log10([exercise_sefd(d).value for d in dd]), 1)[0]
print(f"log-log slope = {slope:.2f}")
Expected (at $\eta = 0.6$): 25 m $\approx 281$ Jy, 64 m $\approx 43$ Jy, 100 m $\approx 18$ Jy; dropping to $\eta = 0.4$ multiplies every SEFD by $0.6/0.4 = 1.5$. The fitted slope is exactly $-2$, confirming $\mathrm{SEFD}\propto D^{-2}$: doubling the dish diameter quarters the SEFD (and quadruples the sensitivity).
Recap & what's next¶
We opened the telescope black box and met the two numbers that define a single dish:
- The beam. A uniformly illuminated circular aperture radiates an Airy pattern with a main lobe and $-17.6$ dB sidelobes. Its first null sits at $1.22\,\lambda/D$, giving the diffraction-limited resolution $\theta \approx 1.22\,\lambda/D$. For our 25 m dish at 1.4 GHz that is about 0.7°, embarrassingly coarse — the long radio wavelength is the price of admission.
- The area. Effective area $A_\mathrm{eff} = \eta\,\pi D^2/4$ converts incoming flux to antenna temperature, and the SEFD $= 2 k_B T_\mathrm{sys}/A_\mathrm{eff}$ folds collecting area and system temperature into a single sensitivity number in janskys. Combined with the radiometer equation, SEFD predicts the flux sensitivity of any integration.
The coarse single-dish resolution is exactly the problem aperture synthesis solves: by combining many small dishes spread over kilometres, an interferometer synthesises the resolution of an aperture as large as the array. That is the subject of Chapter 8 — where the $1.22\,\lambda/D$ of this chapter returns as $1.22\,\lambda/B_\mathrm{max}$, with the baseline $B_\mathrm{max}$ standing in for the dish diameter.