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.
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.
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.
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.
README.md and runs/.