Independent MVP for associating unlinked alerts with known SSO orbits

Hi all,

I have released an MVP of an independent pipeline for associating previously unlinked alert detections with known Minor Planet Center orbits:

https://sso.fullnode.pro/

The motivation is simple: ssObjectId = 0 describes the association state when an alert was generated, but it does not necessarily mean that the detection belongs to a new object. Before searching systematically for new Solar System objects, I am trying to remove observations of already known asteroids and comets as completely and reproducibly as possible.

The pipeline combines public alerts obtained through Fink with current MPC/SBN orbital data. Candidate matches are searched using PostgreSQL/Q3C and accepted only after orbital refitting, residual checks, and evaluation of their effect on the full observational arc.

The current catalog contains more than 250,000 additional associations, together with diagnostics for rejected, ambiguous, duplicated, or unstable fits.

This is an early MVP and should be seen simply as an independent experiment in reconciling alert-time associations with current orbital knowledge.

I would be grateful for any comments, corrections, or suggestions—especially regarding methodology, possible biases, useful Rubin data products, or interfaces I could incorporate. I am very open to implementation changes and future updates.

Best,
Anton

4 Likes

Interesting. During commissioning, one assumes various possible linkages may be missed. As the survey reaches its steady state, however, your pipeline really ought to be responsive to why Rubin and/or the official SSSC pipelines didn’t accept the linkage. Whatever the pipeline making the associations, there are a number of reasons one might choose not to assert a linkage:

  • Is the object detected in both visits?

  • Does the magnitude closely match that estimated from the ephemeris?

  • Is there source confusion? (with either background astrophysical sources or other moving objects or imaging artifacts)

  • Does the object in question already have another linkage in the same field?

  • Are there other solar system objects to which the source detection might link?

  • Are there reasons (too many to list) to believe this might not be a solar system detection? Does your pipeline compare the source location against other transient catalogs, for instance?

About the latter, to the other science collaborations, a primary goal of making solar system associations is to clean the list of transients of these vermin of the sky. I don’t know what the threshold is, but at some level of confidence, they will want an uncertain solar system identification to remain unmade to allow their own pipelines to make inferences.

Most unlinked / unidentified detections will be close to the limiting magnitude in each band. Pipeline performance (yours and other people’s) will naturally degrade at the faint end.

2 Likes

Rob, thank you very much for these questions. They are genuinely important to me. In addition to identifying several reasons why an association may reasonably be left unmade, your comment highlighted aspects of the pipeline that should be made explicit in the public diagnostics rather than remaining implicit in the implementation.

A few clarifications about the current MVP may be useful.

The initial filtering model does not rely only on alert-level parameters. It works with the Science, Template, and Difference cutouts and was trained on more than 20,000 examples that I labeled in a largely manual process. The most difficult part of that work was distinguishing moving sources from transients and static astrophysical sources. Whenever even a weak signal was visible in the Template, I measured the Science and Template centroids. If their positions agreed, I treated the example as a stationary or transient source rather than as a moving-object detection.

I do not yet cross-match every candidate against external transient catalogs. At present, the first-line rejection is primarily image-based and learned from those labeled cutout triplets. This filtering reduces the current pool of approximately 3.85 million unassociated alerts to about 952,000 candidate moving-object detections before orbital association begins.

The cutouts remain available for inspection on every individual DiaSource page. For example:

https://sso.fullnode.pro/dia-source/170631103303385438

This also makes it possible to identify cases where a geometrically plausible match is actually a streak, a subtraction artifact, or another unsuitable source morphology.

Regarding repeated detections, 5,005 of the 6,579 orbits with pipeline-added observations—approximately 76%—have at least one night containing multiple detections. This is not yet an exact measurement of recovery in both members of the nominal visit pair, and your question made it clear that paired-visit support should be exposed as a separate diagnostic.

For comparison, 99.998% of the currently active X05-associated orbits in MPC have at least one multi-detection night. I consider that a useful benchmark, although not a property that the current recovery sample fully matches.

I also do not force an assignment when a detection remains genuinely ambiguous between multiple known orbits. During the current processing, four conflict groups were identified. One involved a streaked, fast-moving near-Earth source rather than a point-like detection suitable for this association branch, so it was excluded. Three groups remain explicitly marked as unresolved because the observations fit both competing orbits well:

2024 RX153 / 2000 KU53 — 5 observations;
2026 DT28 / 2026 DJ35 — 44 observations;
2026 DY28 / 2026 DX31 — 270 observations.

Those observations have not been assigned to either competing orbit. A more detailed photometric or image-level analysis may eventually resolve them, but the important point for the current pipeline is that the ambiguity is detected, retained, and not silently converted into an association.

I have intentionally not used agreement with the predicted magnitude as a hard filter during the initial recovery stage. The current purpose of this layer is high-recall recovery: removing as many detections of already known objects as possible from the unknown pool before beginning a search for genuinely new Solar System objects.

Stricter photometric checks, centroid remeasurement, aperture SNR measurements, and an ADES submission-quality policy belong to a later stage, where the optimization changes from completeness to precision. My current approach is to first collect observations that are strongly consistent with a known orbit, and then apply a much stricter policy before any observation could be considered suitable for submission. It is easier to remove a questionable point at that stage than to recover a real observation that was prematurely discarded.

The accepted observations nevertheless show strong internal orbital consistency. For a clean sample of 6,389 asteroid orbits and 263,156 pipeline-added observations, the median two-dimensional residual is 0.076 arcseconds. Of those observations, 95.2% are below 0.2 arcseconds and 99.87% are below 0.5 arcseconds. Only two used observations are slightly above 1 arcsecond.

I do not treat a small residual by itself as proof against source confusion or an alternative association, since the observations are selected and then participate in the fit. However, these results do show that the final catalog is not simply the result of a positional cross-match inside the initial search radius.

On the faint end, I agree that completeness must degrade near the single-visit detection limit. One member of a visit pair may pass the detection threshold while the other does not, causing pairs or individual observations to disappear before the association stage.

I think it is useful, however, to separate that loss of input completeness from the reliability of a DiaSource that has already been generated. When an alert has passed the approximately 5-sigma detection threshold, shows a clean signal in the cutouts, is classified consistently by the image model, and fits a multi-observation orbit with small residuals, proximity to the limiting magnitude alone does not necessarily make the association unreliable. In that situation, much of the loss may already have occurred upstream, when another weak observation failed to become an alert at all.

I fully accept your broader point: a useful independent pipeline should not only report the associations it can make, but should also help explain why Rubin or the official SSSC processing may reasonably have chosen not to make them.

The system already retains rejected fits, competing orbits, duplicate assignments, unstable seeds, and unresolved observations. After reading your comment, I see that these rejection reasons should become a much more visible and structured part of the public diagnostics.

Thank you again. This is exactly the kind of feedback that helps turn a working experiment into a more testable and useful system.

2 Likes

For dia_source_id = 170648614789447729 and dia_source_id = 170648621768769572, does not seem to be the comet you suggest since both JPL Horizons and MPC ephemeris services for that comet estimate a magnitude of 31 and are very distant. At that distance sky motion would be very small. The time difference of these dia_source_id’s appears too short to detect sky motion in the same way as would be required for distant solar system object. The science, template and diff images suggest these dia_source_ids are located in a background galaxy and may have an astrophysical source that others who study those sources could help with.

2 Likes

Charles, thank you very much for checking the ephemeris, expected magnitude, motion, and cutouts.

I agree with your conclusion: these two DiaSources are not credible observations of C/2014 W8. The association is already marked in red and placed in the Fit Diagnostics section rather than in the clean-confirmation catalog:

https://sso.fullnode.pro/orbit/1518284

The diagnostic fit shows a clear branch shift. After the two detections are introduced, the solution moves substantially away from the original MPC orbit instead of strengthening it. That is why this result should be treated as a detected failure mode, not as a valid comet identification.

The signal itself appears real and has high S/N, but further checking showed that the shared diaObjectId was registered externally as the transient AT2026tmi. Rubin had already associated the two detections with each other through the same diaObjectId, but the later TNS identification was not written back into the original alert packets.

I also checked the subsequent alert stream. There was no new DiaSource at this position after July 10, so no later alert packet was generated that could expose an updated association. The original alerts therefore remained historical snapshots of the earlier state.

This reveals an important gap in my current filtering logic. Searching through DiaSources will remain part of the approach, but it does not guarantee a reliable answer. A more effective strategy is to identify static groups directly, while being careful not to accidentally filter out slowly moving objects.

I deliberately retain cases like this instead of manually deleting them, because failed associations are among the most useful outputs of the experiment. They allow me to identify a reproducible failure class and implement a general correction rather than silently cleaning individual results.

Comets have also proved to be a substantially more difficult class than asteroids. The first pipeline version processed both through the same association branch, but I have now separated comet processing while these failure modes are investigated more carefully.

Thank you again for taking the time to examine this case. Your comment identified both the incorrect association and a concrete missing component in the pipeline.

2 Likes

What an interesting case! I decided to check it in both MPC Checker and JPL Horizons.

Horizons returns C/2014 W8 with an expected magnitude of 31, and its predicted position is roughly 6 arcminutes away from the Rubin DiaSource coordinates.

But MPC Checker never shows this comet at all, I think because the maximum limiting magnitude accepted by their UI is 30 (31 and above give error). Then it’s interesting how to retrieve a very faint object from MPC taking into account this limit?

Anton, do you use API call to MPC? Does it return objects fainter than mag 30 for you?

2 Likes

I do not use MPC Checker or an MPC cone-search API to retrieve possible objects from a field.

I maintain a local MPCORB/MPC-SBN replica and process known orbits directly. For each orbit, I select a stable set of MPC observations, fit the seed orbit locally, and generate an ephemeris at 10-minute intervals across the Rubin alert time range.

The pipeline then searches the local alert database with PostgreSQL/Q3C for candidate detections within an initial radius of 10 arcseconds around the predicted position. When candidates are found, I fit the complete group together with the existing MPC observations and examine the resulting orbit, residuals, rejected observations, and stability of the solution.

A candidate is accepted only when it strengthens the existing orbital solution rather than pulling it onto a different branch or requiring the original supporting observations to be discarded. After an observation or group is accepted, the orbit is refitted, a new improved ephemeris is generated, and the search continues through the remaining time range.

2 Likes

How often do you synchronize your local MPCORB replica?

2 Likes

It is synchronized continuously in near real time through PostgreSQL logical replication from the MPC/SBN database.

2 Likes

The MPC Explorer database shows 15 X05 observations of 139P/Vaisala-Oterma from June and July 2025.

data.minorplanetcenter.net/explorer/?tab=Designated&search=139P&subtab=Observations

Do you know if there are LSST dia_source_id’s for these?

1 Like

Those observations are from June and July 2025, while the public Rubin alert archive available through Fink begins in November 2025. Therefore, the corresponding diaSourceId values are not available in this dataset.

2 Likes

Thank you.

2 Likes