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.
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:
- two products: the reduced image (
red) and the difference image (conv); - six apertures: radii of 0.75, 1, 1.25, 1.5, 2 and 3 pixels (8.0″ per pixel);
- its band: g or V, depending on the camera.
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.
- 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. - Flux and variance:
flux = counts × scaleandvar = counts_err² scale² + (0.4 ln10 · flux · zp_err)² + (0.4 ln10 · flux · floor)², whereflooris the error floor. - Valid: flux and variance are finite, the variance is positive, and moving_quality NONFINITE (16) is clear.
- Detected: valid and
counts > 5 counts_err. - Limit:
25 + zp − 2.5 log10(5 counts_err), or NaN if the row is not valid. - Magnitude:
25 + zp − 2.5 log10(counts)if detected, otherwise the limit. - 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:
camera(default): each camera's measured floor for the date of the image, 0.009 to 0.020 mag (median 0.0137 mag);- a number: that floor in magnitudes for every row;
none: no floor.
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.
Recommended rows#
A row is recommended (recommended = 1) when all of these hold:
- it is detected (counts > 5σ);
- 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; - moving_quality PARTIAL_APERTURE (8), NONFINITE (16) and NO_FLAT (32) are clear;
- the native image position
x,ywas measured; - 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:
object_camera(default): all of this object's rows from the same camera, in the same band, product and aperture. This evaluates 99.8% of rows.object_field_camera: the same, split further by field, as in the original Massalia delivery. A moving object crosses many fields, so most groups are too small and only about a third of rows are evaluated.none: no decile bits.
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#
| Column | Time | Use it for |
|---|---|---|
jd | JD (UTC) at mid-exposure, when the light arrived at the telescope | Matching images, plotting, scheduling |
jd + djd_emission | The time the light left the object, in TDB | Rotation periods and phase curves |
jd + dbjd (full) | BJDTDB: arrival time at the solar-system barycentre | Comparing 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.
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), daysGeometry#
ra,dec: the predicted astrometric position (ICRF, degrees) at which the object was measured.r_au: heliocentric distance;delta_au: distance from the observer. Both are the stored values from the ephemeris.phase_angle_deg: the Sun–object–observer angle, computed from vectors. The observer is the Earth (from a daily heliocentric table) plus the position of the camera's site.elongation_deg(full): the Sun–observer–object angle.
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.
| Note | Meaning |
|---|---|
| EPHEMERIS_FLAGS | moving_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_PREDICTION | The object is never predicted brighter than about 19 mag. Reduced-image "detections" are almost certainly blends; use the difference images. |
| RED_BLENDED | Most reduced-image detections fail the blend cut; the difference images are cleaner. |
| NO_GOOD_DETECTIONS | The object stayed below the ASAS-SN limit, or its position is unreliable. The rows are forced photometry and upper limits. |
| FEW_GOOD | Fewer than 10 good detections. |
| NO_CONV | No difference-image measurements. |
| COMET | Comet magnitudes depend on the aperture (above). |
| UNRELIABLE_EPHEMERIS | Historic or SOHO comet; the measured positions are essentially arbitrary. |
| NO_ORBIT | No osculating orbit, so no orbit diagram. |
Defaults and why#
| Parameter | Default | Reason |
|---|---|---|
bands | g,V | Everything ASAS-SN measured |
product | auto | Reduced images for bright objects, difference images for faint ones (rule) |
aperture | 2 (16″) | The usual ASAS-SN aperture radius |
error_floor | camera | The measured per-camera systematic error |
deciles | object_camera | Evaluates 99.8% of rows, against 33.6% for object_field_camera |
max_blend | 0.05 | Removes about 99% of the reduced-image blends with static stars |
rows | all | Nothing hidden unless you ask |
exclude_quality | 0 | Flags are warnings, not cuts |
cols | web | Everything 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)#
| Column | Type | Unit | Meaning |
|---|---|---|---|
jd | f8 | d | JD (UTC) at mid-exposure, as observed |
djd_emission | f4 | d | Emission time (TDB) minus jd (time columns) |
mag | f4 | mag | Magnitude if detected; otherwise the 5σ limit (NaN if none) |
mag_err | f4 | mag | Error including zero-point error and floor; 99.999 if not detected |
limit | f4 | mag | 5σ limiting magnitude; NaN if the row is not valid |
detected | u1 | 1 if valid and counts > 5 counts_err | |
recommended | u1 | 1 if the row passes the recommended rule | |
band | u1 | Band, coded through dictionaries.band (g, V) | |
camera | u1 | Camera, coded through dictionaries.camera | |
image_num | u4 | Image number; the image name is camera + %06d | |
quality | u2 | Q5 quality bits | |
moving_quality | u2 | Moving-object bits | |
ra, dec | f8 | deg | Predicted astrometric position (ICRF) |
r_au | f4 | AU | Heliocentric distance |
delta_au | f4 | AU | Distance from the observer |
phase_angle_deg | f4 | deg | Sun–object–observer angle |
Full columns (cols=full)#
All web columns, plus:
| Column | Type | Unit | Meaning |
|---|---|---|---|
dbjd | f4 | d | BJDTDB minus jd |
flux_mjy | f4 | mJy | Flux density (forced; can be negative) |
flux_err_mjy | f4 | mJy | Flux error including zero-point error and floor |
counts | f4 | counts | Aperture counts (difference images: the object's own flux) |
counts_err | f4 | counts | Counts error |
zp | f4 | mag | Zero point |
zp_err | f4 | mag | Zero-point error |
floor_mag | f4 | mag | Error floor applied to this row |
zp_fit_std | f4 | mag | Scatter of the zero-point fit |
n_calibrators | i4 | Stars used for the zero point; −1 if unknown | |
fwhm | f4 | pix | Image FWHM |
wcs_med | f4 | arcsec | Median astrometric residual of the image WCS (header WCS_MED, arcsec; 1 pixel = 8″) |
x, y | f4 | pix | Position on the native image; NaN if not measured |
flat | f4 | Flat-field value at the position | |
trail_px | f4 | pix | Length of the object's trail during the exposure |
pred_mag | f4 | mag | Predicted magnitude (NaN for comets) |
elongation_deg | f4 | deg | Sun–observer–object angle |
field | u2 | ASAS-SN field, coded through dictionaries.field | |
ref_flux_mjy | f4 | mJy | Reduced 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_mjy | f4 | mJy | Error of ref_flux_mjy |
blend_ratio | f4 | Reduced rows: ref_flux_mjy / flux_mjy; NaN for difference rows or when unknown | |
decile_evaluated | u1 | Bit k set: the decile test for quality bit 256 << k ran | |
validated | u1 | Ephemeris-validated flag, as stored |