Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
8874b21
config(workflow): park the coverage-mask constants before their only …
cailmdaley Sep 5, 2026
9dca1bd
build: guard the container's script-symlink globs against an empty match
cailmdaley Sep 5, 2026
0d385d0
refactor(merge_headers): drop the pre-workflow single-run-root branch
cailmdaley Sep 5, 2026
2b60d23
refactor(psfex_interp): drop the run-log-resolved multi-epoch branch
cailmdaley Sep 5, 2026
ff3f223
refactor(vignetmaker): drop the run-log-resolved multi-epoch branch
cailmdaley Sep 5, 2026
23003e3
docs(exp_utils): name the workflow, not the bash generation it came from
cailmdaley Sep 5, 2026
7584693
config: drop the last version labels and a dead line from the live co…
cailmdaley Sep 5, 2026
7a9fd96
feat(workflow): record each exposure's per-CCD sky footprint in the DAG
cailmdaley Sep 5, 2026
f957f11
test(workflow): pin the CCD-index contract exp_footprint rests on
cailmdaley Sep 5, 2026
2b7992c
feat(workflow): build the campaign coverage mask as a workflow product
cailmdaley Sep 5, 2026
86a177d
style: wrap the new coverage docstrings to the 79-col line length
cailmdaley Sep 5, 2026
6f442fc
config: stop describing the ME_*_EXP_ keys by the keys they replaced
cailmdaley Sep 5, 2026
e5639ea
fix(coverage): a root of records that name no CCD is not an empty survey
cailmdaley Sep 5, 2026
fe4e50f
refactor(coverage): retire the version-keyed CCD/PSF and header chain
cailmdaley Sep 5, 2026
2862db2
refactor(coverage): keep the geometry, drop the file-scraping CLI aro…
cailmdaley Sep 5, 2026
4321c1e
refactor: delete the summary scrape
cailmdaley Sep 5, 2026
f4d0bbd
style: wrap the stripped coverage module to the 79-col line length
cailmdaley Sep 5, 2026
28b6488
refactor: retire the canfar-VM generation of run scripts
cailmdaley Sep 5, 2026
173ad82
docs: retire the canfar-VM retrieval and post-processing pages
cailmdaley Sep 5, 2026
d310dc4
refactor: retire the CANFAR headless run layer
cailmdaley Sep 5, 2026
23b1852
refactor(functions.sh): keep the one helper Gen 2 still sources
cailmdaley Sep 5, 2026
c0d8b0e
docs: retire the CANFAR production walkthrough
cailmdaley Sep 5, 2026
f9ca6b3
docs: say what the canfar dependency is still for
cailmdaley Sep 5, 2026
911379f
refactor(collate_star_cat): keep the psfex, patch-less path and nothi…
cailmdaley Sep 5, 2026
179c0ae
docs: give the Snakemake workflow a page in the docs
cailmdaley Sep 5, 2026
c623f01
docs: rebuild the tutorial on the rule chain
cailmdaley Sep 5, 2026
13a98cf
docs(workflow): correct the README's drift and name the decision
cailmdaley Sep 5, 2026
05ab9d3
docs: point the top-level docs at the workflow, and say what is in sc…
cailmdaley Sep 5, 2026
1820d9f
docs: repoint the tutorial's three dead in-page anchors
cailmdaley Sep 5, 2026
6be95ca
docs: let MyST generate heading anchors
cailmdaley Sep 5, 2026
db3a17c
docs: say plainly that the Gen-2 bash layer is still here
cailmdaley Sep 5, 2026
039c38f
build: regenerate uv.lock from pyproject instead of editing it by hand
cailmdaley Sep 5, 2026
8ac4caa
fix(exp_footprint): the valid-PSF set is an invariant, not a config p…
cailmdaley Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 19 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,19 +80,36 @@ Full detail: `docs/source/installation.md` and `docs/source/container.md`.

- `src/shapepipe/` — the package (src-layout). `modules/` holds the pipeline
modules and their `*_runner.py` wrappers; `pipeline/` is execution and file
I/O; `utilities/`; `canfar/` is CANFAR/cluster job orchestration. Console entry
points (`shapepipe_run`, `summary_run`, `canfar_*`) are defined under
I/O; `utilities/`; `canfar/` monitors CANFAR sessions. Console entry
points (`shapepipe_run`, `canfar_*`, `plot_coverage_map`) are defined under
`[project.scripts]`.
- `tests/` — the whole test suite, one discovery root: `module/` (per-module
unit/property/integration tests), `unit/` (structural), `science/` (fast
guardrails), `cluster/` (candide-only), `helpers/` (shared library code).
See `tests/README.md`.
- `workflow/` — **the production orchestration**: a Snakemake workflow over the
same `shapepipe_run` calls. `bin/sp` is the entry point (`run`, `report`,
`container`, `cancel`); `Snakefile` plus `rules/{prepare,exposure,tile,
coverage}.smk` are the rule graph; `scripts/` holds the plain Python each rule
shells out to; `config.yaml` declares one run (tile list, the scratch and
persistent roots, the container); `config/cfis/` holds the committed ini
chain; `profiles/nibi/config.yaml` is the SLURM executor profile. Deep
reference: `workflow/README.md`. User-facing: `docs/source/workflow.md`.
- `example/` — a runnable example pipeline (`example/config.ini`) on a single
CFIS tile; doubles as the CI smoke test.
- `scripts/` — shell / Python / notebook helpers (`sh/`, `python/`, `jupyter/`),
symlinked onto `$PATH` inside the image.
- `docs/` — Sphinx sources; the API docs are generated from docstrings.

**There is no concept of a catalogue version in the code.** Nothing branches on
`v1.3`..`v1.6` or `v2.0`, and there are no sky patches (`P1`..`P9`): a campaign
is a tile list, and the version of a catalogue is the git tag of the code that
produced it. The CANFAR layers and the summary scrape that carried those
constructs were retired, last carried at `2ef07e45`. The pre-Snakemake bash job
layer (`scripts/sh/run_job_sp_canfar_v2.0.bash`, `job_sp_canfar_v2.0.bash`,
`job_list_help.bash`, `functions.sh`) stays — it is version-free, and
sp_validation's image-simulation workflow calls it.

## Development workflow

- **`develop` is the integration branch** — open PRs against it. `main` /
Expand Down
2 changes: 2 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@
--disable-dlopen --disable-sphinx && \
make -j"$(nproc)" && make install && \
cd / && rm -rf /tmp/openmpi-*
ENV PATH="/opt/ompi/bin:${PATH}" \

Check warning on line 92 in Dockerfile

View workflow job for this annotation

GitHub Actions / build-test-publish

Variables should be defined before their use

UndefinedVar: Usage of undefined variable '$LD_LIBRARY_PATH' More info: https://docs.docker.com/go/dockerfile/rule/undefined-var/

Check warning on line 92 in Dockerfile

View workflow job for this annotation

GitHub Actions / build-test-publish

Variables should be defined before their use

UndefinedVar: Usage of undefined variable '$LD_LIBRARY_PATH' More info: https://docs.docker.com/go/dockerfile/rule/undefined-var/

Check warning on line 92 in Dockerfile

View workflow job for this annotation

GitHub Actions / build-test-publish

Variables should be defined before their use

UndefinedVar: Usage of undefined variable '$LD_LIBRARY_PATH' More info: https://docs.docker.com/go/dockerfile/rule/undefined-var/

Check warning on line 92 in Dockerfile

View workflow job for this annotation

GitHub Actions / build-test-publish

Variables should be defined before their use

UndefinedVar: Usage of undefined variable '$LD_LIBRARY_PATH' More info: https://docs.docker.com/go/dockerfile/rule/undefined-var/

Check warning on line 92 in Dockerfile

View workflow job for this annotation

GitHub Actions / Deploy API Documentation

Variables should be defined before their use

UndefinedVar: Usage of undefined variable '$LD_LIBRARY_PATH' More info: https://docs.docker.com/go/dockerfile/rule/undefined-var/
LD_LIBRARY_PATH="/opt/ompi/lib:${LD_LIBRARY_PATH}"

# uv — fast reproducible Python deps installer. pyproject.toml + uv.lock
Expand Down Expand Up @@ -118,6 +118,7 @@
uv pip install --no-deps -e . && \
for ext in .py .sh .bash; do \
for script in /app/scripts/*/*$ext; do \
[ -e "$script" ] || continue; \
link_name=$(basename $script $ext); \
ln -s $script /usr/local/bin/$link_name; \
done; \
Expand Down Expand Up @@ -169,6 +170,7 @@
uv pip install --no-deps -e . && \
for ext in .py .sh .bash; do \
for script in /app/scripts/*/*$ext; do \
[ -e "$script" ] || continue; \
link_name=$(basename $script $ext); \
ln -s $script /usr/local/bin/$link_name; \
done; \
Expand Down
3 changes: 2 additions & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ to start:
- `Installation <https://cosmostat.github.io/shapepipe/installation.html>`_ — getting ShapePipe onto your machine or cluster.
- `Basic execution <https://cosmostat.github.io/shapepipe/basic_execution.html>`_ and `configuration <https://cosmostat.github.io/shapepipe/configuration.html>`_ — running ``shapepipe_run`` and writing pipeline configs.
- `Container workflow <https://cosmostat.github.io/shapepipe/container.html>`_ — the two image targets and the ``pyproject.toml`` / ``uv.lock`` / ``Dockerfile`` layers.
- `Running on a cluster <https://cosmostat.github.io/shapepipe/clusters.html>`_ — pulling the image and submitting jobs, with worked candide (SLURM) and CANFAR examples.
- `Running on a cluster <https://cosmostat.github.io/shapepipe/clusters.html>`_ — pulling the image and submitting jobs, with a worked candide (SLURM) example.
- `The Snakemake workflow <https://cosmostat.github.io/shapepipe/workflow.html>`_ — the production orchestration for a whole tile list, driven by ``workflow/bin/sp``.

If you use ShapePipe in academic work, please cite Guinot et al. (2022) and
Farrens et al. (2022).
3 changes: 0 additions & 3 deletions bin/canfar_submit_job.py

This file was deleted.

3 changes: 0 additions & 3 deletions bin/summary_run.py

This file was deleted.

39 changes: 12 additions & 27 deletions docs/source/clusters.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

ShapePipe runs the same way on every cluster: **through the container**. You
pull the slim `runtime` image once, bind-mount your clone, and run
`shapepipe_run` (or the CANFAR submission tooling) inside it — there is no
environment to install or activate on the host. This page covers the shared
pattern, then the specifics for each supported machine.
`shapepipe_run` inside it — there is no environment to install or activate on
the host. This page covers the shared pattern, then the specifics for each
supported machine.

For what is *inside* the image and how it is built, see
[Container Workflow](container.md).
Expand Down Expand Up @@ -67,32 +67,17 @@ over unchanged.

## CANFAR

CANFAR submission does not go through a batch scheduler. Instead you submit
container jobs to CANFAR's headless system with the `canfar_submit_job` console
script (backed by the `canfar` library), and watch them with `canfar_monitor` /
`canfar_monitor_log`. Pipeline steps are **bit-coded** through `-j` (the same
scheme as `scripts/sh/job_sp_canfar.bash`), the PSF model is chosen with
`-p psfex|mccd`, and `-V` selects the image version:
CANFAR submission has been retired. The `canfar_submit_job` console script and
the bash layers underneath it (`curl_canfar_local.sh`,
`init_run_exclusive_canfar.sh`, `job_sp_canfar.bash`) were last carried at
`2ef07e45`; the bit-coded `-j` production walkthrough went with them.

```bash
# Submit pipeline step(s) for the configured tiles (bit-coded -j).
canfar_submit_job -j 1 -p psfex -V 1.1

# Monitor sessions/jobs and stream logs.
canfar_monitor
canfar_monitor_log
```
Production orchestration is now the Snakemake workflow in `workflow/` — see
`workflow/README.md`. It is SLURM-only and has no CANFAR execution mode, so a
CANFAR campaign means moving to a SLURM site (nibi, candide).

The full production run — input preparation, the per-step `-j` table, and
post-processing — is documented in the
[CANFAR production walkthrough](pipeline_canfar.md).

```{note}
The CANFAR production submission scripts (`scripts/sh/job_sp_canfar*.bash`) still
run under the pre-container environment and are slated for the same
container-first cleanup the candide scripts received. Treat the walkthrough as
the current-but-evolving production procedure.
```
`canfar_monitor` and `canfar_monitor_log` stay: they list, filter and destroy
CANFAR sessions, independently of how those sessions were started.

## ccin2p3

Expand Down
4 changes: 4 additions & 0 deletions docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,10 @@

myst_enable_extensions = ["html_image"]

# Generate slug anchors for h1-h3 so in-page links like
# `[Mask images](#mask-images)` resolve instead of warning.
myst_heading_anchors = 3

# -- Options for HTML output -------------------------------------------------

# The theme to use for HTML and HTML Help pages. See the documentation for
Expand Down
3 changes: 1 addition & 2 deletions docs/source/dependencies.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,7 @@ Data access &amp; infrastructure (CANFAR / UNIONS):
| Package | Purpose |
|---------|---------|
| [vos](https://github.com/opencadc/vostools) | CADC / CANFAR VOSpace access |
| [skaha](https://github.com/shinybrar/skaha) | CANFAR Science Platform sessions |
| canfar | CANFAR container-job submission |
| canfar | CANFAR session monitoring |
| [astroquery](https://astroquery.readthedocs.io/) | external catalogue queries |
| [cs_util](https://github.com/CosmoStat/cs_util) | shared CosmoStat utilities |
| [sqlitedict](https://github.com/RaRe-Technologies/sqlitedict) | on-disk pipeline state |
Expand Down
Loading