Skip to main content

dispcraft

Physics-first, then hybrid physics+ML modeling of the Euclid/NISP grism spectral dispersion — from a geometrical-optics instrument model, through per-dataset and joint multi-dataset calibration against ground-test data, to an ML residual corrector and a field-dependent extension, benchmarked against a published reference result (arXiv:2506.08378).

Project status: exploratory research prototype, ongoing — not production-ready. This is a proof-of-concept pipeline, not a finished deliverable. The best model produced so far (hybrid physical + ML residual) is 1.7x worse on y and 8.4x worse on z than the reference paper's own held-out accuracy (see Results below and docs/Status_Report.md §1) — it does not currently reach the accuracy this instrument needs. Development is ongoing; open gaps and next steps are tracked in docs/Status_Report.md §9-10.

If you just want to use the calibrated models (predict where a spectrum lands, given field position and wavelength), see the User Guide — but read the status note above first: these are the best models this exploratory project has produced to date, not models validated as meeting an accuracy requirement. This README covers the project itself.

What's here

  • dispcraft/ — the library: instrument optics (optics/), the ground-test forward model and joint-fit machinery (calibration.py), the field-dependent correction tier (field_calibration.py), the 0th-order dispersion model (zeroth_dispersion.py), the Chebyshev polynomial residual alternative (chebyshev_residual.py), data loading (measurement.py), the residual-MLP building block (ml.py), GitLab model-registry helpers (model_registry.py), and the unified 1st-/0th-order prediction entry point (prediction.py).
  • scripts/ — register_models.py trains and publishes the recommended residual/NN models to GitLab's model registry (see the User Guide); freeze_stage5_fits.py, freeze_chebyshev_fits.py, and freeze_best_models.py replay already-validated fits to produce the corresponding models/*.toml files.
  • models/*.toml — frozen, versioned calibration results (one file per fit). Every tunable physical parameter used in a real result is recorded here, not hardcoded in code or notebooks.
  • notebooks/ — one notebook per project stage/phase, prototyping and producing every result before (validated bits) get promoted to dispcraft/.
  • data/ — ground-test PSF datasets (docs/internship/2-Intro_data/index.html is the authoritative description of what's in here and how it was built; see also data/README.md).
  • docs/ — User_Guide.md (how to use the calibrated models), Status_Report.md (full write-up of methodology and results), reference material (Euclid-NISP-Specs.md, the benchmark paper summary), internship/ (the slide decks, see below), and the source for the published documentation site (mkdocs.yml at the repo root).
  • docs/internship/0-Intro_generale/ … 4-Projet/ — the slide decks that define this project's scope and order (see Roadmap below).
  • webapp/ — a self-contained, static JS visualization of the physical grism model (no build step, no data dependency) — an interactive, outreach-friendly complement to the notebooks.
  • tests/ — one test module per dispcraft/ module.

Roadmap

This project follows a fixed sequence of stages, each driven by a slide deck, plus three further stages added by explicit request once the deck's own scope closed. Status and detailed findings for every stage are tracked in CLAUDE.md; the short version:

Stage Topic Status
0 General introduction done
1 Subject/problem, instrument model done
2 Data introduction done
3 ML introduction, per-dataset physical calibration done
4 Project integration: ML residual, joint fitting, literature comparison done (deck's own scope, one phase skipped by decision)
5 Extension: field-dependent parameters, 0th-order dispersion, BGS model done
6 Status report done — see docs/Status_Report.md
7 Model distribution: GitLab model registry, unified prediction entry point done
8 Chebyshev polynomial residual model (interpretable alternative to the MLP) done

Getting started

This project uses pixi for environment management — don't use a bare venv/pip install.

pixi install        # create/sync the environment from pixi.toml/pixi.lock
pixi run test        # run the test suite (pytest tests)
pixi run mlflow-ui    # browse logged experiment runs (sqlite:///mlflow.db)

To work in a notebook or script interactively:

pixi shell
jupyter lab notebooks/

Data files (data/*.csv) are already provided; data/README.md documents how they were extracted from the ground-test database, if you need to regenerate them.

Results at a glance

Final held-out accuracy (mean over the 6 RGS ground-test configs), compared to the reference paper's own held-out (Argon) figure — full detail in docs/Status_Report.md:

Model RMSE y (mm) RMSE z (mm)
Physical model only (joint 3-tier fit) 0.194 0.300
Hybrid: physical + ML residual (recommended default) 0.019 0.075
Reference paper, held-out 0.009 0.009

This does not yet reach the reference's accuracy (1.7x worse on y, 8.4x worse on z) — closing that gap is ongoing work, not a solved problem. See docs/Status_Report.md §9-10 for the open items.

See the User Guide for how to reproduce and use this (and the BGS / 0th-order counterparts) yourself — as a snapshot of current, unfinished work, not a validated production model.

License

GNU General Public License v3.0 — see LICENSE.

Metadata

Release files for dispcraft 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dispcraft 0.1.0
File Size Uploaded Provenance Actions
dispcraft-0.1.0.tar.gz 41.8 kB Without provenance Details for dispcraft-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for dispcraft 0.1.0
File Interpreter ABI Platform Actions
dispcraft-0.1.0-py3-none-any.whl Python 3 none any Details for dispcraft-0.1.0-py3-none-any.whl

Total release size: 90.3 kB

Release files / dispcraft-0.1.0.tar.gz

Download URL dispcraft-0.1.0.tar.gz
Size 41.8 kB
Tags Source
SHA-256 checksum
How to use checksums
213189aa4a3455d803d9be92eaab940f70c609d761f6c8a0b8d65ed2f7b9f3d8
BLAKE2b-256 checksum
How to use checksums
212b77054161c0c569e737816e3723b76a5179d7060385772c42fbb430c2ede0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Release files / dispcraft-0.1.0-py3-none-any.whl

Download URL dispcraft-0.1.0-py3-none-any.whl
Size 48.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5621d792e19456508a9b36baf2650123d8e2e04ddfa144c04ea4e2a6a0f2ce52
BLAKE2b-256 checksum
How to use checksums
17c63fb92ea102ab57f6a2d5f3e9185bb30f20816bfb2c3a7341fb498c9280f9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.14

Security for dispcraft 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page