Jupiter Radio Bursts
Jupiter is the strongest radio source in the solar system after the Sun. Its decametric emissions (roughly 15-40 MHz) occur when Io passes through specific orbital positions relative to Jupiter’s rotating magnetic field. pg_orbit computes the two geometry parameters that govern these bursts — Io phase angle and Jupiter Central Meridian Longitude — and maps them to an empirical burst probability using the Carr et al. (1983) source regions.
This is the feature built for the Radio JOVE community. There are 500-1000 active Radio JOVE operators worldwide, and until pg_orbit, the standard prediction tool was Radio Jupiter Pro — a Windows-only desktop application. Batch prediction, calendar generation, and integration with observation scheduling are now possible in SQL.
How you do it today
Section titled “How you do it today”Jupiter radio observation planning has relied on a small set of tools:
- Radio Jupiter Pro (Windows): The standard tool. Shows a real-time display of Io phase, CML, and burst probability. Single-observer, single-time, no batch output. Windows-only.
- Manual CML/Io-phase charts: Published charts (Carr, Desch, Alexander 1983) show which CML-Io phase combinations produce bursts. Observers print the chart and overlay their observing window by hand.
- Radio-SkyPipe and SkyPipe II: Recording software that can trigger on signal, but prediction is separate.
- Spreadsheets: Some operators maintain Excel sheets that compute CML from Jupiter’s rotation rate. Error-prone, per-session.
The problem: planning an observation campaign over weeks or months means running Radio Jupiter Pro repeatedly for each night, eyeballing the probability, and writing down the good windows. There is no way to generate a calendar of optimal observation windows in one operation.
What changes with pg_orbit
Section titled “What changes with pg_orbit”Three functions cover the complete Jupiter radio prediction pipeline:
| Function | Returns | What it computes |
|---|---|---|
io_phase_angle(time) | degrees [0, 360) | Io’s orbital position. 0 = superior conjunction (behind Jupiter). |
jupiter_cml(observer, time) | degrees [0, 360) | Central Meridian Longitude, System III (1965.0). Light-time corrected. |
jupiter_burst_probability(io_phase, cml) | 0.0 to 1.0 | Empirical probability based on Carr source regions. |
The probability function encodes four source regions from the Carr et al. (1983) model:
| Source | CML Range | Io Phase Range | Probability | Description |
|---|---|---|---|---|
| A | 200-260 | 195-265 | 0.8 | Strongest. Io-related, occurs when Io is at superior conjunction. |
| B | 100-200 | 60-150 | 0.5 | Io-related, occurs when Io is ~90 degrees ahead of Jupiter. |
| C | 300-20 | 220-310 | 0.3 | Weaker. Non-Io component, occurs at specific CML ranges. |
| D | 350-60 | 80-140 | 0.2 | Weakest of the four. Non-Io related. |
Outside these regions, the probability is 0.0. Overlapping regions combine to the higher probability.
What pg_orbit does not replace
Section titled “What pg_orbit does not replace”- No signal detection. pg_orbit predicts when bursts are likely, not whether one is occurring. Use Radio-SkyPipe or SDR software for actual signal capture.
- No frequency prediction. The model predicts occurrence probability, not the specific frequency structure (L-bursts vs. S-bursts) or intensity.
- No RFI assessment. Local radio interference is often the biggest obstacle to Jupiter observation. pg_orbit does not model your local RF environment.
- No receiver pointing. At 20 MHz, most receivers use fixed dipole antennas. Pointing is not an issue, but Jupiter must be above the horizon. Combine with
planet_observe(5, ...)to check elevation.
Try it
Section titled “Try it”Check current conditions
Section titled “Check current conditions”What are the Io phase and CML right now?
SELECT round(io_phase_angle(now())::numeric, 1) AS io_phase, round(jupiter_cml('40.0N 105.3W 1655m'::observer, now())::numeric, 1) AS cml, round(jupiter_burst_probability( io_phase_angle(now()), jupiter_cml('40.0N 105.3W 1655m'::observer, now()) )::numeric, 3) AS burst_prob;Best burst windows tonight
Section titled “Best burst windows tonight”Scan the next 12 hours in 10-minute steps and find windows where burst probability exceeds 30%:
SELECT t, round(io_phase_angle(t)::numeric, 1) AS io_phase, round(jupiter_cml('40.0N 105.3W 1655m'::observer, t)::numeric, 1) AS cml, round(jupiter_burst_probability( io_phase_angle(t), jupiter_cml('40.0N 105.3W 1655m'::observer, t) )::numeric, 3) AS probFROM generate_series( now(), now() + interval '12 hours', interval '10 minutes') AS tWHERE jupiter_burst_probability( io_phase_angle(t), jupiter_cml('40.0N 105.3W 1655m'::observer, t)) > 0.3ORDER BY t;Best windows tonight with horizon check
Section titled “Best windows tonight with horizon check”The complete query: burst probability above threshold AND Jupiter above the horizon:
SELECT t, round(io_phase_angle(t)::numeric, 1) AS io_phase, round(jupiter_cml('40.0N 105.3W 1655m'::observer, t)::numeric, 1) AS cml, round(jupiter_burst_probability( io_phase_angle(t), jupiter_cml('40.0N 105.3W 1655m'::observer, t) )::numeric, 3) AS prob, round(topo_elevation(planet_observe(5, '40.0N 105.3W 1655m'::observer, t))::numeric, 1) AS jupiter_elFROM generate_series( '2024-03-15 00:00:00+00'::timestamptz, '2024-03-15 12:00:00+00'::timestamptz, interval '10 minutes') AS tWHERE jupiter_burst_probability( io_phase_angle(t), jupiter_cml('40.0N 105.3W 1655m'::observer, t)) > 0.0AND topo_elevation(planet_observe(5, '40.0N 105.3W 1655m'::observer, t)) > 10ORDER BY prob DESC, t;30-day observation calendar
Section titled “30-day observation calendar”Generate a calendar of the best observation windows over an entire month:
WITH windows AS ( SELECT t, io_phase_angle(t) AS io_phase, jupiter_cml('40.0N 105.3W 1655m'::observer, t) AS cml, jupiter_burst_probability( io_phase_angle(t), jupiter_cml('40.0N 105.3W 1655m'::observer, t) ) AS prob, topo_elevation(planet_observe(5, '40.0N 105.3W 1655m'::observer, t)) AS jupiter_el FROM generate_series( '2024-03-01 00:00:00+00'::timestamptz, '2024-03-31 00:00:00+00'::timestamptz, interval '10 minutes' ) AS t)SELECT t::date AS date, t::time AS utc_time, round(io_phase::numeric, 1) AS io_phase, round(cml::numeric, 1) AS cml, round(prob::numeric, 2) AS prob, round(jupiter_el::numeric, 1) AS jup_elFROM windowsWHERE prob >= 0.5 AND jupiter_el > 15ORDER BY date, utc_time;This finds every 10-minute window in March 2024 where burst probability is at least 50% and Jupiter is more than 15 degrees above the horizon. The result is a printable observation calendar.
Identify Carr source regions
Section titled “Identify Carr source regions”Determine which source region is responsible for a given prediction:
WITH sources AS ( SELECT 'Source A' AS region, 200.0 AS cml_lo, 260.0 AS cml_hi, 195.0 AS io_lo, 265.0 AS io_hi, 0.8 AS prob UNION ALL SELECT 'Source B', 100.0, 200.0, 60.0, 150.0, 0.5 UNION ALL SELECT 'Source C', 300.0, 380.0, 220.0, 310.0, 0.3 UNION ALL SELECT 'Source D', 350.0, 420.0, 80.0, 140.0, 0.2)SELECT t, round(io_phase_angle(t)::numeric, 1) AS io, round(jupiter_cml('40.0N 105.3W 1655m'::observer, t)::numeric, 1) AS cml, s.region, s.probFROM generate_series( '2024-03-15 00:00:00+00'::timestamptz, '2024-03-15 12:00:00+00'::timestamptz, interval '15 minutes') AS tCROSS JOIN sources sWHERE io_phase_angle(t) BETWEEN s.io_lo AND s.io_hi AND (jupiter_cml('40.0N 105.3W 1655m'::observer, t) BETWEEN s.cml_lo AND LEAST(s.cml_hi, 360.0) OR jupiter_cml('40.0N 105.3W 1655m'::observer, t) + 360.0 BETWEEN s.cml_lo AND s.cml_hi)ORDER BY t, s.prob DESC;Io orbital phase rate
Section titled “Io orbital phase rate”Io completes an orbit in about 1.77 days. Watch the phase angle advance over a full orbit:
SELECT t, round(io_phase_angle(t)::numeric, 1) AS io_phaseFROM generate_series( '2024-03-15 00:00:00+00'::timestamptz, '2024-03-16 18:00:00+00'::timestamptz, interval '2 hours') AS t;The phase should advance roughly 203 degrees per day (360 / 1.77).
Jupiter CML rotation
Section titled “Jupiter CML rotation”Jupiter’s System III rotation period is 9h 55m 29.7s. Watch the CML cycle through 360 degrees:
SELECT t, round(jupiter_cml('40.0N 105.3W 1655m'::observer, t)::numeric, 1) AS cmlFROM generate_series( '2024-03-15 00:00:00+00'::timestamptz, '2024-03-15 10:00:00+00'::timestamptz, interval '30 minutes') AS t;The CML completes one full rotation in just under 10 hours, meaning the same magnetic field geometry repeats roughly 2.4 times per day. This is why Jupiter radio observation windows can occur multiple times per night.
Probability heatmap data
Section titled “Probability heatmap data”Generate the data for a CML vs. Io-phase probability plot (the classic Carr diagram):
SELECT io_phase, cml, jupiter_burst_probability(io_phase, cml) AS probFROM generate_series(0, 355, 5) AS io_phase, generate_series(0, 355, 5) AS cmlWHERE jupiter_burst_probability(io_phase, cml) > 0;This produces a 72x72 grid (5-degree resolution) of probability values, showing exactly the four Carr source regions. The output can be fed to any heatmap visualization tool.
Multi-observer comparison
Section titled “Multi-observer comparison”Compare burst windows for operators at different longitudes. The CML depends on observer position because of light-time correction:
WITH observers(name, obs) AS (VALUES ('Boulder, CO', '40.0N 105.3W 1655m'::observer), ('Gainesville, FL', '29.6N 82.3W 30m'::observer), ('Paris, FR', '48.9N 2.3E 75m'::observer))SELECT o.name, t, round(jupiter_cml(o.obs, t)::numeric, 1) AS cml, round(jupiter_burst_probability( io_phase_angle(t), jupiter_cml(o.obs, t) )::numeric, 3) AS probFROM observers o, generate_series( '2024-03-15 02:00:00+00'::timestamptz, '2024-03-15 06:00:00+00'::timestamptz, interval '30 minutes' ) AS tWHERE jupiter_burst_probability( io_phase_angle(t), jupiter_cml(o.obs, t)) > 0.3ORDER BY t, o.name;The Io phase is the same for all observers (it depends only on time), but the CML varies slightly due to light-time differences. For observers on the same continent, the difference is negligible. Comparing North America to Europe shows a measurable shift.