Multi-pointing / multi-epoch field. Each observation (o###) is a distinct pointing or epoch; images are grouped by observation. The combined catalog merges all observations (including ones whose images are not yet final and are held for a later release); per-observation catalogs are also provided.
Files are served from the JWST root Globus collection; downloading requires a free Globus login. Checksums and full provenance are in MANIFEST.json.
wget -i / curl after authenticating.Mosaic images (resampled onto a sky grid)
No mosaics in this release. This release distributes the detector-frame exposures below. They are an input to the mosaics, not a by-product of them, so they are complete and citable before any mosaic exists; the resampled images will be added under a later version.
Catalogs
No catalogs in this release. Photometry for these data is still being produced; when it is ready it will be added here under a new version.
Detector-frame exposures
The 2178 individual exposures (222.2GB) this programme has on disk, in the original detector frame, carrying the full distortion solution and this pipeline's astrometry. No mosaic has been drizzled from them yet, so they are grouped by observation and filter from the pipeline's own directories rather than from a mosaic's membership list. Use these to re-drizzle, re-fit, or chase a per-exposure systematic.
All 34 registered observations of this programme are here.
The last detector-frame product differs by field and filter: _crf is the Stage-3 outlier/CR-flagged frame where one was written, otherwise the _destreak / _align / _cal frame the mosaic was drizzled from directly. These are the pipeline's live products rather than frozen copies, so a re-reduction writes a new file beside them and a frame here can become an older generation than the pipeline now holds; they are not covered by CHECKSUMS.sha256. Each file records its own provenance in the keywords below, so a downloaded frame can be identified without reference to this page.
How these frames were produced — command, versions, and the Stage-1 settings that change what is in them
MIRIpython jwst_gc_pipeline/reduction/PipelineMIRI.py -p <proposal> -d <field> -f <FILTER>
NIRCampython jwst_gc_pipeline/reduction/PipelineRerunNIRCAM-LONG.py -p <proposal> -d <field> -f <FILTER> -m nrca,nrcb,merged
Stage-1 (Detector1Pipeline) is re-run from _uncal rather than taken from the archive, with these overrides:
ramp_fit: suppress_one_group=False— a 1-group ramp is FIT rather than discarded, so the brightest stars (whose later groups saturate) keep a measurement instead of a hole. Set on every instrument pathrefpix: use_side_ref_pixels=True— set on every instrument path
jump runs at its pipeline defaults — in particular expand_large_events (snowball expansion) is NOT disabled, despite a comment in the source suggesting otherwise.
| Keyword | Value | Frames |
|---|---|---|
GCTAG | 2026-09-13_PR867_dca0c5d-dirty | 504 |
2026-09-15_PR894_237b655-dirty | 396 | |
2026-09-15_PR898_0d10d1c-dirty | 348 | |
2026-09-15_PR895_0031356-dirty | 312 | |
2026-09-15_PR897_bb22bac-dirty | 216 | |
2026-09-14_PR883_321241f-dirty | 108 | |
2026-09-13_PR880_76ce06f-dirty | 96 | |
2026-09-13_PR866_7fd2447-dirty | 60 | |
2026-09-12_PR863_52f9c40-dirty | 36 | |
2026-09-14_PR886_458eb25-dirty | 36 | |
2026-09-12_PR860_7422c87-dirty | 18 | |
2026-09-15_PR893_64dac47-dirty | 18 | |
2026-09-12_PR859_b15de6d-dirty | 12 | |
2026-09-12_PR862_96a4e61-dirty | 12 | |
2026-09-12_PR855_7025911-dirty | 6 | |
GCPIPEV | dca0c5df95b1a5e5c8afdd658df0e14f47360ccd-dirty | 504 |
237b655c75a6c0b6ac98aa9369e879409bd94eff-dirty | 396 | |
0d10d1c67d892bae7ec6686e0d3d25266d2fc973-dirty | 348 | |
0031356eea979ae81a04064fc5569ab2d641a20b-dirty | 312 | |
bb22bac1311b2687edae80f7976c694f6cbd1024-dirty | 216 | |
321241f5b9d2817d6f068033d6985fb2c1f0a4ff-dirty | 108 | |
76ce06ffb4829c3b72c257d173863977b1af889f-dirty | 96 | |
7fd2447ac1d2e0508da02e96ce00306fd0786924-dirty | 60 | |
458eb2518196a116cb7ef38c7f84fda6996a9f54-dirty | 36 | |
52f9c402650225ef06cf184e338316fd54a0f875-dirty | 36 | |
64dac478b4b45c23c1b7258ec5bdb217f862e0da-dirty | 18 | |
7422c878279b683b170c5f60e63795912315c53e-dirty | 18 | |
96a4e618209581e2aebe3d2e4296f8a8c6708fb3-dirty | 12 | |
b15de6ddfb3706d773473c7b3c694dd744b167de-dirty | 12 | |
70259113a6e038d1699eb96a4486a1c8cebb7bae-dirty | 6 | |
CAL_VER | 1.21.0.dev314+g61bd2fe47 | 2178 |
CRDS_CTX | jwst_1596.pmap | 2178 |
Every frame carries these in its primary header, so the table is a summary and the file is the authority. More than one GCTAG means the frames were reduced across several pipeline versions as tiles arrived; a -dirty suffix means that run had uncommitted changes in its working tree.
Astrometric offsets
The correction from each exposure's assign_wcs pointing to this pipeline's reference frame, 980 rows over 55 (observation, filter) pairs, measured 2026-09-18T10:28Z. Offsets_JWST_Brick10678_consensus.csv is the table itself and is the authority; the summary below is medians. It is re-measured as the merge stages advance and refreshed here daily, so a copy taken last week is not the current answer.
Do not apply this table blindly. 1,392 of the 2,178 released frames ALREADY carry a correction, baked into RAOFFSET and DEOFFSET in extension 1; 786 carry none (both keywords 0.0). Applying the table to a frame that already has one double-corrects it. What each frame still owes is the table value MINUS what its header records.
Coverage. 1,094 of the 2,178 frames have a row in today's table; 1,084 do not, and should be left alone rather than given a neighbouring exposure's shift. The merge stages fill these in as they measure, which is why this page is refreshed daily. The 198 MIRI (F770W) frames are a different case: this table covers F212N and F480M only, so they will never gain a row and nothing here applies to them.
How to apply it
# pip install git+https://github.com/keflavich/jwst-gc-pipeline
import astropy.units as u
from astropy.io import fits
from astropy.table import Table
from stdatamodels.jwst import datamodels
from jwst.tweakreg.utils import adjust_wcs
from jwst_gc_pipeline.reduction.unified_alignment import locked_row_match
tbl = Table.read('Offsets_JWST_Brick10678_consensus.csv')
def owed(fn):
"""(dra, ddec) this frame still needs, arcsec, or None if no row yet."""
hdr0, hdr1 = fits.getheader(fn, 0), fits.getheader(fn, 1)
parts = hdr0['FILENAME'].split('_') # jw10678127001_02101_00001_nrca1_...
if len(parts) < 4 or not parts[2].isdigit():
# An association-style FILENAME (jw10678-o132_t001_miri_f770w_2_...),
# which every MIRI frame in this release carries. The table is
# NIRCam-only, so there is nothing to look up -- and these never gain
# a row, unlike a NIRCam frame that is merely unmeasured.
return None
match = locked_row_match(tbl, visit=parts[0], exposure=int(parts[2]),
filtername=hdr0['FILTER'],
module=hdr0['DETECTOR'].lower(),
vgroup=parts[1]) # '02101' -> Vgroup 2101
if match.sum() == 0:
return None # not measured yet; leave it alone
if match.sum() > 1:
raise SystemExit(f'{fn}: {match.sum()} rows match, refusing to guess')
row = tbl[match][0]
total_ra = float(row['dra (arcsec)']) # what it SHOULD carry
total_dec = float(row['ddec (arcsec)'])
have_ra = float(hdr1.get('RAOFFSET', 0.0) or 0.0) # what it does carry
have_dec = float(hdr1.get('DEOFFSET', 0.0) or 0.0)
return total_ra - have_ra, total_dec - have_dec, total_ra, total_dec
def apply_offsets(fn):
got = owed(fn)
if got is None:
return 'no row yet'
dra, ddec, total_ra, total_dec = got
if abs(dra) < 1e-6 and abs(ddec) < 1e-6:
return 'up to date'
with datamodels.open(fn) as model:
# The GWCS in the ASDF extension, which is what `resample` reads.
model.meta.wcs = adjust_wcs(model.meta.wcs, delta_ra=dra * u.arcsec,
delta_dec=ddec * u.arcsec)
model.save(fn)
# Record the TOTAL now carried, not the delta just applied, so re-running
# this is a no-op rather than a second correction.
fits.setval(fn, 'RAOFFSET', value=total_ra, ext=1)
fits.setval(fn, 'DEOFFSET', value=total_dec, ext=1)
return f'applied {dra*1000:+.1f}, {ddec*1000:+.1f} mas'
Use the pipeline's own row matcher, not your own. Selecting the row for an exposure is not a plain four-column lookup: Exposure and Module narrow only when more than one row still matches (a per-visit table has one row and no usable exposure number), Module matches either nrcb3 or nrcb, and Vgroup narrows ALWAYS -- a visit can dither across disjoint sky tiles with the exposure number restarting in each, so (visit, exposure) alone can name a different pointing's shift and match exactly one row while doing it. locked_row_match is the same function the pipeline uses.
The shift belongs on the GWCS in the ASDF extension, which is what resample reads and what jwst.tweakreg.utils.adjust_wcs edits. Shifting CRVAL in the FITS header instead moves a low-order approximation of that WCS and leaves the GWCS untouched, so the frame then carries two answers and the pipeline uses the one you did not change. dra is a coordinate difference in RA, not an on-sky angle: on-sky it is dra × cos(dec), which at δ = −29° is 0.87 of it.
Offset to the reference frame, per observation and filter
This is the BULK TIE: how far the visit's whole pointing sits from the reference frame, which is what “how wrong is the astrometry” means. Most are tens to hundreds of milliarcseconds; a few are arcseconds, and those are the ones to look at first. Do not confuse it with the per-exposure rows in the same table, which are residuals about each visit's own consensus and are a few mas: those describe how well the frames of one visit agree with each other, and say nothing about where that visit sits on the sky. The rightmost column gives that scatter separately.
Two measurements, named per row. m2 tie is the per-visit consensus measured against the reference catalogue. histogram vs VIRAC2 (mosaic) is a swept, window-confirmed cross-correlation of the whole mosaic, which is how the arcsecond-scale displacements were found. They answer the same question at different scales and are shown in one table on purpose; they are never pooled into one number, which is what this table used to do.
Coverage is partial and uneven. Every F212N observation has 48 frames (8 detectors × 6 exposures) and every F480M has 12, but the table describes between 2% and 92% of them depending on the observation — 52% overall. That reflects how many measurement passes have run and which frames each covered, not anything that differs between the fields. The frame-to-frame RMS is blank below three rows, where a standard deviation is not a scatter.
Click a column to sort; click again to reverse. The default is worst offset first, because that is the order the question “which fields are wrong” is asked in, but Obs gives the survey order.
| Obs | Filter | ΔRA (mas) | ΔDec (mas) | Total (mas) | Source | Frames measured | Frame-to-frame RMS (mas) |
|---|---|---|---|---|---|---|---|
| o040 | F212N | -4489.6 | -19907.8 | 20408 | histogram vs VIRAC2 (mosaic) | not in this release | 7.5 |
| o040 | F480M | -4491.6 | -19907.1 | 20408 | histogram vs VIRAC2 (mosaic) | not in this release | |
| o041 | F480M | -6262.5 | -1324.3 | 6401 | histogram vs VIRAC2 (mosaic) | not in this release | |
| o041 | F212N | -6248.3 | -1322.7 | 6387 | histogram vs VIRAC2 (mosaic) | not in this release | 3.6 |
| o139 | F212N | -469.1 | -161.5 | 496 | m2 tie | 12 / 48 | 5.8 |
| o139 | F480M | -469.7 | -154.6 | 494 | m2 tie | 4 / 12 | 5.3 |
| o108 | F212N | -34.0 | -247.3 | 250 | m2 tie | 24 / 48 | 4.9 |
| o108 | F480M | -33.3 | -246.6 | 249 | m2 tie | 6 / 12 | 5.2 |
| o124 | F212N | -123.1 | -205.9 | 240 | m2 tie | 40 / 48 | 7.7 |
| o114 | F212N | -34.4 | -225.9 | 229 | m2 tie | 2 / 48 | |
| o107 | F212N | -214.8 | -64.0 | 224 | m2 tie | 11 / 48 | 5.7 |
| o102 | F212N | -54.9 | -211.7 | 219 | m2 tie | 32 / 48 | 6.6 |
| o118 | F480M | -79.1 | -134.5 | 156 | m2 tie | 5 / 12 | 5.7 |
| o118 | F212N | -79.4 | -133.5 | 155 | m2 tie | 19 / 48 | 5.3 |
| o106 | F212N | -80.1 | -131.5 | 154 | m2 tie | 4 / 48 | 1.8 |
| o106 | F480M | -79.2 | -130.4 | 153 | m2 tie | 2 / 12 | |
| o120 | F212N | -104.7 | -106.6 | 149 | m2 tie | 27 / 48 | 6.4 |
| o137 | F480M | -98.5 | -111.6 | 149 | m2 tie | 8 / 12 | 6.6 |
| o137 | F212N | -81.5 | -111.6 | 138 | m2 tie | 29 / 48 | 6.3 |
| o128 | F212N | -103.3 | -69.7 | 125 | m2 tie | 14 / 48 | 3.2 |
| o128 | F480M | -102.7 | -68.9 | 124 | m2 tie | 2 / 12 | |
| o131 | F212N | -77.9 | -89.0 | 118 | m2 tie | 3 / 48 | 4.7 |
| o131 | F480M | -77.9 | -86.5 | 116 | m2 tie | 2 / 12 | |
| o117 | F212N | -69.9 | -31.3 | 77 | m2 tie | 32 / 48 | 6.7 |
| o138 | F212N | -67.1 | -36.4 | 76 | m2 tie | 20 / 48 | 4.9 |
| o112 | F212N | -60.6 | -38.9 | 72 | m2 tie | 34 / 48 | 7.3 |
No measured tie yet for 29 (observation, filter) pair(s): o098, o100, o105, o109, o111, o112, o116, o121, o122, o123, o126, o127, o129, o130, o132, o133, o134, o135, o138. These have per-exposure residuals only — their frames agree with each other, and how far that agreement sits from the sky has not been measured. Their astrometry is the raw assign_wcs pointing, not a corrected one, and the size of the error is unknown rather than small.
Astrometric provenance
Pointing corrections: Offsets_JWST_Brick10678_consensus.csv (170KB, modified 2026-09-18T06:28:57)
sha256 3124ffe963c317e849f3c3313da5dfb70bc7c37e0e1fb0ab8d1c20e3b97e8bac
The table ships as a frozen, checksummed copy; the detector frames do not, because a re-reduction rewrites their headers in place. This table, not the FITS, is what makes this version's astrometry reconstructible after the frames have moved on.
| Filter | vs Gaia (sparse) | vs VIRAC2 (dense) | Quote | Measured |
|---|---|---|---|---|
| F770W | 20.28 mas (contrast 29) | 19.80 mas (contrast 288) | neither every confident leg exceeds 15 mas (closest dense at 20 mas) -- a finding, not an accuracy figure | 2026-09-13 |
Where the two references differ, which one to believe is decided per filter by the contrast of the measurement rather than by a fixed preference — a sparse reference can have too few stars to place a peak at all. The bolded value is the one to quote. “neither” means the measurement is either too weak to cite or too large to be an accuracy figure, and the reason says which. Both columns are bulk offsets; a per-star error bar is a separate quantity.