Software for the CASSA Observatory — an 8-inch SkyWatcher on an EQ6R-Pro, with an iTelescope-compatible imaging workflow, a DIMM seeing monitor, and a CMOS sensor-characterization bench. This repository collects three independent, installable Python packages plus a shared master documentation set.
| Package | Folder | Commands | What it does |
|---|---|---|---|
| cassa-photometry | photometric_pipeline/ |
cassa-calibrate, cassa-integrate, cassa-photometry, cassa-diagnose, cassa-verify, cassa-run |
End-to-end imaging reduction (Phases 1–4): calibration → stacking + WCS → photometry/zero point → diagnostics, with a full SCI/ERR/DQ error budget and a configurable step plan (exclude, reorder or extend any phase's steps). |
| cassa-dimm | DIMM/ |
cassa-dimm-monitor, cassa-dimm-batch, cassa-dimm-sim |
Continuous atmospheric-seeing monitor: watches a folder of frames, measures the differential motion of prism-mask star doublets, and reports airmass-corrected seeing as a live time series. |
| cassa-camchar | camera_characterization/ |
cassa-camchar-analyze, cassa-camchar-sim |
CMOS sensor characterization via the Photon Transfer Curve: gain, read noise, full well, dynamic range, dark current, QE, and filter transmission. |
Each package has its own README with detailed usage; the docs/ folder
holds the observatory master documentation.
cassa_observatory/
├── photometric_pipeline/ # cassa-photometry — imaging reduction (Phases 1–4)
├── DIMM/ # cassa-dimm — atmospheric seeing monitor
├── camera_characterization/ # cassa-camchar — CMOS sensor characterization
└── docs/ # master documentation (LaTeX source + compiled PDF)
Linux, macOS and Windows. One script per platform; it picks an environment,
installs every dependency including a working plate solver, installs the
package, registers the Jupyter kernel, and then runs cassa-doctor to prove it
worked. Running it again updates in place.
| Platform | Route | Solver you get |
|---|---|---|
| Linux x86-64 | ./install.sh |
ASTAP, else solve-field, else in-process |
| Linux aarch64 (Raspberry Pi, ARM servers) | ./install.sh --conda |
ASTAP only — nothing else is published for ARM Linux |
| macOS Intel | ./install.sh |
ASTAP, else solve-field, else in-process |
| macOS Apple Silicon | ./install.sh |
ASTAP, else in-process (solve-field has no osx-arm64 build) |
| Windows x64 / ARM64 | .\install.ps1 |
ASTAP only — it is the one backend published for Windows |
| Windows, alternatively | WSL, then the Linux route | as Linux x86-64 |
Linux and macOS
git clone https://github.com/cassaiub/observatory.git
cd observatory/photometric_pipeline
./install.sh
conda activate cassa-photometry
cassa-doctorWindows
git clone https://github.com/cassaiub/observatory.git
cd observatory\photometric_pipeline
.\install.ps1
cassa-doctorinstall.ps1 does the same things as install.sh, with the same options in
PowerShell form (-Conda, -Venv, -NewEnv, -EnvName, -NoDev,
-NoDoctor). WSL still works if you prefer it — it is real x86-64 Linux, so
every instruction applies unchanged inside it, and .\install.ps1 -Wsl prints
the setup steps without installing anything.
Install Miniforge first if you have no conda. Part II of the documentation has the step-by-step procedure for each platform, the macOS Gatekeeper note, and the HPC network-drive workaround.
Conda is not required. ./install.sh --venv (or .\install.ps1 -Venv)
builds a plain virtual environment and the whole pipeline works from pip alone,
plate solver included — ASTAP is a binary the installer fetches directly, not a
Python package. Verified end to end on a conda-free Python 3.14: 28 doctor
checks green, 503 tests passing, and a full three-filter reduction with
ASTAP-solved WCS and zero points. Two caveats — JupyterLab and ipykernel are
not installed on that route (pip install -e ".[notebook]" adds them), and pip
may need a C compiler where your Python version has no wheel. Both are written
up in
the pipeline README
and Part II.
The other two packages install into the same environment:
pip install -e DIMM
pip install -e camera_characterizationThree backends can supply it — ASTAP, Astrometry.net's solve-field, and an
in-process PyPI solver — and the installer picks the one your platform can run,
trying them in that order. ASTAP leads because it is the only one published for
every platform here: conda-forge builds astrometry for linux-64/osx-64
only, and PyPI's astrometry ships no aarch64 and no Windows wheel, so without
ASTAP an ARM Linux box and any Windows machine have no solver at all.
Whichever lands, the sky data is fetched per field — about 6 MB for ASTAP,
~246 MB for Astrometry.net — and cached under ~/.cache/cassa-photometry/. An
existing local set is used in preference (CASSA_ASTROMETRY_INDEX,
CASSA_ASTAP_DB) and nothing is downloaded.
The products do not depend on which backend solved. The astrometric residual
ASTRMS is measured by the pipeline rather than taken from the solver, and the
header records which route was used as ASTRMSRC.
Phase 2 holds a whole stack plus its variance planes in memory at once. By default it asks on a terminal and takes half the cores when there is nobody to ask. Three settings override that, on the command line or in a config file — and setting any of them also switches off the prompt:
cassa-integrate work/phase1 --cpu-fraction 0.5 # half this machine's cores
cassa-integrate work/phase1 --cores 4 # a hard ceiling
cassa-integrate work/phase1 --max-memory-gb 8 # warn before it does not fitBoth installers register a kernel called Python (CASSA photometry).
Check that name appears in the top-right of every notebook; if not, Kernel →
Change Kernel. Installing packages sets up an environment, it does not make an
existing Jupyter offer it — and the resulting ModuleNotFoundError: No module named 'cassa_photometry' looks exactly like a failed install.
cassa-doctorOne line per check — platform, versions, which solver backends are usable and which one a run would pick, both sky-data caches, network reachability, write permissions — with the fix for anything that failed. Paste its output when asking for help.
Large data (raw frames, calibration campaigns, sky databases) is git-ignored; only source, configs, and documentation are tracked.
The full CASSA Observatory Master Documentation lives in docs/
(main.tex, compiled to main.pdf) and is organised as:
- Part I — Astronomical CMOS Sensor Characterization SOP (capture procedures)
- Part II — Pipeline Installation & Deployment, for Linux, macOS and Windows
- Part III — Image Processing Pipeline Architecture (Phases 1–4)
- Part IV — Atmospheric Seeing Monitor (
cassa-dimm) - Part V — Sensor Characterization Pipeline (
cassa-camchar) - Part VI — Complete Reference: every command and flag, every configuration key with its default, every environment variable, every FITS keyword and catalog column, and the module-by-module Python API
The PDF is tracked; the .tex source is not, so rebuilding it needs the
maintainer's working tree.
The compiled manual is what the repository ships. The markdown reference set
(REFERENCE.md, CUSTOMIZING.md, CHANGELOG.md, WINDOWS-TESTING.md), the
test suite and the LaTeX sources live in the working tree but are deliberately
not tracked — Part VI covers the same reference material, and Part II the same
installation ground.
| Document | What it covers |
|---|---|
photometric_pipeline/README.md |
What the pipeline is, how to run it, and how to install it without conda. |
docs/main.pdf |
The full treatment, Parts I–VI. |
photometric_pipeline/workshop/ |
A lecture, a participant handbook, five notebooks, and the raw dataset they reduce. |
MIT — see photometric_pipeline/LICENSE; each
package declares the MIT license in its pyproject.toml.