Measuring whether the signal behind each published Hubble Asteroid Hunter trail is recoverable from the archive images at its known position, as a function of trail brightness. A Facetwork FFL fan-out, 168 tasks. September 2026.
Citizen science projects are often justified on the grounds that the task is too hard to automate. That is usually asserted rather than measured. This study measures a necessary condition for automation: at what brightness does the signal stop being recoverable at all, even when its exact position is known?
Below that point automation is not merely difficult, it is impossible by this route — there is nothing for a detector to find. Above it, automation might work or might not; this study does not say.
The answer is not a verdict on the project. It is the quantity that decides whether the human effort was necessary, and it can be computed because both the catalogue and the underlying images are public.
Hubble Asteroid Hunter showed archival HST images to volunteers, who marked asteroid trails; a convolutional network assisted, and the identifications were checked against known orbits. The published catalogue (Kruk et al. 2022, VizieR J/A+A/661/A85) contains 1,701 trails across 1,318 observations, each with sky endpoints, trail length, exposure timing and an observed magnitude.
| Hubble Asteroid Hunter | This workflow | |
|---|---|---|
| Finds trails | human inspection + CNN + orbit matching | no — integrates along a path it is given |
| Input | composites shown to volunteers | individual FLT exposures |
| Output | a catalogue of trails | signal recoverability per magnitude |
| Detects new objects | yes | no — only re-measures known positions |
It is given the answer — position, orientation and length — and asked only whether the signal is present and strong enough that an automated method could plausibly have found it. Note that this both helps (position is known) and constrains (angle and length are fixed to the catalogue's), so it is not simply an easier version of blind detection. §5b measures both on the same trails and finds neither dominates.
Fraction of published trails whose signal reaches 5 sigma when integrated along the catalogue path:
| Magnitude | Signal recovered | Fraction | |
|---|---|---|---|
| 15–16 | 1/1 | 100% | ██████████████████ |
| 18–19 | 1/1 | 100% | ██████████████████ |
| 19–20 | 2/4 | 50% | █████████ |
| 20–21 | 3/4 | 75% | ██████████████ |
| 21–22 | 3/7 | 43% | ████████ |
| 22–23 | 1/11 | 9% | ██ |
| 23–24 | 0/9 | 0% | |
| 24–25 | 0/2 | 0% |
11 of 39 measurable trails recovered (28%). Faintest recovered: mag 22.5. Brightest missed: mag 19.3.
Recoverability is not monotonic in magnitude. A magnitude 19.3 trail is missed while a 22.5 one is recovered. Detection depends on what the trail crosses: a faint trail on empty sky integrates cleanly, a brighter one over a galaxy does not. Any estimate of "how faint can we go" that quotes a single limiting magnitude is hiding this.
| mag | sigma | offset px | outcome | observation |
|---|---|---|---|---|
| 15.0 | 199.5 | (+0,+30) | recovered | j9eps2010 |
| 18.9 | 65.5 | (-40,+40) | recovered | jdxr56010 |
| 19.3 | 2.6 | (-20,+0) | not found | j9eb03010 |
| 19.6 | 8.7 | (-30,-20) | recovered | idl902010 |
| 19.8 | 0.6 | (+140,-130) | not found | jbyq02010 |
| 19.8 | 19.5 | (-40,-30) | recovered | ibt013010 |
| 20.3 | 103.4 | (+10,-10) | recovered | j95y11030 |
| 20.5 | 10.3 | (+40,+10) | recovered | jbit31010 |
| 20.6 | 12.3 | (-10,+10) | recovered | jc9z03010 |
| 20.9 | 3.7 | (-20,+40) | not found | jbyq01010 |
| 21.0 | 29.1 | (-10,+30) | recovered | jd8905010 |
| 21.2 | -0.1 | (-100,-50) | not found | ic8503010 |
| 21.4 | -0.1 | (-120,+30) | not found | icnk07020 |
| 21.4 | 11.8 | (+0,+10) | recovered | jdm96d010 |
| 21.6 | 8.5 | (+0,+30) | recovered | j9e730010 |
| 21.8 | 3.7 | (+70,+80) | not found | j8oi14040 |
| 21.9 | 3.5 | (-10,-10) | not found | icdx9i010 |
| 22.0 | 2.0 | (+40,-10) | not found | j90za9020 |
| 22.1 | 0.5 | (-70,+20) | not found | j9db0e010 |
| 22.2 | 2.9 | (+0,+40) | not found | ibyn04050 |
| 22.3 | 3.4 | (+0,+10) | not found | idgg99020 |
| 22.4 | 0.3 | (-150,+0) | not found | ibsr05030 |
| 22.4 | 1.0 | (+10,+20) | not found | jdlp01010 |
| 22.5 | 6.0 | (-10,+0) | recovered | jbyn08020 |
| 22.6 | 3.7 | (-20,+10) | not found | jbl7ac010 |
| 22.7 | — | (+0,+0) | not measurable | ie4n0t030 |
| 22.8 | 0.5 | (-60,-20) | not found | jdh905010 |
| 22.8 | 1.5 | (+10,+20) | not found | j9fz29020 |
| 22.9 | 0.9 | (-10,+10) | not found | jbew1c020 |
| 23.0 | 0.7 | (+10,+10) | not found | jcdub5020 |
| 23.1 | 1.1 | (+150,-70) | not found | j8pu0z010 |
| 23.2 | 1.2 | (-20,+0) | not found | ibsr05020 |
| 23.3 | 1.4 | (-60,+50) | not found | jcnw24010 |
| 23.4 | 1.3 | (-100,+90) | not found | j8xi18010 |
| 23.5 | 0.8 | (-70,-30) | not found | j9cq01010 |
| 23.6 | 0.5 | (+20,-80) | not found | j9fz06010 |
| 23.7 | 1.7 | (-20,+0) | not found | jcda08020 |
| 23.9 | 1.0 | (-30,-40) | not found | jbt199010 |
| 24.1 | 4.3 | (+150,+10) | not found | jdhk08010 |
| 24.4 | 0.6 | (-20,+0) | not found | j91jc8010 |
Each of these would have produced a confident, wrong answer, and each was found by measurement rather than by the run failing.
At the published position of the first trail tested, the standard drizzled image reads −0.09 sigma — nothing. Drizzling rejects cosmic rays, and a moving object sits at different pixels in every exposure, so the rejection deletes it. A study built on the obvious data product would have found no trails anywhere and concluded the catalogue was wrong. The workflow fetches individual FLT exposures instead: four times the data, and the only thing that works.
A magnitude 15 trail sat 59 px from where its published sky coordinates predicted — an 8,000-sigma feature, unmissable by eye, invisible to a detector that trusts the WCS. ACS/WFC exposures carry SIP distortion but need the additional lookup corrections. The detector therefore scans a window of offsets and reports the offset it required: "found at the predicted pixels" and "found 60 px away" are different claims.
A faint trail sits at roughly 0.4 sigma per pixel. Thresholding at 3 sigma and then looking for lines finds nothing. Integrated along its length the same trail is about 5 sigma. The detector must integrate first; the obvious order is backwards.
fw ffl run --primary examples/repro-asteroids/hah_trail_recovery.ffl \
--library facetwork/ffl/file.ffl \
--workflow repro.asteroids.RecoverPublishedTrails
Selection filters to trails with Nex=1 whose
MJDsTrail equals MJDsExp, pinning each to the first
exposure of its association — the one fetched. Without that the detector
searches an exposure the asteroid was never in and reports a false
non-detection. The sample is spread evenly across magnitude: taking the
brightest 40 would return a flat 100% that answers nothing.
foreach … limit 4 bounds how many ~170 MB exposures are
in flight.
An accidental duplicate launch ran the same 40 trails a second time on the
same fleet. The two runs agreed on 40 of 40 recovered/not
verdicts. They disagreed on one sigma value, which is how a defect in this study
was found: a non-measurement had been encoded as
sigma = −99.0, sitting in a measurement column beside
real values. measured is now a separate field — a measurement
that did not happen is not a number, it is a different fact.
A second workflow searches each exposure with no knowledge of where any trail is: bin the frame, rotate to each of twelve orientations, integrate along rows, and keep local maxima above 3 sigma. Angles within 15° of the readout axes are skipped, because bleed columns and diffraction spikes are linear features a line filter cannot distinguish from an asteroid. The published position is used only afterwards, to ask where the real trail landed in the ranking.
Both workflows share the same selection facet, so the sample is identical.
| Found | Rate | |
|---|---|---|
| Told where to look (position, angle, length) | 11/39 | 28% |
| Blind search, trail in top 10 of ~900 candidates | 3/39 | 8% |
| Blind search, trail anywhere in the ranking | 21/39 | median rank 323 |
mag 19.3 told-where: 2.6 sigma, missed → blind: rank 1 of 900mag 15.0 told-where: 199.5 sigma → blind: rank 65mag 22.5 told-where: 6.0 sigma, found → blind: not in the rankingThe brightest asteroid in the entire catalogue — magnitude 15.0, an unmissable 199.5 sigma when you know where to look — is only the 65th most line-like feature in its own frame. Sixty-four stars, bleed columns and diffraction spikes outrank it.
So the hard part was never finding lines. A frame yields ~900 candidates in about a second. The hard part is deciding which of them is an asteroid rather than an instrumental artifact, and a matched filter has no way to tell: they are all bright lines. That is exactly the judgement a CNN and human review supply, and it is why "we found linear features" and "we found asteroids" are different achievements.
| mag | told-where sigma | found | blind rank | top 10 |
|---|---|---|---|---|
| 15.0 | 199.5 | yes | 65 | no |
| 18.9 | 65.5 | yes | 3 | yes |
| 19.3 | 2.6 | no | 1 | yes |
| 19.6 | 8.7 | yes | 47 | no |
| 19.8 | 0.6 | no | — | no |
| 19.8 | 19.5 | yes | 56 | no |
| 20.3 | 103.4 | yes | 69 | no |
| 20.5 | 10.3 | yes | 553 | no |
| 20.6 | 12.3 | yes | 43 | no |
| 20.9 | 3.7 | no | 247 | no |
| 21.0 | 29.1 | yes | 1 | yes |
| 21.2 | -0.1 | no | — | no |
| 21.4 | -0.1 | no | — | no |
| 21.4 | 11.8 | yes | 608 | no |
| 21.6 | 8.5 | yes | 471 | no |
| 21.8 | 3.7 | no | 775 | no |
| 21.9 | 3.5 | no | 618 | no |
| 22.0 | 2.0 | no | — | no |
| 22.1 | 0.5 | no | — | no |
| 22.2 | 2.9 | no | 521 | no |
| 22.3 | 3.4 | no | — | no |
| 22.4 | 1.0 | no | — | no |
| 22.4 | 0.3 | no | — | no |
| 22.5 | 6.0 | yes | — | no |
| 22.6 | 3.7 | no | 868 | no |
| 22.8 | 1.5 | no | — | no |
| 22.8 | 0.5 | no | — | no |
| 22.9 | 0.9 | no | 711 | no |
| 23.0 | 0.7 | no | — | no |
| 23.1 | 1.1 | no | 323 | no |
| 23.2 | 1.2 | no | — | no |
| 23.3 | 1.4 | no | 340 | no |
| 23.4 | 1.3 | no | — | no |
| 23.5 | 0.8 | no | 197 | no |
| 23.6 | 0.5 | no | 353 | no |
| 23.7 | 1.7 | no | — | no |
| 23.9 | 1.0 | no | — | no |
| 24.1 | 4.3 | no | — | no |
| 24.4 | 0.6 | no | — | no |
Section 5b ends on a claim that was qualitative: a matched filter cannot tell an asteroid from an instrumental artifact. The obvious next move is to keep only the strongest candidates. We measured whether that works, on the 20 richest fields in the catalogue — 182 exposures, 364 chips, 327,600 candidates, 81 trail×exposure observations, about 31 GB streamed.
| z cut | Trails kept | Recall | Candidates per exposure |
|---|---|---|---|
| 3 (as shipped) | 32 | 40% | 1800 |
| 100 | 20 | 25% | 649 |
| 200 | 7 | 9% | 219 |
| 300 | 1 | 1% | 126 |
| 350 | 0 | 0% | 98 |
There is no cut that makes the list reviewable. At the threshold where recall reaches zero, 98 candidates per exposure still survive. Real trails have median z = 128; the background has median z = 84 and a 99th percentile of 465. The distributions overlap almost entirely.
z = 30.6. A
noise-normalised score would pile up against the detector’s own
z > 3 cut; nothing comes within a factor of ten of it.
The denominator is global pixel noise, so every galaxy, star halo and
diffraction spike scores in the hundreds. Tuning the cut cannot repair a
discriminant that measures brightness rather than straightness.
The magnitude breakdown carries a second finding, and it is not the expected shape:
| Magnitude | Recall | |
|---|---|---|
| 15–20 (brightest) | 27% | worse than the middle |
| 20–22 | 74% | |
| 22–23 | 25% | |
| 23–25 (faintest) | 26% |
The brightest bin does worse than the middle. Section 4 records why capping replaced masking: masking at 50 sigma once deleted a trail that was itself an 8,000 sigma feature. But capping at 30 sigma flattens a magnitude 15 trail to the same level as a bright star, discarding exactly the advantage that should make it trivial to find.
Every one of the 1,316 fields with a published trail has at least
two exposures — 4,059 in total. The asteroid moves between
them; the sky does not. So a median stack of the association is a model of the
static sky, and subtracting it should remove the structure that makes
z meaningless. We tested this on j96v05020: 12
exposures, 5 published trails, a standard ACS-WFC-DITHER-LINE
pattern with all twelve pointings identical.
| Raw frames | Global shift | Distortion-corrected | |
|---|---|---|---|
| Trails matched anywhere | 5/17 | 0/16 | 0/17 |
| Background z (median of top 200) | 211 | 8,244 | 2,085 |
Resampling each frame through its full WCS — distortion lookup tables included — improved the background by 4×, so misalignment was a real part of it. It did not come close to fixing it. The reason is measurable, so we measured it: bin every pixel by how bright the static sky model is there, and look at the residual left behind.
| Model brightness at that pixel | Pixels | Median |residual| |
|---|---|---|
| blank sky (below median) | 253,076 | 0.5 sigma |
| median – p90 | 202,460 | 0.8 sigma |
| p90 – p99 | 45,553 | 5.4 sigma |
| p99 – p99.9 (sources) | 4,555 | 24 sigma |
| p99.9 – max (bright stars) | 507 | 84 sigma |
r = +0.34 in log–log). That is the signature of
undersampling: HST’s PSF is about 2 px across at
0.05″/px, so interpolating it to a sub-pixel offset leaves an error
proportional to the source. Five hundred pixels at 84 sigma are more than
enough to outrank an asteroid worth a few sigma per pixel.
RAs,DEs → RAe,DEe is the
path across all the exposures a trail appears in — 74.5% of the
catalogue has Nex > 1 — not the path within one
frame, so matching it against a single exposure can place the target more than
200 px from the object.
Nex = 1 that start with the first exposure, so the
catalogued path lies within one frame by construction: all 40 have an MJD span
equal to their exposure time, 0 of 40 disagreeing.
What this costs to answer at scale is now known rather than guessed: the 1,316 fields hold 4,059 individual exposures, about 684 GB. The subset worth searching first is smaller — 1,107 frames (~187 GB) that sit inside a field already known to contain an asteroid but which no published trail is recorded in. None of it is worth downloading until a discriminant exists that survives the table at the top of this section.