FITS headers reference¶
Everything on this page is written by argos.core.imaging.fits_writer. The
data array is uint16, linear, and still in its Bayer mosaic — ARGOS never
debayers, stretches or scales what it writes to disk.
Note
Many headers are written only when the acquisition supplied the value. A
frame taken with no site configured has no SITELAT; a frame taken without a
solved target has no TARGRA. The tables below mark those conditional.
Reading one for yourself
from astropy.io import fits
with fits.open("XX_Cyg_ir_light_e020000ms_g080_00024.fit") as hdul:
print(repr(hdul[0].header))
The format is FITS 3.0 (Pence et al. 2010); keyword conventions follow the ASCOM/AAVSO usage common to acquisition software, so most of what follows will already be familiar from N.I.N.A. or MaxIm DL.
File naming¶
{OBJECT}_{FILTER}_{TYPE}_e{EXPOSURE_MS}ms_g{GAIN}_{INDEX}.fit
For example XX_Cyg_ir_light_e020000ms_g080_00024.fit: a 20 s exposure at gain
80 through the IR filter, frame 24 of the series.
The prefix is fixed for one homogeneous series; only the final index changes, which is what Siril’s sequence discovery requires.
Exposure is in milliseconds, zero-padded to six digits. The index is 1-based and padded to five.
_g{GAIN}is omitted when the gain is unknown.The extension is
.fit, not.fits.There is deliberately no timestamp in the filename — the precise time belongs in
DATE-OBS.Object, filter and type are sanitised for the filesystem and lower-cased (except the object, which keeps its case).
Session folder¶
{sessions}/{RUN}_{OBJECT}/
├── lights/
├── darks/
├── flats/
├── biases/
├── session.json
├── photometry_quality.json
└── diagnostics/
{RUN} is the run identifier, or the first frame’s UTC timestamp formatted
%Y%m%dT%H%M%SZ when there is none — for example 20260906T213734Z_XX_Cyg.
Image-type folders are lower-case plurals, as Siril expects.
Structure¶
Keyword |
Meaning |
|---|---|
|
file conforms to FITS standard |
|
number of bits per data pixel — always 16 |
|
axis count and lengths (X/columns, Y/rows) |
|
FITS dataset may contain extensions |
|
|
BZERO = 32768 and BSCALE = 1 are added by astropy for unsigned 16-bit data.
Timing¶
Keyword |
Meaning |
|---|---|
|
UTC date/time of exposure start |
|
local date/time of exposure start |
|
UTC date/time of exposure midpoint |
|
MJD of exposure start (UTC) |
|
MJD of exposure midpoint (UTC) |
|
[s] exposure time |
|
[s] exposure time (alias) |
The midpoint headers are the ones photometry uses: a light curve point is timed
by DATE-AVG, not DATE-OBS.
Sensor and gain¶
Keyword |
Meaning |
|---|---|
|
camera gain setting (0–600 on the Seestar), not a physical unit |
|
[e⁻/ADU] electron gain, with its source named in the comment |
|
[e⁻/ADU] electron gain (AAVSO alias) |
|
[e⁻/ADU] electron gain (alias) |
|
[e⁻] read noise, from the sensor reference |
|
[e⁻] full-well capacity, from the sensor reference |
|
binning factors — always 1 |
|
[°C] sensor temperature (conditional) |
|
electronic offset / bias setting (conditional) |
|
sensor readout mode (conditional) |
Warning
GAIN and EGAIN are different quantities. GAIN is the dimensionless slider
value; EGAIN is the electrons-per-ADU conversion the photometry noise model
needs. Do not use one for the other.
Which ADU? An unresolved question — read before you trust EGAIN
The sensor is a 12-bit ADC whose output is scaled into a 16-bit file. That
leaves a factor of 16 hanging over every electron conversion, and this
documentation cannot tell you which side of it EGAIN sits on, because the code
does not record it.
The consistency check that ought to hold is
\(\text{EGAIN} \times (\text{saturation ADU}) \le \text{FULLWELL}\). With ARGOS’s
own reference values it fails at every shipped gain — see
Differential photometry — method and equations §3.5 for the table. Something in
EGAIN / FULLWELL / camera.linearity_max_adu is referenced to a different
ADU scale from the others.
Until it is resolved: EGAIN and FULLWELL are reference-table values, not
measured calibrations of your unit. If your reduction depends on absolute
electrons — a real SNR, a photon-noise model — measure the gain yourself from a
pair of flats rather than reading it out of this header. Everything
differential is unaffected, because a constant gain error cancels.
Instrument and optics¶
Keyword |
Meaning |
|---|---|
|
telescope name, from the active profile |
|
sensor name — |
|
[mm] aperture diameter — 30.0 for the S30 Pro |
|
[mm] focal length — 160.0 for the S30 Pro |
|
focal ratio — f/5.3 for the S30 Pro |
|
[µm] unbinned pixel size — 2.9 |
|
Bayer pattern — |
|
Bayer offsets |
|
equinox and celestial reference system |
Frames written before 0.4.1
FOCRATIO was written as f/3.2 instead of f/5.3, and APTDIA was not written
at all. Both are corrected in 0.4.1 — check any frame you already hold.
Target and pointing¶
Keyword |
Meaning |
|---|---|
|
target name, truncated to 68 characters |
|
the physical filter-wheel selection: |
|
[h], [deg] requested target coordinates (J2000) (conditional) |
|
[h], [deg] pointing coordinates (J2000) (conditional) |
|
the same pointing in sexagesimal (conditional) |
|
[deg] telescope altitude and azimuth (conditional) |
|
side of pier (conditional) |
Sexagesimal formats are HH MM SS.ss for OBJCTRA (two decimals) and
±DD MM SS.s for OBJCTDEC (one decimal).
Important
FILTER is the filter wheel’s position, never a photometric band. The band used
for differential photometry is a separate setting (photometry.default_band,
TG by default) and is not stamped into this header.
Sky conditions¶
Keyword |
Meaning |
|---|---|
|
airmass at exposure start, Pickering (2002) (conditional) |
|
[deg] angular separation between target and Moon (conditional) |
|
[deg] Moon altitude at the site (conditional) |
|
Moon illuminated fraction, 0–1 (conditional) |
Observer and site¶
Keyword |
Meaning |
|---|---|
|
observer name (conditional) |
|
[deg] site latitude (conditional) |
|
[deg] site longitude, east positive (conditional) |
|
[m] site elevation (conditional) |
Software¶
Keyword |
Meaning |
|---|---|
|
acquisition software and version |
|
the same, under their conventional aliases |
|
session annotation (conditional) |
Frame quality¶
Measured on the green plane and written per frame when the metric is available.
Keyword |
Meaning |
|---|---|
|
[px] half-flux diameter, at the subsampled scale |
|
[px] mean star FWHM on the green plane |
|
detected star count |
|
[ADU] median sky background |
|
mean star eccentricity, 0 = round |
Important
HFD and FWHM are both in green-plane pixels, which are twice the size of
raw sensor pixels. To convert to arcseconds, multiply by 2 and then by the
full-resolution plate scale — 3.74″/px on an S30 Pro, so one green pixel is
7.48″. Using the full-resolution scale directly gives an answer a factor of two
too small.
These describe the frame, not the photometry: they are the trends Review plots to tell a good hour from a bad one.
What is not in the header¶
The frames carry no astrometric solution
ARGOS writes no WCS. There is no CRVAL, no CRPIX, no CD matrix, no
CTYPE, and no plate-scale keyword of any kind among the 65 written above.
RA/DEC and OBJCTRA/OBJCTDEC record where the mount was pointing —
they are not a solved position and cannot be used to convert pixels to
coordinates.
The practical consequence for your reduction: every frame must be re-solved downstream. Siril will do it, and ASTAP is already on your machine. Budget for it, and do not assume a stacking script that expects a WCS will work on these files unmodified.
The solution ARGOS computes during a session lives in the session record and in the interface, not in the pixels you keep.
The Bayer pattern is not negotiable¶
The array on disk is the raw CFA mosaic with BAYERPAT = 'GRBG'. Any tool that
reads it must debayer with that pattern, or the colours — and the photometry —
are wrong. ARGOS’s own measurements never debayer at all: they read the green
plane described in Differential photometry — method and equations.
Warning
If you open one of these frames and it looks grey and grainy at 1:1, nothing is
broken — you are looking at an undebayered mosaic. Siril debayers on import when
BAYERPAT is present; check that its Debayer setting is reading the header
rather than a forced pattern.
See also
References and further reading for the FITS standard, the AAVSO TG band definition and the
airmass formula behind the AIRMASS keyword.