Zero-aperture comet astrometry

domino-calibrator 0.1.0

A FITS cutout in; the photocentre-vs-aperture curve, the zero-aperture position and a draft ADES record out. Everything runs in this page; nothing is uploaded.

1. The cutout

Click the comet to set the start (default: the brightest 5×5 pixel).
(x = column, y = row; 0-based; add 1 for ds9)

2. The method

px

3. The record (every value is yours; nothing defaults)

The tool writes an ADES record only from a start you give, on the comet, and only when its checks pass: a sound sky solution, every radius converged, and a bright, unclipped peak of more than one pixel well above the sky; a star or a galaxy can pass these checks too, so telling a comet from a star is yours. Otherwise it says why, and the pixel answer stands. A star inside the measuring ring pulls the answer toward it.

The observation
The MPC's code for your site, e.g. 568.
As the MPC writes it: 3I, 1P, C/2025 N1.
The star catalogue your plate solution used, e.g. Gaia3.
From the header when it has one; otherwise type it.
The people
Initials, then surname, as ADES asks: A. N. Observer.
Initials, then surname, as ADES asks; a semicolon between names: J. Smith; A. Doe.
Optional; initials, then surname; a semicolon between names: B. Roe.
The telescope
As ADES names it, e.g. Reflector.
The detector type, e.g. CCD or CMOS.

4. The answer


What it does

The method
Photocentres in circular apertures of radius 2.0–6.0 px in 0.1 px steps, a straight line through x(r) and y(r), and its value at r = 0: the published form of the shrinking-aperture method (Farnocchia et al. 2016, Icarus, arXiv:1507.01980, §2.1 and §3.1; D. J. Tholen). G fits a circular pixel-integrated Gaussian inside each aperture, weighted by exact pixel overlaps, with the background from the 2.5r–5r annulus (the paper's default); M is the first moment, re-centred until it stops moving. The paper does not publish its fitting function, so both are offered. Pixels are 0-based. A radius that does not converge has no position; the table gives its reason, and the line is fitted to the rest. The WCS reader handles TAN and TAN-SIP in ICRS (or FK5 at J2000), with HST's lookup tables read from the file itself; any other WCS gives pixels only. The ADES record (version 2022) is written only from the header's time and your own values, and is a draft for the MPC's validator. This page runs the same method, ported and checked against the Python: where it says "the command line", it means that Python, in the package this page belongs to (domino-calibrator, installed in a virtual environment as its README.md says): domino-calibrator image.fits, the same as python -m domino_calibrator.cli image.fits; it reads what the page cannot, as each refusal here says. Look at the curve before trusting the intercept.
A cutout
The page reads images up to 25 Mpx, and the method needs only the comet and its sky, so cut out the comet first, keeping the frame's WCS and its time. With astropy, for a frame whose WCS is TAN or TAN-SIP (as astrometry.net and ASTAP write them):
from astropy.io import fits
from astropy.nddata import Cutout2D
from astropy.wcs import WCS

x, y = 2345.6, 1234.5                       # the comet in the frame, in pixels (0-based)
# the r before each path keeps a Windows path as typed: r'C:\Users\you\frame.fits'
with fits.open(r'frame.fits') as f:
    i = next(k for k, u in enumerate(f) if u.is_image and u.data is not None and u.data.ndim == 2)
    h = f[i].header                         # the first 2-D image: HDU 0 for most cameras, 1 for Hubble's and many pipelines'
    c = Cutout2D(f[i].data, (x, y), (101, 101), wcs=WCS(h, fobj=f))
    out = c.wcs.to_header(relax=True)       # the WCS, SIP included, moved to the cutout
    for k in ('DATE-OBS', 'TIME-OBS', 'DATE-AVG', 'MJD-OBS', 'EXPTIME', 'EXPOSURE', 'TIMESYS', 'RADESYS', 'EQUINOX'):
        for g in (h, f[0].header):          # the image's own card first, then the file's first header
            if k in g:
                out[k] = g[k]               # the time and the frame, which the record needs
                break
    fits.PrimaryHDU(c.data, out).writeto(r'cutout.fits')
Then load cutout.fits here.
The study behind it
What the study found, checked by us, not yet by anyone outside: one comet, 3I/ATLAS, in five visits of Hubble's WFC3/UVIS, one filter (F350LP), degraded to 26 ground set-ups, with HST's own zero-aperture photocentre as the reference (the frames: Hubble programme 18152, PI Man-To Hui, from MAST at STScI), not the nucleus. With G and the background known, the study's setting, the published extrapolation helps in 20 of 20 cells at ≤ 1.0″ seeing and ≤ 0.44″/px without noise; at low signal, SNR 20, the zero-aperture position is further from HST's photocentre than the r = 2 px one in 9 of the 20 cells at ≤ 1.0″ seeing and ≤ 0.44″/px; the extrapolation fails in 42 of 45 cells at ≥ 2″ seeing and ≥ 1.0″/px; sharp pixels alone are not enough: it fails in 15 of 40 cells at ≤ 0.44″/px with any seeing; and the zero-aperture position is further off than no correction in 45 of the 130 cells, all at ≥ 0.70″/px. Two first findings, recounted from the same run: with the background from the 2.5r–5r annulus, the page's default, G was measured in 50 of the 130 cells, all at ≤ 0.70″/px, and in none at ≥ 1.0″/px; where it was measured, G with the background from the annulus helps in 20 of 20 cells at ≤ 1.0″ seeing and ≤ 0.44″/px and fails in 15 of 40 cells at ≤ 0.44″/px with any seeing, as G with the background known does, and is further off than no correction in 0 of the 50 measured cells; with M, the zero-aperture position is further off than no correction in 58 of the 130 cells, all at ≥ 0.70″/px, more often than with G. The boxes these tallies are counted in were drawn after the data. Check it on your own frames: every cell, the limits and the scripts are in the package's README.md and runs/.