Visual MSA Planning Tool — interactive Bokeh app for JWST/NIRSpec MSA shutter configuration, with hMPT-derived pointing optimization and shutter-collision protection.
Project description
vMPT — visual MSA Planning Tool
Interactive Bokeh app for planning JWST/NIRSpec MSA observations directly on an image of the target field. vMPT combines:
- Automated MSA pointing optimization — vMPT's
optimizer.pyis a lightweight Python module that searches (RA, Dec, V3 PA) for the best MSA pointing and roll angle. It's inspired by hMPT (Zihao Wu et al., CfA|Harvard), which is itself inspired by ESA's eMPT (Bonaventura et al. 2023). The MSA shutter geometry, V2/V3 ↔ (s, d) coordinate mapping, and gnomonic projection are independently implemented; the search algorithm (grid → differential-evolution refine) is a simpler version than hMPT's. Three modes: Democracy (count), Meritocracy (Σ weight), Hierarchy (strict priority tiers). - Shutter-collision protection — mark high-priority targets
whose spectra must not overlap any other source on the detector
under the current Disperser / Filter. Slitlet-aware row buffer
(
v1.2.1+) reserves one row above and below each protected slitlet, including against stuck-open shutters. - Hand-picking + live conflict feedback — click any shutter to open an N-shutter slitlet, watch the orange spec-overlap layer light up in real time, undo / redo at will.
- APT / eMPT-ready export — write an MPT_plan.json + .cat bundle that loads straight into APT, plus the three CSVs that feed the eMPT pipeline.
- Sharing — save the whole session as a JSON file, send it to a collaborator, and they pick up exactly where you left off.
📖 Full documentation: https://vmpt.readthedocs.io/
The vMPT interface running against the RXCJ0600 example: target-field image (centre) with the 4 MSA quadrants overlaid at the chosen V3 PA, stuck-open shutters as dark-red outlines, user picks as red fills, spec-overlap rows in orange. Left sidebar: image / aim / pick / MPT tabs. Right panel: rotating tip card + quick-reference legend.
Installation
vMPT is a local-only tool: it runs on your machine, files stay on your disk, computation uses your local Python.
Option A — pip install (recommended, v1.2.2+)
vMPT is on PyPI as jwst-vmpt:
pip install jwst-vmpt
vmpt # opens the app
The console script vmpt accepts the same flags as run.sh:
vmpt --port 5010 # different port
vmpt --fits img.fits --catalog a.csv --catalog b.csv # stack catalogs
vmpt --jpg img.jpg --wcs wcs.fits --catalog targets.csv # JPG + WCS pair
vmpt examples download # fetch example_a370 + example_r0600
The wheel itself is ~20 MB (just the MSA grid + dispersion table).
The two example datasets (~64 MB combined) are fetched on demand
via vmpt examples download, dropping example_a370/ and
example_r0600/ into the current directory.
Option B — STScI's stenv from source (for JWST pipeline users)
If you already use the STScI JWST/HST pipeline environment, most dependencies are already present:
git clone https://github.com/fengwusun/vMPT.git
cd vMPT
conda activate stenv
pip install bokeh jwst_gtvt
./run.sh # bokeh serve vmpt/ under the hood
The browser should open at http://localhost:5006/app.
Option C — fresh conda env from source
git clone https://github.com/fengwusun/vMPT.git
cd vMPT
conda create -n vmpt python=3.11
conda activate vmpt
pip install -r requirements.txt
./run.sh
Option D — plain pip + venv from source
git clone https://github.com/fengwusun/vMPT.git
cd vMPT
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
./run.sh
Verify the install
pytest tests/ # 183 passed, 5 skipped; ~15 seconds
If everything's green, the tool is ready. If pytest complains about
a missing module, check that you're in the right environment.
First-time use — two-minute tour
The repo ships with two example fields you can load with one click.
-
Start the server:
./run.sh
Browser opens at
http://localhost:5006/app. If it doesn't, open that URL yourself.Optional flags pre-load files and pick a port:
./run.sh --port 5010 # default is 5006 ./run.sh --fits path/to/image.fits ./run.sh --jpg path/to/image.jpg --wcs path/to/wcs.fits ./run.sh --catalog targets.csv # repeat to stack ./run.sh --port 5010 --fits img.fits --catalog a.csv --catalog b.csv
--jpgand--wcsmust come as a pair;--fitsis mutually exclusive with them. -
Load an example from the Input tab (left sidebar):
- "Load Abell 370 example" — a 42 MB three-band FITS at
example_a370/a370_f182m_f200w_f210m.fits(JWST/NIRCam F182M + F200W + F210M). Includes a target catalog and an APT MPT plan from GTO-1208 you can load to see the full picking workflow. - "Load RXCJ0600 example" — a 17 MB JPG + WCS-sidecar pair
(
example_r0600/*). Demonstrates the JPG+sidecar workflow. Includes a ~28k-source target catalog.
Both examples are committed in the repo (no extra download needed). A full-page spinner overlays the canvas during loads so you know the app is busy.
Tabs in the left sidebar:
- Input — image + catalog loading.
- Pointing — RA/Dec/V3 PA, disperser/filter, visibility window, and the MSA pointing optimizer.
- Setting — layers, slitlet size, snap-to-operable, overlay appearance, undo/clear.
- MPT — import/export APT plans + session save/load.
- "Load Abell 370 example" — a 42 MB three-band FITS at
-
Aim the MSA in the Pointing tab:
- The pointing center auto-fills to the image center (unless a plan was loaded first — in that case the plan's RA/Dec is kept).
- Drag the V3 PA slider or type into the APA box. The spinner appears during recomputation.
- Pick a disperser / filter from the dropdown (e.g. PRISM / CLEAR or G395H / F290LP). The wavelength endpoints + NRS1/NRS2 detector-gap on each open shutter come from a per-shutter table pre-computed via msaviz (see Wavelength accuracy below).
- Optional: enter a date and click "Compute allowed V3 PA" —
queries
jwst_gtvtand reports the valid V3 PA window for that date. - Optional: MSA pointing optimizer at the bottom of the tab. See the next section.
-
Pick shutters in the Setting tab + on the image:
- Click on the image → opens an N-shutter slitlet at the
nearest operable shutter. Choose N in the Slitlet dropdown:
N=1→ only the clicked shutterN=2→ click + one row lower (lower y on the detector)N=3→ centred 3-shutter slitlet (the standard for MOS)N=5→ centred 5-shutter slitlet
- Click an open shutter → closes it AND its slitlet siblings.
- Double-click → toggles a cyan highlight (a visual flag, not exported).
- Shift-click → moves the pointing center to that location.
- Wheel → zoom both axes equally.
- Drag → pan.
If a catalog is loaded, vMPT auto-tags the slitlet with the catalog source ID whose footprint falls inside any opened shutter. The status bar shows which source was matched.
- Click on the image → opens an N-shutter slitlet at the
nearest operable shutter. Choose N in the Slitlet dropdown:
-
Save and export in the MPT tab:
- Save session → writes the bundle (see "Bundle output" below) to a single chosen directory. Share the directory with a collaborator to hand off the work.
- Load session → restores any vMPT bundle (point at either
MPT_plan.jsonorvMPT_workspace.json— both work; the sibling is auto-discovered). - Export eMPT bundle → same writer as Save session, but into
a fresh timestamped subfolder of
exports/.
MSA pointing optimizer
Bottom of the Pointing tab. Searches for an (RA, Dec, V3 PA) that maximises the number — or weighted flux — of catalog sources placed in operable, well-centred MSA shutters.
The optimizer is a lightweight, self-contained Python module
(vmpt/optimizer.py) inspired by
hMPT (Zihao Wu,
Daniel Eisenstein, Samuel McCarty; CfA/Harvard), which is itself
inspired by ESA's eMPT (Bonaventura et al. 2023). vMPT is not
a direct port of either — the MSA geometry handling, coordinate
transforms, and constraint machinery were written fresh and the
algorithm is simpler than hMPT's. See vmpt/optimizer.py for the
module-level docstring with attribution + algorithm notes.
Method
Three modes, picked from the Method dropdown:
- Democracy — every source counts the same. Maximises the raw number of sources placed. Works on any catalog, no extra columns required. (This was the previous default behaviour.)
- Meritocracy — sum of
weightof placed sources. A weight-3 source equals 1.5 weight-2 sources; the optimizer freely trades one for the other. Requires a populatedweightcolumn. - Hierarchy — strict priority tiers (eMPT-style). First maximises
the count of highest-priority (smallest
p) sources placed; among pointings that tie on that, maximises the next tier; and so on. A higher-priority source is NEVER traded for any number of lower- priority sources. Requires a populatedprioritycolumn.
The catalog editor's Compute w from p and Compute p from w buttons let you derive one column from the other so you can switch modes without re-annotating.
Inputs
- ΔRA / ΔDec / ΔPA — search box around the current pointing. Setting any of them to 0 freezes that axis (e.g. ΔPA = 0 to search only RA/Dec at the current roll).
- Refine top N — how many of the best grid candidates get a
scipy
differential_evolutionpolish. - Source centering — APT-style buffer (UNCONSTRAINED, ENTIRE_OPEN, MIDPOINT, CONSTRAINED, TIGHTLY_CONSTRAINED).
- Priority cutoff ≤ — restrict the optimizer to catalog rows with
priority ≤ X(e.g. P0/P1 first; do fillers by hand later). - Protect spectra from collision (optional, v1.2.0+) — mark
a subset of catalog sources whose spectra must not overlap any
other source's spectrum on the detector under the current
Disperser / Filter.
- Enable collision protection — toggle the rule on/off.
- Mode — By priority ≤ X or By weight ≥ Y (mutually exclusive).
- Threshold — numeric value matching the chosen mode.
- The live status line shows how many sources are protected at the current threshold and the V2 overlap half-extent for the current Disperser / Filter (e.g. "12 protected · 240 other (G140H / F100LP · V2 overlap ≈ 500″)").
- Effect: at every candidate pointing the optimizer drops (a) any non-protected source whose row collides with a protected one, (b) lower-priority protected sources from protected-vs-protected collisions, and (c) protected sources landing on a row colliding with any stuck-open shutter (their spectrum is unavoidably contaminated). The score is the count of kept sources, so the optimizer naturally steers protected targets into clean rows.
- Slitlet-aware row buffer (v1.2.1+) — for a protected
target with an N-shutter slitlet, no other shutter is allowed
in the row immediately above or below the slitlet (i.e. for
N=3 at row s the exclusion zone is s±2). Stuck-open and
other-source slitlets are both checked with this slitlet-aware
tolerance; v1.2.0 used a naive
|Δs|≤1between centres which was correct only for N=1. - Note that for H gratings the V2 overlap is ~500″ — wider than the MSA — so protecting many targets dramatically reduces the co-observable count. That's the truthful answer, not a bug.
- Advanced settings… — pop-up with: grid resolution (n_RA, n_Dec,
n_PA), DE max iterations, objective (
numbervsflux-weighted), source σ (PSF size), APT DVA θ. The Method dropdown supersedes the Objective for normal use; Objective stays for back-compat.
Running
In the Pointing tab, click Open optimizer… (v1.2.1+ — all the optimizer-config widgets live in a centered dialog now so the Pointing tab itself fits on one screen). Adjust the Method, ΔRA / ΔDec / ΔPA, Refine top N, centration, priority cutoff, collision-protection — and click Run optimization inside the dialog. A pop-up appears with:
-
Live progress — an animated striped bar + a spinning ring + a text line:
Grid: 5,200 / 20,000 pointings evaluated · 4.2s elapsed · ~12s left. For Democracy/Meritocracy, the bar covers 0 % → 85 % grid, 85 % → 100 % DE polish. For Hierarchy, the bar splits into Grid (0 → 75 %), tier-by-tier filtering (75 → 85 %), and DE polish (85 → 100 %); the text shows the current tier (e.g. "Hierarchy filter: tier 2 / 4 (p=1) — survivors: 18"). -
Results table — the top-10 distinct solutions (near-duplicates are de-duplicated). Each row shows rank, score, and the (ΔRA, ΔDec, ΔPA) offset from the search centre, paired with an Apply #N button. The Score column adapts to the method:
- Democracy →
<count>(raw count of placed sources). - Meritocracy →
Σw <weight-sum> (<count>). - Hierarchy →
P0:n · P1:n · P2:n … (<count>)— per-tier counts + total in parens.
Hover any Score cell to see the top 10 placed sources at that pointing, sorted by priority ascending then weight descending (
1. ID=12345 P=0 W=5, …).When collision protection is on, the Score cell appends
−Kwhere K is the number of sources dropped at this pointing to keep protected spectra clean; the hover top-10 prefixes protected sources with 🛡 so you can see which sources are doing the protecting.Clicking Apply #N asks for confirmation (it clears all previously open shutters), then sets RA/Dec/V3 PA to the chosen solution AND opens an N-shutter slitlet (N from the Setting → Slitlet dropdown; default 3) at every observable target's shutter, auto-tagged with the source's catalog ID.
The whole apply is a single Undo step in the Setting → Undo last history, so reverting goes back to your previous picks.
- Democracy →
A typical 20³ = 8 000 pointing grid + 10 DE refinements finishes in ~5–15 seconds for a few hundred sources.
Color legend
What each color means on the figure:
| Color | Meaning |
|---|---|
| Dodgerblue rectangles | The four MSA quadrant outlines |
| Gold polygons | The 5 NIRSpec fixed slits (always visible) |
| Lime cross | Current pointing center (shift-click to move) |
| Silver-edge boxes (α=0.2) | Operable, unaffected, ready-to-pick shutters (toggle "Show operable shutters" in Setting → Layers) |
| Dark-red thick outline | Stuck-open shutter (always visible) |
| Red-filled (#ff8888) | User-opened shutter |
| Cyan edge | Highlighted shutter (double-click marker) |
| Orange fill (α=0.20, stackable) | Spectral-conflict warning — operable shutters whose spectra would overlap on the detector with an open or stuck-open shutter's. Darker orange = multiple opens contribute. ±1 row from each dispersion source; cross-quadrant via NRS1 (Q1↔Q3) and NRS2 (Q2↔Q4) detector pairing. |
| Coloured circles | Catalog targets — yellow by default, cycling through magenta / pale green / coral / lavender / sky-blue / white / salmon when multiple catalogs are loaded (toggle "Show catalog targets" in Setting → Layers; the colour matches the chip beside each catalog in the Input tab's catalog list). Earlier-loaded catalogs draw on top of later ones; deeper layers fade slightly via line_alpha. |
Failed-closed shutters are not drawn at all — they don't exist for the user's purposes.
Loading your own data
Image: FITS
In the Input tab, click the primary Browse… button to pick a
FITS file from disk. If you prefer to paste a path directly, click
Edit path to reveal the text input; the input also auto-reveals
itself whenever a path is populated (so paths set by Browse, by
--fits on the command line, or by typing all stay visible).
First HDU with image data is auto-selected; the WCS comes from that
HDU's header.
The figure has a fixed pixel aspect — the canvas is sized to the image's pixel W:H exactly, so 1 image pixel always renders as N×N screen pixels with N consistent in X and Y. Resizing the browser window doesn't distort the image; it only changes how much black space surrounds it.
Image: JPG + sidecar FITS
For fields where you have a pretty RGB JPG but the WCS lives in a separate FITS header (this is what tools like fitsmap produce), put the WCS-only FITS path in "Sidecar FITS path" and the JPG path in "JPG path". Order matters — set the sidecar first.
The JPG can be tens of millions of pixels; vMPT downsamples to ≤6000 on the longest edge and rescales the WCS accordingly.
Catalog (optional)
CSV, whitespace-ASCII, or FITS table. Required: an RA column and
a Dec column. Optional but used if present: priority/Pr,
mag/mag_F444W/F444W_mag, z/zspec/zphot, label/name.
The Input tab has compact text inputs to filter by priority class
or magnitude.
Column-name matching is loose
vMPT normalises column names before comparing — lowercase, strip
[…] / (…) unit annotations, collapse non-alphanumerics, peel off
trailing unit/epoch tokens like deg, degrees, rad, arcsec,
J2000. So all of these spellings are recognized for RA:
RA, ra, RA[deg], RA (deg), ra_deg, RAJ2000,
Right Ascension, ALPHA_J2000
…and the equivalents for Dec (DEC, Dec, DEC[deg], DEJ2000,
Declination, DELTA_J2000, …). ID columns accept ID/id,
source_id, no/No_cat, objid/objectid, srcid, plus the
permissive fallbacks name/label/tag/# — but those last four
are only accepted when their values are numeric. If no usable ID
column is found, vMPT synthesises sequential IDs 1..N so the
catalog still loads.
IDs ≥ 10⁷ are mod-clamped
APT MPT and eMPT both expect compact integer source numbers. JADES-
style 8–9-digit IDs are taken mod 10_000_000 on load (e.g.
12345678 → 2345678). Collisions after the mod are vanishingly rare
in real catalogs.
Multi-catalog
Click Add in the Input tab to layer multiple catalogs at once. Each loaded catalog gets a coloured chip in the catalog list — its markers on the canvas use the same colour, so it's clear which catalog a target came from. Per-row checkbox toggles visibility; × removes the catalog; ▲ / ▼ reorder the visual stack. Catalogs persist across sessions (workspace JSON records each path, enabled flag, and order).
Edit catalog
Edit catalog… in the Input tab opens a sortable spreadsheet modal. You can:
- Single-click any cell to edit it in place. Tab/Enter commits; Esc cancels. Empty cells are allowed (NaN). Drag inside a cell to highlight text; Cmd/Ctrl-C copies the selected substring.
- Sort by clicking a column header.
- Toggle which columns are visible via the Show columns picker — standard columns (ID, RA, Dec, Priority, Weight, Mag, z, Label) plus any extras the loader preserved from the file.
- Add a custom column (e.g.
referenceto mark reference stars). - Compute w from p / Compute p from w — derive one column
from the other. Weight increases with priority (smaller p →
larger w) so that any higher tier strictly outweighs the sum of
all lower tiers (
w(p) > w(p+1)ANDN(p)·w(p) > N(p+1)·w(p+1)). - Delete a row by clicking 🗑️ at the end.
- ↶ Undo / ↷ Redo every edit (cell change, row delete, column derivation, custom column add).
- Save as CSV writes a standalone copy (header preserves all visible + invisible columns). Apply changes & close commits edits back to the in-memory catalog so the eMPT bundle export picks them up.
Auto-tagging
When you open a shutter that contains a catalog source, the slitlet
is auto-tagged with that source's ID. Matching follows APT's
Unconstrained
Source Centering rule — a source matches the shutter whose full
pitch cell (≈0.27″×0.53″) contains its centre, so sources sitting
behind the MSA bars still get matched (to whichever neighbouring
shutter is nearest). The status bar names the matched source.
Matched markers flip to green so picked vs. unpicked is obvious
at a glance. Slitlets with no real source get a synthesized entry at
the slitlet's centre at export time, tagged in the catalog's
Label column as vMPT_synth.
A small example catalog lives at tests/fixtures/tiny_catalog.csv.
Loading an APT plan
The MPT tab also reads plans straight from APT exports:
- Load plan from JSON — paste the path to an APT MPT JSON
(each
configs[]entry becomes a selectable plan; pointing, V3 PA, disperser, and slitlets are applied on click). - Load shutter CSV — the open-mask CSV that APT/MPT/eMPT write.
- Fetch / open .aptx — point at a local
.aptxarchive or enter a JWST program ID; vMPT downloads the latest archive from STScI's public proposal-info endpoint, lists the embedded MPT plans, and lets you load any one. (Some programs may not be publicly available yet — the fetch will report 404.)
If you load a plan first and then an image, vMPT keeps the plan's pointing (instead of recentering on the image).
Bundle output
When you click Save session or Export eMPT bundle, vMPT writes a directory with six files. The prefixes telegraph the role:
| File | Role | Format |
|---|---|---|
MPT_plan.json |
APT MPT plan — load via APT MOS → MSA Planner | APT MPT JSON, matches the reference schema field-for-field |
<catalog>.cat |
APT-importable Target List — name matches the user's catalog (or MPT_catalog.cat if none was loaded) |
ASCII, tab-separated, #-header with the JDox-recognized labels (ID, RA, DEC, Weight, Primary, Label). The Label column carries real or vMPT_synth so you can tell which rows came from your input catalog. |
vMPT_workspace.json |
vMPT-only state — per-shutter target_id+role, highlighted set, image / sidecar / catalog paths, slitlet height, exact V3 PA |
vMPT-internal JSON |
eMPT_observed_targets.cat |
eMPT-style target list | eMPT format |
eMPT_pointing_summary.txt |
eMPT-style pointing summary | eMPT format |
eMPT_shutter_mask.csv |
730×342 MSA mask, byte-compatible with eMPT's writer (shutter_routines_new.f90) |
eMPT format |
Loading the bundle into APT
- Import the target list: APT → Targets → Target Lists → Import…
→ select the
<catalog>.catfile. APT names the list after the file stem; that stem matchescatalog.nameinsideMPT_plan.json. - Load the plan: APT → MOS template → MSA Planner → Load Plan
→ select
MPT_plan.json. APT pairs the plan with the Target List imported in step 1.
Loading the bundle back into vMPT
Point Session load path at either MPT_plan.json or
vMPT_workspace.json. vMPT auto-discovers the sibling and restores:
pointing, V3 PA, disperser/filter, slitlet height, every open
shutter with its target_id+role, the highlighted set, and (if the
image still exists on disk) the image + WCS sidecar.
Collaborating on a target list
You Collaborator
─── ────────────
1. Open vMPT, load image + catalog
2. Pick shutters
3. Save session ──── bundle dir ───────> Load session
(vMPT loads the same image +
catalog + picks)
Add / remove / adjust picks
Save session
8. Load session <──── bundle dir ────────
9. Continue picking
...
When done:
Export eMPT bundle → 6 files, ready for APT + eMPT
The workspace JSON contains paths to the image and catalog. For
those to resolve on the collaborator's machine, use a shared mount
(Dropbox / Drive / network share / git lfs-tracked data folder),
or edit image_path / catalog_path / wcs_sidecar_path in
vMPT_workspace.json before each handoff. The MPT plan JSON itself
carries no file paths — it's safe to share standalone.
Troubleshooting
bokeh: command not found
You're not in the right Python environment. Activate the env where
you ran pip install:
conda activate stenv # or vmpt, depending on which option you used
Port 5006 already in use Another Bokeh process is running. Find and kill it:
pkill -f "bokeh serve"
Or pass --port 5007 to bokeh serve.
Image upload fails or stops with "No 2D image HDU found"
The Bokeh WebSocket has a default 20 MB cap; large uploads get
truncated. ./run.sh raises the cap to 500 MB, but the right move
is to use the path input ("FITS path (local)") instead of the
"Browse…" file picker — the file is read directly from disk, no
WebSocket size limit applies.
APT can't find the catalog when loading my plan
Import the matching <catalog>.cat file in APT first (Targets →
Target Lists → Import). The file stem and MPT_plan.json's
catalog.name are aligned by the writer, but you still need to
load the target list once on the APT side.
jwst_gtvt query takes forever the first time
First call downloads JWST's ephemeris file (~30 MB). Subsequent calls
in the same session are fast.
session.json from an old vMPT version doesn't load
Pre-1.1 sessions (flat top-level open_shutters) still load on the
legacy path. Pre-1.4 sessions used filenames session_MPT_plan.json
vmpt_workspace.json; those are recognised as fallback names and still work.
Tool architecture
app/
├── main.py Bokeh server entry; UI wiring; on_tap / on_export
├── coords.py V2/V3 ↔ RA/Dec transforms (pysiaf-backed)
├── msa.py MSA shutter grid + CRDS operability loader
├── wavelengths.py Analytic per-grating dispersion + cutoffs
├── image_io.py FITS + JPG-with-sidecar loaders
├── catalog.py CSV/ASCII/FITS catalog reader
├── empt_io.py eMPT-format + MPT-catalog writers
├── session_io.py Bundle save/load (MPT plan + workspace sidecar)
├── mpt_io.py APT MPT JSON parser + .aptx archive reader
├── static/ favicon.svg
└── templates/ index.html (injects the favicon as a data URI)
data/
└── nirspec_msa_v2v3.npz Per-shutter V2/V3 coordinates (4×171×365)
tests/ pytest suite (60+ tests, ~7 s)
example_a370/ Abell 370 cluster FITS (44 MB)
example_r0600/ RXCJ0600 JPG + sidecar (240 MB)
exports/ default output dir for bundles
Performance
refresh_overlays runs in ~10 ms for the light path (MSA outline +
pointing handle only, during slider drags) and ~70 ms for the full
path with operable + spec-overlap layers on. The hot path is pure
numpy: precomputed V2/V3 offsets for all 249,660 shutters, a single
WCS inverse-Jacobian per refresh, and two matmuls (rotation by PA,
then sky→pixel).
The operable-shutter layer is filtered to unaffected, ready-to-pick
shutters only (excludes user-opens, stuck-opens, spec-overlap rows),
keeping the rendered polygon count well below the MAX_OPERABLE_RENDER
cap (10,000) at the typical "looking at one quadrant" zoom level.
Known limitations
- V2 dispersion calibration: per-disperser spectrum extents are
approximated; PRISM is calibrated against eMPT's
prism_sep.dat(35″ V2 half-extent), M/H gratings are approximations (200″ and 500″ respectively). For research-quality numbers, replace with JDox-sourced or CRDS-derived constants. plannerSpecificationin MPT plan JSON: written with sensible defaults (matching the reference G395H_F290LP plan schema field for field) but the dither / search-grid parameters don't reflect any vMPT internal state — APT uses them as starting values for re-planning if you choose to.- Bokeh single-session state: opening the same server in two browser tabs lets picks bleed across them. Use one tab per user.
- JPG/sidecar dimension mismatch: a
>10 %mismatch warns but doesn't refuse. Verify your sidecar.
References
- eMPT (export format inspiration): Bonaventura et al. 2023, A&A 672 A40 — arXiv:2302.10957 / GitHub
- JWST PA conventions: JDox PA reference
- NIRSpec MOS / MPT: JDox MPT page
- MPT catalog format: JDox MPT Catalogs
- MSA operability: STScI CRDS
jwst_nirspec_msaoper_*.json(auto-loaded ifCRDS_PATHis set) - jwst_gtvt (visibility): GitHub
Example data — attribution
The two example fields shipped under example_a370/ and
example_r0600/ are JWST/NIRCam images of well-studied lensing
clusters. The image files were prepared for use as vMPT examples
(RGB stretches; the R0600 JPG was re-encoded at JPEG quality 85 to
keep the repo small — dimensions and WCS are unchanged from the
science-grade version). The accompanying target catalogs and APT
MPT plans are research products from real JWST programs.
If you use the example data for anything beyond trying vMPT itself, please cite the originating program / data release directly — vMPT just ships them as a starting point.
License
MIT. See LICENSE.
Citation
If vMPT helps you plan an observation that ends up in a paper, a
mention is appreciated. The export-bundle format is calibrated
against eMPT; please cite Bonaventura et al. 2023 if you use the
eMPT_* files.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jwst_vmpt-1.3.0.tar.gz.
File metadata
- Download URL: jwst_vmpt-1.3.0.tar.gz
- Upload date:
- Size: 20.8 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7a9ec9cffe3e5bcdd5c12daef0d063668327725714f7323f432bb2659c040f67
|
|
| MD5 |
d2dcc72b9d2532133de8cf3bd517dc8d
|
|
| BLAKE2b-256 |
8026779f9c7c09bbfd809de26f597f1eefb5789d39f8b1c5677eb73d8e70572a
|
File details
Details for the file jwst_vmpt-1.3.0-py3-none-any.whl.
File metadata
- Download URL: jwst_vmpt-1.3.0-py3-none-any.whl
- Upload date:
- Size: 20.7 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e898d835e7225d8f337d4728c27bec9ab24c2bacedc8a3ba08783d30fa72b219
|
|
| MD5 |
59aead4c846fb8054f66921976f688cd
|
|
| BLAKE2b-256 |
c53fe1cf1f536836dc7db0a85db9b1da9d4fd99d4087458571e6edc332601b22
|