Solar-system light curves

How asteroid and comet light curves are measured and decoded: the two image products, blends, the recommended rows, the time and geometry columns, and the defaults.

API 3.1 · stars release 55c97bc0c218a6c5 · SS release ef7caf53a399bc1f

The SS-1 release#

The solar-system release skypatrolSS_ss1_20261110 holds forced photometry of 196,860 asteroids and comets: 2,104,444,707 observations and 12,614,759,891 measurements. ASAS-SN measured each object at its predicted position in every image that covered it, whether or not it was bright enough to see. Each observation is measured in:

An SS light curve is one choice of product and aperture over both bands. The defaults are chosen per object and are explained below; every response records the selection it used in header.selection, including the product that product=auto chose.

Identifiers#

An object's object_id is a 63-bit integer, so JSON always writes it as a decimal string. You can also use a slug or any unique name, number or designation (details). encke is ambiguous (300); 2P is not.

Reduced and difference images#

Reduced images (red)
Aperture photometry on the calibrated image. The aperture contains the object and any star or galaxy that happens to be behind it. For a bright asteroid that does not matter; for a faint one the background source can dominate, and such a measurement is a blend.
Difference images (conv)
Aperture photometry on the image minus a deep reference image of the same field. Static sources cancel, so the counts are the object's own flux. They are not missing a reference flux: never add the reference flux back. Difference images exist only where the subtraction succeeded, and their errors are approximate (moving_quality ERROR_APPROXIMATION).

product=auto#

The server picks the difference images when the object's median recommended difference-image g magnitude is fainter than 13.5, or when the object has no good reduced-image detection but does have recommended difference-image detections. Otherwise it picks the reduced images, which are better for bright objects. The choice uses statistics computed for the release at 2 px, so it does not change with the aperture you ask for. header.selection.product records the result.

How the light curve is decoded (SS-D1)#

The server turns stored counts into fluxes and magnitudes with these rules. They are a port of the reference decoder used for the (20) Massalia delivery, and the server is tested to reproduce it exactly.

  1. Flux scale in mJy per count: scale = F0 × 1000 × 10−0.4 (25 + zp), with F0 = 3631 Jy for g (AB) and 3836.3 Jy for V.
  2. Flux and variance: flux = counts × scale and
    var = counts_err² scale² + (0.4 ln10 · flux · zp_err)² + (0.4 ln10 · flux · floor)², where floor is the error floor.
  3. Valid: flux and variance are finite, the variance is positive, and moving_quality NONFINITE (16) is clear.
  4. Detected: valid and counts > 5 counts_err.
  5. Limit: 25 + zp − 2.5 log10(5 counts_err), or NaN if the row is not valid.
  6. Magnitude: 25 + zp − 2.5 log10(counts) if detected, otherwise the limit.
  7. Magnitude error: √((1.0857 counts_err / counts)² + zp_err² + floor²) if detected, otherwise 99.999.

All arithmetic is in 64-bit floats and the photometric results are served as 32-bit floats. jd, ra and dec are served as stored, in 64 bits.

Error floor#

Photometric errors from counting statistics underestimate the scatter of bright objects. error_floor adds a systematic term in quadrature:

The full column floor_mag shows the floor applied to each row. Star light curves do not include a floor (uncertainties).

Blends and max_blend#

For each reduced-image row the server measures how much of the flux could come from static sources:

blend_ratio = ref_flux_mjy / flux_mjy

where ref_flux_mjy is the reference-image flux inside the same aperture, taken from the difference-image row of the same exposure and scaled with this row's zero point. A ratio of 0.05 means that a static source contributes 5% as much flux as was measured. Reduced-image rows count as recommended only if |blend_ratio| ≤ max_blend (default 0.05); a row whose ratio is unknown fails. Use max_blend=none to switch the cut off.

The cut matters: in reduced images, three quarters of the rows that would otherwise be recommended belong to objects never predicted brighter than 17 mag, far below what ASAS-SN can see. They are stars, not asteroids, and the blend cut removes about 99% of them. Difference images do not need the cut.

A row is recommended (recommended = 1) when all of these hold:

  1. it is detected (counts > 5σ);
  2. quality bits 0–5 are clear (quality & 63 == 0): no bad or saturated pixel, the image was marked good, a difference image exists, no negative pixel and no sky fallback;
  3. moving_quality PARTIAL_APERTURE (8), NONFINITE (16) and NO_FLAT (32) are clear;
  4. the native image position x, y was measured;
  5. for reduced-image rows only: |blend_ratio| ≤ max_blend.

rows=recommended returns only these rows; rows=detected returns every detection. The decile bits 8–12 are deliberately not part of the rule; see quality flags if you want to add them with exclude_quality.

Decile bits#

Quality bits 8–12 mark epochs in the worst 10% of the object's own observations for image FWHM, astrometric residual, zero-point fit scatter (when at least 10 calibrators were used), throughput and depth. deciles chooses the population each epoch is compared with:

Groups with fewer than 30 epochs are not evaluated, and their decile bits stay 0. The bits are computed on the full light curve, before the rows, exclude_quality and max_blend filters, so changing a filter never changes which rows carry a decile bit. The full column decile_evaluated says which decile tests ran for each row: bit k is set when the test for quality bit 256 << k was evaluated.

Time columns#

ColumnTimeUse it for
jdJD (UTC) at mid-exposure, when the light arrived at the telescopeMatching images, plotting, scheduling
jd + djd_emissionThe time the light left the object, in TDBRotation periods and phase curves
jd + dbjd (full)BJDTDB: arrival time at the solar-system barycentreComparing with star light curves

djd_emission combines the light-travel time from the object (about 0.0058 days per AU of Δ) with the UTC-to-TDB offset. It is stored as a 32-bit float, so jd + djd_emission is good to better than a millisecond. Do the addition in 64 bits.

jd is always the observed UTC time, even when the website's light-time toggle (lt=1) is on. The toggle changes only the plotted x values; links between the plot, the orbit view and the sky panel, and the API, use the observed jd.

Python
import pandas as pd

lc = pd.read_csv("https://asassn-v3.ifa.hawaii.edu/v3/ss/objects/20/lc?format=csv", comment="#")
lc = lc[lc.recommended == 1]
t_emit = lc.jd + lc.djd_emission.astype("float64")      # light-time corrected, TDB
print((t_emit - lc.jd).describe())                        # light-travel time + (TDB - UTC), days

Geometry#

The object record and the light-curve header carry the osculating orbital elements; the website draws the orbit from them. /orbit returns the orbit as a list of points.

Comets#

Comet magnitudes are aperture photometry of the coma inside the chosen radius, so they depend on the aperture and are not total magnitudes. Compare comet magnitudes only at one aperture. Comets have no predicted magnitude (pred_mag is NaN), and the phase-curve view plots m − 5 log10Δ against r. For historic and SOHO comets the orbit does not pin down the position during the ASAS-SN years, so their rows sample essentially random sky.

Object notes#

The object record and the light-curve header carry notes that warn about known problems. The website shows them above the plot.

NoteMeaning
EPHEMERIS_FLAGSmoving_quality EPHEMERIS_UNVALIDATED (2) and POSITION_UNCERTAIN (1024) are set on every SS-1 row. They mark missing orbit-uncertainty information, not bad data.
FAINT_PREDICTIONThe object is never predicted brighter than about 19 mag. Reduced-image "detections" are almost certainly blends; use the difference images.
RED_BLENDEDMost reduced-image detections fail the blend cut; the difference images are cleaner.
NO_GOOD_DETECTIONSThe object stayed below the ASAS-SN limit, or its position is unreliable. The rows are forced photometry and upper limits.
FEW_GOODFewer than 10 good detections.
NO_CONVNo difference-image measurements.
COMETComet magnitudes depend on the aperture (above).
UNRELIABLE_EPHEMERISHistoric or SOHO comet; the measured positions are essentially arbitrary.
NO_ORBITNo osculating orbit, so no orbit diagram.

Defaults and why#

ParameterDefaultReason
bandsg,VEverything ASAS-SN measured
productautoReduced images for bright objects, difference images for faint ones (rule)
aperture2 (16″)The usual ASAS-SN aperture radius
error_floorcameraThe measured per-camera systematic error
decilesobject_cameraEvaluates 99.8% of rows, against 33.6% for object_field_camera
max_blend0.05Removes about 99% of the reduced-image blends with static stars
rowsallNothing hidden unless you ask
exclude_quality0Flags are warnings, not cuts
colswebEverything the website needs

These defaults (aperture 2 px, camera floor, object_camera deciles, auto at 13.5 mag, blend cut 0.05) are waiting for Ben's approval. Changing any of them changes the SS serve_id, so versioned URLs stay correct.

/v3/ss/objects/{ref} returns default_selection, the defaults resolved for that object, with product_reason explaining the choice of product. A light curve's header.selection gives product_requested and the product actually used.

Columns#

Rows are sorted by jd, then by image number.

Web columns (cols=web, the default)#

ColumnTypeUnitMeaning
jdf8dJD (UTC) at mid-exposure, as observed
djd_emissionf4dEmission time (TDB) minus jd (time columns)
magf4magMagnitude if detected; otherwise the 5σ limit (NaN if none)
mag_errf4magError including zero-point error and floor; 99.999 if not detected
limitf4mag5σ limiting magnitude; NaN if the row is not valid
detectedu11 if valid and counts > 5 counts_err
recommendedu11 if the row passes the recommended rule
bandu1Band, coded through dictionaries.band (g, V)
camerau1Camera, coded through dictionaries.camera
image_numu4Image number; the image name is camera + %06d
qualityu2Q5 quality bits
moving_qualityu2Moving-object bits
ra, decf8degPredicted astrometric position (ICRF)
r_auf4AUHeliocentric distance
delta_auf4AUDistance from the observer
phase_angle_degf4degSun–object–observer angle

Full columns (cols=full)#

All web columns, plus:

ColumnTypeUnitMeaning
dbjdf4dBJDTDB minus jd
flux_mjyf4mJyFlux density (forced; can be negative)
flux_err_mjyf4mJyFlux error including zero-point error and floor
countsf4countsAperture counts (difference images: the object's own flux)
counts_errf4countsCounts error
zpf4magZero point
zp_errf4magZero-point error
floor_magf4magError floor applied to this row
zp_fit_stdf4magScatter of the zero-point fit
n_calibratorsi4Stars used for the zero point; −1 if unknown
fwhmf4pixImage FWHM
wcs_medf4arcsecMedian astrometric residual of the image WCS (header WCS_MED, arcsec; 1 pixel = 8″)
x, yf4pixPosition on the native image; NaN if not measured
flatf4Flat-field value at the position
trail_pxf4pixLength of the object's trail during the exposure
pred_magf4magPredicted magnitude (NaN for comets)
elongation_degf4degSun–observer–object angle
fieldu2ASAS-SN field, coded through dictionaries.field
ref_flux_mjyf4mJyReduced rows: reference flux in the aperture (from the same exposure's difference row). Difference rows: the static source in the reference under the aperture.
ref_flux_err_mjyf4mJyError of ref_flux_mjy
blend_ratiof4Reduced rows: ref_flux_mjy / flux_mjy; NaN for difference rows or when unknown
decile_evaluatedu1Bit k set: the decile test for quality bit 256 << k ran
validatedu1Ephemeris-validated flag, as stored