sean.theinformed.org / training / orbit / guide
Orbit and upper-atmosphere studies
Seven efforts ran on a supercomputer this week, all reading one public record of satellite orbits. This guide builds up what they measure and how, from the record itself to the checks each run had to pass.
1. The question and why it matters
The United States publishes the orbit of every tracked object in a public catalog: 232.7 million records for 68,900 objects since 1959, several a day for each object now. Operators, researchers and our own sites use it to say when a satellite changed its orbit, how close two objects passed, and how likely a collision was. The catalog does not say how wrong each record is.
The seven efforts ask four questions of that one record.
- Changes. When does an orbit change because an engine fired, and how often does the catalog's own noise look like a change? Two efforts: a rerun of the orbit-change detector on a better reading of orbit size, and a detector that looks for burns repeated on a schedule.
- Errors. How far is each record from the true orbit, in each direction, for every object and every quarter-year of its history? One effort: the error atlas.
- Close passes. How likely was a collision at each close pass, once each object's own error is used? How many of the official warnings does the public record find, and how often do objects meet in the orbits above low Earth orbit? Three efforts.
- The air. Can 16,956 pieces of debris and spent stages, slowing in the upper atmosphere, measure its density day by day from 2004 to 2026? One effort.
The answers matter outside this site. A collision chance computed with an error model that is too narrow in its tails will call a pass safe that is not. A detector that counts its own noise as maneuvers misstates what operators do in orbit.
2. The basics
An element set
Each record in the catalog is an element set: seven numbers that describe an orbit at one instant, called the epoch. Five give the shape and orientation of the orbit and where the object is on it; the mean motion gives revolutions per day; and a drag term says how fast the air slows the object. The catalog fits a new set whenever its radars and telescopes have enough new observations.
What SGP4 does
SGP4 is the set of formulas that turns an element set into a position and velocity at any time. The elements are fitted for SGP4 and mean little without it: they are averages that absorb the pull of Earth's bulge and the drag the formulas model. A day from its epoch, a typical set puts a low-orbit object within about a kilometer of where it is, most of that along the direction of travel.
One quantity the efforts read is the semi-major axis, half the long axis of the orbit, which sets its size. It can be computed straight from the mean motion, or recovered through SGP4's own initialization. The two differ by meters, and the difference follows the orbit's tilt.
A change, and the catalog's own noise
A burn moves the orbit in a step: the semi-major axis jumps after an along-track burn, the tilt after a cross-track one. Drag makes a slow slope. A detector compares the size of a step with the object's own scatter from set to set and flags steps that stand well clear of it. Every fit the catalog makes adds scatter of its own, and when that scatter has occasional large values the detector flags steps that never happened. Debris and spent stages cannot fire engines, so their flag rate measures false alarms directly. Payloads, which can, should be flagged far more often.
Drag the slider.
Heavy-tailed errors
The usual model of measurement error is the normal (bell-shaped) spread: 68% of errors within one standard deviation, 95% within two. Compared with orbits known to the centimeter, the catalog's errors do not behave that way. A normal spread sized to its middle holds 59% to 64% of the errors within one sigma and only 78% to 87% within two. The rest sit far out.
A Student-t spread has one extra number, the degrees of freedom ν, that sets how heavy the tails are. Large ν is the normal spread; small ν puts more errors far out. The catalog's errors fit ν of about 1.9. Below 2 the spread has no finite variance, so its width is given as a scale: half of all errors fall within 0.674 scales, as half of normal errors fall within 0.674 standard deviations.
| within 1 | within 2 | beyond 4 | |
|---|---|---|---|
| normal | |||
| Student-t | |||
| catalog, measured | 0.59 to 0.64 | 0.78 to 0.87 | - |
What "generalize" means here
None of these efforts trains a neural network. They are methods built from physics and statistics, and each still has constants fitted to data: a factor that turns set-to-set scatter into true error, the degrees of freedom of a tail, the score at which the cadence detector declares a train of burns. A constant fitted on some data is trusted only after it holds on data it was not fitted on. Here that means three things.
Each effort also runs a null: the same analysis on data where the effect has been destroyed, such as orbits shuffled between objects or storm dates moved at random. A result that the null reproduces comes from the method. Several efforts also plant a known signal and measure how much of it comes back.
3. The data
The archive holds every public element set since 1959 together with the hour each one reached us: 232.7 million sets, 68,900 objects, 15.9 GB. Before 2026 it was filled from yearly bulk files. January to July 2026 was rebuilt from the catalog's per-object history service, since the 2026 bulk file arrives in early 2027. Since 7 August 2026 an hourly capture adds new sets as they appear and holds about 99.4% of what the catalog publishes.
Six other sources join it, by catalog number or by time.
- Precise orbits. Navigation satellites, laser-ranged spheres and altimetry satellites whose positions are known to centimeters from the international GNSS, laser-ranging and DORIS services. They are the truth against which catalog error is measured: 122 to 148 satellites in the Septembers of 2023 to 2026. None is debris or a rocket body.
- Operator positions. SpaceX publishes predicted positions for its Starlink satellites. These are the operator's prediction, so they are kept apart from independent truth.
- Conjunction messages. The catalog's operator warns of predicted close passes; the public table reaches back about five weeks. We pull it three times a day: 3,944 messages since late August 2026.
- Decay dates, space weather and the object table. When each object reentered (34,089 have a date); the planetary geomagnetic index Kp since 1932 and the solar radio flux F10.7, which mark 43 storm onsets and 6,166 quiet days from 2003 to 2026; and each object's type.
Where the record has seams
- Cadence. The hourly pull ran every other hour until 2 October 2026. From October 2025 the navigation satellites' sets arrive under an hour apart twice as often (0.089 of gaps to 0.201), which doubles their apparent set-to-set scatter while their true error stays near 1.5 km.
- Object types. On 1 and 2 October, 35,455 objects that had no type were given one. The detector rerun used the object table of 23 September; 15 objects changed group between the original 20 September read and that table, which is enough to move its control counts.
- The frozen copy. The copy of the archive our two papers cite no longer exists. Any earlier state is rebuilt by keeping only rows that arrived before a given hour; nothing is ever deleted from the archive, so that cut is exact.
The cluster copy was taken at 00:33 UTC on 3 October 2026, sent once, and read in place by every later package.
4. The methods
Nothing here is a trained network. Each effort is a fixed computation over the archive: propagate orbits with SGP4, fit lines and steps, compare with truth, count. What makes them supercomputer jobs is scale: every object, every set, every day, with thousands of resampled and shuffled copies for the nulls. Each diagram reads top to bottom, with the size of the data at each stage.
5. How a run is built
In place of a training schedule, each effort has a run schema: how the work is cut into pieces, how the pieces spread across one node, how a stopped job picks up again, and what it costs.
One node, many workers
A job asks for one whole node. Most runs used CPU nodes with 128 cores (AMD EPYC 7713) and 256 GB of memory. The detector's timing job ran on a node that also carries four NVIDIA A100 graphics processors with 40 GB each and 512 GB of memory; it ran a 1-in-25 sample on the graphics processors and on the CPU and compared them. The full detector run then went to a CPU node. The work is millions of small fits, one per object or window, and spreads well over 124 Python workers.
Shards and DONE markers
A plan step cuts the work into shards: 1,024 runs of consecutive catalog numbers balanced by row count for the detector, 2,048 for the thermosphere study, one per object or day for the others. Workers take shards in turn. Each finished shard writes its output and a small DONE marker. A job that stops for any reason is submitted again, and finished shards are skipped.
1,024 shards waiting.
A timing job first, the run held behind it
Every package submits two jobs at once. A timing job on the 30-minute debug queue runs every step on a small sample and prints the wall hours and core-hours the full run needs. The production run is submitted with a dependency, so it starts only if the timing job finishes cleanly. If the estimate is far above the planned figure, the held run is resized before it starts, which takes the operator's word.
The environment
Each package builds a Python virtual environment on the center's own Python 3.11 module, with the numerical libraries pinned to versions that module supports, and runs synthetic checks before any job is queued. The first submissions built their environment against an interpreter found on the login node and missing on the compute nodes; they failed in 7 to 42 seconds. Building on the center's module fixed every package at once. No container image was needed.
What it cost
A node-hour is one hour on one whole node, billed as 128 core-hours.
The figures are what the scheduler charged for each job in the last 7 days, read from the status page's data file when this page was built. The two screen runs were still running then, so their bars hold only the time used so far.
6. Evaluation
Each effort's study plan sets its pass lines, its nulls and the planted signals before the job is queued. The error atlas is the exception: its lines were written after a one-year slice of the same truth had been read, so its results are labeled provisional.
Orbit-change detector, SGP4 axis
- met Payloads flagged at least 10 times as often as passive objects: 18.212.
- read Corroborations lost on the new axis: 89 of 3,760 (2.37%), above the shuffled band of 0.29% to 0.59%.
- not met Published counts reproduced: 22 of 36 inside their ranges; 15 objects changed type between the read and the table.
- not met Axis changes counts more than the halves of a record differ: ratio 0.085 for debris, 0.040 for payloads.
Close-pass chances
- not met Normal spread holds 90% within two sigma: 0.812 radial, 0.781 along track, 0.865 cross track.
- met Student-t with 1.87 degrees of freedom holds the held-out half, both ways round.
- met Shuffled objects: 1 pair under 1 km against a summed chance of 0.479 (interval 0.03 to 5.57).
- met Round case matches the site's figure to 1.3e-06; 99.89% of passes reproduce their miss within 10 m.
Cadence detector
- not met Finds at least 0.30 more of the planted 50 mm/s cross-track burns than the step detector: +0.0027.
- met Burn-free ring windows declaring a cadence at most 5%: 0.0111.
- met Period survives the shuffle in at most 10% of planted trains: 0.0182.
- not met The same on real payload windows: 0.1228.
- not met Period within 10% in at least 80% of trains: 0.7610.
- met Recovered over planted impulse within 0.80 to 1.25: 0.9741.
Error atlas (provisional)
- met Held-out Student-t coverage, all classes pooled: 0.915 to 0.980 within two scales.
- not met The same for each class alone: medium, geosynchronous and low orbit each miss one value.
- met Planted tails and scales recovered; class factors differ more than scrambled labels give; the close-pass fit reproduced exactly.
- not met A doubled error shows in every direction; class factors stable across Septembers; an object's own scatter predicts its own error.
Thermosphere density
- met Quiet days within a factor of 1.5 of the model below 600 km and 2 above: 0.874 to 0.999 of shell-days.
- not met Storm rise at least 3 times the quiet spread in five shells from 250 to 650 km: 1.76 to 2.33 times.
- not met Planted factor of 1.5 recovered in every shell from 250 to 600 km: 0.791 at 250 to 300 km.
- met Shuffled storm dates and objects scrambled across shells both fall short of the real response.
- read Ratio to the model alone: rises 1.074 to 1.144 on storm days from 200 to 600 km, above every shuffled 99th percentile; inside it above 650 km.
Full-depth close-pass screen (two efforts)
- pending Timing job done in 30 minutes; the conjunction-message run and the deep-orbit run are waiting.
What the nulls showed
- Detector. Giving each object another object's inclination loses 0.29% to 0.59% of corroborations; the real SGP4 axis loses 2.37%, so the difference between axes is real and small.
- Close passes. The first shuffle paired passes and gave 208 pairs under 1 km against 44.8 expected; 174 of them handed a satellite back its own partner. Shuffling objects instead gave 1 against 0.479. This null catches a wrong pairing; it cannot test whether the ellipses are the right size.
- Cadence. Ring objects that never burn score as high as planted 50 mm/s trains (99th percentile 77.40 against a planted median of 21.09), so any level that holds them to 1% loses almost every burn.
- Thermosphere. Moving storm dates at random tests the recovered density, which is the measured ratio times the model, so the model's own storm term passes it at every height. The same null on the ratio alone shows the catalog's own storm signal from 200 to 600 km and none above 650 km. That second reading was computed after the run and is provisional.
- Atlas. Shuffling truth among objects shows an object's own scatter predicts its own error only in medium orbit, radially and along track.
What a null result means
A line that is not met is a measurement. The cadence detector, held to the false-alarm rate of burn-free ring objects, finds 0.62% of planted 50 mm/s cross-track burns, so it cannot carry the retirement test our first paper needs. The detector rerun shows the choice of orbit-size reading moves per-object counts by a tenth of the spread between halves of one record. Each such line removes a use the method cannot support and names the next measurement, listed in the notebook entries.
7. Reading the status page and the replay
The status page shows where each effort stands now and how it got there.
- Summary line. Jobs running, finished and waiting, and when the page last pulled from the cluster. A pull older than 30 minutes is marked stale.
- Cards. One per effort: its state, its latest scored result in a sentence, and the node-hours it has used. The colored chip follows the board above: met, not met, being read, waiting.
- Timeline. One bar per job from submission to finish. A gap between a timing bar and its run bar is time in the queue.
- Replay. The scrubber walks through the week: tasks completing inside each run and the events around them (submitted, started, finished, results home, scored). Play runs it forward, step moves one event at a time, and the clock and node-hours move with it.
The research notebook holds the full record of each effort, one dated entry per design, run, result and review. The about page has the short form of this guide.
8. Glossary
- Bootstrap
- Recomputing a figure on many resamples of the data, here whole objects, to see how much it moves.
- Close pass
- Two objects coming within 10 km of each other; the miss distance is at closest approach.
- Conjunction message
- A warning the catalog's operator issues when it predicts a close pass.
- Core-hour, node-hour
- One core for an hour; one whole node of 128 cores for an hour, or 128 core-hours.
- Corroboration
- A second channel, tilt or shape of the orbit, that moves at the same time as a flagged step in size.
- Coverage
- The share of true errors that fall inside a stated width, such as two scales.
- Debug queue
- A short queue for jobs of 30 minutes or less, used here for timing jobs.
- Degrees of freedom (ν)
- The Student-t parameter that sets tail weight; below 2 the spread has no finite variance.
- DONE marker
- A small file a shard writes when it finishes, so a resubmitted job skips it.
- Element set
- Eight numbers describing an orbit at one instant, published by the catalog.
- Epoch
- The instant an element set describes.
- Held out
- Data kept out of a fit and used only to check it.
- Jeffreys interval
- A confidence interval for a rate from a count of events, sound for small counts.
- Matched filter
- A detector that adds the data at the places a known pattern predicts, here a train of steps at one period.
- Null
- The same analysis on data with the effect destroyed, to show what the method makes on its own.
- Passive object
- Debris or a spent rocket stage, which cannot change its own orbit.
- Planted signal
- A known effect added to real data to measure how much of it the analysis recovers.
- Scale
- The width of a heavy-tailed spread, set so half of all errors fall within 0.674 of it.
- Semi-major axis
- Half the long axis of an orbit; it sets the orbit's size and period.
- Separation
- How many times more often the detector flags payloads than passive objects.
- SGP4
- The standard formulas that turn an element set into a position and velocity.
- Shard
- One piece of a run's work, done by one worker.
- Shell
- A 50 km layer of altitude used to group objects in the density study.
- Student-t
- A bell-shaped spread with heavier tails than the normal, set by its degrees of freedom.
- Thermosphere
- The upper atmosphere from about 90 to 1,000 km, whose density rises sharply in geomagnetic storms.
- Timing job
- A short job that runs a sample of the work and estimates what the full run will need.