On 19 September 2022 the ATLAS survey photographed a near-Earth asteroid now called 2022 SF289. Over the following weeks it recorded the object again: three detections on each of four nights. Each of those detections was in the survey’s catalogue. And yet the object was not discovered. ATLAS’s discovery logic expected four detections within a single night, and a body seen three times a night never produced the short, convincing streak of motion that the pipeline was built to recognise. The twelve measurements sat in the archive as unrelated points for ten months. On 18 July 2023 a new linking program, HelioLinC3D, being prepared for the Rubin Observatory, connected the four nights, and the object was announced as a potentially hazardous asteroid about 600 feet across (University of Washington 2023).
Nothing about the photons changed between September 2022 and July 2023. What changed was the answer to a purely combinatorial question: which of the many millions of catalogued detections belong to the same body? That question is called linking, and it is the subject of this chapter. It sits between source detection, covered in Chapter 10, and orbit determination, covered in Chapter 13. It is easy to state and hard to do, because almost all of the candidate associations are wrong and their number grows as a high power of the survey’s density, depth and time baseline.
The scale is stark. In 2007 Jeremy Kubica and colleagues tested a fast tree-based linker on a simulation of the planned Pan-STARRS survey. It found 154,109 of the 156,693 correct multi-night tracks, a 98.4% success rate. To do so it emitted 44,814,287 candidate tracks, so that only about one candidate in 300 was real (Kubica et al. 2007). Every one of the others had to be killed by orbit fitting. This chapter is about how the field learned to keep that ratio under control.
The linking problem
Detections, tracklets, tracks and orbits
Four words recur, and it pays to keep them distinct. A detection is a single catalogued source in one image: a position, a time, a flux and their uncertainties. It says nothing about identity. A tracklet joins two or more detections taken a few minutes to an hour or two apart on the same night, close enough in time that the body moves in a straight line. A tracklet measures a position and an angular velocity. A track joins tracklets from different nights. An orbit is a six-parameter dynamical solution that fits every detection in a track within its errors. Only when an orbit is accepted does a track become what Pan-STARRS called a derived object, a candidate physical body (Denneau et al. 2013).
These stages have very different costs and very different noise. Detection is a question about pixels. Tracklet formation is a nearest-neighbour search within a night. Track formation is where the combinatorics live. Orbit fitting is expensive per candidate but is the only stage that tests the physics.
Four numbers, six unknowns
The physical signal is a sequence of directions from a moving observatory to a body orbiting the Sun. If is the body’s heliocentric position and the observatory’s, the observed unit vector is
where is the topocentric distance and the light-travel time. A short tracklet measures two angles and their two rates of change. An orbit has six parameters. The two that are missing are, to a good approximation, the distance and the radial velocity . Nothing in a single night’s straight-line motion pins them down.
This is the root of the whole problem. Two tracklets from different nights are compatible with one body if some choice of the two missing numbers carries one into the other. Every linker is a strategy for searching over those hidden numbers, or for getting around them, without trying every pair and triple of tracklets.
There are two broad families. The sky-plane linkers, of which the kd-tree MOPS of Pan-STARRS and early Rubin plans is the archetype, model the apparent track on the sky as a low-order polynomial and search for tracklets that fit it. The transform linkers, HelioLinC and THOR, guess the missing distance information, transform every detection into a frame where the true motion is simple, and look for clusters there. A third family, the sparse-epoch linkers built for the Dark Energy Survey, applies the transform idea to detections separated by months and years, with almost no within-night motion to work from.
Counting accidental associations
Why is linking hard? Because chance coincidences grow faster than real ones. Consider pairing detections within one night. Suppose the catalogue has a total density of detections per square degree, and that real bodies move at angular speeds between and . For two images separated by , a detection in the first image can be paired with anything in an annulus of area
in the second. Over a field of area and image pairs, the expected number of accidental pairs is
Writing for asteroids plus false positives, splits into false–false, false–real and real–real-but-different-object terms (Jones et al. 2018, Appendix A). The true pairs, by contrast, number about : linear in density, not quadratic.
R. Lynne Jones and colleagues worked a fiducial example for the Rubin survey. With degree per day and minutes, the search radius is about 1.3 arcminutes and the annulus covers about 0.0014 square degrees. With 100 asteroids and 400 false detections per square degree, a typical night yields about half a million true tracklets and 1.5 million false ones. These are rounded design estimates, not measurements, but they set the scale.
The quadratic growth is only the start. To make a track one needs at least three tracklets on three nights, and the search region for the third depends on how well the first two predict it. A tracklet’s velocity is poorly measured. For two detections each with per-coordinate error separated by , a least-squares line gives
at the midpoint epoch. With Rubin’s assumed 150 mas total astrometric error, Jones et al. find arcsec per day, or 7.2 arcsec per day for a 30-minute pair. A week of linear extrapolation therefore leaves a 50-arcsecond positional uncertainty from measurement error alone. For near-Earth objects the unmodelled curvature is worse: even between consecutive nights, linear extrapolation misses by about an arcminute, against 7 arcseconds of measurement error. The search ellipse on the next night is large, and it grows with the time gap.
Jones et al. fit the numerical result for the number of false candidate tracks in a search window of days:
It assumes 100 asteroids per square degree and a three-day revisit, and the authors warn that it holds only near the fiducial values. Even so, the exponents tell the story.
Doubling the time window multiplies the false tracks by . Halving it, from 30 nights to 15, cuts the fiducial false tracks to about 18,000. Doubling the false-detection density multiplies them by . Every choice that would find more objects (longer windows, deeper thresholds, sparser cadence) makes linking disproportionately harder. Meanwhile the number of true tracks grows only linearly. This is why a 2018 projection found that stretching Rubin’s linking window from 15 to 30 days would raise ten-year completeness for potentially hazardous asteroids only from 65.6% to 68.4% (Jones et al. 2018, Table 3): the gain is real but the cost is steep.
Two more counts complete the picture. A window of nights contains night triples: 455 for 15 nights and 4,060 for 30. If the window slides forward one night at a time and every new track must end on the newest night, only triples are new, 91 and 406 respectively. Caching old work therefore helps by about a factor of ten, though it does nothing for the density inside each triple. And velocity consistency is a powerful rejector of random coincidences. At the paper’s tolerances, 0.12 and 0.03 degrees per day in the two velocity components, a random tracklet has about chance of matching, so two independent velocity checks suppress false tracks by about . That suppression applies to noise. It does not apply to pairs of real asteroids, whose velocities are strongly correlated because neighbouring main-belt asteroids move alike.
There is no single detection statistic
In matched filtering, a detection is a threshold crossing of one statistic (Chapter 1). Linking does not work that way. Acceptance is a cascade: geometric gates, residuals from a polynomial fit, an initial orbit, a refined orbit, its residual , conflict resolution between candidates that share detections, and often a human. The final orbit fit gives a goodness-of-fit statistic,
summing over detections with residual and covariance . Its survival probability is a test of the fit. It is not the probability that the linkage is real, because the search tried an enormous number of hypotheses and kept the best ones.
Three efficiencies must also be kept apart. The first is the chance that a body yields enough usable detections at all, set by weather, depth, chip gaps and cadence. The second is the linker’s completeness given those detections. The third is the purity of what comes out. Most published numbers report the second, and many survey forecasts simply assume it. Peter Vereš and Steven Chesley, testing the Pan-STARRS linker on simulated Rubin data, found that a fixed 0.4-arcsecond residual cut was far too permissive. Replacing it with a normalised-residual cut at left 3,816 clean linkages among 3,979 accepted orbits, about 96% purity (Vereš & Chesley 2017). Even then, most of the remaining errors were not artefacts at all but pairs of real main-belt asteroids whose combined short arc happened to fit an orbit.
From three images a night to two
Classical asteroid surveys took several exposures of each field in a night and looked for objects moving in straight lines. Three or more detections in one night gave internal confirmation before anything reached the Minor Planet Center. At the depth planned for Pan-STARRS that habit became expensive, because every extra visit to a field was time not spent covering new sky. Kubica et al. made the arithmetic explicit: taking two images per night rather than three covers 50% more sky with the same number of exposures. The price was that each night would yield pairs, not convincing triples, and a pair of detections is easy to forge from noise. The burden of confirmation would move from the telescope to the software.
The proposed four-telescope Pan-STARRS was designed to reach about at signal-to-noise five, with about 250 asteroids and 250 false detections per square degree near the ecliptic. Development of the Moving Object Processing System, MOPS, began in 2003. Larry Denneau built the system, Robert Jedicke brought survey and population expertise, Kubica and Andrew Moore at Carnegie Mellon supplied the spatial-search algorithms, and Andrea Milani’s group contributed orbit determination. Before Pan-STARRS opened its shutter, the team ran MOPS on Spacewatch catalogues, and the real data immediately demanded filters for overdense regions and for linear artefacts from diffraction spikes, detector edges and satellites (Kubica et al. 2007).
The prototype telescope, Pan-STARRS1, a 1.8-metre instrument with a field of about seven square degrees, began its main survey in spring 2010. Reality differed from the design in instructive ways (Denneau et al. 2013). The camera’s effective fill factor was about 75%. False detections ran 10 to 50 times above the planned rate, and they were clustered and aligned rather than scattered at random. In October 2010 the relevant survey switched to four exposures per field, about 15 minutes apart, and the pipeline sought three- or four-detection tracklets. A human “czar” now vetted tracklets before submission to the Minor Planet Center, because early automatic submission of derived objects had produced too many false objects. Pairs were sought only at slow (0.3–0.7 degrees per day) and fast (1.2–5 degrees per day) speeds. In between, confusion was too high. Above the gap, visible trailing helped reject false pairs. The gap was an operational choice, not a law of orbits.
The fill factor alone shows why six-detection discovery was so costly. If a fraction of the focal plane is live and losses are independent, the chance that all six detections of a three-night, two-per-night discovery land on live pixels is . For that is 0.178. If losses are perfectly correlated it is . Denneau et al. give the bound . Their text quotes a lower figure of 26%, which does not match . The formula, not the printed number, is the safe thing to carry forward.
The system worked nonetheless. By late 2012 Pan-STARRS had discovered 30 comets, eight of them in October 2012 alone. Its lasting contribution to the literature, though, is a frank accounting of how many associations were available, recovered, mixed and false at each stage.
Classical linking: kd-trees and MOPS
Trees that can reject whole regions
A kd-tree recursively splits a set of low-dimensional points. Each node stores the bounding box of the points below it. Kubica et al. split each node at the midpoint of its widest dimension and stop at a fixed leaf occupancy. The point of the tree is not storage. It is rejection: if the bounding box of a node proves that no point inside can satisfy a query, the whole subtree is skipped without looking at a single point.
For a query point and a box , the minimum distance is computed coordinate by coordinate: zero along any axis where lies within the box’s extent, otherwise the distance to the nearer face. The maximum distance uses the farthest corner. These cheap bounds replace many point-to-point tests. They must use the same metric as the actual query. A distance in right ascension alone is not an angle on the sky, and near the celestial poles a fast body can sweep through hours of right ascension while moving only a few degrees.
The tightness of those boxes matters more than anything else. The early Rubin implementation of MOPS initially gave each node a box covering its whole partition of space. Switching to boxes that enclosed only the node’s actual data, expanded by their error bars, sped inter-night linking up by factors of 1,000 to 10,000 in that development comparison (Myers, Jones & Axelrod 2013). That is a warning about loose bounds, not a speedup available over any competent code. But it shows where the leverage is.
A balanced tree costs to build in fixed dimension and to store. No tree can do better than on a query that must return points, so when the valid output is huge, so is the cost.
Tracklets by sequential initiation
Within a night, Kubica’s tracklet finder builds a three-dimensional tree in position and time. Each detection seeds a cone-shaped search for later detections reachable at an allowed speed. For a node lying entirely later than the seed’s time , with time span , the node is rejected if
The first condition says no point in the node is reachable even at top speed. The second says every point is too close even at minimum speed. A surviving pair defines a line, which predicts where later detections should be. The finder extends the line, branching when there are several continuations, refits, and checks span and residuals:
tree = build_position_time_tree(all detections of the night)
for seed in detections:
for partner in cone_query(tree, seed, speed_bounds, time_bounds):
line = fit(seed, partner)
extend line into later exposures, branching on ambiguous matches
refit; apply span, residual and optional trail-shape checks
emit accepted tracklet with its detection IDs
One detection is allowed to belong to several tracklets. Committing each detection to its first plausible partner would lose real objects whenever a false pair happened to be found first. “Greedy” in Kubica’s paper means seeking the longest consistent tracklet, not assigning detections irrevocably.
Implementations differ. The early Rubin code built a two-dimensional tree per image, returned compatible pairs, and merged them later. A body seen in four images therefore first appears as six pairs. “MOPS findTracklets” names a family of algorithms with different outputs, not one algorithm.
Trails are free information
A fast-moving body leaves a trail during a single exposure. Its length divided by the exposure time gives the speed, and its axis gives the direction up to a sign (Chapter 11). Instead of searching a full disc for a partner, the linker searches only the region consistent with that velocity, and can require the two trails to agree. In Kubica’s simulation this raised tracklet purity at opposition from 30.7% to 89.2%, and in the low-elongation “sweet spots” from 26.4% to 84.7%, with recovery near 100% either way. Vereš and Chesley found that using trail-derived rates for 1.2–2 degrees per day cut the fraction of mixed tracklets from 16.9% to 4.9%. Equal recovery at the tracklet stage can hide a threefold difference in the work passed downstream.
Collapsing duplicates
Many short pairs describe the same body. Propagate each to a common epoch ,
and look for clusters in common-epoch position and velocity. Pan-STARRS did this with a four-dimensional kd-tree in . This is a Hough-like step: a physical straight track becomes a point in parameter space. Merged tracklets are refit, outliers are purged, and tracklets whose detections are a subset of a longer one are removed using an inverted index from detection ID to tracklets. This housekeeping matters, because duplicate tracklets multiply the endpoint combinations in the next stage.
Variable trees across nights
The inter-night search is the heart of MOPS. Each tracklet becomes a point in position and velocity at its epoch. The goal is to find triples of tracklets on different nights that fit one quadratic path,
where the “acceleration” is apparent, mostly due to the observer’s motion and changing projection, and is bounded by a configured range.
Kubica’s insight was to search pairs of tree nodes rather than pairs of tracklets. Take a node from the tree of the first night and a node from the tree of the last night. Together they define a family of quadratic paths: every path that starts in the first box and ends in the second with an allowed acceleration. Keep a list of support nodes, nodes in the trees of intermediate nights that might contain a confirming tracklet. Ask whether any path in the family can pass through each support box. Drop the support nodes that fail. If fewer than the required number of distinct nights still have support, discard the entire endpoint pair, and with it every tracklet pair it contains. Otherwise split an endpoint node and recurse.
search(A, B, support, allowed_acc):
acc = intersect(allowed_acc, acceleration_bounds(A, B))
if acc is empty: return
support = [S for S in support if some path in (A, B, acc) meets S]
split support nodes that are too coarse to prune well
if support covers too few distinct nights: return
if A and B are leaves:
fit actual detections of each A-tracklet, B-tracklet, support-tracklet triple
emit candidates that pass the residual tests
else:
split A or B; recurse on the children with the narrowed acc
The acceleration test can be made concrete with interval arithmetic. In one coordinate, let the endpoint epochs be separated by , and let the boxes give intervals for position and velocity at the first epoch and at the second. A constant acceleration must satisfy all three of
where every operation is on intervals (subtracting an interval swaps its endpoints). Intersect these with the configured acceleration range in each sky coordinate. If any intersection is empty, the node pair is impossible. If not, the pair is merely not yet ruled out, because interval arithmetic forgets the correlations between variables. This compact form is a re-expression of the three constraints in the early Rubin design document, LDM-156, whose authors found this bound update to be the main CPU hotspot (Myers, Jones & Axelrod 2013).
The division of labour is the important design point. The tree search uses a cheap, conservative model and never rejects anything that a better model would accept. Only at the leaves are real detections fitted with a richer model, including a topocentric correction and higher polynomial order where the data support it. Tighter final validation reduces output without needing the coarse model to be exact.
Why insist on three nights? A tracklet gives four well-measured numbers. A second tracklet constrains the orbit but can almost always be fitted by some orbit, so two-night links are cheap to forge. A third tracklet provides both a test and leverage in time. Three nights is a practical rule for robustness, not a theorem. Kubica’s design goal was three nights within about two weeks, with speeds up to 10 degrees per day and apparent accelerations up to 0.02 degrees per day² per coordinate.
What it cost
Kubica’s full-density experiment linked 154,109 of 156,693 available tracks while emitting 44.8 million candidates, in 13,642 seconds on one 3-GHz Pentium. The figure below shows how that output scaled across four synthetic populations sharing a fixed background of false detections.
Later tests filled in the rest of the pipeline. Denneau et al.’s idealised full-population simulation for Pan-STARRS recovered 24,056,191 of 24,056,199 available tracklets, with 94.6% orbit efficiency for near-Earth objects, but it assumed 0.01-arcsecond astrometry, a 100% fill factor and only about 200 random false detections per square degree. When synthetic objects were injected into a real Pan-STARRS1 observing cycle, 246,558 of 246,596 injected tracklets were recovered, yet only 79.0% of main-belt asteroids became derived objects. Tracklet recovery is not discovery.
The early Rubin implementation, tested without added noise, recovered 854,037 of 1,128,643 findable objects, 75.7%, at its chosen cuts (Myers, Jones & Axelrod 2013). Jones et al. then measured the prototype’s resource needs: with four false detections per true one, linking took 33 hours on 16 CPUs and about 80 GB of memory, even with pairing restricted to speeds below 0.5 degrees per day. Charging all 16 cores for the whole run gives 528 core-hours, an allocation estimate rather than a measured utilisation. Vereš and Chesley, running the Pan-STARRS linker on simulated Rubin data with realistic contaminants, recovered 93.6% of eligible near-Earth objects brighter than , after upgrading their workstation from 32 to 96 GB and tightening tree thresholds to avoid running out of memory.
Orbit fitting itself is cheap per candidate. Jones et al. timed Bill Gray’s Find_Orb at 0.3 ms for a Gauss initial orbit and 26 ms more for a Herget refinement, for one six-observation, 16-day example on a single 3.1-GHz core. Multiplied by tens of millions of candidates it is not cheap at all, which is why the purity of the candidate stream matters.
A modern descendant shows the same structure at small scale. FindPOTATOs, by C. R. Nugent, Nicole Tan and James Bauer, builds tracklets with scikit-learn Ball Trees in Python. Reprocessing one night of the NEAT survey from 24 November 2001, 1,444 frame triplets and 1,051,365 detections, took 4 hours 37 minutes on a cluster and returned 3,218 tracklets, of which 3,006 passed visual inspection, including 1,374 that NEAT had never reported (Nugent, Tan & Bauer 2025). FindPOTATOs requires a continuous chain through consecutive frames, so a body missed in one frame can break its tracklet. That limitation matters in any comparison.
Change the coordinates: HelioLinC
Removing the Earth’s motion
The kd-tree approach accepts the apparent sky motion as given and fits polynomials to it. But most of the curvature of an asteroid’s apparent path is not the asteroid’s doing. It is a reflection of the Earth’s orbit. If one knew the body’s distance, one could subtract the observer’s motion and the remaining path would be almost straight. One does not know the distance. One can, however, guess it, and if the guess is close, tracklets of the same body from different nights collapse together.
This is HelioLinC, introduced in 2018 by Matthew Holman, Matthew Payne, Paul Blankley, Ryan Janssen and Scott Kuindersma (Holman et al. 2018). Its first target was the Minor Planet Center’s Isolated Tracklet File, the collection of submitted tracklets that no one had connected to anything. The arXiv title, Finding Asteroids Down the Back of the Couch, describes the job.
The mathematical lineage runs through Gary Bernstein and Bharat Khushalani’s 2000 parameterisation for distant bodies (Bernstein & Khushalani 2000), treated fully in Chapter 13. Choose a frame whose axis points near the field, and let the body’s position at a reference time be with velocity . Define
The dots here label scaled velocity components; is not the time derivative of . Writing the orbit as , with the accumulated gravitational deflection and , the observed tangent-plane coordinate is
and likewise for , where is the observer’s position. Fix the two poorly measured parameters . Then the equation rearranges into a fit that is linear in the other four:
Each tracklet, under a given hypothesis , yields an estimate of at a common reference time. Holman et al. call this an arrow. Tracklets of one body give nearly the same arrow, whatever nights they came from. The original code kept only the dominant gravitational term, , to avoid integrating orbits inside every transform.
A pleasant surprise helps. Near opposition, distance and transverse velocity are partly degenerate, so a coarse distance guess can be absorbed by a slightly wrong fitted velocity without destroying the cluster. A handful of hypotheses goes a long way.
Clustering arrows
Arrows are clustered with the metric
where is a time that gives velocities the units of position. It is a search metric, not a likelihood. The training run used days and a clustering radius of radians. The algorithm is:
for each overlapping time window and sky region:
choose a reference epoch and local frame
for (gamma, gamma_dot) in the hypothesis bank:
arrows = transform and fit every tracklet under this hypothesis
tree = kd-tree of arrows, velocities scaled by T_w
for each neighbourhood with >= 3 tracklets on distinct nights:
if times and ordering are plausible: emit candidate
remove duplicate candidates
refit with free radial parameters; merge compatible groups
verify by full orbit fitting
The demonstration used windows of ±15 days centred on new moon and HEALPix sky tiles (nside 8) with overlapping neighbours, so that no object is lost crossing a boundary. Training used about 140,000 known objects in 1.7 million tracklets from the MPC’s unnumbered-observation file. Strikingly, the training bank used only one inverse distance, au⁻¹, and five values of between and per day.
For a fixed bank, each window costs to transform, build and query for tracklets, plus the number of neighbours reported:
The paper contrasts this with the cost of trying tracklet triples. That contrast is fair as a description of the core search, but it is not a worst-case guarantee: when neighbourhoods are crowded, grows, and the hypothesis bank multiplies everything.
At the time of the analysis the Isolated Tracklet File held about 14 million observations in nearly 4 million tracklets. The arXiv manuscript reports about 41,000 clusters surviving validation, submitted to Gareth Williams at the MPC for independent checking. The published journal abstract reports orbits for more than 200,000 new minor planets. The two numbers come from different versions of the work, and the detailed processing narrative that can be checked belongs to the first (Holman et al. 2018). The run took less than a day on single-processor machines.
HelioLinC3D: full states and production code
Siegfried Eggl reformulated the idea in full Cartesian states, and Ari Heinze led the operational implementation for Rubin with Eggl, Holman, Mario Jurić and the Rubin Solar System team. The result, HelioLinC3D (the public heliolinx code), is the discovery engine of Rubin’s Solar System Processing. Despite its name, its standard clustering space is six-dimensional.
The geometry is simple. Hypothesise a heliocentric distance for a detection. The body then lies where the observed ray meets a sphere of radius about the Sun:
which follows from requiring . For bodies beyond the Earth’s distance from the Sun the positive root is the physical one. Closer in, the ray can cross the sphere twice or not at all, and that case needs separate handling. A tracklet also gives an angular rate. With a hypothesised radial rate , the full velocity follows from differentiating . The resulting expression for has in its denominator, which vanishes when the line of sight is tangent to the sphere: a real conditioning problem, not a numerical accident.
HelioLinC3D hypothesises , and at a reference time, assigns each tracklet a distance at its own epoch, reconstructs a state, propagates it under two-body motion to the reference epoch, and clusters the six-vectors . One subtlety trips up implementers. The radial acceleration of a body on a Keplerian orbit is
which vanishes on a circular orbit even though the vector acceleration does not. The public hypothesis files express in units of . Confusing radial with vector acceleration produces a systematically wrong bank.
The production code adds what years of real data demanded. The developers report that replacing DBSCAN with simple kd-tree range queries improved completeness while allowing fewer hypotheses: a general-purpose clustering definition can be a poor match for “find groups of tracklets consistent with one orbit”. The velocity weight is now , 3.5 days for a 14-day window. The clustering radius scales with the inferred geocentric distance, since equal angular errors are larger physical distances farther away. A link_purify stage fits orbits, rejects outliers and resolves tracklets claimed by several candidates. A cheap orbital-plane test, link_planarity, can screen candidates first (heliolinx).
The hypothesis banks show where the cost goes. The current documentation lists 213 hypotheses for the main belt and 14 for trans-Neptunian objects, but 172,095 for near-Earth objects outside Earth’s orbit and 19,933 for those inside it. The authors warn that the near-Earth banks have only been run on culled inputs, such as trailed sources, and may be intractable on a full catalogue. Close to the Earth’s own distance from the Sun a wrong shell can map many unrelated detections into a compact region near Earth with similar inferred velocities, creating huge false clusters. That degeneracy is a property of the geometry, not of the code.
Rubin’s first discoveries
Rubin’s Solar System Processing requires three tracklets on three distinct nights within 14 days, with at least six detections, and tracklets spanning 5 to 90 minutes. It is meant to run every 24 hours (Rubin DP1 documentation).
Data Preview 1, built from late-2024 commissioning-camera observations of a few small fields, gives the first real numbers (Rubin Observatory 2026). The search allowed angular rates up to 1.5 degrees per day, required three detections per tracklet and at least five arcseconds of motion, and tested 324 hypotheses covering heliocentric distances of 1.5–9.8 au. It produced 269,581 tracklets, 5,691 linkages and 281 candidates after post-processing. When the 281 were ranked and inspected, the top 138 were all unique real asteroids, ranks 138–200 were mixed, and the rest were essentially spurious. Removing known objects left 97 candidates. Four were rejected conservatively for outlier astrometry or photometry, leaving 93 new main-belt asteroids. The paper reports no injected-population denominator and no processor-hours, so this is a demonstration, not a completeness measurement.
On 2 April 2026 NOIRLab announced more than 11,000 new MPC-confirmed objects from about a month and a half of early optimisation observations, including 33 near-Earth objects and about 380 trans-Neptunian objects (NOIRLab 2026). The release credits Heinze and Jacob Kurlander for the asteroid discovery software and separately credits Holman and Kevin Napier for distant-object algorithms, so not every one of those objects belongs to one linker. It also corrected an earlier count: of 2,104 objects first registered as new, about 600 were later connected to older observations. Discovery accounting moves as archival identification improves, a topic taken up in Chapter 13.
The most searching test of HelioLinC3D so far is Kurlander and colleagues’ Centaur survey of Pan-STARRS1 (Kurlander et al. 2025). They injected synthetic objects into about 550,000 exposures taken between April 2009 and November 2017 and ran real and fake detections through the same pipeline. Masks for stationary sources, bad pixels and chip edges removed about 92% of all detections and 9.6% of the camera area, cutting a typical exposure from about 140,000 detections to 11,000. The processing volumes illustrate where the work goes: detections, tracklets (more tracklets than detections, because of overlapping partitions and multiple pairings), clusters, refined linkages, unique orbit-fit linkages, and finally 320 real objects: 56 Centaurs, 262 trans-Neptunian objects and two Jupiter Trojans, nine of them new. The low novelty is expected in images Pan-STARRS had already searched. The value lies in the synthetic audit: among 74,762 final connected components, 95 mixed detections of different objects, and only six joined two different synthetic objects substantially.
Drop the tracklets: THOR
Test orbits and a moving frame
HelioLinC still needs tracklets, and tracklets need a survey to revisit a field within an hour. Many surveys do not. The Zwicky Transient Facility’s full programme, for example, includes cadences poorly suited to asteroid discovery. THOR, Tracklet-less Heliocentric Orbit Recovery, was designed by Joachim Moeyens, Mario Jurić and colleagues to remove that prerequisite entirely (Moeyens et al. 2021). It starts from individual detections.
The idea is to place a bank of test orbits through the data. For a test orbit , propagate it to every observation epoch and gather detections near its predicted positions. Assume each nearby detection is at the test orbit’s heliocentric distance at that epoch, and reconstruct its position by the ray–sphere intersection above. Then rotate into a frame that moves with the test orbit: along the test body’s position, along its orbital angular momentum, , and project gnomonically:
The test orbit sits at the origin for all time. A real body on a nearby orbit drifts slowly and almost uniformly:
For each trial residual velocity , shift every detection back to the reference time,
and look for dense groups of these intercepts. It is a Hough transform for straight lines in , done as many two-dimensional clustering problems. The procedure:
choose test orbits covering the target population and footprint
for test orbit q:
propagate q to the observation epochs
gather detections in sky cells around its predicted positions
assign each detection q's heliocentric distance at its epoch
rotate and project into q's moving frame
for each residual velocity on a 2-D grid:
shift detections to the common intercept plane
record groups with enough members
drop duplicate groups
Gauss initial orbit on triples, with outlier rejection
differential correction of accepted orbits
attribute extra detections, merge compatible orbits, refit
resolve detections claimed by several orbits
The 2021 implementation used nine representative test orbits per 15-by-15-degree sky patch, drawn from semimajor-axis bins with edges at 1.7, 2.06, 2.5, 2.82, 2.95, 3.27, 5.0 and 50 au, plus extras for the Hungaria asteroids. The velocity grid had 300 samples in each direction between and degrees per day, 90,000 velocity hypotheses per test orbit. DBSCAN looked for at least five detections within 0.005 degrees, 18 arcseconds. That tolerance is broad on purpose, to absorb residual curvature and imperfect test orbits. The grid spacing is about degrees per day, so a half-step error moves the end of a 14-day arc by about 8 arcseconds.
The cost model is
for test orbits, velocities and gathered detections. THOR avoids trying combinations of detections globally, but it pays a template multiplier: the ZTF run had orbit–velocity combinations.
What THOR found
On a simulation of 16 ten-square-degree fields visited every other night for 14 nights, with 100 ± 10 false detections per square degree and 100 mas astrometric scatter, THOR recovered 16,728 of 18,332 findable objects (91.3%), producing 16,729 candidate orbits of which one was wrong. Completeness was 96.1% beyond 2.5 au but only 18.8% inside 1.7 au, a population the test orbits did not target. Because every field was visited once a night, no tracklet-based method could have found anything in this simulation. The run took seven hours on 30 cores of an AMD Threadripper, about 210 core-hours if all are charged.
On ZTF alerts from 3–17 September 2018, after removing static sources and requiring a real/bogus score above 0.5, there were 827,546 alerts over more than 20,000 square degrees: 255,358 matched to known objects and 572,188 unassociated. THOR recovered 20,940 of the 21,542 known objects with at least five detections, 97.2%. For its targeted population with au, 97.4%, and beyond 2.5 au, 98.4%. The run used 23 nodes of 28 cores on the University of Washington’s Hyak cluster and finished in under 18 hours. The figure compares this with what tracklet-based pipelines could have found in the same data.
The comparison needs care. The MOPS and ZMODE bars are not runs of competing software. They count how many objects happened to be observed in a pattern those pipelines require. The roughly twofold gain is a gain in what the cadence makes accessible, not a demonstration that THOR is more sensitive or faster on identical inputs.
THOR’s purity history is equally instructive. At the clustering stage, about seven million clusters had a purity of 3.8% against known associations. After orbit fitting, 21,723 orbits had 96.8% purity, while completeness fell by only 0.8 percentage points. Further filters left 488 submission-ready putative discoveries. Comparing them with the MPC catalogue of 20 April 2021 matched 477 orbits to 476 objects found in the meantime, leaving 11 apparently new, one of them comet C/2018 U1. That comet was officially discovered on 27 October 2018. THOR had found it retrospectively in the September data, as five observations over 6.13 days. The submission purity is bounded between 97.7% and 100%.
THOR’s subsequent life has been in archives. By May 2022 the Asteroid Institute had MPC-accepted discoveries from the NOIRLab Source Catalog. On 30 April 2024 the Asteroid Institute and Google Cloud announced 27,500 high-confidence discovery candidates, about 150 of them near-Earth asteroid candidates, from a run over more than 1.7 billion point-source detections that used 8.5 million vCPU-hours over about a month (B612 Foundation 2024). These are candidates, not designations, and the press release names human image verification as a bottleneck.
Every modern linker reports a funnel: Rubin DP1’s 269,581 tracklets to 93 discoveries, THOR’s seven million clusters to 488 candidates, the Pan-STARRS Centaur search’s 76 billion tracklets to 320 objects. Dividing the last number by the first measures nothing useful. The early stages are deliberately permissive and full of duplicates, and later stages remove known objects as well as false ones. Completeness can only be measured by injecting synthetic objects and following them through the same pipeline, as Kurlander et al. and the DES searches did. The Rubin yield forecasts, for example, assume a 95% linking probability per qualifying opportunity precisely because the real pipeline efficiency had not yet been measured (Kurlander et al. 2025).
Sparse epochs over years
Linking without motion
At 40 au a body moves across the sky mostly because the Earth does. Near opposition the reflex rate is about , which works out to about arcseconds per hour: 3.7 at 40 au, 1.5 at 100 au. A survey that visits a field once a night, or once a week, records such a body as isolated points with no measurable motion between them. Cosmology surveys like the Dark Energy Survey (DES), which imaged 5,000 square degrees repeatedly with the Dark Energy Camera (DECam) on the Blanco telescope, look exactly like this. Their cadence was designed for galaxies and supernovae. Yet they reach magnitude 23–24 over enormous areas. Turning those archives into planet searches is the problem of sparse-epoch linking (Chapter 6 tells what they found).
The key is the same transform idea, applied with only distance as the hypothesis. In Bernstein–Khushalani coordinates, neglecting gravity and for a trial inverse distance ,
where is the observer’s position. Deparallaxing with the right turns a looping annual track into a nearly straight line. A wrong distance leaves residual annual wiggles, and a wrong radial velocity changes the parallax amplitude over time. That is why an archive spanning several seasons can identify a body without any within-night motion (Bernardinelli et al. 2020).
The bound-orbit gate and the cubic cost
A bound orbit satisfies, to leading order,
since the escape speed at distance is and the dotted quantities are velocities scaled by . Two deparallaxed detections separated by can therefore belong to one body only if they lie within
of each other. For exposures and with transient surface densities and , the expected number of accidental pairs is about
A pair fixes four of six state coordinates. Varying the other two, distance within its bin and radial velocity within the bound limit, sweeps out a small, roughly parallelogram-shaped region where a third detection must fall. DES quotes the leading accidental-triplet scaling
Two facts follow. The cost is cubic in the transient density, so catalogue purity dominates feasibility. And it rises steeply for closer objects, so the minimum distance searched is set by computing budget, not by physics.
The DES pipeline
Pedro Bernardinelli, Gary Bernstein, Masao Sako and the DES collaboration built the definitive version (Bernardinelli et al. 2020; Bernardinelli et al. 2022). It had precursors. David Gerdes and colleagues had found two Neptune Trojans, 2014 QO441 and 2014 QP441, in the weekly DES supernova fields by forming triplets from about 185,000 transients and fitting orbits (Gerdes et al. 2016). A wide-survey search over 14,857 exposures, more than 1.1 billion detections reduced to about five million transients, then found 2014 UZ224 at 92.5 au from seven measurements on four nights, extended to a 699-day arc (Gerdes et al. 2017).
The uniform search has five stages.
- Build a transient catalogue. Match single-exposure sources to the deep static coadd. A moving object appears in one exposure and is absent or much fainter in the coadd: if its flux enters only one of contributing exposures, averaging dilutes it by magnitudes. Keep sources with no coadd counterpart or at least 0.4 mag (Y6: 1.2 mag) brighter than it, then mask artefacts that cluster in detector coordinates. In the six-year (Y6) search, excluding detections within 1 arcsecond of a coadd source removed 24.3% of putative transients at a cost of 1.8% of injected fakes. Overall 95.55% of injected single-exposure detections survived.
- Form pairs. Cover the footprint with overlapping patches ( radius in Y4) and divide inverse distance into bins covering about 30–2,500 au. For each bin, deparallax every transient and search exposure pairs within the bound-orbit radius. The Y6 search used out-of-core tables because single bins produced billions of pairs.
- Form triplets. For each pair and each eligible third exposure, compute the nominal prediction and two excursion vectors for the allowed parallax and radial-motion ranges, and test whether a detection satisfies
Replacing a kd-tree search with this two-line membership test sped the triplet stage up by a factor of 100 on average. The public deslinker code pads the unit square to 1.1 and parallelises with Numba.
4. Grow orbits. Fit each triplet with a temporary prior on distance, predict its position and covariance in every other exposure, and branch on every compatible transient. Keep alternatives until the data separate them. Sum the expected number of chance coincidences, , inside all the search ellipses. The papers call this the FPR. Strictly it is an expected count, not a probability. Stop searching an exposure if its expected accidental occupancy exceeds ten. Retire candidates with at least seven nights and as secure.
5. Cut and confirm. Require at least six (Y4) or seven (Y6) distinct nights, prior-free , and an arc longer than six months even after removing any single night. That last test, ARCCUT, stops one accidental measurement from turning a single-season orbit into a multi-year one. Several detections on one night count as one, because back-to-back exposures share artefacts.
The confirmation step deserves attention because it answers the objection raised earlier: a big enough search will find orbits that fit noise. DES tests a separate prediction. If the object is real, it must leave flux in every image its orbit crosses where no detection was linked, including images not used at all in the discovery. Summing flux at the fixed orbit position,
gives a sub-threshold significance, STS. In Y4, 424 orbit candidates were cut to 316 confirmed objects by requiring . Of 132 six-night candidates that met every other criterion, only 52 survived. Six nights and a good orbit fit were not enough. In Y6 all images from the nights of linked detections were excluded from the sum, and a candidate was accepted if or it had at least nine distinct nights.
The numbers are in the figure above. Y4 took about seven billion detections to 20 million transients, about pairs and triplets, 1,684 six-night linkages, 424 candidates and 316 objects, with an effective limit of . Y6 lowered the Source Extractor threshold from 1.5 to 0.8 and gained about 0.47 mag of single-exposure depth, which meant 16 billion detections, 108 million transients, at least pairs, about triplets, 31,064 seven-night linkages, 9,081 candidates and 817 objects: 815 trans-Neptunian objects, one Centaur and one Oort-cloud comet, 461 of them reported for the first time. The fitted completeness midpoint was . The search required an estimated 15–20 million CPU hours (Bernardinelli et al. 2022).
Completeness was measured, not assumed. Of 3,749 injected objects that met the discoverability criteria, 3,710 were linked, about 99%, and all 356 previously known objects that met the criteria were recovered. That 99% is conditional on discoverability, not a census of the footprint. The authors also show where the losses are algorithmic. Five Y4 objects are missing from Y6: two still have six nights near footprint edges, two lie inside the new minimum distance, and one, 2013 RL124, needs a pair separated by 73 days, longer than Y6’s new 60-day window for objects inside 50 au. Allowing six-night associations in Y6 would have moved the midpoint to 23.81. The team tested about 100,000 six-night candidates beyond 50 au and found only one apparently real addition. The seven-night rule was a sound engineering choice for this dataset, not a physical minimum. And the paper says plainly that searching closer than about 29 au was beyond their computational means.
The DECam Ecliptic Exploration Project (DEEP) offers a useful contrast. It detected objects near by GPU digital tracking within nights (Chapter 18), then linked them across 2019–2021 with the DES method. With about a hundred candidates per pointing and less than one false positive per real source, against DES’s thousand detections per exposure for one real TNO, DEEP could afford to form pairs and triplets across seasons. It found 110 multi-year objects. Of 244 possible injected linkages, 230 were recovered (94%), and 218 (89.3%) survived the final orbit-quality cut (Smotherman et al. 2023). Lower density buys a larger seed window, exactly as the cubic scaling predicts.
Sparse epochs by hand: targeted recovery
The alternative to blind sparse linking is to discover by motion within a night, then spend telescope time following up. Scott Sheppard and Chad Trujillo took three images over three to five hours, selected slow movers and flagged anything beyond about 50 au for recovery (Sheppard & Trujillo 2016). 2015 TG387 was found with Subaru on 13 October 2015 at about 80 au and , then recovered in December 2015, September–December 2016, September and December 2017, and May 2018. Even after four oppositions its semimajor axis was au (Sheppard et al. 2019). Targeted recovery starts with a small set of orbits and an uncertainty region. Blind archive linking starts with every possible association. The first spends telescope time to control ambiguity. The second spends computation and archive redundancy.
In May 2025 Sihao Cheng, Jiaxuan Li and Eritas Yang announced a body on an extremely wide orbit, found in archival DECam images from the DECaLS survey (Cheng, Li & Yang 2025). Ten measurements in , and spanned 2014–2018, with the object near at about 85 au. A tentative orbit pointed to nine more images from the Canada–France–Hawaii Telescope in 2011–2012. The Minor Planet Electronic Circular, MPEC 2025-K47 of 21 May 2025, listed 19 observations, and the first orbit had au over a 2,618-day arc (MPC 2025).
The archive kept giving. After the announcement, amateur astronomer Sam Deen found the object in Sloan Digital Sky Survey images from 2004 and 2009, where the SDSS catalogue had classified it as a star and a galaxy. Magellan observations on 25 July 2025 completed a revised solution: 24 observations over 7,612 days, au and perihelion 44.92 au. The nearly tenfold tighter semimajor axis came largely from the longer baseline, which pinned down the radial velocity through a roughly 15% change in parallax over 20 years.
Two lessons. The designation’s year, 2017, dates neither the images (2004–2018) nor the recognition (2025). And the paper does not describe its blind DECaLS search: no pair windows, distance bins, trial counts, completeness or compute are published. The discovery is secure, but the search that produced it cannot yet be reproduced.
Landmark results
| Year | Work | What it showed | Key number |
|---|---|---|---|
| 2007 | Kubica et al., kd-tree linking | Pairs per night become tractable | 154,109 of 156,693 tracks; 44.8 million candidates; 13,642 s on one CPU |
| 2013 | Denneau et al., Pan-STARRS MOPS | An operational multi-stage linker and its real failure modes | 79.0% of injected main-belt tracklets became derived objects |
| 2017 | Vereš & Chesley | MOPS on simulated Rubin data with realistic contamination | 93.6% of eligible NEOs; about 96% purity after a cut |
| 2018 | Jones et al. | Resource and scaling model for Rubin linking | 33 h on 16 CPUs, 80 GB; false tracks |
| 2018 | Holman et al., HelioLinC | Heliocentric transform plus clustering | About 41,000 validated ITF clusters (arXiv); over 200,000 orbits (journal) |
| 2021 | Moeyens et al., THOR | Linking without tracklets | 97.4% of targeted findable ZTF objects; 97.7–100% submission purity |
| 2022 | Bernardinelli et al., DES Y6 | Multi-year sparse linking with independent flux confirmation | 817 objects; ; 15–20 million CPU hours |
| 2023 | HelioLinC3D, 2022 SF289 | First hazardous asteroid found by a heliocentric linker | Three detections on each of four nights |
| 2024 | THOR on ADAM | Billion-detection archive linking in the cloud | 27,500 candidates; 8.5 million vCPU-hours |
| 2025 | Kurlander et al. | Characterised HelioLinC3D survey with injections | 320 real objects, 9 new, from 550,000 exposures |
| 2026 | Rubin DP1 and first-look release | Real commissioning discoveries | 93 accepted in DP1; over 11,000 MPC-confirmed by April 2026 |
| 2026 | Cheng, Li & Yang, OF201 revision | A sparse archive body with a 20-year arc | au from 24 observations |
Limitations and open problems
Artefacts are not random. The pair-counting formulas assume detections scattered independently. Real false detections cluster around bright stars, along detector edges and bad columns, and in imperfect subtraction templates (Chapter 10). Repeated artefacts can mimic slow motion, and aligned ones can make tracklet floods in a few fields that dominate memory and runtime. Spacewatch tests, Pan-STARRS1 operations, DP1 and the PS1 Centaur masks all tell the same story. A recent study of Rubin engineering data adds a physical foreground: glints from satellites and debris that look like point sources and can recur in sequences (Megias Homar et al. 2026). These need explicit models of non-asteroidal movers, not a Gaussian background.
The difficult tail is near Earth. Nearby objects have large and changing angular velocities, strong apparent acceleration and short visibility windows. A quadratic sky model or a linear pre-selection of fields can drop them before a good fit is tried, a loss mechanism Vereš and Chesley identify explicitly. HelioLinC3D’s near-Earth banks are hundreds of times larger than its main-belt bank, and the shell geometry is ill-conditioned close to the Earth’s distance from the Sun. THOR’s untargeted inner population was recovered at 18.8% in simulation and 28.9% in ZTF. A bank tuned on known main-belt orbits does not establish completeness for hazardous ones.
Real–real confusion survives orbit fitting. Noise is easy to reject with velocity consistency and orbit fits. Pairs of real asteroids with similar motions are not, and they dominate the residual errors in careful tests. Pipelines resolve conflicts by picking a winner or rejecting all contenders, which can discard the right answer. Keeping a small set of alternative hypotheses alive until new data arrive is attractive but costs memory and bookkeeping.
Eligibility is not completeness. Survey simulators encode a rule such as “three tracklets on three nights within 14 days” and count objects that satisfy it (Chapter 16). That is an upper bound on what an ideal linker can do, not a measurement of what the real one does. Only end-to-end injection, preferably at the image level, measures the latter.
No shared benchmark exists. The numbers in this chapter come from different detections, different contaminants, different populations and different hardware. There is no open, versioned catalogue with realistic false detections and injected populations on which MOPS-style, HelioLinC-style, THOR-style and DES-style linkers have all been run to matched purity. Until there is, claims that one method is faster or more complete are claims about particular configurations.
Where the room is
The history of linking contains two large algorithmic gains, and both came from changing the representation rather than speeding up the inner loop. The first was the kd-tree: rejecting whole families of impossible associations at once. The second was the heliocentric transform: guessing the missing distance so that correct associations become clusters. A third, smaller example is DES’s parallelogram test, which replaced a tree query with two lines of arithmetic and gained a factor of 100 at its stage. The question for the next decade is whether a further change of representation is available, and where engineering alone will suffice.
Physical limits. Missing photons, missing epochs and a short arc’s unmeasured distance are limits of information. A linker cannot restore a detection the source extractor never made. That requires going back to pixels (Chapter 17, Chapter 20). Nor can it separate two associations that fit the data equally well. Choosing a shorter intra-night interval shrinks the accidental-pair area as but worsens velocity precision as , so cadence and linker must be designed together.
Engineering limits. Fixed three-night rules, 14-day windows, the Pan-STARRS speed gap, DES’s 60-day seed window, the 29 au minimum distance in DES Y6 and the memory ceilings in every published run are choices. Each could be relaxed by a faster linker. The steep exponents in the cost formulas mean that a tenfold speedup buys much less than a tenfold larger search: doubling a time window costs a factor of 256 in false tracks under the Jones scaling. But the losses are concentrated in exactly the objects of greatest interest, such as 2013 RL124’s 73-day gap and the inner population THOR missed.
- Upstream density. Because false triplets scale as in DES and false tracks as in the Jones model, halving the false-detection density at fixed recall cuts accidental work by a factor of eight to thirteen, and a factor of gives a nominal ten. A calibrated artefact classifier (Chapter 22) may beat any faster kernel, provided its loss of real faint movers is measured.
- Batched, compacted GPU search. Recursive pointer trees map badly to GPUs. Flattened node arrays processed as frontiers of node-pair tasks, sorted spatial keys, and stream compaction of survivors fit them better (Chapter 40). THOR’s code contains
hotspot_2d, a sort-based grid clustering its docstring estimates at 10–20 times faster than DBSCAN but warns may miss clusters near the tolerance scale. GPU clustering is switched off (USE_GPU = False) pending testing (THOR repository). A conservative version, overlapping cells producing a superset followed by exact distance checks, would keep the association definition fixed. - Template banks with a mismatch metric. HelioLinC3D’s banks range from 14 to 172,095 hypotheses. A metric that measures how a change in or test orbit deforms the transformed cluster would place hypotheses where curvature is hardest and thin them where it is easy, as in gravitational-wave and pulsar searches (Chapter 38).
- Reuse across nights and hypotheses. Jones et al. estimate a factor of three to six from caching pair computations across overlapping windows, which the analysed MOPS did not do. Neighbouring velocity hypotheses in THOR move points only slightly, so incremental updates could replace repeated full sorts.
- Easy first. Kubica’s exploratory run started with 352,000 tracks from 22,000 tracklets, and removing correctly linked tracklets left about 6,700. Attributing known objects before discovery linking (Chapter 13) reduces density cheaply, as long as uncertain attributions are reversible.
Amdahl’s law sets the scale of ambition. If clustering is a fraction of the runtime and is made times faster, the total speedup is . A tenfold end-to-end gain requires the accelerated part to have been more than 90% of the runtime, and orbit fitting, deduplication, catalogue access and human vetting all remain. The right target is an order-of-magnitude reduction in total compute or cost at fixed completeness and purity, stratified by population, magnitude and cadence, measured on a frozen catalogue with injected objects. None of the sources reviewed here establishes such a gain on modern GPUs, which is precisely why it remains open (Chapter 42).
References
- Bernardinelli, P. H., Bernstein, G. M., Sako, M. et al. (2020). Trans-Neptunian Objects Found in the First Four Years of the Dark Energy Survey. ApJS 247, 32. arXiv:1909.01478
- Bernardinelli, P. H., Bernstein, G. M., Sako, M. et al. (2022). A Search of the Full Six Years of the Dark Energy Survey for Outer Solar System Objects. ApJS 258, 41. arXiv:2109.03758
- Bernstein, G., Khushalani, B. (2000). Orbit Fitting and Uncertainties for Kuiper Belt Objects. AJ 120, 3323. arXiv:astro-ph/0008348
- B612 Foundation / Asteroid Institute (2024). THOR on ADAM Fact Sheet. Project fact sheet, 30 April 2024. b612foundation.org
- Cheng, S., Li, J., Yang, E. (2025; revised 2026). Discovery of a dwarf planet candidate in an extremely wide orbit: 2017 OF201. ApJL 998, 6. arXiv:2505.15806
- Denneau, L., Jedicke, R., Grav, T. et al. (2013). The Pan-STARRS Moving Object Processing System. PASP 125, 357. arXiv:1302.7281
- Gerdes, D. W., Jennings, R. J., Bernstein, G. M. et al. (2016). Observation of Two New L4 Neptune Trojans in the Dark Energy Survey Supernova Fields. AJ 151, 39. arXiv:1507.05177
- Gerdes, D. W., Sako, M., Hamilton, S. et al. (2017). Discovery and Physical Characterization of a Large Scattered Disk Object at 92 au. ApJL 839, L15. arXiv:1702.00731
- Heinze, A., Jurić, M., Kurlander, J. et al. (2026). heliolinx: Open Source Solar System Discovery Software. Software repository, accessed 16 October 2026. github.com/heliolinx/heliolinx
- Holman, M. J., Payne, M. J., Blankley, P., Janssen, R., Kuindersma, S. (2018). HelioLinC: A Novel Approach to the Minor Planet Linking Problem. AJ 156, 135. arXiv:1805.02638
- Jones, R. L., Slater, C. T., Moeyens, J. et al. (2018). The Large Synoptic Survey Telescope as a Near-Earth Object Discovery Machine. Icarus. arXiv:1711.10621
- Kubica, J., Denneau, L., Grav, T. et al. (2007). Efficient intra- and inter-night linking of asteroid detections using kd-trees. Icarus 189, 151. arXiv:astro-ph/0703475
- Kurlander, J. A., Holman, M. J., Bernardinelli, P. H. et al. (2025). A Well-Characterized Survey for Centaurs in Pan-STARRS1. AJ. arXiv:2412.01687
- Kurlander, J. A., Bernardinelli, P. H., Schwamb, M. E. et al. (2025). Predictions of the LSST Solar System Yield: Near-Earth Objects, Main Belt Asteroids, Jupiter Trojans, and Trans-Neptunian Objects. arXiv preprint. arXiv:2506.02487
- Megias Homar, G., Kulkarni, S. R., Lage, C. S. et al. (2026). The Fast Transient Foreground Fog of LSST. arXiv preprint. arXiv:2610.09394
- Minor Planet Center (2025). MPEC 2025-K47: 2017 OF201. Minor Planet Electronic Circular. minorplanetcenter.net
- Moeyens, J., Jurić, M., Ford, J. et al. (2021). THOR: An Algorithm for Cadence-Independent Asteroid Discovery. AJ 162, 143. arXiv:2105.01056
- Moeyens, J., Jurić, M., Nelson, S. et al. (2026). THOR software repository. Accessed 16 October 2026. github.com/moeyensj/thor
- Myers, J., Jones, R. L., Axelrod, T. (2013). Moving Object Pipeline System Design. LSST document LDM-156. ls.st/LDM-156
- NSF NOIRLab / Rubin Observatory (2026). Early Data from NSF–DOE Vera C. Rubin Observatory Reveals Over 11,000 New Asteroids. Press release noirlab2608, 2 April 2026. noirlab.edu
- Nugent, C. R., Tan, N. J., Bauer, J. M. (2025). FindPOTATOs: Minor Planet Observation Linking Software. PSJ 6, 18. arXiv:2501.12922
- Rubin Observatory (2026). Small body tracklet linking and orbit fitting. DP1 documentation. dp1.lsst.io
- Sheppard, S. S., Trujillo, C. (2016). New Extreme Trans-Neptunian Objects: Towards a Super-Earth in the Outer Solar System. AJ 152, 221. arXiv:1608.08772
- Sheppard, S. S., Trujillo, C., Tholen, D., Kaib, N. (2019). A New High Perihelion Inner Oort Cloud Object: 2015 TG387. AJ 157, 139. arXiv:1810.00013
- Smotherman, H., Bernardinelli, P. H., Portillo, S. K. N. et al. (2023). The DECam Ecliptic Exploration Project (DEEP) VI: first multi-year observations of trans-Neptunian objects. arXiv preprint. arXiv:2310.03678
- University of Washington News (2023). New algorithm ensnares its first "potentially hazardous" asteroid. 31 July 2023. washington.edu
- Vera C. Rubin Observatory Team et al. (2026). The Vera C. Rubin Observatory Data Preview 1. arXiv:2603.23786
- Vereš, P., Chesley, S. R. (2017). Near-Earth Object Orbit Linking with the Large Synoptic Survey Telescope. AJ 154. arXiv:1706.09397