Skip to main content

Learned mass-conserving deprojection of galaxy images -> 3D stellar density, rotation curve, potential.

Project description

Disk Galaxy Deprojection

This repository builds a baseline-plus-residual probabilistic benchmark for deprojecting barred-galaxy stellar mass structure from S4G-like images.

For project background, current Milestone 2b status, and continuation guidance, start with docs/reports/2026-06-10-project-handoff.md.

Deprojecting a galaxy image — the dgdp package

dgdp turns a galaxy image into its deprojected 3-D stellar-mass distribution, rotation curve, and (optionally) gravitational potential, using a bundled pretrained model — no training data or GPU required.

Install

pip install git+https://github.com/lucyundead/disk-galaxy-deprojection

Core install is light (numpy, astropy, matplotlib) and ships the ~1 MB model. Retraining the model additionally needs the TNG table and the [train] extra (pip install '.[train]').

Quickstart

Python:

from dgdp import deproject
r = deproject("galaxy.fits", distance_mpc=15.2, inclination_deg=30, pa_onsky_deg=153,
              ml=1.0, stellar_mass=6e10)
r.density_3d              # (nR, nphi, nz) cylindrical stellar-mass cube [Msun]
r.v_circ([1, 2, 5, 10])   # rotation curve at those radii [km/s]
r.rms_z([1, 5, 10])       # vertical thickness RMS|z|(R) [kpc]
r.edge_on, r.face_on      # 2-D renderings
r.save("out/")            # density.npz + rotation_curve.csv + deprojection.png

CLI:

dgdp-deproject galaxy.fits --distance-mpc 15.2 --inclination-deg 30 --pa-onsky-deg 153 \
    --ml 1.0 --stellar-mass 6e10 -o out/

Geometry & M/L

  • Geometry: give pix_arcsec + pa_pix_deg (+ center) to bypass WCS (e.g. an S4G cutout), or let a FITS WCS supply the pixel scale and convert an on-sky pa_onsky_deg.
  • The deprojected shape is M/L-independent; M/L only sets the v_c amplitude. Fix the absolute scale with either (a) stellar_mass (total M*, M/L already folded in), (b) luminosity × ml, or (c) zeropoint + band_solar_mag + distance to calibrate the image to a luminosity. With none of these the outputs use a relative scale.

Potential (optional)

r.potential(R, z) and dgdp-deproject --potential return the AGAMA CylSpline potential Φ(R,z). AGAMA is not pip-installable — build it from source (https://github.com/GalacticDynamics-Oxford/Agama) and put it on PYTHONPATH; everything else works without it.

Method

The in-plane surface density is anchored geometrically from the image; a learned fixed-dictionary sech² vertical profile q_m(z;R) — trained on 185 TNG50 barred galaxies × 198 projections — supplies the thickness, mass-conserving by construction. See docs/reports/2026-06-30-mixture-qm-fixed-dictionary.md.

Milestone 1 predicts posterior residuals for physical summaries:

  • radial stellar mass profile
  • radial surface-density profile
  • vertical scale-height summary
  • bar thickness summary
  • bar amplitude summary
  • central concentration summary

Start with:

python -m pytest -q
python scripts/build_synthetic_benchmark.py --config configs/milestone1.synthetic.toml
python scripts/train_summary_residual_mdn.py --data outputs/milestone1_synthetic/residual_table.npz
python scripts/evaluate_summary_residual.py --run-dir outputs/milestone1_synthetic

Synthetic Milestone 1 Benchmark

Run the synthetic benchmark:

python scripts/build_synthetic_benchmark.py --config configs/milestone1.synthetic.toml
python scripts/train_summary_residual_mdn.py --data outputs/milestone1_synthetic/residual_table.npz --output-dir outputs/milestone1_synthetic
python scripts/evaluate_summary_residual.py --run-dir outputs/milestone1_synthetic

The benchmark writes:

  • outputs/milestone1_synthetic/manifest.csv
  • outputs/milestone1_synthetic/residual_table.npz
  • outputs/milestone1_synthetic/summary_residual_mdn.pt
  • outputs/milestone1_synthetic/normalization.npz
  • outputs/milestone1_synthetic/metrics.json

Milestone 2 Cluster TNG50 Ingestion

Milestone 2 runs TNG-facing work on the remote cluster through the existing HPC wrapper at /home/lucyundead/codex/hpc-agent/hpc.

python scripts/cluster_dgdp.py sync
python scripts/cluster_dgdp.py check-env
python scripts/cluster_dgdp.py reproduce-milestone1
python scripts/cluster_dgdp.py run-tng50
python scripts/cluster_dgdp.py run-tng50-density
python scripts/cluster_dgdp.py fetch-tng50

The cluster workflow keeps full TNG50 snapshots remote and fetches only compact artifacts under outputs/tng50_milestone2/. If local rsync is unavailable, the project CLI falls back to archive transfer through the HPC wrapper and does not delete remote files.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

disk_galaxy_deprojection-0.2.1.tar.gz (475.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

disk_galaxy_deprojection-0.2.1-py3-none-any.whl (446.3 kB view details)

Uploaded Python 3

File details

Details for the file disk_galaxy_deprojection-0.2.1.tar.gz.

File metadata

  • Download URL: disk_galaxy_deprojection-0.2.1.tar.gz
  • Upload date:
  • Size: 475.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for disk_galaxy_deprojection-0.2.1.tar.gz
Algorithm Hash digest
SHA256 2bf07241bcb2c730523b5ffca84e228a7d229b46c3f1318b798759db4e9e62b5
MD5 cfae156e8c9fc00f1cf257666bfd4c93
BLAKE2b-256 50f88602f1c470d331dbce4540d0b1391b8526d88e08aef83f5481e2472fbd66

See more details on using hashes here.

Provenance

The following attestation bundles were made for disk_galaxy_deprojection-0.2.1.tar.gz:

Publisher: release.yml on lucyundead/disk-galaxy-deprojection

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file disk_galaxy_deprojection-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for disk_galaxy_deprojection-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 40343cd089c50acd19f819cd1bc6f182cae96eba78c031d733bd0bf15a210304
MD5 1657b4d2c5c90ace04b5b24130165ebd
BLAKE2b-256 06e921ceaf30343acc96b5303fade3af51a5968f43a4a4ad773840dee92da015

See more details on using hashes here.

Provenance

The following attestation bundles were made for disk_galaxy_deprojection-0.2.1-py3-none-any.whl:

Publisher: release.yml on lucyundead/disk-galaxy-deprojection

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page