diff --git a/.felt/cat-config-sp-v1-5-4-missing-psf/cat-config-sp-v1-5-4-missing-psf.md b/.felt/cat-config-sp-v1-5-4-missing-psf/cat-config-sp-v1-5-4-missing-psf.md deleted file mode 100644 index 26c77ad3..00000000 --- a/.felt/cat-config-sp-v1-5-4-missing-psf/cat-config-sp-v1-5-4-missing-psf.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: 01KTCHX01Z812TKPWGCZNWGHDR -name: 'cat_config: SP_v1.5.4 missing PSF file' -status: closed -tags: - - data - - catalog -created-at: 2026-06-03T10:59:39.118309714+02:00 -closed-at: 2026-06-04T00:47:15.280965453+02:00 -outcome: 'Dropped SP_v1.5.4 from cat_config.yaml. Root cause: the shared v1.5.a PSF catalog was never finalized — only unions_shapepipe_psf_2024_v1.5.a_prev.fits exists on disk (the sibling v1.6.a was regenerated Jan 11, v1.5.a was not). Shear catalog + v1.5.4/ dir are fine; only PSF missing. Non-fiducial version (we''re v1.4.6.3); only consumed by plot_footprints.py (builds paths directly, doesn''t read cat_config) and stale plot_comparison.ipynb output cells — no live consumer breaks. test_catalog_paths_exist now passes on cluster.' ---- diff --git a/.felt/docker-build-uv-venv-base/docker-build-uv-venv-base.md b/.felt/docker-build-uv-venv-base/docker-build-uv-venv-base.md deleted file mode 100644 index 395f0cf9..00000000 --- a/.felt/docker-build-uv-venv-base/docker-build-uv-venv-base.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -id: 01KTCHX02B8APEX03YEC97AW4E -name: 'Docker build: uv-venv base image' -status: closed -tags: - - docker - - ci -created-at: 2026-06-03T10:22:53.245547768+02:00 -closed-at: 2026-06-10T17:13:38.572339006+02:00 -outcome: 'sp_validation image fixed for the uv-venv shapepipe:develop base: autotools restored via apt for pymaster, uv pip install so packages land in /app/.venv. Standing risk documented: moving base tag can break again — diff base env assumptions before blaming our code.' ---- - -The `Dockerfile` builds `FROM ghcr.io/cosmostat/shapepipe:develop` — a **moving tag**. -A rebuild of that upstream image on 2026-05-31 changed the environment underneath us, and -the GitHub Actions "Create and publish a Docker image" workflow went red. The same -`sp_validation` code built green on 2026-05-04. Two independent breakages, fixed in two -commits on `develop`: - -**1. pymaster can't compile its C library** (commit `a1e2a41`). pymaster 2.6 builds -`libnmt` from sdist via autotools; the new base image dropped the `libtool` package, so -`autoreconf` failed with `Makefile.am:3: error: Libtool library used but 'LIBTOOL' is -undefined` → `pip install -e .` aborted. Fix: add `autoconf automake libtool pkg-config` -to the apt step. (The base still ships GSL/FFTW/CFITSIO dev libs, so libtool was the only -missing piece — but pymaster compiling from source at all means those could vanish next.) - -**2. `import sp_validation` fails at runtime even though install succeeded** (commit -`d4a64e4`). The new base image runs out of a **uv venv**: `VIRTUAL_ENV=/app/.venv`, -`include-system-site-packages = false`, **shapepipe itself lives in the venv** -(`/app/src/shapepipe`), and the venv has **no `pip`**. So bare `pip install -e .` fell -through to `/usr/local/bin/pip` and installed into the *system* python -(`/usr/local/lib/python3.12`), invisible to the `python` that `docker run` actually uses -(the venv). The CI smoke test `docker run python -c "import sp_validation"` then -threw `ModuleNotFoundError`. Fix: install with **`uv pip install`** (uv ships at -`/usr/local/bin/uv`, honors `VIRTUAL_ENV`) so packages land in `/app/.venv` alongside -shapepipe. Verified the image green after both fixes. - -**Diagnosis tool:** `apptainer exec --cleanenv docker://ghcr.io/cosmostat/shapepipe:develop -bash -lc '...'` lets you inspect the base image's real env (PATH, `pyvenv.cfg`, where -shapepipe imports from) without a full Docker build — far faster than CI round-trips. Pin -host PATH (`export PATH=/usr/local/bin:/usr/bin:/bin`) so host tools don't leak in. - -**Standing risk:** because the base is a moving tag, a future upstream rebuild can break the -build again with no change on our side. If this recurs, first `diff` the base image's env -against what the Dockerfile assumes (uv venv, autotools, dev libs) before touching our code. - -## CI now runs the unit suite inside this image - -As of PR #186 (2026-06-03), `deploy-image.yml` runs `pytest -m "not slow"` inside the built -image, right after the `import sp_validation` smoke test. This is deliberate: the heavy -system-dependency stack (pymaster's GSL/FFTW/CFITSIO, etc.) already lives in the image, so -running tests there is reliable — re-solving those deps on a bare GitHub runner would be the -same fight that broke the build above. The Dockerfile installs the `[test]` extra (`uv pip -install -e '.[test]'`) so pytest is present. The dead `ci-build.yml` (master-triggered, -py3.8, conda, `setup.py test` — never fired) was deleted; `cd-build.yml` is the same era and -still dead (docs→gh-pages), left for a separate cleanup. Tests must stay hermetic for the -`not slow` set: catalog-data-dependent tests are marked `@pytest.mark.slow` so they only run -on the cluster (the image has `cat_config.yaml` but no catalogs). diff --git a/.felt/docs-deploy-modernized/docs-deploy-modernized.md b/.felt/docs-deploy-modernized/docs-deploy-modernized.md deleted file mode 100644 index 6b116c9b..00000000 --- a/.felt/docs-deploy-modernized/docs-deploy-modernized.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: 01KTCHX02BFAABNBRKN0RNN0E3 -name: 'Docs deploy modernized: gh-pages CI + Sphinx 8' -status: closed -tags: - - docs - - ci -created-at: 2026-06-04T00:47:23.328929872+02:00 -closed-at: 2026-06-10T17:13:38.595662941+02:00 -outcome: Dead cd-build.yml replaced by deploy-docs job building inside the freshly-published container image; sphinx/myst modernized; gh-pages deploy on develop. Live. ---- - -The old `cd-build.yml` was a relic of the pre-uv era: triggered on `master`, set up py3.8 via conda, ran `setup.py test`, and deployed Sphinx API docs to gh-pages. Fully dead since the move to `develop`/uv and the container CI. Removed it; the image build + tests now live in `deploy-image.yml` (see [[docker-build-uv-venv-base]]). - -**New CI shape.** Docs are a `deploy-docs` job in `deploy-image.yml`, `needs: build-and-push-image`, gated `if: github.ref == 'refs/heads/develop'`. It runs *inside* the just-published `ghcr.io/cosmostat/sp_validation:develop` image (which already carries the full scientific stack autodoc needs to import), `uv pip install '.[docs]'`, then `sphinx-apidoc … src/sp_validation` + `sphinx-build`, and deploys with `peaceiris/actions-gh-pages@v4`. Building in the image is the key move — it avoids recompiling pymaster/pyccl on a bare runner. - -**Stack haussmannized.** The `docs` extra dropped exact py3.8-era pins (sphinx 4.3.1, myst 0.16, nbsphinx, jupyter) for `>=` floors: `sphinx>=8`, `myst-parser>=4`, `numpydoc>=1.8`, `sphinxcontrib-bibtex>=2.6`, `sphinxawesome-theme>=5.3`. nbsphinx/nbsphinx-link/jupyter removed entirely — there are no `.ipynb` in the docs, the notebook-autodiscovery code in conf.py was long commented out. - -**conf.py PEP 621 metadata trap.** Two `conf.py` lookups broke under modern packaging because `[project]` metadata no longer populates the legacy fields: `mdata['Home-page']` (removed; was only used by dead nbsphinx badge code) and `mdata['Author']` (PEP 621 `authors=[{name=…}]` lands in `Author-email` as `"Name , …"`, not `Author`). Fixed author to `mdata.get('Author') or re.sub(r'\s*<[^>]*>','', mdata.get('Author-email','CosmoStat'))` → "Martin Kilbinger, Cail Daley, Sacha Guerrini". Also migrated removed-config: `autodoc_default_flags`→`autodoc_default_options`, `html_use_smartypants`→`smartquotes`, and the sphinxawesome 3.x theme options (`nav_include_hidden`/`show_nav`/`breadcrumbs_*`) → 5.x/6.x (`show_prev_next`/`show_scrolltop`/`globaltoc_includehidden`), dropping the bare `'sphinxawesome_theme'` extension entry (5.x loads via `html_theme` only). - -**Verified** by an ephemeral-uv smoke build (sphinx 9.1.0, myst 5.1.0, theme 6.0.2): full pipeline builds clean except `sphinx-apidoc`+autodoc of the real modules, which needs the container env the CI job provides. The remaining warnings are pre-existing content issues (markdown header levels, two stray `.md` not in any toctree). - -**One-time repo setting:** GitHub Pages must be enabled pointing at the `gh-pages` branch; the first develop run creates that branch. diff --git a/.felt/docs-narrative-pages/docs-narrative-pages.md b/.felt/docs-narrative-pages/docs-narrative-pages.md deleted file mode 100644 index 7867d525..00000000 --- a/.felt/docs-narrative-pages/docs-narrative-pages.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -id: 01KTCHX02W2H6V4A8S86GDT112 -name: 'Docs: real narrative pages, not template stubs' -status: closed -tags: - - constitution - - sp_validation - - docs -created-at: 2026-06-04T16:51:19.13286682+02:00 -closed-at: 2026-06-04T21:48:33.143370641+02:00 -outcome: 'SHIPPED & LIVE. PR #196 merged to develop (574f4bf); deploy-docs published to gh-pages and cosmostat.github.io/sp_validation now serves the real pages — verified live: landing page shows the writing-pass content (''Four main tasks make up a run''), zero template boilerplate, all four nav sections, about-page philosophizing gone. Delivered: four real narrative pages (writing-pass-polished), existing guides woven into a regrouped toctree, citing stub removed, a new deploy-docs.yml CI (build-on-PR + deploy-on-develop + downloadable docs-html artifact), and docstring RST fixes (78b4d17). Desired state realized. Interactive: session alive for Cail; fiber his to temper/close on the kanban.' -shuttle: - enabled: true - kind: oneshot - interactive: true - host: candide - project_dir: /automnt/n17data/cdaley/unions/pure_eb/code/sp_validation - agent: claude-opus -tempered: true ---- - -# Docs: real narrative pages, not template stubs - -The `sp_validation` developer docs deploy to [cosmostat.github.io/sp_validation](https://cosmostat.github.io/sp_validation/) but read as blank. Every hand-written page is still the unmodified Python-package-template placeholder. The Sphinx *machinery* is fine — this is a **content** job, not a plumbing one. - -## Desired State - -The deployed docs introduce the package and orient a developer, instead of showing template boilerplate. Concretely, the four stub pages under `docs/source/` carry real, grounded prose: - -- **`index.rst`** — a true landing page: what `sp_validation` is (validation of weak-lensing galaxy/star-shape catalogues produced by ShapePipe), the four tasks it performs (shear validation → post-processing → cosmology validation → cosmology inference), and how to navigate the docs. Strip the template `.. note::`, the Admonitions / Code-Blocks demo sections, everything that literally says "you should put some introductory information here." -- **`about.rst`** — the package in its CosmoStat / UNIONS context; the problem it solves; authors and contributors (from the README); contact. -- **`installation.rst`** — the *real* install story: container / Apptainer first (the recommended path — `apptainer build --sandbox sp_validation docker://ghcr.io/cosmostat/sp_validation:develop`), then dev install via `uv pip install -e '.[develop]'`. The package is **not on PyPI** — remove the template's `pip install sp_validation` and PyPI-URL instructions; don't ship a false claim. -- **`quickstart.rst`** — a real first-run walkthrough grounded in the actual entry points: the validation run, `notebooks/params.py` configuration, the `cosmo_inference/pipeline.sh` flags (`--pcf` / `--covmat` / `--inference` / `--mcmc_process`). Not the template's bare "import sp_validation" stub. - -The existing *real* docs — `run_validation.md`, `post_processing.md`, `Leakage_object_Tutorial.md` — are woven into the `toc.rst` toctree coherently (they exist, but the narrative around them is missing), and the build no longer warns about stray `.md` files outside any toctree. - -The build is **verified clean**, not assumed: build the docs the way CI does and inspect the rendered HTML. Either inside the container (`ghcr.io/cosmostat/sp_validation:develop`, which carries the stack autodoc imports) or via `uv pip install -e '.[docs]'`, run `sphinx-apidoc -t docs/_templates -feTMo docs/source src/sp_validation` then `sphinx-build -b html docs/source docs/_build`, and open / inspect `docs/_build/index.html`. No autodoc import failures leaving API pages empty; the landing page renders real content. - -Work on a branch off `develop` (the prior docs PRs used `chore/…`) and open a PR — **don't merge**. Docs redeploy when Cail merges to `develop`; PR-per-change is this repo's grammar. - -### Explicitly not - -- **Not re-doing the CI / deploy / Sphinx stack** — that landed in [[docs-deploy-modernized]] and works. Don't go hunting for broken wiring: the apidoc, autodoc-with-source-links, theme, and gh-pages deploy all function (verified — the live nav is fully populated and API module pages carry documented members). -- **Not a theme / design overhaul** — keep the `sphinxawesome_theme`. -- **Don't invent science.** Every statement about what the package does is grounded in the README, `CLAUDE.md`, or the code. Where the right *framing* or emphasis needs Cail's taste (what to foreground, scientific nuance, how far the quickstart should walk), stage it and ask in the interactive phase rather than guessing. - -## Context - -**The reframe.** Cail's read was "we made a PR to hook up the docs but they're super blank — not hooked up correctly." Ground truth (verified 2026-06-04): the wiring is *fully functional*. CI builds inside the published container, `sphinx-apidoc` + autodoc generate populated API pages (e.g. `sp_validation.cosmology`, `.b_modes` render documented members with `[source]` links), the awesome theme renders, gh-pages deploys, and the sidebar nav lists every module and guide. What reads as "blank" is that `index`, `about`, `installation`, `quickstart` are still the **python-package-template placeholders** — so the landing page and Getting Started section have no real content. The job is to write that content, not to fix plumbing. - -**Source material is already written** — most of this is porting / adapting, not inventing: - -- `README.md` — strong prose overview, the four-task summary, authors / contributors, the container-install walkthrough. -- `CLAUDE.md` — architecture and per-module map (`b_modes`, `calibration`, `cat`, `cosmo_val`, `cosmology`, `rho_tau`, …), the `cosmo_inference/pipeline.sh` flags, container usage. -- The existing real docs (`run_validation.md`, `post_processing.md`, `Leakage_object_Tutorial.md`) — content to weave in, not duplicate. - -**Build environment (candide).** This dispatches on candide in the repo (`/automnt/n17data/cdaley/unions/pure_eb/code/sp_validation`). The container is the reliable autodoc env; the `.[docs]` install also works. [[docs-deploy-modernized]] records the `conf.py` PEP-621 metadata traps already fixed, and notes the *remaining* warnings are exactly these content issues (markdown header levels; two stray `.md` not in any toctree). - -**Prior art.** [[docs-deploy-modernized]] is the CI / stack PR Cail is thinking of — it hooked up the deploy. [[front-page-makeover]] cleaned the *README* badges (the GitHub front page), which is distinct from the Sphinx landing page. - -**Interactive handoff.** Do a strong first pass solo — real `index` / `about` / `installation` / `quickstart` grounded in the material above, build locally, confirm the rendered landing page shows real content — then leave the session alive at a checkpoint for Cail to refine the scientific framing, emphasis, and quickstart narrative before the PR is finalized. diff --git a/.felt/docs-narrative-pages/report.html b/.felt/docs-narrative-pages/report.html deleted file mode 100644 index 900ff249..00000000 --- a/.felt/docs-narrative-pages/report.html +++ /dev/null @@ -1,225 +0,0 @@ - - - - - -Report — docs-narrative-pages - - - - - - -
- -
- - 2026 · 06 · 04 - · - docs-narrative-pages - · - shipped · live on gh-pages -
- -

Real docs pages — shipped, polished, and live.

- -
- PR #196: merged → develop (574f4bf) - build: clean · 0 content warnings - live: cosmostat.github.io/sp_validation -
- -
- -
-
§ Current state
-

Shipped. The real pages are live.

- -

PR #196 is merged to develop (574f4bf) and the - deploy published to gh-pages — cosmostat.github.io/sp_validation - now serves real content. Verified live: the landing page shows the - writing-pass prose, the four nav sections render, and the template - boilerplate (and the about-page philosophizing) are gone. The four - template-stub pages carry real grounded prose, the existing guides are woven - into the navigation, and the build is warning-free.

- -

What each page says now

-
    -
  • index.rst — a true landing page: what - sp_validation is (validation of weak-lensing galaxy/star-shape - catalogues from ShapePipe), the four tasks run in sequence (shear - validation → post-processing → cosmology validation → inference), the - pipeline flow-chart figure, and a "where to go next" nav block. The - template note and the Admonitions/Code-Blocks demo sections are - gone.
  • -
  • about.rst — CosmoStat / UNIONS context, a "problem it - solves" paragraph (a shear catalogue is only as good as its validation), - authors + contributors (from the README), contact, MIT license.
  • -
  • installation.rst — container/Apptainer first - (recommended), Docker alternative, then the uv pip install -e - '.[develop]' dev path. The false pip install sp_validation - PyPI claim is removed and replaced with an explicit "not on PyPI" note.
  • -
  • quickstart.rst — deliberately light: the four stages - of a run (configure params.py → shear validation → - post-processing → cosmology inference) as orientation, each linking to its - guide. Kept vague on purpose — the inference orchestration detail - (pipeline.sh vs Snakemake) is left out pending the upcoming - docs rework.
  • -
- -

Removed: citing.rst (and its placeholder - my_ref.bib) — nothing substantive to cite yet, so the stub is - gone rather than left as debris.

- -

Navigation & weaving

-

The sidebar is regrouped into Getting Started / User - Guide / API Reference / Guidelines. The previously - orphaned run_validation.md and post_processing.md - (and the Leakage tutorial, moved out of "API Documentation") now live under - User Guide — so the "stray .md not in any toctree" warnings are gone.

- -

Build verification

-

Built the way CI does — sphinx-apidoc + sphinx-build - inside the sp_validation container (sphinx 8.2.3, full scientific - stack). Build succeeded. Confirmed in the rendered - HTML: the landing page shows real content, the four nav sections render, the - API pages populate with documented members and [source] links - (autodoc imports all succeed — no empty pages), and the false PyPI line is - absent. Zero content warnings. The only warnings left - (5) are pre-existing RST-formatting issues in package docstrings - (cosmo_val.py, galaxy.py, survey.py) — - source-code fixes, out of scope, present on the live site today too.

-
- -
- -
-
§ Findings
-

What's worth naming.

- -
    -
  • It was a content job, exactly as the constitution framed. - The wiring is fully functional — apidoc + autodoc populate every module - page, the awesome theme renders, gh-pages deploys. The "blank" symptom was - purely the four template placeholders.
  • -
  • Most of it was porting, not inventing. The README's - four-task summary, author list, and container walkthrough carried directly - into index/about/installation; the - quickstart entry points came from CLAUDE.md and the actual - scripts.
  • -
  • Header-level fix for the woven .md guides. - run_validation.md and post_processing.md started - at H2 with no page title; I added an H1 to each so the toctree entries - render cleanly and the "headings start at H2" warnings clear. Also fixed - post_processing's one broken internal cross-reference with an - explicit MyST anchor.
  • -
  • Adjacent honesty fix (flagging, since unnamed). - contributing.rst still pointed at - github.com/martin.kilbinger/sp_validation on master - — the same dead-link class front-page-makeover fixed in the README badges. - I redirected both links to CosmoStat/sp_validation on - develop (both target files exist there). Easy to revert if you - want that page left untouched.
  • -
-
- -
- -
-
§ Resolved this pass
-

Your direction, applied.

- -
    -
  • Quickstart left vague (Q1 + Q2). Trimmed to a light - four-stage orientation; dropped the speculative pipeline.sh - flag list so we're not baking in the inference-orchestration story before - the upcoming rework.
  • -
  • citing.rst removed (Q3). Nothing substantive to cite - yet, so the page and its placeholder my_ref.bib are gone - (also dropped from conf.py's bibtex_bibfiles).
  • -
  • Leakage header warnings fixed (Q4). The two H2→H4 - jumps are now H2→H3 — the content build is fully warning-free.
  • -
  • Flow chart kept on the landing page (Q5).
  • -
- -

Build re-verified clean after these edits: build - succeeded, zero content warnings (only the 5 pre-existing - package-docstring RST warnings remain — source code, out of scope).

-
- -
- -
-
§ Where it stands
-

Pushed; PR open for your review.

- -

Committed and pushed on chore/docs-narrative-pages, PR open - against developnot merged. The bigger docs - rework you mentioned is the natural follow-up; this PR just stands up the - structure and replaces the placeholders.

- -

Docs CI added. A new deploy-docs.yml builds - the docs on every PR (as a check) and deploys to gh-pages only on - develop pushes — closing the gap where a broken docs build never - surfaced before merge. It runs inside the published image and installs the - checked-out package via .[docs], so it documents the code under - review. The redundant docs job was removed from deploy-image.yml. - The new check self-tested green on this PR (build - succeeded; the deploy step correctly skipped on a pull request).

- -

Note on viewing: the gh-pages deploy only fires on merge to - develop (the deploy-docs CI job is gated to that - branch), so the PR won't auto-publish a preview. The built HTML is on candide - at docs/_build/index.html; I can rebuild or serve it on request.

-
- -
- - diff --git a/.felt/footprint-plotter-dedup-merged/footprint-plotter-dedup-merged.md b/.felt/footprint-plotter-dedup-merged/footprint-plotter-dedup-merged.md deleted file mode 100644 index b0893973..00000000 --- a/.felt/footprint-plotter-dedup-merged/footprint-plotter-dedup-merged.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: 01KTD4AA4TXSA0SA2R658XJ287 -name: FootprintPlotter dedup PR merged -status: closed -tags: - - github - - plots -created-at: 2026-06-06T02:11:24.186547508+02:00 -closed-at: 2026-06-10T17:13:38.551415476+02:00 -outcome: 'PR #186 (FootprintPlotter dedup) merged to develop after conflict resolution with docs/deploy modernization.' ---- diff --git a/.felt/front-page-makeover/front-page-makeover.md b/.felt/front-page-makeover/front-page-makeover.md deleted file mode 100644 index 0e822fcd..00000000 --- a/.felt/front-page-makeover/front-page-makeover.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -id: 01KTCHX03YS1ANPKJ5WTRGTZ3E -name: 'Front-page makeover: badges, CI, contributor docs' -status: closed -tags: - - ci - - docs -created-at: 2026-06-04T02:53:52.875583891+02:00 -closed-at: 2026-06-10T17:13:38.530640596+02:00 -outcome: 'PR #195 merged 2026-06-04: badges 13→8 pointing at CosmoStat/sp_validation, real CI gate (pytest in image before publish), testpaths fixed, authorship reconciled, GitHub Pages live.' ---- - -Cleanup of the `sp_validation` repo front page, committed as `2db5cbc` on branch -`chore/front-page-makeover` (off the post-merge develop, `6788cfc`). Builds on the -CI/docs modernization in [[docs-deploy-modernized]]. - -**Badges (13 → 8).** Every old badge pointed at `martin.kilbinger/sp_validation` — -not a valid GitHub username (dots are illegal), so all dynamic ones 404'd red. The -table was the stock CosmoStat template (pypi, codecov, CodeFactor, wemake, pyup), -but the repo isn't on PyPI/codecov/CodeFactor and pyup.io is defunct. New flat row -points at `CosmoStat/sp_validation`: docs · CI · container · python 3.11+ · license · -ruff · contribute · conduct. `wemake` → `ruff` (the linter actually enforced). - -**The testpaths bug (reusable gotcha).** `pyproject.toml` had `testpaths = -["sp_validation"]`, but the package is `src/sp_validation`. That path doesn't exist, -so pytest warns and **falls back to recursive search from cwd**, which sweeps up -`cosmo_inference/.../mock_cosebis_bias_test.py` (matches `*_test.py`) — it runs -`plt.style.use(...)` at import and **errors during collection**. So bare `pytest` -was broken. Fixed → `testpaths = ["src/sp_validation/tests"]`; bare `pytest` now -collects 36 cleanly. Full suite: **36 passed in ~177s** in the container (needs the -full scientific stack; the old CLAUDE.md claim of "~18s" was stale). - -**Real CI.** There was no working test CI: `ci-build.yml` was a py3.8/conda/ -`setup.py test` relic triggered on a nonexistent `master`; the only live workflow -just did `import sp_validation`. Now the image workflow runs the full suite *inside -the freshly-built image before pushing* (failing test blocks publication), with the -`[test]` extra baked into the dev image (`Dockerfile` `-e .` → `-e '.[test]'`). The -Dockerfile already `COPY . /sp_validation` + editable-installs, so the image carries -the test files — no extra setup needed. Deleted `ci-build.yml` and `.pyup.yml` (the -latter referenced three requirements files that don't exist). Ruff `target-version` -py38 → py311. - -**Authorship reconciled, not invented.** Old README listed Authors = Kilbinger, -Guinot. But `pyproject.toml` *and* `CONTRIBUTORS.md` say authors = Kilbinger, Daley, -Guerrini — set by Martin himself in commit `5684e08`. Aligned the README to that -(Guinot → contributor). Lucie's surname is **Baumont** (per her own commits -`lucie.baumont@cea.fr`), not "Beaumont"; fixed in CONTRIBUTORS.md along with the -`Ayçoberry` mojibake. - -**GitHub Pages is live** — `cosmostat.github.io/sp_validation` returns 200, so the -docs badge link resolves. - -**Cluster-data tests, now CI-aware.** The first CI run surfaced that three -`TestCosmologyValidation` tests (`test_additive_bias_base_columns`, -`test_additive_bias_leak_corrected_columns`, `test_catalog_paths_exist`) load real -UNIONS catalogues off `/n17data` — they pass on-cluster and in the container, but -can't on a bare runner. The new test-before-publish gate correctly *blocked the -push* on that first run. Fixed by guarding them with -`skipif(not Path("/n17data").exists())` so they run where the data lives and skip -off-cluster. CI now lands **33 passed, 3 skipped**. - -**Status:** pushed to `chore/front-page-makeover`, PR -[#195](https://github.com/CosmoStat/sp_validation/pull/195) open into develop, CI -green. Awaiting merge. - -Minor heads-up for later: the docker `actions/*` in `deploy-image.yml` still run on -Node 20, which GitHub force-migrates to Node 24 in June 2026 — non-blocking, just a -future bump. diff --git a/.felt/sp-validation-restructuring.md b/.felt/sp-validation-restructuring.md deleted file mode 100644 index 186f4138..00000000 --- a/.felt/sp-validation-restructuring.md +++ /dev/null @@ -1,221 +0,0 @@ ---- -id: 01KTCHX03Y3PVZYS5QHFWZRF5N -name: SP Validation Restructuring -status: open -tags: - - constitution - - sp-validation - - reorg - - shuttle -created-at: 0001-01-01T00:00:00Z -outcome: 'Phase 2 — the top-level moves — complete on cleanup/restructuring (PR #197), guard net green throughout (full suite 86 passed, 0 skipped; move-map guard active with 5 registered moves). The tree has the target shape: workflow/ + papers/{bmodes,catalog,harmonic} (bmodes split), cosmo_val/ promoted from notebooks/ with all tracked references swept and on-disk outputs moved along (candide-absolute paths through the pure_eb symlink stay live), tracked scratch/ with conventions README, one top-level results/ (contents gitignored), root output/ ignored, dead hand-listed notebook block dropped from .gitignore. CI hermeticity restored: the guard suite now passes inside the Docker image (no .git directory, no cluster mounts) — git-querying guards fall back to a tree walk of the image''s tracked-only content, and the workflow dry-run guard skips off-cluster like its data-bound siblings. Cleanup begun: defunct/ deleted; nbstripout + 2 MB large-file pre-commit hooks added (CONTRIBUTING documents activation). Remaining: fold glass_mock core into src/ (own pass), curate notebooks/ to official demos (reduction-notebook triage with Martin), branch/milestone tidy (#188/#189) with Cail.' -horizon: now -shuttle: - kind: oneshot - interactive: true - host: candide - project_dir: /automnt/n17data/cdaley/unions/pure_eb/code/sp_validation - agent: claude-opus ---- - -## Driver session - interactive; first action: land Sacha's #192 - -This fiber is now an **interactive oneshot driver shuttle** for the sp_validation -reorganization, dispatched on the sp_validation city (candide). Attach and drive the -milestone together. The settled plan below - target layout, division of labor with -Sacha, the modular workflow, cleanup, sequencing - is the Desired State. - -**First action: land Sacha's foundation merge, PR #192** (`sachaguer:develop` -> `develop`, -"Merge Sacha's fork with fiducial sp_validation"). It is basically ready and is milestone -item 1 - the clean base the restructuring builds on. On dispatch, the worker: - -1. Verifies #192 is genuinely merge-ready: pull `develop`, fetch the PR, confirm it merges - cleanly with tests/CI green, and surface anything that is not. -2. Leaves the actual merge to Cail (or merges on his explicit go-ahead) - landing a - collaborator's PR is his gesture; the worker preps and verifies. -3. With #192 in, proceeds into the restructuring (item 2 / PR #188) per the sequencing - below: delete `defunct/` + fix `.gitignore`, promote `cosmo_val/`, collect `papers/`, - the path-translation sweep, `scratch/` + nbstripout. - -Interactive (attach and talk to it) and oneshot. Keep this plan current as the reorg lands. - - -We're cleaning up `sp_validation` before the next analysis cycle. This fiber holds the -settled reorg plan, refined across three Cail passes and a Cail+Sacha pass (2026-06-02), -grounded in a full map of what's on disk. It ships as a GitHub milestone; this work is the -restructuring proposal PR within it. - -## Guiding principle - -Make the things a person actually *runs* siblings at the top level, with shared library -code underneath. The asymmetry that keeps causing confusion: `cosmo_val` is buried in -`notebooks/` while `cosmo_inference/` is top-level. Fix that. Be aggressive on deletion — -it all stays in git history. - -## Target top-level layout - -``` -sp_validation/ -├── src/sp_validation/ library — + glass_mock core folded in -├── cosmo_val/ PROMOTED from notebooks/cosmo_val/ — validation code + config -├── cosmo_inference/ ~as-is — inference code + config (cosmosis/cosmocov, pipeline.sh) -├── workflow/ ALL analysis — modular Snakemake, multi-person → results/ -├── papers/ final-figure assembly only (PDF, color, layout) -│ ├── catalog/ ← notebooks/cosmo_val/catalog_paper_plot/ -│ ├── cosmic_shear_2d/ ← 2D_cosmic_shear_paper_plots/ (config space) -│ ├── harmonic/ ← 2D_harmonic_space_..._plots/ (harmonic space) -│ └── bmodes/ ← 2D_bmodes_paper_workflow/ (analysis → workflow/) -├── scripts/ only REAL reduction scripts (catalog builders, masking) -├── scratch/ TRACKED, per-person — ad hoc + personal custom workflows -├── notebooks/ CURATED — official demo / tutorial notebooks only -├── results/ analysis products + diagnostic plots; CONTENTS gitignored -├── docs/ tests/ config/ -``` - -`cosmo_val` and `cosmo_inference` sit side by side as the code+config homes (someone who -only does validation opens `cosmo_val/`); `workflow/` orchestrates the analysis across -them. - -## Division of labor (settled with Sacha) - -The boundary is **the inputs to a paper figure**: everything up to that point is analysis; -the figure itself is presentation. - -- **`workflow/` — all analysis.** Generic, reusable, modular, organized for multiple people. - Produces analysis products *and diagnostic plots* (sp_validation makes many — fine, they - go to `results/`). This is where the bulk of the work lives. -- **`papers//` — final-figure assembly only.** Building the figure PDF, tweaking - colors/layout, recombining data for presentation. Tied to one paper; **may never touch - Snakemake.** Not everyone uses it. -- **`scratch//` — personal & ad hoc.** Experimentation, and personal *custom - workflows* for one-off analysis. Tracked (sharing scratch is valuable). - -## Why the workflow is modular, not monolithic - -Nothing in real science is computed once — the catalog changed ~20× in the first release -suite, and every paper varies the data vector, covariance, and inference. So the workflow -is **parameterized, not a fixed run**: the shared thing is the rules, the config changes -every time. Snakemake's `module` directive imports rule *definitions* under your own config -and an output `prefix`, and lets you override individual rules: - -```python -module analysis: - snakefile: "../../workflow/Snakefile" - config: config # this run's catalog, cuts, blind - prefix: "results/bmodes" # products land here — no clobbering -use rule * from analysis -# swap is per-rule: redefine just the data-vector rule with the same output to override -``` - -Single top-level `results/`; each run/paper namespaces under `results//` via the -`prefix`. **DAG dry-run** (`snakemake --dry-run`) is the backpressure starter — the safety -net for the module work; the broader test suite fills in during implementation. - -## Cleanup - -- **`defunct/`** — already quarantined (Oct 2024). Delete. -- **`notebooks/`** — curated to *official* demo/tutorial notebooks only; the rest deleted or - moved to scratch. Salvage `run_cosmo_val.py` + `cat_config.yaml` → `cosmo_val/`; - `catalog_paper_plot/` → `papers/catalog/`; Martin's real reduction notebooks → `scripts/`. -- **`scratch/`** is tracked, not gitignored. Bloat guard is tooling: `nbstripout` (strips - notebook outputs on commit — git is 319 MB today, heavy from *committed notebook outputs*, - and the `.gitignore` is scarred with hand-listed notebook paths) + a pre-commit size hook. -- **Paths stay messy (revised 2026-06-05).** The original plan was a mechanical sweep rewriting - ~117 hardcoded absolute paths (`/home/…`, `/n17data/…`, `/automnt/…`, several `/home/guerrini/…`) - to a single repo-relative `results/`. **Cail's call: that's not realistic — they'll stay messy.** - We do *not* rewrite them to repo-relative. The realistic guard is a **Candide-local existence - checker** (guard ③): load every config, assert every referenced path exists *on the machine this - runs on*. Not portable, not CI — local back-pressure that goes red when a move orphans a reference. -- **gitignore fix** — root `results/` and `output/` aren't currently ignored; ignore - `results/` contents (keep the dir), drop the hand-listed notebook block. - -## The milestone - -Shipped as a GitHub milestone, a suite of PRs in sequence: - -1. **Foundation** — Sacha merges his pending local code into `develop`. His to make. -2. **Restructuring** — PR #188. The proposal is *not* committed to the repo: it lives in - the PR description and here in the fiber (`report.html`, `proposal.md`; rendered PDF - for PR attachment). Decided 2026-06-03 that a rendered report shouldn't sit in the code - tree. With nothing committed, the branch == `develop` and GitHub auto-closed the PR. -3. **Glass mocks → tomography** — stub. -4. **Input pipeline → tomography** — stub. - -## Implementation sequencing (within PR 2 when it goes live) - -1. Delete `defunct/` + audited old notebooks; fix `.gitignore`. -2. Promote `cosmo_val/`, collect `papers/`, curate `notebooks/`, fold glass_mock into `src/`. -3. Path-translation sweep (paper plots + scripts) → single `results/`. -4. Add `scratch/`, nbstripout + size hook, README discipline; DAG-dry-run test. -5. (incremental) build out modular `workflow/`; wire the first paper as a `module` composition. - -## Resolved decisions - -- harmonic vs cosmic_shear are **separate** papers (harmonic vs config space), separate dirs. -- outputs go to a **single top-level `results/`**, namespaced per run via module `prefix`. -- Martin's reduction notebooks: which are real scripts — review with Martin. -- `2D_bmodes_paper_workflow/` is not split mid-paper: its analysis folds into `workflow/`, - its final figures into `papers/bmodes/`, sequenced after Sacha's foundation merge. - -### Settled 2026-06-05 (interactive session with Cail) - -- **Paths stay messy → existence checker, not translation.** See revised Cleanup bullet above. -- **Back-pressure suite finalized** to ①②③⑤⑥; DAG guard simplified to "dry-run passes"; see the - suite section. Build dispatched as the [[back-pressure-suite]] Codex shuttle. -- **Branch topology — DEFERRED until the back-pressure tests land** (doing it now would break the - Codex worktree/branch off `cleanup/restructuring`). Target end-state Cail wants: **one clean - branch = Sacha's foundation merge + restructuring on top**, no superseded clutter, *no work - lost* (names don't matter). Mechanics to settle then: `cleanup/restructuring` and - `restructuring/proposal` are duplicate names for one line of work (PR #188's head is - `restructuring/proposal`); collapse to one. Close #189 (foundation stub, superseded by folding - the foundation into #188); keep #190/#191 as tomography stubs. -- **`uv.lock` — leave gitignored for now.** Cail lukewarm ("not sure it's necessary"); container - is canonical. One-line flip to track later if we want pinned-dep reproducibility. - -## Cail's direction (2026-06-05 night) + back-pressure invariants — HOLD until pure_eb tree clears - -Cail opened the operator and gave the call that **overrides the worker's "wait for Sacha's #192 to merge to develop" sequencing**: - -- **Don't wait for Sacha.** His foundation PR (#192) isn't merged yet, and that's fine — **fold his branch into our cleanup branch** and build the restructuring on top. Base the restructuring branch on `develop` + #192's head so we get his foundation without racing his merge gesture. -- **Restore the closed restructuring draft PR #188** (`restructuring/proposal → develop`, CLOSED/draft — "closed by us somehow", Cail was confused by it). Reopen it. -- **Clean up the milestone** "Restructuring & tomography prep" (open:4 closed:1 — #188 is the closed one; #189 foundation-merge, #190/#191 tomography drafts, #192 Sacha). Reopen #188; tidy sequencing. *Surface the milestone re-ordering for Cail, don't auto-decide which drafts stay.* - -### Back-pressure FIRST — establish the invariant suite GREEN before moving a single file - -Cail's framing: "what things do we want to be varying and still maintain as we make these changes that keep us on the right track? Could be simple things like imports." This is **characterization / golden-master testing before a refactor**: write guards that are green on the *pre-reorg* tree (develop + #192 folded in), commit them, then do the reorg in small reviewable `git mv` steps keeping every guard green. The suite is the back-pressure that resists silent drift. The reorg is "done right" **iff** the suite stays green. - -### The suite — settled with Cail (2026-06-05 interactive session) - -Refined live from the original 7-item sketch. **Final set to build (cheap → strong):** - -1. **① Imports resolve (Cail's #1) — GREEN, done.** `tests/test_imports.py` walks the *package* AND the standalone `scripts/` dir, importing every module (scripts live outside the package; AST-resolved, not executed). First thing to break on a bad move. Already caught a dead script (`plot_leakage.py` imports a never-existent `sp_validation.correlation`). This is the *model* for the rest. -2. **② Snakemake dry-run passes — build.** Deliberately **not** DAG-identity/golden (Cail: "we don't care about the weather; it's okay if the rules change — making a *superior* restructure that breaks the DAG is unlikely"). The guard is simply: **`snakemake -n` on the bmodes workflow exits 0.** Probe first — Cail isn't sure bmodes still runs, and dry-run may be slow. If it's broken or too slow, **report it as signal, don't paper over it** (skip/xfail with a clear reason and surface it). -3. **③ Config-path existence — Candide-local — build.** The reframe of the dead path-translation idea: load every config (`config.yaml`, `cat_config.yaml`, mask yamls, cosmosis `.ini`), extract path-shaped values, assert they exist *on this machine*. Skip cleanly when not on Candide. -4. **⑤ Symlink integrity — build.** Every tracked symlink resolves to an existing target. Cheap; this tree has real symlinks that moves silently break. -5. **⑥ Dangling-reference grep — build (harness now).** After a move, grep the tree for old *internal* dir names → zero hits. Parameterized by a move-map that's empty pre-reorg (so trivially green now); the harness lands so it activates the moment moves begin. This is the *internal-reference* cousin of the absolute-path mess we're punting on. - -**Dropped, with reasons:** -- **Entry-point / console-script resolution** — N/A: `pyproject.toml` declares no `[project.scripts]`; folded into ①. -- **"No work lost" content manifest** — too strong (Cail: "lots of deletes, we're going to be brutal"). -- **Package installs** — CI already builds the image and runs pytest, so it's covered. -- **Output-schema / value invariance** — needs real cluster data, its reference run is flagged unreliable, and it's "testing specific code," which Cail wants deferred until that code changes. - -**Build vehicle:** dispatched as an autonomous **Codex shuttle** ([[back-pressure-suite]]) — mechanical-with-investigation, well-specified, and offloading it keeps the interactive session free for design. Mirror `tests/test_imports.py` for style; run everything in the container. - -**Collision hold:** sp_validation is nested at `pure_eb/code/sp_validation`, so pure_eb-tree agents share its working tree. As of this writing the active sharer is `science/pure_eb/citation-audit-skill/skill-rework` (candide). **Do not start the reorg while another agent has the pure_eb tree dirty** — the operator is monitoring and will engage this driver (or re-dispatch) once the tree clears. At push time, `git -C status` must be clean of other agents' edits before moving files. - -## ENGAGE — 2026-06-05 ~02:45 CEST — AUTONOMOUS, gate OPEN (operator dispatch) - -The operator verified the push-gate OPEN and is dispatching this **autonomously** (Cail asleep; he said "forge ahead" + "when it seems like we can start pushing, let's do it"). Ground truth at dispatch: candide has NO worker on the pure_eb/sp_validation tree; no git merge in progress (MERGE_HEAD absent); debug's federated-identity deploy is settled (parked, main untouched); PR #196 (docs) landed on develop. Do the work unattended; leave a report + a clean green-guarded checkpoint for Cail's morning. Realize the plan in "Cail's direction + back-pressure invariants" above. - -### Scope (in order) — back-pressure FIRST, stage the move, don't force it - -**Phase 0 — clean base.** The tree has ~19 leftover untracked files (sphinx `.rst` under docs/source, a notebooks dir) from the docs PRs. Decide each: gitignore the generated artifacts or commit if intended; land develop clean. Re-verify #192's CURRENT state (`gh pr view 192 --repo CosmoStat/sp_validation`) — it may have merged while we waited. If merged, base on develop; if still open, fold sachaguer's branch into a fresh `cleanup/restructuring` branch (Cail's call: don't wait for his merge). - -**Phase 1 — back-pressure suite GREEN (the first things to add).** On the clean base, build the invariant suite from the section above and get it GREEN, committed to the cleanup branch: (1) imports+scripts resolve (walk package AND scripts/); (2) snakemake DAG-identity golden (`--dry-run` rule list + job counts frozen); (3) config-path resolution; (4) output-schema invariance on the smallest catalog→pseudo-Cl run (columns+dtypes+shape; values if cheap); (5) no-dangling-path grep; (6) git-mv provenance. Then **restore the closed draft PR #188** and **propose** a milestone cleanup for "Restructuring & tomography prep" (list a recommendation; don't auto-decide which drafts stay). - -**Phase 2 — BEGIN the reorg only behind green guards; DON'T force completion.** With the suite green, start the top-level layout move (workflow/paper/scratch per #188) in small `git mv` steps, re-running the suite after each. Do NOT attempt to finish the 120-file move unattended — stop at a clean, suite-green checkpoint and write the report. The full move + merges stay Cail's gesture. - -**Deliverables:** a `cleanup/restructuring` branch (back-pressure suite green); #188 restored; milestone-cleanup recommendation; `report.html` in the fiber dir; outcome + felt history. Propose-never-commit: no merges to develop, no force-pushes to others' branches. - -**Exit:** autonomous — at the green-guarded checkpoint, close for Cail's review. diff --git a/.felt/sp-validation-restructuring/back-pressure-suite/back-pressure-suite.md b/.felt/sp-validation-restructuring/back-pressure-suite/back-pressure-suite.md deleted file mode 100644 index efda79c2..00000000 --- a/.felt/sp-validation-restructuring/back-pressure-suite/back-pressure-suite.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -id: 01KTCKDA2N1VEPZJRBF04ZZ6VW -name: Back-pressure test suite for the reorg -status: closed -tags: - - constitution - - sp-validation - - reorg - - shuttle -created-at: 2026-06-05T21:15:56.629448647+02:00 -closed-at: 2026-06-11T02:37:16.176902373+02:00 -outcome: 'Suite realized and battle-tested: guards ①②③⑤⑥ green through the ENTIRE phase-2 restructuring (final: 86 passed, 0 skipped — move-map guard activated with 5 entries as moves registered). It caught two real regressions en route (twopoint script-path resolution; test_cosmo_val component-built path invisible to the string sweep). The net is now the repo''s standing structural test suite, not a one-off.' -shuttle: - kind: oneshot - host: candide - project_dir: /automnt/n17data/cdaley/unions/pure_eb/code/sp_validation - agent: codex -tempered: true ---- - -## Desired State - -Four **back-pressure guards** built and **green on the pre-reorg tree** (branch -`cleanup/restructuring`), committed locally. They mirror the existing guard ① -(`src/sp_validation/tests/test_imports.py` — read it first; it is the style model). -The point of the suite: capture invariants that must stay true as the restructuring -moves files around, so a botched `git mv` goes red. Build them while everything is -green, *before* any file moves. - -Build these four (the numbering matches the parent constitution -[[sp-validation-restructuring]] — ① is already done): - -- **② `snakemake -n` passes.** A test that runs `snakemake --dry-run` on the bmodes - workflow and asserts it **exits 0**. This is *not* a DAG-identity/golden test — we do - **not** freeze the rule graph (Cail: "we don't care about the weather; it's fine if - the rules change"). The invariant is just: the workflow still dry-runs clean. - - Workflow: `cosmo_inference/notebooks/2D_bmodes_paper_workflow/`, Snakefile + - `rules/*.smk`, config at `config/config.yaml`. - - **Probe first.** Cail is not sure bmodes still dry-runs, and it may be slow. Run the - dry-run by hand in the container before writing the test. If it passes quickly → - write the test plainly. If it is **broken** or **too slow to run in CI** → do **not** - paper over it: write the test but `pytest.mark.skip`/`xfail` it with a clear reason - string naming exactly what's wrong (e.g. the missing input, the error, the runtime), - and record the finding in this fiber's outcome + a `felt history` note so we see it. - A red/slow dry-run is *signal*, not a failure to hide. - -- **③ Config-path existence — Candide-local.** A test that loads each config, extracts - every path-shaped value, and asserts it **exists on this machine**. Skip cleanly (don't - fail) when not running on Candide / when the mount is absent, so it's honest off-host. - - Configs to cover: `cosmo_inference/notebooks/2D_bmodes_paper_workflow/config/config.yaml`, - `notebooks/cosmo_val/cat_config.yaml`, `config/calibration/*.yaml`, and the cosmosis - `*.ini` (there are ~57 — sample/scan them for `path`/`file`/`dir`-shaped keys and - absolute-path values; you decide a sensible extraction heuristic). Use your judgment on - what counts as a "path" (absolute paths, values under keys like `*_path`/`*_file`/`dir`, - things that look like filesystem paths). Report how many paths checked / how many missing. - -- **⑤ Symlink integrity.** A test that every **tracked symlink** resolves to an existing - target. `git ls-files -s | awk '$1==120000'` lists symlinks; assert each target exists. - Five lines; this tree has real symlinks that file-moves silently break. - -- **⑥ Dangling-reference grep — harness.** A test parameterized by a **move-map** of - `(old_internal_dir → new_location)` pairs. The map is **empty pre-reorg**, so the test is - trivially green now; structure it so that adding a pair later makes it grep the tree for - the old name and assert **zero hits** (excluding `.git/`, `.felt/`, `.snakemake/`, - results, and the test file itself). This is the internal-reference cousin of the absolute- - path mess we are deliberately *not* sweeping. Land the harness; it activates when moves begin. - -**Done = all four exist, run green (or are honestly skipped/xfailed with a stated reason), -committed locally to `cleanup/restructuring`, with the dry-run probe's findings recorded.** - -## Context - -This is item-by-item back-pressure for the larger sp_validation restructuring (parent: -[[sp-validation-restructuring]]). Guard ① (`tests/test_imports.py`, 42 passed / 1 xfailed) -is the proven pattern — same dir, same pytest style, same "honest baseline with strict xfail -for known-broken" discipline. Match it. - -**Run everything in the container.** `app` is an interactive bash function that won't exist -in this session; use the raw invocation: - -``` -apptainer exec --bind /home,/scratch,/automnt,/n17data,/n23data1,/n09data \ - /n17data/cdaley/containers/containers/ -``` - -Container Python is **3.12** (`python3.12`); the full scientific stack (snakemake, pyyaml, -pytest, treecorr, …) is there. Run the suite with -`apptainer exec … python3.12 -m pytest src/sp_validation/tests/test_.py -v`. - -**Scope — additive only.** -- ONLY create new test files under `src/sp_validation/tests/`. If the Candide-local checker - genuinely needs a helper, keep it as a pytest fixture/module under that dir — do not scatter - scripts elsewhere. Do not modify existing code. Do not move or rename anything. - -**⚠️ Git safety — the working tree is SHARED with a live interactive Claude session (the -driver of the parent constitution).** This is non-negotiable: -- You are on branch `cleanup/restructuring`. Commit your new test files there, locally. -- **NEVER** run `git add -A`, `git add .`, `git add -u`, `git commit -a`, `git reset --hard`, - `git checkout -- .`, `git stash`, or `git clean`. Stage ONLY the specific new files you - create, by explicit path (`git add src/sp_validation/tests/test_foo.py`). -- There are unrelated uncommitted/untracked files in the tree (other sessions' `.felt/` - directories, an untracked `cosmo_inference/notebooks/2D_cosmic_shear_paper_plots/`). **Leave - them completely alone** — do not add, move, clean, or touch them. -- **Do NOT push.** Commit locally only; the driver session + Cail review and push together. - -**Exit (autonomous oneshot).** When the four guards are built and green (or honestly -skipped/xfailed with reasons): rewrite `outcome` to a one/two-line CLI headline (what's green, -what the dry-run probe found, what's skipped and why), append a `felt history` event, commit -locally, set `status: closed`, then `kill $PPID`. Do not self-`tempered`. diff --git a/.felt/sp-validation-restructuring/bmodes-workflow-split/bmodes-workflow-split.md b/.felt/sp-validation-restructuring/bmodes-workflow-split/bmodes-workflow-split.md deleted file mode 100644 index fc895e4b..00000000 --- a/.felt/sp-validation-restructuring/bmodes-workflow-split/bmodes-workflow-split.md +++ /dev/null @@ -1,172 +0,0 @@ ---- -id: 01KTD18JXS7VK50ECJX3GRWS9W -name: 'Codex reorg: split bmodes into modular workflow/ + papers/bmodes/' -status: closed -tags: - - constitution - - sp-validation - - reorg - - shuttle -created-at: 2026-06-06T01:18:01.913028797+02:00 -closed-at: 2026-06-11T02:10:26.498745826+02:00 -outcome: 'Split complete on cleanup/restructuring; guard net green at 49 passed (move-map guard active, 4 entries). The B-modes analysis is now two layers: workflow/ — the generic compute base (pointer Snakefile, common.py helpers incl. PLANCK18 + wildcard constraints via configure(), rules/{twopoint,covariance,inference,masks,glass_mock}.smk, compute scripts) — and papers/bmodes/ — the paper''s epistemic layer (Snakefile composing the workflow via module import + plain-Python common import, config/, rules/{claims,ecut,synthesis,presentation}.smk, paper scripts; plotting_utils.py stays in workflow/scripts with a tracked symlink in papers/bmodes/scripts). Dead specs.smk dropped (in git history). Also landed: catalog_paper_plot → papers/catalog, 2D_harmonic_space_cosmic_shear_plots → papers/harmonic (the /home/guerrini absolute refs updated to the post-move layout). Run dir repointed: pure_eb/workflow → papers/bmodes plus a new pure_eb/config symlink; snakemake -n all_tapestry exits 0 from both papers/bmodes and pure_eb. Load-bearing gotcha: Snakemake normalizes include paths lexically, so reaching the module through the run-dir symlink requires realpath-resolving WORKFLOW_DIR in the paper Snakefile (commit 5a4b926). Remaining (later pass): fold glass_mock core into src/sp_validation; 2D_cosmic_shear_paper_plots no longer exists in the checkout (move moot, but plotting_utils.PAPER_MPLSTYLE still points at its old path — pre-existing dangle).' -shuttle: - kind: oneshot - host: candide - project_dir: /automnt/n17data/cdaley/unions/pure_eb/code/sp_validation - agent: codex -tempered: true ---- - -## Desired State - -Split the `2D_bmodes_paper_workflow` into the **modular architecture** below — the design -settled live with Cail — moving in **small `git mv`/refactor steps with the back-pressure -net green after EVERY step**. This is a long-running job: work methodically, commit per step, -push to `cleanup/restructuring` (the WIP draft PR #197 — it's our branch) for durability. - -### Target structure (top-level in the sp_validation repo) - -``` -workflow/ ← generic, reusable analysis — the shared compute base -├── common.py ← shared HELPERS + static constants (plain Python; imported everywhere) -├── Snakefile ← POINTERS ONLY: from common import *, config, wildcard_constraints, includes -└── rules/ - ├── twopoint.smk ← xi, xi_highres, rho_tau_stats, run_cosmo_val, pseudo_cl - │ (correlation functions AND power spectra — one home, Cail's call) - ├── covariance.smk ← covariance rules (+ any covariance-only local helpers) - ├── inference.smk - ├── masks.smk - └── glass_mock.smk - -papers/bmodes/ ← THIS paper's epistemic layer + the composition -├── Snakefile ← from common import * ; module-import ../../workflow/Snakefile ; -│ use rule * from analysis ; paper constants ; include epistemic rules -├── config/ ← this paper's config.yaml (+ cat_config reference) -├── rules/ claims.smk · ecut.smk · synthesis.smk · presentation.smk -└── scripts/ ← paper-specific scripts -``` - -### The architecture — DECIDED, do not re-litigate - -- **`module` for rules, plain Python `import` for helpers.** The paper composes the workflow's - rules: `module analysis: snakefile: "../../workflow/Snakefile"; config: config` then - `use rule * from analysis`. The shared **helper functions** live in `workflow/common.py`, - imported via `from common import *` in the workflow Snakefile, the rule files, AND the paper - Snakefile + its epistemic rules. This is the crux: **`module` imports rules, not the Python - globals of the module's snakefile** — so helpers would be unreachable through `module` alone; - a plain Python import is namespace-clean and jumps that wall. That is how we "do both." -- **`common.py` holds the CROSS-DOMAIN helpers** — the ones the *epistemic* rules reach into - (verified by grep): `covariance_path`, `covariance_base`, `covariance_dir`, - `resolve_covariance_version`, `build_redshift_path`, `get_shear_catalog`, - `fiducial_binning_suffix`, plus static constants `COSMO_VAL`, `COSMO_INFERENCE`, `CAT_CONFIG`, - `BLINDS`, `BLOCK_PAIRS`. Domain-only helpers may stay in their topical `.smk`. -- **Config-derived constants** (`FIDUCIAL = config["fiducial"]`, `DEFAULT_MASK_SUFFIX`) cannot be - module-level in `common.py` (no `config` at import time). Set them in the Snakefile *after* - `configfile`, or expose `common.get_fiducial(config)`. Helpers that currently close over the - `FIDUCIAL` global must take it as a parameter instead (they already accept `min_sep`/`max_sep`/ - `nbins` overrides — extend that pattern). -- **The main `workflow/Snakefile` is pointers + constants only** — `from common import *`, - `configfile`, `wildcard_constraints`, and the `include:` list. **No compute rules in the body**: - the inline `xi`/`xi_highres`/`rho_tau_stats`/`run_cosmo_val` rules move into `twopoint.smk`. - Keep it self-documenting — a person should read the Snakefile as a map. -- **Paper-only constants** (`TAPESTRY_DIR`, `PAPER_FIGURES_DIR`, `CONFIG_DIR`) live in the paper - Snakefile, not `common.py`. -- **`specs.smk` is dead** (included nowhere; epistemic by category). Default: **drop it** (it's in - git history). Moving it to `papers/bmodes/rules/` is acceptable if you prefer — your call. - -### The net — GREEN after EVERY step (run in the container) - -``` -apptainer exec --bind /home,/scratch,/automnt,/n17data,/n23data1,/n09data \ - /n17data/cdaley/containers/containers/ python3.12 -m pytest \ - src/sp_validation/tests/test_imports.py \ - src/sp_validation/tests/test_bmodes_workflow_dry_run.py \ - src/sp_validation/tests/test_config_paths_exist.py \ - src/sp_validation/tests/test_tracked_symlinks.py \ - src/sp_validation/tests/test_dangling_move_references.py -v -``` - -(These five guards were built by the [[back-pressure-suite]] agent — read them first; they are -the contract.) **If any guard goes RED: STOP.** Fix it, or if you can't, leave the tree at the -last green commit and write exactly what broke to this fiber's outcome + `felt history`. Never -`git mv` past a red guard. As you move directories, **add `(old → new)` entries to the move-map -in `test_dangling_move_references.py`** so guard ⑥ actively checks each move's references. - -### Step sequence (small, committed, net green after each) - -1. **Extract `common.py` in place** (still inside `2D_bmodes_paper_workflow/`): pull the - cross-domain helpers + static constants out of the Snakefile body; `from common import *` - in the Snakefile + rule files; refactor `FIDUCIAL`-dependent helpers to take it as a param. - Net green → commit. -2. **Extract `twopoint.smk`**: move the inline two-point rules (`xi`, `xi_highres`, - `rho_tau_stats`, `run_cosmo_val`) — and the `pseudo_cl` rules from `covariance.smk` — into it; - `include:` it. Net green → commit. -3. **Slim the Snakefile** to pointers + constants + config + includes. Net green → commit. - *(Now internally modular, still in place.)* -4. **Create top-level `workflow/`**; `git mv` the generic pieces (`common.py`, `Snakefile`, - `rules/{twopoint,covariance,inference,masks,glass_mock}.smk`) into it. Fix run-CWD / config-path - resolution. Net green → commit. (Add the move to ⑥'s map.) -5. **Create `papers/bmodes/`**; `git mv` the epistemic rules + config + scripts there; write - `papers/bmodes/Snakefile` (`from common import *` + `module`-import `../../workflow/Snakefile` - + `use rule *` + paper constants + include epistemic rules). Net green → commit. -6. **Repoint the `pure_eb/workflow` symlink** (currently → `…/2D_bmodes_paper_workflow`) to the - new run location so the run-from-`pure_eb/` flow + guard ⑤ stay green. Net green → commit. -7. **Final verify**: full net green, and `snakemake -n all_tapestry` (or the paper target) exits 0 - from the run location. - -### Then (only if green and time remains) — the other paper dirs - -Same pattern, simpler (no Snakefile split — mostly dir-move + path-existence), each behind the net, -each committed, each added to ⑥'s map: -- `notebooks/cosmo_val/catalog_paper_plot/ → papers/catalog/` -- `2D_harmonic_space…_plots/ → papers/harmonic/` -- the **untracked** `cosmo_inference/notebooks/2D_cosmic_shear_paper_plots/ → papers/cosmic_shear_2d/` - (this one is `git add`, not `git mv` — it was never tracked) -- fold `glass_mock` core into `src/sp_validation/`. - -**Out of scope for this agent:** notebook curation, `nbstripout`, `scratch/`, the science run. A -later pass owns those. - -## Context - -**Why this architecture.** The seam is **compute (infrastructure) ↔ epistemic (evidence)** — a line -the Snakefile already half-draws in its `include:` grouping ("Compute rules" vs "Epistemic rules"). -The compute rules (`covariance`, `inference`, `masks`, `glass_mock_validation`, plus the inline -two-point rules) are reusable analysis → `workflow/`. The epistemic rules (`claims`, `ecut`, -`synthesis`, `presentation`, dead `specs`) are this paper's argument → `papers/bmodes/`. A coupling -grep showed the epistemic rules reach into the compute helpers (`claims` → `covariance_path`, -`COSMO_VAL`, `COSMO_INFERENCE`, `BLINDS`; `presentation` → `build_redshift_path`, `FIDUCIAL`) — which -is exactly why those cross-domain helpers are centralized in `common.py` and imported on both sides. -We chose `module`+`common.py` over plain `include:` because Cail wants to keep `module` for future -multi-paper composition (per-run `config:`, output `prefix:`, per-rule `with:` override). Full design -thread: parent [[sp-validation-restructuring]]. - -**Paths stay messy — do NOT relativize.** There are ~117 hardcoded absolute paths -(`/n17data/…`, `/automnt/…`, `/home/…`). Cail's explicit decision: **we do not rewrite them.** They -ride along with their files. Guard ③ (`test_config_paths_exist`) checks they still *exist* on -candide — keep it green; don't introduce NEW missing paths. (Consequence: `module`'s `prefix:` -output-namespacing won't fully bite while outputs are absolute — that payoff is deferred to a future -path-relativization pass. Adopting `module` now still buys the structure + config injection + override.) - -**Run mechanics.** Container: `apptainer exec --bind /home,/scratch,/automnt,/n17data,/n23data1,/n09data /n17data/cdaley/containers/containers/ ` -(`app` is an interactive bash function that won't exist here). Container Python is **3.12**. The -bmodes workflow currently runs from `/automnt/n17data/cdaley/unions/pure_eb/` (where `workflow/` -symlinks to the bmodes dir); `snakemake` is on the login PATH for dry-runs (no execution, safe). -A bare `snakemake -n` fails — there's no `rule all`; use a concrete target like `all_tapestry`. -The Snakefile reads `results/cosmology/planck18.json` at parse time — that file must exist where -snakemake runs. - -**Constraints.** -- Branch `cleanup/restructuring`. `git mv` (never `cp`) for `--follow` provenance; small commits per - step; push to `cleanup/restructuring` for durability (it's our WIP draft PR #197). -- Tree is yours this run (no interactive session, no other agent) — but still: stage only files you - intend; do **not** `git add -A` blindly (there are unrelated `.felt/` dirs and an untracked - `2D_cosmic_shear_paper_plots/` — leave those alone unless step "other paper dirs" reaches them). -- Run the net after every step; never proceed past red. Update ⑥'s move-map as you move. - -**Exit (autonomous oneshot).** Realize as much as lands green — ideally the full bmodes split -(steps 1–7), then the other paper dirs if time/context remain. Rewrite `outcome` (what's split, -what's green, where you stopped), append a `felt history` event, ensure the tree is green at the -final commit, set `status: closed`, `kill $PPID`. Do not self-`tempered`. If blocked by a red guard -you can't resolve, stop at the last green commit and lead the outcome with "Blocked: …". diff --git a/.felt/sp-validation-restructuring/ci-hermeticity/ci-hermeticity.md b/.felt/sp-validation-restructuring/ci-hermeticity/ci-hermeticity.md deleted file mode 100644 index 56baeea2..00000000 --- a/.felt/sp-validation-restructuring/ci-hermeticity/ci-hermeticity.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -id: 01KTT53Y3681X6FTJ6WM4YZRMV -name: 'CI hermeticity: guards in the git-less image' -status: closed -tags: - - sp-validation - - finding -created-at: 2026-06-11T03:35:31.430313054+02:00 -outcome: 'All 7 in-image test failures after the phase-2 moves were environmental, none were real stale references: the Docker image is built from the Git build context (tracked content only, no .git), so `git ls-files` exits 128 there — the dangling-reference and tracked-symlink guards now fall back to a tree walk, which in the image scans exactly the tracked set; the bmodes dry-run guard is candide-bound by design (candide-absolute catalog configfile + cluster data) and skips off-cluster like the test_cosmo_val data guards, while satisfying the Snakefile''s `envvars: PYTHONUNBUFFERED` itself. Separately, the docs workflow was red because sphinxawesome-theme 6.0.3 on PyPI is a broken wheel (dist-info only, no python module) — pinned `!=6.0.3` in the docs extra.' -horizon: now ---- - -The back-pressure suite must be green in two environments with different -furniture, and each guard has to know which differences are signal: - -- **Docker image** (`docker run … pytest`): tracked content only, no `.git` - directory, no cluster mounts. Git-querying guards - (`test_dangling_move_references`, `test_tracked_symlinks`) fall back to a - full tree walk when `git ls-files` fails — equivalent there, since the image - *is* the tracked set — so the guards keep their teeth in CI rather than - skipping. -- **candide checkout**: full data landscape, untracked run-dir furniture. - Guards that genuinely need it (`test_bmodes_workflow_dry_run`, the - config-path and catalog guards) carry the off-cluster skip; the dry-run - guard also exports `PYTHONUNBUFFERED=1` itself so the Snakefile's `envvars:` - declaration doesn't leak a dependency on the invoking shell. - -A separate trap discovered the same night: a `pull_request`-triggered workflow -(API docs) silently stops running when GitHub marks the PR conflicting — no -red check, just absence. A clean merge from `develop` restored mergeability -and the docs check. And `uv pip install` reporting success is not proof a -package is importable: sphinxawesome-theme 6.0.3 installs cleanly and ships -zero code. diff --git a/.felt/sp-validation-restructuring/cosmo-inference-notebooks/cosmo-inference-notebooks.md b/.felt/sp-validation-restructuring/cosmo-inference-notebooks/cosmo-inference-notebooks.md deleted file mode 100644 index 37c3e023..00000000 --- a/.felt/sp-validation-restructuring/cosmo-inference-notebooks/cosmo-inference-notebooks.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -id: 01KVD3ZZBZW9S2FDJVR1C5KVKM -name: Migrate cosmo_inference notebooks (on Candide) -status: open -tags: - - sp-validation - - reorg - - todo -created-at: 2026-06-18T10:21:27.296014865Z -updated-at: 2026-06-18T10:21:50.849714039Z -outcome: 'TODO: make cosmo_inference notebook-free like cosmo_val — paper plots → papers/, working notebooks → scratch/scripts, reusable bits → src/. Do it on Candide where the stack runs so each migration can be executed/verified.' ---- - -When [[cosmo-val-notebooks]] made `cosmo_val/` notebook-free, `cosmo_inference/` -was waved through as "untouched" — but that was an unexamined default, not a -decision (Cail flagged it). It holds **16 notebooks** that need the same -treatment, and the parallel is glaring: the harmonic paper plots already moved -to `papers/harmonic/`, but the configuration-space cosmic-shear plots sitting -next to them did not. - -Deferred deliberately to **Candide** (now back up): unlike the cosmo_val pass, -these should be *carefully* migrated with the scientific stack available, so each -moved/converted notebook can actually be run and verified rather than transformed -blind. No rush; correctness over speed. - -**Disposition analysis (current `cosmo_inference/` notebooks):** - -1. **2D cosmic-shear paper figures → `papers/` (new `cosmic_shear_2d/`, parallel to `papers/harmonic/`).** - These are publication plots for the configuration-space (ξ±) cosmic-shear paper: - - `notebooks/2D_cosmic_shear_configuration_plots/` — `S8_om_sigma8_whisker`, `best_fit_xipm`, `contours`, `get_chi2`, `get_chi2_glass_mock`, `get_prior_psf_leakage`, `glass_mock_hist`, `masking`, `nonlin_k_analysis` - - `notebooks/2D_cosmic_shear_consistency/` — already part `.py` (`check_consistency`, `get_param_values`, `compare_harmonic_scale_cut`) + notebooks `2025_11_13_plot_contours`, `2026_02_11_test_sampling_glass_mocks` - - `notebooks/2D_cosmic_shear_unblinding/` — already `.py` (`unblinding_party_plots`, `utils`) - Papers/ keeps notebooks (final-figure assembly), so these can stay notebooks once relocated. - -2. **Loose working notebooks → `scratch/` (or percent-light scripts).** Exploratory / chain-retrieval: - `cfis_analysis`, `cfis_mcmc`, top-level `get_chi2` + `get_chi2_cell`, `notebooks/get_prior_psf_leakage`. - Note redundancy: three `get_chi2*` notebooks — consolidate. - -3. **Reusable bits → `src/sp_validation/`** where any genuinely general helper turns up (same rule as the cosmo_val pass; `cosmo_inference/scripts/` already holds the real pipeline scripts). - -Ownership: this is largely Sacha's inference domain — coordinate / let him drive the -judgment calls, especially which `cosmic_shear_2d` notebooks are live paper figures -vs. stale. The PR #197 description should stop calling cosmo_inference "untouched" -and point here instead. diff --git a/.felt/sp-validation-restructuring/cosmo-val-notebooks/cosmo-val-notebooks.md b/.felt/sp-validation-restructuring/cosmo-val-notebooks/cosmo-val-notebooks.md deleted file mode 100644 index 34994563..00000000 --- a/.felt/sp-validation-restructuring/cosmo-val-notebooks/cosmo-val-notebooks.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -id: 01KVAS2NAWA972AQCJ5WH8MMTG -name: 'Convert cosmo_val notebooks: lib-extract + scratch' -status: closed -tags: - - sp-validation - - reorg -created-at: 2026-06-17T12:32:12.124718213Z -updated-at: 2026-06-17T13:47:26.127347991Z -closed-at: 2026-06-17T13:47:26.127347352Z -outcome: |- - 5 cosmo_val notebooks resolved by the rule "reasonably-reusable code -> library, - the rest -> scratch scripts." Three generic helpers lifted into - src/sp_validation/basic.py (chi2_and_pte, corr_from_cov, cov_from_one_covariance); - all five notebooks converted to jupytext percent-light .py under scratch/guerrini/ - (magics guarded, paths preserved verbatim). The namaster covariance toolkit moved - with them and a latent broken import (utils_cosmo_val -> rho_tau) was repaired. ---- - -The cosmo_val notebooks were relocated wholesale during phase-2 (the module was -promoted from `notebooks/cosmo_val/` to top-level `cosmo_val/`, notebooks riding -along untouched) — never actually converted. Cail flagged this: analysis modules -should be notebook-free; reusable code should land in the library, the rest in -`scratch/`. The house style for "notebook-free but cell-runnable" is jupytext -percent-light `.py` with guarded magics (`run_cosmo_val.py` is the template). - -**Move-map (intentional, for the PR #197 report):** - -Lifted to library — `src/sp_validation/basic.py`: -- `chi2_and_pte(data_vector, cov, verbose=False)` — χ²/reduced-χ²/PTE (was a local def in compute_pte_cell). -- `corr_from_cov(cov)` — correlation from covariance (was a local def in one_covariance). -- `cov_from_one_covariance(cov_one_cov, gaussian=True)` — parse OneCovariance `covariance_list` output (was `get_cov_from_one_cov` in one_covariance). - -Converted to percent-light scripts under `scratch/guerrini/`: -- `compute_pte_cell.py`, `one_covariance.py` (import the lifted helpers + `SquareRootScale` from `rho_tau`) -- `plot_comparison.py`, `get_prior_leakage.py` -- `exploration.py` + `namaster_utils.py` (the `investigation namaster/` bundle) - -Deleted: `cosmo_val/*.ipynb` (5) and the `cosmo_val/investigation namaster/` directory. - -**Flagged for Sacha:** `namaster_utils.py` is a cohesive ~200-line NaMaster -covariance toolkit that overlaps `cosmo_val/harmonic_covariance_gaussian_sims.py`. -It's a real library candidate, but promoting it properly means consolidating the -two and adding tests — an API decision in Sacha's domain — so it stays in scratch -for now rather than forking the covariance API behind his back. The repair of its -broken `utils_cosmo_val` import is a latent stale reference the phase-2 move missed -(nothing in the package imported it, so the guard net never caught it). diff --git a/.felt/sp-validation-restructuring/cosmo-val-workflow/cosmo-val-workflow.md b/.felt/sp-validation-restructuring/cosmo-val-workflow/cosmo-val-workflow.md deleted file mode 100644 index 855ba286..00000000 --- a/.felt/sp-validation-restructuring/cosmo-val-workflow/cosmo-val-workflow.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -id: 01KV0B16CX053QB9PBQDTCJSDR -name: Decompose run_cosmo_val into a Snakemake workflow -status: active -created-at: 2026-06-13T13:14:19.677661469+02:00 -updated-at: 2026-06-16T14:21:34.940296219Z -outcome: 'Decomposed run_cosmo_val into a Snakemake workflow (workflow/rules/cosmo_val.smk + cv_*.py + cv_runner harness; papers/cosmo_val composes it). DECISIONS CLOSED: canonical set = SP_v1.4.6.3 ±leak_corr, npatch=100 (confirmed); include_pseudo_cl ON by default (57cb9b7) — DAG + cv_summarize_bmodes honor the flag end-to-end. Validated by snakemake -n (19-job DAG); end-to-end run still pending the container scientific stack.' ---- - -Turned the linear cosmo_val/run_cosmo_val.py driver (one in-memory `cv`, ~13 -cv.() calls linked by lazy properties) into a Snakemake workflow on -branch feature/cosmo-val-workflow (from cleanup/restructuring). - -## Shape -- Generic layer: workflow/rules/cosmo_val.smk + one thin script per rule - (workflow/scripts/cv_*.py) + shared harness cv_runner.py. Activated only when - config has a `cosmo_val` block, so papers/bmodes is untouched. -- Paper layer: papers/cosmo_val/ composes the workflow module (bmodes pattern), - default target `all` builds the whole suite. -- common.py gains cv_init_params (centralized constructor), cv_basename, - CV_SENTINELS, CV_RUNDIR. - -## Rule graph (rulegraph-verified) -rho_tau_stats, xi (EXISTING rules in twopoint.smk — cosmo_val consumes them, -does not duplicate) feed: cv_plot_rho_stats, cv_plot_tau_stats, cv_rho_tau_fits, -cv_plot_2pcf, cv_ratio_xi_sys_xi (joins rho/tau + xi), cv_pure_eb, cv_cosebis. -cv_pure_eb + cv_cosebis (+ optional cv_pseudo_cl) -> cv_summarize_bmodes. -Leaves: cv_footprints, cv_weights, cv_additive_bias. All -> rule all. - -## Core tension resolution (in-memory cv vs file I/O) -Each rule re-instantiates cv; DAG is expressed through real data products, not -the shared object. -- Durable-product methods own compute rules keyed on those files (pure_eb npz, - cosebis npz, pseudo_cl FITS). -- Pure-plot methods whose figure paths derive from internal handler state -> - sentinel under output/snakemake_sentinels. -- Lazy state never persisted by cosmo_val.py: c1/c2 -> additive_bias.json; - xi_psf_sys -> recomputed in cv_ratio_xi_sys_xi (cheap vs the science). -- summarize_bmodes needs live result objects (TreeCorr gg, not npz-able) so its - rule re-runs plot_pure_eb/plot_cosebis in-process; they reload existing data - via skip-if-exists and recompute only the cheap PTE stats — exactly what the - original linear driver did on its shared cv. - -## Status -snakemake -n all: valid 19-job DAG. Rules run in isolation. Structural guards -test_dangling_move_references + test_tracked_symlinks green; -test_config_paths_exist fails only on pre-existing worktree-isolation (gitignored -output/ dirs absent in fresh checkout), unrelated to this work. - -## For Cail to decide -- versions/npatch in config are a placeholder fiducial (SP_v1.4.6.3 +leak_corr, - npatch=100) — confirm the canonical validation set. -- include_pseudo_cl defaults false (expensive NaMaster step, commented out in - the live driver). Flip on when the C_l^BB column is wanted in the summary. -- End-to-end execution not run (needs container scientific stack); validated by - dry-run only. diff --git a/.felt/sp-validation-restructuring/glass-cosmology-api-pin/glass-cosmology-api-pin.md b/.felt/sp-validation-restructuring/glass-cosmology-api-pin/glass-cosmology-api-pin.md deleted file mode 100644 index a369c057..00000000 --- a/.felt/sp-validation-restructuring/glass-cosmology-api-pin/glass-cosmology-api-pin.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -id: 01KV0M4MDDQFKXR6CN9XQG968F -name: GLASS/cosmology API mismatch in glass_mock map path -tags: - - sp-validation - - glass - - bug -created-at: 2026-06-13T15:53:29.51768405+02:00 -outcome: 'RESOLVED (pin landed, verified under uv). glass==2025.1 + glass.ext.camb==2023.6 + cosmology==2022.10.9 is the unique compatible set: glass 2025.1 has the flat map-path API AND still calls the legacy cosmo.dc/xm/ef that cosmology 2022.10.9 (its newest release) provides — no cosmology release exposes comoving_distance, so newer glass is incompatible with the cosmology package. matter_cls is a separate package (glass.ext.camb, absent from glass core >=2024.2). Pin is in pyproject [glass]; full map path verified seed-deterministic under bare uv+healpy. REMAINING: drop the test_glass_mock xfail once the container is rebuilt with [glass] (G1 / sandbox swap).' ---- diff --git a/.felt/sp-validation-restructuring/glass-mock-migration/glass-mock-migration.md b/.felt/sp-validation-restructuring/glass-mock-migration/glass-mock-migration.md deleted file mode 100644 index 71d06961..00000000 --- a/.felt/sp-validation-restructuring/glass-mock-migration/glass-mock-migration.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: 01KV8CY7CTFKTWRQFAGT6SEQR1 -name: 'Finish glass_mock fold: library to src/, runners to scripts/' -status: closed -tags: - - reorg - - sp-validation - - glass -created-at: 2026-06-16T14:21:35.002488872Z -updated-at: 2026-06-16T14:36:25.639840708Z -closed-at: 2026-06-16T14:36:25.639840033Z -outcome: 'DONE on cleanup/restructuring. Top-level glass_mock/ removed: ~10 reusable fns folded into src/sp_validation/glass_mock.py (heavy deps stay lazily imported, so module resolves without the GLASS stack); runners -> scripts/glass_mock/ as thin argparse wrappers; validate_glass_mock.ipynb deleted (exploratory, hardcoded /home/guerrini paths + broken imports). xfail test_glass_mock untouched (still gated on container [glass] rebuild). ruff green.' ---- diff --git a/.felt/sp-validation-restructuring/notebooks-cleanup/notebooks-cleanup.md b/.felt/sp-validation-restructuring/notebooks-cleanup/notebooks-cleanup.md deleted file mode 100644 index e42fec37..00000000 --- a/.felt/sp-validation-restructuring/notebooks-cleanup/notebooks-cleanup.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -id: 01KV8CY7C8J17GRT9BCQTVMAFA -name: 'Notebooks: prune the tree, tutorial → docs' -status: closed -tags: - - reorg - - sp-validation - - docs -created-at: 2026-06-16T14:21:34.984834681Z -updated-at: 2026-06-16T15:30:54.109812476Z -outcome: |- - Blanket .ipynb deletion reversed per Cail. The one user-facing notebook, - tutorial_UNIONS_SP_v1.0, became docs/source/using_the_catalogues.md — - wired into the User Guide toctree, updated for the HDF5 catalogue format - (≥ v1.4.1) and pointed at calibration.get_calibrated_m_c / - get_calibrate_e_from_cat, which now automate its hand-rolled metacal steps. - main_set_up left deleted: its set-up walkthrough is already covered by - run_validation.md + extract_info.py. The other 13 notebooks (validation - walkthrough series + exploratory one-offs + 2 junk files) stay deleted, - recoverable from git @88f2134. The 19 .py moves to scripts/examples/ stand. ---- - -The reorg removed the top-level `notebooks/` directory. The 19 `.py` helpers -moved to `scripts/examples/`; the 16 notebooks were deleted outright until Cail -pushed back on losing all of them. - -The notebooks split cleanly: one genuinely user-facing tutorial on *consuming* -the released catalogues (open base/extended FITS, plot, TreeCorr `GGCorrelation`, -hand-applied metacalibration), versus the old internal validation walkthrough -(`main_set_up`, `metacal_*`, `maps*`, `psf_leakage`, …) that the `scripts/` + -`cosmo_val/` workflow and the existing docs pages now supersede. Only the -tutorial earned a home in the live Sphinx docs; everything else stays in git -history. The conventions the tutorial documents (`e1_uncal`, `R_g{ij}`, header -`R_S{ij}`, `R = R_shear + R_select`) were verified still current against -`src/sp_validation/calibration.py` before publishing. diff --git a/.felt/sp-validation-restructuring/proposal.md b/.felt/sp-validation-restructuring/proposal.md deleted file mode 100644 index ddb2fe0b..00000000 --- a/.felt/sp-validation-restructuring/proposal.md +++ /dev/null @@ -1,100 +0,0 @@ -# Restructuring `sp_validation` - -*A proposal — draft, no implementation yet. The rich version of this document is -[`proposal.html`](./proposal.html).* - -One organizing principle — **the things you run live at the top** — a clean three-way -split between analysis, papers, and scratch, and a modular workflow built for more than one -person. - ---- - -## The shape - -Today `cosmo_val` is buried inside `notebooks/` while `cosmo_inference/` is top-level, so -you constantly hunt for where each one lives. The fix: the things a person actually runs -sit side by side at the top, sharing library code in `src/` underneath. - -``` -sp_validation/ -├── src/sp_validation/ library code (+ glass_mock core) -├── cosmo_val/ validation: code + config (promoted from notebooks/) -├── cosmo_inference/ inference: code + config (cosmosis / cosmocov) -├── workflow/ ALL analysis — modular Snakemake, multi-person → results/ -├── papers/ final-figure assembly only (PDF, colour, layout) -├── scripts/ real reduction scripts (catalog builders, masking) -├── scratch/ per-person — ad hoc work + personal workflows (tracked) -├── notebooks/ curated to official demos / tutorials -├── results/ analysis products + diagnostic plots (contents gitignored) -└── docs/ tests/ config/ -``` - ---- - -## Division of labor - -The boundary is **the inputs to a paper figure**: everything up to that point is analysis; -the figure itself is presentation. - -- **`workflow/` — all analysis.** Generic, reusable, modular, organized for multiple people. - Produces analysis products *and diagnostic plots* (sp_validation makes many — they go to - `results/`). The bulk of the work lives here. -- **`papers//` — final-figure assembly only.** The figure PDF, colours, layout, - recombining data for presentation. Tied to one paper, and may never touch Snakemake. -- **`scratch//` — personal and ad hoc.** Experiments and one-off custom workflows. - Tracked, because seeing each other's scratch is useful. - ---- - -## How the workflow scales — modular, not monolithic - -Nothing in this analysis is computed once: the catalog changed ~20× in the first release -suite, and every paper varies the data vector, covariance, and inference. So the workflow -is *parameterized* — the rules are shared, the config changes each time. Snakemake's -`module` directive imports the rules under your own config and an output `prefix`, and lets -you override any single rule: - -```python -module analysis: - snakefile: "../../workflow/Snakefile" - config: config # this run's catalog, cuts, blind - prefix: "results/bmodes" # products land here — no clobbering - -use rule * from analysis -# swap is per-rule: redefine just the data-vector rule to override it -``` - -One top-level `results/`; each run namespaces under `results//` via the prefix, so -people don't clobber each other. A `--dry-run` on each composition is the safety net that -lets the structure grow without silent breakage. - ---- - -## Cleanup - -- **Delete** `defunct/` (quarantined since 2024) and the exploratory 2021–22 notebooks — it - all stays in git history. -- **Curate** `notebooks/` to official demos and tutorials; personal scratchy ones move to - `scratch/`. -- **Discipline** via tooling, not bans: `nbstripout` strips notebook outputs on commit (the - repo's weight today is committed notebook outputs), plus a pre-commit size hook. -- **Path translation** — collecting the paper dirs breaks ~35 hardcoded absolute paths; a - mechanical sweep rewrites them (scripts included) to the single repo-relative `results/`. - ---- - -## The milestone - -A suite of PRs, in sequence: - -1. **Foundation** — merge pending local code into `develop`. *(Sacha)* -2. **Restructuring** — this proposal. *(this PR — draft, no implementation yet)* -3. **Glass mocks → tomography.** -4. **Input pipeline → tomography.** - -This PR is the proposal only. Implementation follows once the foundation merge lands and -the shape is agreed. - ---- - -*— Claude on behalf of Cail* diff --git a/.felt/sp-validation-restructuring/report.html b/.felt/sp-validation-restructuring/report.html deleted file mode 100644 index 7e9530b8..00000000 --- a/.felt/sp-validation-restructuring/report.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - -sp_validation — restructuring proposal - - - - - - -
- -
- 2026 · 06 · 05 - ·sp_validation - ·restructuring · autonomous checkpoint -
- -

Restructuring sp_validation.

-

One organizing principle — the things you run live at the top — a clean three-way split between analysis, papers, and scratch, and a modular workflow built for more than one person.

- -
- -
-
§ Current state · interactive session · 2026 · 06 · 05
-

Decisions settled; the rest of the suite is on a Codex shuttle.

-
-

Cail attached and we did the testing pass together. The decisions below are made (see § Decisions); the four remaining back-pressure guards (②③⑤⑥) are dispatched to an autonomous Codex shuttle — the back-pressure-suite child fiber — so the live session stays free for design (workflow modularity, Phase-2 move sequencing). The Codex worker shares this tree but is constrained to add-only test files; the driver stays hands-off-git while it runs. Phase 2 (the moves) begins once the suite lands and we tidy the branch.

-
-
-

Foundation folded + back-pressure begun (the autonomous checkpoint that opened this session): branch cleanup/restructuring is pushed; PR #188 is reopened and carries the real implementation (its branch restructuring/proposal was fast-forwarded to it). develop is untouched — propose-never-commit held.

-
# cleanup/restructuring — 5 commits on top of develop (574f4bf)
-e993b9c  test: back-pressure guard #1 — imports / first-party resolution
-fdd9008  chore: restore glass-mock cosmosis-config ignores dropped in merge
-1a8b786  chore: gitignore generated apidoc stubs and uv.lock
-d14fc07  fix: add mnu to planck_defaults so bare get_cosmo() resolves
-dd8fc68  Merge sachaguer/develop foundation (PR #192 head, c22f075)
-

Foundation (item 1) — in. Sacha's sachaguer:develop (120 files: paper plots, harmonic configs, the cosmo_val.py/cosmology.py library changes) is merged. The lone blocker — cosmology.py KeyError: 'mnu' (planck_defaults had no mnu key, killing every bare get_cosmo()) — is fixed by one line, and test_cosmology.py passes 26/26 in the container. The .gitignore conflict was resolved toward develop: sacha's broad bans (*.png *.sh *.fits *.out *.err) were rejected, not adopted.

-

Back-pressure guard #1 (your #1) — green. tests/test_imports.py: 42 passed, 1 xfailed in the container. It imports every library module for real and resolves every sp_validation.* import named by the standalone scripts/ (via ast, no execution — several scripts run work at import, one isn't even a valid module name). This is the first thing to go red on a bad git mv.

-

Clean base. Generated apidoc stubs (docs/source/sp_validation.*) and the never-tracked uv.lock are now gitignored; the merge had silently un-ignored ~700 generated glass-mock cosmosis configs (sacha dropped develop's patterns) — restored. Working tree matches develop's baseline.

-
-
- -
- -
-
§ Findings
-

What the guards and the survey turned up.

-
    -
  • A dead script, caught immediately. scripts/plot_leakage.py does from sp_validation.correlation import * — a module that has never existed in this tree. Guard #1 flagged it on first run; marked xfail(strict=True) so the baseline is honest and the marker flips the moment it's fixed or deleted. Triage (fix vs delete) belongs to the scripts/ curation pass.
  • -
  • Path breakage is this reorg's dominant risk. 117 hardcoded absolute paths (/home/…, /n17data/…, /automnt/…) live in tracked .py/.yaml/.ini — concentrated in the paper-plot dirs (catalog_paper_plot, 2D_harmonic_space…, 2D_bmodes_paper_workflow/scripts) and scripts/. (Up from the ~35 the plan estimated — Sacha's folded code added more.) Cail's call: we don't rewrite these to repo-relative — they stay messy. The realistic guard is the Candide-local existence checker (③): assert the paths exist where this runs, rather than chasing a clean results/.
  • -
  • No console-scripts. pyproject.toml declares no [project.scripts], so invariant #2 (entry-point resolution) is a no-op here — folded into guard #1's coverage rather than built separately.
  • -
-
- -
- -
-
§ Back-pressure suite · finalized with Cail
-

One guard green; four more on a Codex shuttle, before a file moves.

-

The principle (yours): write characterization guards that are green on the pre-reorg tree, then do the move in small git mv steps keeping every guard green. The suite was refined live — simpler and more honest than the first sketch:

-
    -
  • ① Imports / first-party resolution — GREEN, done. tests/test_imports.py walks the package and scripts/. The model for the rest.
  • -
  • ② Snakemake dry-run passes — on the shuttle. Not a golden/identity test — just snakemake -n exits 0. We don't care about the weather; it's fine if rules change. (Codex probes first — bmodes may be broken or slow; if so that's signal, reported not hidden.)
  • -
  • ③ Config-path existence (Candide-local) — on the shuttle. The reframe of the dead path-translation idea: load every config, assert each referenced path exists on this machine. Skips cleanly off-host.
  • -
  • ⑤ Symlink integrity — on the shuttle. Every tracked symlink resolves. Cheap; moves silently break these.
  • -
  • ⑥ Dangling-reference grep — on the shuttle (harness). Parameterised by a move-map that's empty now (trivially green); activates the moment moves begin.
  • -
-

Dropped, with reasons: entry-point resolution (no [project.scripts]); no-work-lost content manifest (too strong — brutal deletes); package-install (CI already builds the image + runs pytest); output-schema/value invariance (needs cluster data, reference run unreliable, “tests specific code” — deferred until that code changes).

-
- -
- -
-
§ Decisions — settled this session
-

The three open calls, made; branch tidy deferred on purpose.

-
    -
  • Branch topology — deferred until the tests land. cleanup/restructuring and restructuring/proposal are duplicate names for one line of work (#188's head is restructuring/proposal). Cail wants one clean branch = Sacha's merge + restructuring on top, no work lost; names don't matter. Doing it now would break the Codex shuttle's branch, so it waits. Then: collapse to one, close #189 (foundation stub, superseded by folding into #188), keep #190/#191 as tomography stubs.
  • -
  • uv.lock — left gitignored. Cail lukewarm; container is canonical. One-line flip later if we want pinned-dep reproducibility.
  • -
  • Paths — existence-checker, not translation. The 117-absolute-path sweep is off; they stay messy; guard ③ checks existence on Candide instead.
  • -
-
- -
- -
-
§ The shape
-

Runnable things become top-level siblings.

-

Today cosmo_val is buried inside notebooks/ while cosmo_inference/ is top-level — so you constantly hunt for where each one lives. The fix: the things a person actually runs sit side by side at the top, sharing library code in src/ underneath.

- -
sp_validation/
-├── src/sp_validation/   library code (+ glass_mock core)
-├── cosmo_val/           validation: code + config        (promoted from notebooks/)
-├── cosmo_inference/     inference: code + config         (cosmosis / cosmocov)
-├── workflow/            ALL analysis — modular Snakemake, multi-person → results/
-├── papers/              final-figure assembly only (PDF, colour, layout)
-├── scripts/            real reduction scripts (catalog builders, masking)
-├── scratch/            per-person — ad hoc work + personal workflows (tracked)
-├── notebooks/          curated to official demos / tutorials
-├── results/            analysis products + diagnostic plots (contents gitignored)
-└── docs/  tests/  config/
- -
- new / restructured - kept (some curated) - deleted: defunct/, scratchy notebooks -
-
- -
- -
-
§ Division of labor
-

Analysis, papers, scratch.

- -
-
-
workflow/
-

All analysis. Generic, reusable, modular, organized for multiple people. Makes diagnostic plots too — they go to results/. The bulk of the work lives here.

-
-
-
papers/
-

Final-figure assembly only — the figure PDF, colours, layout, recombining data for presentation. Tied to one paper, and may never touch Snakemake.

-
-
-
scratch/
-

Personal and ad hoc. Experiments and one-off custom workflows. Tracked, because seeing each other's scratch is useful.

-
-
- -

The line: everything up to the inputs of a paper figure is analysis, and belongs in the workflow. The figure itself is presentation, and belongs to the paper.

-
- -
- -
-
§ How the workflow scales
-

Modular, not monolithic.

-

Nothing in this analysis is computed once — the catalog changed ~20× in the first release suite, and every paper varies the data vector, covariance, and inference. So the workflow is parameterized: the rules are shared, the config changes each time. Snakemake's module directive imports the rules under your own config and an output prefix, and lets you override any single rule:

- -
module analysis:
-    snakefile: "../../workflow/Snakefile"
-    config:    config              # this run's catalog, cuts, blind
-    prefix:    "results/bmodes"    # products land here — no clobbering
-
-use rule * from analysis
-# swap is per-rule: redefine just the data-vector rule to override it
- -

One top-level results/; each run namespaces under results/<name>/ via the prefix, so people don't clobber each other. A --dry-run on each composition is the safety net that lets the structure grow without silent breakage.

-
- -
- -
-
§ Cleanup
-

Delete, curate, discipline.

-
    -
  • Delete defunct/ (quarantined since 2024) and the exploratory 2021–22 notebooks. It all stays in git history.
  • -
  • Curate notebooks/ to official demos and tutorials; personal scratchy ones move to scratch/.
  • -
  • Discipline via tooling, not bans: nbstripout strips notebook outputs on commit (the repo's weight today is committed notebook outputs), plus a pre-commit size hook.
  • -
  • Path translation — collecting the paper dirs breaks ~35 hardcoded absolute paths; a mechanical sweep rewrites them (scripts included) to the single repo-relative results/.
  • -
-
- -
- -
-
§ The milestone
-

A suite of PRs, in sequence.

-
    -
  1. Foundation — Sacha's pending code. folded into #188
  2. -
  3. Restructuring — proposal and implementation. this PR · #188 · foundation in, guard #1 green
  4. -
  5. Glass mocks → tomography. #190 · stub
  6. -
  7. Input pipeline → tomography. #191 · stub
  8. -
-

#188 is no longer proposal-only: the foundation is folded in and the back-pressure suite has started. The remaining moves (Phase 2) proceed in small git mv steps behind green guards, and were deliberately not forced unattended — see the open questions above.

-
- -
- - diff --git a/.felt/sp-validation-restructuring/restructuring-docs/restructuring-docs.md b/.felt/sp-validation-restructuring/restructuring-docs/restructuring-docs.md deleted file mode 100644 index 894350ad..00000000 --- a/.felt/sp-validation-restructuring/restructuring-docs/restructuring-docs.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -id: 01KV8CY7DE98WZ4PCQPFYZZYXM -name: 'Document the new layout: READMEs + live Sphinx docs' -status: closed -tags: - - reorg - - sp-validation - - docs -created-at: 2026-06-16T14:21:35.022384605Z -updated-at: 2026-06-16T14:36:25.659158626Z -closed-at: 2026-06-16T14:36:25.65915811Z -outcome: 'DONE on cleanup/restructuring. Layout now visible in-tree: structural READMEs for workflow/papers/cosmo_val/scripts/results (matching scratch/), a ''Repository layout'' section in the top-level README, and docs/source/repository_structure.rst wired into the Sphinx toctree so it deploys to gh-pages. Reflects the final shape (notebooks/ gone, glass_mock folded into src/).' ---- diff --git a/.felt/sp_validation.md b/.felt/sp_validation.md deleted file mode 100644 index 4c709722..00000000 --- a/.felt/sp_validation.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: 01KTS1935KZXP7D7FMH1YPSXFZ -name: 'sp_validation: shear catalogue validation & cosmology inference' -tags: - - sp-validation - - unions -created-at: 2026-06-10T17:09:11.731447882+02:00 -outcome: 'Root: CosmoStat/sp_validation — Sacha+Martin+Cail shared repo; restructuring (#197) in flight, tomography extensions (#190/#191) queued behind it.' ---- diff --git a/.felt/sp_validation/reserved-sasha/reserved-sasha.md b/.felt/sp_validation/reserved-sasha/reserved-sasha.md deleted file mode 100644 index 014de4b0..00000000 --- a/.felt/sp_validation/reserved-sasha/reserved-sasha.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -id: 01KVHAG0FSYA0Y6F5JDGTT6VNR -name: 'Reserved: Sasha''s sp_validation work (don''t touch)' -tags: - - sp-validation - - reserved - - guerrini -created-at: 2026-06-20T03:32:01.913796095+02:00 -updated-at: 2026-06-20T03:32:01.913796095+02:00 -outcome: 'Hands-off zones owned by Sasha (Sacha Guerrini) on sp_validation: scratch/guerrini/ entirely, and the namaster_utils → source migration + Gaussian-sims de-duplication, which he reserved for HIS NEXT PR in the #197 review. Future workers/agents: do not refactor these; only mechanical import-path updates forced by a library change are OK (and should be flagged).' ---- diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c2be73bd..a0f36765 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,21 +1,34 @@ name: Lint -# Lint gate for `develop` — warn locally, account here. +# Lint gate for `develop` — warn locally, fix-and-account here. # -# The model (settled with Cail + Sacha, 2026-06-23/30): +# The model (settled with Cail + Sacha, 2026-06-23/30; autofix added 2026-07-10): # * Locally, ruff auto-applies safe fixes and only WARNS on the rest (see # .pre-commit-config.yaml) — you commit freely. # * Getting into `develop` is gated. This job runs the FULL ruff policy -# (`ruff check .` + `ruff format --check .`, region-aware per pyproject.toml) -# and on any failure it (1) fails the job RED so the check blocks the merge, -# and (2) tells the author what to fix — in the surface that fits the event: -# - On a PR → posts/updates a COMMENT on the PR itself, with the full -# violation list (and ruff annotations in the run's Checks view). The -# author sees it where they already are; no disconnected issue. The -# comment turns green when ruff passes. -# - On a direct push to develop → there's no PR to comment on, so it opens -# (or updates) ONE lint-debt issue for the committer, @-mentioning and -# assigning them. Auto-closes when their next push is clean. +# (`ruff check .` + `ruff format --check .`, region-aware per pyproject.toml). +# What happens next depends on the event: +# +# - On a same-repo PR (head branch lives in THIS repo, not a fork) → the gate +# doesn't just report; it FIXES. If the first pass isn't clean it runs +# `ruff check --fix-only` + `ruff format`, commits the diff as the +# github-actions bot, and pushes it back to the PR branch. Then it re-runs +# ruff on the fixed tree IN THE SAME RUN and gates on THAT: if formatting + +# safe fixes cleaned everything → job GREEN, comment says autofix was +# pushed; if anything survives (unsafe/judgement lint — undefined names, +# unused vars) → job RED, comment lists ONLY the residual (the mechanical +# stuff is already fixed). Contributors mostly never touch ruff by hand. +# +# - On a fork PR (read-only token, can't push to the fork's branch) → the old +# behaviour: run the checks, and on failure (1) fail RED so the check blocks +# the merge, (2) post/update a COMMENT on the PR with the full violation +# list. The comment turns green when ruff passes. +# +# - On a direct push to develop → there's no PR to comment on, so on failure +# it opens (or updates) ONE lint-debt issue for the committer, @-mentioning +# and assigning them. Auto-closes when their next push is clean. (No autofix +# here — pushing a bot commit onto develop would be its own event.) +# # * If ruff itself can't run (network, bad version), the job goes red but says # nothing — that's infra, not the committer's lint debt. # @@ -23,17 +36,25 @@ name: Lint # branches stay quiet (too noisy otherwise). `workflow_dispatch` is for manual # testing of the gate itself. # -# Why `pull_request_target` for PRs: commenting on a PR needs a write token, and -# PRs from forks (e.g. sachaguer/) get a read-only token under the plain -# `pull_request` event. `pull_request_target` runs this workflow from the BASE -# branch (so the workflow definition is trusted) with a write token, while we -# check out the PR head ONLY to lint it. Two hardening measures make running -# tooling over untrusted PR code safe here: ruff is a static analyzer (it parses -# files, never imports/executes them), and `uvx --no-config` makes uv ignore any -# `uv.toml`/`[tool.uv]` in the PR tree, so a malicious PR can't redirect ruff's -# download to a trojaned index. The checkout also drops its git credentials. -# (A PR can still edit `[tool.ruff]` to weaken its own policy, but that's visible -# in the diff and reviewed like any other change.) +# Why `pull_request_target` for PRs: commenting on (and pushing to) a PR needs a +# write token, and PRs from forks (e.g. sachaguer/) get a read-only token under +# the plain `pull_request` event. `pull_request_target` runs this workflow from +# the BASE branch (so the workflow definition is trusted) with a write token, +# while we check out the PR head ONLY to lint it. Two hardening measures make +# running tooling over untrusted PR code safe here: ruff is a static analyzer (it +# parses files, never imports/executes them), and `uvx --no-config` makes uv +# ignore any `uv.toml`/`[tool.uv]` in the PR tree, so a malicious PR can't +# redirect ruff's download to a trojaned index. The checkout also drops its git +# credentials. (A PR can still edit `[tool.ruff]` to weaken its own policy, but +# that's visible in the diff and reviewed like any other change.) +# +# Why the autofix push is safe under pull_request_target: we run ONLY ruff over +# the untrusted tree (static, never executes PR code), and we push back ONLY the +# diff ruff itself produced — no PR-authored script runs with our write token. +# The push uses the workflow token explicitly (the checkout keeps +# persist-credentials: false), and a GITHUB_TOKEN push does NOT trigger a new +# workflow run — so no recursion, but also no fresh CI on the bot commit, which +# is exactly why we re-lint and gate in THIS run rather than waiting for a rerun. on: push: @@ -48,7 +69,7 @@ concurrency: cancel-in-progress: true permissions: - contents: read + contents: write # push ruff autofix commit back to a same-repo PR branch issues: write # develop-push lint-debt issue pull-requests: write # PR lint comment @@ -67,6 +88,19 @@ jobs: - name: Install uv uses: astral-sh/setup-uv@v3 + # Is this a PR whose head branch lives in THIS repo (not a fork)? Only then + # can we push an autofix commit back to it with the workflow token. + - name: Decide whether autofix can push + id: mode + shell: bash + run: | + if [ "${{ github.event_name }}" = "pull_request_target" ] && \ + [ "${{ github.event.pull_request.head.repo.full_name }}" = "${{ github.repository }}" ]; then + echo "autofix=true" >> "$GITHUB_OUTPUT" + else + echo "autofix=false" >> "$GITHUB_OUTPUT" + fi + # Run the checks WITHOUT failing the step — we post feedback before turning # the job red. `ruff@` matches the pre-commit version; `--no-config` # neutralizes any uv config in the (untrusted) PR tree. @@ -102,20 +136,109 @@ jobs: echo "passed=false" >> "$GITHUB_OUTPUT" fi + # ── Autofix (same-repo PRs only) ────────────────────────────────────────── + # The first pass found something on a branch we can push to: apply ruff's + # own fixes (safe lint fixes + formatting), commit the diff as the bot, and + # push it back. SAFE under pull_request_target: only ruff runs over the PR + # tree (static, never executes it), and only ruff's own diff is pushed — no + # PR-authored code touches our write token. Then re-lint the FIXED tree in + # this same run: a GITHUB_TOKEN push doesn't trigger a new workflow, so the + # residual pass/fail we compute here is what the gate reports. + - name: Ruff autofix + push (same-repo PR) + id: autofix + if: >- + steps.mode.outputs.autofix == 'true' && + steps.ruff.outputs.tool_error == 'false' && + steps.ruff.outputs.passed == 'false' + shell: bash + run: | + # `check --fix-only` exits 1 when unfixable violations remain even + # after applying every safe fix, so don't let that abort the step. + uvx --no-config ruff@0.15.18 check --fix-only . || true + uvx --no-config ruff@0.15.18 format . || true + + set -e + if git diff --quiet; then + # ruff couldn't fix anything (all issues are unsafe/judgement calls): + # nothing to push. The gate falls back to the first-pass result and + # the original report already lists these — no autofix comment. + echo "pushed=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + git config user.name 'github-actions[bot]' + git config user.email '41898282+github-actions[bot]@users.noreply.github.com' + git add -A + git commit -m "ruff autofix (format + safe lint fixes)" \ + -m "Pushed by the lint gate." + + # Push back to the PR HEAD branch. The checkout kept + # persist-credentials: false, so authenticate the push explicitly with + # the workflow token via the remote URL. + BRANCH='${{ github.event.pull_request.head.ref }}' + REPO='${{ github.event.pull_request.head.repo.full_name }}' + git push "https://x-access-token:${{ github.token }}@github.com/${REPO}.git" "HEAD:${BRANCH}" + echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" + echo "pushed=true" >> "$GITHUB_OUTPUT" + + # Re-lint the FIXED tree — this is what the gate reports (no rerun comes). + set +e + uvx --no-config ruff@0.15.18 check . --output-format=concise > check2.txt 2>&1; check_rc=$? + uvx --no-config ruff@0.15.18 format --check . > format2.txt 2>&1; fmt_rc=$? + set -e + { + echo "### Residual \`ruff check .\` (after autofix)" + if [ "$check_rc" -eq 0 ]; then echo; echo "✅ clean"; else echo; echo '```'; cat check2.txt; echo '```'; fi + echo + echo "### Residual \`ruff format --check .\` (after autofix)" + if [ "$fmt_rc" -eq 0 ]; then echo; echo "✅ clean"; else echo; echo '```'; cat format2.txt; echo '```'; fi + } > residual.md + + if [ "$check_rc" -eq 0 ] && [ "$fmt_rc" -eq 0 ]; then + echo "residual_passed=true" >> "$GITHUB_OUTPUT" + else + echo "residual_passed=false" >> "$GITHUB_OUTPUT" + fi + + # Resolve the outcome the gate reports. For a same-repo PR that got an + # autofix push, the residual pass/fail on the FIXED tree supersedes the + # first pass (that's what's now on the branch); otherwise the first pass + # stands. `pushed`/`residual` are surfaced so the comment can say so. + - name: Resolve gate outcome + id: gate + if: steps.ruff.outputs.tool_error == 'false' + shell: bash + run: | + if [ "${{ steps.autofix.outputs.pushed }}" = "true" ]; then + echo "passed=${{ steps.autofix.outputs.residual_passed }}" >> "$GITHUB_OUTPUT" + echo "autofixed=true" >> "$GITHUB_OUTPUT" + echo "sha=${{ steps.autofix.outputs.sha }}" >> "$GITHUB_OUTPUT" + echo "report_file=residual.md" >> "$GITHUB_OUTPUT" + else + echo "passed=${{ steps.ruff.outputs.passed }}" >> "$GITHUB_OUTPUT" + echo "autofixed=false" >> "$GITHUB_OUTPUT" + echo "report_file=report.md" >> "$GITHUB_OUTPUT" + fi + # Feedback is a side effect — never let it red a clean run. - name: Tell the author (PR comment) or record it (develop-push issue) if: steps.ruff.outputs.tool_error == 'false' continue-on-error: true uses: actions/github-script@v7 env: - PASSED: ${{ steps.ruff.outputs.passed }} + PASSED: ${{ steps.gate.outputs.passed }} + AUTOFIXED: ${{ steps.gate.outputs.autofixed }} + AUTOFIX_SHA: ${{ steps.gate.outputs.sha }} + REPORT_FILE: ${{ steps.gate.outputs.report_file }} with: script: | const fs = require('fs'); const passed = process.env.PASSED === 'true'; + const autofixed = process.env.AUTOFIXED === 'true'; + const autofixSha = (process.env.AUTOFIX_SHA || '').slice(0, 7); const { owner, repo } = context.repo; const runUrl = `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`; - const report = passed ? '' : fs.readFileSync('report.md', 'utf8'); + const report = passed ? '' : fs.readFileSync(process.env.REPORT_FILE, 'utf8'); // ---- PR: speak on the PR itself (comment, auto-updating) ---------- if (context.eventName === 'pull_request_target') { @@ -128,22 +251,35 @@ jobs: const mine = comments.find(c => c.body && c.body.includes(MARKER)); if (passed) { - // Only update an existing comment to green; don't post on a PR + // Clean now. If we got here by pushing an autofix, say so (the + // push is why the branch changed under the author). Otherwise + // only update an existing comment to green — don't post on a PR // that was never dirty. + const body = autofixed + ? `🤖 **autofix pushed \`${autofixSha}\`, ruff is clean** — formatting and safe lint fixes were applied for you; nothing else to do. ${MARKER}` + : `✅ **ruff is clean** — nothing to fix here. ${MARKER}`; if (mine) { - await github.rest.issues.updateComment({ - owner, repo, comment_id: mine.id, - body: `✅ **ruff is clean** — nothing to fix here. ${MARKER}`, - }); + await github.rest.issues.updateComment({ owner, repo, comment_id: mine.id, body }); + } else if (autofixed) { + await github.rest.issues.createComment({ owner, repo, issue_number: pr.number, body }); } core.info('PR clean.'); return; } + const intro = autofixed + ? [ + `### 🔴 ruff — residual issues after autofix`, + ``, + `@${author} — I pushed \`${autofixSha}\` with the formatting and safe lint fixes, but these need a human and still block the merge into \`develop\`:`, + ] + : [ + `### 🔴 ruff found lint / format issues`, + ``, + `@${author} — these block the merge into \`develop\`. Full list below (also surfaced as annotations in the CI run):`, + ]; const body = [ - `### 🔴 ruff found lint / format issues`, - ``, - `@${author} — these block the merge into \`develop\`. Full list below (also surfaced as annotations in the CI run):`, + ...intro, ``, report, ``, @@ -233,8 +369,11 @@ jobs: # Red → blocks the merge. `always()` so a hiccup in the feedback step above # can't suppress the red on genuine lint debt; a tooling error also reds. + # A tooling error means `gate` was skipped (its outputs are empty), so test + # it first; otherwise the resolved gate outcome (post-autofix on same-repo + # PRs, first-pass elsewhere) decides. - name: Fail the job if the gate didn't pass - if: always() && steps.ruff.outputs.passed == 'false' + if: always() && (steps.ruff.outputs.tool_error == 'true' || steps.gate.outputs.passed == 'false') run: | if [ "${{ steps.ruff.outputs.tool_error }}" = "true" ]; then echo "::error::ruff could not run (network / version) — gate inconclusive, blocking." diff --git a/.gitignore b/.gitignore index f8eec899..82fb2697 100644 --- a/.gitignore +++ b/.gitignore @@ -122,7 +122,7 @@ venv.bak/ # and the lockfile has never been tracked. Ignore it rather than commit a # pinned-dep reproducibility promise the project hasn't made. Flip to tracked # if we decide to pin deps via uv. -uv.lock +# uv.lock is committed — it is the reproducible pin the container installs from. # Spyder project settings .spyderproject @@ -177,13 +177,10 @@ cosmo_inference/cosmosis_config/glass_mocks_v* # repo, so these are script/notebook outputs, not LaTeX-tracked figures. papers/catalog/plots/*.pdf -# felt — track the fiber records (engineering decisions & findings); skip only -# the regenerable index and runtime locks. -.felt/*.db -.felt/*.db-shm -.felt/*.db-wal -.felt/*.lock -.felt/index-sync.* +# felt fiber store: canonical copy lives in ~/loom (git-synced privately); +# .felt here is a machine-local symlink into it. Never track it in this repo. +/.felt/ +/.felt # Claude Code agent worktrees — transient isolated checkouts for background # agents; never tracked. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 35d5e659..00a8d907 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -70,17 +70,26 @@ undefined names, unused variables, other judgement calls — is printed as a **warning** and never blocks the commit. Judgement-call lint stays out of your way locally; the gate below is where it's enforced. -**`develop` is the gate.** On every push to `develop` and every PR into it, CI -runs the full ruff policy. If it fails, the check goes **red and blocks the -merge**, and the bot tells you what to fix where you already are: - -- **On a PR** → it posts (and keeps updating) a **comment on the PR** listing the - violations (also surfaced as annotations in the CI run). Push a fix and the - comment turns green. +**`develop` is the gate — and on a PR it fixes for you.** On every push to +`develop` and every PR into it, CI runs the full ruff policy. + +- **On a PR from a branch in this repo** → the gate doesn't just report, it + **fixes**: it runs `ruff format` + `ruff check --fix` and **pushes the result + back to your branch as the `github-actions` bot**, then re-checks. If that + cleaned everything, the PR comment goes green (`🤖 autofix pushed …, ruff is + clean`) and there's nothing to do — just `git pull` to pick up the commit. If + anything ruff *won't* safely fix survives (undefined names, unused variables, + other judgement calls), the check stays **red** and the comment lists **only + the residual** — the mechanical stuff is already handled. So you rarely touch + ruff by hand; when you do, it's the real judgement calls. +- **On a PR from a fork** (where CI can't push to your branch) → it posts (and + keeps updating) a **comment on the PR** with the full violation list. Push a + fix and the comment turns green. - **On a direct push to `develop`** (no PR) → it opens (or updates) a single **lint-debt issue assigned to you**, which auto-closes when CI is green. -So: warn while you work, clean before it lands. +So: warn while you work, and for same-repo PRs the gate mostly cleans up after +you before it lands. ## Commit hygiene (notebooks & large files) diff --git a/Dockerfile b/Dockerfile index c791877c..7df622a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,24 +12,28 @@ RUN apt-get update -y --quiet --fix-missing && \ npm \ tmux -# The base image installs into the system interpreter (/usr/local); use `uv pip` -# so the heavy scientific stack and our deps land where `python` resolves. -RUN uv pip install --no-cache-dir \ - snakemake - -# The base shapepipe image ships cs_util 0.1.9, and `uv pip install -e` does NOT -# upgrade an already-satisfied dependency to meet a *new* lower bound (astral-sh/uv -# #8410). sp_validation now needs `cs_util.size` (cs_util>=0.2.1), so upgrade it -# explicitly here — otherwise the editable install silently keeps 0.1.9 and the -# galaxy import smoke test fails. shear_psf_leakage@develop allows cs-util<0.3, -# so 0.2.x satisfies the whole graph. -RUN uv pip install --no-cache-dir --upgrade 'cs_util>=0.2.1' +# The base shapepipe image provides a uv-managed venv at /app/.venv (exported as +# VIRTUAL_ENV); install sp_validation's deps into that same venv rather than +# spawning a second one under /sp_validation. +ENV UV_PROJECT_ENVIRONMENT=/app/.venv WORKDIR /sp_validation -COPY . /sp_validation -# Install with the test + glass extras so the image can run the unit suite in CI -# *and* the GLASS map-level mock test. `glass` (Generator for Large Scale -# Structure) ships `glass.ext.camb`; `cosmology` provides the `Cosmology` wrapper -# (`Cosmology.from_camb`) GLASS consumes. Both come in via the `[glass]` extra. -RUN uv pip install --no-cache-dir -e '.[test,glass]' +# uv.lock is the SSOT: `uv sync --frozen` installs exactly what it pins, so an +# image build can never silently re-resolve and drift a base-image version (the +# numpy-past-numba drift this lockfile exists to prevent). `--inexact` keeps the +# base image's ShapePipe stack (shapepipe, ngmix, galsim, …) — packages not in +# our lock — instead of pruning them. Copy the lock + manifest first so this +# layer caches independently of source edits. Extras: test (CI unit suite), +# glass (GLASS map-level mock — pulls glass.ext.camb + the cosmology wrapper), +# workflow (Snakemake + mpi4py runners). cs_util 0.2.2 (with cs_util.size) and a +# numba-safe numpy 2.4.6 come straight from the lock, so the old ad-hoc snakemake +# and cs_util `--upgrade` layers are gone. +COPY pyproject.toml uv.lock /sp_validation/ +RUN uv sync --frozen --inexact --no-install-project \ + --extra test --extra glass --extra workflow + +# Install sp_validation itself (editable) into the same venv; deps are already +# satisfied by the sync above. +COPY . /sp_validation +RUN uv pip install --no-deps -e . diff --git a/cosmo_inference/.gitignore b/cosmo_inference/.gitignore index 0b53f63e..cb5922b7 100644 --- a/cosmo_inference/.gitignore +++ b/cosmo_inference/.gitignore @@ -1,6 +1,7 @@ plots/ .ipynb_checkpoints/ data/ +cosmosis_config/output/* *.png *.pdf *.sh \ No newline at end of file diff --git a/cosmo_inference/README.md b/cosmo_inference/README.md index 6da1b94c..5d753010 100644 --- a/cosmo_inference/README.md +++ b/cosmo_inference/README.md @@ -4,7 +4,7 @@ by Lisa Goh and Sacha Guerrini, CEA Paris-Saclay This folder contains the files neccessary to run the cosmological inference pipeline on the UNIONS galaxy catalogues. ### Requirements -To run the pipeline, one would need to have installed [CosmoSIS](https://cosmosis.readthedocs.io/en/latest/) and [CosmoCov](https://github.com/CosmoLike/CosmoCov). To PSF leakage parameters, the fork of [cosmosis-standard-library](https://github.com/sachaguer/cosmosis-standard-library/) of Sacha Guerrini has to be used. +To run the pipeline, one would need to have installed [CosmoSIS](https://cosmosis.readthedocs.io/en/latest/). To sample the PSF leakage parameters, the fork of [cosmosis-standard-library](https://github.com/sachaguer/cosmosis-standard-library/) of Sacha Guerrini has to be used. ### To Run The inference pipeline is now orchestrated through Python. Run the main Snakemake workflow from the parent directory: @@ -15,7 +15,7 @@ snakemake -j inference_fiducial This will automatically execute all steps: 1. Calculate 2PCF ($\xi_{pm}$) via `cosmo_val.py` -2. Compute covariance matrices using CosmoCov +2. Compute covariance matrices using CosmoCov 3. Prepare CosmoSIS data (FITS) via `cosmosis_fitting.py` 4. Run CosmoSIS inference diff --git a/cosmo_inference/cfis_pipeline.sh b/cosmo_inference/cfis_pipeline.sh deleted file mode 100644 index dadab6fb..00000000 --- a/cosmo_inference/cfis_pipeline.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash -read -p 'SHEAR CATALOGUE: ' shear_cat -# read -p 'NZ CATALOGUE: ' nz_cat -read -p 'DATA ROOT: ' root -read -p 'OUT ROOT: ' out_root -# read -p 'BLIND:' blind -mkdir -p data/${root} - -# #################STEP 0: RUN NOTEBOOK TO ANALYSE CATALOGUE; DERIVE PLOTS################## -# #File: cfis_analysis.ipynb - -# ##################STEP 1: CALCULATE XIP/XIM (OUTPUTS TREECORR FITS CATALOG)############### -python treecorr_calc.py $shear_cat $root - -echo -e "2PCF's calculated!\n" - -# # ##################STEP 2: WRITE NZ's###################################################### -# python nz_writeout.py $nz_cat $root $blind - -# echo -e "nz's written out!\n" - -# # # # ##################STEP 3: ESTIMATE COVMATS################################################ - -# # #edit ini file -# mkdir -p data/${root}/covs - -# nz_file="data/${root}/nz_shapepipe_A.txt" - -# # sed -i "/shear_REDSHIFT_FILE/c shear_REDSHIFT_FILE : $nz_file" cosmocov.ini -# # sed -i "/clustering_REDSHIFT_FILE/c clustering_REDSHIFT_FILE : $nz_file" cosmocov.ini -# # sed -i "/outdir/c outdir : data/$root/covs/" cosmocov.ini - -# echo -e "Running CosmoCov...\n" - -# ##run cosmocov -# for i in {1..3}; -# do ../CosmoCov/covs/cov $i cosmocov.ini; -# done - -# # do postprocessing (plot covmat and write into txt file) -# f="data/${root}/covs/cov_${root}"; cat data/${root}/covs/out_cov* > $f; python cosmocov_process.py $f - -# # # # # ##################STEP 4: COMBINE########################################################## -# xip_cat="data/${root}/xiplus_${root}.fits" -# xim_cat="data/${root}/ximinus_${root}.fits" -# covmat="data/${root}/covs/cov_${root}.txt" - -# out_file="$PWD/data/${root}/cosmosis_${root}.fits" - -python cosmosis_fitting.py /n23data1/n06data/lgoh/scratch/CFIS-UNIONS/CFIS-UNIONS_dev/cosmo_inference/data/SP_v1.4_A/xiplus_SP_v1.4_A.fits /n23data1/n06data/lgoh/scratch/CFIS-UNIONS/CFIS-UNIONS_dev/cosmo_inference/data/SP_v1.4_A/ximinus_SP_v1.4_A.fits /n23data1/n06data/lgoh/scratch/CFIS-UNIONS/CFIS-UNIONS_dev/cosmo_inference/data/SP_v1.4_A/covs/cov_SP_v1.4.txt /n23data1/n06data/lgoh/scratch/CFIS-UNIONS/CFIS-UNIONS_dev/cosmo_inference/data/nz/nz_shapepipe_A.txt /n23data1/n06data/lgoh/scratch/CFIS-UNIONS/CFIS-UNIONS_dev/cosmo_inference/data/SP_v1.4_A/cosmosis_SP_v1.4_A.fits - -# # # # ##################STEP 5: RUN COSMOSIS##################################################### -# echo -e "Running CosmoSIS...\n" - -# sed -i "/SCRATCH = /c SCRATCH = $WORK/UNIONS/chains/${out_root}/" cosmosis_config/cosmosis_pipeline.ini -# sed -i "/FITS_FILE = /c FITS_FILE = ${out_file}" cosmosis_config/cosmosis_pipeline.ini -# sed -i "/filename = /c filename = %(SCRATCH)s/samples_${out_root}.txt" cosmosis_config/cosmosis_pipeline.ini - -# #submit cosmosis job to run on cluster - -# sbatch -J cfis_${root} --output=$WORK/UNIONS/cfis_${out_root}.log slurm.sh - -# echo -e "-------------PIPELINE END----------------" - -# # ##################STEP 6: RUN NOTEBOOK TO ANALYSE CONTOURS (WITH GETDIST)################## -# #File: CFIS_plotting.ipynb \ No newline at end of file diff --git a/cosmo_inference/cosmocov_config/cosmocov.ini b/cosmo_inference/cosmocov_config/cosmocov.ini deleted file mode 100644 index 0afbdc64..00000000 --- a/cosmo_inference/cosmocov_config/cosmocov.ini +++ /dev/null @@ -1,80 +0,0 @@ -# -# Cosmological parameters -# -Omega_m : 0.25 -Omega_v : 0.75 -sigma_8 : 0.8 -n_spec : 0.95 -w0 : -1 -wa : 0 -omb : 0.044 -h0 : 0.7 - - -# Survey and galaxy parameters -# -# area in degrees -# n_gal,lens_n_gal in gals/arcmin^2 - -#FOR LENSFIT -#area : 2138 -#sourcephotoz : multihisto -#lensphotoz : multihisto -#source_tomobins : 1 -#lens_tomobins : 1 -#sigma_e : 0.41016433003564806 -#source_n_gal : 10.78 - -#FOR SHAPEPIPE -; area : 3218.19 -; sourcephotoz : multihisto -; lensphotoz : multihisto -; source_tomobins : 1 -; lens_tomobins : 1 -; sigma_e : 0.491712 -; source_n_gal : 8.42 - -#FOR SHAPEPIPE 1500 -; area : 1453 -; sourcephotoz : multihisto -; lensphotoz : multihisto -; source_tomobins : 1 -; lens_tomobins : 1 -; sigma_e : 0.4808326112068524 -; source_n_gal : 7.92 - -#FOR SHAPEPIPE v1.3/v1.4 -area : 2782 -sourcephotoz : multihisto -lensphotoz : multihisto -source_tomobins : 1 -lens_tomobins : 1 -sigma_e : 0.4370966656902571 -; source_n_gal: 7.6 #v1.3 -source_n_gal : 7.18 # v1.4.1 -lens_n_gal : 7.18 - -c_footprint_file: - - -# IA parameters -IA : 1 -A_ia : 0.0 -eta_ia : 0.0 - - -# Covariance paramters -# -# tmin,tmax in arcminutes -tmin : 0.1 -tmax : 250 -ntheta : 20 -ng : 1 -cng : 1 - - -#mkdir before running! -filename : out_cov -ss : true -ls : false -ll : false \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/cosmosis_pipeline.ini b/cosmo_inference/cosmosis_config/cosmosis_pipeline.ini deleted file mode 100644 index f6b11411..00000000 --- a/cosmo_inference/cosmosis_config/cosmosis_pipeline.ini +++ /dev/null @@ -1,89 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -# Specify the directory of your cosmological CosmoSIS library -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -modules = consistency camb load_nz_fits linear_alignment projection 2pt_shear add_xi_sys 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 -timing = T -debug = T - -[runtime] -sampler = metropolis -resume = T -verbosity = debug - -[output] -format = text -lock = F - -[metropolis] -samples = 10000000 - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=all -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=takahashi -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -get_kernel_peaks = F -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[add_xi_sys] -file = %(COSMOSIS_DIR)s/shear/xi_sys/xi_sys_psf.py -data_file=%(FITS FILE)s -rho_stats_name=RHO_STATS - -[tau_from_rho] -file = %(COSMOSIS_DIR)s/shear/xi_sys/tau_from_rho.py -data_file=%(FITS_FILE)s - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like_xi_sys.py -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -data_sets=XI_PLUS XI_MINUS TAU_0_PLUS TAU_2_PLUS -like_name=2pt_like -add_xi_sys=T - -angle_range_XI_PLUS_1_1= 1.0 200.0 -angle_range_XI_MINUS_1_1= 1.0 200.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1.ini b/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1.ini deleted file mode 100644 index efcf75f7..00000000 --- a/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1.ini +++ /dev/null @@ -1,124 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -FITS_FILE = data/SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1/cosmosis_SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1.fits -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1 -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -priors = cosmosis_config/priors_psf.ini -values = cosmosis_config/values_psf.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic 2pt_shear add_xi_sys tau_from_rho 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/test_new_pipeline - -[polychord] -polychord_outfile_root = SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1 -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1/samples_SP_v1.4.5_A_minsep=1_maxsep=250_nbins=20_npatch=1.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_xi_plus shear_xi_minus -verbose = F - -[add_xi_sys] -file = %(COSMOSIS_DIR)s/shear/xi_sys/xi_sys_psf.py -data_file=%(FITS_FILE)s -rho_stats_name=RHO_STATS - -[tau_from_rho] -file = %(COSMOSIS_DIR)s/shear/xi_sys/tau_from_rho.py -data_file=%(FITS_FILE)s - -[2pt_like] -add_xi_sys=T -data_sets=XI_PLUS XI_MINUS TAU_0_PLUS TAU_2_PLUS -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like_xi_sys.py -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_XI_PLUS_1_1= 3.0 150.0 -angle_range_XI_MINUS_1_1= 10.0 200.0 diff --git a/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1.ini b/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1.ini deleted file mode 100644 index 0af5b180..00000000 --- a/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1.ini +++ /dev/null @@ -1,124 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -FITS_FILE = data/SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1/cosmosis_SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1.fits -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1 -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -priors = cosmosis_config/priors_psf.ini -values = cosmosis_config/values_psf.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic 2pt_shear add_xi_sys tau_from_rho 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/test_new_pipeline - -[polychord] -polychord_outfile_root = SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1 -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1/samples_SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_xi_plus shear_xi_minus -verbose = F - -[add_xi_sys] -file = %(COSMOSIS_DIR)s/shear/xi_sys/xi_sys_psf.py -data_file=%(FITS_FILE)s -rho_stats_name=RHO_STATS - -[tau_from_rho] -file = %(COSMOSIS_DIR)s/shear/xi_sys/tau_from_rho.py -data_file=%(FITS_FILE)s - -[2pt_like] -add_xi_sys=T -data_sets=XI_PLUS XI_MINUS TAU_0_PLUS TAU_2_PLUS -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like_xi_sys.py -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_XI_PLUS_1_1= 3.0 150.0 -angle_range_XI_MINUS_1_1= 10.0 200.0 diff --git a/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1.ini b/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1.ini deleted file mode 100644 index d64ac64f..00000000 --- a/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1.ini +++ /dev/null @@ -1,124 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1 -FITS_FILE = data/SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1/cosmosis_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_psf.ini -priors = cosmosis_config/priors_psf.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic 2pt_shear shear_m_bias add_xi_sys tau_from_rho 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1 - -[polychord] -polychord_outfile_root = SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1 -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1/samples_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_xi_plus shear_xi_minus -verbose = F - -[add_xi_sys] -file = %(COSMOSIS_DIR)s/shear/xi_sys/xi_sys_psf.py -data_file=%(FITS_FILE)s -rho_stats_name=RHO_STATS - -[tau_from_rho] -file = %(COSMOSIS_DIR)s/shear/xi_sys/tau_from_rho.py -data_file=%(FITS_FILE)s - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like_xi_sys.py -data_sets=XI_PLUS XI_MINUS TAU_0_PLUS TAU_2_PLUS -add_xi_sys=T -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_XI_PLUS_1_1= 3.0 150.0 -angle_range_XI_MINUS_1_1= 10.0 200.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1_cell.ini b/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1_cell.ini deleted file mode 100644 index 34a7209f..00000000 --- a/cosmo_inference/cosmosis_config/cosmosis_pipeline_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1_cell.ini +++ /dev/null @@ -1,113 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1 -FITS_FILE = data/SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1/cosmosis_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_psf.ini -priors = cosmosis_config/priors_psf.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1_cell - - -[polychord] -polychord_outfile_root = SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1/samples_SP_v1.4.6_A_minsep=1.0_maxsep=250.0_nbins=20_npatch=1_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT_CELL -cut_zeros=F -like_name=2pt_like \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_A_cell.ini deleted file mode 100755 index 70404b87..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_A/cosmosis_SP_v1.4.6.3_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_A/samples_SP_v1.4.6.3_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_A_cell.ini deleted file mode 100755 index dad17f3d..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_A_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_A/cosmosis_SP_v1.4.6.3_leak_corr_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_A/samples_SP_v1.4.6.3_leak_corr_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_A_cell.ini deleted file mode 100755 index e8c48898..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_HMCode_nobar_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_HMCode_nobar_A/cosmosis_SP_v1.4.6.3_leak_corr_HMCode_nobar_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_HMCode_nobar_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_HMCode_nobar_A/samples_SP_v1.4.6.3_leak_corr_HMCode_nobar_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020 -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_A_cell.ini deleted file mode 100755 index e686f245..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_OneCov_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_OneCov_A/cosmosis_SP_v1.4.6.3_leak_corr_OneCov_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_OneCov_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_OneCov_A/samples_SP_v1.4.6.3_leak_corr_OneCov_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_A_cell.ini deleted file mode 100755 index dd46e3e7..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_halofit_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_halofit_A/cosmosis_SP_v1.4.6.3_leak_corr_halofit_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_halofit_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_halofit_A/samples_SP_v1.4.6.3_leak_corr_halofit_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=takahashi -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_A_cell.ini deleted file mode 100755 index 507b2f9a..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_include_large_scales_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_include_large_scales_A/cosmosis_SP_v1.4.6.3_leak_corr_include_large_scales_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_include_large_scales_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_include_large_scales_A/samples_SP_v1.4.6.3_leak_corr_include_large_scales_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 0.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_A_cell.ini deleted file mode 100755 index 028e875c..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=1Mpc_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=1Mpc_A/cosmosis_SP_v1.4.6.3_leak_corr_kmax=1Mpc_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=1Mpc_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=1Mpc_A/samples_SP_v1.4.6.3_leak_corr_kmax=1Mpc_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 500.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_A_cell.ini deleted file mode 100755 index 32c45ad5..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=3Mpc_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=3Mpc_A/cosmosis_SP_v1.4.6.3_leak_corr_kmax=3Mpc_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=3Mpc_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=3Mpc_A/samples_SP_v1.4.6.3_leak_corr_kmax=3Mpc_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1800.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_A_cell.ini deleted file mode 100755 index 92d61b20..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=5Mpc_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=5Mpc_A/cosmosis_SP_v1.4.6.3_leak_corr_kmax=5Mpc_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=5Mpc_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=5Mpc_A/samples_SP_v1.4.6.3_leak_corr_kmax=5Mpc_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 2048.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_A_cell.ini deleted file mode 100755 index aa3784c2..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_large_scales_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_large_scales_A/cosmosis_SP_v1.4.6.3_leak_corr_large_scales_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_large_scales_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_large_scales_A/samples_SP_v1.4.6.3_leak_corr_large_scales_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 800.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_A_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_A_cell.ini deleted file mode 100755 index 1aa71c5f..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_A/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_A_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_small_scales_A -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_small_scales_A/cosmosis_SP_v1.4.6.3_leak_corr_small_scales_A.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_small_scales_A_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_small_scales_A/samples_SP_v1.4.6.3_leak_corr_small_scales_A_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 800.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_B_cell.ini deleted file mode 100755 index db67430b..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_B/cosmosis_SP_v1.4.6.3_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_B/samples_SP_v1.4.6.3_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_B_cell.ini deleted file mode 100755 index d1b15a8f..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_B/cosmosis_SP_v1.4.6.3_leak_corr_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_B/samples_SP_v1.4.6.3_leak_corr_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_B_cell.ini deleted file mode 100755 index ccc62f9f..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_HMCode_nobar_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_HMCode_nobar_B/cosmosis_SP_v1.4.6.3_leak_corr_HMCode_nobar_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_HMCode_nobar_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_HMCode_nobar_B/samples_SP_v1.4.6.3_leak_corr_HMCode_nobar_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020 -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_B_cell.ini deleted file mode 100755 index 20b637ea..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_OneCov_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_OneCov_B/cosmosis_SP_v1.4.6.3_leak_corr_OneCov_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_OneCov_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_OneCov_B/samples_SP_v1.4.6.3_leak_corr_OneCov_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_B_cell.ini deleted file mode 100755 index c3d99809..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_halofit_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_halofit_B/cosmosis_SP_v1.4.6.3_leak_corr_halofit_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_halofit_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_halofit_B/samples_SP_v1.4.6.3_leak_corr_halofit_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = takahashi -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_B_cell.ini deleted file mode 100755 index d724c837..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_include_large_scales_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_include_large_scales_B/cosmosis_SP_v1.4.6.3_leak_corr_include_large_scales_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_include_large_scales_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_include_large_scales_B/samples_SP_v1.4.6.3_leak_corr_include_large_scales_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 0.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_B_cell.ini deleted file mode 100755 index 5991d198..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=1Mpc_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=1Mpc_B/cosmosis_SP_v1.4.6.3_leak_corr_kmax=1Mpc_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=1Mpc_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=1Mpc_B/samples_SP_v1.4.6.3_leak_corr_kmax=1Mpc_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 500.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_B_cell.ini deleted file mode 100755 index fb347172..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=3Mpc_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=3Mpc_B/cosmosis_SP_v1.4.6.3_leak_corr_kmax=3Mpc_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=3Mpc_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=3Mpc_B/samples_SP_v1.4.6.3_leak_corr_kmax=3Mpc_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 1800.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_B_cell.ini deleted file mode 100755 index 4005c10b..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=5Mpc_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=5Mpc_B/cosmosis_SP_v1.4.6.3_leak_corr_kmax=5Mpc_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=5Mpc_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=5Mpc_B/samples_SP_v1.4.6.3_leak_corr_kmax=5Mpc_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 2048.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_B_cell.ini deleted file mode 100755 index 95009a6a..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_large_scales_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_large_scales_B/cosmosis_SP_v1.4.6.3_leak_corr_large_scales_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_large_scales_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_large_scales_B/samples_SP_v1.4.6.3_leak_corr_large_scales_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 800.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_B_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_B_cell.ini deleted file mode 100755 index fd6d8990..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_B/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_B_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_small_scales_B -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_small_scales_B/cosmosis_SP_v1.4.6.3_leak_corr_small_scales_B.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_small_scales_B_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_small_scales_B/samples_SP_v1.4.6.3_leak_corr_small_scales_B_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 800.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_C_cell.ini deleted file mode 100755 index 584a5fbb..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_C/cosmosis_SP_v1.4.6.3_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_C/samples_SP_v1.4.6.3_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_C_cell.ini deleted file mode 100755 index 341a4b7f..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_C_cell.ini +++ /dev/null @@ -1,111 +0,0 @@ -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_C/cosmosis_SP_v1.4.6.3_leak_corr_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_C/samples_SP_v1.4.6.3_leak_corr_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode = power -lmax = 2508 -feedback = 0 -do_reionization = F -kmin = 1e-5 -kmax = 20.0 -nk = 200 -zmax = 5.0 -zmax_background = 5.0 -nz_background = 500 -halofit_version = mead2020_feedback -nonlinear = pk -neutrino_hierarchy = normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file = %(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear = T -position-shear = F -perbin = F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets = CELL_EE -data_file = %(FITS_FILE)s -gaussian_covariance = F -covmat_name = COVMAT -cut_zeros = F -like_name = 2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 - diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_C_cell.ini deleted file mode 100755 index e2b478dd..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_HMCode_nobar_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_HMCode_nobar_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_HMCode_nobar_C/cosmosis_SP_v1.4.6.3_leak_corr_HMCode_nobar_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_HMCode_nobar_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_HMCode_nobar_C/samples_SP_v1.4.6.3_leak_corr_HMCode_nobar_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020 -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_C_cell.ini deleted file mode 100755 index 66e4a192..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_OneCov_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_OneCov_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_OneCov_C/cosmosis_SP_v1.4.6.3_leak_corr_OneCov_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_OneCov_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_OneCov_C/samples_SP_v1.4.6.3_leak_corr_OneCov_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_C_cell.ini deleted file mode 100755 index 0be94bbd..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_halofit_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_halofit_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_halofit_C/cosmosis_SP_v1.4.6.3_leak_corr_halofit_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_halofit_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_halofit_C/samples_SP_v1.4.6.3_leak_corr_halofit_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=takahashi -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_C_cell.ini deleted file mode 100755 index 718ce25d..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_include_large_scales_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_include_large_scales_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_include_large_scales_C/cosmosis_SP_v1.4.6.3_leak_corr_include_large_scales_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_include_large_scales_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_include_large_scales_C/samples_SP_v1.4.6.3_leak_corr_include_large_scales_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 0.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_C_cell.ini deleted file mode 100755 index 69f977d0..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=1Mpc_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=1Mpc_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=1Mpc_C/cosmosis_SP_v1.4.6.3_leak_corr_kmax=1Mpc_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=1Mpc_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=1Mpc_C/samples_SP_v1.4.6.3_leak_corr_kmax=1Mpc_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 500.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_C_cell.ini deleted file mode 100755 index 3ef25704..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=3Mpc_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=3Mpc_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=3Mpc_C/cosmosis_SP_v1.4.6.3_leak_corr_kmax=3Mpc_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=3Mpc_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=3Mpc_C/samples_SP_v1.4.6.3_leak_corr_kmax=3Mpc_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 1800.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_C_cell.ini deleted file mode 100755 index 0b82ecbf..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_kmax=5Mpc_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_kmax=5Mpc_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_kmax=5Mpc_C/cosmosis_SP_v1.4.6.3_leak_corr_kmax=5Mpc_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_kmax=5Mpc_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_kmax=5Mpc_C/samples_SP_v1.4.6.3_leak_corr_kmax=5Mpc_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 2048.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_C_cell.ini deleted file mode 100755 index 3382193d..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_large_scales_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_large_scales_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_large_scales_C/cosmosis_SP_v1.4.6.3_leak_corr_large_scales_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_large_scales_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_large_scales_C/samples_SP_v1.4.6.3_leak_corr_large_scales_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 300.0 800.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_C_cell.ini b/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_C_cell.ini deleted file mode 100755 index 4bc8fe6d..00000000 --- a/cosmo_inference/cosmosis_config/harmonic_space_fiducial_C/cosmosis_pipeline_SP_v1.4.6.3_leak_corr_small_scales_C_cell.ini +++ /dev/null @@ -1,114 +0,0 @@ -#parameters used elsewhere in this file -[DEFAULT] -SCRATCH = /n09data/guerrini/output_chains/SP_v1.4.6.3_leak_corr_small_scales_C -FITS_FILE = /n17data/sguerrini/sp_validation/cosmo_inference/data/SP_v1.4.6.3_leak_corr_small_scales_C/cosmosis_SP_v1.4.6.3_leak_corr_small_scales_C.fits -COSMOSIS_DIR = /home/guerrini/cosmosis-standard-library - - -[pipeline] -values = cosmosis_config/values_ia.ini -priors = cosmosis_config/priors.ini -modules = consistency sample_S8 camb load_nz_fits photoz_bias linear_alignment projection add_intrinsic shear_m_bias 2pt_like -likelihoods = 2pt_like -extra_output = cosmological_parameters/omega_lambda cosmological_parameters/S_8 cosmological_parameters/sigma_8 cosmological_parameters/omega_m -timing = T -debug = T - -[runtime] -sampler = polychord -verbosity = debug - -[test] -save_dir = %(SCRATCH)s/best_fit/ - - -[polychord] -polychord_outfile_root = SP_v1.4.6.3_leak_corr_small_scales_C_cell -live_points = 192 -feedback = 3 -resume = T -base_dir = %(SCRATCH)s/polychord - -[output] -filename = %(SCRATCH)s/SP_v1.4.6.3_leak_corr_small_scales_C/samples_SP_v1.4.6.3_leak_corr_small_scales_C_cell.txt -format = text -lock = F - -[consistency] -file = %(COSMOSIS_DIR)s/utility/consistency/consistency_interface.py -verbose = F - -[sample_S8] -file = %(COSMOSIS_DIR)s/utility/sample_sigma8/sample_S8.py - -[camb] -file = %(COSMOSIS_DIR)s/boltzmann/camb/camb_interface.py -mode=power -lmax=2508 -feedback=0 -do_reionization=F -kmin=1e-5 -kmax=20.0 -nk=200 -zmax=5.0 -zmax_background=5.0 -nz_background=500 -halofit_version=mead2020_feedback -nonlinear=pk -neutrino_hierarchy=normal -kmax_extrapolate = 500.0 - -[load_nz_fits] -file = %(COSMOSIS_DIR)s/number_density/load_nz_fits/load_nz_fits.py -nz_file =%(FITS_FILE)s -data_sets = SOURCE - -[photoz_bias] -file = %(COSMOSIS_DIR)s/number_density/photoz_bias/photoz_bias.py -mode = additive -sample = nz_source -bias_section = nofz_shifts -interpolation = cubic -output_deltaz_section_name = delta_z_out - -[linear_alignment] -file = %(COSMOSIS_DIR)s/intrinsic_alignments/la_model/linear_alignments_interface_znla.py -method = bk_corrected - -[projection] -file = %(COSMOSIS_DIR)s/structure/projection/project_2d.py -ell_min_logspaced = 1.0 -ell_max_logspaced = 25000.0 -n_ell_logspaced = 400 -shear-shear = source-source -shear-intrinsic = source-source -intrinsic-intrinsic = source-source -get_kernel_peaks = F -verbose = F - -[add_intrinsic] -file = %(COSMOSIS_DIR)s/shear/add_intrinsic/add_intrinsic.py -shear-shear=T -position-shear=F -perbin=F - -[shear_m_bias] -file = %(COSMOSIS_DIR)s/shear/shear_bias/shear_m_bias.py -m_per_bin = True -; Despite the parameter name, this can operate on xi as well as C_ell. -cl_section = shear_cl -verbose = F - -[2pt_shear] -file = %(COSMOSIS_DIR)s/shear/cl_to_xi_nicaea/nicaea_interface.so -corr_type = 0 ; shear_cl -> shear_xi - -[2pt_like] -file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py -data_sets=CELL_EE -data_file=%(FITS_FILE)s -gaussian_covariance=F -covmat_name=COVMAT -cut_zeros=F -like_name=2pt_like -angle_range_CELL_EE_1_1 = 800.0 1600.0 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/priors_mock_cell_no_sys.ini b/cosmo_inference/cosmosis_config/priors_mock_cell_no_sys.ini deleted file mode 100644 index 781ae8f7..00000000 --- a/cosmo_inference/cosmosis_config/priors_mock_cell_no_sys.ini +++ /dev/null @@ -1,5 +0,0 @@ -[cosmological_parameters] -ombh2 = gaussian 0.0244 0.00038 - -[nofz_shifts] -bias_1 = gaussian 0.0 0.013 \ No newline at end of file diff --git a/cosmo_inference/cosmosis_config/cosmosis_pipeline_A_ia.ini b/cosmo_inference/cosmosis_config/templates/cosmosis_pipeline_A_ia.ini similarity index 100% rename from cosmo_inference/cosmosis_config/cosmosis_pipeline_A_ia.ini rename to cosmo_inference/cosmosis_config/templates/cosmosis_pipeline_A_ia.ini diff --git a/cosmo_inference/cosmosis_config/cosmosis_pipeline_A_ia_cell.ini b/cosmo_inference/cosmosis_config/templates/cosmosis_pipeline_A_ia_cell.ini similarity index 100% rename from cosmo_inference/cosmosis_config/cosmosis_pipeline_A_ia_cell.ini rename to cosmo_inference/cosmosis_config/templates/cosmosis_pipeline_A_ia_cell.ini diff --git a/cosmo_inference/cosmosis_config/cosmosis_pipeline_A_psf.ini b/cosmo_inference/cosmosis_config/templates/cosmosis_pipeline_A_psf.ini similarity index 100% rename from cosmo_inference/cosmosis_config/cosmosis_pipeline_A_psf.ini rename to cosmo_inference/cosmosis_config/templates/cosmosis_pipeline_A_psf.ini diff --git a/cosmo_inference/cosmosis_config/priors.ini b/cosmo_inference/cosmosis_config/templates/priors.ini similarity index 100% rename from cosmo_inference/cosmosis_config/priors.ini rename to cosmo_inference/cosmosis_config/templates/priors.ini diff --git a/cosmo_inference/cosmosis_config/priors_mock.ini b/cosmo_inference/cosmosis_config/templates/priors_mock.ini similarity index 100% rename from cosmo_inference/cosmosis_config/priors_mock.ini rename to cosmo_inference/cosmosis_config/templates/priors_mock.ini diff --git a/cosmo_inference/cosmosis_config/priors_mock_cell.ini b/cosmo_inference/cosmosis_config/templates/priors_mock_cell.ini similarity index 100% rename from cosmo_inference/cosmosis_config/priors_mock_cell.ini rename to cosmo_inference/cosmosis_config/templates/priors_mock_cell.ini diff --git a/cosmo_inference/cosmosis_config/priors_psf.ini b/cosmo_inference/cosmosis_config/templates/priors_psf.ini similarity index 100% rename from cosmo_inference/cosmosis_config/priors_psf.ini rename to cosmo_inference/cosmosis_config/templates/priors_psf.ini diff --git a/cosmo_inference/cosmosis_config/values_ia.ini b/cosmo_inference/cosmosis_config/templates/values_ia.ini similarity index 100% rename from cosmo_inference/cosmosis_config/values_ia.ini rename to cosmo_inference/cosmosis_config/templates/values_ia.ini diff --git a/cosmo_inference/cosmosis_config/values_psf.ini b/cosmo_inference/cosmosis_config/templates/values_psf.ini similarity index 100% rename from cosmo_inference/cosmosis_config/values_psf.ini rename to cosmo_inference/cosmosis_config/templates/values_psf.ini diff --git a/cosmo_inference/cosmosis_config/values.ini b/cosmo_inference/cosmosis_config/values.ini deleted file mode 100644 index 39d1ec22..00000000 --- a/cosmo_inference/cosmosis_config/values.ini +++ /dev/null @@ -1,27 +0,0 @@ -[cosmological_parameters] -tau = 0.0544 -w = -1.0 -mnu = 0.06 -omega_k = 0.0 -wa = 0.0 -omch2 = 0.10496564589028712 -h0 = 0.7703672811295145 -ombh2 = 0.024364520846452055 -n_s = 1.0378056660322685 -s_8_input = 0.867063981537897 - -[halo_model_parameters] - -[intrinsic_alignment_parameters] -a = 1.2105355520872163 - -[shear_calibration_parameters] -m1 = -0.0019669717507113187 - -[nofz_shifts] -bias_1 = -0.05240296008081707 - -[psf_leakage_parameters] -alpha = 0.017313482956287624 -beta = 1.0863942321436328 - diff --git a/cosmo_inference/cosmosis_config/values_empty.ini b/cosmo_inference/cosmosis_config/values_empty.ini deleted file mode 100644 index 019ede84..00000000 --- a/cosmo_inference/cosmosis_config/values_empty.ini +++ /dev/null @@ -1,27 +0,0 @@ -[cosmological_parameters] -omch2 = 0.12565412726665712 -ombh2 = 0.022190866236551653 -h0 = 0.7030358726770478 -n_s = 0.9289664070330077 -tau = 0.11917908882774889 -s_8_input = 0.8305214945570943 - -[halo_model_parameters] -logt_agn = 7.557408270897992 - -[intrinsic_alignment_parameters] -a = 1.1275705902391073 - -[shear_calibration_parameters] -m1 = -0.055917714943670135 - -[nofz_shifts] -bias_1 = -0.0043115110715487015 - -[psf_leakage_parameters] -alpha = 0.004915858299931063 -beta = 0.811523998498723 - -[planck] -a_planck = 0.9998087705267193 - diff --git a/cosmo_inference/cosmosis_config/values_ia_no_sys.ini b/cosmo_inference/cosmosis_config/values_ia_no_sys.ini deleted file mode 100644 index da390032..00000000 --- a/cosmo_inference/cosmosis_config/values_ia_no_sys.ini +++ /dev/null @@ -1,26 +0,0 @@ -[cosmological_parameters] -omch2 = 0.051 0.120 0.255 -h0 = 0.64 0.7 0.82 -ombh2 = 0.019 0.023 0.026 -n_s = 0.84 0.96 1.1 -S_8_input = 0.1 0.8 1.3 - -tau = 0.0544 -w = -1.0 -mnu = 0.06 -omega_k = 0.0 -wa = 0.0 - -[halo_model_parameters] -logT_AGN = 7.3 7.5 8.0 - -[intrinsic_alignment_parameters] -A = 0.0 - -[shear_calibration_parameters] -m1 = 0.0 - -[nofz_shifts] -bias_1 = -0.1 0.0 0.1 - - diff --git a/cosmo_inference/cosmosis_config/values_ia_test.ini b/cosmo_inference/cosmosis_config/values_ia_test.ini deleted file mode 100644 index 30b2c422..00000000 --- a/cosmo_inference/cosmosis_config/values_ia_test.ini +++ /dev/null @@ -1,27 +0,0 @@ -[cosmological_parameters] -omch2 = 0.051 0.11869577244577488 0.255 -h0 = 0.64 0.6766 0.82 -ombh2 = 0.019 0.0224178568132 0.026 -n_s = 0.84 0.9665 1.1 -#S_8_input = 0.1 0.81 1.3 -S_8_input = 0.1 0.8231408713507062 1.3 - -tau = 0.054 -w = -1.0 -mnu = 0.06 -omega_k = 0.0 -wa = 0.0 - -[halo_model_parameters] -logT_AGN = 7.3 7.8 8.0 - -[intrinsic_alignment_parameters] -A = -5.0 0.0 5.0 - -[shear_calibration_parameters] -m1 = -0.1 0.0 0.1 - -[nofz_shifts] -bias_1 = -0.1 0.0 0.1 - - diff --git a/cosmo_inference/cosmosis_config/values_template.ini b/cosmo_inference/cosmosis_config/values_template.ini deleted file mode 100644 index 60ac60c6..00000000 --- a/cosmo_inference/cosmosis_config/values_template.ini +++ /dev/null @@ -1,23 +0,0 @@ -[cosmological_parameters] -omch2 = 0.01 0.12 0.3 -h0 = 0.55 0.7 0.91 -ombh2 = 0.01 0.023 0.07 -n_s = 0.87 0.96 1.07 -a_s = 0.5e-09 2.9e-09 5.0e-09 - -tau = 0.0544 -w = -1.0 -mnu = 0.06 -omega_k = 0.0 -wa = 0.0 - -[halo_model_parameters] -logt_agn = 6.5 7.81 8.5 - -[nofz_shifts] -bias_1 = -2.0 0.0 2.0 - -[intrinsic_alignment_parameters] -A = -3.0 0.0 3.0 - - diff --git a/cosmo_inference/get_chi2.ipynb b/cosmo_inference/get_chi2.ipynb deleted file mode 100644 index 69d026a2..00000000 --- a/cosmo_inference/get_chi2.ipynb +++ /dev/null @@ -1,1391 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import configparser\n", - "import os\n", - "import subprocess\n", - "\n", - "import healpy as hp\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import scipy.stats as stats\n", - "import seaborn as sns\n", - "from astropy.io import fits\n", - "from getdist import plots\n", - "from IPython.display import Markdown, display\n", - "from scipy.interpolate import interp1d\n", - "\n", - "%matplotlib inline\n", - "# import uncertainties\n", - "\n", - "# Use paper style and seaborn with husl palette\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "# Set default palette - will be updated per plot as needed\n", - "sns.set_palette(\"husl\")\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 40\n", - "\n", - "\n", - "# SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE\n", - "root_dir = \"/n09data/guerrini/output_chains/\"\n", - "\n", - "catalog_version = \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1\"\n", - "\n", - "path_ini_files = \"/home/guerrini/sp_validation/cosmo_inference/cosmosis_config/\"\n", - "\n", - "roots = [\n", - " f\"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_{int(i)}.0_80.0_10.0_80.0\"\n", - " for i in [3, 5, 7, 10, 11]\n", - "]\n", - "\n", - "\"\"\" roots = [\n", - " \"SP_v1.4.5_A\",\n", - " #\"SP_v1.4.5_A_no_IA\",\n", - " #\"SP_v1.4.5_A_no_dz\",\n", - " #\"SP_v1.4.5_A_no_m_bias\",\n", - " \"SP_v1.4.5_A_sc_3_150\",\n", - " \"SP_v1.4.5_A_sc_3_60\",\n", - " \"SP_v1.4.5_A_sc_10_150\",\n", - " \"SP_v1.4.5_A_sc_10_60\",\n", - " \"SP_v1.4.5_A_sc_5_150\",\n", - " \"SP_v1.4.5_A_sc_7_150\",\n", - " #\"SP_v1.4.5_A_no_leakage\"\n", - "] \"\"\"\n", - "\n", - "\"\"\" roots = [\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0\",\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0_no_alpha_beta\"\n", - "] \"\"\"\n", - "\n", - "\n", - "properties = {}\n", - "\n", - "for root in roots:\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - " config.read(path_ini_files + f\"/cosmosis_pipeline_{root}.ini\")\n", - "\n", - " add_xi_sys = config[\"2pt_like\"][\"add_xi_sys\"]\n", - " add_xi_sys = add_xi_sys == \"T\"\n", - " lower_bound_xi_plus, upper_bound_xi_plus = map(\n", - " float, config[\"2pt_like\"][\"angle_range_XI_PLUS_1_1\"].split()\n", - " )\n", - " lower_bound_xi_minus, upper_bound_xi_minus = map(\n", - " float, config[\"2pt_like\"][\"angle_range_XI_MINUS_1_1\"].split()\n", - " )\n", - "\n", - " properties[root] = {\n", - " \"add_xi_sys\": add_xi_sys,\n", - " \"lower_bound_xi_plus\": lower_bound_xi_plus,\n", - " \"upper_bound_xi_plus\": upper_bound_xi_plus,\n", - " \"lower_bound_xi_minus\": lower_bound_xi_minus,\n", - " \"upper_bound_xi_minus\": upper_bound_xi_minus,\n", - " }\n", - "\n", - "\n", - "print(roots)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Retrieve the chains" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# MAKE PARAMNAMES FILE\n", - "\n", - "for root in roots:\n", - " with open(root_dir + \"{}/samples_{}.txt\".format(\"/\" + root, root), \"r\") as file:\n", - " params = file.readline()[1:].split(\"\\t\")[:-4]\n", - " file.close()\n", - "\n", - " with open(\n", - " root_dir + \"{}/getdist_{}.paramnames\".format(\"/\" + root, root), \"w\"\n", - " ) as file:\n", - " for i in range(len(params)):\n", - " if len(params[i].split(\"--\")) > 1:\n", - " file.write(params[i].split(\"--\")[1] + \"\\n\")\n", - " else:\n", - " file.write(params[i].split(\"--\")[0] + \"\\n\")\n", - " file.close()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# READ CHAIN\n", - "\n", - "chains = []\n", - "\n", - "for root in roots:\n", - " samples = np.loadtxt(root_dir + \"{}/samples_{}.txt\".format(root, root))\n", - " print(len(samples))\n", - " if \"nautilus\" in root:\n", - " samples = np.column_stack(\n", - " (np.exp(samples[:, -3]), samples[:, -1] - samples[:, -2], samples[:, 0:-3])\n", - " )\n", - " else:\n", - " samples = np.column_stack((samples[:, -1], samples[:, -3], samples[:, 0:-4]))\n", - " np.savetxt(root_dir + \"{}/getdist_{}.txt\".format(root, root), samples)\n", - "\n", - " chain = g.samples_for_root(\n", - " root_dir + \"{}/getdist_{}\".format(root, root),\n", - " cache=False,\n", - " settings={\"ignore_rows\": 0, \"smooth_scale_2D\": 0.3, \"smooth_scale_1D\": 0.3},\n", - " )\n", - "\n", - " chains.append(chain)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name_list = [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"s_8_input\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - " \"alpha\",\n", - " \"beta\",\n", - "]\n", - "label_list = [\n", - " r\"\\Omega_m\",\n", - " r\"\\omega_b h^2\",\n", - " \"h_0\",\n", - " \"n_s\",\n", - " r\"\\sigma_8\",\n", - " \"S_8\",\n", - " \"log T_{AGN}\",\n", - " \"A_{IA}\",\n", - " \"m_1\",\n", - " r\"\\Delta z_1\",\n", - " \"\\\\alpha_{PSF}\",\n", - " \"\\\\beta_{PSF}\",\n", - "]\n", - "\n", - "for chain in chains:\n", - " param_names = chain.getParamNames()\n", - " for name, label in zip(name_list, label_list):\n", - " param_names.parWithName(name).label = label" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extract the best fit parameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "best_fit = {}\n", - "\n", - "for root, chain in zip(roots, chains):\n", - " print(root)\n", - " likestats = chain.getLikeStats()\n", - " bestfit_idx = np.argmax(chain.loglikes)\n", - " maxlike = chain.loglikes[bestfit_idx]\n", - " print(f\"Maximum Likelihood: {maxlike:.5g}\")\n", - " best_fit[root] = {\"likelihood\": maxlike}\n", - " for i, par in enumerate(likestats.names):\n", - " best_fit[root].update(\n", - " {par.name: np.average(chain.samples[:, i], weights=chain.weights)}\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run `Cosmosis` in test mode to get the data vectors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if not os.path.exists(path_ini_files + \"/values_empty.ini\"):\n", - " content = \"\"\"[cosmological_parameters]\n", - "\n", - "tau = 0.0544\n", - "w = -1.0\n", - "massive_nu = 1\n", - "massless_nu = 2.046\n", - "omega_k = 0.0\n", - "wa = 0.0\n", - "\n", - "[halo_model_parameters]\n", - "\n", - "[intrinsic_alignment_parameters]\n", - "\n", - "[shear_calibration_parameters]\n", - "\n", - "[nofz_shifts]\n", - "\n", - "[psf_leakage_parameters]\n", - "\"\"\"\n", - "\n", - " with open(path_ini_files + \"/values_empty.ini\", \"w\") as f:\n", - " f.write(content)\n", - " f.close()\n", - "\n", - " print(\"File created successfully\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "section_map = {\n", - " \"omch2\": \"cosmological_parameters\",\n", - " \"ombh2\": \"cosmological_parameters\",\n", - " \"h0\": \"cosmological_parameters\",\n", - " \"n_s\": \"cosmological_parameters\",\n", - " \"s_8_input\": \"cosmological_parameters\",\n", - " \"logt_agn\": \"halo_model_parameters\",\n", - " \"a\": \"intrinsic_alignment_parameters\",\n", - " \"m1\": \"shear_calibration_parameters\",\n", - " \"bias_1\": \"nofz_shifts\",\n", - " \"alpha\": \"psf_leakage_parameters\",\n", - " \"beta\": \"psf_leakage_parameters\",\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "env = os.environ.copy()\n", - "env[\"LD_LIBRARY_PATH\"] = (\n", - " \"/home/guerrini/.conda/envs/sp_validation/lib/python3.9/site-packages/cosmosis/datablock:\"\n", - " + env.get(\"LD_LIBRARY_PATH\", \"\")\n", - ")\n", - "\n", - "for root in roots:\n", - " print(root)\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - " config.read(path_ini_files + \"/values_empty.ini\")\n", - " for param, value in best_fit[root].items():\n", - " section = section_map.get(param)\n", - " if section is None:\n", - " continue\n", - " if section not in config:\n", - " config.add_section(section)\n", - " config[section][param] = str(value)\n", - "\n", - " with open(path_ini_files + \"/values_empty.ini\", \"w\") as configfile:\n", - " config.write(configfile)\n", - "\n", - " # Modify the ini file to run in test mode at the best fit\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - " config.read(path_ini_files + f\"/cosmosis_pipeline_{root}.ini\")\n", - "\n", - " sampler = config[\"runtime\"][\"sampler\"]\n", - " config[\"runtime\"][\"sampler\"] = \"test\"\n", - " values = config[\"pipeline\"][\"values\"]\n", - " config[\"pipeline\"][\"values\"] = path_ini_files + \"/values_empty.ini\"\n", - "\n", - " with open(path_ini_files + f\"/cosmosis_pipeline_{root}.ini\", \"w\") as configfile:\n", - " config.write(configfile)\n", - "\n", - " # Run cosmosis\n", - " result = subprocess.run(\n", - " [\"cosmosis\", \"cosmosis_config/cosmosis_pipeline_{}.ini\".format(root)],\n", - " env=env,\n", - " capture_output=True,\n", - " text=True,\n", - " )\n", - " print(f\"STDOUT:\\n{result.stdout}\")\n", - " print(f\"STDERR:\\n{result.stderr}\")\n", - "\n", - " # Modify the ini file to the previous one\n", - " config[\"pipeline\"][\"values\"] = values\n", - " config[\"runtime\"][\"sampler\"] = sampler\n", - "\n", - " with open(path_ini_files + f\"/cosmosis_pipeline_{root}.ini\", \"w\") as configfile:\n", - " config.write(configfile)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compute the $\\chi^2$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "output_folder = \"/n09data/guerrini/output_chains/\"\n", - "\n", - "metrics = {}\n", - "\n", - "for root in roots:\n", - " print(root)\n", - "\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - "\n", - " # Read model tau_stats\n", - " theta_tau = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_0_plus/theta.txt\".format(root)\n", - " )\n", - " theta_tau_arcmin = theta_tau * 180 * 60 / np.pi\n", - " tau_0_model = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_0_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " tau_2_model = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_2_plus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " # Read the data\n", - " data = fits.open(f\"data/{catalog_version}/cosmosis_{catalog_version}.fits\")\n", - "\n", - " theta_data = data[\"XI_PLUS\"].data[\"ANG\"]\n", - " xi_plus_data = data[\"XI_PLUS\"].data[\"VALUE\"]\n", - " xi_minus_data = data[\"XI_MINUS\"].data[\"VALUE\"]\n", - " tau_0_data = data[\"TAU_0_PLUS\"].data[\"VALUE\"]\n", - " tau_2_data = data[\"TAU_2_PLUS\"].data[\"VALUE\"]\n", - "\n", - " # Load the covariance\n", - " cov = data[\"COVMAT\"].data\n", - " cov_xi = cov[0 : 2 * len(xi_plus_data), 0 : 2 * len(xi_plus_data)]\n", - " cov_tau = cov[2 * len(xi_plus_data) :, 2 * len(xi_plus_data) :]\n", - "\n", - " # interpolate the model\n", - " interp_xi_plus = interp1d(\n", - " theta_arcmin, shear_xi_plus, kind=\"cubic\", fill_value=\"extrapolate\"\n", - " )\n", - " interp_xi_minus = interp1d(\n", - " theta_arcmin, shear_xi_minus, kind=\"cubic\", fill_value=\"extrapolate\"\n", - " )\n", - "\n", - " xi_plus_model = interp_xi_plus(theta_data)\n", - " if add_xi_sys:\n", - " xi_plus_model += xi_sys_plus\n", - " xi_minus_model = interp_xi_minus(theta_data)\n", - " if add_xi_sys:\n", - " xi_minus_model += xi_sys_minus\n", - "\n", - " # Concatenate the data vector\n", - " xi_data = np.concatenate((xi_plus_data, xi_minus_data))\n", - " xi_model = np.concatenate((xi_plus_model, xi_minus_model))\n", - "\n", - " tau_data = np.concatenate((tau_0_data, tau_2_data))\n", - " tau_model = np.concatenate((tau_0_model, tau_2_model))\n", - "\n", - " # Apply scale cuts\n", - " mask_xi_plus = (theta_data > lower_bound_xi_plus) & (\n", - " theta_data < upper_bound_xi_plus\n", - " )\n", - " mask_xi_minus = (theta_data > lower_bound_xi_minus) & (\n", - " theta_data < upper_bound_xi_minus\n", - " )\n", - " mask = np.concatenate((mask_xi_plus, mask_xi_minus))\n", - "\n", - " xi_data = xi_data[mask]\n", - " xi_model = xi_model[mask]\n", - " cov_xi = cov_xi[mask][:, mask]\n", - "\n", - " xi_plus_chi2 = np.dot(\n", - " (xi_model - xi_data), np.dot(np.linalg.inv(cov_xi), (xi_model - xi_data))\n", - " )\n", - " tau_chi2 = np.dot(\n", - " (tau_model - tau_data), np.dot(np.linalg.inv(cov_tau), (tau_model - tau_data))\n", - " )\n", - " n_dof_xi = np.sum(mask)\n", - " n_dof_tau = len(tau_0_data) + len(tau_2_data)\n", - " p_value_xi = 1 - stats.chi2.cdf(xi_plus_chi2, n_dof_xi)\n", - " p_value_tau = 1 - stats.chi2.cdf(tau_chi2, n_dof_tau)\n", - " chi2_tot = xi_plus_chi2 + tau_chi2\n", - " n_dof_tot = n_dof_xi + n_dof_tau\n", - " p_value_tot = 1 - stats.chi2.cdf(chi2_tot, n_dof_tot)\n", - "\n", - " metrics[root] = {\n", - " \"chi2_xi\": xi_plus_chi2,\n", - " \"n_dof_xi\": n_dof_xi,\n", - " \"p_value_xi\": p_value_xi,\n", - " \"chi2_tau\": tau_chi2,\n", - " \"n_dof_tau\": n_dof_tau,\n", - " \"p_value_tau\": p_value_tau,\n", - " \"chi2_tot\": chi2_tot,\n", - " \"n_dof_tot\": n_dof_tot,\n", - " \"p_value_tot\": p_value_tot,\n", - " }\n", - " print(\"Done!\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_latex_table(metrics):\n", - " latex_lines = [\n", - " r\"\\begin{tabular}{lccc|ccc|ccc}\",\n", - " r\"\\hline\",\n", - " r\"Root & $\\chi^2_{\\xi^+}$/dof & $p_{\\xi^+}$ & \"\n", - " r\"$\\chi^2_\\tau$/dof & $p_\\tau$ & $\\chi^2_{\\text{tot}}$/dof & $p_{\\text{tot}}$ \\\\\",\n", - " r\"\\hline\",\n", - " ]\n", - "\n", - " for root, vals in metrics.items():\n", - " escaped = root.replace(\"_\", r\"\\_\")\n", - " line = (\n", - " f\"{escaped} & \"\n", - " f\"{vals['chi2_xi']:.2f}/{vals['n_dof_xi']} & {vals['p_value_xi']:.5f} & \"\n", - " f\"{vals['chi2_tau']:.2f}/{vals['n_dof_tau']} & {vals['p_value_tau']:.5f} & \"\n", - " f\"{vals['chi2_tot']:.2f}/{vals['n_dof_tot']} & {vals['p_value_tot']:.5f} \\\\\\\\\"\n", - " )\n", - " latex_lines.append(line)\n", - "\n", - " latex_lines.append(r\"\\hline\")\n", - " latex_lines.append(r\"\\end{tabular}\")\n", - "\n", - " # Print LaTeX table\n", - " print(\"\\n\".join(latex_lines))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "get_latex_table(metrics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def display_markdown(metrics):\n", - " # Build Markdown table\n", - " header = (\n", - " \"| Root | $\\\\chi^2$ (ξ⁺) / dof | p-val (ξ⁺) | $\\\\chi^2$ (τ) / dof | p-val (τ) | $\\\\chi^2$ (tot) / dof | p-val (tot) |\\n\"\n", - " \"|------|----------------|------------|---------------|------------|------------------|--------------|\\n\"\n", - " )\n", - "\n", - " rows = []\n", - " for root, vals in metrics.items():\n", - " row = f\"| `{root}` \"\n", - " row += f\"| {vals['chi2_xi']:.2f} / {vals['n_dof_xi']} \"\n", - " row += f\"| {vals['p_value_xi']:.5f} \"\n", - " row += f\"| {vals['chi2_tau']:.2f} / {vals['n_dof_tau']} \"\n", - " row += f\"| {vals['p_value_tau']:.5f} \"\n", - " row += f\"| {vals['chi2_tot']:.2f} / {vals['n_dof_tot']} \"\n", - " row += f\"| {vals['p_value_tot']:.5f} |\"\n", - " rows.append(row)\n", - "\n", - " # Display in Jupyter\n", - " display(Markdown(header + \"\\n\".join(rows)))\n", - " return header + \"\\n\".join(rows)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "markdown_source = display_markdown(metrics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "markdown_source" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot the best-fit of each model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_version}/cosmosis_SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1.fits\"\n", - ")\n", - "xi_plus = data[\"XI_PLUS\"].data\n", - "xi_minus = data[\"XI_MINUS\"].data\n", - "cov_mat = data[\"COVMAT\"].data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "\n", - "plt.subplot(211)\n", - "\n", - "plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - ")\n", - "\n", - "plt.ylabel(r\"$\\xi_{+}$\", fontsize=26)\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "\n", - "plt.subplot(212)\n", - "\n", - "plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - ")\n", - "\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\", fontsize=26)\n", - "plt.ylabel(r\"$\\xi_{-}$\", fontsize=26)\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.legend(fontsize=15)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_best_fit(\n", - " root_to_plot,\n", - " colours,\n", - " savefile,\n", - " theta_min=1.0,\n", - " theta_max=250.0,\n", - " multiply_theta=False,\n", - " plot_xi_sys=True,\n", - "):\n", - " data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_version}/cosmosis_{catalog_version}.fits\"\n", - " )\n", - " xi_plus = data[\"XI_PLUS\"].data\n", - " xi_minus = data[\"XI_MINUS\"].data\n", - " cov_mat = data[\"COVMAT\"].data\n", - "\n", - " plt.figure(figsize=(15, 15))\n", - "\n", - " plt.subplot(211)\n", - "\n", - " y_plot_xi_plus = (\n", - " xi_plus[\"VALUE\"] if not multiply_theta else xi_plus[\"ANG\"] * xi_plus[\"VALUE\"]\n", - " )\n", - " y_errorbar = (\n", - " xi_plus[\"ANG\"] * np.sqrt(np.diag(cov_mat))[:20]\n", - " if multiply_theta\n", - " else np.sqrt(np.diag(cov_mat))[:20]\n", - " )\n", - " plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " y_plot_xi_plus,\n", - " yerr=y_errorbar,\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_plus_model = shear_xi_plus[mask]\n", - " if add_xi_sys:\n", - " xi_plus_model += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_plus\n", - " )\n", - "\n", - " y_plot = theta_arcmin[mask] * xi_plus_model if multiply_theta else xi_plus_model\n", - " plt.plot(theta_arcmin[mask], y_plot, color=color, label=root, alpha=0.5)\n", - " if plot_xi_sys and add_xi_sys:\n", - " y_plot_xi_sys = (\n", - " theta_xi_sys_arcmin * xi_sys_plus if multiply_theta else xi_sys_plus\n", - " )\n", - " plt.plot(\n", - " theta_xi_sys_arcmin,\n", - " y_plot_xi_sys,\n", - " color=color,\n", - " linestyle=\"-.\",\n", - " alpha=0.5,\n", - " )\n", - " plt.axvline(x=lower_bound_xi_plus, color=color, linestyle=\"--\", alpha=0.3)\n", - " plt.axvline(x=upper_bound_xi_plus, color=color, linestyle=\"--\", alpha=0.3)\n", - "\n", - " y_label = r\"$\\xi_{+}$\" if not multiply_theta else r\"$\\theta \\xi_{+}$\"\n", - " plt.ylabel(y_label, fontsize=26)\n", - " plt.xscale(\"log\")\n", - " plt.yscale(\"log\")\n", - " plt.legend(loc=\"lower left\", fontsize=8)\n", - "\n", - " plt.subplot(212)\n", - "\n", - " y_plot_xi_minus = (\n", - " xi_minus[\"VALUE\"] if not multiply_theta else xi_minus[\"ANG\"] * xi_minus[\"VALUE\"]\n", - " )\n", - " y_errorbar = (\n", - " xi_minus[\"ANG\"] * np.sqrt(np.diag(cov_mat))[20:40]\n", - " if multiply_theta\n", - " else np.sqrt(np.diag(cov_mat))[20:40]\n", - " )\n", - " plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " y_plot_xi_minus,\n", - " yerr=y_errorbar,\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_minus_model = shear_xi_minus[mask]\n", - " if add_xi_sys:\n", - " xi_minus_model += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_minus\n", - " )\n", - "\n", - " y_plot = (\n", - " theta_arcmin[mask] * xi_minus_model if multiply_theta else xi_minus_model\n", - " )\n", - " plt.plot(theta_arcmin[mask], y_plot, color=color, label=root, alpha=0.5)\n", - " if plot_xi_sys and add_xi_sys:\n", - " y_plot_xi_sys = (\n", - " theta_xi_sys_arcmin * xi_sys_minus if multiply_theta else xi_sys_minus\n", - " )\n", - " plt.plot(\n", - " theta_xi_sys_arcmin,\n", - " y_plot_xi_sys,\n", - " color=color,\n", - " linestyle=\"-.\",\n", - " alpha=0.5,\n", - " )\n", - " plt.axvline(x=lower_bound_xi_minus, color=color, linestyle=\"--\", alpha=0.3)\n", - " plt.axvline(x=upper_bound_xi_minus, color=color, linestyle=\"--\", alpha=0.3)\n", - "\n", - " plt.xlabel(r\"$\\theta$ [arcmin]\", fontsize=26)\n", - " y_label = r\"$\\xi_{-}$\" if not multiply_theta else r\"$\\theta \\xi_{-}$\"\n", - " plt.ylabel(y_label, fontsize=26)\n", - " plt.xscale(\"log\")\n", - " plt.yscale(\"log\")\n", - " plt.legend(loc=\"lower left\", fontsize=8)\n", - "\n", - " if savefile is not None:\n", - " plt.savefig(savefile, bbox_inches=\"tight\")\n", - "\n", - " plt.show()\n", - "\n", - "\n", - "def plot_best_fit_ratio(\n", - " root_to_plot, colours, savefile, theta_min=1.0, theta_max=250.0\n", - "):\n", - " data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_version}/cosmosis_{catalog_version}.fits\"\n", - " )\n", - " xi_plus = data[\"XI_PLUS\"].data\n", - " xi_minus = data[\"XI_MINUS\"].data\n", - " cov_mat = data[\"COVMAT\"].data\n", - "\n", - " plt.figure(figsize=(15, 15))\n", - "\n", - " plt.subplot(211)\n", - "\n", - " root = roots[0]\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_plus_model_fiducial = shear_xi_plus[mask]\n", - " if add_xi_sys:\n", - " xi_plus_model_fiducial += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_plus\n", - " )\n", - "\n", - " plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"]\n", - " / np.interp(xi_plus[\"ANG\"], theta_arcmin[mask], xi_plus_model_fiducial),\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20]\n", - " / np.abs(np.interp(xi_plus[\"ANG\"], theta_arcmin[mask], xi_plus_model_fiducial)),\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_plus_model = shear_xi_plus[mask]\n", - " if add_xi_sys:\n", - " xi_plus_model += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_plus\n", - " )\n", - "\n", - " alpha = 1.0 if root == roots[0] else 0.5\n", - " plt.plot(\n", - " theta_arcmin[mask],\n", - " xi_plus_model / xi_plus_model_fiducial,\n", - " color=color,\n", - " label=root,\n", - " alpha=alpha,\n", - " )\n", - " plt.axvline(x=lower_bound_xi_plus, color=color, linestyle=\"--\", alpha=0.3)\n", - " plt.axvline(x=upper_bound_xi_plus, color=color, linestyle=\"--\", alpha=0.3)\n", - "\n", - " plt.ylabel(r\"$\\xi_{+}/\\xi_{+, \\text{fid}}$\", fontsize=26)\n", - " plt.xscale(\"log\")\n", - " # plt.yscale('log')\n", - " plt.legend(loc=\"lower left\", fontsize=8)\n", - "\n", - " plt.subplot(212)\n", - "\n", - " root = roots[0]\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_minus_model_fiducial = shear_xi_minus[mask]\n", - " if add_xi_sys:\n", - " xi_minus_model_fiducial += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_minus\n", - " )\n", - "\n", - " plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"]\n", - " / np.interp(xi_minus[\"ANG\"], theta_arcmin[mask], xi_minus_model_fiducial),\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40]\n", - " / np.abs(\n", - " np.interp(xi_minus[\"ANG\"], theta_arcmin[mask], xi_minus_model_fiducial)\n", - " ),\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_minus_model = shear_xi_minus[mask]\n", - " if add_xi_sys:\n", - " xi_minus_model += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_minus\n", - " )\n", - "\n", - " alpha = 1.0 if root == roots[0] else 0.5\n", - " plt.plot(\n", - " theta_arcmin[mask],\n", - " xi_minus_model / xi_minus_model_fiducial,\n", - " color=color,\n", - " label=root,\n", - " alpha=alpha,\n", - " )\n", - " plt.axvline(x=lower_bound_xi_minus, color=color, linestyle=\"--\", alpha=0.3)\n", - " plt.axvline(x=upper_bound_xi_minus, color=color, linestyle=\"--\", alpha=0.3)\n", - "\n", - " plt.xlabel(r\"$\\theta$ [arcmin]\", fontsize=26)\n", - " plt.ylabel(r\"$\\xi_{-}/\\xi_{-, \\text{fid}}$\", fontsize=26)\n", - " plt.xscale(\"log\")\n", - " plt.ylim(0, 2)\n", - " # plt.yscale('log')\n", - " plt.legend(loc=\"lower left\", fontsize=8)\n", - "\n", - " if savefile is not None:\n", - " plt.savefig(savefile, bbox_inches=\"tight\")\n", - "\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "root_to_plot = [\n", - " \"SP_v1.4.5_A\",\n", - " # \"SP_v1.4.5_A_no_IA\",\n", - " # \"SP_v1.4.5_A_no_dz\",\n", - " # \"SP_v1.4.5_A_no_m_bias\",\n", - " \"SP_v1.4.5_A_sc_3_150\",\n", - " \"SP_v1.4.5_A_sc_3_60\",\n", - " \"SP_v1.4.5_A_sc_10_150\",\n", - " \"SP_v1.4.5_A_sc_10_60\",\n", - " \"SP_v1.4.5_A_sc_5_150\",\n", - " \"SP_v1.4.5_A_sc_7_150\",\n", - " # \"SP_v1.4.5_A_no_leakage\"\n", - "]\n", - "\n", - "root_to_plot = [\n", - " f\"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_{int(i)}.0_80.0_10.0_80.0\"\n", - " for i in [3, 5, 7, 10, 11]\n", - "]\n", - "\n", - "\"\"\" root_to_plot = [\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0\",\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0_no_alpha_beta\"\n", - "] \"\"\"\n", - "\n", - "\n", - "colours = [\n", - " \"cornflowerblue\",\n", - " \"salmon\",\n", - " \"darkorange\",\n", - " \"forestgreen\",\n", - " \"turquoise\",\n", - " \"darkviolet\",\n", - " \"crimson\",\n", - " \"gold\",\n", - " \"lightcoral\",\n", - " \"mediumseagreen\",\n", - " \"lightsteelblue\",\n", - " \"black\",\n", - " \"silver\",\n", - " \"peru\",\n", - " \"maroon\",\n", - " \"olive\",\n", - "]\n", - "\n", - "savefile = None\n", - "\n", - "plot_best_fit(root_to_plot, colours, savefile, multiply_theta=True, plot_xi_sys=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "root_to_plot = [\n", - " \"SP_v1.4.5_A\",\n", - " # \"SP_v1.4.5_A_no_IA\",\n", - " # \"SP_v1.4.5_A_no_dz\",\n", - " # \"SP_v1.4.5_A_no_m_bias\",\n", - " \"SP_v1.4.5_A_sc_3_150\",\n", - " \"SP_v1.4.5_A_sc_3_60\",\n", - " \"SP_v1.4.5_A_sc_10_150\",\n", - " \"SP_v1.4.5_A_sc_10_60\",\n", - " \"SP_v1.4.5_A_sc_5_150\",\n", - " \"SP_v1.4.5_A_sc_7_150\",\n", - " # \"SP_v1.4.5_A_no_leakage\"\n", - "]\n", - "\n", - "\"\"\" root_to_plot = [\n", - " f\"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_{int(i)}.0_80.0_10.0_80.0\" for i in [3, 5, 7, 10, 11]\n", - "] \"\"\"\n", - "\n", - "root_to_plot = [\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0\",\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0_no_alpha_beta\",\n", - "]\n", - "\n", - "\n", - "colours = [\n", - " \"red\",\n", - " \"salmon\",\n", - " \"darkorange\",\n", - " \"forestgreen\",\n", - " \"turquoise\",\n", - " \"darkviolet\",\n", - " \"crimson\",\n", - " \"gold\",\n", - " \"lightcoral\",\n", - " \"mediumseagreen\",\n", - " \"lightsteelblue\",\n", - " \"black\",\n", - " \"silver\",\n", - " \"peru\",\n", - " \"maroon\",\n", - " \"olive\",\n", - "]\n", - "\n", - "savefile = \"best_fit_ratio_w_wo_leakage.png\"\n", - "\n", - "plot_best_fit_ratio(root_to_plot, colours, savefile)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_best_fit_tau(root_to_plot, colours, savefile, theta_min=1.0, theta_max=250.0):\n", - " data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_version}/cosmosis_{catalog_version}.fits\"\n", - " )\n", - " tau_0 = data[\"TAU_0_PLUS\"].data\n", - " tau_2 = data[\"TAU_2_PLUS\"].data\n", - " cov_mat = data[\"COVMAT\"].data\n", - "\n", - " plt.figure(figsize=(15, 15))\n", - "\n", - " plt.subplot(211)\n", - "\n", - " plt.errorbar(\n", - " tau_0[\"ANG\"],\n", - " tau_0[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[40:60],\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_0_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " tau_0_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_0_plus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - "\n", - " plt.plot(\n", - " theta_arcmin[mask], tau_0_plus[mask], color=color, label=root, alpha=0.5\n", - " )\n", - "\n", - " plt.ylabel(r\"$\\tau_0$\", fontsize=26)\n", - " plt.xscale(\"log\")\n", - " # plt.yscale('log')\n", - " plt.legend(loc=\"upper right\", fontsize=8)\n", - "\n", - " plt.subplot(212)\n", - "\n", - " y_plot_tau_2 = tau_2[\"ANG\"] * tau_2[\"VALUE\"]\n", - " y_errorbar = tau_2[\"ANG\"] * np.sqrt(np.diag(cov_mat))[60:80]\n", - " plt.errorbar(\n", - " tau_2[\"ANG\"],\n", - " y_plot_tau_2,\n", - " yerr=y_errorbar,\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_2_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " tau_2_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_2_plus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - "\n", - " plt.plot(\n", - " theta_arcmin[mask],\n", - " theta_arcmin[mask] * tau_2_plus[mask],\n", - " color=color,\n", - " label=root,\n", - " alpha=0.5,\n", - " )\n", - "\n", - " plt.xlabel(r\"$\\theta$ [arcmin]\", fontsize=26)\n", - " plt.ylabel(r\"$\\theta \\tau_2$\", fontsize=26)\n", - " plt.xscale(\"log\")\n", - " # plt.yscale('log')\n", - " plt.legend(loc=\"upper left\", fontsize=8)\n", - "\n", - " if savefile is not None:\n", - " plt.savefig(savefile, bbox_inches=\"tight\")\n", - "\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "root_to_plot = [\n", - " \"SP_v1.4.5_A\",\n", - " # \"SP_v1.4.5_A_no_IA\",\n", - " # \"SP_v1.4.5_A_no_dz\",\n", - " # \"SP_v1.4.5_A_no_m_bias\",\n", - " \"SP_v1.4.5_A_sc_3_150\",\n", - " \"SP_v1.4.5_A_sc_3_60\",\n", - " \"SP_v1.4.5_A_sc_10_150\",\n", - " \"SP_v1.4.5_A_sc_10_60\",\n", - " \"SP_v1.4.5_A_sc_5_150\",\n", - " \"SP_v1.4.5_A_sc_7_150\",\n", - " # \"SP_v1.4.5_A_no_leakage\"\n", - "]\n", - "\n", - "root_to_plot = [\n", - " f\"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_{int(i)}.0_80.0_10.0_80.0\"\n", - " for i in [3, 5, 7, 10, 11]\n", - "]\n", - "\n", - "colours = [\n", - " \"red\",\n", - " \"salmon\",\n", - " \"darkorange\",\n", - " \"forestgreen\",\n", - " \"turquoise\",\n", - " \"darkviolet\",\n", - " \"crimson\",\n", - " \"gold\",\n", - " \"lightcoral\",\n", - " \"mediumseagreen\",\n", - " \"lightsteelblue\",\n", - " \"black\",\n", - " \"silver\",\n", - " \"peru\",\n", - " \"maroon\",\n", - " \"olive\",\n", - "]\n", - "\n", - "savefile = \"best_fit_tau_new_binning.png\"\n", - "\n", - "plot_best_fit_tau(root_to_plot, colours, savefile)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pseudo_cell = fits.open(\n", - " \"/home/guerrini/sp_validation/cosmo_val/output/pseudo_cl_SP_v1.4.5.fits\"\n", - ")[1].data\n", - "cov_pseudo_cell = fits.open(\n", - " \"/home/guerrini/sp_validation/cosmo_val/output/pseudo_cl_cov_SP_v1.4.5.fits\"\n", - ")\n", - "\n", - "theory_ell = np.loadtxt(\n", - " \"/n09data/guerrini/output_chains/best_fit/SP_v1.4.5_A/shear_cl/ell.txt\"\n", - ")\n", - "theory_cell = np.loadtxt(\n", - " \"/n09data/guerrini/output_chains/best_fit/SP_v1.4.5_A/shear_cl/bin_1_1.txt\"\n", - ")\n", - "\n", - "pw = hp.pixwin(1024, lmax=2048)\n", - "\n", - "plt.errorbar(\n", - " pseudo_cell[\"ELL\"],\n", - " pseudo_cell[\"ELL\"] * pseudo_cell[\"EE\"],\n", - " yerr=pseudo_cell[\"ELL\"] * np.sqrt(np.diag(cov_pseudo_cell[\"COVAR_EE_EE\"].data)),\n", - " capsize=2,\n", - " c=\"k\",\n", - " fmt=\"o\",\n", - " markersize=2,\n", - ")\n", - "\n", - "mask = (theory_ell > 0.1) & (theory_ell < 2048)\n", - "plt.plot(\n", - " theory_ell[mask],\n", - " theory_ell[mask]\n", - " * theory_cell[mask]\n", - " * np.interp(theory_ell[mask], np.arange(0, 2049), pw) ** 2,\n", - " c=\"r\",\n", - " label=\"best-fit $\\\\theta \\\\in [3-200]$\",\n", - ")\n", - "\n", - "plt.xlabel(r\"$\\ell$\", fontsize=26)\n", - "plt.ylabel(r\"$\\ell C_\\ell^{EE}$\", fontsize=26)\n", - "plt.legend()\n", - "plt.savefig(\"SP_v1.4.5_A_cell.png\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cov_pseudo_cell.info()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "sp_validation_3.11", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/cosmo_inference/get_chi2_cell.ipynb b/cosmo_inference/get_chi2_cell.ipynb deleted file mode 100644 index c97748d1..00000000 --- a/cosmo_inference/get_chi2_cell.ipynb +++ /dev/null @@ -1,1527 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "# Trick to plot with tex\n", - "os.environ[\"LD_LIBRARY_PATH\"] = \"\"\n", - "os.environ[\"CONDA_PREFIX\"] = \"/home/guerrini/.conda/envs/sp_validation\"\n", - "\n", - "import configparser\n", - "import subprocess\n", - "\n", - "import healpy as hp\n", - "import matplotlib.pyplot as plt\n", - "import matplotlib.scale as mscale\n", - "import matplotlib.ticker as ticker\n", - "import matplotlib.transforms as mtransforms\n", - "import numpy as np\n", - "import scipy.stats as stats\n", - "import seaborn as sns\n", - "from astropy.io import fits\n", - "from getdist import plots\n", - "from IPython.display import Markdown, display\n", - "from scipy.interpolate import interp1d\n", - "\n", - "plt.style.use(\"../papers/harmonic/matplotlib_config/paper.mplstyle\")\n", - "\n", - "plt.rcParams[\"text.usetex\"] = True\n", - "\n", - "sns.set_palette(\"husl\")\n", - "\n", - "\n", - "class SquareRootScale(mscale.ScaleBase):\n", - " \"\"\"\n", - " ScaleBase class for generating square root scale.\n", - "\n", - " Usage example: axis.set_yscale('squareroot')\n", - "\n", - " \"\"\"\n", - "\n", - " name = \"squareroot\"\n", - "\n", - " def __init__(self, axis, **kwargs):\n", - " mscale.ScaleBase.__init__(self, axis, **kwargs)\n", - "\n", - " def set_default_locators_and_formatters(self, axis):\n", - " axis.set_major_locator(ticker.AutoLocator())\n", - " axis.set_major_formatter(ticker.ScalarFormatter())\n", - " axis.set_minor_locator(ticker.NullLocator())\n", - " axis.set_minor_formatter(ticker.NullFormatter())\n", - "\n", - " def limit_range_for_scale(self, vmin, vmax, minpos):\n", - " return max(0.0, vmin), vmax\n", - "\n", - " class SquareRootTransform(mtransforms.Transform):\n", - " input_dims = 1\n", - " output_dims = 1\n", - " is_separable = True\n", - "\n", - " def transform_non_affine(self, a):\n", - " return np.array(a) ** 0.5\n", - "\n", - " def inverted(self):\n", - " return SquareRootScale.InvertedSquareRootTransform()\n", - "\n", - " class InvertedSquareRootTransform(mtransforms.Transform):\n", - " input_dims = 1\n", - " output_dims = 1\n", - " is_separable = True\n", - "\n", - " def transform(self, a):\n", - " return np.array(a) ** 2\n", - "\n", - " def inverted(self):\n", - " return SquareRootScale.SquareRootTransform()\n", - "\n", - " def get_transform(self):\n", - " return self.SquareRootTransform()\n", - "\n", - "\n", - "mscale.register_scale(SquareRootScale)\n", - "%matplotlib inline\n", - "# import uncertainties\n", - "\n", - "plt.rc(\"mathtext\", fontset=\"stix\")\n", - "plt.rc(\"font\", family=\"sans-serif\")\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 40\n", - "\n", - "\n", - "# SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE\n", - "root_dir = \"/n09data/guerrini/output_chains/\"\n", - "\n", - "catalog_version = \"SP_v1.4.6_leak_corr_cell\"\n", - "catalog_version_real_space = \"SP_v1.4.6_leak_corr_A_10_80\"\n", - "\n", - "path_ini_files = \"/home/guerrini/sp_validation/cosmo_inference/cosmosis_config/\"\n", - "\n", - "roots = [\n", - " \"SP_v1.4.6_leak_corr_A_lmin=300_lmax=1600_cell\",\n", - " \"SP_v1.4.6_leak_corr_B_lmin=300_lmax=1600_cell\",\n", - " \"SP_v1.4.6_leak_corr_C_lmin=300_lmax=1600_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_10_80\",\n", - " # f\"SP_v1.4.6_leak_corr_A_kmax=5Mpc_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_kmax=3Mpc_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_kmax=1Mpc_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_include_large_scales_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_small_scales_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_large_scales_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_halofit_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_HMCode_nobar_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_OneCov_cell\",\n", - " \"SP_v1.4.6_A_fid_cell\",\n", - "]\n", - "\n", - "labels = [\n", - " r\"UNIONS $C_\\ell$, Blind A\",\n", - " r\"UNIONS $C_\\ell$, Blind B\",\n", - " r\"UNIONS $C_\\ell$, Blind C\",\n", - " r\"UNIONS $\\xi_\\pm(\\vartheta)$, (Goh et al., 2026)\",\n", - " # rf\"$k_\\mathrm{{max}}=5 h$ Mpc$^{{-1}}$, $\\ell_\\mathrm{{max}}=2048$\",\n", - " r\"$k_\\mathrm{max}=3 h$ Mpc$^{-1}$, $\\ell_\\mathrm{max}=1800$\",\n", - " r\"$k_\\mathrm{max}=1 h$ Mpc$^{-1}$, $\\ell_\\mathrm{max}=500$\",\n", - " r\"Include Large Scales, $\\ell_\\mathrm{max}=1600$\",\n", - " \"Small Scales only\",\n", - " \"Large Scales only\",\n", - " r\"Halofit\",\n", - " r\"HMCode no baryons\",\n", - " \"OneCovariance only\",\n", - " \"No leakage correction\",\n", - "]\n", - "\n", - "bases = [\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"configuration\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - " \"harmonic\",\n", - "]\n", - "\n", - "\n", - "properties = {}\n", - "\n", - "for i, root in enumerate(roots):\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - " config.read(path_ini_files + f\"/cosmosis_pipeline_{root}.ini\")\n", - "\n", - " try:\n", - " lower_bound_cell_ee, upper_bound_cell_ee = map(\n", - " float, config[\"2pt_like\"][\"angle_range_CELL_EE_1_1\"].split()\n", - " )\n", - "\n", - " properties[root] = {\n", - " \"lower_bound_cell_ee\": lower_bound_cell_ee,\n", - " \"upper_bound_cell_ee\": upper_bound_cell_ee,\n", - " }\n", - " except KeyError:\n", - " properties[root] = {\"lower_bound_cell_ee\": 0.0, \"upper_bound_cell_ee\": 2048.0}\n", - "\n", - " if bases[i] == \"configuration\":\n", - " # Also save the scale cuts in theta for xi\n", - " add_xi_sys = config[\"2pt_like\"][\"add_xi_sys\"]\n", - " add_xi_sys = add_xi_sys == \"T\"\n", - " lower_bound_xi_plus, upper_bound_xi_plus = map(\n", - " float, config[\"2pt_like\"][\"angle_range_XI_PLUS_1_1\"].split()\n", - " )\n", - " lower_bound_xi_minus, upper_bound_xi_minus = map(\n", - " float, config[\"2pt_like\"][\"angle_range_XI_MINUS_1_1\"].split()\n", - " )\n", - "\n", - " properties[root].update(\n", - " {\n", - " \"add_xi_sys\": add_xi_sys,\n", - " \"lower_bound_xi_plus\": lower_bound_xi_plus,\n", - " \"upper_bound_xi_plus\": upper_bound_xi_plus,\n", - " \"lower_bound_xi_minus\": lower_bound_xi_minus,\n", - " \"upper_bound_xi_minus\": upper_bound_xi_minus,\n", - " }\n", - " )\n", - "\n", - "\n", - "print(roots)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Retrieve the chains" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# MAKE PARAMNAMES FILE\n", - "\n", - "for root in roots:\n", - " with open(root_dir + \"{}/samples_{}.txt\".format(\"/\" + root, root), \"r\") as file:\n", - " params = file.readline()[1:].split(\"\\t\")[:-4]\n", - " file.close()\n", - "\n", - " with open(\n", - " root_dir + \"{}/getdist_{}.paramnames\".format(\"/\" + root, root), \"w\"\n", - " ) as file:\n", - " for i in range(len(params)):\n", - " if len(params[i].split(\"--\")) > 1:\n", - " file.write(params[i].split(\"--\")[1] + \"\\n\")\n", - " else:\n", - " file.write(params[i].split(\"--\")[0] + \"\\n\")\n", - " file.close()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# READ CHAIN\n", - "\n", - "chains = []\n", - "\n", - "for root in roots:\n", - " samples = np.loadtxt(root_dir + \"{}/samples_{}.txt\".format(root, root))\n", - " print(len(samples))\n", - " if \"nautilus\" in root:\n", - " samples = np.column_stack(\n", - " (np.exp(samples[:, -3]), samples[:, -1] - samples[:, -2], samples[:, 0:-3])\n", - " )\n", - " else:\n", - " samples = np.column_stack((samples[:, -1], samples[:, -3], samples[:, 0:-4]))\n", - " np.savetxt(root_dir + \"{}/getdist_{}.txt\".format(root, root), samples)\n", - "\n", - " chain = g.samples_for_root(\n", - " root_dir + \"{}/getdist_{}\".format(root, root),\n", - " cache=False,\n", - " settings={\"ignore_rows\": 0, \"smooth_scale_2D\": 0.3, \"smooth_scale_1D\": 0.3},\n", - " )\n", - "\n", - " chains.append(chain)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "name_list = [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"s_8_input\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - "]\n", - "label_list = [\n", - " r\"\\Omega_m\",\n", - " r\"\\omega_b h^2\",\n", - " \"h_0\",\n", - " \"n_s\",\n", - " r\"\\sigma_8\",\n", - " \"S_8\",\n", - " \"log T_{AGN}\",\n", - " \"A_{IA}\",\n", - " \"m_1\",\n", - " r\"\\Delta z_1\",\n", - "]\n", - "\n", - "for chain in chains:\n", - " param_names = chain.getParamNames()\n", - " for name, label in zip(name_list, label_list):\n", - " param_names.parWithName(name).label = label" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extract the best fit parameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "best_fit = {}\n", - "\n", - "for root, chain in zip(roots, chains):\n", - " print(root)\n", - " likestats = chain.getLikeStats()\n", - " bestfit_idx = np.argmax(chain.loglikes)\n", - " maxlike = chain.loglikes[bestfit_idx]\n", - " print(f\"Maximum Likelihood: {maxlike:.5g}\")\n", - " best_fit[root] = {\"likelihood\": maxlike}\n", - " margestats = chain.getMargeStats()\n", - " s8_stats = margestats.parWithName(\"S_8\")\n", - " sigma8_stats = margestats.parWithName(\"SIGMA_8\")\n", - " omegam_stats = margestats.parWithName(\"OMEGA_M\")\n", - " a_ia_stats = margestats.parWithName(\"a\")\n", - "\n", - " best_fit[root].update(\n", - " {\n", - " \"S_8_mean\": s8_stats.mean,\n", - " \"S_8_lower\": s8_stats.mean - s8_stats.limits[0].lower,\n", - " \"S_8_upper\": s8_stats.limits[0].upper - s8_stats.mean,\n", - " \"sigma_8_mean\": sigma8_stats.mean,\n", - " \"sigma_8_lower\": sigma8_stats.mean - sigma8_stats.limits[0].lower,\n", - " \"sigma_8_upper\": sigma8_stats.limits[0].upper - sigma8_stats.mean,\n", - " \"omega_m_mean\": omegam_stats.mean,\n", - " \"omega_m_lower\": omegam_stats.mean - omegam_stats.limits[0].lower,\n", - " \"omega_m_upper\": omegam_stats.limits[0].upper - omegam_stats.mean,\n", - " \"A_IA_mean\": a_ia_stats.mean,\n", - " \"A_IA_lower\": a_ia_stats.mean - a_ia_stats.limits[0].lower,\n", - " \"A_IA_upper\": a_ia_stats.limits[0].upper - a_ia_stats.mean,\n", - " }\n", - " )\n", - " try:\n", - " t_agn_stats = margestats.parWithName(\"logt_agn\")\n", - " best_fit[root].update(\n", - " {\n", - " \"logt_agn_mean\": t_agn_stats.mean,\n", - " \"logt_agn_lower\": t_agn_stats.mean - t_agn_stats.limits[0].lower,\n", - " \"logt_agn_upper\": t_agn_stats.limits[0].upper - t_agn_stats.mean,\n", - " }\n", - " )\n", - " except Exception:\n", - " pass\n", - " for i, par in enumerate(likestats.names):\n", - " best_fit[root].update(\n", - " {par.name: np.average(chain.samples[:, i], weights=chain.weights)}\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run `Cosmosis` in test mode to get the data vectors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if not os.path.exists(path_ini_files + \"/values_empty.ini\"):\n", - " content = \"\"\"[cosmological_parameters]\n", - "\n", - "tau = 0.0544\n", - "w = -1.0\n", - "mnu = 0.06\n", - "omega_k = 0.0\n", - "wa = 0.0\n", - "\n", - "[halo_model_parameters]\n", - "\n", - "[intrinsic_alignment_parameters]\n", - "\n", - "[shear_calibration_parameters]\n", - "\n", - "[nofz_shifts]\n", - "\n", - "[psf_leakage_parameters]\n", - "\"\"\"\n", - "\n", - " with open(path_ini_files + \"/values_empty.ini\", \"w\") as f:\n", - " f.write(content)\n", - " f.close()\n", - "\n", - " print(\"File created successfully\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "section_map = {\n", - " \"omch2\": \"cosmological_parameters\",\n", - " \"ombh2\": \"cosmological_parameters\",\n", - " \"h0\": \"cosmological_parameters\",\n", - " \"n_s\": \"cosmological_parameters\",\n", - " \"s_8_input\": \"cosmological_parameters\",\n", - " \"logt_agn\": \"halo_model_parameters\",\n", - " \"a\": \"intrinsic_alignment_parameters\",\n", - " \"m1\": \"shear_calibration_parameters\",\n", - " \"bias_1\": \"nofz_shifts\",\n", - " \"alpha\": \"psf_leakage_parameters\",\n", - " \"beta\": \"psf_leakage_parameters\",\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "env = os.environ.copy()\n", - "env[\"LD_LIBRARY_PATH\"] = (\n", - " \"/home/guerrini/.conda/envs/sp_validation/lib/python3.9/site-packages/cosmosis/datablock:\"\n", - " + env.get(\"LD_LIBRARY_PATH\", \"\")\n", - ")\n", - "\n", - "for root in roots:\n", - " print(root)\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - " config.read(path_ini_files + \"/values_empty.ini\")\n", - " for param, value in best_fit[root].items():\n", - " section = section_map.get(param)\n", - " if section is None:\n", - " continue\n", - " if section not in config:\n", - " config.add_section(section)\n", - " config[section][param] = str(value)\n", - "\n", - " with open(path_ini_files + \"/values_empty.ini\", \"w\") as configfile:\n", - " config.write(configfile)\n", - "\n", - " # Modify the ini file to run in test mode at the best fit\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - " config.read(path_ini_files + f\"/cosmosis_pipeline_{root}.ini\")\n", - "\n", - " sampler = config[\"runtime\"][\"sampler\"]\n", - " config[\"runtime\"][\"sampler\"] = \"test\"\n", - " values = config[\"pipeline\"][\"values\"]\n", - " config[\"pipeline\"][\"values\"] = path_ini_files + \"/values_empty.ini\"\n", - "\n", - " with open(path_ini_files + f\"/cosmosis_pipeline_{root}.ini\", \"w\") as configfile:\n", - " config.write(configfile)\n", - "\n", - " # Run cosmosis\n", - " result = subprocess.run(\n", - " [\"cosmosis\", \"cosmosis_config/cosmosis_pipeline_{}.ini\".format(root)],\n", - " env=env,\n", - " capture_output=True,\n", - " text=True,\n", - " )\n", - " print(f\"STDOUT:\\n{result.stdout}\")\n", - " print(f\"STDERR:\\n{result.stderr}\")\n", - "\n", - " # Modify the ini file to the previous one\n", - " config[\"pipeline\"][\"values\"] = values\n", - " config[\"runtime\"][\"sampler\"] = sampler\n", - "\n", - " with open(path_ini_files + f\"/cosmosis_pipeline_{root}.ini\", \"w\") as configfile:\n", - " config.write(configfile)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compute the $\\chi^2$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "output_folder = \"/n09data/guerrini/output_chains/\"\n", - "\n", - "metrics = {}\n", - "\n", - "for i, root in enumerate(roots):\n", - " print(root)\n", - "\n", - " base = bases[i]\n", - "\n", - " if base == \"harmonic\":\n", - " # Remove cell from the end of root\n", - " root_cell_removed = root.replace(\"_cell\", \"\")\n", - "\n", - " lower_bound_cell_ee = properties[root][\"lower_bound_cell_ee\"]\n", - " upper_bound_cell_ee = properties[root][\"upper_bound_cell_ee\"]\n", - " print(upper_bound_cell_ee)\n", - "\n", - " # Read the results\n", - " ell = np.loadtxt(output_folder + \"best_fit/{}/shear_cl/ell.txt\".format(root))\n", - " shear_cl = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_cl/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " # Read the data\n", - " data = fits.open(f\"data/{root_cell_removed}/cosmosis_{root}.fits\")\n", - "\n", - " ell_data = data[\"CELL_EE\"].data[\"ANG\"]\n", - " cell_data = data[\"CELL_EE\"].data[\"VALUE\"]\n", - "\n", - " # Load the covariance\n", - " cov = data[\"COVMAT\"].data\n", - " cov_cell = cov\n", - "\n", - " # interpolate the model\n", - " interp_cell_ee = interp1d(ell, shear_cl, kind=\"cubic\", fill_value=\"extrapolate\")\n", - "\n", - " cell_model = interp_cell_ee(ell_data)\n", - "\n", - " # Apply scale cuts\n", - " mask_cell = (ell_data > lower_bound_cell_ee) & (ell_data < upper_bound_cell_ee)\n", - " cell_data = cell_data[mask_cell]\n", - " cell_model = cell_model[mask_cell]\n", - " cov_cell = cov_cell[mask_cell][:, mask_cell]\n", - "\n", - " cell_chi2 = np.dot(\n", - " (cell_model - cell_data),\n", - " np.dot(np.linalg.inv(cov_cell), (cell_model - cell_data)),\n", - " )\n", - " n_dof_cell = np.sum(mask_cell)\n", - " print(n_dof_cell)\n", - " n_dof_cell -= 9\n", - " p_value_cell = 1 - stats.chi2.cdf(cell_chi2, n_dof_cell)\n", - "\n", - " metrics[root] = {\n", - " \"chi2\": cell_chi2,\n", - " \"n_dof\": n_dof_cell,\n", - " \"p_value\": p_value_cell,\n", - " }\n", - "\n", - " elif base == \"configuration\":\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - "\n", - " # Read model tau_stats\n", - " theta_tau = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_0_plus/theta.txt\".format(root)\n", - " )\n", - " theta_tau_arcmin = theta_tau * 180 * 60 / np.pi\n", - " tau_0_model = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_0_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " tau_2_model = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_2_plus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " # Read the data\n", - " data = fits.open(\n", - " f\"data/{catalog_version_real_space}/cosmosis_{catalog_version_real_space}.fits\"\n", - " )\n", - "\n", - " theta_data = data[\"XI_PLUS\"].data[\"ANG\"]\n", - " xi_plus_data = data[\"XI_PLUS\"].data[\"VALUE\"]\n", - " xi_minus_data = data[\"XI_MINUS\"].data[\"VALUE\"]\n", - " tau_0_data = data[\"TAU_0_PLUS\"].data[\"VALUE\"]\n", - " tau_2_data = data[\"TAU_2_PLUS\"].data[\"VALUE\"]\n", - "\n", - " # Load the covariance\n", - " cov = data[\"COVMAT\"].data\n", - " cov_xi = cov[0 : 2 * len(xi_plus_data), 0 : 2 * len(xi_plus_data)]\n", - " cov_tau = cov[2 * len(xi_plus_data) :, 2 * len(xi_plus_data) :]\n", - "\n", - " # interpolate the model\n", - " interp_xi_plus = interp1d(\n", - " theta_arcmin, shear_xi_plus, kind=\"cubic\", fill_value=\"extrapolate\"\n", - " )\n", - " interp_xi_minus = interp1d(\n", - " theta_arcmin, shear_xi_minus, kind=\"cubic\", fill_value=\"extrapolate\"\n", - " )\n", - "\n", - " xi_plus_model = interp_xi_plus(theta_data)\n", - " if add_xi_sys:\n", - " xi_plus_model += xi_sys_plus\n", - " xi_minus_model = interp_xi_minus(theta_data)\n", - " if add_xi_sys:\n", - " xi_minus_model += xi_sys_minus\n", - "\n", - " # Concatenate the data vector\n", - " xi_data = np.concatenate((xi_plus_data, xi_minus_data))\n", - " xi_model = np.concatenate((xi_plus_model, xi_minus_model))\n", - "\n", - " tau_data = np.concatenate((tau_0_data, tau_2_data))\n", - " tau_model = np.concatenate((tau_0_model, tau_2_model))\n", - "\n", - " # Apply scale cuts\n", - " mask_xi_plus = (theta_data > lower_bound_xi_plus) & (\n", - " theta_data < upper_bound_xi_plus\n", - " )\n", - " mask_xi_minus = (theta_data > lower_bound_xi_minus) & (\n", - " theta_data < upper_bound_xi_minus\n", - " )\n", - " mask = np.concatenate((mask_xi_plus, mask_xi_minus))\n", - "\n", - " xi_data = xi_data[mask]\n", - " xi_model = xi_model[mask]\n", - " cov_xi = cov_xi[mask][:, mask]\n", - "\n", - " xi_plus_chi2 = np.dot(\n", - " (xi_model - xi_data), np.dot(np.linalg.inv(cov_xi), (xi_model - xi_data))\n", - " )\n", - " tau_chi2 = np.dot(\n", - " (tau_model - tau_data),\n", - " np.dot(np.linalg.inv(cov_tau), (tau_model - tau_data)),\n", - " )\n", - " n_dof_xi = np.sum(mask)\n", - " n_dof_xi -= 11\n", - " n_dof_tau = len(tau_0_data) + len(tau_2_data)\n", - " p_value_xi = 1 - stats.chi2.cdf(xi_plus_chi2, n_dof_xi)\n", - " p_value_tau = 1 - stats.chi2.cdf(tau_chi2, n_dof_tau)\n", - " chi2_tot = xi_plus_chi2 + tau_chi2\n", - " n_dof_tot = n_dof_xi + n_dof_tau\n", - " p_value_tot = 1 - stats.chi2.cdf(chi2_tot, n_dof_tot)\n", - "\n", - " metrics[root] = {\"chi2\": xi_plus_chi2, \"n_dof\": n_dof_xi, \"p_value\": p_value_xi}\n", - "\n", - " print(\"Done!\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_latex_table(metrics):\n", - " latex_lines = [\n", - " r\"\\begin{tabular}{|l|c|c|c|c|c|c|c|}\",\n", - " r\"\\hline\",\n", - " r\"Experiment name & $S_8$ & $\\Omega_m$ & $\\sigma_8$ & $A_\\mathrm{IA}$ & $\\log T_\\mathrm{AGN}$ & $\\chi^2$/dof & PTE \\\\ \",\n", - " r\"\\hline\",\n", - " ]\n", - "\n", - " for i, (root, vals) in enumerate(metrics.items()):\n", - " label = labels[i]\n", - " best_fit_vals = best_fit[root]\n", - " log_t_agn_mean = best_fit_vals.get(\"logt_agn_mean\", None)\n", - "\n", - " if log_t_agn_mean is None:\n", - " logt_agn_mean_str = \"N/A\"\n", - " else:\n", - " logt_agn_mean_str = f\"${best_fit_vals['logt_agn_mean']:.3f}^{{+{best_fit_vals['logt_agn_upper']:.3f}}}_{{-{best_fit_vals['logt_agn_lower']:.3f}}}$\"\n", - " line = (\n", - " f\"{label} & \"\n", - " rf\" ${best_fit_vals['S_8_mean']:.3f}^{{+{best_fit_vals['S_8_upper']:.3f}}}_{{-{best_fit_vals['S_8_lower']:.3f}}}$ & \"\n", - " rf\" ${best_fit_vals['omega_m_mean']:.3f}^{{+{best_fit_vals['omega_m_upper']:.3f}}}_{{-{best_fit_vals['omega_m_lower']:.3f}}}$ & \"\n", - " rf\" ${best_fit_vals['sigma_8_mean']:.3f}^{{+{best_fit_vals['sigma_8_upper']:.3f}}}_{{-{best_fit_vals['sigma_8_lower']:.3f}}}$ & \"\n", - " rf\" ${best_fit_vals['A_IA_mean']:.3f}^{{+{best_fit_vals['A_IA_upper']:.3f}}}_{{-{best_fit_vals['A_IA_lower']:.3f}}}$ & \"\n", - " rf\" {logt_agn_mean_str} & \"\n", - " f\"{vals['chi2']:.2f}/{vals['n_dof']} & {vals['p_value']:.5f} \\\\\\\\\"\n", - " )\n", - " latex_lines.append(line)\n", - "\n", - " latex_lines.append(r\"\\hline\")\n", - " latex_lines.append(r\"\\end{tabular}\")\n", - "\n", - " # Print LaTeX table\n", - " print(\"\\n\".join(latex_lines))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "get_latex_table(metrics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def display_markdown(metrics):\n", - " # Build Markdown table\n", - " header = (\n", - " \"| Root | $\\\\chi^2$ ($C_\\\\ell$) / dof | p-val ($C_\\\\ell$) |\\n\"\n", - " \"|------|----------------|------------|\\n\"\n", - " )\n", - "\n", - " rows = []\n", - " for root, vals in metrics.items():\n", - " row = f\"| `{root}` \"\n", - " row += f\"| {vals['chi2']:.2f} / {vals['n_dof']} \"\n", - " row += f\"| {vals['p_value']:.5f} \"\n", - " rows.append(row)\n", - "\n", - " # Display in Jupyter\n", - " display(Markdown(header + \"\\n\".join(rows)))\n", - " return header + \"\\n\".join(rows)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "markdown_source = display_markdown(metrics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "markdown_source" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plot the best-fit of each model" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "catalog_version = \"SP_v1.4.6_leak_corr_A_lmin=300_lmax=1600\"\n", - "data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_version}/cosmosis_{catalog_version}_cell.fits\"\n", - ")\n", - "cell_ee = data[\"CELL_EE\"].data\n", - "cov_mat = data[\"COVMAT\"].data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, ax = plt.subplots(1, 1, figsize=(15, 8))\n", - "\n", - "ell = cell_ee[\"ANG\"]\n", - "cell = cell_ee[\"VALUE\"]\n", - "\n", - "ax.errorbar(\n", - " ell,\n", - " ell * cell,\n", - " yerr=ell * np.sqrt(np.diag(cov)),\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "ax.set_xlabel(r\"$\\ell$\")\n", - "ax.set_ylabel(r\"$\\ell C_\\ell$\")\n", - "ax.set_xlim(ell.min() - 10, ell.max() + 100)\n", - "ax.set_xscale(\"squareroot\")\n", - "ax.set_xticks(np.array([100, 400, 900, 1600]))\n", - "ax.minorticks_on()\n", - "ax.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - "minor_ticks = [i * 10 for i in range(1, 10)] + [i * 100 for i in range(1, 21)]\n", - "ax.xaxis.set_ticks(minor_ticks, minor=True)\n", - "\n", - "plt.legend(fontsize=15)\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_best_fit(\n", - " data_points,\n", - " root_to_plot,\n", - " line_args,\n", - " savefile,\n", - " ell_min=10.0,\n", - " ell_max=2048.0,\n", - " multiply_ell=True,\n", - " loc_legend=\"best\",\n", - " bbox_to_anchor=None,\n", - " label_data=\"Fiducial data\",\n", - " labels=None,\n", - "):\n", - " data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{data_points}/cosmosis_{data_points}_cell.fits\"\n", - " )\n", - " cell_ee = data[\"CELL_EE\"].data\n", - " cov_mat = data[\"COVMAT\"].data\n", - "\n", - " if labels is None:\n", - " labels = root_to_plot\n", - "\n", - " fig, ax = plt.subplots(1, 1, figsize=(8, 5))\n", - "\n", - " ell, cell = cell_ee[\"ANG\"], cell_ee[\"VALUE\"]\n", - " ax.errorbar(\n", - " ell,\n", - " ell * cell,\n", - " yerr=ell * np.sqrt(np.diag(cov_mat)),\n", - " fmt=\"o\",\n", - " label=label_data,\n", - " color=\"black\",\n", - " capsize=2,\n", - " )\n", - "\n", - " for idx, (label, root) in enumerate(zip(labels, root_to_plot)):\n", - " # Read the results\n", - " ell = np.loadtxt(output_folder + \"best_fit/{}/shear_cl/ell.txt\".format(root))\n", - " shear_cl = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_cl/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " mask = (ell > ell_min) & (ell < ell_max)\n", - "\n", - " ax.plot(\n", - " ell[mask],\n", - " ell[mask] * shear_cl[mask] if multiply_ell else shear_cl[mask],\n", - " label=label,\n", - " **line_args[idx],\n", - " )\n", - "\n", - " # Plot the scale cuts for different k_max\n", - " ax.axvline(x=1800, color=\"black\", linestyle=\"--\", alpha=0.5)\n", - " ax.axvline(x=2048, color=\"black\", linestyle=\"--\", alpha=1.0)\n", - " ax.axvline(x=500, color=\"black\", linestyle=\"--\", alpha=0.3)\n", - "\n", - " # Add labels directly under the tick\n", - " ax.text(\n", - " 1740,\n", - " 0.90,\n", - " r\"$k_\\mathrm{max} = 3 h$ Mpc$^{-1}$\",\n", - " transform=ax.get_xaxis_transform(),\n", - " ha=\"center\",\n", - " va=\"top\",\n", - " fontsize=14,\n", - " rotation=90,\n", - " )\n", - "\n", - " ax.text(\n", - " 1978,\n", - " 0.90,\n", - " r\"$k_\\mathrm{max} = 5 h$ Mpc$^{-1}$\",\n", - " transform=ax.get_xaxis_transform(),\n", - " ha=\"center\",\n", - " va=\"top\",\n", - " fontsize=14,\n", - " rotation=90,\n", - " )\n", - "\n", - " ax.text(\n", - " 470,\n", - " 0.90,\n", - " r\"$k_\\mathrm{max} = 1 h$ Mpc$^{-1}$\",\n", - " transform=ax.get_xaxis_transform(),\n", - " ha=\"center\",\n", - " va=\"top\",\n", - " fontsize=14,\n", - " rotation=90,\n", - " )\n", - "\n", - " ell, cell = cell_ee[\"ANG\"], cell_ee[\"VALUE\"]\n", - " ax.set_ylabel(r\"$\\ell C_\\ell \\times 10^{-7}$\", fontsize=20)\n", - " ax.set_xlabel(r\"Multipole $\\ell$\", fontsize=20)\n", - " ax.set_xlim(ell.min() - 10, ell.max() + 100)\n", - " ax.set_xscale(\"squareroot\")\n", - " ax.set_xticks(np.array([100, 400, 900, 1600]))\n", - " ax.minorticks_on()\n", - " ax.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - " minor_ticks = [i * 10 for i in range(1, 10)] + [i * 100 for i in range(1, 21)]\n", - " ax.xaxis.set_ticks(minor_ticks, minor=True)\n", - " ax.tick_params(axis=\"both\", which=\"major\", labelsize=14)\n", - " ax.tick_params(axis=\"both\", which=\"minor\", labelsize=10)\n", - " ax.yaxis.get_offset_text().set_visible(False)\n", - "\n", - " plt.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor, fontsize=11)\n", - "\n", - " if savefile is not None:\n", - " plt.savefig(savefile, bbox_inches=\"tight\")\n", - "\n", - " plt.show()\n", - "\n", - "\n", - "def plot_best_fit_ratio(\n", - " root_to_plot, colours, savefile, theta_min=1.0, theta_max=250.0\n", - "):\n", - " data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_version}/cosmosis_{catalog_version}.fits\"\n", - " )\n", - " xi_plus = data[\"XI_PLUS\"].data\n", - " xi_minus = data[\"XI_MINUS\"].data\n", - " cov_mat = data[\"COVMAT\"].data\n", - "\n", - " plt.figure(figsize=(15, 15))\n", - "\n", - " plt.subplot(211)\n", - "\n", - " root = roots[0]\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_plus_model_fiducial = shear_xi_plus[mask]\n", - " if add_xi_sys:\n", - " xi_plus_model_fiducial += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_plus\n", - " )\n", - "\n", - " plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"]\n", - " / np.interp(xi_plus[\"ANG\"], theta_arcmin[mask], xi_plus_model_fiducial),\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20]\n", - " / np.abs(np.interp(xi_plus[\"ANG\"], theta_arcmin[mask], xi_plus_model_fiducial)),\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_plus_model = shear_xi_plus[mask]\n", - " if add_xi_sys:\n", - " xi_plus_model += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_plus\n", - " )\n", - "\n", - " alpha = 1.0 if root == roots[0] else 0.5\n", - " plt.plot(\n", - " theta_arcmin[mask],\n", - " xi_plus_model / xi_plus_model_fiducial,\n", - " color=color,\n", - " label=root,\n", - " alpha=alpha,\n", - " )\n", - " plt.axvline(x=lower_bound_xi_plus, color=color, linestyle=\"--\", alpha=0.3)\n", - " plt.axvline(x=upper_bound_xi_plus, color=color, linestyle=\"--\", alpha=0.3)\n", - "\n", - " plt.ylabel(r\"$\\xi_{+}/\\xi_{+, \\text{fid}}$\", fontsize=26)\n", - " plt.xscale(\"log\")\n", - " # plt.yscale('log')\n", - " plt.legend(loc=\"lower left\", fontsize=8)\n", - "\n", - " plt.subplot(212)\n", - "\n", - " root = roots[0]\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_minus_model_fiducial = shear_xi_minus[mask]\n", - " if add_xi_sys:\n", - " xi_minus_model_fiducial += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_minus\n", - " )\n", - "\n", - " plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"]\n", - " / np.interp(xi_minus[\"ANG\"], theta_arcmin[mask], xi_minus_model_fiducial),\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40]\n", - " / np.abs(\n", - " np.interp(xi_minus[\"ANG\"], theta_arcmin[mask], xi_minus_model_fiducial)\n", - " ),\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = np.loadtxt(\n", - " output_folder + \"best_fit/{}/xi_sys/theta.txt\".format(root)\n", - " )\n", - " theta_xi_sys_arcmin = theta_xi_sys * 180 * 60 / np.pi\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - " xi_minus_model = shear_xi_minus[mask]\n", - " if add_xi_sys:\n", - " xi_minus_model += np.interp(\n", - " theta_arcmin[mask], theta_xi_sys_arcmin, xi_sys_minus\n", - " )\n", - "\n", - " alpha = 1.0 if root == roots[0] else 0.5\n", - " plt.plot(\n", - " theta_arcmin[mask],\n", - " xi_minus_model / xi_minus_model_fiducial,\n", - " color=color,\n", - " label=root,\n", - " alpha=alpha,\n", - " )\n", - " plt.axvline(x=lower_bound_xi_minus, color=color, linestyle=\"--\", alpha=0.3)\n", - " plt.axvline(x=upper_bound_xi_minus, color=color, linestyle=\"--\", alpha=0.3)\n", - "\n", - " plt.xlabel(r\"$\\theta$ [arcmin]\", fontsize=26)\n", - " plt.ylabel(r\"$\\xi_{-}/\\xi_{-, \\text{fid}}$\", fontsize=26)\n", - " plt.xscale(\"log\")\n", - " plt.ylim(0, 2)\n", - " # plt.yscale('log')\n", - " plt.legend(loc=\"lower left\", fontsize=8)\n", - "\n", - " if savefile is not None:\n", - " plt.savefig(savefile, bbox_inches=\"tight\")\n", - "\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "plt.rcParams.update({\"font.family\": \"serif\"})\n", - "\n", - "root_to_plot = [\n", - " \"SP_v1.4.6_leak_corr_A_lmin=300_lmax=1600_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_halofit_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_10_80\",\n", - "]\n", - "\n", - "labels = [\n", - " r\"UNIONS $C_\\ell$, Blind A\",\n", - " r\"UNIONS $C_\\ell$, Halofit\",\n", - " r\"UNIONS $\\xi_\\pm(\\vartheta)$ (Goh et al., 2026)\",\n", - "]\n", - "\n", - "line_args = [\n", - " {\"color\": \"royalblue\", \"linestyle\": \"-\"},\n", - " {\"color\": \"royalblue\", \"linestyle\": \"--\"},\n", - " {\"color\": \"orange\", \"linestyle\": \"-\"},\n", - "]\n", - "\n", - "log_legend = \"lower center\"\n", - "bbox_to_anchor = (0.685, 0.70)\n", - "\n", - "savefile = \"../papers/harmonic/plots/paperplot_Cell_EE_and_best_fit.png\"\n", - "\n", - "plot_best_fit(\n", - " catalog_version,\n", - " root_to_plot,\n", - " line_args,\n", - " savefile,\n", - " labels=labels,\n", - " loc_legend=log_legend,\n", - " bbox_to_anchor=bbox_to_anchor,\n", - ")\n", - "\n", - "savefile = \"../papers/harmonic/plots/paperplot_Cell_EE_and_best_fit.pdf\"\n", - "\n", - "plot_best_fit(\n", - " catalog_version,\n", - " root_to_plot,\n", - " line_args,\n", - " savefile,\n", - " labels=labels,\n", - " loc_legend=log_legend,\n", - " bbox_to_anchor=bbox_to_anchor,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "root_to_plot = [\n", - " \"SP_v1.4.6_leak_corr_A_small_scales_cell\",\n", - " \"SP_v1.4.6_leak_corr_A_large_scales_cell\",\n", - "]\n", - "\n", - "labels = [r\"Small scales only\", r\"Large scales only\"]\n", - "\n", - "line_args = [\n", - " {\"color\": \"royalblue\", \"linestyle\": \"-\"},\n", - " {\"color\": \"royalblue\", \"linestyle\": \"--\"},\n", - "]\n", - "\n", - "savefile = \"../papers/harmonic/plots/small_vs_large_scale.png\"\n", - "\n", - "plot_best_fit(catalog_version, root_to_plot, line_args, savefile, labels=labels)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# DEPRECATED code\n", - "\n", - "root_to_plot = [\n", - " \"SP_v1.4.5_A\",\n", - " # \"SP_v1.4.5_A_no_IA\",\n", - " # \"SP_v1.4.5_A_no_dz\",\n", - " # \"SP_v1.4.5_A_no_m_bias\",\n", - " \"SP_v1.4.5_A_sc_3_150\",\n", - " \"SP_v1.4.5_A_sc_3_60\",\n", - " \"SP_v1.4.5_A_sc_10_150\",\n", - " \"SP_v1.4.5_A_sc_10_60\",\n", - " \"SP_v1.4.5_A_sc_5_150\",\n", - " \"SP_v1.4.5_A_sc_7_150\",\n", - " # \"SP_v1.4.5_A_no_leakage\"\n", - "]\n", - "\n", - "\"\"\" root_to_plot = [\n", - " f\"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_{int(i)}.0_80.0_10.0_80.0\" for i in [3, 5, 7, 10, 11]\n", - "] \"\"\"\n", - "\n", - "root_to_plot = [\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0\",\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0_no_alpha_beta\",\n", - "]\n", - "\n", - "\n", - "colours = [\n", - " \"red\",\n", - " \"salmon\",\n", - " \"darkorange\",\n", - " \"forestgreen\",\n", - " \"turquoise\",\n", - " \"darkviolet\",\n", - " \"crimson\",\n", - " \"gold\",\n", - " \"lightcoral\",\n", - " \"mediumseagreen\",\n", - " \"lightsteelblue\",\n", - " \"black\",\n", - " \"silver\",\n", - " \"peru\",\n", - " \"maroon\",\n", - " \"olive\",\n", - "]\n", - "\n", - "savefile = \"best_fit_ratio_w_wo_leakage.png\"\n", - "\n", - "plot_best_fit_ratio(root_to_plot, colours, savefile)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_best_fit_tau(root_to_plot, colours, savefile, theta_min=1.0, theta_max=250.0):\n", - " data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_version}/cosmosis_{catalog_version}.fits\"\n", - " )\n", - " tau_0 = data[\"TAU_0_PLUS\"].data\n", - " tau_2 = data[\"TAU_2_PLUS\"].data\n", - " cov_mat = data[\"COVMAT\"].data\n", - "\n", - " plt.figure(figsize=(15, 15))\n", - "\n", - " plt.subplot(211)\n", - "\n", - " plt.errorbar(\n", - " tau_0[\"ANG\"],\n", - " tau_0[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[40:60],\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_0_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " tau_0_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_0_plus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - "\n", - " plt.plot(\n", - " theta_arcmin[mask], tau_0_plus[mask], color=color, label=root, alpha=0.5\n", - " )\n", - "\n", - " plt.ylabel(r\"$\\tau_0$\", fontsize=26)\n", - " plt.xscale(\"log\")\n", - " # plt.yscale('log')\n", - " plt.legend(loc=\"upper right\", fontsize=8)\n", - "\n", - " plt.subplot(212)\n", - "\n", - " y_plot_tau_2 = tau_2[\"ANG\"] * tau_2[\"VALUE\"]\n", - " y_errorbar = tau_2[\"ANG\"] * np.sqrt(np.diag(cov_mat))[60:80]\n", - " plt.errorbar(\n", - " tau_2[\"ANG\"],\n", - " y_plot_tau_2,\n", - " yerr=y_errorbar,\n", - " fmt=\"o\",\n", - " label=f\"{catalog_version} data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - " )\n", - "\n", - " for root, color in zip(root_to_plot, colours):\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_2_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " tau_2_plus = np.loadtxt(\n", - " output_folder + \"best_fit/{}/tau_2_plus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " mask = (theta_arcmin > theta_min) & (theta_arcmin < theta_max)\n", - "\n", - " plt.plot(\n", - " theta_arcmin[mask],\n", - " theta_arcmin[mask] * tau_2_plus[mask],\n", - " color=color,\n", - " label=root,\n", - " alpha=0.5,\n", - " )\n", - "\n", - " plt.xlabel(r\"$\\theta$ [arcmin]\", fontsize=26)\n", - " plt.ylabel(r\"$\\theta \\tau_2$\", fontsize=26)\n", - " plt.xscale(\"log\")\n", - " # plt.yscale('log')\n", - " plt.legend(loc=\"upper left\", fontsize=8)\n", - "\n", - " if savefile is not None:\n", - " plt.savefig(savefile, bbox_inches=\"tight\")\n", - "\n", - " plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "root_to_plot = [\n", - " \"SP_v1.4.5_A\",\n", - " # \"SP_v1.4.5_A_no_IA\",\n", - " # \"SP_v1.4.5_A_no_dz\",\n", - " # \"SP_v1.4.5_A_no_m_bias\",\n", - " \"SP_v1.4.5_A_sc_3_150\",\n", - " \"SP_v1.4.5_A_sc_3_60\",\n", - " \"SP_v1.4.5_A_sc_10_150\",\n", - " \"SP_v1.4.5_A_sc_10_60\",\n", - " \"SP_v1.4.5_A_sc_5_150\",\n", - " \"SP_v1.4.5_A_sc_7_150\",\n", - " # \"SP_v1.4.5_A_no_leakage\"\n", - "]\n", - "\n", - "root_to_plot = [\n", - " f\"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_{int(i)}.0_80.0_10.0_80.0\"\n", - " for i in [3, 5, 7, 10, 11]\n", - "]\n", - "\n", - "colours = [\n", - " \"red\",\n", - " \"salmon\",\n", - " \"darkorange\",\n", - " \"forestgreen\",\n", - " \"turquoise\",\n", - " \"darkviolet\",\n", - " \"crimson\",\n", - " \"gold\",\n", - " \"lightcoral\",\n", - " \"mediumseagreen\",\n", - " \"lightsteelblue\",\n", - " \"black\",\n", - " \"silver\",\n", - " \"peru\",\n", - " \"maroon\",\n", - " \"olive\",\n", - "]\n", - "\n", - "savefile = \"best_fit_tau_new_binning.png\"\n", - "\n", - "plot_best_fit_tau(root_to_plot, colours, savefile)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "pseudo_cell = fits.open(\n", - " \"/home/guerrini/sp_validation/cosmo_val/output/pseudo_cl_SP_v1.4.5.fits\"\n", - ")[1].data\n", - "cov_pseudo_cell = fits.open(\n", - " \"/home/guerrini/sp_validation/cosmo_val/output/pseudo_cl_cov_SP_v1.4.5.fits\"\n", - ")\n", - "\n", - "theory_ell = np.loadtxt(\n", - " \"/n09data/guerrini/output_chains/best_fit/SP_v1.4.5_A/shear_cl/ell.txt\"\n", - ")\n", - "theory_cell = np.loadtxt(\n", - " \"/n09data/guerrini/output_chains/best_fit/SP_v1.4.5_A/shear_cl/bin_1_1.txt\"\n", - ")\n", - "\n", - "pw = hp.pixwin(1024, lmax=2048)\n", - "\n", - "plt.errorbar(\n", - " pseudo_cell[\"ELL\"],\n", - " pseudo_cell[\"ELL\"] * pseudo_cell[\"EE\"],\n", - " yerr=pseudo_cell[\"ELL\"] * np.sqrt(np.diag(cov_pseudo_cell[\"COVAR_EE_EE\"].data)),\n", - " capsize=2,\n", - " c=\"k\",\n", - " fmt=\"o\",\n", - " markersize=2,\n", - ")\n", - "\n", - "mask = (theory_ell > 0.1) & (theory_ell < 2048)\n", - "plt.plot(\n", - " theory_ell[mask],\n", - " theory_ell[mask]\n", - " * theory_cell[mask]\n", - " * np.interp(theory_ell[mask], np.arange(0, 2049), pw) ** 2,\n", - " c=\"r\",\n", - " label=\"best-fit $\\\\theta \\\\in [3-200]$\",\n", - ")\n", - "\n", - "plt.xlabel(r\"$\\ell$\", fontsize=26)\n", - "plt.ylabel(r\"$\\ell C_\\ell^{EE}$\", fontsize=26)\n", - "plt.legend()\n", - "plt.savefig(\"SP_v1.4.5_A_cell.png\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "cov_pseudo_cell.info()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "sp_validation", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/S8_om_sigma8_whisker.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/S8_om_sigma8_whisker.ipynb deleted file mode 100644 index 7a4fd5d2..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/S8_om_sigma8_whisker.ipynb +++ /dev/null @@ -1,645 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0", - "metadata": {}, - "source": [ - "# Whisker plot\n", - "\n", - "This notebook plots the whisker plot of $S_8$, $\\Omega_m$ and $\\sigma_8$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import sys\n", - "\n", - "# Trick to plot with tex\n", - "os.environ[\"LD_LIBRARY_PATH\"] = \"\"\n", - "os.environ[\"CONDA_PREFIX\"] = \"/home/guerrini/.conda/envs/sp_validation_3.11\"\n", - "\n", - "sys.path.append(\"/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/notebooks/\")\n", - "\n", - "import sys\n", - "import warnings\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "from getdist import plots\n", - "\n", - "sys.path.append(\"/home/guerrini/sp_validation/cosmo_inference/scripts\")\n", - "\n", - "import chain_postprocessing as cp\n", - "\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "\n", - "plt.rc(\"text\", usetex=True)\n", - "\n", - "sns.set_palette(\"husl\")\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 60\n", - "g.settings.axes_labelsize = 60\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 60\n", - "\n", - "%matplotlib inline\n", - "\n", - "# SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE\n", - "root_dir = \"/n09data/guerrini/output_chains/\"\n", - "root_external = f\"{root_dir}/ext_data/\"\n", - "blind = \"B\"\n", - "\n", - "roots = [\n", - " f\"SP_v1.4.6.3_{blind}_fiducial_config\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}\",\n", - " \"Planck18\",\n", - " \"DES Y6\",\n", - " \"KiDS-Legacy_bandpowers\",\n", - " \"KiDS-Legacy_cosebis\",\n", - " \"KiDS-Legacy_xipm\",\n", - " \"HSC_Y3\",\n", - " \"HSC_Y3_cell\",\n", - " f\"SP_v1.4.6.3_{blind}_small_scales_config\",\n", - " f\"SP_v1.4.6.3_{blind}_flat_alpha_beta_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_xi_sys_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_leak_corr_config\",\n", - " f\"SP_v1.4.6.3_{blind}_flat_delta_z_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_delta_z_config\",\n", - " f\"SP_v1.4.6.3_{blind}_flat_ia_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_ia_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_m_bias_config\",\n", - " f\"SP_v1.4.6.3_{blind}_unmasked_covmat_config\",\n", - " f\"SP_v1.4.6.3_{blind}_halofit_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_baryons_config\",\n", - " f\"SP_v1.4.6.3_{blind}_nautilus_config\",\n", - " f\"SP_v1.4.6.3_{blind}_planck_config\",\n", - " f\"SP_v1.4.6.3_{blind}_planck_desi_config\",\n", - "]\n", - "\n", - "legend_labels = [\n", - " r\"UNIONS-3500 $\\xi_{\\pm}(\\theta)$ (This work)\",\n", - " r\"UNIONS-3500 $C_\\ell$ (Guerrini et al. 2026)\",\n", - " r\"$\\textit{Planck}$ 2018\",\n", - " r\"DES Y6 $\\xi_{\\pm}$, NLA\",\n", - " r\"KiDS-Legacy Bandpowers ($C_{\\rm E}$)\",\n", - " r\"KiDS-Legacy COSEBIs ($E_n$)\",\n", - " r\"KiDS-Legacy $\\xi_{\\pm}(\\theta)$\",\n", - " r\"HSC-Y3 $\\xi_{\\pm}(\\theta)$\",\n", - " r\"HSC-Y3 $C_\\ell$\",\n", - " r\"$\\xi_+$ small scales, $\\theta$=[5,83] arcmin\",\n", - " r\"Flat $\\alpha_{\\rm{PSF}}$ and $\\beta_{\\rm{PSF}}$ priors\",\n", - " r\"No $\\xi^{\\rm sys}_{\\pm}$\",\n", - " r\"No leakage correction\",\n", - " r\"Flat $\\Delta z$ priors\",\n", - " r\"No $\\Delta z$\",\n", - " r\"Flat $A_{\\rm IA}$ prior\",\n", - " r\"No $A_{\\rm IA}$\",\n", - " r\"No $m$ bias\",\n", - " r\"Unmasked covmat\",\n", - " r\"$\\texttt{Halofit}$\",\n", - " r\"$\\texttt{HMCode}$ no baryons\",\n", - " r\"Nautilus sampler\",\n", - " r\"UNIONS-3500 + $\\textit{Planck}$\",\n", - " r\"UNIONS-3500 + $\\textit{Planck}$ + DESI BAO\",\n", - "]\n", - "\n", - "categories = [\n", - " \"configuration\",\n", - " \"harmonic\",\n", - " \"external\",\n", - " \"external\",\n", - " \"external\",\n", - " \"external\",\n", - " \"external\",\n", - " \"external\",\n", - " \"external\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - " \"configuration\",\n", - "]\n", - "colours = [\n", - " \"darkorange\",\n", - " \"royalblue\",\n", - " \"violet\",\n", - " \"black\",\n", - " \"black\",\n", - " \"black\",\n", - " \"black\",\n", - " \"black\",\n", - " \"black\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - " \"forestgreen\",\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "chains = []\n", - "for i, root in enumerate(roots):\n", - " category = categories[i]\n", - " if root == \"DES Y6\":\n", - " continue\n", - " if category != \"external\":\n", - " if category == \"configuration\":\n", - " path_samples = os.path.join(root_dir, f\"{root}/samples_{root}.txt\")\n", - " path_getdist = os.path.join(root_dir, f\"{root}/getdist_{root}\")\n", - " elif category == \"harmonic\":\n", - " path_samples = os.path.join(\n", - " root_dir, f\"{root}/{root}/samples_{root}_cell.txt\"\n", - " )\n", - " path_getdist = os.path.join(root_dir, f\"{root}/{root}/getdist_{root}\")\n", - " elif category == \"external_compute_sample\":\n", - " path_samples = os.path.join(root_dir, f\"ext_data/{root}/samples_{root}.txt\")\n", - " path_getdist = os.path.join(root_dir, f\"ext_data/{root}/getdist_{root}\")\n", - " else:\n", - " raise ValueError(f\"The category, {category}, of {root} is not correct\")\n", - " if \"nautilus\" not in root:\n", - " cp.load_samples_and_write_paramnames(\n", - " path_samples, path_getdist + \".paramnames\"\n", - " )\n", - " cp.write_samples_getdist_format(path_samples, path_getdist + \".txt\")\n", - " else:\n", - " cp.load_samples_and_write_paramnames(\n", - " path_samples, path_getdist + \".paramnames\", chain_type=\"nautilus\"\n", - " )\n", - " cp.write_samples_getdist_format(\n", - " path_samples, path_getdist + \".txt\", chain_type=\"nautilus\"\n", - " )\n", - " chains.append(cp.load_chain(path_getdist, smoothing_scale=0.5))\n", - " else:\n", - " path_getdist = os.path.join(root_dir, f\"ext_data/{root}/getdist_{root}\")\n", - " chains.append(cp.load_chain(path_getdist))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "name_list = [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"S_8\",\n", - " \"s_8_input\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - "]\n", - "label_list = [\n", - " r\"\\Omega_{\\rm m}\",\n", - " r\"\\omega_b h^2\",\n", - " r\"h_0\",\n", - " r\"n_s\",\n", - " r\"\\sigma_8\",\n", - " r\"S_8\",\n", - " r\"S_8\",\n", - " r\"\\log T_{\\rm AGN}\",\n", - " r\"A_{\\rm IA}\",\n", - " r\"m_1\",\n", - " r\"\\Delta z_1\",\n", - "]\n", - "\n", - "for i, chain in enumerate(chains):\n", - " print(legend_labels[i])\n", - " param_names = chain.getParamNames()\n", - " for name, label in zip(name_list, label_list):\n", - " try:\n", - " param_names.parWithName(name).label = label\n", - " except Exception:\n", - " warnings.warn(f\"Parameter {name} not found in chain {roots[i]}.\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "# Micro management of external chains\n", - "\n", - "# Account for the missing parameter conventions\n", - "\n", - "idx = roots.index(\"KiDS-Legacy_xipm\")\n", - "cp.derive_parameter_S8(chains[idx])\n", - "\n", - "idx = roots.index(\"KiDS-Legacy_bandpowers\")\n", - "cp.derive_parameter_S8(chains[idx])\n", - "\n", - "idx = roots.index(\"KiDS-Legacy_cosebis\")\n", - "cp.derive_parameter_S8(chains[idx])\n", - "\n", - "# OMEGA_M not in HSC_Y3_cell\n", - "idx = roots.index(\"HSC_Y3_cell\")\n", - "cp.adjust_paramname_chain(chains[idx], \"omega_m\", \"OMEGA_M\", r\"\\Omega_{\\rm m}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "param_values = np.array(\n", - " [\n", - " \"# Expt\",\n", - " \"Colour\",\n", - " \"S8_Mean\",\n", - " \"S8_low\",\n", - " \"S8_high\",\n", - " \"sigma_8_Mean\",\n", - " \"sigma_8_low\",\n", - " \"sigma_8_high\",\n", - " \"Omega_m_Mean\",\n", - " \"Omega_m_low\",\n", - " \"Omega_m_high\",\n", - " ]\n", - ")\n", - "escaped = np.char.replace(legend_labels, \"\\\\\", \"\\\\\\\\\")\n", - "\n", - "for i, root in enumerate(roots):\n", - " chain = chains[i]\n", - " if root == \"DES Y6\":\n", - " param_values = np.vstack(\n", - " (\n", - " param_values,\n", - " [\n", - " escaped[i],\n", - " colours[i],\n", - " 0.798,\n", - " 0.015,\n", - " 0.014,\n", - " 0.763,\n", - " 0.057,\n", - " 0.050,\n", - " 0.332,\n", - " 0.040,\n", - " 0.035,\n", - " ],\n", - " )\n", - " )\n", - " else:\n", - " best_fit_params = cp.extract_best_fit_params(chain, best_fit_method=\"2Dkde\")\n", - " margestats = chain.getMargeStats()\n", - "\n", - " s8_stats = margestats.parWithName(\"S_8\")\n", - " sigma8_stats = margestats.parWithName(\"SIGMA_8\")\n", - " omegam_stats = margestats.parWithName(\"OMEGA_M\")\n", - "\n", - " param_values = np.vstack(\n", - " (\n", - " param_values,\n", - " [\n", - " escaped[i],\n", - " colours[i],\n", - " best_fit_params[\"S_8\"],\n", - " best_fit_params[\"S_8\"] - s8_stats.limits[0].lower,\n", - " s8_stats.limits[0].upper - best_fit_params[\"S_8\"],\n", - " best_fit_params[\"SIGMA_8\"],\n", - " best_fit_params[\"SIGMA_8\"] - sigma8_stats.limits[0].lower,\n", - " sigma8_stats.limits[0].upper - best_fit_params[\"SIGMA_8\"],\n", - " best_fit_params[\"OMEGA_M\"],\n", - " best_fit_params[\"OMEGA_M\"] - omegam_stats.limits[0].lower,\n", - " omegam_stats.limits[0].upper - best_fit_params[\"OMEGA_M\"],\n", - " ],\n", - " )\n", - " )\n", - "print(param_values)\n", - "np.savetxt(\n", - " f\"{root_dir}/param_values.txt\",\n", - " param_values,\n", - " fmt=[\"%s\" for i in range(11)],\n", - " delimiter=\";\",\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "# Load the value of the parameters\n", - "cosmo = np.loadtxt(\n", - " f\"{root_dir}/param_values.txt\",\n", - " dtype={\n", - " \"names\": (\n", - " \"Expt\",\n", - " \"colour\",\n", - " \"s8_mean\",\n", - " \"s8_low\",\n", - " \"s8_high\",\n", - " \"sigma8_mean\",\n", - " \"sigma8_low\",\n", - " \"sigma8_high\",\n", - " \"omegam_mean\",\n", - " \"omegam_low\",\n", - " \"omegam_high\",\n", - " ),\n", - " \"formats\": (\n", - " \"U250\",\n", - " \"U20\",\n", - " \"U20\",\n", - " \"U20\",\n", - " \"U20\",\n", - " \"U20\",\n", - " \"U20\",\n", - " \"U20\",\n", - " \"U20\",\n", - " \"U20\",\n", - " \"U20\",\n", - " ),\n", - " },\n", - " skiprows=1,\n", - " delimiter=\";\",\n", - ")\n", - "expt = np.char.replace(cosmo[\"Expt\"], \"\\\\\\\\\", \"\\\\\")\n", - "colours = cosmo[\"colour\"]\n", - "s8_mean = cosmo[\"s8_mean\"].astype(np.float64)\n", - "s8_low = cosmo[\"s8_low\"].astype(np.float64)\n", - "s8_high = cosmo[\"s8_high\"].astype(np.float64)\n", - "sigma8_mean = cosmo[\"sigma8_mean\"].astype(np.float64)\n", - "sigma8_low = cosmo[\"sigma8_low\"].astype(np.float64)\n", - "sigma8_high = cosmo[\"sigma8_high\"].astype(np.float64)\n", - "omegam_mean = cosmo[\"omegam_mean\"].astype(np.float64)\n", - "omegam_low = cosmo[\"omegam_low\"].astype(np.float64)\n", - "omegam_high = cosmo[\"omegam_high\"].astype(np.float64)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.gridspec import GridSpec\n", - "\n", - "fig = plt.figure(figsize=(13, 8))\n", - "gs = GridSpec(1, 3, width_ratios=[1, 0.5, 0.5])\n", - "ax1 = fig.add_subplot(gs[0])\n", - "ax2 = fig.add_subplot(gs[1], sharey=ax1)\n", - "ax3 = fig.add_subplot(gs[2], sharey=ax1)\n", - "\n", - "axs = [ax1, ax2, ax3]\n", - "\n", - "params = [\n", - " (s8_mean, s8_low, s8_high, r\"$S_8$\"),\n", - " (sigma8_mean, sigma8_low, sigma8_high, r\"$\\sigma_8$\"),\n", - " (omegam_mean, omegam_low, omegam_high, r\"$\\Omega_{\\rm m}$\"),\n", - "]\n", - "reference = r\"UNIONS-3500 $\\xi_{\\pm}(\\theta)$ (This work)\"\n", - "\n", - "separation_after = [\n", - " r\"UNIONS-3500 $C_\\ell$ (Guerrini et al. 2026)\",\n", - " r\"HSC-Y3 $C_\\ell$\",\n", - " r\"$\\xi_+$ small scales, $\\theta$=[5,83] arcmin\",\n", - " r\"Unmasked covmat\",\n", - " r\"$\\texttt{HMCode}$ no baryons\",\n", - " r\"Nautilus sampler\",\n", - "]\n", - "list_section_index = [r\"(ii)\", r\"(iii)\", r\"(iv)\", r\"(v)\", r\"(vi)\", r\"(vii)\"]\n", - "\n", - "preliminary_watermark = False\n", - "blind_axes = False\n", - "row_spacing = 0.2\n", - "\n", - "index_ref = np.where(expt == reference)[0][0]\n", - "\n", - "y = np.arange(len(expt))\n", - "for ax, param in zip(axs, params):\n", - " means, lows, highs, label = param\n", - " for i, mean, low, high, color in zip(y, means, lows, highs, colours):\n", - " ax.errorbar(\n", - " mean,\n", - " 0.05 + i * row_spacing,\n", - " xerr=np.array([low, high])[:, None],\n", - " fmt=\"o\",\n", - " color=color,\n", - " ecolor=color,\n", - " elinewidth=2,\n", - " capsize=3,\n", - " )\n", - " ax.set_xlabel(label, fontsize=14)\n", - "\n", - " ax.grid(False)\n", - " ax.tick_params(axis=\"y\", left=False, labelleft=False)\n", - " if label == r\"$S_8$\":\n", - " ax.axvspan(\n", - " s8_mean[index_ref] - s8_low[index_ref],\n", - " s8_mean[index_ref] + s8_high[index_ref],\n", - " color=colours[index_ref],\n", - " alpha=0.2,\n", - " )\n", - " ax.set_xlim(0.6, 1.35)\n", - " if blind_axes:\n", - " ref_tick = np.mean(s8_mean[:4])\n", - " ax.set_xticks([ref_tick + i * 0.1 for i in range(-5, 5)], labels=[])\n", - " elif label == r\"$\\sigma_8$\":\n", - " ax.axvspan(\n", - " sigma8_mean[index_ref] - sigma8_low[index_ref],\n", - " sigma8_mean[index_ref] + sigma8_high[index_ref],\n", - " color=colours[index_ref],\n", - " alpha=0.2,\n", - " )\n", - " ax.set_xlim(0.5, 1.35)\n", - " if blind_axes:\n", - " ref_tick = np.mean(sigma8_mean[:4])\n", - " ax.set_xticks([ref_tick + i * 0.2 for i in range(-2, 2)], labels=[])\n", - " elif label == r\"$\\Omega_{\\rm m}$\":\n", - " ax.axvspan(\n", - " omegam_mean[index_ref] - omegam_low[index_ref],\n", - " omegam_mean[index_ref] + omegam_high[index_ref],\n", - " color=colours[index_ref],\n", - " alpha=0.2,\n", - " )\n", - " ax.set_xlim(0.1, 0.5)\n", - " if blind_axes:\n", - " ref_tick = np.mean(omegam_mean[:4])\n", - " ax.set_xticks([ref_tick + i * 0.1 for i in range(-2, 3)], labels=[])\n", - "\n", - "\n", - "ax1.set_yticks(0.01 + y * row_spacing)\n", - "ax1.set_yticklabels([])\n", - "for label, color in zip(expt, colours):\n", - " if \"This work\" in label:\n", - " label_bold = (\n", - " r\"$\\bf{UNIONS}$-$\\bf{3500}$ $\\xi_{\\pm}(\\theta)$ $\\bf{(This\\ work)}$\"\n", - " )\n", - " ax1.text(\n", - " -0.6,\n", - " 0.05 + row_spacing * np.where(expt == label)[0][0],\n", - " label_bold,\n", - " fontsize=12,\n", - " ha=\"left\",\n", - " va=\"center\",\n", - " color=color,\n", - " )\n", - " else:\n", - " ax1.text(\n", - " -0.6,\n", - " 0.05 + row_spacing * np.where(expt == label)[0][0],\n", - " label,\n", - " fontsize=12,\n", - " ha=\"left\",\n", - " va=\"center\",\n", - " color=color,\n", - " )\n", - " if label != reference:\n", - " index = np.where(expt == label)[0][0]\n", - " s8_tension = cp.get_sigma_tension(\n", - " s8_mean[index],\n", - " s8_low[index],\n", - " s8_high[index],\n", - " s8_mean[index_ref],\n", - " s8_low[index_ref],\n", - " s8_high[index_ref],\n", - " )\n", - " sign_str = \"+\" if s8_tension > 0 else \"-\"\n", - " ax1.text(\n", - " 1.32,\n", - " 0.05 + row_spacing * index,\n", - " rf\"${sign_str}{np.abs(s8_tension):.2f}\" + r\"\\, \\sigma$\",\n", - " fontsize=10,\n", - " ha=\"right\",\n", - " va=\"center\",\n", - " color=color,\n", - " )\n", - "# Add separation lines\n", - "for i, sep in enumerate(separation_after):\n", - " print(sep)\n", - " index_sep = np.where(expt == sep)[0][0]\n", - " ax2.axhline(\n", - " row_spacing * (index_sep + 1) - 0.07,\n", - " color=\"black\",\n", - " linestyle=\"dotted\",\n", - " linewidth=1,\n", - " )\n", - " ax3.axhline(\n", - " row_spacing * (index_sep + 1) - 0.07,\n", - " color=\"black\",\n", - " linestyle=\"dotted\",\n", - " linewidth=1,\n", - " )\n", - " ax1.axhline(\n", - " row_spacing * (index_sep + 1) - 0.07,\n", - " xmin=-1.8,\n", - " color=\"black\",\n", - " linestyle=\"dotted\",\n", - " linewidth=1,\n", - " clip_on=False,\n", - " )\n", - " ax1.text(\n", - " -0.61,\n", - " row_spacing * (index_sep + 1) + 0.05,\n", - " list_section_index[i],\n", - " fontsize=12,\n", - " fontweight=\"bold\",\n", - " va=\"center\",\n", - " ha=\"right\",\n", - " )\n", - "\n", - "\n", - "# --- Add section label (i)) ---\n", - "ax1.text(-0.61, 0.05, r\"(i)\", fontsize=12, fontweight=\"bold\", va=\"center\", ha=\"right\")\n", - "\n", - "if preliminary_watermark:\n", - " plt.figtext(\n", - " 0.5,\n", - " 0.5,\n", - " \"PRELIMINARY\",\n", - " fontsize=50,\n", - " color=\"gray\",\n", - " ha=\"center\",\n", - " va=\"center\",\n", - " alpha=0.3,\n", - " rotation=330,\n", - " )\n", - "\n", - "plt.gca().invert_yaxis()\n", - "\n", - "plt.tight_layout()\n", - "\n", - "# plt.savefig(\"./plots/whisker_plot.png\", dpi=300)\n", - "# #Save pdf\n", - "plt.savefig(\"../Plots/S8_whisker_plot.pdf\", bbox_inches=\"tight\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/best_fit_xipm.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/best_fit_xipm.ipynb deleted file mode 100644 index d6ed4c01..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/best_fit_xipm.ipynb +++ /dev/null @@ -1,607 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0", - "metadata": {}, - "source": [ - "# Best-fit $\\xi_\\pm$\n", - "\n", - "This notebook plots the best-fit 2PCFs for the fiducial and other cases" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import sys\n", - "\n", - "sys.path.append(\"/home/guerrini/sp_validation/cosmo_inference/scripts\")\n", - "\n", - "import chain_postprocessing as cp\n", - "import matplotlib.pyplot as plt\n", - "import matplotlib.scale as mscale\n", - "import numpy as np\n", - "import seaborn as sns\n", - "from astropy.io import fits\n", - "from getdist import plots\n", - "\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "\n", - "from sp_validation.rho_tau import SquareRootScale\n", - "\n", - "mscale.register_scale(SquareRootScale)\n", - "\n", - "plt.rcParams[\"text.usetex\"] = True\n", - "\n", - "sns.set_palette(\"husl\")\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 40\n", - "g.settings.axes_labelsize = 40\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 50\n", - "\n", - "# Directory where the chains are located\n", - "root_dir = \"/n09data/guerrini/output_chains\"\n", - "\n", - "# THE BLIND TO USE FOR THE PLOTS\n", - "blind = \"B\"\n", - "catalog_version = \"SP_v1.4.6.3\"\n", - "fiducial_root_cell = f\"SP_v1.4.6.3_leak_corr_{blind}\"\n", - "label_fiducial_cell = r\"UNIONS $C_{\\ell}$\"\n", - "fiducial_root_xi_data = f\"SP_v1.4.6.3_leak_corr_{blind}_masked\"\n", - "fiducial_root_xi_chains = f\"SP_v1.4.6.3_{blind}_fiducial_config\"\n", - "label_fiducial_xi = r\"UNIONS $\\xi_{\\pm}$\"\n", - "\n", - "# Path to the ini files used\n", - "path_ini_files = \"/home/guerrini/sp_validation/cosmo_inference/cosmosis_config\"\n", - "path_datavectors = \"/home/guerrini/sp_validation/cosmo_inference/data/\"\n", - "path_output_chains = \"/n09data/guerrini/output_chains/\"\n", - "\n", - "\n", - "data_cell = fits.open(\n", - " os.path.join(\n", - " path_datavectors, f\"{fiducial_root_cell}/cosmosis_{fiducial_root_cell}.fits\"\n", - " )\n", - ")\n", - "\n", - "data_xi = fits.open(\n", - " os.path.join(\n", - " path_datavectors,\n", - " f\"SP_v1.4.6.3_config/SP_v1.4.6.3_{blind}/cosmosis_{fiducial_root_xi_data}.fits\",\n", - " )\n", - ")\n", - "\n", - "%matplotlib inline" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "# Perform the computation for the fiducial of Cell\n", - "path_samples_fiducial_cell = os.path.join(\n", - " path_output_chains,\n", - " fiducial_root_cell,\n", - " fiducial_root_cell,\n", - " f\"samples_{fiducial_root_cell}_cell.txt\",\n", - ")\n", - "path_gd_fiducial_cell = os.path.join(\n", - " path_output_chains,\n", - " fiducial_root_cell,\n", - " fiducial_root_cell,\n", - " f\"getdist_{fiducial_root_cell}_cell\",\n", - ")\n", - "cp.load_samples_and_write_paramnames(\n", - " path_samples_fiducial_cell, path_gd_fiducial_cell + \".paramnames\"\n", - ")\n", - "cp.write_samples_getdist_format(\n", - " path_samples_fiducial_cell, path_gd_fiducial_cell + \".txt\", chain_type=\"polychord\"\n", - ")\n", - "\n", - "chain_fiducial_cell = cp.load_chain(path_gd_fiducial_cell, smoothing_scale=0.5)\n", - "\n", - "best_fit_params_fiducial_cell = cp.extract_best_fit_params(\n", - " chain_fiducial_cell, best_fit_method=\"2Dkde\"\n", - ")\n", - "\n", - "cp.compute_best_fit(\n", - " path_ini_files,\n", - " best_fit_params_fiducial_cell,\n", - " fiducial_root_cell,\n", - " is_harmonic=True,\n", - " blind=blind,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "# Perform the computation for the fiducial of xi\n", - "path_samples_fiducial_xi = os.path.join(\n", - " path_output_chains,\n", - " fiducial_root_xi_chains,\n", - " f\"samples_{fiducial_root_xi_chains}.txt\",\n", - ")\n", - "\n", - "path_gd_fiducial_xi = os.path.join(\n", - " path_output_chains, fiducial_root_xi_chains, f\"getdist_{fiducial_root_xi_chains}\"\n", - ")\n", - "cp.load_samples_and_write_paramnames(\n", - " path_samples_fiducial_xi, path_gd_fiducial_xi + \".paramnames\"\n", - ")\n", - "cp.write_samples_getdist_format(\n", - " path_samples_fiducial_xi, path_gd_fiducial_xi + \".txt\", chain_type=\"polychord\"\n", - ")\n", - "\n", - "chain_fiducial_xi = cp.load_chain(path_gd_fiducial_xi, smoothing_scale=0.5)\n", - "\n", - "best_fit_params_fiducial_xi = cp.extract_best_fit_params(\n", - " chain_fiducial_xi, best_fit_method=\"2Dkde\"\n", - ")\n", - "\n", - "ini_file_root = os.path.join(\n", - " path_ini_files,\n", - " f\"config_space_v1.4.6.3_fiducial/pipeline/blind_{blind}/fiducial.ini\",\n", - ")\n", - "cp.compute_best_fit(\n", - " path_ini_files,\n", - " best_fit_params_fiducial_xi,\n", - " fiducial_root_xi_chains,\n", - " is_harmonic=False,\n", - " blind=blind,\n", - " ini_file_root=ini_file_root,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "# Make the plot for the best-fit datavector for Cell EE\n", - "root_to_plot = [\n", - " fiducial_root_xi_chains,\n", - " fiducial_root_cell,\n", - "]\n", - "\n", - "labels = [\n", - " r\"UNIONS $\\xi_\\pm(\\theta)$\",\n", - " r\"UNIONS $C_\\ell$\",\n", - "]\n", - "\n", - "line_args = [\n", - " {\"color\": \"royalblue\", \"linestyle\": \"-\"},\n", - " {\"color\": \"orange\", \"linestyle\": \"-\"},\n", - "]\n", - "\n", - "properties = {}\n", - "\n", - "properties = cp.update_properties_w_roots(\n", - " properties, fiducial_root_cell, path_ini_files, with_configuration=False\n", - ")\n", - "properties = cp.update_properties_w_roots(\n", - " properties,\n", - " fiducial_root_xi_chains,\n", - " path_ini_files,\n", - " with_configuration=True,\n", - " path_to_this_ini=ini_file_root,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "root_to_plot = [fiducial_root_cell, fiducial_root_xi_chains]\n", - "labels = [r\"Best fit $C_\\ell$\", r\"Best fit $\\xi_\\pm(\\theta)$\"]\n", - "path_best_fit_xi_theta = os.path.join(\n", - " path_output_chains, fiducial_root_xi_chains, \"best_fit/shear_xi_plus/theta.txt\"\n", - ")\n", - "\n", - "theta_rad = np.loadtxt(path_best_fit_xi_theta)\n", - "theta_min = 1\n", - "theta_max = 250\n", - "\n", - "cp.compute_best_fit_xi_from_cell(\n", - " path_output_chains, fiducial_root_cell, best_fit_params_fiducial_cell, theta_rad\n", - ")\n", - "\n", - "data = fits.open(\n", - " os.path.join(\n", - " path_datavectors,\n", - " f\"SP_v1.4.6.3_config/SP_v1.4.6.3_{blind}/cosmosis_{fiducial_root_xi_data}.fits\",\n", - " )\n", - ")\n", - "bbox_to_anchor_xip = (0.685, 0.09)\n", - "bbox_to_anchor_xim = (0.3, 0.65)\n", - "xi_p_data = data[\"XI_PLUS\"].data\n", - "xi_m_data = data[\"XI_MINUS\"].data\n", - "cov_mat = data[\"COVMAT\"].data\n", - "\n", - "# Plot hyperparameter\n", - "loc_legend = \"lower center\"\n", - "\n", - "fig, [ax, ax2] = plt.subplots(1, 2, figsize=(20, 8))\n", - "\n", - "theta, xi_p, xi_m = xi_p_data[\"ANG\"], xi_p_data[\"VALUE\"], xi_m_data[\"VALUE\"]\n", - "ax.errorbar(\n", - " theta,\n", - " theta * xi_p,\n", - " yerr=theta * np.sqrt(np.diag(cov_mat[: len(theta), : len(theta)])),\n", - " fmt=\"o\",\n", - " label=r\"UNIONS $\\xi_+$ data\",\n", - " color=\"black\",\n", - " capsize=2,\n", - ")\n", - "ax2.errorbar(\n", - " theta,\n", - " theta * xi_m,\n", - " yerr=theta\n", - " * np.sqrt(\n", - " np.diag(cov_mat[len(theta) : 2 * len(theta), len(theta) : 2 * len(theta)])\n", - " ),\n", - " fmt=\"o\",\n", - " label=r\"UNIONS $\\xi_-$ data\",\n", - " color=\"black\",\n", - " capsize=2,\n", - ")\n", - "\n", - "for idx, (label, root) in enumerate(zip(labels, root_to_plot)):\n", - " # Read the results\n", - " theta = (\n", - " (\n", - " np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " )\n", - " * 180\n", - " / np.pi\n", - " * 60\n", - " )\n", - " xi_plus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_minus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " if r\"$C_\\ell$\" not in label:\n", - " xi_sys_plus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = (\n", - " np.loadtxt(path_output_chains + \"{}/best_fit/xi_sys/theta.txt\".format(root))\n", - " * 180\n", - " / np.pi\n", - " * 60\n", - " )\n", - "\n", - " xi_sys_plus = np.interp(theta, theta_xi_sys, xi_sys_plus)\n", - " xi_sys_minus = np.interp(theta, theta_xi_sys, xi_sys_minus)\n", - " xi_plus += xi_sys_plus\n", - " xi_minus += xi_sys_minus\n", - "\n", - " mask = (theta > theta_min) & (theta < theta_max)\n", - " theta = theta[mask]\n", - " ax.plot(\n", - " theta,\n", - " theta * xi_plus[mask],\n", - " label=r\"Best fit $\\xi_+(\\theta)$\",\n", - " **line_args[idx],\n", - " lw=2.5,\n", - " )\n", - " ax.plot(\n", - " theta,\n", - " theta * xi_sys_plus[mask],\n", - " label=r\"Best fit $\\xi^{\\rm sys}_{+}(\\theta)$\",\n", - " c=\"r\",\n", - " )\n", - " ax2.plot(\n", - " theta,\n", - " theta * xi_minus[mask],\n", - " label=r\"Best fit $\\xi_-(\\theta)$\",\n", - " **line_args[idx],\n", - " lw=2.5,\n", - " )\n", - " ax2.plot(\n", - " theta,\n", - " theta * xi_sys_minus[mask],\n", - " label=r\"Best fit $\\xi^{\\rm sys}_{-}(\\theta)$\",\n", - " c=\"r\",\n", - " )\n", - "\n", - " else:\n", - " mask = (theta > theta_min) & (theta < theta_max)\n", - " theta = theta[mask]\n", - " ax.plot(theta, theta * xi_plus[mask], label=label, **line_args[idx], lw=2.5)\n", - " ax2.plot(theta, theta * xi_minus[mask], label=label, **line_args[idx], lw=2.5)\n", - "# XI PLUS PLOT SETTINGS\n", - "\n", - "# Plot the scale cuts for different k_max\n", - "ax.axvline(x=5, color=\"gray\", linestyle=\"--\", alpha=0.7)\n", - "ax.axhline(y=0, color=\"black\", linestyle=\"--\", alpha=0.7)\n", - "\n", - "ymin = ax.get_ylim()[0]\n", - "ymax = ax.get_ylim()[1]\n", - "# Shadowing cut scaled\n", - "ax.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color=\"gray\", alpha=0.2)\n", - "ax.fill_betweenx(y=[ymin, ymax], x1=83, x2=250, color=\"gray\", alpha=0.2)\n", - "\n", - "ax.set_ylim(ymin, ymax)\n", - "\n", - "# Add labels directly under the tick\n", - "ax.text(\n", - " 4.5,\n", - " 0.47e-4,\n", - " r\"$k_\\mathrm{max} = 1 h$ Mpc$^{-1}$\",\n", - " ha=\"center\",\n", - " va=\"top\",\n", - " fontsize=20,\n", - " rotation=90,\n", - ")\n", - "\n", - "ax.set_ylabel(r\"$\\theta \\xi_\\pm$\", fontsize=26)\n", - "ax.set_xlabel(r\"$\\theta$ (arcmin)\", fontsize=26)\n", - "ax.set_xlim([theta.min() - 0.1, theta.max() + 20])\n", - "ax.set_title(r\"$\\xi_+(\\theta)$\", fontsize=26)\n", - "ax.set_xscale(\"log\")\n", - "ax.set_xticks(np.array([1, 10, 100]))\n", - "ax.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - "ax.tick_params(axis=\"both\", which=\"major\", labelsize=24)\n", - "ax.tick_params(axis=\"both\", which=\"minor\", labelsize=20)\n", - "ax.yaxis.get_offset_text().set_fontsize(24)\n", - "ax.ticklabel_format(axis=\"y\", style=\"sci\", scilimits=(0, 0))\n", - "ax.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xip, fontsize=20)\n", - "\n", - "# XI_MINUS PLOT SETTINGS\n", - "\n", - "# Plot the scale cuts for different k_max\n", - "ax2.axvline(x=50, color=\"gray\", linestyle=\"--\", alpha=0.7)\n", - "ax2.axhline(y=0, color=\"black\", linestyle=\"--\", alpha=0.7)\n", - "\n", - "ymin = ax2.get_ylim()[0]\n", - "ymax = ax2.get_ylim()[1]\n", - "# Shadowing cut scaled\n", - "ax2.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color=\"gray\", alpha=0.2)\n", - "ax2.fill_betweenx(y=[ymin, ymax], x1=83, x2=250, color=\"gray\", alpha=0.2)\n", - "\n", - "ax2.set_ylim(ymin, ymax)\n", - "\n", - "# Add labels directly under the tick\n", - "ax2.text(\n", - " 45,\n", - " 1.15e-4,\n", - " r\"$k_\\mathrm{max} = 1 h$ Mpc$^{-1}$\",\n", - " ha=\"center\",\n", - " va=\"top\",\n", - " fontsize=20,\n", - " rotation=90,\n", - ")\n", - "\n", - "# ax2.set_ylabel(r'$\\theta \\xi_-$', fontsize=16)\n", - "ax2.set_xlabel(r\"$\\theta$ (arcmin)\", fontsize=26)\n", - "ax2.set_xlim([theta.min() - 0.1, theta.max() + 20])\n", - "ax2.set_xscale(\"log\")\n", - "ax2.set_title(r\"$\\xi_-(\\theta)$\", fontsize=26)\n", - "ax2.set_xticks(np.array([1, 10, 100]))\n", - "ax2.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - "ax2.tick_params(axis=\"both\", which=\"major\", labelsize=24)\n", - "ax2.tick_params(axis=\"both\", which=\"minor\", labelsize=20)\n", - "ax2.yaxis.get_offset_text().set_fontsize(24)\n", - "ax2.ticklabel_format(axis=\"y\", style=\"sci\", scilimits=(0, 0))\n", - "ax2.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xim, fontsize=20)\n", - "\n", - "plt.savefig(\n", - " \"/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/best_fit_xipm_SP_v1.4.6.3_B.pdf\",\n", - " bbox_inches=\"tight\",\n", - ")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "root_to_plot = [fiducial_root_xi_chains]\n", - "labels = [r\"Best fit $\\tau_{0,2}(\\theta)$\"]\n", - "\n", - "bbox_to_anchor_xip = (0.285, 0.7)\n", - "bbox_to_anchor_xim = (0.3, 0.65)\n", - "tau0_data = data[\"TAU_0_PLUS\"].data\n", - "tau2_data = data[\"TAU_2_PLUS\"].data\n", - "cov_mat = data[\"COVMAT\"].data\n", - "\n", - "# Plot hyperparameter\n", - "\n", - "fig, [ax, ax2] = plt.subplots(1, 2, figsize=(20, 8))\n", - "\n", - "theta, tau0, tau2 = tau0_data[\"ANG\"], tau0_data[\"VALUE\"], tau2_data[\"VALUE\"]\n", - "ax.errorbar(\n", - " theta,\n", - " theta * tau0,\n", - " yerr=theta\n", - " * np.sqrt(\n", - " np.diag(\n", - " cov_mat[2 * len(theta) : 3 * len(theta), 2 * len(theta) : 3 * len(theta)]\n", - " )\n", - " ),\n", - " fmt=\"o\",\n", - " label=r\"UNIONS $\\tau_{0,+}$\",\n", - " color=\"black\",\n", - " capsize=2,\n", - ")\n", - "ax2.errorbar(\n", - " theta,\n", - " theta * tau2,\n", - " yerr=theta\n", - " * np.sqrt(\n", - " np.diag(\n", - " cov_mat[3 * len(theta) : 4 * len(theta), 3 * len(theta) : 4 * len(theta)]\n", - " )\n", - " ),\n", - " fmt=\"o\",\n", - " label=r\"UNIONS $\\tau_{2,+}$\",\n", - " color=\"black\",\n", - " capsize=2,\n", - ")\n", - "\n", - "for idx, (label, root) in enumerate(zip(labels, root_to_plot)):\n", - " # Read the results\n", - " theta = (\n", - " (\n", - " np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/tau_0_plus/theta.txt\".format(root)\n", - " )\n", - " )\n", - " * 180\n", - " / np.pi\n", - " * 60\n", - " )\n", - " tau0_plus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/tau_0_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " tau2_plus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/tau_2_plus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " mask = (theta > theta_min) & (theta < theta_max)\n", - " theta = theta[mask]\n", - " ax.plot(\n", - " theta,\n", - " theta * tau0_plus[mask],\n", - " label=r\"Best fit $\\tau_{0,+}(\\theta)$\",\n", - " c=\"orange\",\n", - " lw=2.5,\n", - " )\n", - " ax2.plot(\n", - " theta,\n", - " theta * tau2_plus[mask],\n", - " label=r\"Best fit $\\tau_{2,+}(\\theta)$\",\n", - " c=\"orange\",\n", - " lw=2.5,\n", - " )\n", - "\n", - "# XI PLUS PLOT SETTINGS\n", - "\n", - "# Plot the scale cuts for different k_max\n", - "ax.axhline(y=0, color=\"black\", linestyle=\"--\", alpha=0.7)\n", - "\n", - "ymin = ax.get_ylim()[0]\n", - "ymax = ax.get_ylim()[1]\n", - "\n", - "ax.set_ylim(ymin, ymax)\n", - "\n", - "ax.set_ylabel(r\"$\\theta\\tau_{0,2}$\", fontsize=26)\n", - "ax.set_xlabel(r\"$\\theta$ (arcmin)\", fontsize=26)\n", - "ax.set_xlim([theta.min() - 0.1, theta.max() + 20])\n", - "ax.set_title(r\"$\\tau_{0,+}(\\theta)$\", fontsize=26)\n", - "ax.set_xscale(\"log\")\n", - "ax.set_xticks(np.array([1, 10, 100]))\n", - "ax.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - "ax.tick_params(axis=\"both\", which=\"major\", labelsize=24)\n", - "ax.tick_params(axis=\"both\", which=\"minor\", labelsize=20)\n", - "ax.yaxis.get_offset_text().set_fontsize(24)\n", - "ax.ticklabel_format(axis=\"y\", style=\"sci\", scilimits=(0, 0))\n", - "ax.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xip, fontsize=20)\n", - "\n", - "# XI_MINUS PLOT SETTINGS\n", - "\n", - "# Plot the scale cuts for different k_max\n", - "ax2.axhline(y=0, color=\"black\", linestyle=\"--\", alpha=0.7)\n", - "\n", - "ymin = ax2.get_ylim()[0]\n", - "ymax = ax2.get_ylim()[1]\n", - "# Shadowing cut scaled\n", - "ax2.fill_betweenx(\n", - " y=[ymin, ymax],\n", - " x1=0,\n", - " x2=12,\n", - " color=\"gray\",\n", - " alpha=0.2,\n", - " label=r\"$B$-mode informed scale cut\",\n", - ")\n", - "ax2.fill_betweenx(y=[ymin, ymax], x1=83, x2=250, color=\"gray\", alpha=0.2)\n", - "\n", - "ax2.set_ylim(ymin, ymax)\n", - "\n", - "# ax2.set_ylabel(r'$\\theta \\xi_-$', fontsize=16)\n", - "ax2.set_xlabel(r\"$\\theta$ (arcmin)\", fontsize=26)\n", - "ax2.set_xlim([theta.min() - 0.1, theta.max() + 20])\n", - "ax2.set_xscale(\"log\")\n", - "ax2.set_title(r\"$\\tau_{2,+}(\\theta)$\", fontsize=26)\n", - "ax2.set_xticks(np.array([1, 10, 100]))\n", - "ax2.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - "ax2.tick_params(axis=\"both\", which=\"major\", labelsize=24)\n", - "ax2.tick_params(axis=\"both\", which=\"minor\", labelsize=20)\n", - "ax2.yaxis.get_offset_text().set_fontsize(24)\n", - "ax2.ticklabel_format(axis=\"y\", style=\"sci\", scilimits=(0, 0))\n", - "ax2.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xim, fontsize=20)\n", - "\n", - "plt.savefig(\n", - " \"/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/notebooks/Plots/best_fit_tau_02_SP_v1.4.6.3_B.pdf\",\n", - " bbox_inches=\"tight\",\n", - ")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "jupytext": { - "cell_metadata_filter": "-all", - "main_language": "python", - "notebook_metadata_filter": "-all" - }, - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/contours.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/contours.ipynb deleted file mode 100644 index e95be1b5..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/contours.ipynb +++ /dev/null @@ -1,950 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0", - "metadata": {}, - "source": [ - "# 2D contour plots\n", - "\n", - "This notebook produces the plots for all the 2D contours in the results section." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": {}, - "outputs": [], - "source": [ - "import os.path\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "from astropy.io import fits\n", - "from getdist import plots\n", - "\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "\n", - "plt.rcParams[\"text.usetex\"] = True\n", - "\n", - "sns.set_palette(\"husl\")\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 70\n", - "g.settings.axes_labelsize = 80\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 70\n", - "\n", - "\n", - "# SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE\n", - "\n", - "root_dir = \"/n09data/guerrini/output_chains/\"\n", - "path_datavectors = \"/home/guerrini/sp_validation/cosmo_inference/data/\"\n", - "path_output_chains = \"/n09data/guerrini/output_chains/\"\n", - "\n", - "data = fits.open(\n", - " os.path.join(\n", - " path_datavectors,\n", - " \"SP_v1.4.6.3_config/SP_v1.4.6.3_B/cosmosis_SP_v1.4.6.3_leak_corr_B_masked.fits\",\n", - " )\n", - ")\n", - "\n", - "roots_fid = {\n", - " \"SP_v1.4.6.3_leak_corr_B\": r\"UNIONS-3500 $C_\\ell$\",\n", - " \"SP_v1.4.6.3_B_fiducial_config\": r\"UNIONS-3500 $\\xi_\\pm$ (This work) \",\n", - " \"KiDS-Legacy_xipm\": r\"KiDS-Legacy $\\xi_\\pm$\",\n", - " \"HSC_Y3\": r\"HSC-Y3 $\\xi_\\pm$\",\n", - " \"Planck18\": r\"$\\textit{Planck}$ 2018\",\n", - "}\n", - "\n", - "roots_full = {\n", - " \"SP_v1.4.6.3_B_fiducial_config\": r\"UNIONS-3500 $\\xi_\\pm$ (This work) \",\n", - "}\n", - "\n", - "roots_ia = {\n", - " \"SP_v1.4.6.3_B_fiducial_config\": r\"Gaussian $A_{\\rm{IA}}$ prior\",\n", - " \"SP_v1.4.6.3_B_flat_ia_config\": r\"Flat $A_{\\rm{IA}}$ prior\",\n", - " \"SP_v1.4.6.3_B_no_ia_config\": r\"No IA\",\n", - "}\n", - "\n", - "roots_ext = {\n", - " \"SP_v1.4.6.3_B_fiducial_config\": r\"UNIONS-3500 $\\xi_\\pm$\",\n", - " \"SP_v1.4.6.3_B_planck_config\": r\"UNIONS-3500 $\\xi_\\pm$ + CMB\",\n", - " \"SP_v1.4.6.3_B_planck_desi_config\": r\"UNIONS-3500 $\\xi_\\pm$ + CMB + BAO\",\n", - " \"Planck18\": r\"$\\textit{Planck}$ 2018\",\n", - "}\n", - "\n", - "roots_dz = {\n", - " \"SP_v1.4.6.3_B_fiducial_config\": r\"Gaussian $\\Delta z$ prior\",\n", - " \"SP_v1.4.6.3_B_flat_delta_z_config\": r\"Flat $\\Delta z$ prior\",\n", - " \"SP_v1.4.6.3_B_no_delta_z_config\": r\"No $\\Delta z$ modelling\",\n", - "}\n", - "\n", - "roots_psf = {\n", - " \"SP_v1.4.6.3_B_flat_alpha_beta_config\": r\"Flat $\\alpha$ and $\\beta$ priors\",\n", - " \"SP_v1.4.6.3_B_fiducial_config\": r\"Gaussian $\\alpha$ and $\\beta$ priors\",\n", - " \"SP_v1.4.6.3_B_no_xi_sys_config\": r\"No $\\xi^{\\rm sys}$ included\",\n", - " \"SP_v1.4.6.3_B_no_leak_corr_config\": r\"No object-wise leakage correction\",\n", - "}\n", - "\n", - "roots_scale = {\n", - " \"SP_v1.4.6.3_B_fiducial_config\": r\"$\\xi_+$: $\\theta=[12,83]$\",\n", - " \"SP_v1.4.6.3_B_small_scales_config\": r\"$\\xi_+$: $\\theta=[5,83]$\",\n", - "}\n", - "\n", - "roots_nonlin = {\n", - " \"SP_v1.4.6.3_B_fiducial_config\": r\"Fiducial (\\texttt{HMCode2020}, $\\log(T_{\\rm AGN})$)\",\n", - " \"SP_v1.4.6.3_B_no_baryons_config\": r\"\\texttt{HMCode2020} no baryons\",\n", - " \"SP_v1.4.6.3_B_halofit_config\": r\"\\texttt{Halofit}\",\n", - "}\n", - "roots = roots_ext" - ] - }, - { - "cell_type": "markdown", - "id": "2", - "metadata": {}, - "source": [ - "## Retrieve the chains" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "# READ CHAIN\n", - "\n", - "chains = []\n", - "\n", - "for i, root in enumerate(list(roots.keys())):\n", - " burnin = 0\n", - " if \"SP\" not in root:\n", - " chain = g.samples_for_root(\n", - " root_dir + \"ext_data/{}/getdist_{}\".format(root, root),\n", - " cache=False,\n", - " settings={\n", - " \"ignore_rows\": burnin,\n", - " # 'smooth_scale_2D':0.2,\n", - " # 'smooth_scale_1D':0.2\n", - " },\n", - " )\n", - " p = chain.getParams()\n", - " if hasattr(p, \"S_8\") == False:\n", - " omega_m = chain.getParams().OMEGA_M\n", - " sigma_8 = chain.getParams().SIGMA_8\n", - "\n", - " s_8 = sigma_8 * (omega_m / 0.3) ** 0.5\n", - "\n", - " chain.addDerived(s_8, name=\"S_8\", label=r\"S_8\")\n", - "\n", - " p = chain.paramNames.parWithName(\"S_8\")\n", - "\n", - " elif \"config\" in root:\n", - " if os.path.isfile(root_dir + \"{}/getdist_{}.txt\".format(root, root)) == False:\n", - " samples = np.loadtxt(root_dir + \"{}/samples_{}.txt\".format(root, root))\n", - "\n", - " if \"nautilus\" in root:\n", - " weights = np.exp(samples[:, -3])\n", - " neglogL = samples[:, -2] - samples[:, -1]\n", - "\n", - " samples = np.column_stack((weights, neglogL, samples[:, 0:-3]))\n", - " elif \"mh\" in root:\n", - " samples = np.column_stack(\n", - " (\n", - " np.ones_like(samples[:, -1]),\n", - " np.log(samples[:, -1]) - np.log(samples[:, -2]),\n", - " samples[:, 0:-2],\n", - " )\n", - " )\n", - " burnin = 0.3\n", - " else:\n", - " samples = np.column_stack(\n", - " (samples[:, -1], samples[:, -3], samples[:, 0:-4])\n", - " )\n", - "\n", - " np.savetxt(root_dir + \"{}/getdist_{}.txt\".format(root, root), samples)\n", - "\n", - " chain = g.samples_for_root(\n", - " root_dir + \"{}/getdist_{}\".format(root, root),\n", - " cache=False,\n", - " settings={\n", - " \"ignore_rows\": burnin,\n", - " # 'smooth_scale_2D':0.2,\n", - " # 'smooth_scale_1D':0.2\n", - " },\n", - " )\n", - " else:\n", - " if (\n", - " os.path.isfile(\n", - " root_dir + \"{}/{}/getdist_{}_cell.txt\".format(root, root, root)\n", - " )\n", - " == False\n", - " ):\n", - " samples = np.loadtxt(\n", - " root_dir + \"{}/{}/samples_{}_cell.txt\".format(root, root, root)\n", - " )\n", - "\n", - " if \"nautilus\" in root:\n", - " weights = np.exp(samples[:, -3])\n", - " neglogL = samples[:, -2] - samples[:, -1]\n", - "\n", - " samples = np.column_stack((weights, neglogL, samples[:, 0:-3]))\n", - " elif \"mh\" in root:\n", - " samples = np.column_stack(\n", - " (\n", - " np.ones_like(samples[:, -1]),\n", - " np.log(samples[:, -1]) - np.log(samples[:, -2]),\n", - " samples[:, 0:-2],\n", - " )\n", - " )\n", - " burnin = 0.3\n", - " else:\n", - " samples = np.column_stack(\n", - " (samples[:, -1], samples[:, -3], samples[:, 0:-4])\n", - " )\n", - "\n", - " np.savetxt(\n", - " root_dir + \"{}/{}/getdist_{}_cell.txt\".format(root, root, root), samples\n", - " )\n", - "\n", - " chain = g.samples_for_root(\n", - " root_dir + \"{}/{}/getdist_{}_cell\".format(root, root, root),\n", - " cache=False,\n", - " settings={\n", - " \"ignore_rows\": burnin,\n", - " # 'smooth_scale_2D':0.2,\n", - " # 'smooth_scale_1D':0.2\n", - " },\n", - " )\n", - " p = chain.getParams()\n", - "\n", - " chains.append(chain)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "name_list = [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"S_8\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - " \"alpha\",\n", - " \"beta\",\n", - " \"omch2\",\n", - "]\n", - "label_list = [\n", - " r\"\\Omega_{\\rm m}\",\n", - " r\"\\omega_{\\rm b}\",\n", - " r\"h\",\n", - " r\"n_{\\rm s}\",\n", - " r\"\\sigma_8\",\n", - " r\"S_8\",\n", - " r\"\\log T_{\\rm AGN}\",\n", - " r\"A_{\\rm IA}\",\n", - " r\"m_1\",\n", - " r\"\\Delta z\",\n", - " r\"\\alpha_{\\rm PSF}\",\n", - " r\"\\beta_{\\rm PSF}\",\n", - " r\"\\omega_{\\rm c}\",\n", - "]\n", - "\n", - "for chain in chains:\n", - " param_names = chain.getParamNames()\n", - " p = chain.getParams()\n", - " for name, label in zip(name_list, label_list):\n", - " if hasattr(p, name):\n", - " param_names.parWithName(name).label = label\n", - "\n", - "legend_labels = list(roots.values())" - ] - }, - { - "cell_type": "markdown", - "id": "5", - "metadata": {}, - "source": [ - "## Plot the chains" - ] - }, - { - "cell_type": "markdown", - "id": "6", - "metadata": {}, - "source": [ - "### FIDUCIAL PLOT" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "colours = [\n", - " \"royalblue\",\n", - " \"orange\",\n", - " \"crimson\",\n", - " \"forestgreen\",\n", - " \"indigo\",\n", - "]\n", - "\n", - "linestyle = [\"solid\", \"solid\", \"solid\", \"solid\", \"solid\"]\n", - "\n", - "line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)]\n", - "\n", - "# FIDUCIAL PLOT\n", - "g.triangle_plot(\n", - " chains,\n", - " [\"SIGMA_8\", \"S_8\", \"OMEGA_M\"], #\n", - " legend_labels=legend_labels,\n", - " line_args=line_args,\n", - " contour_colors=colours,\n", - " label_order=[1, 0, 2, 3, 4],\n", - " filled=[True, True, False, False, True],\n", - ")\n", - "\n", - "g.export(\"../Plots/SP_v1.4.6.3_B_fiducial_config_contour_plot.pdf\")" - ] - }, - { - "cell_type": "markdown", - "id": "8", - "metadata": {}, - "source": [ - "### FULL PLOT" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "g.settings.axes_fontsize = 40\n", - "g.settings.axes_labelsize = 50\n", - "\n", - "colours = [\n", - " \"orange\",\n", - "]\n", - "\n", - "linestyle = [\n", - " \"solid\",\n", - "]\n", - "\n", - "line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)]\n", - "\n", - "# FIDUCIAL PLOT\n", - "g.triangle_plot(\n", - " chains,\n", - " [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"S_8\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - " ],\n", - " legend_labels=legend_labels,\n", - " line_args=line_args,\n", - " contour_colors=colours,\n", - " filled=True,\n", - ")\n", - "\n", - "g.export(\"../Plots/SP_v1.4.6.3_B_fiducial_config_contour_plot_full.pdf\")" - ] - }, - { - "cell_type": "markdown", - "id": "10", - "metadata": {}, - "source": [ - "### IA PLOT" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "11", - "metadata": {}, - "outputs": [], - "source": [ - "colours = [\n", - " \"orange\",\n", - " \"royalblue\",\n", - " \"forestgreen\",\n", - "]\n", - "\n", - "linestyle = [\n", - " \"solid\",\n", - " \"solid\",\n", - " \"solid\",\n", - "]\n", - "\n", - "line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)]\n", - "\n", - "g.triangle_plot(\n", - " chains,\n", - " [\"S_8\", \"OMEGA_M\", \"a\"], #\n", - " legend_labels=legend_labels,\n", - " line_args=line_args,\n", - " contour_args={\"alpha\": 0.6},\n", - " contour_colors=colours,\n", - " filled=[True, False, True],\n", - ")\n", - "\n", - "g.export(\"../Plots/SP_v1.4.6.3_B_fiducial_config_contour_plot_ia.pdf\")" - ] - }, - { - "cell_type": "markdown", - "id": "12", - "metadata": {}, - "source": [ - "### PSF PLOT" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "13", - "metadata": {}, - "outputs": [], - "source": [ - "colours = [\n", - " \"royalblue\",\n", - " \"orange\",\n", - " \"hotpink\",\n", - " \"slategray\",\n", - "]\n", - "\n", - "linestyle = [\n", - " \"solid\",\n", - " \"solid\",\n", - " \"solid\",\n", - " \"solid\",\n", - "]\n", - "\n", - "line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)]\n", - "\n", - "g.triangle_plot(\n", - " chains,\n", - " [\"S_8\", \"OMEGA_M\", \"alpha\", \"beta\"], #\n", - " legend_labels=legend_labels,\n", - " line_args=line_args,\n", - " contour_args=[{\"alpha\": 1}, {\"alpha\": 0.6}, {\"alpha\": 0.8}, {\"alpha\": 0.8}],\n", - " contour_colors=colours,\n", - " legend_loc=\"upper right\",\n", - " label_order=[1, 0, 2, 3],\n", - " filled=[False, True, True, True],\n", - ")\n", - "\n", - "g.subplots[3, 2].scatter(\n", - " 0.005, 0.81, color=\"k\", marker=\"X\", s=400, label=\"Fiducial config best-fit\"\n", - ")\n", - "g.subplots[3, 2].scatter(\n", - " 0.022, 0.798, color=\"k\", marker=\"P\", s=400, label=\"Fiducial config best-fit\"\n", - ")\n", - "\n", - "g.export(\"../Plots/SP_v1.4.6.3_B_fiducial_config_contour_plot_psf.pdf\")" - ] - }, - { - "cell_type": "markdown", - "id": "14", - "metadata": {}, - "source": [ - "### DELTA Z PLOT" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "15", - "metadata": {}, - "outputs": [], - "source": [ - "colours = [\n", - " \"orange\",\n", - " \"royalblue\",\n", - " \"indigo\",\n", - "]\n", - "\n", - "linestyle = [\n", - " \"solid\",\n", - " \"solid\",\n", - " \"solid\",\n", - "]\n", - "\n", - "line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)]\n", - "g.triangle_plot(\n", - " chains,\n", - " [\"S_8\", \"OMEGA_M\", \"bias_1\"], #\n", - " legend_labels=legend_labels,\n", - " line_args=line_args,\n", - " contour_args=[{\"alpha\": 1.0}, {\"alpha\": 0.9}, {\"alpha\": 0.5}],\n", - " contour_colors=colours,\n", - " filled=[True, False, True],\n", - ")\n", - "\n", - "g.export(\"../Plots/SP_v1.4.6.3_B_fiducial_config_contour_plot_dz.pdf\")" - ] - }, - { - "cell_type": "markdown", - "id": "16", - "metadata": {}, - "source": [ - "### EXTERNAL DATA" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "17", - "metadata": {}, - "outputs": [], - "source": [ - "colours = [\n", - " \"orange\",\n", - " \"royalblue\",\n", - " \"crimson\",\n", - " \"forestgreen\",\n", - "]\n", - "\n", - "linestyle = [\n", - " \"solid\",\n", - " \"solid\",\n", - " \"solid\",\n", - " \"solid\",\n", - " \"solid\",\n", - "]\n", - "\n", - "line_args = [dict(color=col, ls=ls) for col, ls in zip(colours, linestyle)]\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=10)\n", - "g.settings.axes_fontsize = 25\n", - "g.settings.axes_labelsize = 25\n", - "g.settings.legend_fontsize = 22\n", - "\n", - "g.plot_2d(\n", - " chains,\n", - " [\"S_8\", \"OMEGA_M\", \"SIGMA_8\"], #\n", - " line_args=line_args,\n", - " contour_colors=colours,\n", - " legend_labels=legend_labels,\n", - " alphas=[0.7, 1.0, 1.0, 1.0],\n", - " filled=[True, True, True, False],\n", - ")\n", - "\n", - "g.add_y_bands(0.2975, 0.0086, alpha2=0, color=\"k\", label=\"BAO\")\n", - "g.add_legend(legend_labels, legend_loc=\"upper right\")\n", - "\n", - "g.export(\"../Plots/SP_v1.4.6.3_B_fiducial_config_contour_plot_ext.pdf\")" - ] - }, - { - "cell_type": "markdown", - "id": "18", - "metadata": {}, - "source": [ - "### Small scales" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "19", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "colours = [\n", - " \"orange\",\n", - " \"dodgerblue\",\n", - "]\n", - "\n", - "linestyle = [\n", - " \"solid\",\n", - " \"solid\",\n", - "]\n", - "\n", - "line_args = [dict(color=col, ls=ls) for col, ls in zip(colours, linestyle)]\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=9)\n", - "g.settings.axes_fontsize = 25\n", - "g.settings.axes_labelsize = 25\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 30\n", - "\n", - "g.plot_2d(\n", - " chains,\n", - " [\"S_8\", \"OMEGA_M\"], #\n", - " line_args=line_args,\n", - " contour_args=[{\"alpha\": 0.7}, {\"alpha\": 1.0}],\n", - " contour_colors=colours,\n", - " filled=[True, True],\n", - ")\n", - "g.add_legend(legend_labels, legend_loc=\"upper right\")\n", - "\n", - "g.export(\"../Plots/SP_v1.4.6.3_B_fiducial_config_contour_plot_scales.pdf\")" - ] - }, - { - "cell_type": "markdown", - "id": "20", - "metadata": {}, - "source": [ - "### BBN Prior" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "from getdist.gaussian_mixtures import Gaussian1D\n", - "\n", - "colours = [\n", - " \"orange\",\n", - " \"royalblue\",\n", - "]\n", - "\n", - "linestyle = [\n", - " \"solid\",\n", - " \"solid\",\n", - "]\n", - "\n", - "line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)]\n", - "\n", - "# BBN PRIOR\n", - "bbn_prior = Gaussian1D(\n", - " mean=0.02218,\n", - " sigma=0.00055,\n", - " name=\"ombh2\",\n", - " labels=[r\"\\omega_{\\rm b}\"],\n", - " label=\"BBN prior\",\n", - ")\n", - "bbn_chain = bbn_prior.MCSamples(3000, label=\"BBN prior\")\n", - "\n", - "g.triangle_plot(\n", - " chains + [bbn_chain],\n", - " name_list,\n", - " legend_labels=legend_labels,\n", - " line_args=line_args,\n", - " contour_colors=colours,\n", - " filled=[True, False],\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "22", - "metadata": {}, - "source": [ - "## Plot the best-fit $\\xi_\\pm$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23", - "metadata": {}, - "outputs": [], - "source": [ - "xi_p_data = data[\"XI_PLUS\"].data\n", - "xi_m_data = data[\"XI_MINUS\"].data\n", - "cov_mat = data[\"COVMAT\"].data\n", - "\n", - "labels = roots_scale.values()\n", - "\n", - "bbox_to_anchor_xip = (0.685, 0.09)\n", - "bbox_to_anchor_xim = (0.3, 0.65)\n", - "theta_min = 1.0\n", - "theta_max = 250.0\n", - "loc_legend = \"lower center\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "24", - "metadata": {}, - "outputs": [], - "source": [ - "colours = [\n", - " \"orange\",\n", - " \"dodgerblue\",\n", - "]\n", - "\n", - "linestyle = [\n", - " \"solid\",\n", - " \"solid\",\n", - "]\n", - "\n", - "line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)]\n", - "\n", - "labels = roots_scale.values()\n", - "\n", - "fig, ax = plt.subplots(1, 1, figsize=(11, 7))\n", - "\n", - "theta, xi_p, xi_m = xi_p_data[\"ANG\"], xi_p_data[\"VALUE\"], xi_m_data[\"VALUE\"]\n", - "ax.errorbar(\n", - " theta,\n", - " theta * xi_p,\n", - " yerr=theta * np.sqrt(np.diag(cov_mat[: len(theta), : len(theta)])),\n", - " fmt=\"o\",\n", - " color=\"black\",\n", - " capsize=2,\n", - ")\n", - "\n", - "for idx, (label, root) in enumerate(zip(labels, roots_scale)):\n", - " # Read the results\n", - " theta = (\n", - " (\n", - " np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " )\n", - " * 180\n", - " / np.pi\n", - " * 60\n", - " )\n", - " xi_plus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_minus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = (\n", - " np.loadtxt(path_output_chains + \"{}/best_fit/xi_sys/theta.txt\".format(root))\n", - " * 180\n", - " / np.pi\n", - " * 60\n", - " )\n", - "\n", - " xi_sys_plus = np.interp(theta, theta_xi_sys, xi_sys_plus)\n", - " xi_sys_minus = np.interp(theta, theta_xi_sys, xi_sys_minus)\n", - " xi_plus += xi_sys_plus\n", - " xi_minus += xi_sys_minus\n", - "\n", - " mask = (theta > theta_min) & (theta < theta_max)\n", - " theta = theta[mask]\n", - " ax.plot(theta, theta * xi_plus[mask], label=label, **line_args[idx])\n", - "\n", - "ymin = ax.get_ylim()[0]\n", - "ymax = ax.get_ylim()[1]\n", - "\n", - "ax.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color=\"gray\", alpha=0.2)\n", - "ax.fill_betweenx(y=[ymin, ymax], x1=0, x2=5, color=\"gray\", alpha=0.7)\n", - "ax.fill_betweenx(y=[ymin, ymax], x1=83, x2=300, color=\"gray\", alpha=0.2)\n", - "\n", - "ax.set_ylim(ymin, ymax)\n", - "\n", - "ax.set_ylabel(r\"$\\theta \\xi_\\pm$\", fontsize=26)\n", - "ax.set_xlabel(r\"$\\theta$ (arcmin)\", fontsize=26)\n", - "ax.set_xlim([theta.min() - 0.1, theta.max() + 20])\n", - "ax.set_title(r\"$\\xi_+(\\theta)$\", fontsize=26)\n", - "ax.set_xscale(\"log\")\n", - "ax.set_xticks(np.array([1, 10, 100]))\n", - "ax.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - "ax.tick_params(axis=\"both\", which=\"major\", labelsize=24)\n", - "ax.tick_params(axis=\"both\", which=\"minor\", labelsize=20)\n", - "ax.yaxis.get_offset_text().set_fontsize(24)\n", - "ax.ticklabel_format(axis=\"y\", style=\"sci\", scilimits=(0, 0))\n", - "ax.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xip, fontsize=20)\n", - "\n", - "\n", - "plt.savefig(\"./../Plots/scale_cut_xipm_SP_v1.4.6.3_B.pdf\", bbox_inches=\"tight\")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "25", - "metadata": {}, - "outputs": [], - "source": [ - "labels = roots_nonlin.values()\n", - "\n", - "colours = [\"orange\", \"hotpink\", \"teal\"]\n", - "\n", - "linestyle = [\"solid\", \"solid\", \"dashed\"]\n", - "\n", - "line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)]\n", - "\n", - "fig, [ax, ax2] = plt.subplots(2, 1, figsize=(11, 14))\n", - "\n", - "theta, xi_p, xi_m = xi_p_data[\"ANG\"], xi_p_data[\"VALUE\"], xi_m_data[\"VALUE\"]\n", - "ax.errorbar(\n", - " theta,\n", - " theta * xi_p,\n", - " yerr=theta * np.sqrt(np.diag(cov_mat[: len(theta), : len(theta)])),\n", - " fmt=\"o\",\n", - " color=\"black\",\n", - " capsize=2,\n", - ")\n", - "ax2.errorbar(\n", - " theta,\n", - " theta * xi_m,\n", - " yerr=theta\n", - " * np.sqrt(\n", - " np.diag(cov_mat[len(theta) : 2 * len(theta), len(theta) : 2 * len(theta)])\n", - " ),\n", - " fmt=\"o\",\n", - " color=\"black\",\n", - " capsize=2,\n", - ")\n", - "\n", - "for idx, (label, root) in enumerate(zip(labels, roots_nonlin)):\n", - " # Read the results\n", - " theta = (\n", - " (\n", - " np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " )\n", - " * 180\n", - " / np.pi\n", - " * 60\n", - " )\n", - " xi_plus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_minus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - " xi_sys_plus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " path_output_chains + \"{}/best_fit/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - " theta_xi_sys = (\n", - " np.loadtxt(path_output_chains + \"{}/best_fit/xi_sys/theta.txt\".format(root))\n", - " * 180\n", - " / np.pi\n", - " * 60\n", - " )\n", - "\n", - " xi_sys_plus = np.interp(theta, theta_xi_sys, xi_sys_plus)\n", - " xi_sys_minus = np.interp(theta, theta_xi_sys, xi_sys_minus)\n", - " xi_plus += xi_sys_plus\n", - " xi_minus += xi_sys_minus\n", - "\n", - " mask = (theta > theta_min) & (theta < theta_max)\n", - " theta = theta[mask]\n", - " ax.plot(theta, theta * xi_plus[mask], label=label, **line_args[idx])\n", - " ax2.plot(theta, theta * xi_minus[mask], label=label, **line_args[idx])\n", - "\n", - "ymin = ax.get_ylim()[0]\n", - "ymax = ax.get_ylim()[1]\n", - "ax.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color=\"gray\", alpha=0.2)\n", - "ax.fill_betweenx(y=[ymin, ymax], x1=83, x2=300, color=\"gray\", alpha=0.2)\n", - "\n", - "ax.set_ylim(ymin, ymax)\n", - "\n", - "ax.set_ylabel(r\"$\\theta \\xi_\\pm$\", fontsize=26)\n", - "ax.set_xlabel(r\"$\\theta$ (arcmin)\", fontsize=26)\n", - "ax.set_xlim([theta.min() - 0.1, theta.max() + 20])\n", - "ax.set_title(r\"$\\xi_+(\\theta)$\", fontsize=26)\n", - "ax.set_xscale(\"log\")\n", - "ax.set_xticks(np.array([1, 10, 100]))\n", - "ax.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - "ax.tick_params(axis=\"both\", which=\"major\", labelsize=24)\n", - "ax.tick_params(axis=\"both\", which=\"minor\", labelsize=20)\n", - "ax.yaxis.get_offset_text().set_fontsize(24)\n", - "ax.ticklabel_format(axis=\"y\", style=\"sci\", scilimits=(0, 0))\n", - "\n", - "\n", - "ymin = ax2.get_ylim()[0]\n", - "ymax = ax2.get_ylim()[1]\n", - "ax2.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color=\"gray\", alpha=0.2)\n", - "ax2.fill_betweenx(y=[ymin, ymax], x1=83, x2=3000, color=\"gray\", alpha=0.2)\n", - "\n", - "ax2.set_ylim(ymin, ymax)\n", - "ax2.set_xlabel(r\"$\\theta$ (arcmin)\", fontsize=26)\n", - "ax2.set_xlim([theta.min() - 0.1, theta.max()])\n", - "ax2.set_xscale(\"log\")\n", - "ax2.set_title(r\"$\\xi_-(\\vartheta)$\", fontsize=26)\n", - "ax2.set_xticks(np.array([1, 10, 100]))\n", - "ax2.tick_params(axis=\"x\", which=\"minor\", length=2, width=0.8)\n", - "ax2.tick_params(axis=\"both\", which=\"major\", labelsize=24)\n", - "ax2.tick_params(axis=\"both\", which=\"minor\", labelsize=20)\n", - "ax2.yaxis.get_offset_text().set_fontsize(24)\n", - "ax2.ticklabel_format(axis=\"y\", style=\"sci\", scilimits=(0, 0))\n", - "ax2.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xim, fontsize=20)\n", - "\n", - "plt.savefig(\"./../Plots/nonlin_xipm_SP_v1.4.6.3_B.pdf\", bbox_inches=\"tight\")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "26", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_chi2.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_chi2.ipynb deleted file mode 100644 index f124e4cd..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_chi2.ipynb +++ /dev/null @@ -1,690 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import configparser\n", - "import os\n", - "import re\n", - "import subprocess\n", - "import sys\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import scipy.stats as stats\n", - "from astropy.io import fits\n", - "from getdist import plots\n", - "from IPython.display import Markdown, display\n", - "from scipy.interpolate import interp1d\n", - "\n", - "sys.path.append(\"/home/guerrini/sp_validation/cosmo_inference/scripts\")\n", - "\n", - "import chain_postprocessing\n", - "\n", - "%matplotlib inline\n", - "\n", - "plt.rc(\"mathtext\", fontset=\"stix\")\n", - "plt.rc(\"font\", family=\"sans-serif\")\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 40\n", - "\n", - "# #SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE\n", - "root_dir = \"/n09data/guerrini/output_chains/\"\n", - "blind = \"B\"\n", - "\n", - "roots = [\n", - " f\"SP_v1.4.6.3_{blind}_fiducial_config\",\n", - " f\"SP_v1.4.6.3_{blind}_small_scales_config\",\n", - " f\"SP_v1.4.6.3_{blind}_flat_alpha_beta_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_xi_sys_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_leak_corr_config\",\n", - " f\"SP_v1.4.6.3_{blind}_flat_delta_z_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_delta_z_config\",\n", - " f\"SP_v1.4.6.3_{blind}_flat_ia_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_ia_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_m_bias_config\",\n", - " f\"SP_v1.4.6.3_{blind}_unmasked_covmat_config\",\n", - " f\"SP_v1.4.6.3_{blind}_halofit_config\",\n", - " f\"SP_v1.4.6.3_{blind}_no_baryons_config\",\n", - " f\"SP_v1.4.6.3_{blind}_nautilus_config\",\n", - " f\"SP_v1.4.6.3_{blind}_planck_config\",\n", - " f\"SP_v1.4.6.3_{blind}_planck_desi_config\",\n", - "]\n", - "\n", - "catalog_versions = [\n", - " f\"SP_v1.4.6.3_config/SP_v1.4.6.3_{blind}\",\n", - "]\n", - "\n", - "catalog_sub_versions = [\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - " f\"SP_v1.4.6.3_leak_corr_{blind}_masked\",\n", - "]\n", - "output_folder = \"/n09data/guerrini/output_chains/\"\n", - "\n", - "path_ini_files = \"/home/guerrini/sp_validation/cosmo_inference/cosmosis_config/\"\n", - "\n", - "\n", - "ini_roots = [\n", - " f\"blind_{blind}/fiducial\",\n", - " f\"blind_{blind}/small_scales\",\n", - " f\"blind_{blind}/flat_alpha_beta\",\n", - " f\"blind_{blind}/no_xi_sys\",\n", - " f\"blind_{blind}/no_leak_corr\",\n", - " f\"blind_{blind}/flat_delta_z\",\n", - " f\"blind_{blind}/no_delta_z\",\n", - " f\"blind_{blind}/flat_ia\",\n", - " f\"blind_{blind}/no_ia\",\n", - " f\"blind_{blind}/no_m_bias\",\n", - " f\"blind_{blind}/unmasked_covmat\",\n", - " f\"blind_{blind}/halofit\",\n", - " f\"blind_{blind}/no_baryons\",\n", - " f\"blind_{blind}/nautilus\",\n", - " f\"blind_{blind}/planck\",\n", - " f\"blind_{blind}/planck_desi\",\n", - "]\n", - "\n", - "properties = {}\n", - "\n", - "for i, root in enumerate(roots):\n", - " print(root)\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - " config.read(\n", - " path_ini_files\n", - " + \"config_space_v1.4.6.3_fiducial/pipeline/\"\n", - " + ini_roots[i]\n", - " + \".ini\"\n", - " )\n", - " add_xi_sys = config[\"2pt_like\"][\"add_xi_sys\"]\n", - " lower_bound_xi_plus, upper_bound_xi_plus = map(\n", - " float, config[\"2pt_like\"][\"angle_range_XI_PLUS_1_1\"].split()\n", - " )\n", - " lower_bound_xi_minus, upper_bound_xi_minus = map(\n", - " float, config[\"2pt_like\"][\"angle_range_XI_MINUS_1_1\"].split()\n", - " )\n", - "\n", - " properties[root] = {\n", - " \"add_xi_sys\": add_xi_sys,\n", - " \"lower_bound_xi_plus\": lower_bound_xi_plus,\n", - " \"upper_bound_xi_plus\": upper_bound_xi_plus,\n", - " \"lower_bound_xi_minus\": lower_bound_xi_minus,\n", - " \"upper_bound_xi_minus\": upper_bound_xi_minus,\n", - " }" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Retrieve the chains" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# READ CHAIN\n", - "\n", - "chains = []\n", - "\n", - "for i, root in enumerate(roots):\n", - " burnin = 0\n", - "\n", - " if os.path.isfile(root_dir + \"{}/getdist_{}.txt\".format(root, root)) == False:\n", - " samples = np.loadtxt(root_dir + \"{}/samples_{}.txt\".format(root, root))\n", - "\n", - " if \"nautilus\" in root:\n", - " samples = np.column_stack(\n", - " (\n", - " np.exp(samples[:, -3]),\n", - " samples[:, -1] - samples[:, -2],\n", - " samples[:, 0:-3],\n", - " )\n", - " )\n", - " elif \"mh\" in root:\n", - " samples = np.column_stack(\n", - " (\n", - " np.ones_like(samples[:, -1]),\n", - " np.log(samples[:, -1]) - np.log(samples[:, -2]),\n", - " samples[:, 0:-2],\n", - " )\n", - " )\n", - " burnin = 0.3\n", - " else:\n", - " samples = np.column_stack(\n", - " (samples[:, -1], samples[:, -3], samples[:, 0:-4])\n", - " )\n", - "\n", - " np.savetxt(root_dir + \"{}/getdist_{}.txt\".format(root, root), samples)\n", - "\n", - " chain = g.samples_for_root(\n", - " root_dir + \"{}/getdist_{}\".format(root, root),\n", - " cache=False,\n", - " settings={\n", - " \"ignore_rows\": burnin,\n", - " \"smooth_scale_2D\": 0.5,\n", - " \"smooth_scale_1D\": 0.5,\n", - " },\n", - " )\n", - " p = chain.getParams()\n", - "\n", - " chains.append(chain)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "param_list = [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"s_8_input\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - " \"alpha\",\n", - " \"beta\",\n", - " \"omch2\",\n", - " \"m\",\n", - " \"a_planck\",\n", - "]\n", - "label_list = [\n", - " r\"\\Omega_m\",\n", - " r\"\\omega_b\",\n", - " \"h_0\",\n", - " \"n_s\",\n", - " r\"\\sigma_8\",\n", - " \"S_8\",\n", - " \"log T_{AGN}\",\n", - " \"A_{IA}\",\n", - " \"m_1\",\n", - " r\"\\Delta z_1\",\n", - " \"\\\\alpha_{PSF}\",\n", - " \"\\\\beta_{PSF}\",\n", - " r\"\\omega_c\",\n", - " \"M\",\n", - " \"A_{\\rm Planck}\",\n", - "]\n", - "\n", - "for chain in chains:\n", - " param_names = chain.getParamNames()\n", - " for name, label in zip(param_list, label_list):\n", - " if param_names.parWithName(name) is not None:\n", - " param_names.parWithName(name).label = label" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Extract the best fit parameters" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "best_fit = {}\n", - "\n", - "for root, chain in zip(roots, chains):\n", - " print(root)\n", - " p = chain.getParams()\n", - "\n", - " best_fit[root] = chain_postprocessing.extract_best_fit_params(\n", - " chain, best_fit_method=\"2Dkde\"\n", - " )\n", - "\n", - " for param_name in best_fit[root].keys():\n", - " high_68, low_68, high_95, low_95 = chain_postprocessing.compute_limits(\n", - " chain, param_name\n", - " )\n", - " if param_name == \"S_8\":\n", - " print(f\"{best_fit[root][param_name]}\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run `Cosmosis` in test mode to get the data vectors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if not os.path.exists(path_ini_files + \"/values_empty.ini\"):\n", - " content = \"\"\"[cosmological_parameters]\n", - "\n", - "tau = 0.0544\n", - "w = -1.0\n", - "mnu = 0.06\n", - "omega_k = 0.0\n", - "wa = 0.0\n", - "\n", - "[halo_model_parameters]\n", - "\n", - "[intrinsic_alignment_parameters]\n", - "\n", - "[shear_calibration_parameters]\n", - "\n", - "[nofz_shifts]\n", - "\n", - "[psf_leakage_parameters]\n", - "\"\"\"\n", - "\n", - " with open(path_ini_files + \"/values_empty.ini\", \"w\") as f:\n", - " f.write(content)\n", - " f.close()\n", - "\n", - " print(\"File created successfully\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "section_map = {\n", - " \"omch2\": \"cosmological_parameters\",\n", - " \"ombh2\": \"cosmological_parameters\",\n", - " \"h0\": \"cosmological_parameters\",\n", - " \"n_s\": \"cosmological_parameters\",\n", - " \"tau\": \"cosmological_parameters\",\n", - " \"s_8_input\": \"cosmological_parameters\",\n", - " \"logt_agn\": \"halo_model_parameters\",\n", - " \"a\": \"intrinsic_alignment_parameters\",\n", - " \"m1\": \"shear_calibration_parameters\",\n", - " \"bias_1\": \"nofz_shifts\",\n", - " \"alpha\": \"psf_leakage_parameters\",\n", - " \"beta\": \"psf_leakage_parameters\",\n", - " \"m\": \"supernova_params\",\n", - " \"a_planck\": \"planck\",\n", - "}\n", - "\n", - "best_fit[\"SP_v1.4.6.3_B_no_ia_config\"][\"a\"] = 0" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "env = os.environ.copy()\n", - "env[\"LD_LIBRARY_PATH\"] = (\n", - " \"/home/guerrini/.conda/envs/sp_validation/lib/python3.9/site-packages/cosmosis/datablock:\"\n", - " + env.get(\"LD_LIBRARY_PATH\", \"\")\n", - ")\n", - "\n", - "for i, root in enumerate(roots):\n", - " print(root)\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - "\n", - " for param, section in section_map.items():\n", - " # Check if this parameter exists for the current root\n", - " if param in best_fit[root]:\n", - " value = best_fit[root][param]\n", - "\n", - " if section not in config:\n", - " config.add_section(section)\n", - "\n", - " config[section][param] = str(value)\n", - "\n", - " with open(path_ini_files + \"/values_empty.ini\", \"w\") as configfile:\n", - " config.write(configfile)\n", - "\n", - " # Modify the ini file to run in test mode at the best fit\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - "\n", - " ini_file = path_ini_files + \"config_space_v1.4.6.3_fiducial/pipeline/{}.ini\".format(\n", - " ini_roots[i]\n", - " )\n", - " config.read(ini_file)\n", - "\n", - " sampler = config[\"runtime\"][\"sampler\"]\n", - " config[\"runtime\"][\"sampler\"] = \"test\"\n", - " values = config[\"pipeline\"][\"values\"]\n", - " config[\"pipeline\"][\"values\"] = path_ini_files + \"/values_empty.ini\"\n", - " config[\"DEFAULT\"][\"FITS_FILE\"] = (\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_versions[0]}/cosmosis_{catalog_sub_versions[i]}.fits\"\n", - " )\n", - " config[\"test\"][\"save_dir\"] = root_dir + \"{}/best_fit\".format(root)\n", - "\n", - " with open(ini_file, \"w\") as configfile:\n", - " config.write(configfile)\n", - "\n", - " # Run cosmosis\n", - " result = subprocess.run(\n", - " [\"cosmosis\", ini_file], env=env, capture_output=True, text=True\n", - " )\n", - " print(f\"STDOUT:\\n{result.stdout}\")\n", - " print(f\"STDERR:\\n{result.stderr}\")\n", - "\n", - " # Modify the ini file to the previous one\n", - " config[\"pipeline\"][\"values\"] = values\n", - " config[\"runtime\"][\"sampler\"] = sampler\n", - "\n", - " with open(ini_file, \"w\") as configfile:\n", - " config.write(configfile)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Compute the $\\chi^2$" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "metrics = {}\n", - "\n", - "for idx, root in enumerate(roots):\n", - " print(root)\n", - " match = re.search(r\"corr_([A-Za-z])\", root)\n", - " if match:\n", - " blind = match.group(1)\n", - "\n", - " add_xi_sys = properties[root][\"add_xi_sys\"]\n", - " print(f\"add_xi_sys: {add_xi_sys}\")\n", - " lower_bound_xi_plus = properties[root][\"lower_bound_xi_plus\"]\n", - " upper_bound_xi_plus = properties[root][\"upper_bound_xi_plus\"]\n", - " lower_bound_xi_minus = properties[root][\"lower_bound_xi_minus\"]\n", - " upper_bound_xi_minus = properties[root][\"upper_bound_xi_minus\"]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder + \"{}/best_fit/shear_xi_plus/theta.txt\".format(root)\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder + \"{}/best_fit/shear_xi_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder + \"{}/best_fit/shear_xi_minus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " if add_xi_sys == \"T\":\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder + \"{}/best_fit/xi_sys/shear_xi_plus.txt\".format(root)\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder + \"{}/best_fit/xi_sys/shear_xi_minus.txt\".format(root)\n", - " )\n", - "\n", - " theta_tau = np.loadtxt(\n", - " output_folder + \"{}/best_fit/tau_0_plus/theta.txt\".format(root)\n", - " )\n", - " theta_tau_arcmin = theta_tau * 180 * 60 / np.pi\n", - " tau_0_model = np.loadtxt(\n", - " output_folder + \"{}/best_fit/tau_0_plus/bin_1_1.txt\".format(root)\n", - " )\n", - " tau_2_model = np.loadtxt(\n", - " output_folder + \"{}/best_fit/tau_2_plus/bin_1_1.txt\".format(root)\n", - " )\n", - "\n", - " data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_versions[0]}/cosmosis_{catalog_sub_versions[idx]}.fits\"\n", - " )\n", - "\n", - " tau_0_data = data[\"TAU_0_PLUS\"].data[\"VALUE\"]\n", - " tau_2_data = data[\"TAU_2_PLUS\"].data[\"VALUE\"]\n", - "\n", - " theta_data = data[\"XI_PLUS\"].data[\"ANG\"]\n", - " xi_plus_data = data[\"XI_PLUS\"].data[\"VALUE\"]\n", - " xi_minus_data = data[\"XI_MINUS\"].data[\"VALUE\"]\n", - "\n", - " # Load the covariance\n", - " cov = data[\"COVMAT\"].data\n", - " cov_xi = cov[0 : 2 * len(xi_plus_data), 0 : 2 * len(xi_plus_data)]\n", - " cov_tau = cov[2 * len(xi_plus_data) :, 2 * len(xi_plus_data) :]\n", - "\n", - " # interpolate the model\n", - " interp_xi_plus = interp1d(\n", - " theta_arcmin, shear_xi_plus, kind=\"cubic\", fill_value=\"extrapolate\"\n", - " )\n", - " interp_xi_minus = interp1d(\n", - " theta_arcmin, shear_xi_minus, kind=\"cubic\", fill_value=\"extrapolate\"\n", - " )\n", - "\n", - " xi_plus_model = interp_xi_plus(theta_data)\n", - " if add_xi_sys:\n", - " xi_plus_model += xi_sys_plus\n", - " xi_minus_model = interp_xi_minus(theta_data)\n", - " if add_xi_sys:\n", - " xi_minus_model += xi_sys_minus\n", - "\n", - " # Concatenate the data vector\n", - " xi_data = np.concatenate((xi_plus_data, xi_minus_data))\n", - " xi_model = np.concatenate((xi_plus_model, xi_minus_model))\n", - "\n", - " tau_data = np.concatenate((tau_0_data, tau_2_data))\n", - " tau_model = np.concatenate((tau_0_model, tau_2_model))\n", - "\n", - " # Apply scale cuts\n", - " mask_xi_plus = (theta_data > lower_bound_xi_plus) & (\n", - " theta_data < upper_bound_xi_plus\n", - " )\n", - " mask_xi_minus = (theta_data > lower_bound_xi_minus) & (\n", - " theta_data < upper_bound_xi_minus\n", - " )\n", - " mask = np.concatenate((mask_xi_plus, mask_xi_minus))\n", - "\n", - " xi_data = xi_data[mask]\n", - " xi_model = xi_model[mask]\n", - " cov_xi = cov_xi[mask][:, mask]\n", - "\n", - " cov_xi_plus = cov[0 : len(xi_plus_data), 0 : len(xi_plus_data)]\n", - " cov_xi_plus = cov_xi_plus[mask_xi_plus][:, mask_xi_plus]\n", - " cov_xi_minus = cov[\n", - " len(xi_plus_data) : 2 * len(xi_minus_data),\n", - " len(xi_plus_data) : 2 * len(xi_minus_data),\n", - " ]\n", - " cov_xi_minus = cov_xi_minus[mask_xi_minus][:, mask_xi_minus]\n", - "\n", - " xi_plus_chi2 = np.dot(\n", - " (xi_plus_model[mask_xi_plus] - xi_plus_data[mask_xi_plus]),\n", - " np.dot(\n", - " np.linalg.inv(cov_xi_plus),\n", - " (xi_plus_model[mask_xi_plus] - xi_plus_data[mask_xi_plus]),\n", - " ),\n", - " )\n", - " xi_minus_chi2 = np.dot(\n", - " (xi_minus_model[mask_xi_minus] - xi_minus_data[mask_xi_minus]),\n", - " np.dot(\n", - " np.linalg.inv(cov_xi_minus),\n", - " (xi_minus_model[mask_xi_minus] - xi_minus_data[mask_xi_minus]),\n", - " ),\n", - " )\n", - " xi_chi2 = np.dot(\n", - " (xi_model - xi_data), np.dot(np.linalg.inv(cov_xi), (xi_model - xi_data))\n", - " )\n", - " tau_chi2 = np.dot(\n", - " (tau_model - tau_data), np.dot(np.linalg.inv(cov_tau), (tau_model - tau_data))\n", - " )\n", - " n_dof_xi_plus = np.sum(mask_xi_plus)\n", - " n_dof_xi_minus = np.sum(mask_xi_minus)\n", - " n_dof_tau = len(tau_0_data) + len(tau_2_data)\n", - " p_value_xi_plus = 1 - stats.chi2.cdf(xi_plus_chi2, n_dof_xi_plus)\n", - " p_value_xi_minus = 1 - stats.chi2.cdf(xi_minus_chi2, n_dof_xi_minus)\n", - " p_value_xi = 1 - stats.chi2.cdf(xi_chi2, n_dof_xi_plus + n_dof_xi_minus)\n", - " p_value_tau = 1 - stats.chi2.cdf(tau_chi2, n_dof_tau)\n", - " chi2_tot = xi_plus_chi2 + xi_minus_chi2 + tau_chi2\n", - " n_dof_tot = n_dof_xi_plus + n_dof_xi_minus + n_dof_tau\n", - " p_value_tot = 1 - stats.chi2.cdf(chi2_tot, n_dof_tot)\n", - "\n", - " metrics[root] = {\n", - " \"chi2_xi_plus\": xi_plus_chi2,\n", - " \"n_dof_xi_plus\": n_dof_xi_plus,\n", - " \"p_value_xi_plus\": p_value_xi_plus,\n", - " \"chi2_xi_minus\": xi_minus_chi2,\n", - " \"n_dof_xi_minus\": n_dof_xi_minus,\n", - " \"p_value_xi_minus\": p_value_xi_minus,\n", - " \"chi2_xi\": xi_chi2,\n", - " \"p_value_xi\": p_value_xi,\n", - " \"chi2_tau\": tau_chi2,\n", - " \"n_dof_tau\": n_dof_tau,\n", - " \"p_value_tau\": p_value_tau,\n", - " \"chi2_tot\": chi2_tot,\n", - " \"n_dof_tot\": n_dof_tot,\n", - " \"p_value_tot\": p_value_tot,\n", - " }\n", - " print(\"Done!\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def get_latex_table(metrics):\n", - " latex_lines = [\n", - " r\"\\begin{tabular}{lccc|ccc|ccc}\",\n", - " r\"\\hline\",\n", - " r\"Root & $\\chi^2_{\\xi^+}$/dof & $p_{\\xi^+}$ & $\\chi^2_{\\xi^-}$/dof & $p_{\\xi^+}$ & $\\chi^2_{\\xi}$/dof & $p_{\\xi}$ &\"\n", - " r\"$\\chi^2_\\tau$/dof & $p_\\tau$ & $\\chi^2_{\\text{tot}}$/dof & $p_{\\text{tot}}$ \\\\\",\n", - " r\"\\hline\",\n", - " ]\n", - "\n", - " for root, vals in metrics.items():\n", - " escaped = root.replace(\"_\", r\"\\_\")\n", - " line = (\n", - " f\"{escaped} & \"\n", - " f\"{vals['chi2_xi_plus']:.2f}/{vals['n_dof_xi_plus']} & {vals['p_value_xi_plus']:.3g} & \"\n", - " f\"{vals['chi2_xi_minus']:.2f}/{vals['n_dof_xi_minus']} & {vals['p_value_xi_minus']:.3g} & \"\n", - " f\"{vals['chi2_xi']:.2f}/{vals['n_dof_xi_plus'] + vals['n_dof_xi_minus']} & {vals['p_value_xi']:.3g} &\"\n", - " f\"{vals['chi2_tau']:.2f}/{vals['n_dof_tau']} & {vals['p_value_tau']:.3g} & \"\n", - " f\"{vals['chi2_tot']:.2f}/{vals['n_dof_tot']} & {vals['p_value_tot']:.3g} \\\\\\\\\"\n", - " )\n", - " latex_lines.append(line)\n", - "\n", - " latex_lines.append(r\"\\hline\")\n", - " latex_lines.append(r\"\\end{tabular}\")\n", - "\n", - " # Print LaTeX table\n", - " print(\"\\n\".join(latex_lines))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "get_latex_table(metrics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def display_markdown(metrics):\n", - " # Build Markdown table\n", - " header = (\n", - " \"| Root | $\\\\chi^2$ (ξ⁺) / dof | p-val (ξ⁺) |$\\\\chi^2$ (ξ-) / dof | p-val (ξ-) | $\\\\chi^2$ (ξ) / dof | p-val (ξ) | $\\\\chi^2$ (τ) / dof | p-val (τ) | $\\\\chi^2$ (tot) / dof | p-val (tot) |\\n\"\n", - " \"|------|----------------|------------|----------------|------------|------------|---------------|------------|------------|------------------|--------------|\\n\"\n", - " )\n", - "\n", - " rows = []\n", - " for root, vals in metrics.items():\n", - " row = f\"| `{root}` \"\n", - " row += f\"| {vals['chi2_xi_plus']:.2f} / {vals['n_dof_xi_plus']} \"\n", - " row += f\"| {vals['p_value_xi_plus']:.5f} \"\n", - " row += f\"| {vals['chi2_xi_minus']:.2f} / {vals['n_dof_xi_minus']} \"\n", - " row += f\"| {vals['p_value_xi_minus']:.5f} \"\n", - " row += f\"| {vals['chi2_xi']:.2f} / {vals['n_dof_xi_minus'] + vals['n_dof_xi_plus']} \"\n", - " row += f\"| {vals['p_value_xi']:.5f} \"\n", - " row += f\"| {vals['chi2_tau']:.2f} / {vals['n_dof_tau']} \"\n", - " row += f\"| {vals['p_value_tau']:.5f} \"\n", - " row += f\"| {vals['chi2_tot']:.2f} / {vals['n_dof_tot']} \"\n", - " row += f\"| {vals['p_value_tot']:.5f} |\"\n", - " rows.append(row)\n", - "\n", - " # Display in Jupyter\n", - " display(Markdown(header + \"\\n\".join(rows)))\n", - " return header + \"\\n\".join(rows)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "markdown_source = display_markdown(metrics)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_chi2_glass_mock.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_chi2_glass_mock.ipynb deleted file mode 100644 index ddd66cd0..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_chi2_glass_mock.ipynb +++ /dev/null @@ -1,565 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import configparser\n", - "import os\n", - "import subprocess\n", - "import sys\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "\n", - "# Make the plot\n", - "import seaborn as sns\n", - "from astropy.io import fits\n", - "from getdist import plots\n", - "from scipy.interpolate import interp1d\n", - "from scipy.stats import chi2\n", - "\n", - "sys.path.append(\"/home/guerrini/sp_validation/cosmo_inference/scripts\")\n", - "\n", - "import chain_postprocessing\n", - "\n", - "%matplotlib inline\n", - "\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "\n", - "plt.rcParams[\"axes.labelsize\"] = 18\n", - "plt.rcParams[\"xtick.labelsize\"] = 18\n", - "plt.rcParams[\"ytick.labelsize\"] = 18\n", - "\n", - "plt.rcParams[\"text.usetex\"] = True\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 40\n", - "\n", - "# #SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE\n", - "\n", - "root_dir = \"/n09data/guerrini/glass_mock_chains/\"\n", - "\n", - "# Version of the glass mock chain run\n", - "chain_version = \"v6\"\n", - "\n", - "# Path to the glass mock data vectors\n", - "root_glass_dv = (\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/glass_mocks/{chain_version}/\"\n", - ")\n", - "\n", - "# Choose the best-fit method\n", - "best_fit_method = \"2Dkde\"\n", - "\n", - "# Create the list of mocks\n", - "max_sim = 350\n", - "failed_simulations = [82, 83, 281, 282, 283, 284, 285, 286, 287]\n", - "roots = [f\"glass_mock_{chain_version}_{str(i).zfill(5)}\" for i in range(1, max_sim + 1)]\n", - "roots = [root for root in roots if int(root.split(\"_\")[-1]) not in failed_simulations]\n", - "\n", - "catalog_versions = [\n", - " \"SP_v1.4.6.3_config/SP_v1.4.6.3_A\",\n", - "]\n", - "\n", - "output_folder_chains = \"/n23data1/n06data/lgoh/scratch/temp/\"\n", - "path_ini_files = \"/home/guerrini/sp_validation/cosmo_inference/cosmosis_config/\"\n", - "output_fig_path = (\n", - " \"/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/notebooks/Plots/\"\n", - ")\n", - "\n", - "ini_root = \"blind_A/fiducial\"\n", - "\n", - "lower_bound_xi = 12\n", - "upper_bound_xi = 83" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Retrieve the chains" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# READ CHAIN\n", - "\n", - "chains = []\n", - "best_fit = {}\n", - "\n", - "for i, root in enumerate(roots):\n", - " burnin = 0\n", - "\n", - " if os.path.isfile(f\"{root_dir}/{root}/{root}/getdist_{root}.txt\") == True:\n", - " chain = g.samples_for_root(\n", - " f\"{root_dir}/{root}/{root}/getdist_{root}\",\n", - " cache=False,\n", - " settings={\n", - " \"ignore_rows\": burnin,\n", - " \"smooth_scale_2D\": 0.5,\n", - " \"smooth_scale_1D\": 0.5,\n", - " },\n", - " )\n", - " p = chain.getParams()\n", - "\n", - " best_fit[root] = chain_postprocessing.extract_best_fit_params(\n", - " chain, best_fit_method=\"2Dkde\"\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "param_list = [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"s_8_input\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - " \"alpha\",\n", - " \"beta\",\n", - " \"omch2\",\n", - " \"m\",\n", - " \"a_planck\",\n", - "]\n", - "label_list = [\n", - " r\"\\Omega_m\",\n", - " r\"\\omega_b\",\n", - " \"h_0\",\n", - " \"n_s\",\n", - " r\"\\sigma_8\",\n", - " \"S_8\",\n", - " \"log T_{AGN}\",\n", - " \"A_{IA}\",\n", - " \"m_1\",\n", - " r\"\\Delta z_1\",\n", - " \"\\\\alpha_{PSF}\",\n", - " \"\\\\beta_{PSF}\",\n", - " r\"\\omega_c\",\n", - " \"M\",\n", - " \"A_{\\rm Planck}\",\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run `Cosmosis` in test mode to get the data vectors" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "if not os.path.exists(path_ini_files + \"/values_empty.ini\"):\n", - " content = \"\"\"[cosmological_parameters]\n", - "\n", - "tau = 0.0544\n", - "w = -1.0\n", - "mnu = 0.06\n", - "omega_k = 0.0\n", - "wa = 0.0\n", - "\n", - "[halo_model_parameters]\n", - "\n", - "[intrinsic_alignment_parameters]\n", - "\n", - "[shear_calibration_parameters]\n", - "\n", - "[nofz_shifts]\n", - "\n", - "[psf_leakage_parameters]\n", - "\"\"\"\n", - "\n", - " with open(path_ini_files + \"/values_empty.ini\", \"w\") as f:\n", - " f.write(content)\n", - " f.close()\n", - "\n", - " print(\"File created successfully\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "section_map = {\n", - " \"omch2\": \"cosmological_parameters\",\n", - " \"ombh2\": \"cosmological_parameters\",\n", - " \"h0\": \"cosmological_parameters\",\n", - " \"n_s\": \"cosmological_parameters\",\n", - " \"s_8_input\": \"cosmological_parameters\",\n", - " \"logt_agn\": \"halo_model_parameters\",\n", - " \"a\": \"intrinsic_alignment_parameters\",\n", - " \"m1\": \"shear_calibration_parameters\",\n", - " \"bias_1\": \"nofz_shifts\",\n", - " \"alpha\": \"psf_leakage_parameters\",\n", - " \"beta\": \"psf_leakage_parameters\",\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "env = os.environ.copy()\n", - "env[\"LD_LIBRARY_PATH\"] = (\n", - " \"/home/guerrini/.conda/envs/sp_validation/lib/python3.9/site-packages/cosmosis/datablock:\"\n", - " + env.get(\"LD_LIBRARY_PATH\", \"\")\n", - ")\n", - "for i, root in enumerate(roots):\n", - " print(root)\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - "\n", - " for param, section in section_map.items():\n", - " # Check if this parameter exists for the current root\n", - " if param in best_fit[root]:\n", - " value = best_fit[root][param]\n", - "\n", - " if section not in config:\n", - " config.add_section(section)\n", - "\n", - " config[section][param] = str(value)\n", - "\n", - " with open(path_ini_files + \"/values_empty.ini\", \"w\") as configfile:\n", - " config.write(configfile)\n", - "\n", - " # Modify the ini file to run in test mode at the best fit\n", - " config = configparser.ConfigParser()\n", - " config.optionxform = str # Preserve case sensitivity of option names\n", - "\n", - " ini_file = (\n", - " path_ini_files + f\"config_space_v1.4.6.3_fiducial/pipeline/{ini_root}.ini\"\n", - " )\n", - " config.read(ini_file)\n", - "\n", - " sampler = config[\"runtime\"][\"sampler\"]\n", - " config[\"runtime\"][\"sampler\"] = \"test\"\n", - " values = config[\"pipeline\"][\"values\"]\n", - " config[\"pipeline\"][\"values\"] = path_ini_files + \"/values_empty.ini\"\n", - " config[\"DEFAULT\"][\"FITS_FILE\"] = (\n", - " f\"{root_glass_dv}/glass_mock_{root[-5:]}/cosmosis_glass_mock_v6_{root[-5:]}.fits\"\n", - " )\n", - " config[\"test\"][\"save_dir\"] = output_folder_chains + f\"{root}/best_fit_config\"\n", - "\n", - " with open(ini_file, \"w\") as configfile:\n", - " config.write(configfile)\n", - "\n", - " # Run cosmosis\n", - " result = subprocess.run(\n", - " [\"cosmosis\", ini_file], env=env, capture_output=True, text=True\n", - " )\n", - " # print(f\"STDOUT:\\n{result.stdout}\")\n", - " # print(f\"STDERR:\\n{result.stderr}\")\n", - "\n", - " # Modify the ini file to the previous one\n", - " config[\"pipeline\"][\"values\"] = values\n", - " config[\"runtime\"][\"sampler\"] = sampler\n", - "\n", - " with open(ini_file, \"w\") as configfile:\n", - " config.write(configfile)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "xi_plus_chi2s = np.array([])\n", - "xi_minus_chi2s = np.array([])\n", - "xi_chi2s = np.array([])\n", - "tau_chi2s = np.array([])\n", - "chi2_tots = np.array([])\n", - "\n", - "\n", - "for idx, root in enumerate(roots):\n", - " print(root)\n", - "\n", - " data = fits.open(\n", - " f\"{root_glass_dv}/glass_mock_{root[-5:]}/cosmosis_glass_mock_v6_{root[-5:]}.fits\"\n", - " )\n", - "\n", - " tau_0_data = data[\"TAU_0_PLUS\"].data[\"VALUE\"]\n", - " tau_2_data = data[\"TAU_2_PLUS\"].data[\"VALUE\"]\n", - "\n", - " theta_data = data[\"XI_PLUS\"].data[\"ANG\"]\n", - " xi_plus_data = data[\"XI_PLUS\"].data[\"VALUE\"]\n", - " xi_minus_data = data[\"XI_MINUS\"].data[\"VALUE\"]\n", - " xi_data = np.concatenate((xi_plus_data, xi_minus_data))\n", - "\n", - " tau_data = np.concatenate((tau_0_data, tau_2_data))\n", - "\n", - " # Apply scale cuts\n", - " mask_xi_plus = (theta_data > lower_bound_xi) & (theta_data < upper_bound_xi)\n", - " mask_xi_minus = (theta_data > lower_bound_xi) & (theta_data < upper_bound_xi)\n", - " mask = np.concatenate((mask_xi_plus, mask_xi_minus))\n", - " # Load the covariance\n", - " cov = data[\"COVMAT\"].data\n", - " cov_xi = cov[0 : 2 * len(xi_plus_data), 0 : 2 * len(xi_plus_data)]\n", - " cov_tau = cov[\n", - " 2 * len(xi_plus_data) : 4 * len(xi_plus_data),\n", - " 2 * len(xi_plus_data) : 4 * len(xi_plus_data),\n", - " ]\n", - " xi_data = xi_data[mask]\n", - " cov_xi = cov_xi[mask][:, mask]\n", - "\n", - " cov_xi_plus = cov[0 : len(xi_plus_data), 0 : len(xi_plus_data)]\n", - " cov_xi_plus = cov_xi_plus[mask_xi_plus][:, mask_xi_plus]\n", - " cov_xi_minus = cov[\n", - " len(xi_plus_data) : 2 * len(xi_minus_data),\n", - " len(xi_plus_data) : 2 * len(xi_minus_data),\n", - " ]\n", - " cov_xi_minus = cov_xi_minus[mask_xi_minus][:, mask_xi_minus]\n", - "\n", - " # Read the results\n", - " theta = np.loadtxt(\n", - " output_folder_chains + f\"{root}/best_fit_config/shear_xi_plus/theta.txt\"\n", - " )\n", - " theta_arcmin = theta * 180 * 60 / np.pi\n", - " shear_xi_plus = np.loadtxt(\n", - " output_folder_chains + f\"{root}/best_fit_config/shear_xi_plus/bin_1_1.txt\"\n", - " )\n", - " shear_xi_minus = np.loadtxt(\n", - " output_folder_chains + f\"{root}/best_fit_config/shear_xi_minus/bin_1_1.txt\"\n", - " )\n", - "\n", - " xi_sys_plus = np.loadtxt(\n", - " output_folder_chains + f\"{root}/best_fit_config/xi_sys/shear_xi_plus.txt\"\n", - " )\n", - " xi_sys_minus = np.loadtxt(\n", - " output_folder_chains + f\"{root}/best_fit_config/xi_sys/shear_xi_minus.txt\"\n", - " )\n", - "\n", - " theta_tau = np.loadtxt(\n", - " output_folder_chains + f\"{root}/best_fit_config/tau_0_plus/theta.txt\"\n", - " )\n", - " theta_tau_arcmin = theta_tau * 180 * 60 / np.pi\n", - " tau_0_model = np.loadtxt(\n", - " output_folder_chains + f\"{root}/best_fit_config/tau_0_plus/bin_1_1.txt\"\n", - " )\n", - " tau_2_model = np.loadtxt(\n", - " output_folder_chains + f\"{root}/best_fit_config/tau_2_plus/bin_1_1.txt\"\n", - " )\n", - "\n", - " # interpolate the model\n", - " interp_xi_plus = interp1d(\n", - " theta_arcmin, shear_xi_plus, kind=\"cubic\", fill_value=\"extrapolate\"\n", - " )\n", - " interp_xi_minus = interp1d(\n", - " theta_arcmin, shear_xi_minus, kind=\"cubic\", fill_value=\"extrapolate\"\n", - " )\n", - "\n", - " xi_plus_model = interp_xi_plus(theta_data)\n", - " xi_plus_model += xi_sys_plus\n", - " xi_minus_model = interp_xi_minus(theta_data)\n", - " xi_minus_model += xi_sys_minus\n", - "\n", - " xi_model = np.concatenate((xi_plus_model, xi_minus_model))\n", - " tau_model = np.concatenate((tau_0_model, tau_2_model))\n", - " xi_model = xi_model[mask]\n", - "\n", - " xi_plus_chi2 = np.dot(\n", - " (xi_plus_model[mask_xi_plus] - xi_plus_data[mask_xi_plus]),\n", - " np.dot(\n", - " np.linalg.inv(cov_xi_plus),\n", - " (xi_plus_model[mask_xi_plus] - xi_plus_data[mask_xi_plus]),\n", - " ),\n", - " )\n", - " xi_minus_chi2 = np.dot(\n", - " (xi_minus_model[mask_xi_minus] - xi_minus_data[mask_xi_minus]),\n", - " np.dot(\n", - " np.linalg.inv(cov_xi_minus),\n", - " (xi_minus_model[mask_xi_minus] - xi_minus_data[mask_xi_minus]),\n", - " ),\n", - " )\n", - " xi_chi2 = np.dot(\n", - " (xi_model - xi_data), np.dot(np.linalg.inv(cov_xi), (xi_model - xi_data))\n", - " )\n", - " tau_chi2 = np.dot(\n", - " (tau_model - tau_data), np.dot(np.linalg.inv(cov_tau), (tau_model - tau_data))\n", - " )\n", - " chi2_tot = xi_plus_chi2 + xi_minus_chi2 + tau_chi2\n", - "\n", - " xi_plus_chi2s = np.append(xi_plus_chi2s, xi_plus_chi2)\n", - " xi_minus_chi2s = np.append(xi_minus_chi2s, xi_minus_chi2)\n", - " xi_chi2s = np.append(xi_chi2s, xi_chi2)\n", - " tau_chi2s = np.append(tau_chi2s, tau_chi2)\n", - " chi2_tots = np.append(chi2_tots, chi2_tot)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, [ax1, ax2] = plt.subplots(2, 1, figsize=(7, 10))\n", - "chi2_fiducial = -2 * -37.560916821678894\n", - "dof, loc, scale = chi2.fit(chi2_tots, floc=0)\n", - "\n", - "print(f\"Best-fit dof: {dof:.3e}\")\n", - "counts, bin_edges = np.histogram(chi2_tots, bins=25, density=True)\n", - "\n", - "sns.histplot(\n", - " chi2_tots,\n", - " ax=ax1,\n", - " kde=False,\n", - " bins=bin_edges,\n", - " stat=\"density\",\n", - " label=r\"$\\chi^2$ for \\texttt{GLASS} mocks best-fits\",\n", - " color=\"green\",\n", - " alpha=0.3,\n", - ")\n", - "\n", - "# Compute the p-value\n", - "\n", - "# 1. Get in which bin the chi2 of the fiducial falls\n", - "bin_index = np.digitize(chi2_fiducial, bin_edges)\n", - "\n", - "# 2. Compute the p-value as the integral of the tail of the histogram\n", - "p_value = np.sum(counts[bin_index:]) * np.diff(bin_edges)[0]\n", - "\n", - "print(f\"P-value: {p_value}\")\n", - "\n", - "ax1.axvline(chi2_fiducial, color=\"red\", label=r\"$\\chi^2$ of the fiducial\", lw=2)\n", - "\n", - "mantissa, exponent = np.frexp(p_value)\n", - "pte_string = rf\"${{\\rm PTE}} = {p_value:.4f}$\"\n", - "print(f\"mantissa: {mantissa}, exponent: {exponent}\")\n", - "x_text = 78\n", - "y_text = max(counts) * 0.95\n", - "ax1.text(\n", - " x_text,\n", - " y_text,\n", - " pte_string,\n", - " fontsize=15,\n", - " bbox=dict(facecolor=\"wheat\", alpha=0.8, edgecolor=\"black\"),\n", - ")\n", - "\n", - "chi2_string = rf\"${{\\rm Eff. dof}}= {dof:.1f}$\"\n", - "y_text = max(counts) * 0.85\n", - "ax1.text(\n", - " x_text,\n", - " y_text,\n", - " chi2_string,\n", - " fontsize=15,\n", - " bbox=dict(facecolor=\"wheat\", alpha=0.8, edgecolor=\"black\"),\n", - ")\n", - "\n", - "ax1.set_xlabel(r\"$\\chi^2_{\\rm tot}$\")\n", - "ax1.set_ylabel(\"Density\")\n", - "\n", - "chi2_fiducial = 9.5\n", - "dof, loc, scale = chi2.fit(xi_chi2s, floc=0)\n", - "\n", - "print(f\"Best-fit dof: {dof:.3e}\")\n", - "counts, bin_edges = np.histogram(xi_chi2s, bins=25, density=True)\n", - "\n", - "sns.histplot(\n", - " xi_chi2s,\n", - " ax=ax2,\n", - " kde=False,\n", - " bins=bin_edges,\n", - " stat=\"density\",\n", - " label=r\"$\\chi^2$ for \\texttt{GLASS} mocks best-fits\",\n", - " color=\"pink\",\n", - " alpha=0.5,\n", - ")\n", - "\n", - "# Compute the p-value\n", - "\n", - "# 1. Get in which bin the chi2 of the fiducial falls\n", - "bin_index = np.digitize(chi2_fiducial, bin_edges)\n", - "\n", - "# 2. Compute the p-value as the integral of the tail of the histogram\n", - "p_value = np.sum(counts[bin_index:]) * np.diff(bin_edges)[0]\n", - "\n", - "print(f\"P-value: {p_value}\")\n", - "\n", - "ax2.axvline(chi2_fiducial, color=\"red\", label=r\"$\\chi^2$ of the fiducial\", lw=2)\n", - "\n", - "mantissa, exponent = np.frexp(p_value)\n", - "print(f\"mantissa: {mantissa}, exponent: {exponent}\")\n", - "pte_string = rf\"${{\\rm PTE}} = {p_value:.4f}$\"\n", - "# rf\"${{\\rm PTE}} = {mantissa:.2f} \\times 10^{{{exponent}}}$\" if exponent != 0 else\n", - "x_text = 17.5\n", - "y_text = max(counts) * 0.95\n", - "ax2.text(\n", - " x_text,\n", - " y_text,\n", - " pte_string,\n", - " fontsize=15,\n", - " bbox=dict(facecolor=\"wheat\", alpha=0.8, edgecolor=\"black\"),\n", - ")\n", - "\n", - "chi2_string = rf\"${{\\rm Eff. dof}}= {dof:.1f}$\"\n", - "y_text = max(counts) * 0.85\n", - "ax2.text(\n", - " x_text,\n", - " y_text,\n", - " chi2_string,\n", - " fontsize=15,\n", - " bbox=dict(facecolor=\"wheat\", alpha=0.8, edgecolor=\"black\"),\n", - ")\n", - "\n", - "ax2.set_xlabel(r\"$\\chi^2 (\\xi_\\pm)$\")\n", - "ax2.set_ylabel(\"Density\")\n", - "fig.savefig(f\"{output_fig_path}/chi2_glass_mocks_p_value_xi_tau.pdf\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_prior_psf_leakage.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_prior_psf_leakage.ipynb deleted file mode 100644 index ad6f5fd1..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/get_prior_psf_leakage.ipynb +++ /dev/null @@ -1,261 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0", - "metadata": {}, - "source": [ - "# Covariance matrix and PSF leakage\n", - "\n", - "This notebook plots the combined covariance matrix, and samples and plots the 2D marginalised posteriors of the PSF leakage parameters $\\alpha$ and $\\beta$." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "if not os.path.exists(\"./Plots\"):\n", - " os.makedirs(\"./Plots\")\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "from astropy.io import fits\n", - "from getdist import MCSamples, plots\n", - "from shear_psf_leakage.rho_tau_stat import PSFErrorFit, RhoStat, TauStat\n", - "\n", - "# Use paper style and seaborn with husl palette\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "# Set default palette - will be updated per plot as needed\n", - "sns.set_palette(\"husl\")\n", - "%matplotlib inline\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 25\n", - "\n", - "ver = \"v1.4.6.3\"\n", - "blind = \"B\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "data_path = f\"/home/guerrini/sp_validation/cosmo_inference/data/SP_{ver}_config/\"\n", - "\n", - "path_cosmo_val = \"/home/guerrini/sp_validation/cosmo_val/output/\"\n", - "\n", - "roots = [f\"SP_{ver}_{blind}\", f\"SP_{ver}_leak_corr_{blind}\"]\n", - "\n", - "labels = [f\"SP_{ver}_{blind}\", f\"SP_{ver}_leak_corr_{blind}\"]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "data_vectors = []\n", - "\n", - "for root in roots:\n", - " data_vectors.append(\n", - " fits.open(data_path + f\"SP_{ver}_{blind}/cosmosis_{root}_masked.fits\")\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "def cov_to_corr(cov):\n", - " \"\"\"Convert a covariance matrix to a correlation matrix.\"\"\"\n", - " d = np.sqrt(np.diag(cov))\n", - " corr = cov / np.outer(d, d)\n", - " corr[cov == 0] = 0\n", - " return corr" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "# Print the covariance matrix for each root\n", - "for i, root in enumerate(roots):\n", - " print(f\"Covariance matrix for {labels[i]}:\")\n", - " cov = data_vectors[i][\"COVMAT\"].data\n", - "\n", - " n_bins = cov.shape[0] // 4\n", - "\n", - " fig, ax = plt.subplots(figsize=(10, 8))\n", - "\n", - " im = ax.imshow(cov_to_corr(cov), vmin=-1, vmax=1, cmap=\"seismic\")\n", - " ax.set_aspect(\"equal\")\n", - " ax.set_yticks(np.array([10, 30, 50, 70]))\n", - " ax.set_yticklabels(\n", - " [\n", - " r\"$\\xi_+(\\vartheta)$\",\n", - " r\"$\\xi_-(\\vartheta)$\",\n", - " r\"$\\tau_0(\\vartheta)$\",\n", - " r\"$\\tau_2(\\vartheta)$\",\n", - " ]\n", - " )\n", - " ax.set_xticks(np.array([10, 30, 50, 70]))\n", - " ax.set_xticklabels(\n", - " [\n", - " r\"$\\xi_+(\\vartheta)$\",\n", - " r\"$\\xi_-(\\vartheta)$\",\n", - " r\"$\\tau_0(\\vartheta)$\",\n", - " r\"$\\tau_2(\\vartheta)$\",\n", - " ],\n", - " rotation=45,\n", - " )\n", - " fig.colorbar(im, ax=ax)\n", - "\n", - " plt.savefig(f\"./Plots/cov_matrix_{root}.png\", bbox_inches=\"tight\", dpi=300)\n", - " plt.show()\n", - " print(\"\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "# Create dummy rho and tau stat handler.\n", - "\n", - "# Inference of the xi_sys parameters\n", - "sep_units = \"arcmin\"\n", - "coord_units = \"degrees\"\n", - "theta_min = 1.0\n", - "theta_max = 250\n", - "nbins = 20\n", - "\n", - "\n", - "TreeCorrConfig_xi = {\n", - " \"ra_units\": coord_units,\n", - " \"dec_units\": coord_units,\n", - " \"min_sep\": theta_min,\n", - " \"max_sep\": theta_max,\n", - " \"sep_units\": sep_units,\n", - " \"nbins\": nbins,\n", - " \"var_method\": \"jackknife\",\n", - "}\n", - "\n", - "rho_stats_handler = RhoStat(output=\".\", treecorr_config=TreeCorrConfig_xi, verbose=True)\n", - "\n", - "tau_stats_handler = TauStat(\n", - " catalogs=rho_stats_handler.catalogs,\n", - " output=\".\",\n", - " treecorr_config=TreeCorrConfig_xi,\n", - " verbose=True,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [ - "# Create a PSFErrorFit instance\n", - "psf_fitter = PSFErrorFit(\n", - " rho_stats_handler,\n", - " tau_stats_handler,\n", - " path_cosmo_val + \"rho_tau_stats/\",\n", - " use_eta=False,\n", - ")\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 40\n", - "\n", - "chains = []\n", - "\n", - "# Load rho-, tau-statistics, and cov_tau from the data_vector\n", - "for i, root in enumerate(roots):\n", - " print(\"Sampling PSF parameters for \", labels[i])\n", - " path_rho = f\"rho_stats_{root}.fits\"\n", - " path_tau = f\"tau_stats_{root}.fits\"\n", - " path_cov_rho = f\"cov_rho_{root}.npy\"\n", - " path_cov_tau = f\"cov_tau_{root}_th.npy\"\n", - " psf_fitter.load_rho_stat(path_rho)\n", - " psf_fitter.load_tau_stat(path_tau)\n", - " psf_fitter.load_covariance(path_cov_rho, cov_type=\"rho\")\n", - " psf_fitter.load_covariance(path_cov_tau, cov_type=\"tau\")\n", - " samples_lq, _, _ = psf_fitter.get_least_squares_params_samples(\n", - " npatch=None, apply_debias=False\n", - " )\n", - "\n", - " samples_gd = MCSamples(\n", - " samples=samples_lq, names=[r\"\\alpha\", r\"\\beta\"], labels=[r\"\\alpha\", r\"\\beta\"]\n", - " )\n", - "\n", - " chains.append(samples_gd)\n", - "\n", - "g.triangle_plot(\n", - " chains,\n", - " filled=True,\n", - " legend_labels=labels,\n", - " legend_loc=\"upper right\",\n", - ")\n", - "\n", - "# plt.savefig(f\"./Plots/psf_leakage_params.png\", bbox_inches='tight', dpi=300)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/glass_mock_hist.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/glass_mock_hist.ipynb deleted file mode 100644 index 32f89a18..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/glass_mock_hist.ipynb +++ /dev/null @@ -1,586 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "0", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [], - "source": [ - "import IPython\n", - "\n", - "ipython = IPython.get_ipython()\n", - "\n", - "if ipython is not None:\n", - " ipython.run_line_magic(\"load_ext\", \"autoreload\")\n", - " ipython.run_line_magic(\"autoreload\", \"2\")\n", - "\n", - "import os\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "from getdist import plots\n", - "from tqdm import tqdm\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=7)\n", - "g.settings.axes_fontsize = 15\n", - "g.settings.axes_labelsize = 15\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 15\n", - "\n", - "if os.path.exists(\"/home/guerrini/matplotlib_config/paper.mplstyle\"):\n", - " plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "\n", - "# Set default palette - will be updated per plot as needed\n", - "sns.set_palette(\"husl\")\n", - "\n", - "if ipython is not None:\n", - " ipython.run_line_magic(\"matplotlib\", \"inline\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": { - "lines_to_next_cell": 1 - }, - "outputs": [], - "source": [ - "root_dir = \"/n09data/guerrini/glass_mock_chains/\"\n", - "chain_version = \"v6\"\n", - "num_sims = 350\n", - "\n", - "roots = [f\"glass_mock_{chain_version}_{i + 1:05d}\" for i in range(num_sims)]\n", - "\n", - "\n", - "# # %%\n", - "def load_samples_and_write_paramames(root_dir, root, chain_type=\"configuration\"):\n", - " assert chain_type in [\"configuration\", \"harmonic\"], (\n", - " \"chain_type must be 'configuration' or 'harmonic'\"\n", - " )\n", - "\n", - " if chain_type == \"configuration\":\n", - " path_samples = root_dir + \"{}/{}/samples_{}.txt\".format(\"/\" + root, root, root)\n", - " path_paramnames = root_dir + \"{}/{}/getdist_{}.paramnames\".format(\n", - " \"/\" + root, root, root\n", - " )\n", - " else:\n", - " path_samples = root_dir + \"{}/{}/samples_{}_cell.txt\".format(\n", - " \"/\" + root, root, root\n", - " )\n", - " path_paramnames = root_dir + \"{}/{}/getdist_{}_cell.paramnames\".format(\n", - " \"/\" + root, root, root\n", - " )\n", - "\n", - " with open(path_samples, \"r\") as file:\n", - " params = file.readline()[1:].split(\"\\t\")[:-4]\n", - " file.close()\n", - "\n", - " with open(path_paramnames, \"w\") as file:\n", - " for i in range(len(params)):\n", - " if len(params[i].split(\"--\")) > 1:\n", - " file.write(params[i].split(\"--\")[1] + \"\\n\")\n", - " else:\n", - " file.write(params[i].split(\"--\")[0] + \"\\n\")\n", - " file.close()\n", - "\n", - "\n", - "def write_samples_getdist_format(root_dir, root, chain_type=\"configuration\"):\n", - " assert chain_type in [\"configuration\", \"harmonic\"], (\n", - " \"chain_type must be 'configuration' or 'harmonic'\"\n", - " )\n", - "\n", - " if chain_type == \"configuration\":\n", - " path_samples = root_dir + \"{}/{}/samples_{}.txt\".format(\"/\" + root, root, root)\n", - " path_gd_samples = root_dir + \"{}/{}/getdist_{}.txt\".format(\n", - " \"/\" + root, root, root\n", - " )\n", - " path_gd = root_dir + \"{}/{}/getdist_{}\".format(root, root, root)\n", - " else:\n", - " path_samples = root_dir + \"{}/{}/samples_{}_cell.txt\".format(\n", - " \"/\" + root, root, root\n", - " )\n", - " path_gd_samples = root_dir + \"{}/{}/getdist_{}_cell.txt\".format(\n", - " \"/\" + root, root, root\n", - " )\n", - " path_gd = root_dir + \"{}/{}/getdist_{}_cell\".format(root, root, root)\n", - "\n", - " samples = np.loadtxt(\n", - " path_samples,\n", - " )\n", - " if \"nautilus\" in root:\n", - " samples = np.column_stack(\n", - " (np.exp(samples[:, -3]), samples[:, -1] - samples[:, -2], samples[:, 0:-3])\n", - " )\n", - " else:\n", - " samples = np.column_stack((samples[:, -1], samples[:, -2], samples[:, 0:-4]))\n", - " np.savetxt(path_gd_samples, samples)\n", - "\n", - " chain = g.samples_for_root(\n", - " path_gd,\n", - " cache=False,\n", - " settings={\"ignore_rows\": 0.0, \"smooth_scale_2D\": 0.5, \"smooth_scale_1D\": 0.5},\n", - " )\n", - "\n", - " return chain\n", - "\n", - "\n", - "def extract_param_chain(chain, param_names):\n", - " margestats = chain.getMargeStats()\n", - " likestats = chain.getLikeStats()\n", - "\n", - " param_values = {}\n", - " for param_name in param_names:\n", - " if param_name not in chain.getParamNames().list():\n", - " raise ValueError(f\"Parameter {param_name} not found in chain.\")\n", - "\n", - " param_stats = margestats.parWithName(param_name)\n", - " param_values[param_name] = {\n", - " \"mean\": param_stats.mean,\n", - " \"1sigma_minus\": param_stats.mean - param_stats.limits[0].lower,\n", - " \"1sigma_plus\": param_stats.limits[0].upper - param_stats.mean,\n", - " \"2sigma_minus\": param_stats.mean - param_stats.limits[1].lower,\n", - " \"2sigma_plus\": param_stats.limits[1].upper - param_stats.mean,\n", - " }\n", - "\n", - " param_stats = likestats.parWithName(param_name)\n", - " param_names_getdist = chain.getParamNames()\n", - " par = param_names_getdist.parWithName(param_name)\n", - " kde = chain.get1DDensity(par, num_bins=1000)\n", - " kde_map = kde.x[np.argmax(kde.P)]\n", - " param_values[param_name].update(\n", - " {\n", - " \"MAP\": kde_map,\n", - " }\n", - " )\n", - "\n", - " par = chain.getParamNames().parWithName(\"S_8\")\n", - " par_om = chain.getParamNames().parWithName(\"OMEGA_M\")\n", - " kde = chain.get2DDensity(par, par_om, fine_bins_2D=1000)\n", - " s8_kde_map = kde.x[np.unravel_index(np.argmax(kde.P), kde.P.shape)[1]]\n", - " om_kde_map = kde.y[np.unravel_index(np.argmax(kde.P), kde.P.shape)[0]]\n", - " param_values[\"S_8\"].update(\n", - " {\n", - " \"MAP_2D\": s8_kde_map,\n", - " }\n", - " )\n", - " param_values[\"OMEGA_M\"].update(\n", - " {\n", - " \"MAP_2D\": om_kde_map,\n", - " }\n", - " )\n", - "\n", - " return param_values\n", - "\n", - "\n", - "def concatenate_param_stats(name, param_values, verbose=False):\n", - " output = [name]\n", - " for key in param_values.keys():\n", - " param_stat = param_values[key]\n", - " if verbose:\n", - " print(\n", - " f\"{name} - {key}: {param_stat['mean']:.4f} +{param_stat['1sigma_plus']:.4f}/-{param_stat['1sigma_minus']:.4f} (1σ), +{param_stat['2sigma_plus']:.4f}/-{param_stat['2sigma_minus']:.4f} (2σ)\"\n", - " )\n", - "\n", - " param_list = [\n", - " param_stat[\"mean\"],\n", - " param_stat[\"1sigma_minus\"],\n", - " param_stat[\"1sigma_plus\"],\n", - " param_stat[\"2sigma_minus\"],\n", - " param_stat[\"2sigma_plus\"],\n", - " param_stat[\"MAP\"],\n", - " ]\n", - "\n", - " if key == \"S_8\":\n", - " param_list.append(param_stat[\"MAP_2D\"])\n", - "\n", - " if key == \"OMEGA_M\":\n", - " param_list.append(param_stat[\"MAP_2D\"])\n", - "\n", - " output += param_list\n", - "\n", - " return output\n", - "\n", - "\n", - "def merge_param_stats(params_configuration, params_harmonic):\n", - " merged_params = {}\n", - " for key in params_configuration.keys():\n", - " if key in params_harmonic:\n", - " merged_params[key] = {\n", - " \"configuration\": params_configuration[key],\n", - " \"harmonic\": params_harmonic[key],\n", - " }\n", - " return merged_params\n", - "\n", - "\n", - "def concatenate_merge_params(name, merged_params, verbose=False):\n", - " output = [name]\n", - " for key in merged_params.keys():\n", - " param_config = merged_params[key][\"configuration\"]\n", - " param_harm = merged_params[key][\"harmonic\"]\n", - "\n", - " if verbose:\n", - " print(\n", - " f\"{name} - {key} (Configuration): {param_config['mean']:.4f} +{param_config['1sigma_plus']:.4f}/-{param_config['1sigma_minus']:.4f} (1σ), +{param_config['2sigma_plus']:.4f}/-{param_config['2sigma_minus']:.4f} (2σ)\"\n", - " )\n", - " print(\n", - " f\"{name} - {key} (Harmonic): {param_harm['mean']:.4f} +{param_harm['1sigma_plus']:.4f}/-{param_harm['1sigma_minus']:.4f} (1σ), +{param_harm['2sigma_plus']:.4f}/-{param_harm['2sigma_minus']:.4f} (2σ)\"\n", - " )\n", - "\n", - " param_list = [\n", - " param_config[\"mean\"],\n", - " param_config[\"1sigma_minus\"],\n", - " param_config[\"1sigma_plus\"],\n", - " param_config[\"2sigma_minus\"],\n", - " param_config[\"2sigma_plus\"],\n", - " param_config[\"MAP\"],\n", - " param_harm[\"mean\"],\n", - " param_harm[\"1sigma_minus\"],\n", - " param_harm[\"1sigma_plus\"],\n", - " param_harm[\"2sigma_minus\"],\n", - " param_harm[\"2sigma_plus\"],\n", - " param_harm[\"MAP\"],\n", - " ]\n", - "\n", - " output += param_list\n", - "\n", - " return output" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": { - "lines_to_next_cell": 0 - }, - "outputs": [], - "source": [ - "chain_harmonic = []\n", - "chain_config = []\n", - "\n", - "for i, root in enumerate(tqdm(roots)):\n", - " if os.path.isfile(f\"{root_dir}/{root}/{root}/getdist_{root}.txt\"):\n", - " # Load samples and write paramnames for harmonic space\n", - " load_samples_and_write_paramames(root_dir, root, chain_type=\"harmonic\")\n", - " write_samples_getdist_format(root_dir, root, chain_type=\"harmonic\")\n", - " chain_harm = g.samples_for_root(\n", - " root_dir + f\"/{root}/{root}/getdist_{root}_cell\",\n", - " cache=False,\n", - " settings={\n", - " \"ignore_rows\": 0.0,\n", - " \"smooth_scale_2D\": 0.5,\n", - " \"smooth_scale_1D\": 0.5,\n", - " },\n", - " )\n", - " chain_harmonic.append(chain_harm)\n", - "\n", - " # Load samples and write paramnames for harmonic space\n", - " load_samples_and_write_paramames(root_dir, root, chain_type=\"configuration\")\n", - " write_samples_getdist_format(root_dir, root, chain_type=\"configuration\")\n", - " chain_conf = g.samples_for_root(\n", - " root_dir + f\"/{root}/{root}/getdist_{root}\",\n", - " cache=False,\n", - " settings={\n", - " \"ignore_rows\": 0.0,\n", - " \"smooth_scale_2D\": 0.5,\n", - " \"smooth_scale_1D\": 0.5,\n", - " },\n", - " )\n", - " chain_config.append(chain_conf)\n", - "# # %%\n", - "param_names = [\"S_8\", \"OMEGA_M\", \"SIGMA_8\", \"a\"]\n", - "\n", - "output_mocks_harm = np.array(\n", - " [\n", - " \"Name\",\n", - " \"S8_mean\",\n", - " \"S8_1sigma_minus\",\n", - " \"S8_1sigma_plus\",\n", - " \"S8_2sigma_minus\",\n", - " \"S8_2sigma_plus\",\n", - " \"S8_MAP\",\n", - " \"S8_MAP_2D\",\n", - " \"OMEGA_M_mean\",\n", - " \"OMEGA_M_1sigma_minus\",\n", - " \"OMEGA_M_1sigma_plus\",\n", - " \"OMEGA_M_2sigma_minus\",\n", - " \"OMEGA_M_2sigma_plus\",\n", - " \"OMEGA_M_MAP\",\n", - " \"OMEGA_M_MAP_2D\",\n", - " \"SIGMA_8_mean\",\n", - " \"SIGMA_8_1sigma_minus\",\n", - " \"SIGMA_8_1sigma_plus\",\n", - " \"SIGMA_8_2sigma_minus\",\n", - " \"SIGMA_8_2sigma_plus\",\n", - " \"SIGMA_8_MAP\",\n", - " \"a_mean\",\n", - " \"a_1sigma_minus\",\n", - " \"a_1sigma_plus\",\n", - " \"a_2sigma_minus\",\n", - " \"a_2sigma_plus\",\n", - " \"a_MAP\",\n", - " ]\n", - ")\n", - "\n", - "output_mocks_config = np.array(\n", - " [\n", - " \"Name\",\n", - " \"S8_mean\",\n", - " \"S8_1sigma_minus\",\n", - " \"S8_1sigma_plus\",\n", - " \"S8_2sigma_minus\",\n", - " \"S8_2sigma_plus\",\n", - " \"S8_MAP\",\n", - " \"S8_MAP_2D\",\n", - " \"OMEGA_M_mean\",\n", - " \"OMEGA_M_1sigma_minus\",\n", - " \"OMEGA_M_1sigma_plus\",\n", - " \"OMEGA_M_2sigma_minus\",\n", - " \"OMEGA_M_2sigma_plus\",\n", - " \"OMEGA_M_MAP\",\n", - " \"OMEGA_M_MAP_2D\",\n", - " \"SIGMA_8_mean\",\n", - " \"SIGMA_8_1sigma_minus\",\n", - " \"SIGMA_8_1sigma_plus\",\n", - " \"SIGMA_8_2sigma_minus\",\n", - " \"SIGMA_8_2sigma_plus\",\n", - " \"SIGMA_8_MAP\",\n", - " \"a_mean\",\n", - " \"a_1sigma_minus\",\n", - " \"a_1sigma_plus\",\n", - " \"a_2sigma_minus\",\n", - " \"a_2sigma_plus\",\n", - " \"a_MAP\",\n", - " ]\n", - ")\n", - "\n", - "for i, root in enumerate(tqdm(roots[:-1])):\n", - " param_values_harm = extract_param_chain(chain_harmonic[i], param_names)\n", - "\n", - " param_harm = concatenate_param_stats(root, param_values_harm, verbose=False)\n", - "\n", - " output_mocks_harm = np.vstack((output_mocks_harm, param_harm))\n", - "\n", - " param_values_config = extract_param_chain(chain_config[i], param_names)\n", - "\n", - " param_config = concatenate_param_stats(root, param_values_config, verbose=False)\n", - "\n", - " output_mocks_config = np.vstack((output_mocks_config, param_config))\n", - "\n", - "np.savetxt(\n", - " f\"summary_parameter_constraints_harmonic_space_{chain_version}.txt\",\n", - " output_mocks_harm,\n", - " fmt=\"%s\",\n", - " delimiter=\";\",\n", - ")\n", - "np.savetxt(\n", - " f\"summary_parameter_constraints_configuration_space_{chain_version}.txt\",\n", - " output_mocks_config,\n", - " fmt=\"%s\",\n", - " delimiter=\";\",\n", - ")\n", - "print(\n", - " f\"Saved summary of parameter constraints for harmonic space in summary_parameter_constraints_harmonic_space_{chain_version}.txt\"\n", - ")\n", - "print(\n", - " f\"Saved summary of parameter constraints for configuration space in summary_parameter_constraints_configuration_space_{chain_version}.txt\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": { - "lines_to_next_cell": 0 - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "\n", - "output_df_harm = pd.read_csv(\n", - " f\"summary_parameter_constraints_harmonic_space_{chain_version}.txt\",\n", - " delimiter=\";\",\n", - " skiprows=1,\n", - " names=output_mocks_harm[0],\n", - ")\n", - "\n", - "output_df_config = pd.read_csv(\n", - " f\"summary_parameter_constraints_configuration_space_{chain_version}.txt\",\n", - " delimiter=\";\",\n", - " skiprows=1,\n", - " names=output_mocks_config[0],\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "# Define the true value of the parameters\n", - "from astropy.cosmology import Planck18 as planck\n", - "\n", - "Omega_m_fid = planck.Om0\n", - "sigma_8_fid = 0.8102\n", - "s8_fid = sigma_8_fid * (Omega_m_fid / 0.3) ** 0.5\n", - "h = planck.h\n", - "Omega_b_fig = planck.Ob0\n", - "n_s_fid = 0.9665\n", - "print(\n", - " f\"Fiducial values: Omega_m = {Omega_m_fid}, sigma_8 = {sigma_8_fid}, S_8 = {s8_fid}\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "sns.histplot(\n", - " output_df_harm[\"S8_mean\"] - output_df_config[\"S8_mean\"],\n", - " kde=True,\n", - " bins=30,\n", - " label=\"Mean\",\n", - ")\n", - "# sns.histplot(\n", - "# output_df_harm[\"S8_MAP\"]-output_df_config[\"S8_MAP\"],\n", - "# kde=True,\n", - "# bins=20,\n", - "# label=\"MAP\",\n", - "# )\n", - "sns.histplot(\n", - " output_df_harm[\"S8_MAP_2D\"] - output_df_config[\"S8_MAP_2D\"],\n", - " kde=True,\n", - " bins=30,\n", - " label=\"2D Mode\",\n", - " alpha=0.5,\n", - ")\n", - "plt.axvline(0, color=\"black\", linestyle=\"--\")\n", - "plt.legend(fontsize=12)\n", - "\n", - "plt.xlabel(r\"$\\Delta S_8$\")\n", - "plt.savefig(\n", - " \"/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/notebooks/Plots/S8_comparison_harmonic_vs_configuration.pdf\",\n", - " bbox_inches=\"tight\",\n", - ")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "output_df_config[\"S8_MAP_2D\"].shape\n", - "output_df_harm[\"S8_MAP_2D\"].shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": { - "lines_to_next_cell": 2 - }, - "outputs": [], - "source": [ - "# Create JointGrid\n", - "g = sns.JointGrid(\n", - " x=output_df_config[\"OMEGA_M_MAP_2D\"],\n", - " y=output_df_config[\"S8_MAP_2D\"],\n", - " height=7,\n", - " ratio=5,\n", - " space=0,\n", - ")\n", - "\n", - "# Main 2D histogram\n", - "sns.histplot(\n", - " x=output_df_config[\"OMEGA_M_MAP_2D\"],\n", - " y=output_df_config[\"S8_MAP_2D\"],\n", - " bins=25,\n", - " cmap=\"Greens\",\n", - " cbar=False,\n", - " ax=g.ax_joint,\n", - ")\n", - "\n", - "# Marginal histograms\n", - "sns.histplot(\n", - " x=output_df_config[\"OMEGA_M_MAP_2D\"], bins=25, color=\"#2ca25f\", ax=g.ax_marg_x\n", - ")\n", - "sns.histplot(y=output_df_config[\"S8_MAP_2D\"], bins=25, color=\"#2ca25f\", ax=g.ax_marg_y)\n", - "\n", - "# Add dashed reference lines\n", - "g.ax_joint.axvline(Omega_m_fid, color=\"k\", linestyle=\"--\")\n", - "g.ax_joint.axhline(s8_fid, color=\"k\", linestyle=\"--\")\n", - "\n", - "# Labels\n", - "g.set_axis_labels(\n", - " r\"$\\Omega_m$ estimated from mocks (Configuration space)\",\n", - " r\"$S_8$ estimated from mocks (Configuration space)\",\n", - ")\n", - "\n", - "# Optional styling tweaks\n", - "g.ax_joint.tick_params(labelsize=12)\n", - "plt.savefig(\n", - " \"/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/notebooks/Plots/S8_vs_OmegaM_configuration_space_mocks.pdf\",\n", - " bbox_inches=\"tight\",\n", - ")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "jupytext": { - "cell_metadata_filter": "-all", - "main_language": "python", - "notebook_metadata_filter": "-all" - }, - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/masking.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/masking.ipynb deleted file mode 100644 index b0dd4bbc..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/masking.ipynb +++ /dev/null @@ -1,132 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Covmat mask analysis\n", - "\n", - "This notebook creates the plots to look at the ratio of the covaraiance matrices when applying the mask or not" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "import healpy as hp\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "\n", - "plt.rcParams[\"axes.labelsize\"] = 18\n", - "plt.rcParams[\"xtick.labelsize\"] = 18\n", - "plt.rcParams[\"ytick.labelsize\"] = 18\n", - "\n", - "plt.rcParams[\"text.usetex\"] = True\n", - "sns.set_palette(\"husl\")\n", - "\n", - "cat_dir = \"/n17data/UNIONS/WL/v1.4.x/\"\n", - "catalog_ver = \"v1.4.6.3\"\n", - "blind = \"B\"\n", - "\n", - "nside = 8192\n", - "npix = hp.nside2npix(nside)\n", - "\n", - "data_dir = \"/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/data/\"\n", - "curr_dir = os.getcwd()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# PLOT 2D MAP OF COVMAT masked vs unmasked RATIOS\n", - "nbins = 20\n", - "ndata = nbins * 2\n", - "full_ratio = np.zeros((ndata, ndata))\n", - "\n", - "cov = np.loadtxt(data_dir + f\"/covs/cov_SP_{catalog_ver}_{blind}.txt\")\n", - "cov_masked = np.loadtxt(data_dir + f\"/covs/cov_masked_SP_{catalog_ver}_{blind}.txt\")\n", - "\n", - "for i in range(ndata):\n", - " for j in range(ndata):\n", - " full_ratio[i][j] = cov_masked[i][j] / cov[i][j]\n", - "\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(1, 1, 1)\n", - "extent = (0, ndata, ndata, 0)\n", - "\n", - "vmin, vmax = np.percentile(full_ratio, [1, 99])\n", - "\n", - "im3 = ax.imshow(full_ratio, cmap=\"RdBu_r\", vmin=vmin, vmax=vmax, extent=extent)\n", - "\n", - "cbar = fig.colorbar(im3, ax=ax, fraction=0.046, pad=0.04)\n", - "\n", - "ax.text(int(ndata / 4), ndata + 5, r\"$\\xi_+$\", fontsize=15)\n", - "ax.text(3 * int(ndata / 4), ndata + 5, r\"$\\xi_-$\", fontsize=15)\n", - "ax.text(-8, int(ndata / 4), r\"$\\xi_+$\", fontsize=15, rotation=90)\n", - "ax.text(-8, 3 * int(ndata / 4), r\"$\\xi_-$\", fontsize=15, rotation=90)\n", - "ax.set_xticks([0, 10, 20, 30, 40])\n", - "ax.set_yticks([0, 10, 20, 30, 40])\n", - "ax.set_yticklabels([\"1'\", \"125'\", \"250'\", \"125'\", \"250'\"])\n", - "ax.set_xticklabels([\"1'\", \"125'\", \"250'\", \"125'\", \"250'\"])\n", - "plt.axvline(x=int(ndata / 2), color=\"white\", linewidth=1.0)\n", - "plt.axhline(y=int(ndata / 2), color=\"white\", linewidth=1.0)\n", - "\n", - "plt.savefig(\n", - " f\"{curr_dir}/../Plots/covmat_masked_unmasked_ratio_{catalog_ver}_{blind}.pdf\",\n", - " bbox_inches=\"tight\",\n", - ")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "theta = np.linspace(1, 250, 20)\n", - "plt.axhline(y=1, color=\"k\", ls=\"--\")\n", - "plt.plot(theta, np.diag(cov_masked)[:20] / np.diag(cov)[:20], label=r\"$\\xi_+$\")\n", - "plt.plot(theta, np.diag(cov_masked)[20:] / np.diag(cov)[20:], label=r\"$\\xi_-$\")\n", - "\n", - "plt.xlabel(r\"$\\theta$ (arcmin)\")\n", - "plt.ylabel(\"Cov masked / Cov unmasked\")\n", - "plt.legend(fontsize=20)\n", - "plt.savefig(\n", - " f\"{curr_dir}/../Plots/covmat_masked_unmasked_ratio_diag.pdf\", bbox_inches=\"tight\"\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/nonlin_k_analysis.ipynb b/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/nonlin_k_analysis.ipynb deleted file mode 100644 index 4ab9c3c5..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_configuration_plots/nonlin_k_analysis.ipynb +++ /dev/null @@ -1,174 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Nonlinear $k$ contributions\n", - "\n", - "This notebook plots the 2D heatmap of ratio of scale contributions to the $\\xi_\\pm$ 2PCF given angular scale $\\theta$ and wavenumber $k$." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "import matplotlib.pylab as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "\n", - "plt.rcParams[\"text.usetex\"] = True\n", - "\n", - "plt.rcParams.update(\n", - " {\n", - " \"font.size\": 20,\n", - " \"axes.titlesize\": 21,\n", - " \"axes.labelsize\": 20,\n", - " \"xtick.labelsize\": 20,\n", - " \"ytick.labelsize\": 20,\n", - " \"legend.fontsize\": 20,\n", - " \"figure.titlesize\": 21,\n", - " }\n", - ")\n", - "sns.set_palette(\"husl\")\n", - "\n", - "blind = \"B\"\n", - "ver = \"v1.4.6.3\"\n", - "\n", - "%matplotlib inline\n", - "\n", - "data_dir = \"/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/data/\"\n", - "curr_dir = os.getcwd()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Plotting from script" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Read the 2D array from the text file\n", - "\n", - "file_headers = [\"xip_%s_%s\" % (ver, blind), \"xim_%s_%s\" % (ver, blind)]\n", - "\n", - "for f in file_headers:\n", - " xis = np.loadtxt(data_dir + f\"theta_k_{f}.txt\")\n", - " xis_reshaped = xis.reshape(-1, 201)\n", - " sorted_xis = xis_reshaped[np.argsort(xis_reshaped[:, 0])]\n", - "\n", - " np.savetxt(data_dir + f\"theta_k_{f}_sorted.txt\", sorted_xis)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "fig, axs = plt.subplots(2, 1, figsize=(8, 10))\n", - "\n", - "# --- k grid ---\n", - "h = 0.6766\n", - "k_plot = np.logspace(-4, 2, 200)\n", - "\n", - "file_header = \"%s_%s\" % (ver, blind)\n", - "\n", - "xi_thetas = np.loadtxt(data_dir + f\"theta_k_xip_{file_header}_sorted.txt\")\n", - "thetas = xi_thetas[:, 0]\n", - "xis = xi_thetas[:, 1:]\n", - "\n", - "# normalise\n", - "xi_plot = xis / np.max(xis, axis=1, keepdims=True)\n", - "\n", - "T, K = np.meshgrid(thetas, k_plot)\n", - "\n", - "axs[0].contour(T, K, xi_plot.T, levels=[0.9], colors=\"red\", linewidths=1.7)\n", - "pcm = axs[0].pcolormesh(T, K, xi_plot.T, shading=\"auto\", cmap=\"viridis\")\n", - "pcm.set_rasterized(True)\n", - "\n", - "axs[0].axvline(5, color=\"k\", ls=\"dashed\", lw=1.2)\n", - "axs[0].axvline(12, color=\"white\", ls=\"dashed\", lw=1.6)\n", - "axs[0].axhline(1, color=\"k\", ls=\"dashed\", lw=1.2) # converted to h/Mpc space if needed\n", - "axs[0].axhline(0.425, color=\"white\", ls=\"dashed\", lw=1.6)\n", - "\n", - "axs[0].set_yscale(\"log\")\n", - "axs[0].set_xlabel(r\"$\\theta\\ \\mathrm{(arcmin)}$\")\n", - "axs[0].set_ylabel(r\"$k\\ (h$ Mpc$^{-1})$\")\n", - "\n", - "axs[0].set_title(r\"$\\xi_+$\")\n", - "\n", - "xi_thetas = np.loadtxt(data_dir + f\"theta_k_xim_{file_header}_sorted.txt\")\n", - "thetas = xi_thetas[:, 0]\n", - "xis = xi_thetas[:, 1:]\n", - "\n", - "xi_plot = xis / np.max(xis, axis=1, keepdims=True)\n", - "\n", - "T, K = np.meshgrid(thetas, k_plot)\n", - "\n", - "axs[1].contour(T, K, xi_plot.T, levels=[0.9], colors=\"red\", linewidths=1.7)\n", - "pcm = axs[1].pcolormesh(T, K, xi_plot.T, shading=\"nearest\", cmap=\"viridis\")\n", - "pcm.set_rasterized(True)\n", - "\n", - "axs[1].axvline(12, color=\"white\", ls=\"dashed\", lw=1.6)\n", - "axs[1].axhline(2.85, color=\"white\", ls=\"dashed\", lw=1.6)\n", - "\n", - "\n", - "axs[1].set_yscale(\"log\")\n", - "axs[1].set_xlabel(r\"$\\theta\\ \\mathrm{(arcmin)}$\")\n", - "axs[1].set_ylabel(r\"$k\\ (h$ Mpc$^{-1})$\")\n", - "axs[1].set_title(r\"$\\xi_-$\")\n", - "\n", - "\n", - "fig.tight_layout()\n", - "\n", - "cbar_ax = fig.add_axes([0.99, 0.15, 0.02, 0.7])\n", - "cbar = fig.colorbar(pcm, cax=cbar_ax)\n", - "\n", - "fig.savefig(\n", - " curr_dir + f\"/../Plots/theta_k_xip_xim_{ver}_{blind}.pdf\", bbox_inches=\"tight\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_unblinding/utils.py b/cosmo_inference/notebooks/2D_cosmic_shear_unblinding/utils.py deleted file mode 100644 index 8c2fb9e5..00000000 --- a/cosmo_inference/notebooks/2D_cosmic_shear_unblinding/utils.py +++ /dev/null @@ -1,442 +0,0 @@ -""" -Useful scripts to perform the plots for the unblinding party. -""" - -import configparser -import os -import sys - -# Append any useful folder in the path -sys.path.append("/home/guerrini/sp_validation/cosmo_inference/scripts/") - -import matplotlib.pyplot as plt -import matplotlib.scale as mscale -import numpy as np -from astropy.io import fits - -from sp_validation.rho_tau import SquareRootScale - -mscale.register_scale(SquareRootScale) - - -def read_config(path_ini_files, root, thisfile=None): - config = configparser.ConfigParser() - config.optionxform = str - if thisfile is not None: - read_path = thisfile - else: - read_path = os.path.join(path_ini_files, f"{root}.ini") - config.read(read_path) - return config - - -def update_properties_w_roots( - properties, root, path_ini_files, path_to_this_ini=None, with_configuration=False -): - config = read_config(path_ini_files, root, thisfile=path_to_this_ini) - - try: - lower_bound_cell_ee, upper_bound_cell_ee = map( - float, config["2pt_like"]["angle_range_CELL_EE_1_1"].split() - ) - properties[root].update( - { - "lower_bound_cell_ee": lower_bound_cell_ee, - "upper_bound_cell_ee": upper_bound_cell_ee, - } - ) - except KeyError: - properties[root] = {"lower_bound_cell_ee": 0.0, "upper_bound_cell_ee": 2048} - - if with_configuration: - # Also save the scale cuts in theta for xi - add_xi_sys = config["2pt_like"]["add_xi_sys"] - add_xi_sys = add_xi_sys == "T" - lower_bound_xi_plus, upper_bound_xi_plus = map( - float, config["2pt_like"]["angle_range_XI_PLUS_1_1"].split() - ) - lower_bound_xi_minus, upper_bound_xi_minus = map( - float, config["2pt_like"]["angle_range_XI_MINUS_1_1"].split() - ) - - properties[root].update( - { - "add_xi_sys": add_xi_sys, - "lower_bound_xi_plus": lower_bound_xi_plus, - "upper_bound_xi_plus": upper_bound_xi_plus, - "lower_bound_xi_minus": lower_bound_xi_minus, - "upper_bound_xi_minus": upper_bound_xi_minus, - } - ) - return properties - - -def plot_best_fit( - data_points, - root_to_plot, - output_folder, - line_args, - savefile, - ell_min=10.0, - ell_max=2048.0, - multiply_ell=True, - loc_legend="best", - bbox_to_anchor=None, - label_data="Fiducial data", - labels=None, - properties=None, - paths_to_bestfit=None, -): - data = fits.open( - f"/home/guerrini/sp_validation/cosmo_inference/data/{data_points}/cosmosis_{data_points}.fits" - ) - cell_ee = data["CELL_EE"].data - cov_mat = data["COVMAT"].data - - if labels is None: - labels = root_to_plot - - fig, ax = plt.subplots(1, 1, figsize=(8, 5)) - - ell, cell = cell_ee["ANG"], cell_ee["VALUE"] - ax.errorbar( - ell, - ell * cell, - yerr=ell * np.sqrt(np.diag(cov_mat)), - fmt="o", - label=label_data, - color="black", - capsize=2, - ) - - for idx, (label, root) in enumerate(zip(labels, root_to_plot)): - # Read the results - if paths_to_bestfit is None: - ell = np.loadtxt( - output_folder - + "{}/best_fit/shear_cl/ell.txt".format( - root, - ) - ) - shear_cl = np.loadtxt( - output_folder - + "{}/best_fit/shear_cl/bin_1_1.txt".format( - root, - ) - ) - else: - ell = np.loadtxt(paths_to_bestfit[idx] + "best_fit/shear_cl/ell.txt") - shear_cl = np.loadtxt( - paths_to_bestfit[idx] + "best_fit/shear_cl/bin_1_1.txt" - ) - - mask = (ell > ell_min) & (ell < ell_max) - - ax.plot( - ell[mask], - ell[mask] * shear_cl[mask] if multiply_ell else shear_cl[mask], - label=label, - **line_args[idx], - ) - - # Plot the scale cuts for different k_max - ax.axvline(x=1800, color="black", linestyle="--", alpha=0.5) - ax.axvline(x=2048, color="black", linestyle="--", alpha=1.0) - ax.axvline(x=500, color="black", linestyle="--", alpha=0.3) - - ymin = ax.get_ylim()[0] - ymax = ax.get_ylim()[1] - # Shadowing cut scaled - ax.fill_betweenx( - y=[ymin, ymax], - x1=0, - x2=300, - color="gray", - alpha=0.2, - label=r"$B$-mode informed scale cut", - ) - ax.fill_betweenx(y=[ymin, ymax], x1=1600, x2=2048, color="gray", alpha=0.2) - - ax.set_ylim(ymin, ymax) - - # Add labels directly under the tick - ax.text( - 1740, - 0.90, - r"$k_\mathrm{max} = 3 h$ Mpc$^{-1}$", - transform=ax.get_xaxis_transform(), - ha="center", - va="top", - fontsize=14, - rotation=90, - ) - - ax.text( - 1978, - 0.90, - r"$k_\mathrm{max} = 5 h$ Mpc$^{-1}$", - transform=ax.get_xaxis_transform(), - ha="center", - va="top", - fontsize=14, - rotation=90, - ) - - ax.text( - 470, - 0.90, - r"$k_\mathrm{max} = 1 h$ Mpc$^{-1}$", - transform=ax.get_xaxis_transform(), - ha="center", - va="top", - fontsize=14, - rotation=90, - ) - - ell, cell = cell_ee["ANG"], cell_ee["VALUE"] - ax.set_ylabel(r"$\ell C_\ell \times 10^{-7}$", fontsize=20) - ax.set_xlabel(r"Multipole $\ell$", fontsize=20) - ax.set_xlim(ell.min() - 10, ell.max() + 100) - ax.set_xscale("squareroot") - ax.set_xticks(np.array([100, 400, 900, 1600])) - ax.minorticks_on() - ax.tick_params(axis="x", which="minor", length=2, width=0.8) - minor_ticks = [i * 10 for i in range(1, 10)] + [i * 100 for i in range(1, 21)] - ax.xaxis.set_ticks(minor_ticks, minor=True) - ax.tick_params(axis="both", which="major", labelsize=14) - ax.tick_params(axis="both", which="minor", labelsize=10) - ax.yaxis.get_offset_text().set_visible(False) - - plt.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor, fontsize=11) - - if savefile is not None: - plt.savefig(savefile, bbox_inches="tight") - - plt.show() - - -def plot_best_fit_config( - data, - root_to_plot, - output_folder, - line_args, - savefile, - theta_min=1.0, - theta_max=250.0, - multiply_theta=True, - loc_legend="best", - bbox_to_anchor_xip=None, - bbox_to_anchor_xim=None, - label_data="Fiducial data", - labels=None, - properties=None, - paths_to_bestfit=None, -): - - data = fits.open(data) - - xi_p_data = data["XI_PLUS"].data - xi_m_data = data["XI_MINUS"].data - cov_mat = data["COVMAT"].data - - # Plot hyperparameter - loc_legend = "lower center" - - fig, [ax, ax2] = plt.subplots(2, 1, figsize=(8, 9)) - - theta, xi_p, xi_m = xi_p_data["ANG"], xi_p_data["VALUE"], xi_m_data["VALUE"] - ax.errorbar( - theta, - theta * xi_p, - yerr=theta * np.sqrt(np.diag(cov_mat[: len(theta), : len(theta)])), - fmt="o", - label=r"UNIONS $\xi_+$ data", - color="black", - capsize=2, - ) - ax2.errorbar( - theta, - theta * xi_m, - yerr=theta - * np.sqrt( - np.diag(cov_mat[len(theta) : 2 * len(theta), len(theta) : 2 * len(theta)]) - ), - fmt="o", - label=r"UNIONS $\xi_-$ data", - color="black", - capsize=2, - ) - - for idx, (label, root) in enumerate(zip(labels, root_to_plot)): - # Read the results - if paths_to_bestfit is None: - theta = ( - ( - np.loadtxt( - output_folder - + "{}/best_fit/shear_xi_plus/theta.txt".format(root) - ) - ) - * 180 - / np.pi - * 60 - ) - xi_plus = np.loadtxt( - output_folder + "{}/best_fit/shear_xi_plus/bin_1_1.txt".format(root) - ) - xi_minus = np.loadtxt( - output_folder + "{}/best_fit/shear_xi_minus/bin_1_1.txt".format(root) - ) - if r"$C_\ell$" not in label: - xi_sys_plus = np.loadtxt( - output_folder + "{}/best_fit/xi_sys/shear_xi_plus.txt".format(root) - ) - xi_sys_minus = np.loadtxt( - output_folder + "{}/best_fit/xi_sys/shear_xi_minus.txt".format(root) - ) - theta_xi_sys = ( - np.loadtxt( - output_folder + "{}/best_fit/xi_sys/theta.txt".format(root) - ) - * 180 - / np.pi - * 60 - ) - xi_plus += np.interp(theta, theta_xi_sys, xi_sys_plus) - xi_minus += np.interp(theta, theta_xi_sys, xi_sys_minus) - else: - theta = ( - (np.loadtxt(paths_to_bestfit[idx] + "best_fit/shear_xi_plus/theta.txt")) - * 180 - / np.pi - * 60 - ) - xi_plus = np.loadtxt( - paths_to_bestfit[idx] + "best_fit/shear_xi_plus/bin_1_1.txt" - ) - xi_minus = np.loadtxt( - paths_to_bestfit[idx] + "best_fit/shear_xi_minus/bin_1_1.txt" - ) - if r"$C_\ell$" not in label: - xi_sys_plus = np.loadtxt( - output_folder + "{}/best_fit/xi_sys/shear_xi_plus.txt".format(root) - ) - xi_sys_minus = np.loadtxt( - output_folder + "{}/best_fit/xi_sys/shear_xi_minus.txt".format(root) - ) - theta_xi_sys = ( - np.loadtxt( - output_folder + "{}/best_fit/xi_sys/theta.txt".format(root) - ) - * 180 - / np.pi - * 60 - ) - xi_plus += np.interp(theta, theta_xi_sys, xi_sys_plus) - xi_minus += np.interp(theta, theta_xi_sys, xi_sys_minus) - - mask = (theta > theta_min) & (theta < theta_max) - theta = theta[mask] - ax.plot( - theta, - theta * xi_plus[mask] if multiply_theta else xi_plus[mask], - label=label, - **line_args[idx], - ) - ax2.plot( - theta, - theta * xi_minus[mask] if multiply_theta else xi_minus[mask], - label=label, - **line_args[idx], - ) - - # XI PLUS PLOT SETTINGS - - # Plot the scale cuts for different k_max - ax.axvline(x=3.2, color="black", linestyle="--", alpha=0.7) - - ymin = ax.get_ylim()[0] - ymax = ax.get_ylim()[1] - # Shadowing cut scaled - ax.fill_betweenx( - y=[ymin, ymax], - x1=0, - x2=12, - color="gray", - alpha=0.2, - label=r"$B$-mode informed scale cut", - ) - ax.fill_betweenx(y=[ymin, ymax], x1=83, x2=250, color="gray", alpha=0.2) - - ax.set_ylim(ymin, ymax) - - # Add labels directly under the tick - ax.text( - 2.9, - 1.23e-4, - r"$k_\mathrm{max} = 1 h$ Mpc$^{-1}$", - ha="center", - va="top", - fontsize=14, - rotation=90, - ) - - # ax.set_ylabel('$\theta \xi_+$', fontsize=16) - # ax.set_xlabel('$\theta$', fontsize=16) - ax.set_xlim([theta.min() - 0.1, theta.max() + 20]) - ax.set_xscale("log") - ax.set_xticks(np.array([1, 10, 100])) - ax.tick_params(axis="x", which="minor", length=2, width=0.8) - ax.tick_params(axis="both", which="major", labelsize=14) - ax.tick_params(axis="both", which="minor", labelsize=10) - ax.yaxis.get_offset_text().set_fontsize(14) - ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) - ax.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xip, fontsize=12) - - # XI_MINUS PLOT SETTINGS - - # Plot the scale cuts for different k_max - ax2.axvline(x=24, color="black", linestyle="--", alpha=0.7) - - ymin = ax2.get_ylim()[0] - ymax = ax2.get_ylim()[1] - # Shadowing cut scaled - ax2.fill_betweenx( - y=[ymin, ymax], - x1=0, - x2=12, - color="gray", - alpha=0.2, - label=r"$B$-mode informed scale cut", - ) - ax2.fill_betweenx(y=[ymin, ymax], x1=83, x2=250, color="gray", alpha=0.2) - - ax2.set_ylim(ymin, ymax) - - # Add labels directly under the tick - ax2.text( - 21.8, - 1.15e-4, - r"$k_\mathrm{max} = 1 h$ Mpc$^{-1}$", - ha="center", - va="top", - fontsize=14, - rotation=90, - ) - - ax2.set_ylabel(r"$\theta \xi_-$", fontsize=16) - ax2.set_xlabel(r"$\theta$", fontsize=16) - ax2.set_xlim([theta.min() - 0.1, theta.max() + 20]) - ax2.set_xscale("log") - ax2.set_xticks(np.array([1, 10, 100])) - ax2.tick_params(axis="x", which="minor", length=2, width=0.8) - ax2.tick_params(axis="both", which="major", labelsize=14) - ax2.tick_params(axis="both", which="minor", labelsize=10) - ax2.yaxis.get_offset_text().set_fontsize(14) - ax2.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) - ax2.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xim, fontsize=12) - - if savefile is not None: - plt.savefig(savefile, bbox_inches="tight") - - plt.show() diff --git a/cosmo_inference/notebooks/cfis_analysis.ipynb b/cosmo_inference/notebooks/cfis_analysis.ipynb deleted file mode 100644 index ee93f4ec..00000000 --- a/cosmo_inference/notebooks/cfis_analysis.ipynb +++ /dev/null @@ -1,1065 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "id": "0", - "metadata": {}, - "source": [ - "# Analysis of a CFIS shear catalogue\n", - "First steps. Analysing both ShapePipe and Lensfit catalogues, for all blinds A,B and C" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "import ipywidgets as widgets\n", - "import matplotlib.pylab as plt\n", - "import numpy as np\n", - "import pandas as pd\n", - "import pyccl as ccl\n", - "import treecorr\n", - "from astropy.io import fits\n", - "from ipywidgets import interact\n", - "\n", - "%matplotlib inline\n", - "plt.rcParams.update({\"font.size\": 20, \"figure.figsize\": [12, 10]})\n", - "plt.rc(\"mathtext\", fontset=\"stix\")\n", - "plt.rc(\"font\", family=\"sans-serif\")\n", - "\n", - "# SPECIFY DIRECTORIES AND CATALOGUE PATHS\n", - "work_dir = \"/home/mkilbing/astro/data/UNIONS/v1.x/ShapePipe\"\n", - "\n", - "cat_dict = {\n", - " 1: {\n", - " \"dir\": work_dir + \"/Lensfit/lensfit_goldshape_2022v1.fits\",\n", - " \"label\": \"LF_full\",\n", - " \"e1_bias\": 0,\n", - " \"e2_bias\": 0,\n", - " \"ls\": \"solid\",\n", - " \"colour\": \"g\",\n", - " },\n", - " 2: {\n", - " \"dir\": work_dir + \"/ShapePipe/unions_shapepipe_2022_v1.0.fits\",\n", - " \"label\": \"SP_full\",\n", - " \"e1_bias\": 0,\n", - " \"e2_bias\": 0,\n", - " \"ls\": \"solid\",\n", - " \"colour\": \"b\",\n", - " },\n", - " 3: {\n", - " \"dir\": work_dir + \"/matched_LF_SP/masked_matched_lensfit_goldshape_2022v1.fits\",\n", - " \"label\": \"LF_matched_SP\",\n", - " \"e1_bias\": 3.939e-4,\n", - " \"e2_bias\": 6.482e-5,\n", - " \"ls\": \"dotted\",\n", - " \"colour\": \"g\",\n", - " },\n", - " 4: {\n", - " \"dir\": work_dir\n", - " + \"/matched_LF_SP/masked_matched_unions_shapepipe_extended_2022_v1.0.fits\",\n", - " \"label\": \"SP_matched_LF\",\n", - " \"e1_bias\": -5.6726e-5,\n", - " \"e2_bias\": 8.218e-4,\n", - " \"ls\": \"dotted\",\n", - " \"colour\": \"b\",\n", - " },\n", - " 5: {\n", - " \"dir\": work_dir + \"/matched_LF_SP/matched_footprint_shapepipe.fits\",\n", - " \"label\": \"SP Match LF Footprint\",\n", - " \"e1_bias\": 0,\n", - " \"e2_bias\": 0,\n", - " \"ls\": \"dashed\",\n", - " \"colour\": \"b\",\n", - " },\n", - " 6: {\n", - " \"dir\": work_dir + \"/cfis-shapepipe.parquet\",\n", - " \"label\": \"SP Match MegaPipe\",\n", - " \"e1_bias\": 0,\n", - " \"e2_bias\": 0,\n", - " \"ls\": \"dashdot\",\n", - " \"colour\": \"b\",\n", - " },\n", - " 7: {\n", - " \"dir\": work_dir + \"/ShapePipe/shapepipe_1500_goldshape_v1.fits\",\n", - " \"label\": \"SP_1500\",\n", - " \"e1_bias\": 7.156105098141909e-06,\n", - " \"e2_bias\": -6.00816359759969e-06,\n", - " \"ls\": \"dotted\",\n", - " \"colour\": \"b\",\n", - " },\n", - " 8: {\n", - " \"dir\": work_dir + \"/ShapePipe/unions_shapepipe_2022_v1.0.4.fits\",\n", - " \"label\": \"SP_cut_Fabian\",\n", - " \"e1_bias\": 0.0,\n", - " \"e2_bias\": 0.0,\n", - " \"ls\": \"dashdot\",\n", - " \"colour\": \"pink\",\n", - " },\n", - " 9: {\n", - " \"dir\": work_dir + \"/ShapePipe/unions_shapepipe_psf_2022_v1.0.2.fits\",\n", - " \"label\": \"SP_PSF\",\n", - " \"e1_bias\": 0.0,\n", - " \"e2_bias\": 0.0,\n", - " \"ls\": \"dashdot\",\n", - " \"colour\": \"b\",\n", - " },\n", - " 10: {\n", - " \"dir\": work_dir + \"/unions_shapepipe_2022_v1.3.fits\",\n", - " \"label\": \"SP_v1.3\",\n", - " \"e1_bias\": 0.0,\n", - " \"e2_bias\": 0.0,\n", - " \"ls\": \"dashdot\",\n", - " \"colour\": \"r\",\n", - " },\n", - " 11: {\n", - " \"dir\": work_dir + \"/ShapePipe/unions_shapepipe_star_2022_v1.3.fits\",\n", - " \"label\": \"SP_v1.3\",\n", - " \"e1_bias\": 0.0,\n", - " \"e2_bias\": 0.0,\n", - " \"ls\": \"dashdot\",\n", - " \"colour\": \"b\",\n", - " },\n", - " 12: {\n", - " \"dir\": work_dir + \"/unions_shapepipe_2024_v1.4.1.fits\",\n", - " \"label\": \"SP_v1.4.1\",\n", - " \"e1_bias\": 0.0,\n", - " \"e2_bias\": 0.0,\n", - " \"ls\": \"dashdot\",\n", - " \"colour\": \"b\",\n", - " },\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "# CATALOGUE OPTIONS:\n", - "# 1: LensFit Full\n", - "# 2: ShapePipe Full\n", - "# 3: LF Match SP\n", - "# 4: SP Match LF\n", - "# 5: SP Matched in LF footprint\n", - "# 6: SP Match MegaPipe\n", - "# 7: SP 1500deg2 (Axel's)\n", - "# 8: SP cut on large gals\n", - "# 12: SP psfex v1.4.1\n", - "\n", - "cat_options = [10, 12]\n", - "\n", - "dfs = []\n", - "\n", - "for cat_option in cat_options:\n", - " if cat_option == 6:\n", - " df = pd.read_parquet(cat_dict[cat_option][\"dir\"], engine=\"pyarrow\")\n", - " df = df.replace([np.inf, -np.inf], np.nan).dropna(axis=0)\n", - " else:\n", - " with fits.open(cat_dict[cat_option][\"dir\"]) as data:\n", - " df = pd.DataFrame(data[1].data)\n", - " if cat_option == 7:\n", - " df = df.rename(columns={\"g1\": \"e1\", \"g2\": \"e2\"})\n", - " if cat_option == 8 or cat_option == 10:\n", - " df = df.rename(columns={\"RA\": \"ra\", \"Dec\": \"dec\"})\n", - " if cat_option == 12:\n", - " df = df.rename(\n", - " columns={\"RA\": \"ra\", \"Dec\": \"dec\", \"e1\": \"e1_prev\", \"e2\": \"e2_prev\"}\n", - " )\n", - " df = df.rename(columns={\"e1_noleakage\": \"e1\", \"e2_noleakage\": \"e2\"})\n", - " dfs.append(df)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "3", - "metadata": {}, - "source": [ - "## Catalogue Analysis" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "for cat in cat_options:\n", - " plt.plot(df[\"ra\"], df[\"dec\"], \".\", label=cat_dict[cat][\"label\"])\n", - "plt.xlabel(\"RA [deg]\")\n", - "plt.ylabel(\"DEC [deg]\")\n", - "plt.legend(loc=\"upper right\")\n", - "# plt.savefig('plots/3500deg^2_plot.pdf',dpi=100)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "# Ellipticity histograms\n", - "plt.rcParams.update({\"font.size\": 20, \"figure.figsize\": [22, 7]})\n", - "\n", - "fig, axs = plt.subplots(1, 2)\n", - "nbins = 200\n", - "\n", - "for idx, cat in enumerate(cat_options):\n", - " (n, bins, _) = axs[0].hist(\n", - " dfs[idx][\"e1\"],\n", - " bins=nbins,\n", - " density=True,\n", - " histtype=\"step\",\n", - " weights=dfs[idx][\"w\"],\n", - " label=\"e1 %s\" % cat_dict[cat][\"label\"],\n", - " )\n", - "axs[0].set_xlabel(r\"$e_1$\")\n", - "axs[0].legend()\n", - "axs[0].set_xlim([-1.5, 1.5])\n", - "\n", - "# axs[0].set_ylim([0,2e4])\n", - "\n", - "for idx, cat in enumerate(cat_options):\n", - " (n, bins, _) = axs[1].hist(\n", - " dfs[idx][\"e2\"],\n", - " bins=nbins,\n", - " density=True,\n", - " histtype=\"step\",\n", - " weights=dfs[idx][\"w\"],\n", - " label=\"e2 {}\".format(cat_dict[cat][\"label\"]),\n", - " )\n", - " print(\n", - " \"e1 sigma {}: {}\".format(\n", - " cat_dict[cat][\"label\"], np.std(dfs[idx][\"e1_noleakage\"])\n", - " )\n", - " )\n", - " print(\n", - " \"e2 sigma {}: {}\".format(\n", - " cat_dict[cat][\"label\"], np.std(dfs[idx][\"e2_noleakage\"])\n", - " )\n", - " )\n", - " print(\n", - " \"e1 bias {}: {}\".format(\n", - " cat_dict[cat][\"label\"],\n", - " np.average(\n", - " np.array(dfs[idx][\"e1_noleakage\"]), weights=np.array(dfs[idx][\"w\"])\n", - " ),\n", - " )\n", - " )\n", - " print(\n", - " \"e2 bias {}: {}\".format(\n", - " cat_dict[cat][\"label\"],\n", - " np.average(\n", - " np.array(dfs[idx][\"e2_noleakage\"]), weights=np.array(dfs[idx][\"w\"])\n", - " ),\n", - " )\n", - " )\n", - "axs[1].set_xlabel(r\"$e_2$\")\n", - "axs[1].legend()\n", - "axs[1].set_xlim([-1.5, 1.5])\n", - "# axs[1].set_ylim([0,2e4])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "# Mag histograms\n", - "\n", - "plt.rcParams.update({\"font.size\": 20, \"figure.figsize\": [15, 10]})\n", - "\n", - "for idx, cat in enumerate(cat_options):\n", - " (n, bins, _) = plt.hist(\n", - " dfs[idx][\"mag\"],\n", - " bins=200,\n", - " density=False,\n", - " histtype=\"step\",\n", - " weights=dfs[idx][\"w\"],\n", - " label=\"Mag %s\" % cat_dict[cat][\"label\"],\n", - " )\n", - "\n", - "plt.xlim([19, 26])\n", - "plt.xlabel(\"Mag\")\n", - "plt.legend(loc=\"upper left\")" - ] - }, - { - "cell_type": "markdown", - "id": "7", - "metadata": { - "tags": [] - }, - "source": [ - "## Plot n(z)'s from file\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "8", - "metadata": {}, - "outputs": [], - "source": [ - "# nz_lf = fits.open(work_dir + '/nz/blind_nz_cfis_lensfit_goldshape_2022v1.fits')[1].data\n", - "nz = fits.open(work_dir + \"/nz/blind_nz_cfis_shapepipe_2022v1.fits\")[1].data\n", - "\n", - "# nz_lf_matched = fits.open(work_dir + '/nz/nz_masked_matched_lensfit_goldshape_2022v1.fits')[1].data\n", - "# nz_sp_matched = fits.open(work_dir + '/nz/nz_masked_matched_unions_shapepipe_extended_2022_v1.0.fits')[1].data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9", - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "# FULL CATALOGUE NZ'S\n", - "from matplotlib.ticker import StrMethodFormatter\n", - "\n", - "blinds = [\"A\", \"B\", \"C\"]\n", - "\n", - "# for blind in blinds:\n", - "# z1 = nz_lf['Z_%s' %blind]\n", - "\n", - "# (n,bins,_)= plt.hist(z1, bins=200, range=(0,5.0), density=True, histtype='step', weights=None,label='LensFit Blind %s' %blind)\n", - "# # n_lf.append(list(n))\n", - "# # bins_lf.append(list(bins))\n", - "\n", - "# plt.xlabel('Redshifts')\n", - "# plt.ylabel('n(z)')\n", - "# print(\"zmin = \",min(z1))\n", - "# print(\"zmax = \",max(z1))\n", - "# plt.legend(fontsize=20)\n", - "# # plt.savefig('plots/Lensfit_nz_all_blinds.pdf' )\n", - "# plt.show()\n", - "#####################################################################################################\n", - "for blind in blinds:\n", - " z = nz[\"Z_%s\" % blind]\n", - " bins = np.linspace(0, 5, 100)\n", - "\n", - " y, edges = np.histogram(z, bins, density=True, weights=nz[\"som_w\"])\n", - " centers = 0.5 * (edges[1:] + edges[:-1])\n", - " plt.plot(centers, y, \"-o\", markersize=4, label=\"Blind %s\" % blind, alpha=0.7)\n", - "\n", - " # (n,bins,_)= plt.hist(z2, bins=50, range=(0,5.0), density=True, histtype='step',weights=nz['som_w'],label='Blind %s' %blind,alpha=0.5)\n", - " # n_sp.append(list(n))\n", - " # bins_sp.append(list(bins))\n", - "\n", - " plt.xlabel(r\"$z$\")\n", - " plt.ylabel(r\"$n(z)$\")\n", - " plt.ylim([0, 1.7])\n", - " plt.xlim([0, 5])\n", - " plt.grid(True)\n", - " plt.gca().xaxis.set_major_formatter(StrMethodFormatter(\"{x:,.1f}\"))\n", - " # print(\"zmin = \",min(z))\n", - " # print(\"zmax = \",max(z))\n", - " plt.legend(fontsize=20)\n", - " plt.savefig(\"../plots/unions_nz.pdf\", bbox_inches=\"tight\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "10", - "metadata": { - "tags": [] - }, - "source": [ - "## Compute shear-shear correlation" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "11", - "metadata": {}, - "outputs": [], - "source": [ - "# Create TreeCorr catalogue\n", - "treecorr.set_omp_threads(8)\n", - "\n", - "sep_units = \"arcmin\"\n", - "theta_min = 1\n", - "theta_max = 200\n", - "\n", - "TreeCorrConfig = {\n", - " \"ra_units\": \"degrees\",\n", - " \"dec_units\": \"degrees\",\n", - " \"max_sep\": str(theta_max),\n", - " \"min_sep\": str(theta_min),\n", - " \"sep_units\": sep_units,\n", - " \"nbins\": 20,\n", - " \"var_method\": \"jackknife\",\n", - "}\n", - "\n", - "cat_ggs = []\n", - "for idx, cat in enumerate(cat_options):\n", - " cat_gal = treecorr.Catalog(\n", - " ra=dfs[idx][\"ra\"],\n", - " dec=dfs[idx][\"dec\"],\n", - " g1=dfs[idx][\"e1\"] - cat_dict[cat][\"e1_bias\"],\n", - " g2=dfs[idx][\"e2\"] - cat_dict[cat][\"e2_bias\"],\n", - " w=dfs[idx][\"w\"],\n", - " ra_units=\"degrees\",\n", - " dec_units=\"degrees\",\n", - " npatch=50,\n", - " )\n", - " gg = treecorr.GGCorrelation(TreeCorrConfig)\n", - " gg.process(cat_gal)\n", - " cat_ggs.append(gg)\n", - " print(\"done for cat %s\" % cat)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12", - "metadata": {}, - "outputs": [], - "source": [ - "plt.rcParams.update({\"font.size\": 25, \"figure.figsize\": [10, 7]})\n", - "\n", - "ax1 = plt.subplot(111)\n", - "for idx, cat in enumerate(cat_options):\n", - " ax1.plot(\n", - " cat_ggs[idx].meanr,\n", - " cat_ggs[idx].npairs,\n", - " label=r\"$n_{pairs}$ %s\" % (cat_dict[cat][\"label\"]),\n", - " ls=cat_dict[cat][\"ls\"],\n", - " color=cat_dict[cat][\"colour\"],\n", - " )\n", - "ax1.set_xlabel(rf\"$\\theta$ [{sep_units}]\")\n", - "ax1.set_ylabel(r\"$n_{pairs}$\")\n", - "plt.show()\n", - "\n", - "ax2 = plt.subplot(111)\n", - "for idx, cat in enumerate(cat_options):\n", - " ax2.errorbar(\n", - " cat_ggs[idx].meanr,\n", - " cat_ggs[idx].xip,\n", - " yerr=np.sqrt(cat_ggs[idx].varxip),\n", - " label=r\"$\\xi_+$ %s\" % (cat_dict[cat][\"label\"]),\n", - " ls=cat_dict[cat][\"ls\"],\n", - " color=cat_dict[cat][\"colour\"],\n", - " )\n", - " ax2.axvspan(0, 10, color=\"gray\", alpha=0.3)\n", - " # ax2.axvspan(100,200,color='gray', alpha=0.3)\n", - "\n", - "ax2.text(\n", - " 0.85,\n", - " 0.88,\n", - " \"1,1\",\n", - " transform=ax2.transAxes,\n", - " bbox=dict(facecolor=\"white\", edgecolor=\"black\", boxstyle=\"round\", pad=0.5),\n", - ")\n", - "ax2.set_xscale(\"log\")\n", - "ax2.set_yscale(\"log\")\n", - "ax2.set_xlabel(rf\"$\\theta$ [{sep_units}]\")\n", - "ax2.set_xlim([0, 200])\n", - "_ = ax2.set_ylabel(r\"$\\xi_+(\\theta)$\")\n", - "ax2.legend(loc=\"lower left\")\n", - "# plt.savefig('../plots/xi_plus_%s.pdf' %cat_dict[cat]['label'],bbox_inches='tight')\n", - "plt.show()\n", - "\n", - "ax3 = plt.subplot(111)\n", - "for idx, cat in enumerate(cat_options):\n", - " ax3.errorbar(\n", - " cat_ggs[idx].meanr,\n", - " cat_ggs[idx].xim,\n", - " yerr=np.sqrt(cat_ggs[idx].varxim),\n", - " label=r\"$\\xi_-$ %s\" % (cat_dict[cat][\"label\"]),\n", - " ls=\"dotted\",\n", - " color=cat_dict[cat][\"colour\"],\n", - " )\n", - " ax3.axvspan(0, 20, color=\"gray\", alpha=0.3)\n", - " # ax3.axvspan(100,200,color='gray', alpha=0.3)\n", - "\n", - "ax3.text(\n", - " 0.85,\n", - " 0.88,\n", - " \"1,1\",\n", - " transform=ax3.transAxes,\n", - " bbox=dict(facecolor=\"white\", edgecolor=\"black\", boxstyle=\"round\", pad=0.5),\n", - ")\n", - "ax3.set_xscale(\"log\")\n", - "ax3.set_yscale(\"log\")\n", - "ax3.set_xlabel(rf\"$\\theta$ [{sep_units}]\")\n", - "ax3.set_xlim([0, 200])\n", - "ax3.legend(loc=\"lower left\")\n", - "_ = ax3.set_ylabel(r\"$\\xi_-(\\theta)$\")\n", - "# plt.savefig('../plots/xi_minus_%s.pdf' %cat_dict[cat]['label'],bbox_inches='tight')\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "id": "13", - "metadata": { - "tags": [] - }, - "source": [ - "## Comparison with theory PyCCL" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "14", - "metadata": {}, - "outputs": [], - "source": [ - "nz = np.loadtxt(\n", - " \"/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/v1.0/nz/dndz_SP_v1.0_A.txt\",\n", - " usecols=1,\n", - ")\n", - "bins = np.loadtxt(\n", - " \"/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/v1.0/nz/dndz_SP_v1.0_A.txt\",\n", - " usecols=0,\n", - ")\n", - "\n", - "\n", - "def theory_cls(Omega_c, Omega_b, h, n_s, sigma_8):\n", - " # Set cosmology\n", - " cosmo = ccl.Cosmology(Omega_c, Omega_b, h, n_s, sigma_8)\n", - "\n", - " ell = np.arange(2, 2000)\n", - " theta_deg = np.logspace(\n", - " np.log10(theta_min / 60), np.log10(theta_max / 60), num=20\n", - " ) # Theta is in degrees\n", - " # CALCULATION OF THEORY XI_PM\n", - " xi_plus_lf = []\n", - " xi_minus_lf = []\n", - "\n", - " for i in range(len(nz)):\n", - " bias_ia = 0 * np.ones_like(bins[i][:-1])\n", - " lens_ia = ccl.WeakLensingTracer(\n", - " cosmo,\n", - " dndz=(np.array(bins[i][:-1]), np.array(nz[i])),\n", - " ia_bias=(np.array(bins[i][:-1]), bias_ia),\n", - " )\n", - " cl = ccl.angular_cl(cosmo, lens_ia, lens_ia, ell)\n", - "\n", - " xi_plus_lf.append(\n", - " list(\n", - " ccl.correlation(cosmo, ell, cl, theta_deg, type=\"GG+\", method=\"FFTLog\")\n", - " )\n", - " )\n", - " xi_minus_lf.append(\n", - " list(\n", - " ccl.correlation(cosmo, ell, cl, theta_deg, type=\"GG-\", method=\"FFTLog\")\n", - " )\n", - " )\n", - "\n", - " style = [\":\", \"--\", \"-.\"]\n", - " plt.errorbar(\n", - " gg.meanr,\n", - " gg.xip,\n", - " yerr=np.sqrt(gg.varxip),\n", - " ls=\"\",\n", - " label=r\"$\\xi_+$ TreeCorr (LF)\",\n", - " capsize=5,\n", - " marker=\"o\",\n", - " color=\"b\",\n", - " )\n", - " plt.errorbar(\n", - " gg.meanr,\n", - " gg.xim,\n", - " yerr=np.sqrt(gg.varxim),\n", - " ls=\"\",\n", - " label=r\"$\\xi_-$ TreeCorr (LF)\",\n", - " capsize=5,\n", - " marker=\"o\",\n", - " color=\"g\",\n", - " )\n", - "\n", - " for i in range(len(blinds)):\n", - " plt.plot(\n", - " theta_deg * 60,\n", - " xi_plus_lf[i],\n", - " color=\"b\",\n", - " ls=style[i],\n", - " label=r\"$\\xi_+$ PyCCL (LF) blind %s\" % blinds[i],\n", - " )\n", - " plt.plot(\n", - " theta_deg * 60,\n", - " xi_minus_lf[i],\n", - " color=\"g\",\n", - " ls=style[i],\n", - " label=r\"$\\xi_-$ PyCCL (LF) blind %s\" % blinds[i],\n", - " )\n", - "\n", - " plt.xscale(\"log\")\n", - " # plt.yscale('log')\n", - " plt.legend(fontsize=20)\n", - " plt.ticklabel_format(axis=\"y\", style=\"sci\", scilimits=(0, 0))\n", - " plt.xlim([1, 200])\n", - " plt.ylim([0, 10e-5])\n", - " plt.ylabel(r\"$\\xi_\\pm(\\theta)$\")\n", - " plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - " # plt.savefig('plots/pyccl_comparison_lensfit.pdf')\n", - "\n", - "\n", - "interact(\n", - " theory_cls,\n", - " Omega_c=widgets.FloatSlider(\n", - " value=0.26, min=0.01, max=0.5, step=0.01, description=r\"$\\Omega_c$\"\n", - " ),\n", - " Omega_b=widgets.FloatSlider(\n", - " value=0.04, min=0.001, max=0.07, step=0.001, description=r\"$\\Omega_b$\"\n", - " ),\n", - " h=widgets.FloatSlider(value=0.7, min=0.3, max=0.9, step=0.01, description=r\"$h$\"),\n", - " n_s=widgets.FloatSlider(\n", - " value=0.96, min=0.6, max=1.1, step=0.01, description=r\"$n_s$\"\n", - " ),\n", - " sigma_8=widgets.FloatSlider(\n", - " value=0.8, min=0.3, max=1.2, step=0.01, description=r\"$\\sigma_8$\"\n", - " ),\n", - ")" - ] - }, - { - "cell_type": "markdown", - "id": "15", - "metadata": { - "tags": [] - }, - "source": [ - "## Plot varxipm's\n", - "Error bars are computed by treecorr, either through the 'shot' or 'jackknife' method." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "16", - "metadata": {}, - "outputs": [], - "source": [ - "for idx, cat in enumerate(cat_options):\n", - " blind = \"A\"\n", - " label = \"SP_v1.4\"\n", - "\n", - " cc = \"/n23data1/n06data/lgoh/scratch/CFIS-UNIONS/CFIS-UNIONS_dev/cosmo_inference/data/{}/covs/cov_{}\".format(\n", - " label + \"_{}\".format(blind), label\n", - " )\n", - "\n", - " cc_var = np.diag(np.loadtxt(cc + \".txt\"))\n", - " cc_varxip = cc_var[:20]\n", - " cc_varxim = cc_var[20:]\n", - "\n", - " cc_var = np.diag(np.loadtxt(cc + \"_g.txt\"))\n", - " cc_varxip_g = cc_var[:20]\n", - " cc_varxim_g = cc_var[20:]\n", - "\n", - " plt.loglog(\n", - " cat_ggs[idx].meanr,\n", - " cat_ggs[idx].varxip,\n", - " \"-k\",\n", - " label=r\"$\\sigma(\\xi_+)$ TreeCorr jackknife %s\" % cat_dict[cat][\"label\"],\n", - " )\n", - " plt.loglog(\n", - " cat_ggs[idx].meanr,\n", - " cc_varxip,\n", - " ls=\"--\",\n", - " c=\"%s\" % cat_dict[cat][\"colour\"],\n", - " label=r\"$\\sigma(\\xi_+)$ CosmoCov %s\" % cat_dict[cat][\"label\"],\n", - " )\n", - " plt.loglog(\n", - " cat_ggs[idx].meanr,\n", - " cc_varxip_g,\n", - " ls=\":\",\n", - " c=\"%s\" % cat_dict[cat][\"colour\"],\n", - " label=r\"$\\sigma(\\xi_+)$ CosmoCov Gaussian %s\" % cat_dict[cat][\"label\"],\n", - " )\n", - " plt.grid()\n", - " plt.xlim([cat_ggs[idx].meanr[0], cat_ggs[idx].meanr[-1]])\n", - " plt.legend(fontsize=15)\n", - " plt.xlabel(rf\"$\\theta$ [{sep_units}]\")\n", - " plt.ylabel(r\"$\\sigma(\\xi_+)$\")\n", - " plt.show()\n", - " # plt.savefig()\n", - "\n", - " plt.loglog(\n", - " cat_ggs[idx].meanr,\n", - " cat_ggs[idx].varxim,\n", - " \"-k\",\n", - " label=r\"$\\sigma(\\xi_-)$ TreeCorr jackknife %s\" % cat_dict[cat][\"label\"],\n", - " )\n", - " plt.loglog(\n", - " cat_ggs[idx].meanr,\n", - " cc_varxim,\n", - " ls=\"--\",\n", - " c=\"%s\" % cat_dict[cat][\"colour\"],\n", - " label=r\"$\\sigma(\\xi_-)$ CosmoCov (SP) %s\" % cat_dict[cat][\"label\"],\n", - " )\n", - " plt.loglog(\n", - " cat_ggs[idx].meanr,\n", - " cc_varxim_g,\n", - " ls=\":\",\n", - " c=\"%s\" % cat_dict[cat][\"colour\"],\n", - " label=r\"$\\sigma(\\xi_-)$ CosmoCov (SP) Gaussian %s\" % cat_dict[cat][\"label\"],\n", - " )\n", - " plt.grid()\n", - " plt.xlim([cat_ggs[idx].meanr[0], cat_ggs[idx].meanr[-1]])\n", - " plt.legend(fontsize=15)\n", - " plt.xlabel(rf\"$\\theta$ [{sep_units}]\")\n", - " plt.ylabel(r\"$\\sigma(\\xi_-)$\")\n", - " plt.show()\n", - " # plt.savefig()" - ] - }, - { - "cell_type": "markdown", - "id": "17", - "metadata": { - "jp-MarkdownHeadingCollapsed": true, - "tags": [] - }, - "source": [ - "## Run systematic tests" - ] - }, - { - "cell_type": "markdown", - "id": "18", - "metadata": { - "jp-MarkdownHeadingCollapsed": true, - "tags": [] - }, - "source": [ - "### C_sys" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "19", - "metadata": {}, - "outputs": [], - "source": [ - "# CALCULATE XI_SYS FOR SHAPEPIPE\n", - "\n", - "sep_units = \"arcmin\"\n", - "theta_min = 1\n", - "theta_max = 200\n", - "\n", - "TreeCorrConfig = {\n", - " \"ra_units\": \"degrees\",\n", - " \"dec_units\": \"degrees\",\n", - " \"max_sep\": str(theta_max),\n", - " \"min_sep\": str(theta_min),\n", - " \"sep_units\": sep_units,\n", - " \"nbins\": 20,\n", - " \"var_method\": \"jackknife\",\n", - "}\n", - "\n", - "with fits.open(cat_dict[11][\"dir\"]) as data:\n", - " df_psf = pd.DataFrame(data[1].data)\n", - "\n", - "cat_psf = treecorr.Catalog(\n", - " ra=df_psf[\"RA\"],\n", - " dec=df_psf[\"DEC\"],\n", - " g1=df_psf[\"HSM_G1_PSF\"],\n", - " g2=df_psf[\"HSM_G2_PSF\"],\n", - " ra_units=\"degrees\",\n", - " dec_units=\"degrees\",\n", - " npatch=50,\n", - ")\n", - "\n", - "gg_psf = treecorr.GGCorrelation(TreeCorrConfig)\n", - "gg_psf.process(cat_psf)\n", - "\n", - "ggs_psf_star = []\n", - "for idx, cat in enumerate(cat_options):\n", - " cat_gal = treecorr.Catalog(\n", - " ra=dfs[idx][\"ra\"],\n", - " dec=dfs[idx][\"dec\"],\n", - " g1=dfs[idx][\"e1\"] - cat_dict[cat][\"e1_bias\"],\n", - " g2=dfs[idx][\"e2\"] - cat_dict[cat][\"e2_bias\"],\n", - " w=dfs[idx][\"w\"],\n", - " ra_units=\"degrees\",\n", - " dec_units=\"degrees\",\n", - " npatch=50,\n", - " )\n", - " gg_psf_star = treecorr.GGCorrelation(TreeCorrConfig)\n", - " gg_psf_star.process(cat_gal, cat_psf)\n", - " ggs_psf_star.append(gg_psf_star)\n", - "\n", - " print(\"done for cat %s\" % cat)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "20", - "metadata": {}, - "outputs": [], - "source": [ - "for idx, cat in enumerate(cat_options):\n", - " C_sys_xip = gg_psf.xip\n", - " C_sys_xim = gg_psf.xim\n", - "\n", - " # delta_C_sys_xip = C_sys_xip*np.sqrt((2*np.sqrt(ggs_psf_star[idx].varxip)/ggs_psf_star[idx].xip)**2+(np.sqrt(gg_psf.varxip)/gg_psf.xip)**2)\n", - " # delta_C_sys_xim = C_sys_xim*np.sqrt((2*np.sqrt(ggs_psf_star[idx].varxim)/ggs_psf_star[idx].xim)**2+(np.sqrt(gg_psf.varxim)/gg_psf.xim)**2)\n", - "\n", - " plt.errorbar(\n", - " ggs_psf_star[idx].meanr,\n", - " C_sys_xip,\n", - " yerr=0,\n", - " label=r\"$(\\xi^{sys}_+)$ Catalogue %s\" % cat_dict[cat][\"label\"],\n", - " ls=cat_dict[cat][\"ls\"],\n", - " color=cat_dict[cat][\"colour\"],\n", - " )\n", - " plt.legend()\n", - " plt.xlabel(r\"$\\theta[arcmin]$\")\n", - " plt.ylabel(r\"$\\xi^{sys}_\\pm$\")\n", - " # plt.ylim([-2e-8,2e-8])\n", - " plt.xscale(\"log\")\n", - " plt.ticklabel_format(style=\"sci\", axis=\"y\", scilimits=(0, 0))\n", - " plt.grid(True)\n", - "\n", - " # plt.errorbar(ggs_psf_star[idx].meanr, C_sys_xim, yerr=delta_C_sys_xim, label=r'$(\\xi^{sys}_-)$ Catalogue %s'%cat_dict[cat]['label'],color='g')\n", - " # plt.legend()\n", - " # plt.xlabel(r'$\\theta[arcmin]$')\n", - " # plt.ylabel(r'$\\xi^{sys}_\\pm$')\n", - " # plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))\n", - " # # plt.ylim([-2e-8,2e-8])\n", - " # plt.xscale('log')\n", - " # plt.grid(True)" - ] - }, - { - "cell_type": "markdown", - "id": "21", - "metadata": { - "jp-MarkdownHeadingCollapsed": true, - "tags": [] - }, - "source": [ - "### M_ap" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22", - "metadata": {}, - "outputs": [], - "source": [ - "for idx, cat in enumerate(cat_options):\n", - " R = cat_ggs[idx].rnom\n", - "\n", - " (Map_lf, mapsq_im_lf, Mx_lf, mxsq_im_lf, varMapsq_lf) = cat_ggs[idx].calculateMapSq(\n", - " R=R, m2_uform=\"Schneider\"\n", - " )\n", - " (Map_sp, mapsq_im_sp, Mx_sp, mxsq_im_sp, varMapsq_sp) = cat_ggs[idx].calculateMapSq(\n", - " R=R, m2_uform=\"Schneider\"\n", - " )\n", - "\n", - " plt.errorbar(\n", - " R,\n", - " Map_lf,\n", - " yerr=np.sqrt(varMapsq_lf),\n", - " label=r\"$$ {}\".format(cat_dict[cat][\"label\"]),\n", - " ls=\":\",\n", - " color=\"b\",\n", - " )\n", - " plt.errorbar(\n", - " R,\n", - " Mx_lf,\n", - " yerr=np.sqrt(varMapsq_lf),\n", - " label=r\"$$ {}\".format(cat_dict[cat][\"label\"]),\n", - " ls=\":\",\n", - " color=\"r\",\n", - " )\n", - " plt.axhline(y=0, xmin=0, xmax=200, color=\"k\")\n", - " plt.xlabel(r\"$\\theta[arcmin]$\")\n", - " plt.ylabel(r\"$$\")\n", - " plt.xscale(\"log\")\n", - " plt.ylim([-2e-5, 1e-5])\n", - " # plt.xlim([1,200])\n", - " plt.grid(True)\n", - " plt.legend()\n", - "\n", - " plt.errorbar(\n", - " R,\n", - " Map_sp,\n", - " yerr=np.sqrt(varMapsq_sp),\n", - " label=r\"$$ {}\".format(cat_dict[cat][\"label\"]),\n", - " ls=\":\",\n", - " color=\"b\",\n", - " )\n", - " plt.errorbar(\n", - " R,\n", - " Mx_sp,\n", - " yerr=np.sqrt(varMapsq_sp),\n", - " label=r\"$$ {}\".format(cat_dict[cat][\"label\"]),\n", - " ls=\":\",\n", - " color=\"r\",\n", - " )\n", - " plt.axhline(y=0, xmin=0, xmax=200, color=\"k\")\n", - " plt.xscale(\"log\")\n", - " plt.xlabel(r\"$\\theta[arcmin]$\")\n", - " plt.ylabel(r\"$$\")\n", - " plt.ticklabel_format(style=\"sci\", axis=\"y\", scilimits=(0, 0))\n", - " plt.ylim([-2e-5, 1e-5])\n", - " plt.grid(True)\n", - " plt.legend()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "id": "24", - "metadata": {}, - "source": [ - "## Plot Covariance Matrix" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "25", - "metadata": {}, - "outputs": [], - "source": [ - "from numpy import linalg as LA\n", - "\n", - "%matplotlib inline\n", - "\n", - "\n", - "def get_cov(filename):\n", - "\n", - " data = np.loadtxt(filename)\n", - " ndata = int(np.max(data[:, 0])) + 1\n", - "\n", - " print(\"Dimension of cov: %dx%d\" % (ndata, ndata))\n", - "\n", - " # ndata_min = int(np.min(data[:,0]))\n", - " cov_g = np.zeros((ndata, ndata))\n", - " cov_ng = np.zeros((ndata, ndata))\n", - " for i in range(0, data.shape[0]):\n", - " cov_g[int(data[i, 0]), int(data[i, 1])] = data[i, 8]\n", - " cov_g[int(data[i, 1]), int(data[i, 0])] = data[i, 8]\n", - " cov_ng[int(data[i, 0]), int(data[i, 1])] = data[i, 9]\n", - " cov_ng[int(data[i, 1]), int(data[i, 0])] = data[i, 9]\n", - "\n", - " return cov_g, cov_ng, ndata\n", - "\n", - "\n", - "covfile = \"/feynman/work/dap/lcs/lg268561/UNIONS/CFIS-UNIONS/CFIS-UNIONS_dev/cosmo_inference/data/SP_cut_Fabian/covs/out_cov_ssss_+-_cov_Ntheta20_Ntomo1_3\"\n", - "\n", - "c_g, c_ng, ndata = get_cov(covfile)\n", - "cov = c_ng + c_g\n", - "cov_g = c_g\n", - "\n", - "b = np.sort(LA.eigvals(cov))\n", - "print(\"min+max eigenvalues cov: %e, %e\" % (np.min(b), np.max(b)))\n", - "if np.min(b) <= 0.0:\n", - " print(\"non-positive eigenvalue encountered! Covariance Invalid!\")\n", - " exit()\n", - "\n", - "print(\"Covariance is postive definite!\")\n", - "\n", - "pp_var = []\n", - "for i in range(ndata):\n", - " pp_var.append(cov[i][i])\n", - "\n", - "\n", - "cmap = \"seismic\"\n", - "\n", - "pp_norm = np.zeros((ndata, ndata))\n", - "for i in range(ndata):\n", - " for j in range(ndata):\n", - " pp_norm[i][j] = cov[i][j] / np.sqrt(cov[i][i] * cov[j][j])\n", - "\n", - "print(\"Plotting correlation matrix ...\")\n", - "\n", - "# plot_path = covfile+'_plot.pdf'\n", - "\n", - "fig = plt.figure()\n", - "ax = fig.add_subplot(1, 1, 1)\n", - "ax.xaxis.tick_top()\n", - "ax.xaxis.set_ticks(np.arange(0, 41, 1))\n", - "ax.yaxis.set_ticks(np.arange(0, 41, 1))\n", - "\n", - "\n", - "plt.axvline(x=19.5, color=\"black\", linewidth=1.5)\n", - "plt.axhline(y=19.5, color=\"black\", linewidth=1.5)\n", - "\n", - "\n", - "im3 = ax.imshow(pp_norm, cmap=cmap, vmin=-1, vmax=1)\n", - "ax.get_xaxis().set_ticklabels([])\n", - "ax.get_yaxis().set_ticklabels([])\n", - "cbar = fig.colorbar(im3, orientation=\"vertical\", shrink=0.6, ticks=[-1, 0, 1])\n", - "cbar.ax.tick_params(labelsize=15)\n", - "cbar.ax.set_yticklabels([r\"$-1$\", r\"$0$\", r\"$1$\"])\n", - "\n", - "ax.text(8, -2, r\"$\\xi_+^{ij}(\\theta)$\", fontsize=22)\n", - "ax.text(30, -2, r\"$\\xi_-^{ij}(\\theta)$\", fontsize=22)\n", - "ax.text(-6, 10, r\"$\\xi_+^{ij}(\\theta)$\", fontsize=22)\n", - "ax.text(-6, 30, r\"$\\xi_-^{ij}(\\theta)$\", fontsize=22)\n", - "# ax.set_title('Blind A',fontsize=15)\n", - "\n", - "plt.savefig(\"../plots/unions_covmat.pdf\", bbox_inches=\"tight\")\n", - "\n", - "\n", - "plt.show()\n", - "# print(\"Plot saved as %s\"%(plot_path))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "26", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "my_env", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.13" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/cosmo_inference/notebooks/cfis_mcmc.ipynb b/cosmo_inference/notebooks/cfis_mcmc.ipynb deleted file mode 100644 index 124eaf99..00000000 --- a/cosmo_inference/notebooks/cfis_mcmc.ipynb +++ /dev/null @@ -1,1546 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "0", - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "from getdist import plots\n", - "\n", - "# import uncertainties\n", - "\n", - "plt.rc(\"mathtext\", fontset=\"stix\")\n", - "plt.rc(\"font\", family=\"sans-serif\")\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 40\n", - "\n", - "\n", - "# SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE\n", - "root_dir = \"/n09data/guerrini/output_chains/\"\n", - "\n", - "\"\"\" lower_bound = ['3.0', '3.0', '3.0', '3.0', '3.0', '10.0', '10.0']\n", - "upper_bound = ['200.0', '150.0', '100.0', '80.0', '60.0', '150.0', '60.0']\n", - "roots = [\n", - " f'SP_v1.4.5_leak_corr_sc_{lc}_{hc}_10.0_200.0' for lc, hc in zip(lower_bound, upper_bound)\n", - " ] \"\"\"\n", - "\n", - "roots = [\n", - " \"SP_v1.4.5_glass_mock_1\",\n", - " \"SP_v1.4.5_glass_mock_1_takahashi\",\n", - " \"SP_v1.4.5_glass_mock_1_HM_code\",\n", - "]\n", - "\n", - "roots = [\n", - " \"SP_v1.4.5_A\",\n", - " # \"SP_v1.4.5_A_no_IA\",\n", - " # \"SP_v1.4.5_A_no_dz\",\n", - " # \"SP_v1.4.5_A_no_m_bias\",\n", - " \"SP_v1.4.5_A_sc_3_150\",\n", - " \"SP_v1.4.5_A_sc_3_60\",\n", - " # \"SP_v1.4.5_A_sc_10_150\",\n", - " # \"SP_v1.4.5_A_sc_10_60\",\n", - " # \"SP_v1.4.5_A_sc_5_150\",\n", - " # \"SP_v1.4.5_A_sc_7_150\",\n", - " \"SP_v1.4.5_A_no_leakage\",\n", - " \"SP_v1.4.5_A_no_leakage_150\",\n", - " \"SP_v1.4.5_A_no_leakage_60\",\n", - "]\n", - "\n", - "\"\"\" roots = [\n", - " f\"SP_v1.4.5_glass_mock_{i}\" for i in range(1, 17)\n", - "] \"\"\"\n", - "\n", - "\"\"\" roots = [\n", - " \"SP_v1.4.5_glass_mock_A_IA_m5_5\",\n", - " \"SP_v1.4.5_glass_mock_A_IA_G_0.57_0.5\",\n", - "] \"\"\"\n", - "\n", - "\n", - "roots = [\n", - " f\"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_{int(i)}.0_80.0_10.0_80.0\"\n", - " for i in [3, 5, 7, 10, 11]\n", - "]\n", - "\n", - "roots = [\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0\",\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0_no_alpha_beta\",\n", - "]\n", - "\n", - "roots = [\n", - " \"SP_v1.4.5_leak_corr_A_minsep=1_maxsep=250_nbins=20_npatch=1_sc_10.0_80.0_10.0_80.0\",\n", - " \"SP_v1.4.5_leak_corr_cell\",\n", - "]\n", - "\n", - "print(roots)" - ] - }, - { - "cell_type": "markdown", - "id": "1", - "metadata": {}, - "source": [ - "## Retrieve the chains" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "# MAKE PARAMNAMES FILE\n", - "\n", - "for root in roots:\n", - " with open(root_dir + \"{}/samples_{}.txt\".format(\"/\" + root, root), \"r\") as file:\n", - " params = file.readline()[1:].split(\"\\t\")[:-4]\n", - " file.close()\n", - "\n", - " with open(\n", - " root_dir + \"{}/getdist_{}.paramnames\".format(\"/\" + root, root), \"w\"\n", - " ) as file:\n", - " for i in range(len(params)):\n", - " if len(params[i].split(\"--\")) > 1:\n", - " file.write(params[i].split(\"--\")[1] + \"\\n\")\n", - " else:\n", - " file.write(params[i].split(\"--\")[0] + \"\\n\")\n", - " file.close()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "# READ CHAIN\n", - "\n", - "chains = []\n", - "\n", - "for root in roots:\n", - " samples = np.loadtxt(root_dir + \"{}/samples_{}.txt\".format(root, root))\n", - " print(len(samples))\n", - " if \"nautilus\" in root:\n", - " samples = np.column_stack(\n", - " (np.exp(samples[:, -3]), samples[:, -1] - samples[:, -2], samples[:, 0:-3])\n", - " )\n", - " else:\n", - " samples = np.column_stack((samples[:, -1], samples[:, -3], samples[:, 0:-4]))\n", - " np.savetxt(root_dir + \"{}/getdist_{}.txt\".format(root, root), samples)\n", - "\n", - " chain = g.samples_for_root(\n", - " root_dir + \"{}/getdist_{}\".format(root, root),\n", - " cache=False,\n", - " settings={\"ignore_rows\": 0, \"smooth_scale_2D\": 0.5, \"smooth_scale_1D\": 0.5},\n", - " )\n", - "\n", - " chains.append(chain)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "name_list = [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"s_8_input\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - "] # ,'alpha','beta']\n", - "label_list = [\n", - " r\"\\Omega_m\",\n", - " r\"\\omega_b h^2\",\n", - " \"h_0\",\n", - " \"n_s\",\n", - " r\"\\sigma_8\",\n", - " \"S_8\",\n", - " \"log T_{AGN}\",\n", - " \"A_{IA}\",\n", - " \"m_1\",\n", - " r\"\\Delta z_1\",\n", - "] # , '\\\\alpha_{PSF}', '\\\\beta_{PSF}']\n", - "\n", - "for chain in chains:\n", - " param_names = chain.getParamNames()\n", - " for name, label in zip(name_list, label_list):\n", - " param_names.parWithName(name).label = label" - ] - }, - { - "cell_type": "markdown", - "id": "5", - "metadata": {}, - "source": [ - "## Plot the chain" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "%matplotlib inline\n", - "\n", - "\"\"\" legend_labels = [\n", - " rf'$\\theta \\\\in$ [{lc}-{hc}]' for lc, hc in zip(lower_bound, upper_bound)\n", - "] \"\"\"\n", - "\n", - "legend_labels = [rf\"GLASS mock {i}\" for i in range(1, 17)]\n", - "\n", - "legend_labels = [\"GLASS mock 1\", \"GLASS mock 1 takahashi\", \"GLASS mock 1 HM code\"]\n", - "\n", - "legend_labels = [\n", - " \"SP_v1.4.5 blind A\",\n", - " # \"SP_v1.4.5 blind A no IA\",\n", - " # r\"SP_v1.4.5 blind A no $\\Delta z$\",\n", - " # r\"SP_v1.4.5 blind A no $m_1$\",\n", - " r\"SP_v1.4.5 blind A, $\\theta \\in [3-150]$\",\n", - " r\"SP_v1.4.5 blind A, $\\theta \\in [3-60]$\",\n", - " # r\"SP_v1.4.5 blind A, $\\theta \\in [10-150]$\",\n", - " # r\"SP_v1.4.5 blind A, $\\theta \\in [10-60]$\",\n", - " # r\"SP_v1.4.5 blind A, $\\theta \\in [5-150]$\",\n", - " # r\"SP_v1.4.5 blind A, $\\theta \\in [7-150]$\",\n", - " r\"SP_v1.4.5 blind A no leakage\",\n", - " r\"SP_v1.4.5 blind A no leakage, $\\theta \\in [3-150]$\",\n", - " r\"SP_v1.4.5 blind A no leakage, $\\theta \\in [3-60]$\",\n", - "]\n", - "\n", - "legend_labels = [\n", - " r\"SP_v1.4.5 blind A no leakage, $\\theta \\in [3-80]$\",\n", - " r\"SP_v1.4.5 blind A no leakage, $\\theta \\in [5-180]$\",\n", - " r\"SP_v1.4.5 blind A no leakage, $\\theta \\in [7-180]$\",\n", - " r\"SP_v1.4.5 blind A no leakage, $\\theta \\in [10-80]$\",\n", - " r\"SP_v1.4.5 blind A no leakage, $\\theta \\in [11-80]$\",\n", - "]\n", - "\n", - "legend_labels = [\n", - " r\"SP_v1.4.5 blind A no leakage, $\\theta \\in [10-80]$\",\n", - " r\"SP_v1.4.5 blind A no leakage, $C_\\ell$\",\n", - "]\n", - "\n", - "contour_colors = [\n", - " \"cornflowerblue\",\n", - " \"salmon\",\n", - " \"darkorange\",\n", - " \"forestgreen\",\n", - " \"turquoise\",\n", - " \"darkviolet\",\n", - " \"crimson\",\n", - " \"gold\",\n", - " \"lightcoral\",\n", - " \"mediumseagreen\",\n", - " \"lightsteelblue\",\n", - " \"black\",\n", - " \"silver\",\n", - " \"peru\",\n", - " \"maroon\",\n", - " \"olive\",\n", - "]\n", - "\n", - "\"\"\" legend_labels = [\n", - " r\"GLASS mock 3\",\n", - " r\"GLASS mock 3 no PSF\",\n", - " r\"GLASS mock 3 no PSF baryons\",\n", - "] \"\"\"\n", - "\n", - "marker = {\n", - " \"OMEGA_LAMBDA\": 0.7013160542257656,\n", - " \"ombh2\": 0.024499999999999997,\n", - " \"omch2\": 0.12249999999999998,\n", - " \"h0\": 0.70,\n", - " \"n_s\": 0.96,\n", - " \"SIGMA_8\": 0.793897,\n", - " \"s_8_input\": 0.79563645,\n", - " \"m1\": 0.0,\n", - " \"bias_1\": 0.0,\n", - " #'alpha': -0.0005,\n", - " #'beta': 0.0631,\n", - " \"a\": 0.0,\n", - "}\n", - "\n", - "marker = {\n", - " \"bias_1\": -0.045,\n", - " \"m1\": 0.0,\n", - " \"a\": 0.5,\n", - " #'alpha': 0.0169,\n", - " #'beta': 1.0789\n", - "}\n", - "g.triangle_plot(\n", - " chains,\n", - " [\n", - " \"OMEGA_M\",\n", - " \"ombh2\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"SIGMA_8\",\n", - " \"s_8_input\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - " \"alpha\",\n", - " \"beta\",\n", - " ],\n", - " legend_labels=legend_labels,\n", - " legend_loc=\"upper right\",\n", - " # param_limits={'bias_1':[-0.8,0.5]},\n", - " contour_colors=contour_colors,\n", - " line_args=[{\"color\": contour_colors[i], \"ls\": \"solid\"} for i in range(16)],\n", - " # title_limit=1,\n", - " filled=True,\n", - " markers=marker,\n", - ")\n", - "\n", - "g.export(\"contour_plot_unions_cell.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\" legend_labels = [\n", - " rf'$\\theta \\\\in$ [{lc}-{hc}]' for lc, hc in zip(lower_bound, upper_bound)\n", - "] \"\"\"\n", - "g.triangle_plot(\n", - " chains,\n", - " [\"OMEGA_M\", \"s_8_input\", \"SIGMA_8\", \"a\"],\n", - " legend_labels=legend_labels,\n", - " legend_loc=\"upper right\",\n", - " # param_limits={'bias_1':[-0.8,0.5]},\n", - " contour_colors=contour_colors,\n", - " line_args=[{\"color\": contour_colors[i], \"ls\": \"solid\"} for i in range(16)],\n", - " title_limit=1,\n", - " filled=True,\n", - " markers=marker,\n", - ")\n", - "\n", - "g.export(\"contour_plot_s8_unions_cell.png\")" - ] - }, - { - "cell_type": "markdown", - "id": "8", - "metadata": { - "jp-MarkdownHeadingCollapsed": true, - "tags": [] - }, - "source": [ - "### Output bestfit and sigma values" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "9", - "metadata": {}, - "outputs": [], - "source": [ - "#########BESTFIT AND SIGMA VALS##########\n", - "params = [\n", - " \"OMEGA_M\",\n", - " \"omega_b\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"a_s\",\n", - " \"SIGMA_8\",\n", - " \"S_8\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - " \"alpha\",\n", - " \"beta\",\n", - " \"omch2\",\n", - " \"ombh2\",\n", - "]\n", - "latex_params = [\n", - " r\"$\\Omega_{\\rm m,0}$\",\n", - " r\"$\\Omega_{\\rm b,0}$\",\n", - " r\"$h$\",\n", - " r\"$n_{\\rm s}$\",\n", - " r\"$A_{\\rm s}$\",\n", - " r\"$\\sigma_8$\",\n", - " r\"$S_8$\",\n", - " r\"$\\log_{10}{T_{\\rm AGN}}$\",\n", - " r\"$\\mathcal{A}_rm IA}$\",\n", - " r\"$m_1$\",\n", - " r\"$\\Delta z$\",\n", - " r\"$\\alpha$\",\n", - " r\"$\\beta$\",\n", - " r\"$\\Omega_{\\rm c,0}$\",\n", - " r\"$\\Omega_{\\rm b,0}$\",\n", - "]\n", - "\n", - "for chain in chains:\n", - " margestats = chain.getMargeStats()\n", - " likestats = chain.getLikeStats()\n", - " p = chain.getParams()\n", - "\n", - " for no in range(len(latex_params)):\n", - " if hasattr(p, params[no]):\n", - " param_stats = margestats.parWithName(params[no])\n", - " a = np.array(\n", - " [\n", - " param_stats.mean,\n", - " param_stats.mean - param_stats.limits[0].lower,\n", - " param_stats.limits[0].upper - param_stats.mean,\n", - " ]\n", - " )\n", - " if \"%.2g\" % a[1] == \"%.2g\" % a[2]:\n", - " latex_params[no] += r\"&$%.3g\\pm%.2g$\" % (a[0], a[1])\n", - " else:\n", - " latex_params[no] += \"&$%.3g_{-%.2g}^{+%.2g}$\" % (a[0], a[1], a[2])\n", - " else:\n", - " latex_params[no] += \"&$-$\"\n", - "\n", - "\n", - "for param in latex_params:\n", - " param += r\"\\\\\"\n", - " print(param)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "10", - "metadata": {}, - "outputs": [], - "source": [ - "chain = chains[0]\n", - "\n", - "margestats = chain.getMargeStats()\n", - "likestats = chain.getLikeStats()\n", - "p = chain.getParams()\n", - "\n", - "for no in range(len(latex_params)):\n", - " if hasattr(p, params[no]):\n", - " param_stats = margestats.parWithName(params[no])\n", - " a = np.array([param_stats.mean])\n", - " print(params[no], a[0])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "11", - "metadata": {}, - "outputs": [], - "source": [ - "#########BESTFIT AND SIGMA VALS##########\n", - "params = [\n", - " \"OMEGA_M\",\n", - " \"omega_b\",\n", - " \"h0\",\n", - " \"n_s\",\n", - " \"a_s\",\n", - " \"SIGMA_8\",\n", - " \"S_8\",\n", - " \"logt_agn\",\n", - " \"a\",\n", - " \"m1\",\n", - " \"bias_1\",\n", - " \"alpha\",\n", - " \"beta\",\n", - " \"omch2\",\n", - " \"ombh2\",\n", - "]\n", - "latex_params = [\n", - " r\"$\\Omega_{\\rm m,0}$\",\n", - " r\"$\\Omega_{\\rm b,0}$\",\n", - " r\"$h$\",\n", - " r\"$n_{\\rm s}$\",\n", - " r\"$A_{\\rm s}$\",\n", - " r\"$\\sigma_8$\",\n", - " r\"$S_8$\",\n", - " r\"$\\log_{10}{T_{\\rm AGN}}$\",\n", - " r\"$\\mathcal{A}_rm IA}$\",\n", - " r\"$m_1$\",\n", - " r\"$\\Delta z$\",\n", - " r\"$\\alpha$\",\n", - " r\"$\\beta$\",\n", - " r\"$\\Omega_{\\rm c,0}$\",\n", - " r\"$\\Omega_{\\rm b,0}$\",\n", - "]\n", - "\n", - "values = {param: [] for param in params}\n", - "for i, chain in enumerate(chains):\n", - " margestats = chain.getMargeStats()\n", - " likestats = chain.getLikeStats()\n", - " p = chain.getParams()\n", - "\n", - " print(legend_labels[i])\n", - "\n", - " for param in params:\n", - " if hasattr(p, param):\n", - " param_stats = margestats.parWithName(param)\n", - " a = np.array(\n", - " [\n", - " param_stats.mean,\n", - " param_stats.mean - param_stats.limits[0].lower,\n", - " param_stats.limits[0].upper - param_stats.mean,\n", - " ]\n", - " )\n", - " print(f\"{param}: {a[0]:.3g}_-{a[1]:.2g}^+{a[1]:.2g}\")\n", - " values[param].append(a[0])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "12", - "metadata": {}, - "outputs": [], - "source": [ - "bestfit_ix = np.argmax(chains[0].loglikes)\n", - "maxlike = chains[0].loglikes[bestfit_ix]\n", - "print(maxlike)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "13", - "metadata": {}, - "outputs": [], - "source": [ - "chains[0].loglikes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "14", - "metadata": {}, - "outputs": [], - "source": [ - "print(chains[0].likeStats)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "15", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 5))\n", - "\n", - "plt.subplot(131)\n", - "\n", - "plt.hist(values[\"OMEGA_M\"], bins=10, color=\"cornflowerblue\", alpha=0.5)\n", - "plt.axvline(0.301316, color=\"black\", linestyle=\"--\", label=\"True value\")\n", - "plt.xlabel(r\"$\\Omega_{\\rm m,0}$\")\n", - "plt.ylabel(\"Counts\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(132)\n", - "\n", - "plt.hist(values[\"SIGMA_8\"], bins=10, color=\"cornflowerblue\", alpha=0.5)\n", - "plt.axvline(0.793897, color=\"black\", linestyle=\"--\", label=\"True value\")\n", - "plt.xlabel(r\"$\\sigma_8$\")\n", - "plt.ylabel(\"Counts\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(133)\n", - "\n", - "plt.hist(values[\"S_8\"], bins=10, color=\"cornflowerblue\", alpha=0.5)\n", - "plt.axvline(0.79563645, color=\"black\", linestyle=\"--\", label=\"True value\")\n", - "plt.xlabel(r\"$S_8$\")\n", - "plt.ylabel(\"Counts\")\n", - "plt.legend()\n", - "plt.tight_layout()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "16", - "metadata": {}, - "outputs": [], - "source": [ - "np.sum(np.abs(np.array(values[\"S_8\"]) - 0.79563645) < 0.03) / len(values[\"S_8\"])" - ] - }, - { - "cell_type": "markdown", - "id": "17", - "metadata": {}, - "source": [ - "## Looking at best fit" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "18", - "metadata": {}, - "outputs": [], - "source": [ - "from astropy.io import fits\n", - "\n", - "version = \"SP_v1.4.5_glass_mock_1\"\n", - "\n", - "data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{version}/cosmosis_{version}.fits\"\n", - ")\n", - "xi_plus = data[\"XI_PLUS\"].data\n", - "xi_minus = data[\"XI_MINUS\"].data\n", - "cov_mat = data[\"COVMAT\"].data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "19", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "\n", - "plt.subplot(211)\n", - "\n", - "plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - ")\n", - "\n", - "plt.ylabel(r\"$\\xi_{+}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(3.0, color=\"grey\", linestyle=\"--\", label=\"3 arcmin\")\n", - "plt.axvline(100.0, color=\"grey\", linestyle=\"--\", label=\"100 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(212)\n", - "\n", - "plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - ")\n", - "\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - "plt.ylabel(r\"$\\xi_{-}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(10.0, color=\"grey\", linestyle=\"--\", label=\"10 arcmin\")\n", - "plt.axvline(200.0, color=\"grey\", linestyle=\"--\", label=\"200 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.savefig(\"xi_data.png\")\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "20", - "metadata": {}, - "outputs": [], - "source": [ - "import pyccl as ccl\n", - "\n", - "# Get theory correlation function from CCL\n", - "# Define the cosmology\n", - "theta_arcmin = np.logspace(np.log10(0.1), np.log10(250), 1000)\n", - "h = 0.7\n", - "Oc = 0.25\n", - "Ob = 0.05\n", - "sigma8 = 0.793897\n", - "n_s = 0.96\n", - "cosmo = ccl.Cosmology(\n", - " h=h,\n", - " Omega_c=Oc,\n", - " Omega_b=Ob,\n", - " sigma8=sigma8,\n", - " n_s=n_s,\n", - " transfer_function=\"boltzmann_camb\",\n", - ")\n", - "\n", - "# Define the redshift distribution\n", - "z, dndz = np.loadtxt(\n", - " \"/home/guerrini/sp_validation/cosmo_inference/cosmocov_config/dndz_test.txt\",\n", - " unpack=True,\n", - ")\n", - "\n", - "tracer = ccl.WeakLensingTracer(cosmo, dndz=(z, dndz), ia_bias=None)\n", - "\n", - "# COmpute the angular power spectrum C_ell\n", - "ell = np.logspace(0, np.log10(10000), 2000)\n", - "cl_gg = ccl.angular_cl(cosmo, tracer, tracer, ell)\n", - "\n", - "# Compute the 2PCF\n", - "theta_deg = theta_arcmin / 60\n", - "# xi+ fit\n", - "xi_p_theta_true = ccl.correlation(\n", - " cosmo, ell=ell, C_ell=cl_gg, theta=theta_deg, type=\"GG+\"\n", - ")\n", - "# xi- fit\n", - "xi_m_theta_true = ccl.correlation(\n", - " cosmo, ell=ell, C_ell=cl_gg, theta=theta_deg, type=\"GG-\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "21", - "metadata": {}, - "outputs": [], - "source": [ - "# Get theory correlation function from CCL\n", - "# Define the cosmology\n", - "theta_arcmin = np.logspace(np.log10(0.1), np.log10(250), 1000)\n", - "h = 0.6982064176424748\n", - "Oc = 0.21522128974860827 / h**2\n", - "print(\"Omega_c:\", Oc)\n", - "Ob = 0.024410205304489712 / h**2\n", - "print(\"Omega_b:\", Ob)\n", - "sigma8 = 0.5330533925822226\n", - "print(\"S8:\", sigma8 * np.sqrt((Oc + Ob) / 0.3))\n", - "n_s = 0.9867762122563981\n", - "a_ia = 0.0\n", - "cosmo = ccl.Cosmology(\n", - " h=h,\n", - " Omega_c=Oc,\n", - " Omega_b=Ob,\n", - " sigma8=sigma8,\n", - " n_s=n_s,\n", - " transfer_function=\"boltzmann_camb\",\n", - ")\n", - "\n", - "# Define the redshift distribution\n", - "z, dndz = np.loadtxt(\n", - " \"/home/guerrini/sp_validation/cosmo_inference/cosmocov_config/dndz_test.txt\",\n", - " unpack=True,\n", - ")\n", - "\n", - "tracer = ccl.WeakLensingTracer(\n", - " cosmo, dndz=(z, dndz), ia_bias=(z, np.ones_like(z) * a_ia)\n", - ")\n", - "\n", - "# COmpute the angular power spectrum C_ell\n", - "ell = np.logspace(0, np.log10(10000), 2000)\n", - "cl_gg = ccl.angular_cl(cosmo, tracer, tracer, ell)\n", - "\n", - "# Compute the 2PCF\n", - "theta_deg = theta_arcmin / 60\n", - "# xi+ fit\n", - "xi_p_theta_fit = ccl.correlation(\n", - " cosmo, ell=ell, C_ell=cl_gg, theta=theta_deg, type=\"GG+\"\n", - ")\n", - "# xi- fit\n", - "xi_m_theta_fit = ccl.correlation(\n", - " cosmo, ell=ell, C_ell=cl_gg, theta=theta_deg, type=\"GG-\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "22", - "metadata": {}, - "outputs": [], - "source": [ - "# Get theory correlation function from CCL\n", - "# Define the cosmology\n", - "theta_arcmin = np.logspace(np.log10(0.1), np.log10(250), 1000)\n", - "h = 0.6982064176424748\n", - "Oc = 0.21522128974860827 / h**2\n", - "print(\"Omega_c:\", Oc)\n", - "Ob = 0.024410205304489712 / h**2\n", - "print(\"Omega_b:\", Ob)\n", - "sigma8 = 0.5330533925822226\n", - "print(\"S8:\", sigma8 * np.sqrt((Oc + Ob) / 0.3))\n", - "n_s = 0.9867762122563981\n", - "a_ia = -0.4225120529551343\n", - "cosmo = ccl.Cosmology(\n", - " h=h,\n", - " Omega_c=Oc,\n", - " Omega_b=Ob,\n", - " sigma8=sigma8,\n", - " n_s=n_s,\n", - " transfer_function=\"boltzmann_camb\",\n", - ")\n", - "\n", - "# Define the redshift distribution\n", - "z, dndz = np.loadtxt(\n", - " \"/home/guerrini/sp_validation/cosmo_inference/cosmocov_config/dndz_test.txt\",\n", - " unpack=True,\n", - ")\n", - "\n", - "tracer = ccl.WeakLensingTracer(\n", - " cosmo, dndz=(z, dndz), ia_bias=(z, np.ones_like(z) * a_ia)\n", - ")\n", - "\n", - "# COmpute the angular power spectrum C_ell\n", - "ell = np.logspace(0, np.log10(10000), 2000)\n", - "cl_gg = ccl.angular_cl(cosmo, tracer, tracer, ell)\n", - "\n", - "# Compute the 2PCF\n", - "theta_deg = theta_arcmin / 60\n", - "# xi+ fit\n", - "xi_p_theta_fit_IA = ccl.correlation(\n", - " cosmo, ell=ell, C_ell=cl_gg, theta=theta_deg, type=\"GG+\"\n", - ")\n", - "# xi- fit\n", - "xi_m_theta_fit_IA = ccl.correlation(\n", - " cosmo, ell=ell, C_ell=cl_gg, theta=theta_deg, type=\"GG-\"\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "23", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "\n", - "plt.subplot(211)\n", - "\n", - "plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(theta_arcmin, xi_p_theta_fit, label=\"SP_v1.4.5 fit\", color=\"red\")\n", - "plt.plot(theta_arcmin, xi_p_theta_true, label=\"SP_v1.4.5 true\", color=\"blue\")\n", - "plt.plot(theta_arcmin, xi_p_theta_fit_IA, label=\"SP_v1.4.5 fit IA\", color=\"green\")\n", - "\n", - "plt.ylabel(r\"$\\xi_{+}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(3.0, color=\"grey\", linestyle=\"--\", label=\"3 arcmin\")\n", - "plt.axvline(100.0, color=\"grey\", linestyle=\"--\", label=\"100 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(212)\n", - "\n", - "plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(theta_arcmin, xi_m_theta_fit, label=\"SP_v1.4.5 fit\", color=\"red\")\n", - "plt.plot(theta_arcmin, xi_m_theta_true, label=\"SP_v1.4.5 true\", color=\"blue\")\n", - "plt.plot(theta_arcmin, xi_m_theta_fit_IA, label=\"SP_v1.4.5 fit IA\", color=\"green\")\n", - "\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - "plt.ylabel(r\"$\\xi_{-}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(10.0, color=\"grey\", linestyle=\"--\", label=\"10 arcmin\")\n", - "plt.axvline(200.0, color=\"grey\", linestyle=\"--\", label=\"200 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "24", - "metadata": {}, - "outputs": [], - "source": [ - "# Add best-fit model\n", - "root_dir = \"/n09data/guerrini/output_chains/output_result/glass_mock_1/\"\n", - "xi_plus_bf_no_psf = np.loadtxt(root_dir + \"best_fit/shear_xi_plus/bin_1_1.txt\")\n", - "xi_minus_bf_no_psf = np.loadtxt(root_dir + \"best_fit/shear_xi_minus/bin_1_1.txt\")\n", - "xi_sys_p = np.loadtxt(root_dir + \"best_fit/xi_sys/shear_xi_plus.txt\")\n", - "xi_sys_m = np.loadtxt(root_dir + \"best_fit/xi_sys/shear_xi_minus.txt\")\n", - "theta_xi_sys = np.loadtxt(root_dir + \"best_fit/xi_sys/theta.txt\")\n", - "theta_xi_sys = theta_xi_sys * 180 * 60 / np.pi\n", - "angle = np.loadtxt(root_dir + \"best_fit/shear_xi_plus/theta.txt\")\n", - "angle = angle * 180 * 60 / np.pi\n", - "\n", - "mask = (angle < 250) & (angle > 0.1)\n", - "\n", - "from scipy.interpolate import interp1d\n", - "\n", - "xi_sys_p_interp = interp1d(\n", - " theta_xi_sys, xi_sys_p, kind=\"linear\", fill_value=\"extrapolate\"\n", - ")\n", - "xi_sys_m_interp = interp1d(\n", - " theta_xi_sys, xi_sys_m, kind=\"linear\", fill_value=\"extrapolate\"\n", - ")\n", - "xi_plus_bf = xi_plus_bf_no_psf[mask] + xi_sys_p_interp(angle[mask])\n", - "xi_minus_bf = xi_minus_bf_no_psf[mask] + xi_sys_m_interp(angle[mask])\n", - "\n", - "xi_plus_bf_no_baryons = np.loadtxt(\n", - " root_dir + \"best_fit_no_feedback/shear_xi_plus/bin_1_1.txt\"\n", - ")\n", - "xi_minus_bf_no_baryons = np.loadtxt(\n", - " root_dir + \"best_fit_no_feedback/shear_xi_minus/bin_1_1.txt\"\n", - ")\n", - "\n", - "xi_plus_bf_no_IA = np.loadtxt(root_dir + \"best_fit_no_IA/shear_xi_plus/bin_1_1.txt\")\n", - "xi_minus_bf_no_IA = np.loadtxt(root_dir + \"best_fit_no_IA/shear_xi_minus/bin_1_1.txt\")\n", - "\n", - "xi_plus_truth_cosmosis = np.loadtxt(root_dir + \"/truth/shear_xi_plus/bin_1_1.txt\")\n", - "xi_minus_truth_cosmosis = np.loadtxt(root_dir + \"/truth/shear_xi_minus/bin_1_1.txt\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "25", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "\n", - "plt.subplot(211)\n", - "\n", - "plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - ")\n", - "plt.plot(theta_arcmin, xi_p_theta_true, label=\"SP_v1.4.5 true\", color=\"blue\")\n", - "plt.plot(angle[mask], xi_plus_bf, label=\"SP_v1.4.5 COSMOSIS\", color=\"orange\")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_plus_bf_no_psf[mask],\n", - " label=\"SP_v1.4.5 COSMOSIS no PSF\",\n", - " color=\"green\",\n", - ")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_plus_bf_no_baryons[mask],\n", - " label=\"SP_v1.4.5 COSMOSIS no baryons\",\n", - " color=\"red\",\n", - ")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_plus_bf_no_IA[mask],\n", - " label=\"SP_v1.4.5 COSMOSIS no IA\",\n", - " color=\"purple\",\n", - ")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_plus_truth_cosmosis[mask],\n", - " label=\"SP_v1.4.5 COSMOSIS truth\",\n", - " color=\"black\",\n", - " linestyle=\"--\",\n", - ")\n", - "\n", - "plt.ylabel(r\"$\\xi_{+}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(3.0, color=\"grey\", linestyle=\"--\", label=\"3 arcmin\")\n", - "plt.axvline(150.0, color=\"grey\", linestyle=\"--\", label=\"150 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(212)\n", - "\n", - "plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - " markersize=2,\n", - ")\n", - "plt.plot(theta_arcmin, xi_m_theta_true, label=\"SP_v1.4.5 true\", color=\"blue\")\n", - "plt.plot(angle[mask], xi_minus_bf, label=\"SP_v1.4.5 COSMOSIS\", color=\"orange\")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_minus_bf_no_psf[mask],\n", - " label=\"SP_v1.4.5 COSMOSIS no PSF\",\n", - " color=\"green\",\n", - ")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_minus_bf_no_baryons[mask],\n", - " label=\"SP_v1.4.5 COSMOSIS no baryons\",\n", - " color=\"red\",\n", - ")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_minus_bf_no_IA[mask],\n", - " label=\"SP_v1.4.5 COSMOSIS no IA\",\n", - " color=\"purple\",\n", - ")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_minus_truth_cosmosis[mask],\n", - " label=\"SP_v1.4.5 COSMOSIS truth\",\n", - " color=\"black\",\n", - " linestyle=\"--\",\n", - ")\n", - "\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - "plt.ylabel(r\"$\\xi_{-}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(10.0, color=\"grey\", linestyle=\"--\", label=\"10 arcmin\")\n", - "plt.axvline(200.0, color=\"grey\", linestyle=\"--\", label=\"200 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "26", - "metadata": {}, - "outputs": [], - "source": [ - "import treecorr\n", - "\n", - "theta_min = 0.1\n", - "theta_max = 250.0\n", - "nbins = 20\n", - "var_method = \"jackknife\"\n", - "\n", - "treecorr_config = {\n", - " \"ra_units\": \"degrees\",\n", - " \"dec_units\": \"degrees\",\n", - " \"min_sep\": theta_min,\n", - " \"max_sep\": theta_max,\n", - " \"sep_units\": \"arcmin\",\n", - " \"nbins\": nbins,\n", - " \"var_method\": var_method,\n", - "}\n", - "\n", - "gg = treecorr.GGCorrelation(treecorr_config)\n", - "\n", - "# Load the measurement\n", - "cat = fits.getdata(\n", - " \"/n09data/guerrini/glass_mock/results/unions_glass_sim_00001_4096.fits\"\n", - ")\n", - "\n", - "e1 = cat[\"e1\"]\n", - "e2 = cat[\"e2\"]\n", - "ra = cat[\"ra\"]\n", - "dec = cat[\"dec\"]\n", - "\n", - "# Create the catalog\n", - "cat = treecorr.Catalog(\n", - " ra=ra, dec=dec, ra_units=\"degrees\", dec_units=\"degrees\", g1=e1, g2=e2, npatch=200\n", - ")\n", - "\n", - "# Process the catalog\n", - "gg.process(cat)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "27", - "metadata": {}, - "outputs": [], - "source": [ - "cov = treecorr.estimate_multi_cov([gg], method=\"jackknife\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "28", - "metadata": {}, - "outputs": [], - "source": [ - "data_vector_sim = []\n", - "\n", - "for ver in [f\"SP_v1.4.5_glass_mock_{i}\" for i in range(1, 17)]:\n", - " data = fits.open(\n", - " f\"/home/guerrini/sp_validation/cosmo_inference/data/{ver}/cosmosis_{ver}.fits\"\n", - " )\n", - " xi_plus = data[\"XI_PLUS\"].data\n", - " xi_minus = data[\"XI_MINUS\"].data\n", - " data_vector_sim.append(np.concatenate((xi_plus[\"VALUE\"], xi_minus[\"VALUE\"])))\n", - "\n", - "data_vector_sim = np.array(data_vector_sim)\n", - "\n", - "data_vector_sim.shape" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "29", - "metadata": {}, - "outputs": [], - "source": [ - "cov_sim = np.cov(data_vector_sim.T)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "30", - "metadata": {}, - "outputs": [], - "source": [ - "ver_sacha = \"SP_v1.4.5\"\n", - "\n", - "cov_th_sacha = np.loadtxt(\n", - " \"/home/guerrini/sp_validation/cosmo_inference/data/{}/covs/cov_{}.txt\".format(\n", - " ver_sacha, ver_sacha\n", - " )\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "31", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure()\n", - "\n", - "plt.plot(xi_plus[\"ANG\"], np.diag(cov)[:20])\n", - "plt.plot(xi_plus[\"ANG\"], np.diag(cov_sim)[:20], label=\"SP_v1.4.5 data\", color=\"red\")\n", - "plt.plot(\n", - " xi_plus[\"ANG\"], np.diag(cov_th_sacha)[:20], label=\"SP_v1.4.5 data\", color=\"green\"\n", - ")\n", - "plt.plot(xi_plus[\"ANG\"], np.diag(cov_mat)[:20], label=\"SP_v1.4.5 data\", color=\"black\")\n", - "\n", - "plt.ylabel(\"Diagonal of the covariance\")\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - "\n", - "plt.yscale(\"log\")\n", - "plt.xscale(\"log\")\n", - "plt.savefig(\"check_cov.png\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "32", - "metadata": {}, - "outputs": [], - "source": [ - "gg.varxip" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "33", - "metadata": {}, - "outputs": [], - "source": [ - "np.sqrt(gg.varxip)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "34", - "metadata": {}, - "outputs": [], - "source": [ - "np.sqrt(np.diag(cov_mat)[0:20])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "35", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "\n", - "plt.subplot(211)\n", - "\n", - "plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(angle[mask], xi_plus_bf[mask], label=\"Best-fit model\", color=\"red\")\n", - "\n", - "plt.ylabel(r\"$\\xi_{+}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(3.0, color=\"grey\", linestyle=\"--\", label=\"3 arcmin\")\n", - "plt.axvline(100.0, color=\"grey\", linestyle=\"--\", label=\"100 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(212)\n", - "\n", - "plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(angle[mask], xi_minus_bf[mask], label=\"Best-fit model\", color=\"red\")\n", - "\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - "plt.ylabel(r\"$\\xi_{-}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(10.0, color=\"grey\", linestyle=\"--\", label=\"10 arcmin\")\n", - "plt.axvline(200.0, color=\"grey\", linestyle=\"--\", label=\"200 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.savefig(\"xi_data_bf.png\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "36", - "metadata": {}, - "outputs": [], - "source": [ - "# Add PSF systematic\n", - "xi_sys_plus = np.loadtxt(root_dir + \"/xi_sys/shear_xi_plus.txt\")\n", - "xi_sys_minus = np.loadtxt(root_dir + \"/xi_sys/shear_xi_minus.txt\")\n", - "theta_sys = np.loadtxt(root_dir + \"/xi_sys/theta.txt\")\n", - "theta_sys = theta_sys * 180 * 60 / np.pi" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "37", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "\n", - "plt.subplot(211)\n", - "\n", - "plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(angle[mask], xi_plus_bf[mask], label=\"Best-fit model wo SYS\", color=\"red\")\n", - "plt.plot(theta_sys, xi_sys_plus, label=r\"$\\xi_{\\rm sys}$\", color=\"green\")\n", - "\n", - "plt.ylabel(r\"$\\xi_{+}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(3.0, color=\"grey\", linestyle=\"--\", label=\"3 arcmin\")\n", - "plt.axvline(100.0, color=\"grey\", linestyle=\"--\", label=\"100 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(212)\n", - "\n", - "plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(angle[mask], xi_minus_bf[mask], label=\"Best-fit model wo SYS\", color=\"red\")\n", - "plt.plot(theta_sys, xi_sys_minus, label=r\"$\\xi_{\\rm sys}$\", color=\"green\")\n", - "\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - "plt.ylabel(r\"$\\xi_{-}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(10.0, color=\"grey\", linestyle=\"--\", label=\"10 arcmin\")\n", - "plt.axvline(200.0, color=\"grey\", linestyle=\"--\", label=\"200 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.savefig(\"xi_data_bf_sys.png\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "38", - "metadata": {}, - "outputs": [], - "source": [ - "shear_cl = np.loadtxt(root_dir + \"/shear_cl/bin_1_1.txt\")\n", - "shear_cl_gg = np.loadtxt(root_dir + \"/shear_cl_gg/bin_1_1.txt\")\n", - "shear_cl_gi = np.loadtxt(root_dir + \"/shear_cl_gi/bin_1_1.txt\")\n", - "shear_cl_ii = np.loadtxt(root_dir + \"/shear_cl_ii/bin_1_1.txt\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "39", - "metadata": {}, - "outputs": [], - "source": [ - "A = 3.355083374185272\n", - "np.isclose(shear_cl, shear_cl_gg + 2 * shear_cl_gi + shear_cl_ii)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "40", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "41", - "metadata": {}, - "outputs": [], - "source": [ - "# Add the lensing part without intrinsic alignment\n", - "root_dir = \"/n09data/guerrini/output_chains/test_pipeline/\"\n", - "xi_plus_wo_ia = np.loadtxt(root_dir + \"/shear_xi_plus_wo_IA/bin_1_1.txt\")\n", - "xi_minus_wo_ia = np.loadtxt(root_dir + \"/shear_xi_minus_wo_IA/bin_1_1.txt\")\n", - "angle = np.loadtxt(root_dir + \"/shear_xi_plus_wo_IA/theta.txt\")\n", - "angle = angle * 180 * 60 / np.pi\n", - "\n", - "mask = (angle < 250) & (angle > 0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "42", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "\n", - "plt.subplot(211)\n", - "\n", - "plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(angle[mask], xi_plus_bf[mask], label=\"Best-fit model wo SYS\", color=\"red\")\n", - "plt.plot(theta_sys, xi_sys_plus, label=r\"$\\xi_{\\rm sys}$\", color=\"green\")\n", - "plt.plot(\n", - " angle[mask], xi_plus_wo_ia[mask], label=\"Best-fit model wo IA and SYS\", color=\"blue\"\n", - ")\n", - "\n", - "plt.ylabel(r\"$\\xi_{+}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(3.0, color=\"grey\", linestyle=\"--\", label=\"3 arcmin\")\n", - "plt.axvline(100.0, color=\"grey\", linestyle=\"--\", label=\"100 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(212)\n", - "\n", - "plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(angle[mask], xi_minus_bf[mask], label=\"Best-fit model wo SYS\", color=\"red\")\n", - "plt.plot(theta_sys, xi_sys_minus, label=r\"$\\xi_{\\rm sys}$\", color=\"green\")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_minus_wo_ia[mask],\n", - " label=\"Best-fit model wo IA and SYS\",\n", - " color=\"blue\",\n", - ")\n", - "\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - "plt.ylabel(r\"$\\xi_{-}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(10.0, color=\"grey\", linestyle=\"--\", label=\"10 arcmin\")\n", - "plt.axvline(200.0, color=\"grey\", linestyle=\"--\", label=\"200 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.savefig(\"xi_data_bf_sys_ia.png\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "43", - "metadata": {}, - "outputs": [], - "source": [ - "# Add the lensing part without intrinsic alignment\n", - "root_dir = \"/n09data/guerrini/output_chains/test_pipeline/\"\n", - "xi_plus_reas = np.loadtxt(root_dir + \"/shear_xi_plus/bin_1_1.txt\")\n", - "xi_minus_reas = np.loadtxt(root_dir + \"/shear_xi_minus/bin_1_1.txt\")\n", - "angle_reas = np.loadtxt(root_dir + \"/shear_xi_plus/theta.txt\")\n", - "angle_reas = angle_reas * 180 * 60 / np.pi\n", - "\n", - "mask = (angle < 250) & (angle > 0.1)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "44", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "\n", - "plt.subplot(211)\n", - "\n", - "plt.errorbar(\n", - " xi_plus[\"ANG\"],\n", - " xi_plus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[:20],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(angle[mask], xi_plus_bf[mask], label=\"Best-fit model wo SYS\", color=\"red\")\n", - "plt.plot(theta_sys, xi_sys_plus, label=r\"$\\xi_{\\rm sys}$\", color=\"green\")\n", - "plt.plot(\n", - " angle[mask], xi_plus_wo_ia[mask], label=\"Best-fit model wo IA and SYS\", color=\"blue\"\n", - ")\n", - "plt.plot(\n", - " angle_reas[mask],\n", - " xi_plus_reas[mask],\n", - " label=\"Lower IA\",\n", - " color=\"orange\",\n", - " linestyle=\"--\",\n", - ")\n", - "\n", - "plt.ylabel(r\"$\\xi_{+}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(3.0, color=\"grey\", linestyle=\"--\", label=\"3 arcmin\")\n", - "plt.axvline(100.0, color=\"grey\", linestyle=\"--\", label=\"100 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.subplot(212)\n", - "\n", - "plt.errorbar(\n", - " xi_minus[\"ANG\"],\n", - " xi_minus[\"VALUE\"],\n", - " yerr=np.sqrt(np.diag(cov_mat))[20:40],\n", - " fmt=\"o\",\n", - " label=\"SP_v1.4.5 data\",\n", - " color=\"black\",\n", - ")\n", - "plt.plot(angle[mask], xi_minus_bf[mask], label=\"Best-fit model wo SYS\", color=\"red\")\n", - "plt.plot(theta_sys, xi_sys_minus, label=r\"$\\xi_{\\rm sys}$\", color=\"green\")\n", - "plt.plot(\n", - " angle[mask],\n", - " xi_minus_wo_ia[mask],\n", - " label=\"Best-fit model wo IA and SYS\",\n", - " color=\"blue\",\n", - ")\n", - "plt.plot(\n", - " angle_reas[mask],\n", - " xi_minus_reas[mask],\n", - " label=\"Lower IA\",\n", - " color=\"orange\",\n", - " linestyle=\"--\",\n", - ")\n", - "\n", - "plt.xlabel(r\"$\\theta$ [arcmin]\")\n", - "plt.ylabel(r\"$\\xi_{-}$\")\n", - "plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "plt.axvline(10.0, color=\"grey\", linestyle=\"--\", label=\"10 arcmin\")\n", - "plt.axvline(200.0, color=\"grey\", linestyle=\"--\", label=\"200 arcmin\")\n", - "plt.legend()\n", - "\n", - "plt.savefig(\"xi_data_bf_sys_ia_reas.png\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "45", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "base", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/cosmo_inference/notebooks/get_prior_psf_leakage.ipynb b/cosmo_inference/notebooks/get_prior_psf_leakage.ipynb deleted file mode 100644 index 1dae9a36..00000000 --- a/cosmo_inference/notebooks/get_prior_psf_leakage.ipynb +++ /dev/null @@ -1,269 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "0", - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "if not os.path.exists(\"./Plots\"):\n", - " os.makedirs(\"./Plots\")\n", - "\n", - "# Trick to plot with tex\n", - "os.environ[\"LD_LIBRARY_PATH\"] = \"\"\n", - "os.environ[\"CONDA_PREFIX\"] = \"/home/guerrini/.conda/envs/sp_validation_3.11\"\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "import seaborn as sns\n", - "from astropy.io import fits\n", - "from getdist import MCSamples, plots\n", - "from shear_psf_leakage.rho_tau_stat import PSFErrorFit, RhoStat, TauStat\n", - "\n", - "# Use paper style and seaborn with husl palette\n", - "plt.style.use(\"/home/guerrini/matplotlib_config/paper.mplstyle\")\n", - "# Set default palette - will be updated per plot as needed\n", - "sns.set_palette(\"husl\")\n", - "%matplotlib inline\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 25" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "1", - "metadata": {}, - "outputs": [], - "source": [ - "data_path = \"/home/guerrini/sp_validation/cosmo_inference/data/\"\n", - "\n", - "path_cosmo_val = \"/home/guerrini/sp_validation/cosmo_val/output/\"\n", - "\n", - "roots_cosmo_val = [\"SP_v1.4.6\", \"SP_v1.4.6_leak_corr\"]\n", - "\n", - "roots = [\"SP_v1.4.6_no_leak_corr_A_masked\", \"SP_v1.4.6_leak_corr_A_masked\"]\n", - "\n", - "labels = [\"SP_v1.4.6_A\", \"SP_v1.4.6_A leakage corrected\"]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "2", - "metadata": {}, - "outputs": [], - "source": [ - "data_vectors = []\n", - "\n", - "for root in roots:\n", - " data_vectors.append(fits.open(data_path + root + f\"/cosmosis_{root}.fits\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3", - "metadata": {}, - "outputs": [], - "source": [ - "def cov_to_corr(cov):\n", - " \"\"\"Convert a covariance matrix to a correlation matrix.\"\"\"\n", - " d = np.sqrt(np.diag(cov))\n", - " corr = cov / np.outer(d, d)\n", - " corr[cov == 0] = 0\n", - " return corr" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4", - "metadata": {}, - "outputs": [], - "source": [ - "# Print the covariance matrix for each root\n", - "for i, root in enumerate(roots):\n", - " print(f\"Covariance matrix for {labels[i]}:\")\n", - " cov = data_vectors[i][\"COVMAT\"].data\n", - "\n", - " n_bins = cov.shape[0] // 4\n", - "\n", - " fig, ax = plt.subplots(figsize=(10, 8))\n", - "\n", - " im = ax.imshow(cov_to_corr(cov), vmin=-1, vmax=1, cmap=\"seismic\")\n", - " ax.set_aspect(\"equal\")\n", - " ax.set_yticks(np.array([10, 30, 50, 70]))\n", - " ax.set_yticklabels(\n", - " [\n", - " r\"$\\xi_+(\\vartheta)$\",\n", - " r\"$\\xi_-(\\vartheta)$\",\n", - " r\"$\\tau_0(\\vartheta)$\",\n", - " r\"$\\tau_2(\\vartheta)$\",\n", - " ]\n", - " )\n", - " ax.set_xticks(np.array([10, 30, 50, 70]))\n", - " ax.set_xticklabels(\n", - " [\n", - " r\"$\\xi_+(\\vartheta)$\",\n", - " r\"$\\xi_-(\\vartheta)$\",\n", - " r\"$\\tau_0(\\vartheta)$\",\n", - " r\"$\\tau_2(\\vartheta)$\",\n", - " ],\n", - " rotation=45,\n", - " )\n", - " fig.colorbar(im, ax=ax)\n", - "\n", - " plt.savefig(f\"./Plots/cov_matrix_{root}.png\", bbox_inches=\"tight\", dpi=300)\n", - " plt.show()\n", - " print(\"\\n\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5", - "metadata": {}, - "outputs": [], - "source": [ - "# Create dummy rho and tau stat handler.\n", - "\n", - "# Inference of the xi_sys parameters\n", - "sep_units = \"arcmin\"\n", - "coord_units = \"degrees\"\n", - "theta_min = 1.0\n", - "theta_max = 250\n", - "nbins = 20\n", - "\n", - "\n", - "TreeCorrConfig_xi = {\n", - " \"ra_units\": coord_units,\n", - " \"dec_units\": coord_units,\n", - " \"min_sep\": theta_min,\n", - " \"max_sep\": theta_max,\n", - " \"sep_units\": sep_units,\n", - " \"nbins\": nbins,\n", - " \"var_method\": \"jackknife\",\n", - "}\n", - "\n", - "rho_stats_handler = RhoStat(output=\".\", treecorr_config=TreeCorrConfig_xi, verbose=True)\n", - "\n", - "tau_stats_handler = TauStat(\n", - " catalogs=rho_stats_handler.catalogs,\n", - " output=\".\",\n", - " treecorr_config=TreeCorrConfig_xi,\n", - " verbose=True,\n", - ")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6", - "metadata": {}, - "outputs": [], - "source": [ - "# Create a PSFErrorFit instance\n", - "psf_fitter = PSFErrorFit(\n", - " rho_stats_handler,\n", - " tau_stats_handler,\n", - " path_cosmo_val + \"rho_tau_stats/\",\n", - " use_eta=False,\n", - ")\n", - "\n", - "\n", - "def load_matrix_and_cut(root, root_cosmo_val, type=\"rho\"):\n", - " if type == \"rho\":\n", - " cov = np.load(f\"{root}/cov_rho_{root_cosmo_val}.npy\")\n", - " nbins = cov.shape[0] // 6\n", - " cov = cov[: nbins * 3, : nbins * 3]\n", - " np.save(f\"{root}/cov_rho_{root_cosmo_val}_cut.npy\", cov)\n", - " elif type == \"tau\":\n", - " cov = np.load(f\"{root}/cov_tau_{root_cosmo_val}_th.npy\")\n", - " nbins = cov.shape[0] // 3\n", - " cov = cov[: nbins * 2, : nbins * 2]\n", - " np.save(f\"{root}/cov_tau_{root_cosmo_val}_th_cut.npy\", cov)\n", - " else:\n", - " raise ValueError(\"type must be 'rho' or 'tau'\")\n", - "\n", - "\n", - "g = plots.get_subplot_plotter(width_inch=30)\n", - "\n", - "g.settings.axes_fontsize = 30\n", - "g.settings.axes_labelsize = 30\n", - "g.settings.alpha_filled_add = 0.7\n", - "g.settings.legend_fontsize = 40\n", - "\n", - "chains = []\n", - "\n", - "# Load rho-, tau-statistics, and cov_tau from the data_vector\n", - "for i, root_cosmo_val in enumerate(roots_cosmo_val):\n", - " print(\"Sampling PSF parameters for \", labels[i])\n", - " path_rho = f\"rho_stats_{root_cosmo_val}.fits\"\n", - " path_tau = f\"tau_stats_{root_cosmo_val}.fits\"\n", - " path_cov_rho = f\"cov_rho_{root_cosmo_val}.npy\"\n", - " path_cov_tau = f\"cov_tau_{root_cosmo_val}_th.npy\"\n", - "\n", - " load_matrix_and_cut(path_cosmo_val + \"/rho_tau_stats/\", root_cosmo_val, type=\"rho\")\n", - " load_matrix_and_cut(path_cosmo_val + \"/rho_tau_stats/\", root_cosmo_val, type=\"tau\")\n", - " path_cov_rho = f\"cov_rho_{root_cosmo_val}_cut.npy\"\n", - " path_cov_tau = f\"cov_tau_{root_cosmo_val}_th_cut.npy\"\n", - "\n", - " psf_fitter.load_rho_stat(path_rho)\n", - " psf_fitter.load_tau_stat(path_tau)\n", - " psf_fitter.load_covariance(path_cov_rho, cov_type=\"rho\")\n", - " psf_fitter.load_covariance(path_cov_tau, cov_type=\"tau\")\n", - " samples_lq, _, _ = psf_fitter.get_least_squares_params_samples(\n", - " npatch=None, apply_debias=False\n", - " )\n", - "\n", - " samples_gd = MCSamples(\n", - " samples=samples_lq, names=[r\"\\alpha\", r\"\\beta\"], labels=[r\"\\alpha\", r\"\\beta\"]\n", - " )\n", - "\n", - " chains.append(samples_gd)\n", - "\n", - "g.triangle_plot(chains, filled=True, legend_labels=labels, legend_loc=\"upper right\")\n", - "\n", - "plt.savefig(\"./Plots/psf_leakage_params.png\", bbox_inches=\"tight\", dpi=300)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "sp_validation_3.11", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.0" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/cosmo_inference/pipeline.sh b/cosmo_inference/pipeline.sh deleted file mode 100755 index f853d511..00000000 --- a/cosmo_inference/pipeline.sh +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/bash - -# Transform long options to short ones -for arg in "$@"; do - shift - case "$arg" in - '--help') set -- "$@" '-h' ;; - '--pcf') set -- "$@" '-p' ;; - '--covmat') set -- "$@" '-c' ;; - '--inference') set -- "$@" '-i' ;; - '--mcmc_process') set -- "$@" '-m' ;; - *) set -- "$@" "$arg" ;; - esac -done - -# Parse short options -OPTIND=1 -while getopts "hpcim" opt -do - case "$opt" in - 'h') - echo "Please input a flag: --help, --pcf, --covmat, --inference or --mcmc_process "; - exit 0 - ;; - 'p') - echo "Running cosmo_val.py to calculate 2 point correlation functions"; - python cosmo_val/cosmo_val.py - ;; - 'c') - read -p 'COVARIANCE FILE: ' covmat_file; - read -p 'OUTPUT STUB (without extension): ' output_stub; - echo "Processing covariance matrix"; - python scripts/cosmocov_process.py $covmat_file $output_stub - ;; - 'i') - read -p 'XI ROOT: ' xi_root; - read -p 'TAU ROOT: ' tau_root; - read -p 'COSMOSIS ROOT: ' cosmosis_root; - read -p 'COSMO_VAL OUTPUT FOLDER: ' output_folder; - read -p 'NZ FILE:' nz_file; - read -p 'OUTPUT MCMC CHAIN FOLDER: ' data; - read -p 'USE PSEUDO_CELL? (y/n): ' pseudo_cell; - - if [ "${pseudo_cell}" == "y" ]; then - echo "Using pseudo cell" - - out_file="data/${root}/cosmosis_${root}_cell.fits" - - # Create the folder if it does not exist - if [ ! -d "data/$root" ]; then - mkdir -p "data/$root" - echo "Directory 'data/$root' created." - else - echo "Directory 'data/$root' already exists." - fi - - python scripts/cosmosis_fitting.py $root $output_folder $nz_file $pseudo_cell $out_file - else - - read -p 'USE RHO/TAU_STATS? (y/n): ' rhotau_stats; - echo $rhotau_stats - read -p 'COV_XI MAT TXT FILE:' covmat; - - out_file="data/${root}/cosmosis_${root}.fits"; - - # Create the folder if it does not exist - if [ ! -d "data/$root" ]; then - mkdir -p "data/$root" - echo "Directory 'data/$root' created." - else - echo "Directory 'data/$root' already exists." - fi - - #LG: add check if xi_plus/xi_minus fits file exists - python scripts/cosmosis_fitting.py $root $output_folder $nz_file $pseudo_cell $out_file $covmat $rhotau_stats; - - fi - - if [ "${pseudo_cell}" == "y" ]; then - output_ini_file="cosmosis_config/cosmosis_pipeline_${root}_cell.ini" - cp cosmosis_config/cosmosis_pipeline_A_ia_cell.ini $output_ini_file - else - output_ini_file="cosmosis_config/cosmosis_pipeline_${root}.ini" - if [ "${rhotau_stats}" == "y" ]; then - cp cosmosis_config/cosmosis_pipeline_A_psf.ini $output_ini_file; - else - cp cosmosis_config/cosmosis_pipeline_A_ia.ini $output_ini_file; - fi - fi - - sed -i "/^\[DEFAULT\]/a\SCRATCH = ${data}" $output_ini_file; - sed -i "/^\[DEFAULT\]/a\FITS_FILE = ${out_file}" $output_ini_file; - if [ "${pseudo_cell}" == "y" ]; then - sed -i "/^\[output\]/a\filename = %(SCRATCH)s/${root}_cell/samples_${root}_cell.txt" $output_ini_file; - sed -i "/^\[pipeline\]/a\values = cosmosis_config/values_ia.ini" $output_ini_file; - sed -i "/^\[pipeline\]/a\priors = cosmosis_config/priors.ini" $output_ini_file; - sed -i "/^\[2pt_like]/a\file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py" $output_ini_file; - sed -i "/^\[2pt_like]/a\data_sets=CELL_EE" $output_ini_file; - sed -i "/^\[polychord\]/a\polychord_outfile_root = ${root}_cell" $output_ini_file; - sed -i "/^\[test\]/a\save_dir = %(SCRATCH)s/best_fit/${root}_cell" $output_ini_file; - else - sed -i "/^\[output\]/a\filename = %(SCRATCH)s/${root}/samples_${root}.txt" $output_ini_file; - if [ "${rhotau_stats}" == "y" ]; then - sed -i "/^\[pipeline\]/a\values = cosmosis_config/values_psf.ini" $output_ini_file; - sed -i "/^\[pipeline\]/a\priors = cosmosis_config/priors_psf.ini" $output_ini_file; - sed -i "/^\[2pt_like]/a\file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like_xi_sys.py" $output_ini_file; - sed -i "/^\[2pt_like]/a\data_sets=XI_PLUS XI_MINUS TAU_0_PLUS TAU_2_PLUS" $output_ini_file; - sed -i "/^\[2pt_like]/a\add_xi_sys=T" $output_ini_file; - else - sed -i "/^\[pipeline\]/a\values = cosmosis_config/values_ia.ini" $output_ini_file; - sed -i "/^\[pipeline\]/a\priors = cosmosis_config/priors.ini" $output_ini_file; - sed -i "/^\[2pt_like]/a\file = %(COSMOSIS_DIR)s/likelihood/2pt/2pt_like.py" $output_ini_file; - sed -i "/^\[2pt_like]/a\data_sets=XI_PLUS XI_MINUS" $output_ini_file; - fi - sed -i "/^\[polychord\]/a\polychord_outfile_root = ${root}" $output_ini_file; - sed -i "/^\[test\]/a\save_dir = %(SCRATCH)s/best_fit/${root}" $output_ini_file; - fi - echo "Prepared CosmoSIS configuration file in $output_ini_file"; - echo "You can now run the inference with the command: cosmosis $output_ini_file" - ;; - 'm') - # LG: also convert this into a script to directly output contour plots - echo "Run the cosmo_inference/notebooks/MCMC.ipynb notebook to analyse your chains" - ;; - '?') - print_usage >&2; - exit 1 - ;; - esac -done -shift $(expr $OPTIND - 1) # remove options from positional parameters \ No newline at end of file diff --git a/cosmo_inference/scripts/2pt_like_xi_sys.py b/cosmo_inference/scripts/2pt_like_xi_sys.py deleted file mode 100644 index 93f11bd3..00000000 --- a/cosmo_inference/scripts/2pt_like_xi_sys.py +++ /dev/null @@ -1,614 +0,0 @@ -import gaussian_covariance -import numpy as np -import twopoint -from astropy.io import fits -from cosmosis.datablock import SectionOptions, names -from cosmosis.gaussian_likelihood import GaussianLikelihood -from scipy.interpolate import interp1d -from spec_tools import TheorySpectrum -from twopoint_cosmosis import theory_names, type_table - -default_array = np.repeat(-1.0, 99) - - -# To copy in cosmosis-standard-library/likelihood -def is_default(x): - return len(x) == len(default_array) and (x == default_array).all() - - -def convert_nz_steradian(n): - return n * (41253.0 * 60.0 * 60.0) / (4 * np.pi) - - -class TwoPointLikelihood(GaussianLikelihood): - # This is a sub-class of the class GaussianLikelihood - # which can be found in the file ${COSMOSIS_SRC_DIR}/cosmosis/gaussian_likelihood.py - # That super-class implements the generic behaviour that all Gaussian likelihoods - # follow - the basic form of the likelihoods, inverting covariance matrices, saving - # results, etc. This sub-clas does the parts that are specific to this 2-pt - # likelihood - loading data from a file, getting the specific theory prediction - # to which to compare it, etc. - like_name = "2pt" - - def __init__(self, options): - # We may decide to use an analytic gaussian covariance - # in that case we won't load the covmat. - self.gaussian_covariance = options.get_bool("gaussian_covariance", False) - if self.gaussian_covariance: - self.constant_covariance = False - - self.moped = options.get_string("moped", default="") - - super(TwoPointLikelihood, self).__init__(options) - - self.raw_data_x, self.raw_data_y = self.build_data() - - if self.moped: - print( - "Using compressed data from MOPED algorithm: {} data points".format( - len(self.moped_data) - ) - ) - if self.sellentin: - raise ValueError( - "Sellentin mode is incompatible with Moped mode in 2pt like" - ) - - def build_data(self): - filename = self.options.get_string("data_file") - - # Suffixes to added on to two point data from e.g. different experiments - suffix_string = self.options.get_string("suffixes", default="") - if suffix_string == "": - # If there are no suffixes provided, then we create a list of a single empty suffix - suffixes = [""] - else: - suffixes_temp = suffix_string.split() - suffixes = [] - for suffix in suffixes_temp: - if suffix.lower() == "none": - suffixes.append("") - else: - suffixes.append("_" + suffix) - self.suffixes = suffixes - - if self.gaussian_covariance: - covmat_name = None - area = self.options.get_double("survey_area") # in square degrees - self.sky_area = area * (np.pi * np.pi) / (180 * 180) - - def get_arr(x): - if self.options.has_value(x): - a = self.options[x] - if not isinstance(a, np.ndarray): - a = [a] - else: - a = default_array - return a - - self.number_density_shear_bin = get_arr("number_density_shear_bin") - self.number_density_lss_bin = get_arr("number_density_lss_bin") - self.sigma_e_bin = get_arr("sigma_e_bin") - - else: - covmat_name = self.options.get_string("covmat_name", "COVMAT") - - # This is the main work - read data in from the file - self.two_point_data = twopoint.TwoPointFile.from_fits(filename, covmat_name) - - # Potentially cut out lines. For some reason one version of - # this file used zeros to mark masked values. - if self.options.get_bool("cut_zeros", default=False): - print("Removing 2-point values with value=0.0") - self.two_point_data.mask_bad(0.0) - - if self.options.get_bool("cut_cross", default=False): - print("Removing 2-point values from cross-bins") - self.two_point_data.mask_cross() - - # All the names of two-points measurements that were found in the data - # file - all_names = [spectrum.name for spectrum in self.two_point_data.spectra] - - # We may not want to use all the likelihoods in the file. - # We can set an option to only use some of them - data_sets = self.options.get_string("data_sets", default="all") - if data_sets != "all": - data_sets = data_sets.split() - self.two_point_data.choose_data_sets(data_sets) - - # The ones we actually used. - self.used_names = [spectrum.name for spectrum in self.two_point_data.spectra] - - # Check for scale cuts. In general, this is a minimum and maximum angle for - # each spectrum, for each redshift bin combination. Which is clearly a massive pain... - # but what can you do? - - scale_cuts = {} - for name in self.used_names: - s = self.two_point_data.get_spectrum(name) - for b1, b2 in s.bin_pairs: - option_name = "angle_range_{}_{}_{}".format(name, b1, b2) - if self.options.has_value(option_name): - r = self.options.get_double_array_1d(option_name) - scale_cuts[(name, b1, b2)] = r - - # Now check for completely cut bins - # example: - # cut_wtheta = 1,2 1,3 2,3 - bin_cuts = [] - for name in self.used_names: - s = self.two_point_data.get_spectrum(name) - option_name = "cut_{}".format(name) - if self.options.has_value(option_name): - cuts = self.options[option_name].split() - cuts = [eval(cut) for cut in cuts] - for b1, b2 in cuts: - bin_cuts.append((name, b1, b2)) - - if scale_cuts or bin_cuts: - self.two_point_data.mask_scales(scale_cuts, bin_cuts) - else: - print("No scale cuts mentioned in ini file.") - - # Info on which likelihoods we do and do not use - print("Found these data sets in the file:") - total_data_points = 0 - final_names = [spectrum.name for spectrum in self.two_point_data.spectra] - for name in all_names: - if name in final_names: - data_points = len(self.two_point_data.get_spectrum(name)) - else: - data_points = 0 - if name in self.used_names: - print( - " - {} {} data points after cuts {}".format( - name, data_points, " [using in likelihood]" - ) - ) - total_data_points += data_points - else: - print( - " - {} {} data points after cuts {}".format( - name, data_points, " [not using in likelihood]" - ) - ) - print("Total data points used = {}".format(total_data_points)) - - # Convert all units to radians. The units in cosmosis are all - # in radians, so this is the easiest way to compare them. - for spectrum in self.two_point_data.spectra: - if spectrum.is_real_space(): - spectrum.convert_angular_units("rad") - # if self.options.get_bool("print physical scale",False): - # section,_,_=theory_names(spectrum) - # chi_peak = - # for ang in spectrum.angle: - - # build up the data vector from all the separate vectors. - # Just concatenation - data_vector = np.concatenate( - [spectrum.value for spectrum in self.two_point_data.spectra] - ) - - # Make sure - if len(data_vector) == 0: - raise ValueError( - "No data was chosen to be used from 2-point data file {0}. It was either not selectedin data_sets or cut out".format( - filename - ) - ) - - if self.moped: - data_file = fits.open(filename) - self.moped_data = data_file["MOPED-DATA-{}".format(self.moped)].data[ - "moped" - ] - self.moped_transform = data_file[ - "MOPED-TRANSFORM-{}".format(self.moped) - ].data - data_file.close() - - return None, self.moped_data - - # The x data is not especially useful here, so return None. - # We will access the self.two_point_data directly later to - # determine ell/theta values - return None, data_vector - - def build_covariance(self): - - C = np.array(self.two_point_data.covmat) - r = self.options.get_int("covariance_realizations", default=-1) - self.sellentin = self.options.get_bool("sellentin", default=False) - - if self.moped: - return np.identity(len(self.moped_data)) - - if self.sellentin: - if not self.constant_covariance: - print() - print("You asked for the Sellentin-Heavens correction to be applied") - print("But also asked for a non-constant (maybe Gaussian?) covariance") - print("matrix. I think that probably suggests you have made a mistake") - print("somewhere unless you have thought about this quite carefully.") - print() - if r < 0: - print() - print("ERROR: You asked for the Sellentin-Heavens corrections") - print( - "by setting sellentin=T, but you did not set covariance_realizations" - ) - print("If you want covariance_realizations=infinity you can use 0") - print( - "(unlikely, but it's also possible you were super-perverse and set it negative?)" - ) - print() - raise ValueError( - "Please set covariance_realizations for 2pt like. See message above." - ) - elif r == 0: - print() - print("NOTE: You asked for the Sellentin-Heavens corrections") - print("but set covariance_realizations=0. I am assuming you want") - print( - "the limit of an infinite number of realizations, so we will just go back" - ) - print("to the original Gaussian model") - print() - self.sellentin = False - else: - # use proper correction - self.covariance_realizations = r - print() - print( - "You set sellentin=T so I will apply the Sellentin-Heavens correction" - ) - print("for a covariance matrix estimated from Monte-Carlo simulations") - print("(you told us it was {} simulations in the ini file)".format(r)) - print( - "This analytic marginalization converts the Gaussian distribution" - ) - print("to a multivariate student's t distribution instead.") - print() - - elif r > 0: - # Just regular increase in covariance size, no Sellentin change. - p = C.shape[0] - # This x is the inverse of the alpha used in the old code - # because that applied to the weight matrix not the covariance - x = (r - 1.0) / (r - p - 2.0) - C = C * x - print() - print( - "You set covariance_realizations={} in the 2pt likelihood parameter file".format( - r - ) - ) - print( - "So I will apply the Anderson-Hartlap correction to the covariance matrix" - ) - print("The covariance matrix is nxn = {}x{}".format(p, p)) - print( - "So the correction scales the covariance matrix by (r - 1) / (r - n - 2) = {}".format( - x - ) - ) - print() - return C - - def extract_theory_points(self, block): - theory = [] - # We may want to save these splines for the covariance matrix later - self.theory_splines = {} - - # We have a collection of data vectors, one for each spectrum - # that we include. We concatenate them all into one long vector, - # so we do the same for our theory data so that they match - - # We will also save angles and bin indices for plotting convenience, - # although these are not actually used in the likelihood - angle = [] - bin1 = [] - bin2 = [] - - # Get appropriate suffixes - # If only a single suffix is provided, assume this applies to all data sets - if len(self.suffixes) == 1: - suffixes = np.tile(self.suffixes[0], len(self.two_point_data.spectra)) - elif len(self.suffixes) > 1 and len(self.suffixes) == len( - self.two_point_data.spectra - ): - suffixes = self.suffixes - else: - raise ValueError( - "The number of suffixes supplied does not match the number of two point spectra." - ) - - # Now we actually loop through our data sets - for ii, spectrum in enumerate(self.two_point_data.spectra): - theory_vector, angle_vector, bin1_vector, bin2_vector = ( - self.extract_spectrum_prediction(block, spectrum, suffixes[ii]) - ) - theory.append(theory_vector) - angle.append(angle_vector) - bin1.append(bin1_vector) - bin2.append(bin2_vector) - # dataset_name.append(np.repeat(spectrum.name, len(bin1_vector))) - - # We also collect the ell or theta values. - # The gaussian likelihood code itself is not expecting these, - # so we just save them here for convenience. - angle = np.concatenate(angle) - bin1 = np.concatenate(bin1) - bin2 = np.concatenate(bin2) - # dataset_name = np.concatenate(dataset_name) - block[names.data_vector, self.like_name + "_angle"] = angle - block[names.data_vector, self.like_name + "_bin1"] = bin1 - block[names.data_vector, self.like_name + "_bin2"] = bin2 - # block[names.data_vector, self.like_name+"_name"] = dataset_name - - # the thing it does want is the theory vector, for comparison with - # the data vector - theory = np.concatenate(theory) - - if self.moped: - return np.dot(self.moped_transform, theory) - - return theory - - def do_likelihood(self, block): - # Run the - super(TwoPointLikelihood, self).do_likelihood(block) - - if self.sellentin: - # The Sellentin-Heavens correction from arxiv 1511.05969 - # accounts for a finite number of Monte-Carlo realizations - # being used to estimate the covariance matrix. - - # Note that this invalidates the saved simulation used for - # the ABC sampler. I can't think of a better way of doing this - # than overwriting the whole things with NaNs - that will at - # least make clear there is a problem somewhere and not - # yield misleading results. - block[names.data_vector, self.like_name + "_simulation"] = ( - np.nan * block[names.data_vector, self.like_name + "_simulation"] - ) - - # It changes the Likelihood from Gaussian to a multivariate - # student's t distribution. Here we will have to do a little - # hack and overwrite the stuff that the original Gaussian - # method did above - N = self.covariance_realizations - chi2 = block[names.data_vector, self.like_name + "_CHI2"] - - # We might be using a cosmologically varying - # covariance matrix, though I'm not sure what that would mean. - # There is a warning about this above. - if self.constant_covariance: - log_det = 0.0 - else: - log_det = block[names.data_vector, self.like_name + "_LOG_DET"] - - like = -0.5 * log_det - 0.5 * N * np.log(1 + chi2 / (N - 1.0)) - - # overwrite the log-likelihood - block[names.likelihoods, self.like_name + "_LIKE"] = like - - # Should suffix be made into a keyword? - def extract_spectrum_prediction(self, block, spectrum, suffix): - - # We may need theory predictions for multiple different - # types of spectra: e.g. shear-shear, pos-pos, shear-pos. - # So first we find out from the spectrum where in the data - # block we expect to find these - mapping spectrum types - # to block names - section, x_name, y_name = theory_names(spectrum) - - # To handle multiple different data sets we allow a suffix - # to be applied to the section names, so that we can look up - # e.g. "shear_cl_des" instead of just "shear_cl". - section += suffix - - # Initialize TheorySpectrum class from block - bin_pairs = spectrum.get_bin_pairs() - theory_spec = TheorySpectrum.from_block(block, section, bin_pairs=bin_pairs) - - # If the theory spectrum has been bin-averaged then we expect the - # data to be so also. We check this by ensuring that angle_min is specified - # Based on this, we also generate the angle argument passed to the spectrum - # differently. The bin-averaged version expects a tuple angle_min and angle_max, - # whereas the interpolated version just wants a single angle. - if theory_spec.is_bin_averaged: - if spectrum.angle_min is None: - raise ValueError( - "Your theory pipeline produced angle-binnned values, but your data it not binned." - ) - angles = list(zip(spectrum.angle_min, spectrum.angle_max)) - else: - angles = spectrum.angle - - # We store the nominal mid-points for plotting later on, etc. - angle_mids = spectrum.angle - - # This is a bit of a hack, but later on if we are making a covariance - # we need all the splines, so pull them out here. - bin_splines = {} - - # We build up these vectors from all the data points. - # Only the theory vector is needed for the likelihood - the others - # are for convenience, debugging, etc. - theory_vector = [] - angle_vector = [] - bin1_vector = [] - bin2_vector = [] - - for b1, b2, angle, angle_mid in zip( - spectrum.bin1, spectrum.bin2, angles, angle_mids - ): - # The extra object will either be a spline (for interpolated spectra) - # or theta mid-point values (for bin-averaged ones, e.g. for plotting) - theory, extra = theory_spec.get_spectrum_value(b1, b2, angle) - - # We can only record the splines for non-bin-averaged values - if not theory_spec.is_bin_averaged: - bin_splines[y_name.format(b1, b2)] = extra - - # Build up the vector - we make this into an array later - theory_vector.append(theory) - angle_vector.append(angle_mid) - bin1_vector.append(b1) - bin2_vector.append(b2) - - self.theory_splines[section] = bin_splines - - # Return the whole collection as an array - theory_vector = np.array(theory_vector) - - # For convenience we also save the angle vector (ell or theta) - # and bin indices - angle_vector = np.array(angle_vector) - bin1_vector = np.array(bin1_vector, dtype=int) - bin2_vector = np.array(bin2_vector, dtype=int) - - return theory_vector, angle_vector, bin1_vector, bin2_vector - - def extract_covariance(self, block): - assert self.gaussian_covariance, ( - "Set constant_covariance=F but somehow not with Gaussian covariance. Internal error - please open an issue on the cosmosis site." - ) - - C = [] - # s and t index the spectra that we have. e.g. s or t=1 might be the full set of - # shear-shear measuremnts - for s, AB in enumerate(self.two_point_data.spectra[:]): - M = [] - for t, CD in enumerate(self.two_point_data.spectra[:]): - print( - "Looking at covariance between {} and {} (s={}, t={})".format( - AB.name, CD.name, s, t - ) - ) - # We only calculate the upper triangular. - # Get the lower triangular here. We have to - # transpose it compared to the upper one. - if s > t: - MI = C[t][s].T - else: - MI = gaussian_covariance.compute_gaussian_covariance( - self.sky_area, self._lookup_theory_cl, block, AB, CD - ) - M.append(MI) - C.append(M) - - # C is now a list of lists of 2D arrays. - # Now turn C into a big 2D array by stacking - # the arrays - C = np.vstack([np.hstack(CI) for CI in C]) - - return C - - def _lookup_theory_cl(self, block, A, B, i, j, ell): - """ - This is a helper function for the compute_gaussian_covariance code. - It looks up the theory value of C^{ij}_{AB}(ell) in the - """ - # We have already saved splines into the theory space earlier - # when constructing the theory vector. - # So now we just need to look those up again, using the same - # code we use in the twopoint library. - section, ell_name, value_name = type_table[A, B] - assert ell_name == "ell", ( - "Gaussian covariances are currently only written for C_ell, not other 2pt functions" - ) - d = self.theory_splines[section] - - # We save the splines with these names when we extract the theory vector - name_ij = value_name.format(i, j) - name_ji = value_name.format(j, i) - - # Hopefully we already have the theory spline extracted - if name_ij in d: - spline = d[name_ij] - # For symmetric spectra (not just auto-correlations, but any thing like C_EE or C_NN where - # we cross-correlate something with itself) we can use ji for ij as it is the same. This is - # not true for cross spectra - elif name_ji in d and (A == B): - spline = d[name_ji] - else: - # It's possible too that we need something for the covariance that we didn't need for the - # data vector - for example to got the covariance between C^EE and C^NN we need C^NE even - # if we don't have any actual measurements of NE. In that case we have to g - angle_theory = block[section, ell_name] - if block.has_value(section, name_ij): - theory = block[section, name_ij] - # The same symmetry argument as above applies - elif block.has_value(section, name_ji) and A == B: - theory = block[section, name_ji] - else: - raise ValueError( - "Could not find theory prediction {} in section {}".format( - value_name.format(i, j), section - ) - ) - - spline = interp1d(angle_theory, theory) - # Finally cache this so we don't have to do this again. - d[name_ij] = spline - - obs_cl = spline(ell) - - # For shear-shear the noise component is sigma^2 / number_density_bin - # and for position-position it is just 1/number_density_bin - if ( - (A == B) - and (A == twopoint.Types.galaxy_shear_emode_fourier.name) - and (i == j) - ): - if ( - i > len(self.number_density_shear_bin) - or i > len(self.sigma_e_bin) - or is_default(self.sigma_e_bin) - or is_default(self.number_density_shear_bin) - ): - raise ValueError("Not enough number density bins for shear specified") - noise = self.sigma_e_bin[i - 1] ** 2 / convert_nz_steradian( - self.number_density_shear_bin[i - 1] - ) - obs_cl += noise - if (A == B) and (A == twopoint.Types.galaxy_position_fourier.name) and (i == j): - if i > len(self.number_density_lss_bin) or is_default( - self.number_density_lss_bin - ): - raise ValueError("Not enough number density bins for lss specified") - noise = 1.0 / convert_nz_steradian(self.number_density_lss_bin[i - 1]) - obs_cl += noise - - return obs_cl - - def update_xi_w_sys(self, block): - self.data_y = self.raw_data_y + block["xi_sys", "xi_sys_vec"] - - @classmethod - def build_module(cls): - - def setup(options): - options = SectionOptions(options) - likelihoodCalculator = cls(options) - return likelihoodCalculator - - def execute(block, config): - likelihoodCalculator = config - likelihoodCalculator.update_xi_w_sys(block) - # print(likelihoodCalculator.data_y) - likelihoodCalculator.do_likelihood(block) - return 0 - - def cleanup(config): - likelihoodCalculator = config - likelihoodCalculator.cleanup() - - return setup, execute, cleanup - - -setup, execute, cleanup = TwoPointLikelihood.build_module() diff --git a/cosmo_inference/scripts/chain_postprocessing.py b/cosmo_inference/scripts/chain_postprocessing.py index 83cddf4b..d1462902 100644 --- a/cosmo_inference/scripts/chain_postprocessing.py +++ b/cosmo_inference/scripts/chain_postprocessing.py @@ -7,6 +7,7 @@ import os import subprocess +import cs_util.cosmo as cs_cosmo import matplotlib.pyplot as plt import numpy as np from astropy.io import fits @@ -281,16 +282,15 @@ def compute_best_fit_xi_from_cell(output_folder, root, best_fit_params, theta_ra output_folder + "{}/best_fit/shear_cl/bin_1_1.txt".format(root) ) - import pyccl as ccl - - cosmo = ccl.Cosmology( - Omega_c=best_fit_params["omch2"] / (best_fit_params["h0"] / 100) ** 2, - Omega_b=best_fit_params["ombh2"] / (best_fit_params["h0"] / 100) ** 2, - h=best_fit_params["h0"] / 100, - n_s=best_fit_params["n_s"], - sigma8=best_fit_params["SIGMA_8"], - baryonic_effects=None, - extra_parameters={ + cosmo = cs_cosmo.get_cosmo( + camb_params={ + "H0": best_fit_params["h0"], + "ombh2": best_fit_params["ombh2"], + "omch2": best_fit_params["omch2"], + "ns": best_fit_params["n_s"], + "sigma8": best_fit_params["SIGMA_8"], + }, + extra_params={ "camb": { "halofit_version": "mead2020_feedback", "HMCode_logT_AGN": best_fit_params["logt_agn"], @@ -298,9 +298,7 @@ def compute_best_fit_xi_from_cell(output_folder, root, best_fit_params, theta_ra }, ) - theta_deg = np.rad2deg(theta_rad) - xi_p = ccl.correlation(cosmo, ell=ell, C_ell=shear_cl, theta=theta_deg, type="GG+") - xi_m = ccl.correlation(cosmo, ell=ell, C_ell=shear_cl, theta=theta_deg, type="GG-") + xi_p, xi_m = cs_cosmo.c_ell_to_xi(cosmo, np.rad2deg(theta_rad) * 60, ell, shear_cl) os.makedirs( output_folder + "{}/best_fit/shear_xi_minus".format(root), exist_ok=True diff --git a/cosmo_inference/scripts/cosmocov_process.py b/cosmo_inference/scripts/cosmocov_process.py deleted file mode 100644 index c2c00996..00000000 --- a/cosmo_inference/scripts/cosmocov_process.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python - -import sys - -import matplotlib.pyplot as plt -import numpy as np - - -def get_cov(filename): - - data = np.loadtxt(filename) - ndata = int(np.max(data[:, 0])) + 1 - - print("Dimension of cov: %dx%d" % (ndata, ndata)) - - cov_g = np.zeros((ndata, ndata)) - cov_ng = np.zeros((ndata, ndata)) - for i in range(0, data.shape[0]): - cov_g[int(data[i, 0]), int(data[i, 1])] = data[i, 8] - cov_g[int(data[i, 1]), int(data[i, 0])] = data[i, 8] - cov_ng[int(data[i, 0]), int(data[i, 1])] = data[i, 9] - cov_ng[int(data[i, 1]), int(data[i, 0])] = data[i, 9] - - return cov_g, cov_ng, ndata - - -if __name__ == "__main__": - if len(sys.argv) != 3: - print("Usage: python cosmocov_process.py ") - sys.exit(1) - - covfile = sys.argv[1] - output_base = sys.argv[2] - - c_g, c_ng, ndata = get_cov(covfile) - - cov = c_ng + c_g - cov_g = c_g - - b = np.sort(np.linalg.eigvals(cov)) - print("min+max eigenvalues cov: %e, %e" % (np.min(b), np.max(b))) - if np.min(b) <= 0.0: - print("non-positive eigenvalue encountered! Covariance Invalid!") - exit() - - print("Covariance is positive definite!") - - np.savetxt(str(output_base) + ".txt", cov) - print("covmat saved as %s" % (str(output_base) + ".txt")) - - np.savetxt(str(output_base) + "_g.txt", cov_g) - print("Gaussian covmat saved as %s" % (str(output_base) + "_g.txt")) - - cmap = "seismic" - - pp_norm = np.zeros((ndata, ndata)) - for i in range(ndata): - for j in range(ndata): - pp_norm[i][j] = cov[i][j] / np.sqrt(cov[i][i] * cov[j][j]) - - print("Plotting correlation matrix ...") - - plot_path = str(output_base) + "_plot.pdf" - fig = plt.figure() - ax = fig.add_subplot(1, 1, 1) - extent = (0, ndata, ndata, 0) - im3 = ax.imshow(pp_norm, cmap=cmap, vmin=-1, vmax=1, extent=extent) - - plt.axvline(x=int(ndata / 2), color="black", linewidth=1.0) - plt.axhline(y=int(ndata / 2), color="black", linewidth=1.0) - - fig.colorbar(im3, orientation="vertical") - - ax.text(int(ndata / 4), ndata + 5, r"$\xi_+^{ij}(\theta)$", fontsize=12) - ax.text(3 * int(ndata / 4), ndata + 5, r"$\xi_-^{ij}(\theta)$", fontsize=12) - ax.text(-9, int(ndata / 4), r"$\xi_+^{ij}(\theta)$", fontsize=12) - ax.text(-9, 3 * int(ndata / 4), r"$\xi_-^{ij}(\theta)$", fontsize=12) - - plt.savefig(plot_path, dpi=2000) - plt.close() - print("Plot saved as %s" % (plot_path)) diff --git a/cosmo_inference/scripts/cosmosis_fitting.py b/cosmo_inference/scripts/cosmosis_fitting.py index 6cfe8be8..7396ae35 100644 --- a/cosmo_inference/scripts/cosmosis_fitting.py +++ b/cosmo_inference/scripts/cosmosis_fitting.py @@ -3,8 +3,8 @@ """Prepare CosmoSIS inputs from UNIONS validation outputs. The script lives in ``cosmo_inference/scripts``. By default it reads templates -from ``cosmo_inference/cosmosis_config`` and writes data products beneath -``cosmo_inference/data`` and ``cosmo_inference/cosmosis_config``. Override +from ``cosmo_inference/cosmosis_config/templates`` and writes data products beneath +``cosmo_inference/data`` and ``cosmo_inference/cosmosis_config/output``. Override ``--template-dir`` or ``--output-root`` to use alternative locations. """ @@ -399,8 +399,8 @@ def _generate_ini_file( modifications.append((r"^\[output\]", output_section)) pipeline_section = ( - f"[pipeline]\nvalues = cosmosis_config/{values_file}\npriors = " - f"cosmosis_config/{priors_file}" + f"[pipeline]\nvalues = cosmosis_config/templates/{values_file}\npriors = " + f"cosmosis_config/templates/{priors_file}" ) modifications.append((r"^\[pipeline\]", pipeline_section)) @@ -617,7 +617,7 @@ def parse_args(): parser.add_argument( "--template-dir", type=str, - default=str(cosmo_inference_root / "cosmosis_config"), + default=str(cosmo_inference_root / "cosmosis_config" / "templates"), help=( "Directory containing CosmoSIS template INI files (defaults to the " "cosmosis_config folder next to this script)." @@ -636,7 +636,7 @@ def parse_args(): template_dir_path = Path(args.template_dir).expanduser().resolve() output_basename_path = Path(output_basename) data_dir_root = output_root_path / "data" / output_basename_path - config_dir_root = output_root_path / "cosmosis_config" + config_dir_root = output_root_path / "cosmosis_config" / "output" data_dir_root.mkdir(parents=True, exist_ok=True) config_dir_root.mkdir(parents=True, exist_ok=True) out_file_path = data_dir_root / f"cosmosis_{args.cosmosis_root}.fits" diff --git a/cosmo_inference/scripts/k_analysis.py b/cosmo_inference/scripts/k_analysis.py new file mode 100644 index 00000000..d3939c10 --- /dev/null +++ b/cosmo_inference/scripts/k_analysis.py @@ -0,0 +1,308 @@ +import sys +from multiprocessing import Pool + +import astropy.constants as const +import astropy.units as u +import camb +import numpy as np +import scipy.integrate as integrate +from cs_util.cosmo import PLANCK18 +from scipy import interpolate +from scipy.special import j0, jn + +###################################################################################################### + +###################################################################################################### + + +def process_theta(theta, nz_file, output_root): + """Compute shear correlation functions for a single angular scale. + + For a given angular separation, this function computes the weak-lensing + correlation functions xi+ and xi- over a range of maximum wavenumbers + (kmax). The calculation includes nonlinear matter power spectra from + CAMB and optionally intrinsic-alignment contributions. Results are + appended to output text files. + + Parameters + ---------- + theta : float + Angular separation in arcminutes. + nz_file : str + Path to the source redshift distribution file. The file must contain + two columns giving redshift and n(z). + output_root : str + Prefix of the output files. Results are written to + ``{output_root}_xip.txt`` and ``{output_root}_xim.txt``. + + Returns + ------- + float + The input angular separation, returned for bookkeeping when running + in parallel. + """ + + def Hz(z): + """Return the Hubble expansion rate. + + Computes the Hubble parameter assuming a flat LCDM cosmology. + + Parameters + ---------- + z : float or ndarray + Redshift. + + Returns + ------- + float or ndarray + Hubble parameter in km s^-1 Mpc^-1. + """ + return H0 * np.sqrt(Omega_m * (1 + z) ** 3 + (1 - Omega_m)) + + def rz_interp(want_z): + """Create an interpolation between redshift and comoving distance. + + Computes the line-of-sight comoving distance by numerical integration + and returns an interpolation function in either direction. + + Parameters + ---------- + want_z : bool + If True, return an interpolator mapping comoving distance to + redshift. Otherwise return an interpolator mapping redshift to + comoving distance. + + Returns + ------- + scipy.interpolate.interp1d + Interpolation function relating redshift and comoving distance. + """ + + def hz_integrand(zz): + return c / Hz(zz) + + rz_ref = np.array([integrate.quad(hz_integrand, 0, z)[0] for z in zs]) + + if want_z == True: + return interpolate.interp1d( + rz_ref, zs, bounds_error=False, fill_value="extrapolate" + ) + else: + return interpolate.interp1d( + zs, rz_ref, bounds_error=False, fill_value="extrapolate" + ) + + def W_gg(z, rz): + """Compute the lensing efficiency kernel. + + Evaluates the lensing kernel for the supplied source redshift + distribution. + + Parameters + ---------- + z : float + Lens redshift. + rz : callable + Function returning comoving distance as a function of redshift. + + Returns + ------- + float + Weak-lensing efficiency kernel evaluated at z. + """ + z_integrate = np.linspace(z, zmax, n) + r_zmin = rz(z) + nz_int = som_nz_interp(z_integrate) * (1 - r_zmin / rz(z_integrate)) + prefactor = 3 * H0**2 * Omega_m * (1 + z) * r_zmin / (2 * c**2) + + return prefactor * integrate.simpson(nz_int, x=z_integrate) + + def C_ell(ell, kmax, want_IA): + """Compute the angular power spectrum. + + Calculates the Limber-approximated cosmic shear power spectrum, + optionally including intrinsic-alignment (GI and II) contributions. + + Parameters + ---------- + ell : float + Angular multipole. + kmax : float + Maximum wavenumber used to truncate the Limber integral. + want_IA : bool + If True, include intrinsic-alignment contributions. + + Returns + ------- + float + Total cosmic shear angular power spectrum at the specified multipole. + """ + z_min = rz_interp_wantz((ell + 0.5) / kmax) + z_valid = zs[zs >= z_min] + + if len(z_valid) == 0: + return 0.0 + + rzs = rz_interp_noz(z_valid) + W_ggs = W_gg_interp(z_valid) + Pks = pkz_nl_interp((z_valid, (ell + 0.5) / rzs)) + Hzs = Hz(z_valid) + + gg_integrand = c * W_ggs**2 * Pks / (Hzs * rzs**2) + C_ell_gg = integrate.simpson(gg_integrand, x=z_valid) + + if want_IA == True: + Dzs = pkz_lin_interp((z_valid, (ell + 0.5) / rzs)) / pkz_lin_interp( + (0, (ell + 0.5) / rzs) + ) + P_ia = -A_IA * c1 * Omega_m / Dzs + W_ias = Hzs * som_nz_interp(z_valid) / c + + gI_integrand = c * W_ggs * Pks * W_ias * P_ia / (Hzs * rzs**2) + II_integrand = c * Pks * W_ias**2 * P_ia**2 / (Hzs * rzs**2) + + C_ell_gI = integrate.simpson(gI_integrand, x=z_valid) + C_ell_II = integrate.simpson(II_integrand, x=z_valid) + + return C_ell_gg + C_ell_gI + C_ell_II + + return C_ell_gg + + def xi(theta_rad, kmax, want_IA): + """Compute the shear correlation functions. + + Evaluates the real-space shear correlation functions xi+ and xi- + by Hankel-transforming the convergence power spectrum. + + Parameters + ---------- + theta_rad : float + Angular separation in radians. + kmax : float + Maximum wavenumber used in the Limber integration. + want_IA : bool + If True, include intrinsic-alignment contributions. + + Returns + ------- + tuple of float + The pair (xi_plus, xi_minus). + """ + C_ell_vals = np.array([C_ell(ell, kmax, want_IA) for ell in ells]) + + xip_integrand = ells * C_ell_vals * j0(ells * theta_rad) + xim_integrand = ells * C_ell_vals * jn(4, ells * theta_rad) + + return integrate.simpson(xip_integrand, x=ells) / ( + 2 * np.pi + ), integrate.simpson(xim_integrand, x=ells) / (2 * np.pi) + + ########################################################################################### + + c = const.c.to("km/s") + H0 = PLANCK18["h"] * 100 + Omega_m = PLANCK18["Omega_m"] + + A_IA = 0.83 + c1 = 5e-14 * (u.Mpc**3.0) / u.solMass + + zmin = 1e-5 + zmax = 4 + n = 500 + zs = np.linspace(zmin, zmax, n) + ells = np.linspace(2, 1e5, int(1e5 - 1)) + + kmaxs = np.logspace(-4, 2, 200) + theta_rad = theta * (np.pi / (180 * 60)) + + ombh2 = PLANCK18["Omega_b"] * PLANCK18["h"] ** 2 + omch2 = (PLANCK18["Omega_m"] - PLANCK18["Omega_b"]) * PLANCK18["h"] ** 2 + pars = camb.set_params( + H0=H0, + ombh2=ombh2, + omch2=omch2, + mnu=PLANCK18["m_nu"], + As=PLANCK18["As"], + ns=PLANCK18["n_s"], + halofit_version="mead2020_feedback", + lmax=3000, + WantTransfer=True, + ) + + nz_z, som_nz = np.loadtxt(f"{nz_file}", unpack=True) + som_nz_interp = interpolate.interp1d( + nz_z, som_nz, bounds_error=False, fill_value=None + ) + + pars.set_matter_power(redshifts=np.linspace(zmin, zmax, 150), kmax=200) + results = camb.get_results(pars) + results.calc_power_spectra(pars) + k_nonlin, z_nonlin, pk_nonlin = results.get_nonlinear_matter_power_spectrum( + hubble_units=False, k_hunit=False + ) + + pkz_nl_interp = interpolate.RegularGridInterpolator( + (z_nonlin, k_nonlin), pk_nonlin, bounds_error=False, fill_value=None + ) + + k_lin, z_lin, pk_lin = results.get_linear_matter_power_spectrum( + hubble_units=False, k_hunit=False + ) + + pkz_lin_interp = interpolate.RegularGridInterpolator( + (z_lin, k_lin), pk_lin, bounds_error=False, fill_value=None + ) + + rz_interp_wantz = rz_interp(True) + rz_interp_noz = rz_interp(False) + W_gg_vals = np.array([W_gg(z, rz_interp_noz) for z in zs]) + W_gg_interp = interpolate.interp1d( + zs, W_gg_vals, bounds_error=False, fill_value="extrapolate" + ) + + ########################################################################################### + xis = np.array([xi(theta_rad, kmax, True) for kmax in kmaxs]) + xip = xis[:, 0] + xim = xis[:, 1] + + # Write results immediately to avoid thread conflicts + with open(f"{output_root}_xip.txt", "a") as f: + new_arr = np.concatenate(([theta], xip)) + np.savetxt(f, new_arr, fmt="%.8e") + + with open(f"{output_root}_xim.txt", "a") as f: + new_arr = np.concatenate(([theta], xim)) + np.savetxt(f, new_arr, fmt="%.8e") + + return theta + + +########################################################################################### + +if __name__ == "__main__": + """Run the shear-correlation calculation in parallel. + + The script expects three command-line arguments: + + 1. Block index specifying which subset of angular scales to process. + 2. Path to the source redshift distribution file. + 3. Output file prefix. + + The 50 angular scales between 1 and 20 arcmin are divided into + blocks of 10 values. Each block is processed in parallel using + multiprocessing, with one worker per angular scale. Each worker + computes xi+ and xi- over the predefined range of kmax values and + appends the results to the output files. + """ + i = int(sys.argv[1]) + nz_file = sys.argv[2] + output_root = sys.argv[3] + + thetas = np.linspace(1, 20, 50) + theta_block = thetas[i * 10 : (i + 1) * 10] + + # Run in parallel to speed up calculations for multiple angular scales + with Pool(processes=10) as pool: + pool.starmap( + process_theta, [(theta, nz_file, output_root) for theta in theta_block] + ) diff --git a/cosmo_inference/scripts/matching.py b/cosmo_inference/scripts/matching.py deleted file mode 100644 index a465e449..00000000 --- a/cosmo_inference/scripts/matching.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Created on Wed Mar 1 17:37:27 2023 -@author: fh272693 -""" - -import astropy.units as u -from astropy.coordinates import SkyCoord, match_coordinates_sky -from astropy.io import fits - -Cat1 = fits.open( - "/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/unions_shapepipe_2022_v1.0.fits" -) -Cat2 = fits.open( - "/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/lensfit_goldshape_2022v1.fits" -) - -coord_units = u.degree -Cat1_coord = SkyCoord( - ra=Cat1[1].data["ra"] * coord_units, dec=Cat1[1].data["dec"] * coord_units -) -Cat2_coord = SkyCoord( - ra=Cat2[1].data["ra"] * coord_units, dec=Cat2[1].data["dec"] * coord_units -) -idx, d2d, d3d = match_coordinates_sky(Cat1_coord, Cat2_coord) -max_sep = 1.0 * u.arcsec -sep_constraint = d2d < max_sep - -# Important here is that the first catalogue of match_coordinates_sky has -# indices [sep_constraint] and the second[idx[sep_constraint]] -Cat1_matches = Cat1[1].data[sep_constraint] - -# np.save('/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/shapepipe_unmatches_ra.npy',Cat1[1].data['ra'][sep_constraint]) -# np.save('/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/shapepipe_unmatches_dec.npy',Cat1[1].data['dec'][sep_constraint]) -# np.save('/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/shapepipe_unmatches_e1.npy',Cat1[1].data['e1'][sep_constraint]) -# np.save('/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/shapepipe_unmatches_e2.npy',Cat1[1].data['e2'][sep_constraint]) -# np.save('/feynman/work/dap/lcs/lg268561/UNIONS/Catalogues/shapepipe_unmatches_w.npy',Cat1[1].data['w'][sep_constraint]) - -print("there are ", len(Cat1_matches), " matching galaxies in catalogue", Cat1) -# print('there are ',len(Cat2_matches),' matching galaxies in catalogue', Cat2) diff --git a/cosmo_inference/scripts/nz_writeout.py b/cosmo_inference/scripts/nz_writeout.py deleted file mode 100644 index 81994335..00000000 --- a/cosmo_inference/scripts/nz_writeout.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -# In[ ]: - -import sys - -import matplotlib.pylab as plt -import numpy as np -from astropy.io import fits - -nz_hdu = sys.argv[1] -root = sys.argv[2] -blind = sys.argv[3] - -hdu = fits.open(nz_hdu) -z = hdu[1].data["Z_%s" % blind] - -zmax = 5.0 - -(n, bins, _) = plt.hist(z, bins=200, range=(0, zmax), density=True, weights=None) - -print("zmin = ", min(z)) -print("zmax = ", max(z)) - -np.savetxt("data/" + root + "/nz_" + root + ".txt", np.column_stack((bins[:-1], n))) diff --git a/cosmo_inference/scripts/slurm.sh b/cosmo_inference/scripts/slurm.sh deleted file mode 100644 index 793aa7cf..00000000 --- a/cosmo_inference/scripts/slurm.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -#SBATCH --job-name=unions_V1.4 -#SBATCH --mail-user=lgoh@roe.ac.uk -#SBATCH --mail-type=END,FAIL -#SBATCH --partition=compl -#SBATCH --nodes=1 -#SBATCH --ntasks=1 -#SBATCH --cpus-per-task=48 -#SBATCH --time=4-00:00:00 -#SBATCH --output=/n23data1/n06data/lgoh/scratch/CFIS-UNIONS/chains/SP_v1.4_A/inference_A.log - -module load gcc -module load intelpython/3-2024.1.0 -module load openmpi -source cosmosis-configure -source activate my_env - -cosmosis --mpi /n23data1/n06data/lgoh/scratch/CFIS-UNIONS/CFIS-UNIONS_dev/cosmo_inference/cosmosis_config/cosmosis_pipeline_A_1.ini - -# -# Return exit code -exit 0 \ No newline at end of file diff --git a/cosmo_inference/scripts/treecorr_calc.py b/cosmo_inference/scripts/treecorr_calc.py deleted file mode 100644 index 38eb855e..00000000 --- a/cosmo_inference/scripts/treecorr_calc.py +++ /dev/null @@ -1,107 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - - -import os -import sys - -import numpy as np -import treecorr -from astropy.io import fits - -script_dir = os.path.dirname(os.path.abspath(sys.argv[0])) - -cat_name = sys.argv[1] -root = sys.argv[2] - -hdu = fits.open(cat_name) -data = hdu[1].data - -# Create TreeCorr catalogue -n_thread = 8 -treecorr.set_omp_threads(n_thread) - -sep_units = "arcmin" -nbins = 20 - -TreeCorrConfig = { - "ra_units": "degrees", - "dec_units": "degrees", - "max_sep": "200", - "min_sep": "1", - "sep_units": sep_units, - "nbins": nbins, - "var_method": "jackknife", -} - - -cat_gal = treecorr.Catalog( - ra=data["RA"], - dec=data["Dec"], - g1=data["e1_noleakage"], # for v1.4.1 - g2=data["e2_noleakage"], # for v1.4.1 - w=data["w"], - ra_units="degrees", - dec_units="degrees", - npatch=50, -) - -gg = treecorr.GGCorrelation(TreeCorrConfig) - -print("Running TreeCorr...") -gg.process(cat_gal) - - -lst = np.arange(1, nbins + 1) - -# create fits HDU with xi_p and xi_m data -col1 = fits.Column(name="BIN1", format="K", array=np.ones(len(lst))) -col2 = fits.Column(name="BIN2", format="K", array=np.ones(len(lst))) -col3 = fits.Column(name="ANGBIN", format="K", array=lst) -col4 = fits.Column(name="VALUE", format="D", array=gg.xip) -col5 = fits.Column(name="ANG", format="D", unit="arcmin", array=gg.meanr) -coldefs = fits.ColDefs([col1, col2, col3, col4, col5]) -xiplus_hdu = fits.BinTableHDU.from_columns(coldefs, name="XI_PLUS") - - -col4 = fits.Column(name="VALUE", format="D", array=gg.xim) -coldefs = fits.ColDefs([col1, col2, col3, col4, col5]) -ximinus_hdu = fits.BinTableHDU.from_columns(coldefs, name="XI_MINUS") - -# append xi_p/xi_m header info -xip_dict = { - "2PTDATA": "T", - "QUANT1": "G+R", - "QUANT2": "G+R", - "KERNEL_1": "NZ_SOURCE", - "KERNEL_2": "NZ_SOURCE", - "WINDOWS": "SAMPLE", -} -for key in xip_dict: - xiplus_hdu.header[key] = xip_dict[key] - - -xim_dict = { - "2PTDATA": "T", - "QUANT1": "G-R", - "QUANT2": "G-R", - "KERNEL_1": "NZ_SOURCE", - "KERNEL_2": "NZ_SOURCE", - "WINDOWS": "SAMPLE", -} - -for key in xim_dict: - ximinus_hdu.header[key] = xim_dict[key] - -ximinus_hdu.writeto( - "%s/../data/" % script_dir + root + "/ximinus_" + root + ".fits", overwrite=True -) -xiplus_hdu.writeto( - "%s/../data/" % script_dir + root + "/xiplus_" + root + ".fits", overwrite=True -) - -print( - "Correlation functions written to {}".format( - "%s/../data/" % script_dir + root + "/xiplus_minus_" + root + ".fits" - ) -) diff --git a/cosmo_inference/scripts/xi_sys_psf.py b/cosmo_inference/scripts/xi_sys_psf.py deleted file mode 100644 index 631b9464..00000000 --- a/cosmo_inference/scripts/xi_sys_psf.py +++ /dev/null @@ -1,53 +0,0 @@ -import numpy as np -from astropy.io import fits -from cosmosis.datablock import option_section - - -# This file should be added to your cosmosis_standard_library following the path shear/xi_sys/xi_sys_psf.py -def setup(options): - filename = options.get_string(option_section, "data_file") - data = fits.open(filename) - rho_stats_name = options.get_string(option_section, "rho_stats_name") - samples_path = options.get_string(option_section, "samples") - - samples = np.load(samples_path) - mean = np.mean(samples, axis=0) - cov = np.cov(samples.T) - - rho_stats = data[rho_stats_name].data - - return mean, cov, rho_stats - - -def execute(block, config): - - mean, cov, rho_stats = config - - alpha, beta, eta = np.random.multivariate_normal(mean, cov) - block["xi_sys", "alpha"], block["xi_sys", "beta"], block["xi_sys", "eta"] = ( - alpha, - beta, - eta, - ) - - xi_sys_p = ( - alpha**2 * rho_stats["rho_0_p"] - + beta**2 * rho_stats["rho_1_p"] - + eta**2 * rho_stats["rho_3_p"] - + 2 * alpha * beta * rho_stats["rho_2_p"] - + 2 * beta * eta * rho_stats["rho_4_p"] - + 2 * alpha * eta * rho_stats["rho_5_p"] - ) - - xi_sys_m = ( - alpha**2 * rho_stats["rho_0_m"] - + beta**2 * rho_stats["rho_1_m"] - + eta**2 * rho_stats["rho_3_m"] - + 2 * alpha * beta * rho_stats["rho_2_m"] - + 2 * beta * eta * rho_stats["rho_4_m"] - + 2 * alpha * eta * rho_stats["rho_5_m"] - ) - - block["xi_sys", "xi_sys_vec"] = np.concatenate([xi_sys_p, xi_sys_m]) - - return 0 diff --git a/papers/realspace/S8_om_sigma8_whisker.py b/papers/realspace/S8_om_sigma8_whisker.py new file mode 100644 index 00000000..9f0aecae --- /dev/null +++ b/papers/realspace/S8_om_sigma8_whisker.py @@ -0,0 +1,549 @@ +# +# This notebook plots the whisker plot of $S_8$, $\Omega_m$ and $\sigma_8$ + + +import os +import sys + +# Trick to plot with tex +os.environ["LD_LIBRARY_PATH"] = "" +os.environ["CONDA_PREFIX"] = "/home/guerrini/.conda/envs/sp_validation_3.11" + +import warnings + +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns +from getdist import plots + +sys.path.append("/home/guerrini/sp_validation/cosmo_inference/scripts") + +import chain_postprocessing as cp + +plt.style.use("/home/guerrini/matplotlib_config/paper.mplstyle") + +plt.rc("text", usetex=True) + +sns.set_palette("husl") + +g = plots.get_subplot_plotter(width_inch=30) +g.settings.axes_fontsize = 60 +g.settings.axes_labelsize = 60 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 60 + + +# SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE +root_dir = "/n09data/guerrini/output_chains/" +root_external = f"{root_dir}/ext_data/" +blind = "B" + +roots = [ + f"SP_v1.4.6.3_{blind}_fiducial_config", + f"SP_v1.4.6.3_leak_corr_{blind}", + "Planck18", + "DES Y6", + "KiDS-Legacy_bandpowers", + "KiDS-Legacy_cosebis", + "KiDS-Legacy_xipm", + "HSC_Y3", + "HSC_Y3_cell", + f"SP_v1.4.6.3_{blind}_small_scales_config", + f"SP_v1.4.6.3_{blind}_flat_alpha_beta_config", + f"SP_v1.4.6.3_{blind}_no_xi_sys_config", + f"SP_v1.4.6.3_{blind}_no_leak_corr_config", + f"SP_v1.4.6.3_{blind}_flat_delta_z_config", + f"SP_v1.4.6.3_{blind}_no_delta_z_config", + f"SP_v1.4.6.3_{blind}_flat_ia_config", + f"SP_v1.4.6.3_{blind}_no_ia_config", + f"SP_v1.4.6.3_{blind}_no_m_bias_config", + f"SP_v1.4.6.3_{blind}_unmasked_covmat_config", + f"SP_v1.4.6.3_{blind}_halofit_config", + f"SP_v1.4.6.3_{blind}_no_baryons_config", + f"SP_v1.4.6.3_{blind}_nautilus_config", + f"SP_v1.4.6.3_{blind}_planck_config", + f"SP_v1.4.6.3_{blind}_planck_desi_config", +] + +legend_labels = [ + r"UNIONS-3500 $\xi_{\pm}(\theta)$ (This work)", + r"UNIONS-3500 $C_\ell$ (Guerrini et al. 2026)", + r"$\textit{Planck}$ 2018", + r"DES Y6 $\xi_{\pm}$, NLA", + r"KiDS-Legacy Bandpowers ($C_{\rm E}$)", + r"KiDS-Legacy COSEBIs ($E_n$)", + r"KiDS-Legacy $\xi_{\pm}(\theta)$", + r"HSC-Y3 $\xi_{\pm}(\theta)$", + r"HSC-Y3 $C_\ell$", + r"$\xi_+$ small scales, $\theta$=[5,83] arcmin", + r"Flat $\alpha_{\rm{PSF}}$ and $\beta_{\rm{PSF}}$ priors", + r"No $\xi^{\rm sys}_{\pm}$", + r"No leakage correction", + r"Flat $\Delta z$ priors", + r"No $\Delta z$", + r"Flat $A_{\rm IA}$ prior", + r"No $A_{\rm IA}$", + r"No $m$ bias", + r"Unmasked covmat", + r"$\texttt{Halofit}$", + r"$\texttt{HMCode}$ no baryons", + r"Nautilus sampler", + r"UNIONS-3500 + $\textit{Planck}$", + r"UNIONS-3500 + $\textit{Planck}$ + DESI BAO", +] + +categories = [ + "configuration", + "harmonic", + "external", + "external", + "external", + "external", + "external", + "external", + "external", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", + "configuration", +] +colours = [ + "darkorange", + "royalblue", + "violet", + "black", + "black", + "black", + "black", + "black", + "black", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", + "forestgreen", +] + + +chains = [] +for i, root in enumerate(roots): + category = categories[i] + if root == "DES Y6": + continue + if category != "external": + if category == "configuration": + path_samples = os.path.join(root_dir, f"{root}/samples_{root}.txt") + path_getdist = os.path.join(root_dir, f"{root}/getdist_{root}") + elif category == "harmonic": + path_samples = os.path.join( + root_dir, f"{root}/{root}/samples_{root}_cell.txt" + ) + path_getdist = os.path.join(root_dir, f"{root}/{root}/getdist_{root}") + elif category == "external_compute_sample": + path_samples = os.path.join(root_dir, f"ext_data/{root}/samples_{root}.txt") + path_getdist = os.path.join(root_dir, f"ext_data/{root}/getdist_{root}") + else: + raise ValueError(f"The category, {category}, of {root} is not correct") + if "nautilus" not in root: + cp.load_samples_and_write_paramnames( + path_samples, path_getdist + ".paramnames" + ) + cp.write_samples_getdist_format(path_samples, path_getdist + ".txt") + else: + cp.load_samples_and_write_paramnames( + path_samples, path_getdist + ".paramnames", chain_type="nautilus" + ) + cp.write_samples_getdist_format( + path_samples, path_getdist + ".txt", chain_type="nautilus" + ) + chains.append(cp.load_chain(path_getdist, smoothing_scale=0.5)) + else: + path_getdist = os.path.join(root_dir, f"ext_data/{root}/getdist_{root}") + chains.append(cp.load_chain(path_getdist)) + + +name_list = [ + "OMEGA_M", + "ombh2", + "h0", + "n_s", + "SIGMA_8", + "S_8", + "s_8_input", + "logt_agn", + "a", + "m1", + "bias_1", +] +label_list = [ + r"\Omega_{\rm m}", + r"\omega_b h^2", + r"h_0", + r"n_s", + r"\sigma_8", + r"S_8", + r"S_8", + r"\log T_{\rm AGN}", + r"A_{\rm IA}", + r"m_1", + r"\Delta z_1", +] + +for i, chain in enumerate(chains): + print(legend_labels[i]) + param_names = chain.getParamNames() + for name, label in zip(name_list, label_list): + try: + param_names.parWithName(name).label = label + except Exception: + warnings.warn(f"Parameter {name} not found in chain {roots[i]}.") + + +# Micro management of external chains + +# Account for the missing parameter conventions + +idx = roots.index("KiDS-Legacy_xipm") +cp.derive_parameter_S8(chains[idx]) + +idx = roots.index("KiDS-Legacy_bandpowers") +cp.derive_parameter_S8(chains[idx]) + +idx = roots.index("KiDS-Legacy_cosebis") +cp.derive_parameter_S8(chains[idx]) + +# OMEGA_M not in HSC_Y3_cell +idx = roots.index("HSC_Y3_cell") +cp.adjust_paramname_chain(chains[idx], "omega_m", "OMEGA_M", r"\Omega_{\rm m}") + + +param_values = np.array( + [ + "# Expt", + "Colour", + "S8_Mean", + "S8_low", + "S8_high", + "sigma_8_Mean", + "sigma_8_low", + "sigma_8_high", + "Omega_m_Mean", + "Omega_m_low", + "Omega_m_high", + ] +) +escaped = np.char.replace(legend_labels, "\\", "\\\\") + +for i, root in enumerate(roots): + chain = chains[i] + if root == "DES Y6": + param_values = np.vstack( + ( + param_values, + [ + escaped[i], + colours[i], + 0.798, + 0.015, + 0.014, + 0.763, + 0.057, + 0.050, + 0.332, + 0.040, + 0.035, + ], + ) + ) + else: + best_fit_params = cp.extract_best_fit_params(chain, best_fit_method="2Dkde") + margestats = chain.getMargeStats() + + s8_stats = margestats.parWithName("S_8") + sigma8_stats = margestats.parWithName("SIGMA_8") + omegam_stats = margestats.parWithName("OMEGA_M") + + param_values = np.vstack( + ( + param_values, + [ + escaped[i], + colours[i], + best_fit_params["S_8"], + best_fit_params["S_8"] - s8_stats.limits[0].lower, + s8_stats.limits[0].upper - best_fit_params["S_8"], + best_fit_params["SIGMA_8"], + best_fit_params["SIGMA_8"] - sigma8_stats.limits[0].lower, + sigma8_stats.limits[0].upper - best_fit_params["SIGMA_8"], + best_fit_params["OMEGA_M"], + best_fit_params["OMEGA_M"] - omegam_stats.limits[0].lower, + omegam_stats.limits[0].upper - best_fit_params["OMEGA_M"], + ], + ) + ) +print(param_values) +np.savetxt( + f"{root_dir}/param_values.txt", + param_values, + fmt=["%s" for i in range(11)], + delimiter=";", +) + + +# Load the value of the parameters +cosmo = np.loadtxt( + f"{root_dir}/param_values.txt", + dtype={ + "names": ( + "Expt", + "colour", + "s8_mean", + "s8_low", + "s8_high", + "sigma8_mean", + "sigma8_low", + "sigma8_high", + "omegam_mean", + "omegam_low", + "omegam_high", + ), + "formats": ( + "U250", + "U20", + "U20", + "U20", + "U20", + "U20", + "U20", + "U20", + "U20", + "U20", + "U20", + ), + }, + skiprows=1, + delimiter=";", +) +expt = np.char.replace(cosmo["Expt"], "\\\\", "\\") +colours = cosmo["colour"] +s8_mean = cosmo["s8_mean"].astype(np.float64) +s8_low = cosmo["s8_low"].astype(np.float64) +s8_high = cosmo["s8_high"].astype(np.float64) +sigma8_mean = cosmo["sigma8_mean"].astype(np.float64) +sigma8_low = cosmo["sigma8_low"].astype(np.float64) +sigma8_high = cosmo["sigma8_high"].astype(np.float64) +omegam_mean = cosmo["omegam_mean"].astype(np.float64) +omegam_low = cosmo["omegam_low"].astype(np.float64) +omegam_high = cosmo["omegam_high"].astype(np.float64) + + +from matplotlib.gridspec import GridSpec + +fig = plt.figure(figsize=(13, 8)) +gs = GridSpec(1, 3, width_ratios=[1, 0.5, 0.5]) +ax1 = fig.add_subplot(gs[0]) +ax2 = fig.add_subplot(gs[1], sharey=ax1) +ax3 = fig.add_subplot(gs[2], sharey=ax1) + +axs = [ax1, ax2, ax3] + +params = [ + (s8_mean, s8_low, s8_high, r"$S_8$"), + (sigma8_mean, sigma8_low, sigma8_high, r"$\sigma_8$"), + (omegam_mean, omegam_low, omegam_high, r"$\Omega_{\rm m}$"), +] +reference = r"UNIONS-3500 $\xi_{\pm}(\theta)$ (This work)" + +separation_after = [ + r"UNIONS-3500 $C_\ell$ (Guerrini et al. 2026)", + r"HSC-Y3 $C_\ell$", + r"$\xi_+$ small scales, $\theta$=[5,83] arcmin", + r"Unmasked covmat", + r"$\texttt{HMCode}$ no baryons", + r"Nautilus sampler", +] +list_section_index = [r"(ii)", r"(iii)", r"(iv)", r"(v)", r"(vi)", r"(vii)"] + +preliminary_watermark = False +blind_axes = False +row_spacing = 0.2 + +index_ref = np.where(expt == reference)[0][0] + +y = np.arange(len(expt)) +for ax, param in zip(axs, params): + means, lows, highs, label = param + for i, mean, low, high, color in zip(y, means, lows, highs, colours): + ax.errorbar( + mean, + 0.05 + i * row_spacing, + xerr=np.array([low, high])[:, None], + fmt="o", + color=color, + ecolor=color, + elinewidth=2, + capsize=3, + ) + ax.set_xlabel(label, fontsize=14) + + ax.grid(False) + ax.tick_params(axis="y", left=False, labelleft=False) + if label == r"$S_8$": + ax.axvspan( + s8_mean[index_ref] - s8_low[index_ref], + s8_mean[index_ref] + s8_high[index_ref], + color=colours[index_ref], + alpha=0.2, + ) + ax.set_xlim(0.6, 1.35) + if blind_axes: + ref_tick = np.mean(s8_mean[:4]) + ax.set_xticks([ref_tick + i * 0.1 for i in range(-5, 5)], labels=[]) + elif label == r"$\sigma_8$": + ax.axvspan( + sigma8_mean[index_ref] - sigma8_low[index_ref], + sigma8_mean[index_ref] + sigma8_high[index_ref], + color=colours[index_ref], + alpha=0.2, + ) + ax.set_xlim(0.5, 1.35) + if blind_axes: + ref_tick = np.mean(sigma8_mean[:4]) + ax.set_xticks([ref_tick + i * 0.2 for i in range(-2, 2)], labels=[]) + elif label == r"$\Omega_{\rm m}$": + ax.axvspan( + omegam_mean[index_ref] - omegam_low[index_ref], + omegam_mean[index_ref] + omegam_high[index_ref], + color=colours[index_ref], + alpha=0.2, + ) + ax.set_xlim(0.1, 0.5) + if blind_axes: + ref_tick = np.mean(omegam_mean[:4]) + ax.set_xticks([ref_tick + i * 0.1 for i in range(-2, 3)], labels=[]) + + +ax1.set_yticks(0.01 + y * row_spacing) +ax1.set_yticklabels([]) +for label, color in zip(expt, colours): + if "This work" in label: + label_bold = ( + r"$\bf{UNIONS}$-$\bf{3500}$ $\xi_{\pm}(\theta)$ $\bf{(This\ work)}$" + ) + ax1.text( + -0.6, + 0.05 + row_spacing * np.where(expt == label)[0][0], + label_bold, + fontsize=12, + ha="left", + va="center", + color=color, + ) + else: + ax1.text( + -0.6, + 0.05 + row_spacing * np.where(expt == label)[0][0], + label, + fontsize=12, + ha="left", + va="center", + color=color, + ) + if label != reference: + index = np.where(expt == label)[0][0] + s8_tension = cp.get_sigma_tension( + s8_mean[index], + s8_low[index], + s8_high[index], + s8_mean[index_ref], + s8_low[index_ref], + s8_high[index_ref], + ) + sign_str = "+" if s8_tension > 0 else "-" + ax1.text( + 1.32, + 0.05 + row_spacing * index, + rf"${sign_str}{np.abs(s8_tension):.2f}" + r"\, \sigma$", + fontsize=10, + ha="right", + va="center", + color=color, + ) +# Add separation lines +for i, sep in enumerate(separation_after): + print(sep) + index_sep = np.where(expt == sep)[0][0] + ax2.axhline( + row_spacing * (index_sep + 1) - 0.07, + color="black", + linestyle="dotted", + linewidth=1, + ) + ax3.axhline( + row_spacing * (index_sep + 1) - 0.07, + color="black", + linestyle="dotted", + linewidth=1, + ) + ax1.axhline( + row_spacing * (index_sep + 1) - 0.07, + xmin=-1.8, + color="black", + linestyle="dotted", + linewidth=1, + clip_on=False, + ) + ax1.text( + -0.61, + row_spacing * (index_sep + 1) + 0.05, + list_section_index[i], + fontsize=12, + fontweight="bold", + va="center", + ha="right", + ) + + +# --- Add section label (i)) --- +ax1.text(-0.61, 0.05, r"(i)", fontsize=12, fontweight="bold", va="center", ha="right") + +if preliminary_watermark: + plt.figtext( + 0.5, + 0.5, + "PRELIMINARY", + fontsize=50, + color="gray", + ha="center", + va="center", + alpha=0.3, + rotation=330, + ) + +plt.gca().invert_yaxis() + +plt.tight_layout() + +# #Save pdf +plt.savefig("./../../results/S8_whisker_plot.pdf", bbox_inches="tight") diff --git a/papers/realspace/best_fit_xipm.py b/papers/realspace/best_fit_xipm.py new file mode 100644 index 00000000..ebd66f27 --- /dev/null +++ b/papers/realspace/best_fit_xipm.py @@ -0,0 +1,497 @@ +import os +import sys + +sys.path.append("/home/guerrini/sp_validation/cosmo_inference/scripts") + +import chain_postprocessing as cp +import matplotlib.pyplot as plt +import matplotlib.scale as mscale +import numpy as np +import seaborn as sns +from astropy.io import fits +from getdist import plots + +plt.style.use("/home/guerrini/matplotlib_config/paper.mplstyle") + +from sp_validation.rho_tau import SquareRootScale + +mscale.register_scale(SquareRootScale) + +plt.rcParams["text.usetex"] = True + +sns.set_palette("husl") + +g = plots.get_subplot_plotter(width_inch=30) +g.settings.axes_fontsize = 40 +g.settings.axes_labelsize = 40 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 50 + +# Directory where the chains are located +root_dir = "/n09data/guerrini/output_chains" + +# THE BLIND TO USE FOR THE PLOTS +blind = "B" +catalog_version = "SP_v1.4.6.3" +fiducial_root_cell = f"SP_v1.4.6.3_leak_corr_{blind}" +label_fiducial_cell = r"UNIONS $C_{\ell}$" +fiducial_root_xi_data = f"SP_v1.4.6.3_leak_corr_{blind}_masked" +fiducial_root_xi_chains = f"SP_v1.4.6.3_{blind}_fiducial_config" +label_fiducial_xi = r"UNIONS $\xi_{\pm}$" + +# Path to the ini files used +path_ini_files = "/home/guerrini/sp_validation/cosmo_inference/cosmosis_config" +path_datavectors = "/home/guerrini/sp_validation/cosmo_inference/data/" +path_output_chains = "/n09data/guerrini/output_chains/" + + +data_cell = fits.open( + os.path.join( + path_datavectors, f"{fiducial_root_cell}/cosmosis_{fiducial_root_cell}.fits" + ) +) + +data_xi = fits.open( + os.path.join( + path_datavectors, + f"SP_v1.4.6.3_config/SP_v1.4.6.3_{blind}/cosmosis_{fiducial_root_xi_data}.fits", + ) +) + +path_samples_fiducial_cell = os.path.join( + path_output_chains, + fiducial_root_cell, + fiducial_root_cell, + f"samples_{fiducial_root_cell}_cell.txt", +) +path_gd_fiducial_cell = os.path.join( + path_output_chains, + fiducial_root_cell, + fiducial_root_cell, + f"getdist_{fiducial_root_cell}_cell", +) +cp.load_samples_and_write_paramnames( + path_samples_fiducial_cell, path_gd_fiducial_cell + ".paramnames" +) +cp.write_samples_getdist_format( + path_samples_fiducial_cell, path_gd_fiducial_cell + ".txt", chain_type="polychord" +) + +chain_fiducial_cell = cp.load_chain(path_gd_fiducial_cell, smoothing_scale=0.5) + +best_fit_params_fiducial_cell = cp.extract_best_fit_params( + chain_fiducial_cell, best_fit_method="2Dkde" +) + +cp.compute_best_fit( + path_ini_files, + best_fit_params_fiducial_cell, + fiducial_root_cell, + is_harmonic=True, + blind=blind, +) +path_samples_fiducial_xi = os.path.join( + path_output_chains, + fiducial_root_xi_chains, + f"samples_{fiducial_root_xi_chains}.txt", +) + +path_gd_fiducial_xi = os.path.join( + path_output_chains, fiducial_root_xi_chains, f"getdist_{fiducial_root_xi_chains}" +) +cp.load_samples_and_write_paramnames( + path_samples_fiducial_xi, path_gd_fiducial_xi + ".paramnames" +) +cp.write_samples_getdist_format( + path_samples_fiducial_xi, path_gd_fiducial_xi + ".txt", chain_type="polychord" +) + +chain_fiducial_xi = cp.load_chain(path_gd_fiducial_xi, smoothing_scale=0.5) + +best_fit_params_fiducial_xi = cp.extract_best_fit_params( + chain_fiducial_xi, best_fit_method="2Dkde" +) + +ini_file_root = os.path.join( + path_ini_files, + f"config_space_v1.4.6.3_fiducial/pipeline/blind_{blind}/fiducial.ini", +) +cp.compute_best_fit( + path_ini_files, + best_fit_params_fiducial_xi, + fiducial_root_xi_chains, + is_harmonic=False, + blind=blind, + ini_file_root=ini_file_root, +) + +root_to_plot = [ + fiducial_root_xi_chains, + fiducial_root_cell, +] + +labels = [ + r"UNIONS $\xi_\pm(\theta)$", + r"UNIONS $C_\ell$", +] + +line_args = [ + {"color": "royalblue", "linestyle": "-"}, + {"color": "orange", "linestyle": "-"}, +] + +properties = {} + +properties = cp.update_properties_w_roots( + properties, fiducial_root_cell, path_ini_files, with_configuration=False +) +properties = cp.update_properties_w_roots( + properties, + fiducial_root_xi_chains, + path_ini_files, + with_configuration=True, + path_to_this_ini=ini_file_root, +) + + +root_to_plot = [fiducial_root_cell, fiducial_root_xi_chains] +labels = [r"Best fit $C_\ell$", r"Best fit $\xi_\pm(\theta)$"] +path_best_fit_xi_theta = os.path.join( + path_output_chains, fiducial_root_xi_chains, "best_fit/shear_xi_plus/theta.txt" +) + +theta_rad = np.loadtxt(path_best_fit_xi_theta) +theta_min = 1 +theta_max = 250 + +cp.compute_best_fit_xi_from_cell( + path_output_chains, fiducial_root_cell, best_fit_params_fiducial_cell, theta_rad +) + +data = fits.open( + os.path.join( + path_datavectors, + f"SP_v1.4.6.3_config/SP_v1.4.6.3_{blind}/cosmosis_{fiducial_root_xi_data}.fits", + ) +) +bbox_to_anchor_xip = (0.685, 0.09) +bbox_to_anchor_xim = (0.3, 0.65) +xi_p_data = data["XI_PLUS"].data +xi_m_data = data["XI_MINUS"].data +cov_mat = data["COVMAT"].data + +# Plot hyperparameter +loc_legend = "lower center" + +fig, [ax, ax2] = plt.subplots(1, 2, figsize=(20, 8)) + +theta, xi_p, xi_m = xi_p_data["ANG"], xi_p_data["VALUE"], xi_m_data["VALUE"] +ax.errorbar( + theta, + theta * xi_p, + yerr=theta * np.sqrt(np.diag(cov_mat[: len(theta), : len(theta)])), + fmt="o", + label=r"UNIONS $\xi_+$ data", + color="black", + capsize=2, +) +ax2.errorbar( + theta, + theta * xi_m, + yerr=theta + * np.sqrt( + np.diag(cov_mat[len(theta) : 2 * len(theta), len(theta) : 2 * len(theta)]) + ), + fmt="o", + label=r"UNIONS $\xi_-$ data", + color="black", + capsize=2, +) + +for idx, (label, root) in enumerate(zip(labels, root_to_plot)): + # Read the results + theta = ( + ( + np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_plus/theta.txt".format(root) + ) + ) + * 180 + / np.pi + * 60 + ) + xi_plus = np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_plus/bin_1_1.txt".format(root) + ) + xi_minus = np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_minus/bin_1_1.txt".format(root) + ) + if r"$C_\ell$" not in label: + xi_sys_plus = np.loadtxt( + path_output_chains + "{}/best_fit/xi_sys/shear_xi_plus.txt".format(root) + ) + xi_sys_minus = np.loadtxt( + path_output_chains + "{}/best_fit/xi_sys/shear_xi_minus.txt".format(root) + ) + theta_xi_sys = ( + np.loadtxt(path_output_chains + "{}/best_fit/xi_sys/theta.txt".format(root)) + * 180 + / np.pi + * 60 + ) + + xi_sys_plus = np.interp(theta, theta_xi_sys, xi_sys_plus) + xi_sys_minus = np.interp(theta, theta_xi_sys, xi_sys_minus) + xi_plus += xi_sys_plus + xi_minus += xi_sys_minus + + mask = (theta > theta_min) & (theta < theta_max) + theta = theta[mask] + ax.plot( + theta, + theta * xi_plus[mask], + label=r"Best fit $\xi_+(\theta)$", + **line_args[idx], + lw=2.5, + ) + ax.plot( + theta, + theta * xi_sys_plus[mask], + label=r"Best fit $\xi^{\rm sys}_{+}(\theta)$", + c="r", + ) + ax2.plot( + theta, + theta * xi_minus[mask], + label=r"Best fit $\xi_-(\theta)$", + **line_args[idx], + lw=2.5, + ) + ax2.plot( + theta, + theta * xi_sys_minus[mask], + label=r"Best fit $\xi^{\rm sys}_{-}(\theta)$", + c="r", + ) + + else: + mask = (theta > theta_min) & (theta < theta_max) + theta = theta[mask] + ax.plot(theta, theta * xi_plus[mask], label=label, **line_args[idx], lw=2.5) + ax2.plot(theta, theta * xi_minus[mask], label=label, **line_args[idx], lw=2.5) + +# XI PLUS PLOT SETTINGS + +# Plot the scale cuts for different k_max +ax.axvline(x=5, color="gray", linestyle="--", alpha=0.7) +ax.axhline(y=0, color="black", linestyle="--", alpha=0.7) + +ymin = ax.get_ylim()[0] +ymax = ax.get_ylim()[1] +# Shadowing cut scaled +ax.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color="gray", alpha=0.2) +ax.fill_betweenx(y=[ymin, ymax], x1=83, x2=250, color="gray", alpha=0.2) + +ax.set_ylim(ymin, ymax) + +# Add labels directly under the tick +ax.text( + 4.5, + 0.47e-4, + r"$k_\mathrm{max} = 1 h$ Mpc$^{-1}$", + ha="center", + va="top", + fontsize=20, + rotation=90, +) + +ax.set_ylabel(r"$\theta \xi_\pm$", fontsize=26) +ax.set_xlabel(r"$\theta$ (arcmin)", fontsize=26) +ax.set_xlim([theta.min() - 0.1, theta.max() + 20]) +ax.set_title(r"$\xi_+(\theta)$", fontsize=26) +ax.set_xscale("log") +ax.set_xticks(np.array([1, 10, 100])) +ax.tick_params(axis="x", which="minor", length=2, width=0.8) +ax.tick_params(axis="both", which="major", labelsize=24) +ax.tick_params(axis="both", which="minor", labelsize=20) +ax.yaxis.get_offset_text().set_fontsize(24) +ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) +ax.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xip, fontsize=20) + +# XI_MINUS PLOT SETTINGS + +# Plot the scale cuts for different k_max +ax2.axvline(x=50, color="gray", linestyle="--", alpha=0.7) +ax2.axhline(y=0, color="black", linestyle="--", alpha=0.7) + +ymin = ax2.get_ylim()[0] +ymax = ax2.get_ylim()[1] +# Shadowing cut scaled +ax2.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color="gray", alpha=0.2) +ax2.fill_betweenx(y=[ymin, ymax], x1=83, x2=250, color="gray", alpha=0.2) + +ax2.set_ylim(ymin, ymax) + +# Add labels directly under the tick +ax2.text( + 45, + 1.15e-4, + r"$k_\mathrm{max} = 1 h$ Mpc$^{-1}$", + ha="center", + va="top", + fontsize=20, + rotation=90, +) + +# ax2.set_ylabel(r'$\theta \xi_-$', fontsize=16) +ax2.set_xlabel(r"$\theta$ (arcmin)", fontsize=26) +ax2.set_xlim([theta.min() - 0.1, theta.max() + 20]) +ax2.set_xscale("log") +ax2.set_title(r"$\xi_-(\theta)$", fontsize=26) +ax2.set_xticks(np.array([1, 10, 100])) +ax2.tick_params(axis="x", which="minor", length=2, width=0.8) +ax2.tick_params(axis="both", which="major", labelsize=24) +ax2.tick_params(axis="both", which="minor", labelsize=20) +ax2.yaxis.get_offset_text().set_fontsize(24) +ax2.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) +ax2.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xim, fontsize=20) + +plt.savefig("./../../results/best_fit_xipm_SP_v1.4.6.3_B.pdf", bbox_inches="tight") + + +root_to_plot = [fiducial_root_xi_chains] +labels = [r"Best fit $\tau_{0,2}(\theta)$"] + +bbox_to_anchor_xip = (0.285, 0.7) +bbox_to_anchor_xim = (0.3, 0.65) +tau0_data = data["TAU_0_PLUS"].data +tau2_data = data["TAU_2_PLUS"].data +cov_mat = data["COVMAT"].data + +# Plot hyperparameter + +fig, [ax, ax2] = plt.subplots(1, 2, figsize=(20, 8)) + +theta, tau0, tau2 = tau0_data["ANG"], tau0_data["VALUE"], tau2_data["VALUE"] +ax.errorbar( + theta, + theta * tau0, + yerr=theta + * np.sqrt( + np.diag( + cov_mat[2 * len(theta) : 3 * len(theta), 2 * len(theta) : 3 * len(theta)] + ) + ), + fmt="o", + label=r"UNIONS $\tau_{0,+}$", + color="black", + capsize=2, +) +ax2.errorbar( + theta, + theta * tau2, + yerr=theta + * np.sqrt( + np.diag( + cov_mat[3 * len(theta) : 4 * len(theta), 3 * len(theta) : 4 * len(theta)] + ) + ), + fmt="o", + label=r"UNIONS $\tau_{2,+}$", + color="black", + capsize=2, +) + +for idx, (label, root) in enumerate(zip(labels, root_to_plot)): + # Read the results + theta = ( + ( + np.loadtxt( + path_output_chains + "{}/best_fit/tau_0_plus/theta.txt".format(root) + ) + ) + * 180 + / np.pi + * 60 + ) + tau0_plus = np.loadtxt( + path_output_chains + "{}/best_fit/tau_0_plus/bin_1_1.txt".format(root) + ) + tau2_plus = np.loadtxt( + path_output_chains + "{}/best_fit/tau_2_plus/bin_1_1.txt".format(root) + ) + + mask = (theta > theta_min) & (theta < theta_max) + theta = theta[mask] + ax.plot( + theta, + theta * tau0_plus[mask], + label=r"Best fit $\tau_{0,+}(\theta)$", + c="orange", + lw=2.5, + ) + ax2.plot( + theta, + theta * tau2_plus[mask], + label=r"Best fit $\tau_{2,+}(\theta)$", + c="orange", + lw=2.5, + ) + +# XI PLUS PLOT SETTINGS + +# Plot the scale cuts for different k_max +ax.axhline(y=0, color="black", linestyle="--", alpha=0.7) + +ymin = ax.get_ylim()[0] +ymax = ax.get_ylim()[1] + +ax.set_ylim(ymin, ymax) + +ax.set_ylabel(r"$\theta\tau_{0,2}$", fontsize=26) +ax.set_xlabel(r"$\theta$ (arcmin)", fontsize=26) +ax.set_xlim([theta.min() - 0.1, theta.max() + 20]) +ax.set_title(r"$\tau_{0,+}(\theta)$", fontsize=26) +ax.set_xscale("log") +ax.set_xticks(np.array([1, 10, 100])) +ax.tick_params(axis="x", which="minor", length=2, width=0.8) +ax.tick_params(axis="both", which="major", labelsize=24) +ax.tick_params(axis="both", which="minor", labelsize=20) +ax.yaxis.get_offset_text().set_fontsize(24) +ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) +ax.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xip, fontsize=20) + +# XI_MINUS PLOT SETTINGS + +# Plot the scale cuts for different k_max +ax2.axhline(y=0, color="black", linestyle="--", alpha=0.7) + +ymin = ax2.get_ylim()[0] +ymax = ax2.get_ylim()[1] +# Shadowing cut scaled +ax2.fill_betweenx( + y=[ymin, ymax], + x1=0, + x2=12, + color="gray", + alpha=0.2, + label=r"$B$-mode informed scale cut", +) +ax2.fill_betweenx(y=[ymin, ymax], x1=83, x2=250, color="gray", alpha=0.2) + +ax2.set_ylim(ymin, ymax) + +# ax2.set_ylabel(r'$\theta \xi_-$', fontsize=16) +ax2.set_xlabel(r"$\theta$ (arcmin)", fontsize=26) +ax2.set_xlim([theta.min() - 0.1, theta.max() + 20]) +ax2.set_xscale("log") +ax2.set_title(r"$\tau_{2,+}(\theta)$", fontsize=26) +ax2.set_xticks(np.array([1, 10, 100])) +ax2.tick_params(axis="x", which="minor", length=2, width=0.8) +ax2.tick_params(axis="both", which="major", labelsize=24) +ax2.tick_params(axis="both", which="minor", labelsize=20) +ax2.yaxis.get_offset_text().set_fontsize(24) +ax2.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) +ax2.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xim, fontsize=20) + +plt.savefig("./../../results/best_fit_tau_02_SP_v1.4.6.3_B.pdf", bbox_inches="tight") diff --git a/papers/realspace/contours.py b/papers/realspace/contours.py new file mode 100644 index 00000000..78b988f4 --- /dev/null +++ b/papers/realspace/contours.py @@ -0,0 +1,745 @@ +# # 2D contour plots +# +# This notebook produces the plots for all the 2D contours in the results section. + + +import os.path + +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns +from astropy.io import fits +from getdist import plots + +plt.style.use("/home/guerrini/matplotlib_config/paper.mplstyle") + +plt.rcParams["text.usetex"] = True + +sns.set_palette("husl") +g = plots.get_subplot_plotter(width_inch=30) +g.settings.axes_fontsize = 70 +g.settings.axes_labelsize = 80 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 70 + + +# SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE + +root_dir = "/n09data/guerrini/output_chains/" +path_datavectors = "/home/guerrini/sp_validation/cosmo_inference/data/" +path_output_chains = "/n09data/guerrini/output_chains/" + +data = fits.open( + os.path.join( + path_datavectors, + "SP_v1.4.6.3_config/SP_v1.4.6.3_B/cosmosis_SP_v1.4.6.3_leak_corr_B_masked.fits", + ) +) + +roots_fid = { + "SP_v1.4.6.3_leak_corr_B": r"UNIONS-3500 $C_\ell$", + "SP_v1.4.6.3_B_fiducial_config": r"UNIONS-3500 $\xi_\pm$ (This work) ", + "KiDS-Legacy_xipm": r"KiDS-Legacy $\xi_\pm$", + "HSC_Y3": r"HSC-Y3 $\xi_\pm$", + "Planck18": r"$\textit{Planck}$ 2018", +} + +roots_full = { + "SP_v1.4.6.3_B_fiducial_config": r"UNIONS-3500 $\xi_\pm$ (This work) ", +} + +roots_ia = { + "SP_v1.4.6.3_B_fiducial_config": r"Gaussian $A_{\rm{IA}}$ prior", + "SP_v1.4.6.3_B_flat_ia_config": r"Flat $A_{\rm{IA}}$ prior", + "SP_v1.4.6.3_B_no_ia_config": r"No IA", +} + +roots_ext = { + "SP_v1.4.6.3_B_fiducial_config": r"UNIONS-3500 $\xi_\pm$", + "SP_v1.4.6.3_B_planck_config": r"UNIONS-3500 $\xi_\pm$ + CMB", + "SP_v1.4.6.3_B_planck_desi_config": r"UNIONS-3500 $\xi_\pm$ + CMB + BAO", + "Planck18": r"$\textit{Planck}$ 2018", +} + +roots_dz = { + "SP_v1.4.6.3_B_fiducial_config": r"Gaussian $\Delta z$ prior", + "SP_v1.4.6.3_B_flat_delta_z_config": r"Flat $\Delta z$ prior", + "SP_v1.4.6.3_B_no_delta_z_config": r"No $\Delta z$ modelling", +} + +roots_psf = { + "SP_v1.4.6.3_B_flat_alpha_beta_config": r"Flat $\alpha$ and $\beta$ priors", + "SP_v1.4.6.3_B_fiducial_config": r"Gaussian $\alpha$ and $\beta$ priors", + "SP_v1.4.6.3_B_no_xi_sys_config": r"No $\xi^{\rm sys}$ included", + "SP_v1.4.6.3_B_no_leak_corr_config": r"No object-wise leakage correction", +} + +roots_scale = { + "SP_v1.4.6.3_B_fiducial_config": r"$\xi_+$: $\theta=[12,83]$", + "SP_v1.4.6.3_B_small_scales_config": r"$\xi_+$: $\theta=[5,83]$", +} + +roots_nonlin = { + "SP_v1.4.6.3_B_fiducial_config": r"Fiducial (\texttt{HMCode2020}, $\log(T_{\rm AGN})$)", + "SP_v1.4.6.3_B_no_baryons_config": r"\texttt{HMCode2020} no baryons", + "SP_v1.4.6.3_B_halofit_config": r"\texttt{Halofit}", +} +roots = roots_ext + + +# ## Retrieve the chains + + +# READ CHAIN + +chains = [] + +for i, root in enumerate(list(roots.keys())): + burnin = 0 + if "SP" not in root: + chain = g.samples_for_root( + root_dir + "ext_data/{}/getdist_{}".format(root, root), + cache=False, + settings={ + "ignore_rows": burnin, + # 'smooth_scale_2D':0.2, + # 'smooth_scale_1D':0.2 + }, + ) + p = chain.getParams() + if hasattr(p, "S_8") == False: + omega_m = chain.getParams().OMEGA_M + sigma_8 = chain.getParams().SIGMA_8 + + s_8 = sigma_8 * (omega_m / 0.3) ** 0.5 + + chain.addDerived(s_8, name="S_8", label=r"S_8") + + p = chain.paramNames.parWithName("S_8") + + elif "config" in root: + if os.path.isfile(root_dir + "{}/getdist_{}.txt".format(root, root)) == False: + samples = np.loadtxt(root_dir + "{}/samples_{}.txt".format(root, root)) + + if "nautilus" in root: + weights = np.exp(samples[:, -3]) + neglogL = samples[:, -2] - samples[:, -1] + + samples = np.column_stack((weights, neglogL, samples[:, 0:-3])) + elif "mh" in root: + samples = np.column_stack( + ( + np.ones_like(samples[:, -1]), + np.log(samples[:, -1]) - np.log(samples[:, -2]), + samples[:, 0:-2], + ) + ) + burnin = 0.3 + else: + samples = np.column_stack( + (samples[:, -1], samples[:, -3], samples[:, 0:-4]) + ) + + np.savetxt(root_dir + "{}/getdist_{}.txt".format(root, root), samples) + + chain = g.samples_for_root( + root_dir + "{}/getdist_{}".format(root, root), + cache=False, + settings={ + "ignore_rows": burnin, + # 'smooth_scale_2D':0.2, + # 'smooth_scale_1D':0.2 + }, + ) + else: + if ( + os.path.isfile( + root_dir + "{}/{}/getdist_{}_cell.txt".format(root, root, root) + ) + == False + ): + samples = np.loadtxt( + root_dir + "{}/{}/samples_{}_cell.txt".format(root, root, root) + ) + + if "nautilus" in root: + weights = np.exp(samples[:, -3]) + neglogL = samples[:, -2] - samples[:, -1] + + samples = np.column_stack((weights, neglogL, samples[:, 0:-3])) + elif "mh" in root: + samples = np.column_stack( + ( + np.ones_like(samples[:, -1]), + np.log(samples[:, -1]) - np.log(samples[:, -2]), + samples[:, 0:-2], + ) + ) + burnin = 0.3 + else: + samples = np.column_stack( + (samples[:, -1], samples[:, -3], samples[:, 0:-4]) + ) + + np.savetxt( + root_dir + "{}/{}/getdist_{}_cell.txt".format(root, root, root), samples + ) + + chain = g.samples_for_root( + root_dir + "{}/{}/getdist_{}_cell".format(root, root, root), + cache=False, + settings={ + "ignore_rows": burnin, + # 'smooth_scale_2D':0.2, + # 'smooth_scale_1D':0.2 + }, + ) + p = chain.getParams() + + chains.append(chain) + + +name_list = [ + "OMEGA_M", + "ombh2", + "h0", + "n_s", + "SIGMA_8", + "S_8", + "logt_agn", + "a", + "m1", + "bias_1", + "alpha", + "beta", + "omch2", +] +label_list = [ + r"\Omega_{\rm m}", + r"\omega_{\rm b}", + r"h", + r"n_{\rm s}", + r"\sigma_8", + r"S_8", + r"\log T_{\rm AGN}", + r"A_{\rm IA}", + r"m_1", + r"\Delta z", + r"\alpha_{\rm PSF}", + r"\beta_{\rm PSF}", + r"\omega_{\rm c}", +] + +for chain in chains: + param_names = chain.getParamNames() + p = chain.getParams() + for name, label in zip(name_list, label_list): + if hasattr(p, name): + param_names.parWithName(name).label = label + +legend_labels = list(roots.values()) + + +# ## Plot the chains + + +# ### FIDUCIAL PLOT + + +colours = [ + "royalblue", + "orange", + "crimson", + "forestgreen", + "indigo", +] + +linestyle = ["solid", "solid", "solid", "solid", "solid"] + +line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)] + +# FIDUCIAL PLOT +g.triangle_plot( + chains, + ["SIGMA_8", "S_8", "OMEGA_M"], # + legend_labels=legend_labels, + line_args=line_args, + contour_colors=colours, + label_order=[1, 0, 2, 3, 4], + filled=[True, True, False, False, True], +) + +g.export("./../../results/SP_v1.4.6.3_B_fiducial_config_contour_plot.pdf") + + +# ### FULL PLOT + + +g.settings.axes_fontsize = 40 +g.settings.axes_labelsize = 50 + +colours = [ + "orange", +] + +linestyle = [ + "solid", +] + +line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)] + +# FIDUCIAL PLOT +g.triangle_plot( + chains, + [ + "OMEGA_M", + "ombh2", + "h0", + "n_s", + "SIGMA_8", + "S_8", + "logt_agn", + "a", + "m1", + "bias_1", + ], + legend_labels=legend_labels, + line_args=line_args, + contour_colors=colours, + filled=True, +) + +g.export("./../../results/SP_v1.4.6.3_B_fiducial_config_contour_plot_full.pdf") + + +# ### IA PLOT + + +colours = [ + "orange", + "royalblue", + "forestgreen", +] + +linestyle = [ + "solid", + "solid", + "solid", +] + +line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)] + +g.triangle_plot( + chains, + ["S_8", "OMEGA_M", "a"], # + legend_labels=legend_labels, + line_args=line_args, + contour_args={"alpha": 0.6}, + contour_colors=colours, + filled=[True, False, True], +) + +g.export("./../../results/SP_v1.4.6.3_B_fiducial_config_contour_plot_ia.pdf") + + +# ### PSF PLOT + + +colours = [ + "royalblue", + "orange", + "hotpink", + "slategray", +] + +linestyle = [ + "solid", + "solid", + "solid", + "solid", +] + +line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)] + +g.triangle_plot( + chains, + ["S_8", "OMEGA_M", "alpha", "beta"], # + legend_labels=legend_labels, + line_args=line_args, + contour_args=[{"alpha": 1}, {"alpha": 0.6}, {"alpha": 0.8}, {"alpha": 0.8}], + contour_colors=colours, + legend_loc="upper right", + label_order=[1, 0, 2, 3], + filled=[False, True, True, True], +) + +g.subplots[3, 2].scatter( + 0.005, 0.81, color="k", marker="X", s=400, label="Fiducial config best-fit" +) +g.subplots[3, 2].scatter( + 0.022, 0.798, color="k", marker="P", s=400, label="Fiducial config best-fit" +) + +g.export("./../../results/SP_v1.4.6.3_B_fiducial_config_contour_plot_psf.pdf") + + +# ### DELTA Z PLOT + + +colours = [ + "orange", + "royalblue", + "indigo", +] + +linestyle = [ + "solid", + "solid", + "solid", +] + +line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)] +g.triangle_plot( + chains, + ["S_8", "OMEGA_M", "bias_1"], # + legend_labels=legend_labels, + line_args=line_args, + contour_args=[{"alpha": 1.0}, {"alpha": 0.9}, {"alpha": 0.5}], + contour_colors=colours, + filled=[True, False, True], +) + +g.export("./../../results/SP_v1.4.6.3_B_fiducial_config_contour_plot_dz.pdf") + + +# ### EXTERNAL DATA + + +colours = [ + "orange", + "royalblue", + "crimson", + "forestgreen", +] + +linestyle = [ + "solid", + "solid", + "solid", + "solid", + "solid", +] + +line_args = [dict(color=col, ls=ls) for col, ls in zip(colours, linestyle)] + +g = plots.get_subplot_plotter(width_inch=10) +g.settings.axes_fontsize = 25 +g.settings.axes_labelsize = 25 +g.settings.legend_fontsize = 22 + +g.plot_2d( + chains, + ["S_8", "OMEGA_M", "SIGMA_8"], # + line_args=line_args, + contour_colors=colours, + legend_labels=legend_labels, + alphas=[0.7, 1.0, 1.0, 1.0], + filled=[True, True, True, False], +) + +g.add_y_bands(0.2975, 0.0086, alpha2=0, color="k", label="BAO") +g.add_legend(legend_labels, legend_loc="upper right") + +g.export("./../../results/SP_v1.4.6.3_B_fiducial_config_contour_plot_ext.pdf") + + +# ### Small scales + + +colours = [ + "orange", + "dodgerblue", +] + +linestyle = [ + "solid", + "solid", +] + +line_args = [dict(color=col, ls=ls) for col, ls in zip(colours, linestyle)] + +g = plots.get_subplot_plotter(width_inch=9) +g.settings.axes_fontsize = 25 +g.settings.axes_labelsize = 25 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 30 + +g.plot_2d( + chains, + ["S_8", "OMEGA_M"], # + line_args=line_args, + contour_args=[{"alpha": 0.7}, {"alpha": 1.0}], + contour_colors=colours, + filled=[True, True], +) +g.add_legend(legend_labels, legend_loc="upper right") + +g.export("./../../results/SP_v1.4.6.3_B_fiducial_config_contour_plot_scales.pdf") + + +# ### BBN Prior + + +from getdist.gaussian_mixtures import Gaussian1D + +colours = [ + "orange", + "royalblue", +] + +linestyle = [ + "solid", + "solid", +] + +line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)] + +# BBN PRIOR +bbn_prior = Gaussian1D( + mean=0.02218, + sigma=0.00055, + name="ombh2", + labels=[r"\omega_{\rm b}"], + label="BBN prior", +) +bbn_chain = bbn_prior.MCSamples(3000, label="BBN prior") + +g.triangle_plot( + chains + [bbn_chain], + name_list, + legend_labels=legend_labels, + line_args=line_args, + contour_colors=colours, + filled=[True, False], +) + + +# ## Plot the best-fit $\xi_\pm$ + + +xi_p_data = data["XI_PLUS"].data +xi_m_data = data["XI_MINUS"].data +cov_mat = data["COVMAT"].data + +labels = roots_scale.values() + +bbox_to_anchor_xip = (0.685, 0.09) +bbox_to_anchor_xim = (0.3, 0.65) +theta_min = 1.0 +theta_max = 250.0 +loc_legend = "lower center" + + +colours = [ + "orange", + "dodgerblue", +] + +linestyle = [ + "solid", + "solid", +] + +line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)] + +labels = roots_scale.values() + +fig, ax = plt.subplots(1, 1, figsize=(11, 7)) + +theta, xi_p, xi_m = xi_p_data["ANG"], xi_p_data["VALUE"], xi_m_data["VALUE"] +ax.errorbar( + theta, + theta * xi_p, + yerr=theta * np.sqrt(np.diag(cov_mat[: len(theta), : len(theta)])), + fmt="o", + color="black", + capsize=2, +) + +for idx, (label, root) in enumerate(zip(labels, roots_scale)): + # Read the results + theta = ( + ( + np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_plus/theta.txt".format(root) + ) + ) + * 180 + / np.pi + * 60 + ) + xi_plus = np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_plus/bin_1_1.txt".format(root) + ) + xi_minus = np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_minus/bin_1_1.txt".format(root) + ) + xi_sys_plus = np.loadtxt( + path_output_chains + "{}/best_fit/xi_sys/shear_xi_plus.txt".format(root) + ) + xi_sys_minus = np.loadtxt( + path_output_chains + "{}/best_fit/xi_sys/shear_xi_minus.txt".format(root) + ) + theta_xi_sys = ( + np.loadtxt(path_output_chains + "{}/best_fit/xi_sys/theta.txt".format(root)) + * 180 + / np.pi + * 60 + ) + + xi_sys_plus = np.interp(theta, theta_xi_sys, xi_sys_plus) + xi_sys_minus = np.interp(theta, theta_xi_sys, xi_sys_minus) + xi_plus += xi_sys_plus + xi_minus += xi_sys_minus + + mask = (theta > theta_min) & (theta < theta_max) + theta = theta[mask] + ax.plot(theta, theta * xi_plus[mask], label=label, **line_args[idx]) + +ymin = ax.get_ylim()[0] +ymax = ax.get_ylim()[1] + +ax.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color="gray", alpha=0.2) +ax.fill_betweenx(y=[ymin, ymax], x1=0, x2=5, color="gray", alpha=0.7) +ax.fill_betweenx(y=[ymin, ymax], x1=83, x2=300, color="gray", alpha=0.2) + +ax.set_ylim(ymin, ymax) + +ax.set_ylabel(r"$\theta \xi_\pm$", fontsize=26) +ax.set_xlabel(r"$\theta$ (arcmin)", fontsize=26) +ax.set_xlim([theta.min() - 0.1, theta.max() + 20]) +ax.set_title(r"$\xi_+(\theta)$", fontsize=26) +ax.set_xscale("log") +ax.set_xticks(np.array([1, 10, 100])) +ax.tick_params(axis="x", which="minor", length=2, width=0.8) +ax.tick_params(axis="both", which="major", labelsize=24) +ax.tick_params(axis="both", which="minor", labelsize=20) +ax.yaxis.get_offset_text().set_fontsize(24) +ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) +ax.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xip, fontsize=20) + + +plt.savefig("./../../results/scale_cut_xipm_SP_v1.4.6.3_B.pdf", bbox_inches="tight") + + +labels = roots_nonlin.values() + +colours = ["orange", "hotpink", "teal"] + +linestyle = ["solid", "solid", "dashed"] + +line_args = [dict(color=col, ls=ls, lw=2) for col, ls in zip(colours, linestyle)] + +fig, [ax, ax2] = plt.subplots(2, 1, figsize=(11, 14)) + +theta, xi_p, xi_m = xi_p_data["ANG"], xi_p_data["VALUE"], xi_m_data["VALUE"] +ax.errorbar( + theta, + theta * xi_p, + yerr=theta * np.sqrt(np.diag(cov_mat[: len(theta), : len(theta)])), + fmt="o", + color="black", + capsize=2, +) +ax2.errorbar( + theta, + theta * xi_m, + yerr=theta + * np.sqrt( + np.diag(cov_mat[len(theta) : 2 * len(theta), len(theta) : 2 * len(theta)]) + ), + fmt="o", + color="black", + capsize=2, +) + +for idx, (label, root) in enumerate(zip(labels, roots_nonlin)): + # Read the results + theta = ( + ( + np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_plus/theta.txt".format(root) + ) + ) + * 180 + / np.pi + * 60 + ) + xi_plus = np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_plus/bin_1_1.txt".format(root) + ) + xi_minus = np.loadtxt( + path_output_chains + "{}/best_fit/shear_xi_minus/bin_1_1.txt".format(root) + ) + xi_sys_plus = np.loadtxt( + path_output_chains + "{}/best_fit/xi_sys/shear_xi_plus.txt".format(root) + ) + xi_sys_minus = np.loadtxt( + path_output_chains + "{}/best_fit/xi_sys/shear_xi_minus.txt".format(root) + ) + theta_xi_sys = ( + np.loadtxt(path_output_chains + "{}/best_fit/xi_sys/theta.txt".format(root)) + * 180 + / np.pi + * 60 + ) + + xi_sys_plus = np.interp(theta, theta_xi_sys, xi_sys_plus) + xi_sys_minus = np.interp(theta, theta_xi_sys, xi_sys_minus) + xi_plus += xi_sys_plus + xi_minus += xi_sys_minus + + mask = (theta > theta_min) & (theta < theta_max) + theta = theta[mask] + ax.plot(theta, theta * xi_plus[mask], label=label, **line_args[idx]) + ax2.plot(theta, theta * xi_minus[mask], label=label, **line_args[idx]) + +ymin = ax.get_ylim()[0] +ymax = ax.get_ylim()[1] +ax.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color="gray", alpha=0.2) +ax.fill_betweenx(y=[ymin, ymax], x1=83, x2=300, color="gray", alpha=0.2) + +ax.set_ylim(ymin, ymax) + +ax.set_ylabel(r"$\theta \xi_\pm$", fontsize=26) +ax.set_xlabel(r"$\theta$ (arcmin)", fontsize=26) +ax.set_xlim([theta.min() - 0.1, theta.max() + 20]) +ax.set_title(r"$\xi_+(\theta)$", fontsize=26) +ax.set_xscale("log") +ax.set_xticks(np.array([1, 10, 100])) +ax.tick_params(axis="x", which="minor", length=2, width=0.8) +ax.tick_params(axis="both", which="major", labelsize=24) +ax.tick_params(axis="both", which="minor", labelsize=20) +ax.yaxis.get_offset_text().set_fontsize(24) +ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) + + +ymin = ax2.get_ylim()[0] +ymax = ax2.get_ylim()[1] +ax2.fill_betweenx(y=[ymin, ymax], x1=0, x2=12, color="gray", alpha=0.2) +ax2.fill_betweenx(y=[ymin, ymax], x1=83, x2=3000, color="gray", alpha=0.2) + +ax2.set_ylim(ymin, ymax) +ax2.set_xlabel(r"$\theta$ (arcmin)", fontsize=26) +ax2.set_xlim([theta.min() - 0.1, theta.max()]) +ax2.set_xscale("log") +ax2.set_title(r"$\xi_-(\vartheta)$", fontsize=26) +ax2.set_xticks(np.array([1, 10, 100])) +ax2.tick_params(axis="x", which="minor", length=2, width=0.8) +ax2.tick_params(axis="both", which="major", labelsize=24) +ax2.tick_params(axis="both", which="minor", labelsize=20) +ax2.yaxis.get_offset_text().set_fontsize(24) +ax2.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) +ax2.legend(loc=loc_legend, bbox_to_anchor=bbox_to_anchor_xim, fontsize=20) + +plt.savefig("./../../results/nonlin_xipm_SP_v1.4.6.3_B.pdf", bbox_inches="tight") diff --git a/papers/realspace/cov_masking.py b/papers/realspace/cov_masking.py new file mode 100644 index 00000000..210638cb --- /dev/null +++ b/papers/realspace/cov_masking.py @@ -0,0 +1,82 @@ +# # Covmat mask analysis +# +# This notebook creates the plots to look at the ratio of the covaraiance matrices when applying the mask or not + + +import os + +import healpy as hp +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns + +plt.style.use("/home/guerrini/matplotlib_config/paper.mplstyle") + +plt.rcParams["axes.labelsize"] = 18 +plt.rcParams["xtick.labelsize"] = 18 +plt.rcParams["ytick.labelsize"] = 18 + +plt.rcParams["text.usetex"] = True +sns.set_palette("husl") + +cat_dir = "/n17data/UNIONS/WL/v1.4.x/" +catalog_ver = "v1.4.6.3" +blind = "B" + +nside = 8192 +npix = hp.nside2npix(nside) + +data_dir = "/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/data/" +curr_dir = os.getcwd() + + +# PLOT 2D MAP OF COVMAT masked vs unmasked RATIOS +nbins = 20 +ndata = nbins * 2 +full_ratio = np.zeros((ndata, ndata)) + +cov = np.loadtxt(data_dir + f"/covs/cov_SP_{catalog_ver}_{blind}.txt") +cov_masked = np.loadtxt(data_dir + f"/covs/cov_masked_SP_{catalog_ver}_{blind}.txt") + +for i in range(ndata): + for j in range(ndata): + full_ratio[i][j] = cov_masked[i][j] / cov[i][j] + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) +extent = (0, ndata, ndata, 0) + +vmin, vmax = np.percentile(full_ratio, [1, 99]) + +im3 = ax.imshow(full_ratio, cmap="RdBu_r", vmin=vmin, vmax=vmax, extent=extent) + +cbar = fig.colorbar(im3, ax=ax, fraction=0.046, pad=0.04) + +ax.text(int(ndata / 4), ndata + 5, r"$\xi_+$", fontsize=15) +ax.text(3 * int(ndata / 4), ndata + 5, r"$\xi_-$", fontsize=15) +ax.text(-8, int(ndata / 4), r"$\xi_+$", fontsize=15, rotation=90) +ax.text(-8, 3 * int(ndata / 4), r"$\xi_-$", fontsize=15, rotation=90) +ax.set_xticks([0, 10, 20, 30, 40]) +ax.set_yticks([0, 10, 20, 30, 40]) +ax.set_yticklabels(["1'", "125'", "250'", "125'", "250'"]) +ax.set_xticklabels(["1'", "125'", "250'", "125'", "250'"]) +plt.axvline(x=int(ndata / 2), color="white", linewidth=1.0) +plt.axhline(y=int(ndata / 2), color="white", linewidth=1.0) + +plt.savefig( + f"./../../results/covmat_masked_unmasked_ratio_{catalog_ver}_{blind}.pdf", + bbox_inches="tight", +) + + +theta = np.linspace(1, 250, 20) +plt.axhline(y=1, color="k", ls="--") +plt.plot(theta, np.diag(cov_masked)[:20] / np.diag(cov)[:20], label=r"$\xi_+$") +plt.plot(theta, np.diag(cov_masked)[20:] / np.diag(cov)[20:], label=r"$\xi_-$") + +plt.xlabel(r"$\theta$ (arcmin)") +plt.ylabel("Cov masked / Cov unmasked") +plt.legend(fontsize=20) +plt.savefig( + "./../../results/covmat_masked_unmasked_ratio_diag.pdf", bbox_inches="tight" +) diff --git a/papers/realspace/get_chi2.py b/papers/realspace/get_chi2.py new file mode 100644 index 00000000..c87a33da --- /dev/null +++ b/papers/realspace/get_chi2.py @@ -0,0 +1,564 @@ +import configparser +import os +import re +import subprocess +import sys + +import matplotlib.pyplot as plt +import numpy as np +import scipy.stats as stats +from astropy.io import fits +from getdist import plots +from scipy.interpolate import interp1d + +sys.path.append("/home/guerrini/sp_validation/cosmo_inference/scripts") + +import chain_postprocessing + +plt.rc("mathtext", fontset="stix") +plt.rc("font", family="sans-serif") + +g = plots.get_subplot_plotter(width_inch=30) +g.settings.axes_fontsize = 30 +g.settings.axes_labelsize = 30 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 40 + +# #SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE +root_dir = "/n09data/guerrini/output_chains/" +blind = "B" + +roots = [ + f"SP_v1.4.6.3_{blind}_fiducial_config", + f"SP_v1.4.6.3_{blind}_small_scales_config", + f"SP_v1.4.6.3_{blind}_flat_alpha_beta_config", + f"SP_v1.4.6.3_{blind}_no_xi_sys_config", + f"SP_v1.4.6.3_{blind}_no_leak_corr_config", + f"SP_v1.4.6.3_{blind}_flat_delta_z_config", + f"SP_v1.4.6.3_{blind}_no_delta_z_config", + f"SP_v1.4.6.3_{blind}_flat_ia_config", + f"SP_v1.4.6.3_{blind}_no_ia_config", + f"SP_v1.4.6.3_{blind}_no_m_bias_config", + f"SP_v1.4.6.3_{blind}_unmasked_covmat_config", + f"SP_v1.4.6.3_{blind}_halofit_config", + f"SP_v1.4.6.3_{blind}_no_baryons_config", + f"SP_v1.4.6.3_{blind}_nautilus_config", + f"SP_v1.4.6.3_{blind}_planck_config", + f"SP_v1.4.6.3_{blind}_planck_desi_config", +] + +catalog_versions = [ + f"SP_v1.4.6.3_config/SP_v1.4.6.3_{blind}", +] + +catalog_sub_versions = [ + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", + f"SP_v1.4.6.3_leak_corr_{blind}_masked", +] +output_folder = "/n09data/guerrini/output_chains/" + +path_ini_files = "/home/guerrini/sp_validation/cosmo_inference/cosmosis_config/" + + +ini_roots = [ + f"blind_{blind}/fiducial", + f"blind_{blind}/small_scales", + f"blind_{blind}/flat_alpha_beta", + f"blind_{blind}/no_xi_sys", + f"blind_{blind}/no_leak_corr", + f"blind_{blind}/flat_delta_z", + f"blind_{blind}/no_delta_z", + f"blind_{blind}/flat_ia", + f"blind_{blind}/no_ia", + f"blind_{blind}/no_m_bias", + f"blind_{blind}/unmasked_covmat", + f"blind_{blind}/halofit", + f"blind_{blind}/no_baryons", + f"blind_{blind}/nautilus", + f"blind_{blind}/planck", + f"blind_{blind}/planck_desi", +] + +properties = {} + +for i, root in enumerate(roots): + print(root) + config = configparser.ConfigParser() + config.optionxform = str # Preserve case sensitivity of option names + config.read( + path_ini_files + + "config_space_v1.4.6.3_fiducial/pipeline/" + + ini_roots[i] + + ".ini" + ) + add_xi_sys = config["2pt_like"]["add_xi_sys"] + lower_bound_xi_plus, upper_bound_xi_plus = map( + float, config["2pt_like"]["angle_range_XI_PLUS_1_1"].split() + ) + lower_bound_xi_minus, upper_bound_xi_minus = map( + float, config["2pt_like"]["angle_range_XI_MINUS_1_1"].split() + ) + + properties[root] = { + "add_xi_sys": add_xi_sys, + "lower_bound_xi_plus": lower_bound_xi_plus, + "upper_bound_xi_plus": upper_bound_xi_plus, + "lower_bound_xi_minus": lower_bound_xi_minus, + "upper_bound_xi_minus": upper_bound_xi_minus, + } + + +# ## Retrieve the chains + + +# READ CHAIN + +chains = [] + +for i, root in enumerate(roots): + burnin = 0 + + if os.path.isfile(root_dir + "{}/getdist_{}.txt".format(root, root)) == False: + samples = np.loadtxt(root_dir + "{}/samples_{}.txt".format(root, root)) + + if "nautilus" in root: + samples = np.column_stack( + ( + np.exp(samples[:, -3]), + samples[:, -1] - samples[:, -2], + samples[:, 0:-3], + ) + ) + elif "mh" in root: + samples = np.column_stack( + ( + np.ones_like(samples[:, -1]), + np.log(samples[:, -1]) - np.log(samples[:, -2]), + samples[:, 0:-2], + ) + ) + burnin = 0.3 + else: + samples = np.column_stack( + (samples[:, -1], samples[:, -3], samples[:, 0:-4]) + ) + + np.savetxt(root_dir + "{}/getdist_{}.txt".format(root, root), samples) + + chain = g.samples_for_root( + root_dir + "{}/getdist_{}".format(root, root), + cache=False, + settings={ + "ignore_rows": burnin, + "smooth_scale_2D": 0.5, + "smooth_scale_1D": 0.5, + }, + ) + p = chain.getParams() + + chains.append(chain) + + +param_list = [ + "OMEGA_M", + "ombh2", + "h0", + "n_s", + "SIGMA_8", + "s_8_input", + "logt_agn", + "a", + "m1", + "bias_1", + "alpha", + "beta", + "omch2", + "m", + "a_planck", +] +label_list = [ + r"\Omega_m", + r"\omega_b", + "h_0", + "n_s", + r"\sigma_8", + "S_8", + "log T_{AGN}", + "A_{IA}", + "m_1", + r"\Delta z_1", + "\\alpha_{PSF}", + "\\beta_{PSF}", + r"\omega_c", + "M", + "A_{\rm Planck}", +] + +for chain in chains: + param_names = chain.getParamNames() + for name, label in zip(param_list, label_list): + if param_names.parWithName(name) is not None: + param_names.parWithName(name).label = label + + +# ## Extract the best fit parameters + + +best_fit = {} + +for root, chain in zip(roots, chains): + print(root) + p = chain.getParams() + + best_fit[root] = chain_postprocessing.extract_best_fit_params( + chain, best_fit_method="2Dkde" + ) + + for param_name in best_fit[root].keys(): + high_68, low_68, high_95, low_95 = chain_postprocessing.compute_limits( + chain, param_name + ) + if param_name == "S_8": + print(f"{best_fit[root][param_name]}") + + +# ## Run `Cosmosis` in test mode to get the data vectors + + +if not os.path.exists(path_ini_files + "/values_empty.ini"): + content = """[cosmological_parameters] + +tau = 0.0544 +w = -1.0 +mnu = 0.06 +omega_k = 0.0 +wa = 0.0 + +[halo_model_parameters] + +[intrinsic_alignment_parameters] + +[shear_calibration_parameters] + +[nofz_shifts] + +[psf_leakage_parameters] +""" + + with open(path_ini_files + "/values_empty.ini", "w") as f: + f.write(content) + f.close() + + print("File created successfully") + + +section_map = { + "omch2": "cosmological_parameters", + "ombh2": "cosmological_parameters", + "h0": "cosmological_parameters", + "n_s": "cosmological_parameters", + "tau": "cosmological_parameters", + "s_8_input": "cosmological_parameters", + "logt_agn": "halo_model_parameters", + "a": "intrinsic_alignment_parameters", + "m1": "shear_calibration_parameters", + "bias_1": "nofz_shifts", + "alpha": "psf_leakage_parameters", + "beta": "psf_leakage_parameters", + "m": "supernova_params", + "a_planck": "planck", +} + +best_fit["SP_v1.4.6.3_B_no_ia_config"]["a"] = 0 + + +env = os.environ.copy() +env["LD_LIBRARY_PATH"] = ( + "/home/guerrini/.conda/envs/sp_validation/lib/python3.9/site-packages/cosmosis/datablock:" + + env.get("LD_LIBRARY_PATH", "") +) + +for i, root in enumerate(roots): + print(root) + config = configparser.ConfigParser() + config.optionxform = str # Preserve case sensitivity of option names + + for param, section in section_map.items(): + # Check if this parameter exists for the current root + if param in best_fit[root]: + value = best_fit[root][param] + + if section not in config: + config.add_section(section) + + config[section][param] = str(value) + + with open(path_ini_files + "/values_empty.ini", "w") as configfile: + config.write(configfile) + + # Modify the ini file to run in test mode at the best fit + config = configparser.ConfigParser() + config.optionxform = str # Preserve case sensitivity of option names + + ini_file = path_ini_files + "config_space_v1.4.6.3_fiducial/pipeline/{}.ini".format( + ini_roots[i] + ) + config.read(ini_file) + + sampler = config["runtime"]["sampler"] + config["runtime"]["sampler"] = "test" + values = config["pipeline"]["values"] + config["pipeline"]["values"] = path_ini_files + "/values_empty.ini" + config["DEFAULT"]["FITS_FILE"] = ( + f"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_versions[0]}/cosmosis_{catalog_sub_versions[i]}.fits" + ) + config["test"]["save_dir"] = root_dir + "{}/best_fit".format(root) + + with open(ini_file, "w") as configfile: + config.write(configfile) + + # Run cosmosis + result = subprocess.run( + ["cosmosis", ini_file], env=env, capture_output=True, text=True + ) + print(f"STDOUT:\n{result.stdout}") + print(f"STDERR:\n{result.stderr}") + + # Modify the ini file to the previous one + config["pipeline"]["values"] = values + config["runtime"]["sampler"] = sampler + + with open(ini_file, "w") as configfile: + config.write(configfile) + + +# ## Compute the $\chi^2$ + + +metrics = {} + +for idx, root in enumerate(roots): + print(root) + match = re.search(r"corr_([A-Za-z])", root) + if match: + blind = match.group(1) + + add_xi_sys = properties[root]["add_xi_sys"] + print(f"add_xi_sys: {add_xi_sys}") + lower_bound_xi_plus = properties[root]["lower_bound_xi_plus"] + upper_bound_xi_plus = properties[root]["upper_bound_xi_plus"] + lower_bound_xi_minus = properties[root]["lower_bound_xi_minus"] + upper_bound_xi_minus = properties[root]["upper_bound_xi_minus"] + + # Read the results + theta = np.loadtxt( + output_folder + "{}/best_fit/shear_xi_plus/theta.txt".format(root) + ) + theta_arcmin = theta * 180 * 60 / np.pi + shear_xi_plus = np.loadtxt( + output_folder + "{}/best_fit/shear_xi_plus/bin_1_1.txt".format(root) + ) + shear_xi_minus = np.loadtxt( + output_folder + "{}/best_fit/shear_xi_minus/bin_1_1.txt".format(root) + ) + + if add_xi_sys == "T": + xi_sys_plus = np.loadtxt( + output_folder + "{}/best_fit/xi_sys/shear_xi_plus.txt".format(root) + ) + xi_sys_minus = np.loadtxt( + output_folder + "{}/best_fit/xi_sys/shear_xi_minus.txt".format(root) + ) + + theta_tau = np.loadtxt( + output_folder + "{}/best_fit/tau_0_plus/theta.txt".format(root) + ) + theta_tau_arcmin = theta_tau * 180 * 60 / np.pi + tau_0_model = np.loadtxt( + output_folder + "{}/best_fit/tau_0_plus/bin_1_1.txt".format(root) + ) + tau_2_model = np.loadtxt( + output_folder + "{}/best_fit/tau_2_plus/bin_1_1.txt".format(root) + ) + + data = fits.open( + f"/home/guerrini/sp_validation/cosmo_inference/data/{catalog_versions[0]}/cosmosis_{catalog_sub_versions[idx]}.fits" + ) + + tau_0_data = data["TAU_0_PLUS"].data["VALUE"] + tau_2_data = data["TAU_2_PLUS"].data["VALUE"] + + theta_data = data["XI_PLUS"].data["ANG"] + xi_plus_data = data["XI_PLUS"].data["VALUE"] + xi_minus_data = data["XI_MINUS"].data["VALUE"] + + # Load the covariance + cov = data["COVMAT"].data + cov_xi = cov[0 : 2 * len(xi_plus_data), 0 : 2 * len(xi_plus_data)] + cov_tau = cov[2 * len(xi_plus_data) :, 2 * len(xi_plus_data) :] + + # interpolate the model + interp_xi_plus = interp1d( + theta_arcmin, shear_xi_plus, kind="cubic", fill_value="extrapolate" + ) + interp_xi_minus = interp1d( + theta_arcmin, shear_xi_minus, kind="cubic", fill_value="extrapolate" + ) + + xi_plus_model = interp_xi_plus(theta_data) + if add_xi_sys: + xi_plus_model += xi_sys_plus + xi_minus_model = interp_xi_minus(theta_data) + if add_xi_sys: + xi_minus_model += xi_sys_minus + + # Concatenate the data vector + xi_data = np.concatenate((xi_plus_data, xi_minus_data)) + xi_model = np.concatenate((xi_plus_model, xi_minus_model)) + + tau_data = np.concatenate((tau_0_data, tau_2_data)) + tau_model = np.concatenate((tau_0_model, tau_2_model)) + + # Apply scale cuts + mask_xi_plus = (theta_data > lower_bound_xi_plus) & ( + theta_data < upper_bound_xi_plus + ) + mask_xi_minus = (theta_data > lower_bound_xi_minus) & ( + theta_data < upper_bound_xi_minus + ) + mask = np.concatenate((mask_xi_plus, mask_xi_minus)) + + xi_data = xi_data[mask] + xi_model = xi_model[mask] + cov_xi = cov_xi[mask][:, mask] + + cov_xi_plus = cov[0 : len(xi_plus_data), 0 : len(xi_plus_data)] + cov_xi_plus = cov_xi_plus[mask_xi_plus][:, mask_xi_plus] + cov_xi_minus = cov[ + len(xi_plus_data) : 2 * len(xi_minus_data), + len(xi_plus_data) : 2 * len(xi_minus_data), + ] + cov_xi_minus = cov_xi_minus[mask_xi_minus][:, mask_xi_minus] + + xi_plus_chi2 = np.dot( + (xi_plus_model[mask_xi_plus] - xi_plus_data[mask_xi_plus]), + np.dot( + np.linalg.inv(cov_xi_plus), + (xi_plus_model[mask_xi_plus] - xi_plus_data[mask_xi_plus]), + ), + ) + xi_minus_chi2 = np.dot( + (xi_minus_model[mask_xi_minus] - xi_minus_data[mask_xi_minus]), + np.dot( + np.linalg.inv(cov_xi_minus), + (xi_minus_model[mask_xi_minus] - xi_minus_data[mask_xi_minus]), + ), + ) + xi_chi2 = np.dot( + (xi_model - xi_data), np.dot(np.linalg.inv(cov_xi), (xi_model - xi_data)) + ) + tau_chi2 = np.dot( + (tau_model - tau_data), np.dot(np.linalg.inv(cov_tau), (tau_model - tau_data)) + ) + n_dof_xi_plus = np.sum(mask_xi_plus) + n_dof_xi_minus = np.sum(mask_xi_minus) + n_dof_tau = len(tau_0_data) + len(tau_2_data) + p_value_xi_plus = 1 - stats.chi2.cdf(xi_plus_chi2, n_dof_xi_plus) + p_value_xi_minus = 1 - stats.chi2.cdf(xi_minus_chi2, n_dof_xi_minus) + p_value_xi = 1 - stats.chi2.cdf(xi_chi2, n_dof_xi_plus + n_dof_xi_minus) + p_value_tau = 1 - stats.chi2.cdf(tau_chi2, n_dof_tau) + chi2_tot = xi_plus_chi2 + xi_minus_chi2 + tau_chi2 + n_dof_tot = n_dof_xi_plus + n_dof_xi_minus + n_dof_tau + p_value_tot = 1 - stats.chi2.cdf(chi2_tot, n_dof_tot) + + metrics[root] = { + "chi2_xi_plus": xi_plus_chi2, + "n_dof_xi_plus": n_dof_xi_plus, + "p_value_xi_plus": p_value_xi_plus, + "chi2_xi_minus": xi_minus_chi2, + "n_dof_xi_minus": n_dof_xi_minus, + "p_value_xi_minus": p_value_xi_minus, + "chi2_xi": xi_chi2, + "p_value_xi": p_value_xi, + "chi2_tau": tau_chi2, + "n_dof_tau": n_dof_tau, + "p_value_tau": p_value_tau, + "chi2_tot": chi2_tot, + "n_dof_tot": n_dof_tot, + "p_value_tot": p_value_tot, + } + print("Done!") + + +def get_latex_table(metrics): + latex_lines = [ + r"\begin{tabular}{lccc|ccc|ccc}", + r"\hline", + r"Root & $\chi^2_{\xi^+}$/dof & $p_{\xi^+}$ & $\chi^2_{\xi^-}$/dof & $p_{\xi^+}$ & $\chi^2_{\xi}$/dof & $p_{\xi}$ &" + r"$\chi^2_\tau$/dof & $p_\tau$ & $\chi^2_{\text{tot}}$/dof & $p_{\text{tot}}$ \\", + r"\hline", + ] + + for root, vals in metrics.items(): + escaped = root.replace("_", r"\_") + line = ( + f"{escaped} & " + f"{vals['chi2_xi_plus']:.2f}/{vals['n_dof_xi_plus']} & {vals['p_value_xi_plus']:.3g} & " + f"{vals['chi2_xi_minus']:.2f}/{vals['n_dof_xi_minus']} & {vals['p_value_xi_minus']:.3g} & " + f"{vals['chi2_xi']:.2f}/{vals['n_dof_xi_plus'] + vals['n_dof_xi_minus']} & {vals['p_value_xi']:.3g} &" + f"{vals['chi2_tau']:.2f}/{vals['n_dof_tau']} & {vals['p_value_tau']:.3g} & " + f"{vals['chi2_tot']:.2f}/{vals['n_dof_tot']} & {vals['p_value_tot']:.3g} \\\\" + ) + latex_lines.append(line) + + latex_lines.append(r"\hline") + latex_lines.append(r"\end{tabular}") + + # Print LaTeX table + print("\n".join(latex_lines)) + + +get_latex_table(metrics) + + +def display_markdown(metrics): + # Build Markdown table + header = ( + "| Root | $\\chi^2$ (ξ⁺) / dof | p-val (ξ⁺) |$\\chi^2$ (ξ-) / dof | p-val (ξ-) | $\\chi^2$ (ξ) / dof | p-val (ξ) | $\\chi^2$ (τ) / dof | p-val (τ) | $\\chi^2$ (tot) / dof | p-val (tot) |\n" + "|------|----------------|------------|----------------|------------|------------|---------------|------------|------------|------------------|--------------|\n" + ) + + rows = [] + for root, vals in metrics.items(): + row = f"| `{root}` " + row += f"| {vals['chi2_xi_plus']:.2f} / {vals['n_dof_xi_plus']} " + row += f"| {vals['p_value_xi_plus']:.5f} " + row += f"| {vals['chi2_xi_minus']:.2f} / {vals['n_dof_xi_minus']} " + row += f"| {vals['p_value_xi_minus']:.5f} " + row += f"| {vals['chi2_xi']:.2f} / {vals['n_dof_xi_minus'] + vals['n_dof_xi_plus']} " + row += f"| {vals['p_value_xi']:.5f} " + row += f"| {vals['chi2_tau']:.2f} / {vals['n_dof_tau']} " + row += f"| {vals['p_value_tau']:.5f} " + row += f"| {vals['chi2_tot']:.2f} / {vals['n_dof_tot']} " + row += f"| {vals['p_value_tot']:.5f} |" + rows.append(row) + + # Display in Jupyter + return header + "\n".join(rows) + + +markdown_source = display_markdown(metrics) diff --git a/papers/realspace/get_chi2_glass_mock.py b/papers/realspace/get_chi2_glass_mock.py new file mode 100644 index 00000000..596da161 --- /dev/null +++ b/papers/realspace/get_chi2_glass_mock.py @@ -0,0 +1,468 @@ +import configparser +import os +import subprocess +import sys + +import matplotlib.pyplot as plt +import numpy as np + +# Make the plot +import seaborn as sns +from astropy.io import fits +from getdist import plots +from scipy.interpolate import interp1d +from scipy.stats import chi2 + +sys.path.append("/home/guerrini/sp_validation/cosmo_inference/scripts") + +import chain_postprocessing + +plt.style.use("/home/guerrini/matplotlib_config/paper.mplstyle") + +plt.rcParams["axes.labelsize"] = 18 +plt.rcParams["xtick.labelsize"] = 18 +plt.rcParams["ytick.labelsize"] = 18 + +plt.rcParams["text.usetex"] = True + +g = plots.get_subplot_plotter(width_inch=30) +g.settings.axes_fontsize = 30 +g.settings.axes_labelsize = 30 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 40 + +# #SPECIFY DATA DIRECTORY AND DESIRED CHAINS TO ANALYSE + +root_dir = "/n09data/guerrini/glass_mock_chains/" + +# Version of the glass mock chain run +chain_version = "v6" + +# Path to the glass mock data vectors +root_glass_dv = ( + f"/home/guerrini/sp_validation/cosmo_inference/data/glass_mocks/{chain_version}/" +) + +# Choose the best-fit method +best_fit_method = "2Dkde" + +# Create the list of mocks +max_sim = 350 +failed_simulations = [82, 83, 281, 282, 283, 284, 285, 286, 287] +roots = [f"glass_mock_{chain_version}_{str(i).zfill(5)}" for i in range(1, max_sim + 1)] +roots = [root for root in roots if int(root.split("_")[-1]) not in failed_simulations] + +catalog_versions = [ + "SP_v1.4.6.3_config/SP_v1.4.6.3_A", +] + +output_folder_chains = "/n23data1/n06data/lgoh/scratch/temp/" +path_ini_files = "/home/xguerrini/sp_validation/cosmo_inference/cosmosis_config/" + +ini_root = "blind_A/fiducial" + +lower_bound_xi = 12 +upper_bound_xi = 83 + +# ## Retrieve the chains + + +# READ CHAIN + +chains = [] +best_fit = {} + +for i, root in enumerate(roots): + burnin = 0 + + if os.path.isfile(f"{root_dir}/{root}/{root}/getdist_{root}.txt") == True: + chain = g.samples_for_root( + f"{root_dir}/{root}/{root}/getdist_{root}", + cache=False, + settings={ + "ignore_rows": burnin, + "smooth_scale_2D": 0.5, + "smooth_scale_1D": 0.5, + }, + ) + p = chain.getParams() + + best_fit[root] = chain_postprocessing.extract_best_fit_params( + chain, best_fit_method="2Dkde" + ) + + +param_list = [ + "OMEGA_M", + "ombh2", + "h0", + "n_s", + "SIGMA_8", + "s_8_input", + "logt_agn", + "a", + "m1", + "bias_1", + "alpha", + "beta", + "omch2", + "m", + "a_planck", +] +label_list = [ + r"\Omega_m", + r"\omega_b", + "h_0", + "n_s", + r"\sigma_8", + "S_8", + "log T_{AGN}", + "A_{IA}", + "m_1", + r"\Delta z_1", + "\\alpha_{PSF}", + "\\beta_{PSF}", + r"\omega_c", + "M", + "A_{\rm Planck}", +] + + +# ## Run `Cosmosis` in test mode to get the data vectors + + +if not os.path.exists(path_ini_files + "/values_empty.ini"): + content = """[cosmological_parameters] + +tau = 0.0544 +w = -1.0 +mnu = 0.06 +omega_k = 0.0 +wa = 0.0 + +[halo_model_parameters] + +[intrinsic_alignment_parameters] + +[shear_calibration_parameters] + +[nofz_shifts] + +[psf_leakage_parameters] +""" + + with open(path_ini_files + "/values_empty.ini", "w") as f: + f.write(content) + f.close() + + print("File created successfully") + + +section_map = { + "omch2": "cosmological_parameters", + "ombh2": "cosmological_parameters", + "h0": "cosmological_parameters", + "n_s": "cosmological_parameters", + "s_8_input": "cosmological_parameters", + "logt_agn": "halo_model_parameters", + "a": "intrinsic_alignment_parameters", + "m1": "shear_calibration_parameters", + "bias_1": "nofz_shifts", + "alpha": "psf_leakage_parameters", + "beta": "psf_leakage_parameters", +} + + +env = os.environ.copy() +env["LD_LIBRARY_PATH"] = ( + "/home/guerrini/.conda/envs/sp_validation/lib/python3.9/site-packages/cosmosis/datablock:" + + env.get("LD_LIBRARY_PATH", "") +) +for i, root in enumerate(roots): + print(root) + config = configparser.ConfigParser() + config.optionxform = str # Preserve case sensitivity of option names + + for param, section in section_map.items(): + # Check if this parameter exists for the current root + if param in best_fit[root]: + value = best_fit[root][param] + + if section not in config: + config.add_section(section) + + config[section][param] = str(value) + + with open(path_ini_files + "/values_empty.ini", "w") as configfile: + config.write(configfile) + + # Modify the ini file to run in test mode at the best fit + config = configparser.ConfigParser() + config.optionxform = str # Preserve case sensitivity of option names + + ini_file = ( + path_ini_files + f"config_space_v1.4.6.3_fiducial/pipeline/{ini_root}.ini" + ) + config.read(ini_file) + + sampler = config["runtime"]["sampler"] + config["runtime"]["sampler"] = "test" + values = config["pipeline"]["values"] + config["pipeline"]["values"] = path_ini_files + "/values_empty.ini" + config["DEFAULT"]["FITS_FILE"] = ( + f"{root_glass_dv}/glass_mock_{root[-5:]}/cosmosis_glass_mock_v6_{root[-5:]}.fits" + ) + config["test"]["save_dir"] = output_folder_chains + f"{root}/best_fit_config" + + with open(ini_file, "w") as configfile: + config.write(configfile) + + # Run cosmosis + result = subprocess.run( + ["cosmosis", ini_file], env=env, capture_output=True, text=True + ) + # print(f"STDOUT:\n{result.stdout}") + # print(f"STDERR:\n{result.stderr}") + + # Modify the ini file to the previous one + config["pipeline"]["values"] = values + config["runtime"]["sampler"] = sampler + + with open(ini_file, "w") as configfile: + config.write(configfile) + + +xi_plus_chi2s = np.array([]) +xi_minus_chi2s = np.array([]) +xi_chi2s = np.array([]) +tau_chi2s = np.array([]) +chi2_tots = np.array([]) + + +for idx, root in enumerate(roots): + print(root) + + data = fits.open( + f"{root_glass_dv}/glass_mock_{root[-5:]}/cosmosis_glass_mock_v6_{root[-5:]}.fits" + ) + + tau_0_data = data["TAU_0_PLUS"].data["VALUE"] + tau_2_data = data["TAU_2_PLUS"].data["VALUE"] + + theta_data = data["XI_PLUS"].data["ANG"] + xi_plus_data = data["XI_PLUS"].data["VALUE"] + xi_minus_data = data["XI_MINUS"].data["VALUE"] + xi_data = np.concatenate((xi_plus_data, xi_minus_data)) + + tau_data = np.concatenate((tau_0_data, tau_2_data)) + + # Apply scale cuts + mask_xi_plus = (theta_data > lower_bound_xi) & (theta_data < upper_bound_xi) + mask_xi_minus = (theta_data > lower_bound_xi) & (theta_data < upper_bound_xi) + mask = np.concatenate((mask_xi_plus, mask_xi_minus)) + # Load the covariance + cov = data["COVMAT"].data + cov_xi = cov[0 : 2 * len(xi_plus_data), 0 : 2 * len(xi_plus_data)] + cov_tau = cov[ + 2 * len(xi_plus_data) : 4 * len(xi_plus_data), + 2 * len(xi_plus_data) : 4 * len(xi_plus_data), + ] + xi_data = xi_data[mask] + cov_xi = cov_xi[mask][:, mask] + + cov_xi_plus = cov[0 : len(xi_plus_data), 0 : len(xi_plus_data)] + cov_xi_plus = cov_xi_plus[mask_xi_plus][:, mask_xi_plus] + cov_xi_minus = cov[ + len(xi_plus_data) : 2 * len(xi_minus_data), + len(xi_plus_data) : 2 * len(xi_minus_data), + ] + cov_xi_minus = cov_xi_minus[mask_xi_minus][:, mask_xi_minus] + + # Read the results + theta = np.loadtxt( + output_folder_chains + f"{root}/best_fit_config/shear_xi_plus/theta.txt" + ) + theta_arcmin = theta * 180 * 60 / np.pi + shear_xi_plus = np.loadtxt( + output_folder_chains + f"{root}/best_fit_config/shear_xi_plus/bin_1_1.txt" + ) + shear_xi_minus = np.loadtxt( + output_folder_chains + f"{root}/best_fit_config/shear_xi_minus/bin_1_1.txt" + ) + + xi_sys_plus = np.loadtxt( + output_folder_chains + f"{root}/best_fit_config/xi_sys/shear_xi_plus.txt" + ) + xi_sys_minus = np.loadtxt( + output_folder_chains + f"{root}/best_fit_config/xi_sys/shear_xi_minus.txt" + ) + + theta_tau = np.loadtxt( + output_folder_chains + f"{root}/best_fit_config/tau_0_plus/theta.txt" + ) + theta_tau_arcmin = theta_tau * 180 * 60 / np.pi + tau_0_model = np.loadtxt( + output_folder_chains + f"{root}/best_fit_config/tau_0_plus/bin_1_1.txt" + ) + tau_2_model = np.loadtxt( + output_folder_chains + f"{root}/best_fit_config/tau_2_plus/bin_1_1.txt" + ) + + # interpolate the model + interp_xi_plus = interp1d( + theta_arcmin, shear_xi_plus, kind="cubic", fill_value="extrapolate" + ) + interp_xi_minus = interp1d( + theta_arcmin, shear_xi_minus, kind="cubic", fill_value="extrapolate" + ) + + xi_plus_model = interp_xi_plus(theta_data) + xi_plus_model += xi_sys_plus + xi_minus_model = interp_xi_minus(theta_data) + xi_minus_model += xi_sys_minus + + xi_model = np.concatenate((xi_plus_model, xi_minus_model)) + tau_model = np.concatenate((tau_0_model, tau_2_model)) + xi_model = xi_model[mask] + + xi_plus_chi2 = np.dot( + (xi_plus_model[mask_xi_plus] - xi_plus_data[mask_xi_plus]), + np.dot( + np.linalg.inv(cov_xi_plus), + (xi_plus_model[mask_xi_plus] - xi_plus_data[mask_xi_plus]), + ), + ) + xi_minus_chi2 = np.dot( + (xi_minus_model[mask_xi_minus] - xi_minus_data[mask_xi_minus]), + np.dot( + np.linalg.inv(cov_xi_minus), + (xi_minus_model[mask_xi_minus] - xi_minus_data[mask_xi_minus]), + ), + ) + xi_chi2 = np.dot( + (xi_model - xi_data), np.dot(np.linalg.inv(cov_xi), (xi_model - xi_data)) + ) + tau_chi2 = np.dot( + (tau_model - tau_data), np.dot(np.linalg.inv(cov_tau), (tau_model - tau_data)) + ) + chi2_tot = xi_plus_chi2 + xi_minus_chi2 + tau_chi2 + + xi_plus_chi2s = np.append(xi_plus_chi2s, xi_plus_chi2) + xi_minus_chi2s = np.append(xi_minus_chi2s, xi_minus_chi2) + xi_chi2s = np.append(xi_chi2s, xi_chi2) + tau_chi2s = np.append(tau_chi2s, tau_chi2) + chi2_tots = np.append(chi2_tots, chi2_tot) + + +fig, [ax1, ax2] = plt.subplots(2, 1, figsize=(7, 10)) +chi2_fiducial = -2 * -37.560916821678894 +dof, loc, scale = chi2.fit(chi2_tots, floc=0) + +print(f"Best-fit dof: {dof:.3e}") +counts, bin_edges = np.histogram(chi2_tots, bins=25, density=True) + +sns.histplot( + chi2_tots, + ax=ax1, + kde=False, + bins=bin_edges, + stat="density", + label=r"$\chi^2$ for \texttt{GLASS} mocks best-fits", + color="green", + alpha=0.3, +) + +# Compute the p-value + +# 1. Get in which bin the chi2 of the fiducial falls +bin_index = np.digitize(chi2_fiducial, bin_edges) + +# 2. Compute the p-value as the integral of the tail of the histogram +p_value = np.sum(counts[bin_index:]) * np.diff(bin_edges)[0] + +print(f"P-value: {p_value}") + +ax1.axvline(chi2_fiducial, color="red", label=r"$\chi^2$ of the fiducial", lw=2) + +mantissa, exponent = np.frexp(p_value) +pte_string = rf"${{\rm PTE}} = {p_value:.4f}$" +print(f"mantissa: {mantissa}, exponent: {exponent}") +x_text = 78 +y_text = max(counts) * 0.95 +ax1.text( + x_text, + y_text, + pte_string, + fontsize=15, + bbox=dict(facecolor="wheat", alpha=0.8, edgecolor="black"), +) + +chi2_string = rf"${{\rm Eff. dof}}= {dof:.1f}$" +y_text = max(counts) * 0.85 +ax1.text( + x_text, + y_text, + chi2_string, + fontsize=15, + bbox=dict(facecolor="wheat", alpha=0.8, edgecolor="black"), +) + +ax1.set_xlabel(r"$\chi^2_{\rm tot}$") +ax1.set_ylabel("Density") + +chi2_fiducial = 9.5 +dof, loc, scale = chi2.fit(xi_chi2s, floc=0) + +print(f"Best-fit dof: {dof:.3e}") +counts, bin_edges = np.histogram(xi_chi2s, bins=25, density=True) + +sns.histplot( + xi_chi2s, + ax=ax2, + kde=False, + bins=bin_edges, + stat="density", + label=r"$\chi^2$ for \texttt{GLASS} mocks best-fits", + color="pink", + alpha=0.5, +) + +# Compute the p-value + +# 1. Get in which bin the chi2 of the fiducial falls +bin_index = np.digitize(chi2_fiducial, bin_edges) + +# 2. Compute the p-value as the integral of the tail of the histogram +p_value = np.sum(counts[bin_index:]) * np.diff(bin_edges)[0] + +print(f"P-value: {p_value}") + +ax2.axvline(chi2_fiducial, color="red", label=r"$\chi^2$ of the fiducial", lw=2) + +mantissa, exponent = np.frexp(p_value) +print(f"mantissa: {mantissa}, exponent: {exponent}") +pte_string = rf"${{\rm PTE}} = {p_value:.4f}$" +# rf"${{\rm PTE}} = {mantissa:.2f} \times 10^{{{exponent}}}$" if exponent != 0 else +x_text = 17.5 +y_text = max(counts) * 0.95 +ax2.text( + x_text, + y_text, + pte_string, + fontsize=15, + bbox=dict(facecolor="wheat", alpha=0.8, edgecolor="black"), +) + +chi2_string = rf"${{\rm Eff. dof}}= {dof:.1f}$" +y_text = max(counts) * 0.85 +ax2.text( + x_text, + y_text, + chi2_string, + fontsize=15, + bbox=dict(facecolor="wheat", alpha=0.8, edgecolor="black"), +) + +ax2.set_xlabel(r"$\chi^2 (\xi_\pm)$") +ax2.set_ylabel("Density") +fig.savefig("./../../results/chi2_glass_mocks_p_value_xi_tau.pdf") diff --git a/papers/realspace/get_prior_psf_leakage.py b/papers/realspace/get_prior_psf_leakage.py new file mode 100644 index 00000000..4d335085 --- /dev/null +++ b/papers/realspace/get_prior_psf_leakage.py @@ -0,0 +1,163 @@ +# # Covariance matrix and PSF leakage +# +# This notebook plots the combined covariance matrix, and samples and plots the 2D marginalised posteriors of the PSF leakage parameters $\alpha$ and $\beta$. + + +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns +from astropy.io import fits +from getdist import MCSamples, plots +from shear_psf_leakage.rho_tau_stat import PSFErrorFit, RhoStat, TauStat + +# Use paper style and seaborn with husl palette +plt.style.use("/home/guerrini/matplotlib_config/paper.mplstyle") +# Set default palette - will be updated per plot as needed +sns.set_palette("husl") + +g = plots.get_subplot_plotter(width_inch=30) +g.settings.axes_fontsize = 30 +g.settings.axes_labelsize = 30 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 25 + +ver = "v1.4.6.3" +blind = "B" + + +data_path = f"/home/guerrini/sp_validation/cosmo_inference/data/SP_{ver}_config/" + +path_cosmo_val = "/home/guerrini/sp_validation/cosmo_val/output/" + +roots = [f"SP_{ver}_{blind}", f"SP_{ver}_leak_corr_{blind}"] + +labels = [f"SP_{ver}_{blind}", f"SP_{ver}_leak_corr_{blind}"] + + +data_vectors = [] + +for root in roots: + data_vectors.append( + fits.open(data_path + f"SP_{ver}_{blind}/cosmosis_{root}_masked.fits") + ) + + +def cov_to_corr(cov): + """Convert a covariance matrix to a correlation matrix.""" + d = np.sqrt(np.diag(cov)) + corr = cov / np.outer(d, d) + corr[cov == 0] = 0 + return corr + + +# Print the covariance matrix for each root +for i, root in enumerate(roots): + print(f"Covariance matrix for {labels[i]}:") + cov = data_vectors[i]["COVMAT"].data + + n_bins = cov.shape[0] // 4 + + fig, ax = plt.subplots(figsize=(10, 8)) + + im = ax.imshow(cov_to_corr(cov), vmin=-1, vmax=1, cmap="seismic") + ax.set_aspect("equal") + ax.set_yticks(np.array([10, 30, 50, 70])) + ax.set_yticklabels( + [ + r"$\xi_+(\vartheta)$", + r"$\xi_-(\vartheta)$", + r"$\tau_0(\vartheta)$", + r"$\tau_2(\vartheta)$", + ] + ) + ax.set_xticks(np.array([10, 30, 50, 70])) + ax.set_xticklabels( + [ + r"$\xi_+(\vartheta)$", + r"$\xi_-(\vartheta)$", + r"$\tau_0(\vartheta)$", + r"$\tau_2(\vartheta)$", + ], + rotation=45, + ) + fig.colorbar(im, ax=ax) + + plt.savefig(f"./../../results/cov_matrix_{root}.png", bbox_inches="tight", dpi=300) + + +# Create dummy rho and tau stat handler. + +# Inference of the xi_sys parameters +sep_units = "arcmin" +coord_units = "degrees" +theta_min = 1.0 +theta_max = 250 +nbins = 20 + + +TreeCorrConfig_xi = { + "ra_units": coord_units, + "dec_units": coord_units, + "min_sep": theta_min, + "max_sep": theta_max, + "sep_units": sep_units, + "nbins": nbins, + "var_method": "jackknife", +} + +rho_stats_handler = RhoStat(output=".", treecorr_config=TreeCorrConfig_xi, verbose=True) + +tau_stats_handler = TauStat( + catalogs=rho_stats_handler.catalogs, + output=".", + treecorr_config=TreeCorrConfig_xi, + verbose=True, +) + + +# Create a PSFErrorFit instance +psf_fitter = PSFErrorFit( + rho_stats_handler, + tau_stats_handler, + path_cosmo_val + "rho_tau_stats/", + use_eta=False, +) + +g = plots.get_subplot_plotter(width_inch=30) + +g.settings.axes_fontsize = 30 +g.settings.axes_labelsize = 30 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 40 + +chains = [] + +# Load rho-, tau-statistics, and cov_tau from the data_vector +for i, root in enumerate(roots): + print("Sampling PSF parameters for ", labels[i]) + path_rho = f"rho_stats_{root}.fits" + path_tau = f"tau_stats_{root}.fits" + path_cov_rho = f"cov_rho_{root}.npy" + path_cov_tau = f"cov_tau_{root}_th.npy" + psf_fitter.load_rho_stat(path_rho) + psf_fitter.load_tau_stat(path_tau) + psf_fitter.load_covariance(path_cov_rho, cov_type="rho") + psf_fitter.load_covariance(path_cov_tau, cov_type="tau") + samples_lq, _, _ = psf_fitter.get_least_squares_params_samples( + npatch=None, apply_debias=False + ) + + samples_gd = MCSamples( + samples=samples_lq, names=[r"\alpha", r"\beta"], labels=[r"\alpha", r"\beta"] + ) + + chains.append(samples_gd) + +g.triangle_plot( + chains, + filled=True, + legend_labels=labels, + legend_loc="upper right", +) + +plt.savefig("./../../results/psf_leakage_params.png", bbox_inches="tight", dpi=300) diff --git a/papers/realspace/glass_mock_hist.py b/papers/realspace/glass_mock_hist.py new file mode 100644 index 00000000..97b34f1d --- /dev/null +++ b/papers/realspace/glass_mock_hist.py @@ -0,0 +1,458 @@ +import os + +import matplotlib.pyplot as plt +import numpy as np +import seaborn as sns +from getdist import plots +from tqdm import tqdm + +g = plots.get_subplot_plotter(width_inch=7) +g.settings.axes_fontsize = 15 +g.settings.axes_labelsize = 15 +g.settings.alpha_filled_add = 0.7 +g.settings.legend_fontsize = 15 + +if os.path.exists("/home/guerrini/matplotlib_config/paper.mplstyle"): + plt.style.use("/home/guerrini/matplotlib_config/paper.mplstyle") + +# Set default palette - will be updated per plot as needed +sns.set_palette("husl") + +root_dir = "/n09data/guerrini/glass_mock_chains/" +chain_version = "v6" +num_sims = 350 + +roots = [f"glass_mock_{chain_version}_{i + 1:05d}" for i in range(num_sims)] + + +# +def load_samples_and_write_paramames(root_dir, root, chain_type="configuration"): + assert chain_type in ["configuration", "harmonic"], ( + "chain_type must be 'configuration' or 'harmonic'" + ) + + if chain_type == "configuration": + path_samples = root_dir + "{}/{}/samples_{}.txt".format("/" + root, root, root) + path_paramnames = root_dir + "{}/{}/getdist_{}.paramnames".format( + "/" + root, root, root + ) + else: + path_samples = root_dir + "{}/{}/samples_{}_cell.txt".format( + "/" + root, root, root + ) + path_paramnames = root_dir + "{}/{}/getdist_{}_cell.paramnames".format( + "/" + root, root, root + ) + + with open(path_samples, "r") as file: + params = file.readline()[1:].split("\t")[:-4] + file.close() + + with open(path_paramnames, "w") as file: + for i in range(len(params)): + if len(params[i].split("--")) > 1: + file.write(params[i].split("--")[1] + "\n") + else: + file.write(params[i].split("--")[0] + "\n") + file.close() + + +def write_samples_getdist_format(root_dir, root, chain_type="configuration"): + assert chain_type in ["configuration", "harmonic"], ( + "chain_type must be 'configuration' or 'harmonic'" + ) + + if chain_type == "configuration": + path_samples = root_dir + "{}/{}/samples_{}.txt".format("/" + root, root, root) + path_gd_samples = root_dir + "{}/{}/getdist_{}.txt".format( + "/" + root, root, root + ) + path_gd = root_dir + "{}/{}/getdist_{}".format(root, root, root) + else: + path_samples = root_dir + "{}/{}/samples_{}_cell.txt".format( + "/" + root, root, root + ) + path_gd_samples = root_dir + "{}/{}/getdist_{}_cell.txt".format( + "/" + root, root, root + ) + path_gd = root_dir + "{}/{}/getdist_{}_cell".format(root, root, root) + + samples = np.loadtxt( + path_samples, + ) + if "nautilus" in root: + samples = np.column_stack( + (np.exp(samples[:, -3]), samples[:, -1] - samples[:, -2], samples[:, 0:-3]) + ) + else: + samples = np.column_stack((samples[:, -1], samples[:, -2], samples[:, 0:-4])) + np.savetxt(path_gd_samples, samples) + + chain = g.samples_for_root( + path_gd, + cache=False, + settings={"ignore_rows": 0.0, "smooth_scale_2D": 0.5, "smooth_scale_1D": 0.5}, + ) + + return chain + + +def extract_param_chain(chain, param_names): + margestats = chain.getMargeStats() + likestats = chain.getLikeStats() + + param_values = {} + for param_name in param_names: + if param_name not in chain.getParamNames().list(): + raise ValueError(f"Parameter {param_name} not found in chain.") + + param_stats = margestats.parWithName(param_name) + param_values[param_name] = { + "mean": param_stats.mean, + "1sigma_minus": param_stats.mean - param_stats.limits[0].lower, + "1sigma_plus": param_stats.limits[0].upper - param_stats.mean, + "2sigma_minus": param_stats.mean - param_stats.limits[1].lower, + "2sigma_plus": param_stats.limits[1].upper - param_stats.mean, + } + + param_stats = likestats.parWithName(param_name) + param_names_getdist = chain.getParamNames() + par = param_names_getdist.parWithName(param_name) + kde = chain.get1DDensity(par, num_bins=1000) + kde_map = kde.x[np.argmax(kde.P)] + param_values[param_name].update( + { + "MAP": kde_map, + } + ) + + par = chain.getParamNames().parWithName("S_8") + par_om = chain.getParamNames().parWithName("OMEGA_M") + kde = chain.get2DDensity(par, par_om, fine_bins_2D=1000) + s8_kde_map = kde.x[np.unravel_index(np.argmax(kde.P), kde.P.shape)[1]] + om_kde_map = kde.y[np.unravel_index(np.argmax(kde.P), kde.P.shape)[0]] + param_values["S_8"].update( + { + "MAP_2D": s8_kde_map, + } + ) + param_values["OMEGA_M"].update( + { + "MAP_2D": om_kde_map, + } + ) + + return param_values + + +def concatenate_param_stats(name, param_values, verbose=False): + output = [name] + for key in param_values.keys(): + param_stat = param_values[key] + if verbose: + print( + f"{name} - {key}: {param_stat['mean']:.4f} +{param_stat['1sigma_plus']:.4f}/-{param_stat['1sigma_minus']:.4f} (1σ), +{param_stat['2sigma_plus']:.4f}/-{param_stat['2sigma_minus']:.4f} (2σ)" + ) + + param_list = [ + param_stat["mean"], + param_stat["1sigma_minus"], + param_stat["1sigma_plus"], + param_stat["2sigma_minus"], + param_stat["2sigma_plus"], + param_stat["MAP"], + ] + + if key == "S_8": + param_list.append(param_stat["MAP_2D"]) + + if key == "OMEGA_M": + param_list.append(param_stat["MAP_2D"]) + + output += param_list + + return output + + +def merge_param_stats(params_configuration, params_harmonic): + merged_params = {} + for key in params_configuration.keys(): + if key in params_harmonic: + merged_params[key] = { + "configuration": params_configuration[key], + "harmonic": params_harmonic[key], + } + return merged_params + + +def concatenate_merge_params(name, merged_params, verbose=False): + output = [name] + for key in merged_params.keys(): + param_config = merged_params[key]["configuration"] + param_harm = merged_params[key]["harmonic"] + + if verbose: + print( + f"{name} - {key} (Configuration): {param_config['mean']:.4f} +{param_config['1sigma_plus']:.4f}/-{param_config['1sigma_minus']:.4f} (1σ), +{param_config['2sigma_plus']:.4f}/-{param_config['2sigma_minus']:.4f} (2σ)" + ) + print( + f"{name} - {key} (Harmonic): {param_harm['mean']:.4f} +{param_harm['1sigma_plus']:.4f}/-{param_harm['1sigma_minus']:.4f} (1σ), +{param_harm['2sigma_plus']:.4f}/-{param_harm['2sigma_minus']:.4f} (2σ)" + ) + + param_list = [ + param_config["mean"], + param_config["1sigma_minus"], + param_config["1sigma_plus"], + param_config["2sigma_minus"], + param_config["2sigma_plus"], + param_config["MAP"], + param_harm["mean"], + param_harm["1sigma_minus"], + param_harm["1sigma_plus"], + param_harm["2sigma_minus"], + param_harm["2sigma_plus"], + param_harm["MAP"], + ] + + output += param_list + + return output + + +chain_harmonic = [] +chain_config = [] + +for i, root in enumerate(tqdm(roots)): + if os.path.isfile(f"{root_dir}/{root}/{root}/getdist_{root}.txt"): + # Load samples and write paramnames for harmonic space + load_samples_and_write_paramames(root_dir, root, chain_type="harmonic") + write_samples_getdist_format(root_dir, root, chain_type="harmonic") + chain_harm = g.samples_for_root( + root_dir + f"/{root}/{root}/getdist_{root}_cell", + cache=False, + settings={ + "ignore_rows": 0.0, + "smooth_scale_2D": 0.5, + "smooth_scale_1D": 0.5, + }, + ) + chain_harmonic.append(chain_harm) + + # Load samples and write paramnames for harmonic space + load_samples_and_write_paramames(root_dir, root, chain_type="configuration") + write_samples_getdist_format(root_dir, root, chain_type="configuration") + chain_conf = g.samples_for_root( + root_dir + f"/{root}/{root}/getdist_{root}", + cache=False, + settings={ + "ignore_rows": 0.0, + "smooth_scale_2D": 0.5, + "smooth_scale_1D": 0.5, + }, + ) + chain_config.append(chain_conf) +# +param_names = ["S_8", "OMEGA_M", "SIGMA_8", "a"] + +output_mocks_harm = np.array( + [ + "Name", + "S8_mean", + "S8_1sigma_minus", + "S8_1sigma_plus", + "S8_2sigma_minus", + "S8_2sigma_plus", + "S8_MAP", + "S8_MAP_2D", + "OMEGA_M_mean", + "OMEGA_M_1sigma_minus", + "OMEGA_M_1sigma_plus", + "OMEGA_M_2sigma_minus", + "OMEGA_M_2sigma_plus", + "OMEGA_M_MAP", + "OMEGA_M_MAP_2D", + "SIGMA_8_mean", + "SIGMA_8_1sigma_minus", + "SIGMA_8_1sigma_plus", + "SIGMA_8_2sigma_minus", + "SIGMA_8_2sigma_plus", + "SIGMA_8_MAP", + "a_mean", + "a_1sigma_minus", + "a_1sigma_plus", + "a_2sigma_minus", + "a_2sigma_plus", + "a_MAP", + ] +) + +output_mocks_config = np.array( + [ + "Name", + "S8_mean", + "S8_1sigma_minus", + "S8_1sigma_plus", + "S8_2sigma_minus", + "S8_2sigma_plus", + "S8_MAP", + "S8_MAP_2D", + "OMEGA_M_mean", + "OMEGA_M_1sigma_minus", + "OMEGA_M_1sigma_plus", + "OMEGA_M_2sigma_minus", + "OMEGA_M_2sigma_plus", + "OMEGA_M_MAP", + "OMEGA_M_MAP_2D", + "SIGMA_8_mean", + "SIGMA_8_1sigma_minus", + "SIGMA_8_1sigma_plus", + "SIGMA_8_2sigma_minus", + "SIGMA_8_2sigma_plus", + "SIGMA_8_MAP", + "a_mean", + "a_1sigma_minus", + "a_1sigma_plus", + "a_2sigma_minus", + "a_2sigma_plus", + "a_MAP", + ] +) + +for i, root in enumerate(tqdm(roots[:-1])): + param_values_harm = extract_param_chain(chain_harmonic[i], param_names) + + param_harm = concatenate_param_stats(root, param_values_harm, verbose=False) + + output_mocks_harm = np.vstack((output_mocks_harm, param_harm)) + + param_values_config = extract_param_chain(chain_config[i], param_names) + + param_config = concatenate_param_stats(root, param_values_config, verbose=False) + + output_mocks_config = np.vstack((output_mocks_config, param_config)) + +np.savetxt( + f"summary_parameter_constraints_harmonic_space_{chain_version}.txt", + output_mocks_harm, + fmt="%s", + delimiter=";", +) +np.savetxt( + f"summary_parameter_constraints_configuration_space_{chain_version}.txt", + output_mocks_config, + fmt="%s", + delimiter=";", +) +print( + f"Saved summary of parameter constraints for harmonic space in summary_parameter_constraints_harmonic_space_{chain_version}.txt" +) +print( + f"Saved summary of parameter constraints for configuration space in summary_parameter_constraints_configuration_space_{chain_version}.txt" +) + + +import pandas as pd + +output_df_harm = pd.read_csv( + f"summary_parameter_constraints_harmonic_space_{chain_version}.txt", + delimiter=";", + skiprows=1, + names=output_mocks_harm[0], +) + +output_df_config = pd.read_csv( + f"summary_parameter_constraints_configuration_space_{chain_version}.txt", + delimiter=";", + skiprows=1, + names=output_mocks_config[0], +) + + +# Define the true value of the parameters +from astropy.cosmology import Planck18 as planck + +Omega_m_fid = planck.Om0 +sigma_8_fid = 0.8102 +s8_fid = sigma_8_fid * (Omega_m_fid / 0.3) ** 0.5 +h = planck.h +Omega_b_fig = planck.Ob0 +n_s_fid = 0.9665 +print( + f"Fiducial values: Omega_m = {Omega_m_fid}, sigma_8 = {sigma_8_fid}, S_8 = {s8_fid}" +) + + +sns.histplot( + output_df_harm["S8_mean"] - output_df_config["S8_mean"], + kde=True, + bins=30, + label="Mean", +) +# sns.histplot( +# output_df_harm["S8_MAP"]-output_df_config["S8_MAP"], +# kde=True, +# bins=20, +# label="MAP", +# ) +sns.histplot( + output_df_harm["S8_MAP_2D"] - output_df_config["S8_MAP_2D"], + kde=True, + bins=30, + label="2D Mode", + alpha=0.5, +) +plt.axvline(0, color="black", linestyle="--") +plt.legend(fontsize=12) + +plt.xlabel(r"$\Delta S_8$") +plt.savefig( + "./../../results/S8_comparison_harmonic_vs_configuration.pdf", + bbox_inches="tight", +) + + +output_df_config["S8_MAP_2D"].shape +output_df_harm["S8_MAP_2D"].shape + + +# Create JointGrid +g = sns.JointGrid( + x=output_df_config["OMEGA_M_MAP_2D"], + y=output_df_config["S8_MAP_2D"], + height=7, + ratio=5, + space=0, +) + +# Main 2D histogram +sns.histplot( + x=output_df_config["OMEGA_M_MAP_2D"], + y=output_df_config["S8_MAP_2D"], + bins=25, + cmap="Greens", + cbar=False, + ax=g.ax_joint, +) + +# Marginal histograms +sns.histplot( + x=output_df_config["OMEGA_M_MAP_2D"], bins=25, color="#2ca25f", ax=g.ax_marg_x +) +sns.histplot(y=output_df_config["S8_MAP_2D"], bins=25, color="#2ca25f", ax=g.ax_marg_y) + +# Add dashed reference lines +g.ax_joint.axvline(Omega_m_fid, color="k", linestyle="--") +g.ax_joint.axhline(s8_fid, color="k", linestyle="--") + +# Labels +g.set_axis_labels( + r"$\Omega_m$ estimated from mocks (Configuration space)", + r"$S_8$ estimated from mocks (Configuration space)", +) + +# Optional styling tweaks +g.ax_joint.tick_params(labelsize=12) +plt.savefig( + "./../../results/S8_vs_OmegaM_configuration_space_mocks.pdf", + bbox_inches="tight", +) diff --git a/papers/realspace/nonlin_k_analysis.py b/papers/realspace/nonlin_k_analysis.py new file mode 100644 index 00000000..a44002a3 --- /dev/null +++ b/papers/realspace/nonlin_k_analysis.py @@ -0,0 +1,104 @@ +# # Nonlinear $k$ contributions +# +# This notebook plots the 2D heatmap of ratio of scale contributions to the $\xi_\pm$ 2PCF given angular scale $\theta$ and wavenumber $k$. + + +import matplotlib.pylab as plt +import numpy as np +import seaborn as sns + +plt.style.use("/home/guerrini/matplotlib_config/paper.mplstyle") + +plt.rcParams["text.usetex"] = True + +plt.rcParams.update( + { + "font.size": 20, + "axes.titlesize": 21, + "axes.labelsize": 20, + "xtick.labelsize": 20, + "ytick.labelsize": 20, + "legend.fontsize": 20, + "figure.titlesize": 21, + } +) +sns.set_palette("husl") + +blind = "B" +ver = "v1.4.6.3" + + +data_dir = "/n23data1/n06data/lgoh/scratch/UNIONS/cosmo_inference/data/" + +# Read the 2D array from the text file + +file_headers = ["xip_%s_%s" % (ver, blind), "xim_%s_%s" % (ver, blind)] + +for f in file_headers: + xis = np.loadtxt(data_dir + f"theta_k_{f}.txt") + xis_reshaped = xis.reshape(-1, 201) + sorted_xis = xis_reshaped[np.argsort(xis_reshaped[:, 0])] + + np.savetxt(data_dir + f"theta_k_{f}_sorted.txt", sorted_xis) + + +fig, axs = plt.subplots(2, 1, figsize=(8, 10)) + +# --- k grid --- +h = 0.6766 +k_plot = np.logspace(-4, 2, 200) + +file_header = "%s_%s" % (ver, blind) + +xi_thetas = np.loadtxt(data_dir + f"theta_k_xip_{file_header}_sorted.txt") +thetas = xi_thetas[:, 0] +xis = xi_thetas[:, 1:] + +# normalise +xi_plot = xis / np.max(xis, axis=1, keepdims=True) + +T, K = np.meshgrid(thetas, k_plot) + +axs[0].contour(T, K, xi_plot.T, levels=[0.9], colors="red", linewidths=1.7) +pcm = axs[0].pcolormesh(T, K, xi_plot.T, shading="auto", cmap="viridis") +pcm.set_rasterized(True) + +axs[0].axvline(5, color="k", ls="dashed", lw=1.2) +axs[0].axvline(12, color="white", ls="dashed", lw=1.6) +axs[0].axhline(1, color="k", ls="dashed", lw=1.2) # converted to h/Mpc space if needed +axs[0].axhline(0.425, color="white", ls="dashed", lw=1.6) + +axs[0].set_yscale("log") +axs[0].set_xlabel(r"$\theta\ \mathrm{(arcmin)}$") +axs[0].set_ylabel(r"$k\ (h$ Mpc$^{-1})$") + +axs[0].set_title(r"$\xi_+$") + +xi_thetas = np.loadtxt(data_dir + f"theta_k_xim_{file_header}_sorted.txt") +thetas = xi_thetas[:, 0] +xis = xi_thetas[:, 1:] + +xi_plot = xis / np.max(xis, axis=1, keepdims=True) + +T, K = np.meshgrid(thetas, k_plot) + +axs[1].contour(T, K, xi_plot.T, levels=[0.9], colors="red", linewidths=1.7) +pcm = axs[1].pcolormesh(T, K, xi_plot.T, shading="nearest", cmap="viridis") +pcm.set_rasterized(True) + +axs[1].axvline(12, color="white", ls="dashed", lw=1.6) +axs[1].axhline(2.85, color="white", ls="dashed", lw=1.6) + + +axs[1].set_yscale("log") +axs[1].set_xlabel(r"$\theta\ \mathrm{(arcmin)}$") +axs[1].set_ylabel(r"$k\ (h$ Mpc$^{-1})$") +axs[1].set_title(r"$\xi_-$") + + +fig.tight_layout() + +cbar_ax = fig.add_axes([0.99, 0.15, 0.02, 0.7]) +cbar = fig.colorbar(pcm, cax=cbar_ax) + +fig.savefig("./../../results/theta_k_xip_xim_{ver}_{blind}.pdf", bbox_inches="tight") diff --git a/cosmo_inference/notebooks/2D_cosmic_shear_unblinding/unblinding_party_plots.py b/papers/realspace/unblinding_party_plots.py similarity index 100% rename from cosmo_inference/notebooks/2D_cosmic_shear_unblinding/unblinding_party_plots.py rename to papers/realspace/unblinding_party_plots.py diff --git a/pyproject.toml b/pyproject.toml index bb1fe413..512cccb9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,10 @@ authors = [ ] license = {text = "MIT"} readme = "README.md" -requires-python = ">=3.11" +# 3.12 floor: cosmo-numba (a hard dependency below) requires >=3.12, and the +# production container is Python 3.12 (shapepipe base image). Keeping the floor +# in sync with the container is what makes `uv lock` resolvable. +requires-python = ">=3.12" classifiers = [ "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", @@ -31,7 +34,27 @@ dependencies = [ # get_theo_c_ell / get_theo_xi / PLANCK18 in cs_util.cosmo, which land via # CosmoStat/cs_util#76 — so this goes green once #76 merges into develop. "cs_util @ git+https://github.com/CosmoStat/cs_util.git@develop", + # Fast numba B-mode kernels (Schneider et al. 2022): the Schneider E/B split + # and COSEBIS live here, imported in b_modes.py. Tracks aguinot/cosmo-numba + # main (not published on PyPI). main carries the numpy-2 FFT fix via its + # rocket-fft dependency (which teaches numba's nopython mode to handle + # np.fft), and declares numba/numpy/rocket-fft from its requirements.txt so + # those constraints reach the resolver. + "cosmo-numba @ git+https://github.com/aguinot/cosmo-numba.git@main", "emcee", + # numba is the load-bearing pin of this whole environment: its numpy ceiling + # (numba 0.66 -> numpy<2.5) is what keeps the resolver from drifting numpy + # forward and breaking numba/ngmix — the failure this lockfile exists to + # prevent. cosmo-numba above also carries this constraint, but we pin numba + # ourselves too: it makes the one critical constraint visible and resilient + # to cosmo-numba's dependency metadata (which has silently emptied out + # between refs before). We pin numba, never numpy directly. + "numba", + # Imported directly across src/ (calibration, plots) alongside seaborn — + # declared explicitly rather than leaned on as a seaborn transitive. + "matplotlib", + "pandas", + "pyyaml", # SHA-pinned snapshot of getdist branch `upper_triangle_whisker`. "getdist @ git+https://github.com/benabed/getdist.git@113cd22a9a0d013b6f72fe734be81f260f3d3be5", "h5py", @@ -44,7 +67,6 @@ dependencies = [ "jupytext>=1.15", "lenspack", "lmfit", - "numexpr", "numpy>=2.0", "opencv-python-headless", "pyccl", @@ -78,6 +100,13 @@ dependencies = [ [project.urls] Homepage = "https://github.com/CosmoStat/sp_validation" +[tool.uv] +# The reproducibility target is the Linux container; scope the lock to Linux +# (mirrors shapepipe) so `uv lock` resolves the linux-centric stack (pymaster, +# mpi4py) without hunting for macOS/Windows wheels. macOS dev installs still +# work via `uv pip install -e .` (unlocked), just not `uv sync` from the lock. +environments = ["sys_platform == 'linux'"] + [project.optional-dependencies] test = [ "pytest", @@ -105,6 +134,20 @@ glass = [ "glass==2025.1", "glass.ext.camb==2023.6", "cosmology==2022.10.9", + # fitsio: make_unions_glass_sim.py writes the mock catalogue as FITS. + "fitsio", +] +# Cosmo-inference workflow runners (workflow/scripts/*). Kept optional: the core +# library resolves without them, but the container installs this extra so the +# Snakemake workflow and cross-validation runners are available. +workflow = [ + "snakemake", + # run_2pcf_highres.py drives the MPI convergence run; the container ships + # OpenMPI (/opt/ompi) so mpi4py builds against it. + "mpi4py", + # NOTE: workflow/scripts/cv_*.py also import `cv_runner`, which is not + # published or resolvable (no public repo found) — left undeclared pending + # its source. Same for `unions_wl` (scripts/check_footprint.py). ] develop = ["sp_validation[test,docs]"] @@ -115,7 +158,14 @@ addopts = [ "--cov=sp_validation", "--cov-report=term", "--cov-report=xml", - "--junitxml=pytest.xml" + "--junitxml=pytest.xml", + # The base ShapePipe image's test extra ships old pytest-pydocstyle / + # pytest-pycodestyle, whose pytest_collect_file hooks use the `path` arg the + # newer pytest our lock installs has removed — they crash collection. + # sp_validation lints with ruff, not these, so don't load them. Harmless if + # absent (`-p no:` just skips an unregistered plugin). + "-p", "no:pydocstyle", + "-p", "no:pycodestyle" ] markers = [ "fast: marks tests as fast (deselect with '-m \"not fast\"')", @@ -124,7 +174,7 @@ markers = [ [tool.ruff] line-length = 88 -target-version = "py311" +target-version = "py312" # Snakemake injects a `snakemake` object into rule scripts at runtime, so ruff # can't see where it's defined. Declaring it a builtin silences the false diff --git a/scratch/lgoh/cov_config_test.yaml b/scratch/lgoh/cov_config_test.yaml new file mode 100644 index 00000000..a5eade51 --- /dev/null +++ b/scratch/lgoh/cov_config_test.yaml @@ -0,0 +1,27 @@ +fiducial: + version: SP_v1.4.6 + blind: A + min_sep: 1.0 + max_sep: 100.0 + nbins: 20 + npatch: 30 + mock_version: SP_v1.4.6 + gaussian: g + +probe: wl +glass_mocks: + version: "v0" + seed_range: [1, 350] + +covariance: + default_masked: True + +tools: + python_executable: /n23data1/n06data/lgoh/scratch/my_env_new/bin/python + onecov_executable: /n23data1/n06data/lgoh/scratch/UNIONS/OneCovariance/covariance.py + +SP_v1.4.6: + cov_th: + sigma_e: 0.28, 0.28 + n_e: 5.0, 5.0 + A: 1000 \ No newline at end of file diff --git a/cosmo_inference/scripts/masking.py b/scripts/masking.py similarity index 90% rename from cosmo_inference/scripts/masking.py rename to scripts/masking.py index ba2f3c4c..32a970ed 100644 --- a/cosmo_inference/scripts/masking.py +++ b/scripts/masking.py @@ -1,5 +1,4 @@ import argparse -import os from multiprocessing import Pool, cpu_count from pathlib import Path @@ -8,6 +7,8 @@ import numpy as np import yaml +from sp_validation.masks import apply_condition + # ------------------------- # Spatially-structured cuts: these define the survey footprint. # All other cuts (FLAGS, mag, SNR, shape measurement, PSF ellipticity, @@ -30,29 +31,6 @@ # Masking logic -def apply_condition(array, kind, value): - """ - Apply a logical condition to a NumPy array and return a boolean mask, based - on the "kind" key in the mask config YAML file. - """ - if kind == "equal": - return array == value - elif kind == "not_equal": - return array != value - elif kind == "greater_equal": - return array >= value - elif kind == "greater": - return array > value - elif kind == "less_equal": - return array <= value - elif kind == "less": - return array < value - elif kind == "range": - return (array >= value[0]) & (array <= value[1]) - else: - raise ValueError(f"Unknown kind: {kind}") - - def apply_masks(data, data_ext, mask_config, footprint_only=False): """ Construct a boolean mask selecting galaxies that satisfy all @@ -252,18 +230,13 @@ def build_mask_map_hdf5( ) parser.add_argument( "--output-dir", - default=None, - help="Output directory (default: data/mask/ relative to script)", + required=True, + help="Output directory for mask map and Cls", ) args = parser.parse_args() nside = args.nside - curr_dir = Path(os.path.dirname(os.path.abspath(__file__))) - - if args.output_dir: - out_dir = Path(args.output_dir) - else: - out_dir = curr_dir.parent / "data" / "mask" + out_dir = Path(args.output_dir) out_dir.mkdir(parents=True, exist_ok=True) with open(args.config, "r") as f: diff --git a/src/sp_validation/masks.py b/src/sp_validation/masks.py index a7ea74d1..9d9e666e 100644 --- a/src/sp_validation/masks.py +++ b/src/sp_validation/masks.py @@ -8,11 +8,53 @@ """ import healsparse as hsp -import numexpr as ne import numpy as np from astropy.io import fits from scipy import stats +_KIND_ALIASES = {"smaller_equal": "less_equal"} + +_KIND_OPS = { + "equal": lambda a, v: a == v, + "not_equal": lambda a, v: a != v, + "greater": lambda a, v: a > v, + "greater_equal": lambda a, v: a >= v, + "less": lambda a, v: a < v, + "less_equal": lambda a, v: a <= v, + "range": lambda a, v: (a >= v[0]) & (a <= v[1]), +} + + +def apply_condition(array, kind, value): + """Apply Condition. + + Evaluate one mask condition (``kind``/``value``, as specified in mask + config YAML files) against an array and return a boolean mask. Single + shared grammar for the object-selection ``Mask`` class and the + cosmo_inference footprint builder (see issue #181). + + Parameters + ---------- + array : numpy.ndarray + input data + kind : str + operation type, one of "equal", "not_equal", "greater", + "greater_equal", "less", "less_equal" (alias "smaller_equal"), + "range" + value : float or list + value(s) to be used in mask operation; two-element list for "range" + + Returns + ------- + numpy.ndarray + boolean mask + + """ + kind = _KIND_ALIASES.get(kind, kind) + if kind not in _KIND_OPS: + raise ValueError(f"Unknown mask condition kind: {kind!r}") + return _KIND_OPS[kind](array, value) + def correlation_matrix(masks, confidence_level=0.9): @@ -76,8 +118,7 @@ class Mask: label : str mask label kind : str - operation type, allowed are "equal", "not_equal, ""greater_equal", - "smaller_equal", "range" + operation type; see :func:`apply_condition` for the allowed values value : float or list value(s) to be used in mask operation dat : numpy.ndarray, optional @@ -123,40 +164,7 @@ def from_list(cls, masks, label="combined", verbose=False): def apply(self, dat): - # Get column - col_data = dat[self._col_name] - - if self._kind == "equal": - self._mask = ne.evaluate( - "col_data == value", - local_dict={"col_data": col_data, "value": self._value}, - ) - elif self._kind == "not_equal": - self._mask = ne.evaluate( - "col_data != value", - local_dict={"col_data": col_data, "value": self._value}, - ) - elif self._kind == "greater_equal": - self._mask = ne.evaluate( - "col_data >= value", - local_dict={"col_data": col_data, "value": self._value}, - ) - elif self._kind == "smaller_equal": - self._mask = ne.evaluate( - "col_data <= value", - local_dict={"col_data": col_data, "value": self._value}, - ) - elif self._kind == "range": - self._mask = ne.evaluate( - "(col_data >= low) & (col_data <= high)", - local_dict={ - "col_data": col_data, - "low": self._value[0], - "high": self._value[1], - }, - ) - else: - raise ValueError(f"Invalid kind {self._kind}") + self._mask = apply_condition(dat[self._col_name], self._kind, self._value) def to_bool(self, hsp_mask): diff --git a/src/sp_validation/tests/test_masks.py b/src/sp_validation/tests/test_masks.py new file mode 100644 index 00000000..50579c46 --- /dev/null +++ b/src/sp_validation/tests/test_masks.py @@ -0,0 +1,63 @@ +"""TESTS FOR THE SHARED MASK-CONDITION GRAMMAR. + +Covers ``sp_validation.masks.apply_condition`` — the single ``kind``/``value`` +evaluator shared by the object-selection ``Mask`` class and the +cosmo_inference footprint builder (issue #181) — plus an equivalence check +against ``Mask.apply()`` itself. + +:Author: cdaley + +""" + +import numpy as np +import numpy.testing as npt +import pytest + +from sp_validation.masks import Mask, apply_condition + +pytestmark = pytest.mark.fast + + +_ARRAY = np.array([1, 2, 3, 4, 5]) + + +@pytest.mark.parametrize( + "kind, value, expected", + [ + ("equal", 3, [False, False, True, False, False]), + ("not_equal", 3, [True, True, False, True, True]), + ("greater", 3, [False, False, False, True, True]), + ("greater_equal", 3, [False, False, True, True, True]), + ("less", 3, [True, True, False, False, False]), + ("less_equal", 3, [True, True, True, False, False]), + ("range", [2, 4], [False, True, True, True, False]), + ], +) +def test_apply_condition_kinds(kind, value, expected): + + npt.assert_array_equal(apply_condition(_ARRAY, kind, value), expected) + + +def test_smaller_equal_alias_matches_less_equal(): + + npt.assert_array_equal( + apply_condition(_ARRAY, "smaller_equal", 3), + apply_condition(_ARRAY, "less_equal", 3), + ) + + +def test_unknown_kind_raises(): + + with pytest.raises(ValueError): + apply_condition(_ARRAY, "not_a_real_kind", 3) + + +def test_mask_apply_matches_apply_condition(): + + dat = np.array([(1,), (2,), (3,), (4,), (5,)], dtype=[("col", "i8")]) + + my_mask = Mask("col", "test_mask", kind="greater_equal", value=3, dat=dat) + + npt.assert_array_equal( + my_mask._mask, apply_condition(dat["col"], "greater_equal", 3) + ) diff --git a/uv.lock b/uv.lock new file mode 100644 index 00000000..e0330596 --- /dev/null +++ b/uv.lock @@ -0,0 +1,4370 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" +resolution-markers = [ + "python_full_version >= '3.14' and sys_platform == 'linux'", + "python_full_version < '3.14' and sys_platform == 'linux'", +] +supported-markers = [ + "sys_platform == 'linux'", +] + +[[package]] +name = "adjusttext" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/5c/496e506ad3313664df24a79f801719cadcd62af5999fcb299c9b08ff0d4b/adjusttext-1.4.0.tar.gz", hash = "sha256:1f73860ced8cccce3f85ee6989ca133c2579b67a7453f63dbeb38f39bf123154", size = 15852, upload-time = "2026-06-08T16:48:32.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/2c/897bdd17b05724c894a5b831c6b2e9853adcc2d07a70d6246c0cd5cd3912/adjusttext-1.4.0-py3-none-any.whl", hash = "sha256:6febd6484c0d45c39a22f44b2c1f4a8cd01ef58fada565cab4b629c771df79b5", size = 13262, upload-time = "2026-06-08T16:48:31.765Z" }, +] + +[[package]] +name = "aenum" +version = "3.1.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/07/e9/8b283567c1fef7c24d1f390b37daede8b61593d8cdaffb8e95d571699e83/aenum-3.1.17.tar.gz", hash = "sha256:a969a4516b194895de72c875ece355f17c0d272146f7fda346ef74f93cf4d5ba", size = 137648, upload-time = "2026-03-20T20:43:29.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/8d/1fe30c6fd8999b9d462547c4a1bb6690bda24af38f2913c4bec7decb81f2/aenum-3.1.17-py3-none-any.whl", hash = "sha256:8b883a37a04e74cc838ac442bdd28c266eae5bbf13e1342c7ef123ed25230139", size = 165560, upload-time = "2026-03-20T20:43:27.681Z" }, +] + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/72/5562aabb8dd7181e8e860622a38bea08d17842b99ecd4c91f84ac95251b0/anyio-4.14.1.tar.gz", hash = "sha256:8d648a3544c1a700e3ff78615cd679e4c5c3f149904287e73687b2596963629e", size = 254831, upload-time = "2026-06-24T20:56:06.017Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/7b/90df4a0a816d98d6ea26f559d87836d494a2cf1fcf063be67df50a7bcc30/anyio-4.14.1-py3-none-any.whl", hash = "sha256:4e5533c5b8ff0a24f5d7a176cbe6877129cd183893f66b537f8f227d10527d72", size = 124875, upload-time = "2026-06-24T20:56:04.413Z" }, +] + +[[package]] +name = "argon2-cffi" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz", hash = "sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1", size = 45706, upload-time = "2025-06-03T06:55:32.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl", hash = "sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741", size = 14657, upload-time = "2025-06-03T06:55:30.804Z" }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d", size = 1783441, upload-time = "2025-07-30T10:02:05.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44", size = 86558, upload-time = "2025-07-30T10:01:43.943Z" }, + { url = "https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb", size = 92364, upload-time = "2025-07-30T10:01:44.887Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92", size = 85637, upload-time = "2025-07-30T10:01:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85", size = 91934, upload-time = "2025-07-30T10:01:47.203Z" }, + { url = "https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6", size = 81246, upload-time = "2025-07-30T10:01:54.145Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a", size = 87126, upload-time = "2025-07-30T10:01:55.074Z" }, + { url = "https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d", size = 80343, upload-time = "2025-07-30T10:01:56.007Z" }, + { url = "https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99", size = 86777, upload-time = "2025-07-30T10:01:56.943Z" }, +] + +[[package]] +name = "argparse-dataclass" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/ff/a2e4e328075ddef2ac3c9431eb12247e4ba707a70324894f1e6b4f43c286/argparse_dataclass-2.0.0.tar.gz", hash = "sha256:09ab641c914a2f12882337b9c3e5086196dbf2ee6bf0ef67895c74002cc9297f", size = 6395, upload-time = "2023-06-11T20:32:54.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/66/e6c0a808950ba5a4042e2fcedd577fc7401536c7db063de4d7c36be06f84/argparse_dataclass-2.0.0-py3-none-any.whl", hash = "sha256:3ffc8852a88d9d98d1364b4441a712491320afb91fb56049afd8a51d74bb52d2", size = 8762, upload-time = "2023-06-11T20:32:52.724Z" }, +] + +[[package]] +name = "array-api-compat" +version = "1.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/12/65d297d3e425cb7fe5247b7ec14b4ed83539e9b5e89b65c15ea7ee274182/array_api_compat-1.15.0.tar.gz", hash = "sha256:53c5f922491bf15f62847afafc4e39eedfae57d218988fefb8cce39c2a9b3dea", size = 129305, upload-time = "2026-06-07T20:53:24.964Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/16/1a8fd2b19544b84575cf84ef7aa3ad4c173b756d5f087c91f85d1b295777/array_api_compat-1.15.0-py3-none-any.whl", hash = "sha256:7b1b9c53269061403fd5f45a8de349f16e7887653328bfa0c5f2d45299ff0a8e", size = 79113, upload-time = "2026-06-07T20:53:23.621Z" }, +] + +[[package]] +name = "arrow" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil", marker = "sys_platform == 'linux'" }, + { name = "tzdata", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7", size = 152931, upload-time = "2025-10-18T17:46:46.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205", size = 68797, upload-time = "2025-10-18T17:46:45.663Z" }, +] + +[[package]] +name = "asteval" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/71/bec6758ab41ada3b6870cb194ea16d2e76bb530562c8a8cd7d2167012bea/asteval-1.0.9.tar.gz", hash = "sha256:4f7323d63d9fbf89d7e1d5f8bb59b6c093970c15bb5926e6e67d0195858aa230", size = 55237, upload-time = "2026-06-11T18:40:36.086Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/d7/a71b12b625c44cfcb95d41397752edccc0a731903081609cffd6720f671d/asteval-1.0.9-py3-none-any.whl", hash = "sha256:60513ea5d608d27bdb0cf3785dc993a6c3adeaee45f1bded0953a09e904e461f", size = 23320, upload-time = "2026-06-11T18:40:35.068Z" }, +] + +[[package]] +name = "astropy" +version = "8.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astropy-iers-data", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pyerfa", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/c4/21be4313ddfde5f60e0607fd307f367b9e0f0bf153a89b10cbd036dd8cfd/astropy-8.0.1.tar.gz", hash = "sha256:45ca31d5b91fa294cd590a4791a32db94de7f9c8a343155f4d5877baa82351da", size = 7152500, upload-time = "2026-07-05T07:24:48.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/3b/d29035da0a08e3b0b03d63abe9ce69b900d8ef7863dc557a2e34ebf56a4e/astropy-8.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a4044396c15969bb029b648521f7c25d294e982dbd23e7c2c7dd328178b8b98", size = 10414634, upload-time = "2026-07-05T07:24:36.129Z" }, + { url = "https://files.pythonhosted.org/packages/fa/14/6f4427419f8a02e1d0a885fb64d8d4454c5d443627aa7cb1a3a36e16abb7/astropy-8.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fa11d56855e10107ea2231a6b6a33dbf1edbea6890adf34634c1f1d8f25c5a5a", size = 10452095, upload-time = "2026-07-05T07:24:38.424Z" }, + { url = "https://files.pythonhosted.org/packages/b2/ef/a5cf36a402c4511a776405f12d0b35196f55f4312ce407012a2fbcf1e4e0/astropy-8.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b482bc6c57c966e6c6234410a1d9afbcf92bcac858cf287812f8c99ddc3fafc", size = 10407732, upload-time = "2026-07-05T07:24:40.774Z" }, +] + +[[package]] +name = "astropy-healpix" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/bb/fb3dcca212b1d57ed26b33eabb9e1cc18fcadbfc2f2976b20530b7d80b90/astropy_healpix-2.0.0.tar.gz", hash = "sha256:6ce7646dc5b1c09a7ed24b1f23d3e2fce8e3570387220d26a24487ab001b3b0b", size = 112064, upload-time = "2026-06-29T20:02:46.407Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b8/d3/6055bf7486e0fc980a2c842fc757918f79b012c3181d6f03b3fe230a2f65/astropy_healpix-2.0.0-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6bf86b2cdd9615de0031bc13b33fb72bcf085c5a2c78a6cf27c7a02b9ec05be7", size = 191108, upload-time = "2026-06-29T20:02:34.106Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0bf5fdb204527abb6ee1ae8f77ce867b1150203864a47c19d0e5bd3ae63a/astropy_healpix-2.0.0-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd3614d685ec2cd629f4e2bbb0e1db625fe878dde778b335ec07ab4754809d78", size = 193204, upload-time = "2026-06-29T20:02:35.261Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1a/5b8680a2a68df29a38baebd9659c4c4b42f5885c7fcfeb03dc336afb0053/astropy_healpix-2.0.0-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8ffc56532822414fc6ba9b5e80b7897f98c96762d4ae69f14f5797e18946c26e", size = 188492, upload-time = "2026-06-29T20:02:36.721Z" }, + { url = "https://files.pythonhosted.org/packages/7e/43/174bf249286926518e77e29a52179a5c971544fa29affe8dee6ab33bcd5b/astropy_healpix-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727588aebabb0bdf7f27aeb793a721090e9c62ab44c5dfe083c5a5ec4ad91df8", size = 198639, upload-time = "2026-06-29T20:02:41.547Z" }, + { url = "https://files.pythonhosted.org/packages/95/e1/2e57926e5c1e6a7b648b980656a3efd94ee58909fda577f7bf4fd701dca5/astropy_healpix-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c4f998f83e7be4245fa75a48767d7749b2f233ee61e134573106dfbe53c73c", size = 201015, upload-time = "2026-06-29T20:02:42.721Z" }, + { url = "https://files.pythonhosted.org/packages/93/96/ce466e4f53b59b8e0a89fd09824cce2532c5b9146279b7397d844f78cadf/astropy_healpix-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3eca64fb1640dcb6b5633db73a33b2d208f64c5339a454ca38f538be3cdc0a4b", size = 195935, upload-time = "2026-06-29T20:02:43.868Z" }, +] + +[[package]] +name = "astropy-iers-data" +version = "0.2026.7.6.1.1.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/e3/d32d2401c53fa1aaf118c963c51c4eb9cd10d074a72a52430904dc8ef46e/astropy_iers_data-0.2026.7.6.1.1.20.tar.gz", hash = "sha256:bc38de235802c9f006c8a04693706e2adcc9e7ac1cbf415dc042b5f0ac14f1f3", size = 1939850, upload-time = "2026-07-06T01:02:02.379Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/a3/1d816863674c610234afef9a444d4eb562689a3fa1a872ac5687b4e0eac4/astropy_iers_data-0.2026.7.6.1.1.20-py3-none-any.whl", hash = "sha256:7aa50fa7f6d13258357d1e17fa97f3a8c2f04b9a7429d056e986a91cc46576a0", size = 1994649, upload-time = "2026-07-06T01:02:00.977Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "async-lru" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/1f/989ecfef8e64109a489fff357450cb73fa73a865a92bd8c272170a6922c2/async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6", size = 16332, upload-time = "2026-03-19T01:04:32.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315", size = 8403, upload-time = "2026-03-19T01:04:30.883Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" }, +] + +[[package]] +name = "bleach" +version = "6.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/3c/e12ac860709702bd5ebeb9b56a4fe334f1001246ee1b8f2b7ee28912df7d/bleach-6.4.0.tar.gz", hash = "sha256:4202482733d85cedd04e59fcb2f89f4e4c7c385a78d3c3c23c30446843a37452", size = 204857, upload-time = "2026-06-05T13:01:13.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl", hash = "sha256:4b6b6a54fff2e69a3dde9d21cc6301220bee3c3cb792187d11403fd795031081", size = 165109, upload-time = "2026-06-05T13:01:12.504Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "blosc2" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx", extra = ["http2"], marker = "sys_platform == 'linux'" }, + { name = "msgpack", marker = "sys_platform == 'linux'" }, + { name = "ndindex", marker = "sys_platform == 'linux'" }, + { name = "numexpr", marker = "platform_machine != 'wasm32' and sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "pydantic", marker = "sys_platform == 'linux'" }, + { name = "rich", marker = "sys_platform == 'linux'" }, + { name = "threadpoolctl", marker = "platform_machine != 'wasm32' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c1/26/c5b32a553f002e91886213ec91ff56a2dd8555e5e78eb4c289addb208642/blosc2-4.8.0.tar.gz", hash = "sha256:9789c3248052be59e63d6debafec4cd59d0eb4a6fd1cbaced36865d5d40ffa63", size = 5681856, upload-time = "2026-07-10T09:38:33.592Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/79/54ea19add4199547d684f3a90c3cc0568b6d915403b15c3e4bc73d4bbf3b/blosc2-4.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:95b04eb8a769e98de9640915f9c5c0a3074714762958896440e5a479a96bf83e", size = 6704345, upload-time = "2026-07-10T09:37:56.942Z" }, + { url = "https://files.pythonhosted.org/packages/e3/b0/aa277d5952ac4c673924454277de0800c780bcdb15917e303dac8ea3840f/blosc2-4.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12668fe516f18f783877457ddcc5072d80edf4939914e27acf900ef65e970e69", size = 7208868, upload-time = "2026-07-10T09:37:58.649Z" }, + { url = "https://files.pythonhosted.org/packages/ab/1b/765d2d38609d11e727f63c44f30abacccd59132e74f6e082b3741656f108/blosc2-4.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90b1a86b9044b3b242d78d5ac1d62abb8af7b1da355eb8eb45978539f9df2eac", size = 6708353, upload-time = "2026-07-10T09:38:05.91Z" }, + { url = "https://files.pythonhosted.org/packages/ee/aa/c72f0ff0c1cfa7e3a06530453f9b5388e4bb6266b73608f58232f181d68c/blosc2-4.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c17ec006d2770a4710552b0f4f8ceb40654fda08fe5047b27ccb7b0f396c3c6e", size = 7214012, upload-time = "2026-07-10T09:38:07.685Z" }, + { url = "https://files.pythonhosted.org/packages/6e/54/d7b8a01b43751840d75908d57601f03711a7cf260d46140f4c09dff5f9d6/blosc2-4.8.0-cp313-cp313-pyemscripten_2025_0_wasm32.whl", hash = "sha256:2af9162e7712323b21ad4d6502326c21459b6851b758b0421aa0be2e8b9dc0c1", size = 2300187, upload-time = "2026-07-10T09:38:09.407Z" }, + { url = "https://files.pythonhosted.org/packages/2a/2d/0c9961009c422f366555574af4653f3c13ba73fe075efb31e7af42151af5/blosc2-4.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0bb7d94bffdef8304454bbb373b8e9bf41966f8ddb58c449782c649d4d6a395c", size = 6724604, upload-time = "2026-07-10T09:38:16.688Z" }, + { url = "https://files.pythonhosted.org/packages/6d/8e/cb14d6e21fa44255739e2dac8d66ec7fb3d7aee348f198cc943e45d84d76/blosc2-4.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec3fc9ad1b2528b471670233e9cf631be104b8526cf4b958a74099f6756c98f6", size = 7217824, upload-time = "2026-07-10T09:38:18.951Z" }, + { url = "https://files.pythonhosted.org/packages/e0/1f/ea276e70d09ed406aba4012a47c7595ed772b25fc096fba8b9eac3494db9/blosc2-4.8.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:da018d11be4ac995aeb7b1a406c5cafce8c9f8a3ca8a540fe872a482de198b0d", size = 2297787, upload-time = "2026-07-10T09:38:20.871Z" }, + { url = "https://files.pythonhosted.org/packages/2f/b7/cba879eed1f510b3f034fbeea7db81cb535c822fe96ac62b5e47012c0b9b/blosc2-4.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8574afd38d20f953e9114d7362535ef0019a4c85f2a672e6f3b36dcd00a77f32", size = 6669949, upload-time = "2026-07-10T09:38:27.542Z" }, + { url = "https://files.pythonhosted.org/packages/07/5a/012f58a518bebf0d11931a5a12ba08955aa959cca59764ad38a8d82c9a1b/blosc2-4.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f8b459e22059a3a794480df2c72ff008ab6c95b9799fa2979c1dd7830cf44e2", size = 7186485, upload-time = "2026-07-10T09:38:29.411Z" }, +] + +[[package]] +name = "cadcutils" +version = "1.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distro", marker = "sys_platform == 'linux'" }, + { name = "lxml", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pyopenssl", marker = "sys_platform == 'linux'" }, + { name = "requests", marker = "sys_platform == 'linux'" }, + { name = "setuptools", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fe/44/4964823c72c9e6a93e26de0118cead37fa3c3600b4677f0c06788c903c80/cadcutils-1.6.2.tar.gz", hash = "sha256:6e2d7822756d48a363bc5f857cd717f80aab760554df86518b957f8826a7a906", size = 94673, upload-time = "2026-06-22T17:35:47.303Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/a4/963d9e7f8a2c385a42b77b2791a67f1bff32aa9c48299af2e6cafb8f3a5a/cadcutils-1.6.2-py3-none-any.whl", hash = "sha256:a95323d422731b41f9d24c2f06785ea2231cf69d1cc6ccacc4175df72b988877", size = 164697, upload-time = "2026-06-22T17:35:45.6Z" }, +] + +[[package]] +name = "camb" +version = "1.6.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, + { name = "sympy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/ad/f2e6446fbd94f7adc1474e1f4e40d2e7fa7e5e7143640cb8557d492f0a73/camb-1.6.6.tar.gz", hash = "sha256:9856202a5c05570256e52377b20431891c7b08b2e9c334e141fd08d2a085516f", size = 799344, upload-time = "2026-03-11T16:46:55.819Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/f6/9131f388386c50982b1b2992424deca857e7c019f4014dab0770de690a84/camb-1.6.6-py3-none-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eded2dd7f19226ed4717535c07a029fc958b7c581549250da33a768e12c87b13", size = 1592029, upload-time = "2026-03-11T16:46:44.925Z" }, + { url = "https://files.pythonhosted.org/packages/41/53/9d0b3cf1a2a07a882adac9565074ac6974fb8b031c31da438d407db22c89/camb-1.6.6-py3-none-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb8e0c85b3e33d78ca0676c84b0b60b54dfa72d4e520a805166cab0458e81094", size = 2258716, upload-time = "2026-03-11T16:46:46.458Z" }, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, +] + +[[package]] +name = "cffi" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d", size = 214815, upload-time = "2026-07-06T21:32:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7", size = 222429, upload-time = "2026-07-06T21:32:49.848Z" }, + { url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b", size = 210315, upload-time = "2026-07-06T21:32:51.221Z" }, + { url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7", size = 208859, upload-time = "2026-07-06T21:32:52.512Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66", size = 221844, upload-time = "2026-07-06T21:32:53.704Z" }, + { url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe", size = 225287, upload-time = "2026-07-06T21:32:54.907Z" }, + { url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b", size = 223681, upload-time = "2026-07-06T21:32:56.329Z" }, + { url = "https://files.pythonhosted.org/packages/96/88/a996879e2eeccb815f6e3a5967b12a308257412acec882039d386bd2aa7b/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:10537b1df4967ca26d21e5072d7d54188354483b91dc75058968d3f0cf13fbda", size = 194331, upload-time = "2026-07-06T21:33:03.697Z" }, + { url = "https://files.pythonhosted.org/packages/58/85/7ae00d5c8dd6266f4e944c3db630f3c5c9a98b61d469c714d848b1d8138a/cffi-2.1.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a95b05f9baf29b91171b3a8bd2020b028835243e7b0ff6bb23e2a3c228518b1b", size = 196966, upload-time = "2026-07-06T21:33:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1c/4ed5a0e5bdca6cbc275556de3328dd1b76fd0c11cc13c88fe66d1d8715f2/cffi-2.1.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:63960549e4f8dc41e31accb97b975abaecfc44c03e396c093a6436763c2ea7db", size = 214747, upload-time = "2026-07-06T21:33:09.671Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a6/e879bb68cc23a2bc9ba8f4b7d8019f0c2694bad2ab6c4a3701d429439f58/cffi-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ff067a8d8d880e7809e4ac88eb009bb848870115317b306666502ccad30b147f", size = 222392, upload-time = "2026-07-06T21:33:10.896Z" }, + { url = "https://files.pythonhosted.org/packages/88/f6/01890cfd63c08f8eb96a8319b0443690197d240a8bd6346048cf7bde9190/cffi-2.1.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3b926723c13eba9f81d2ef3820d63aeceec3b2d4639906047bf675cb8a7a500d", size = 210285, upload-time = "2026-07-06T21:33:12.251Z" }, + { url = "https://files.pythonhosted.org/packages/a6/cf/2b684132056f438567b61e19d690dd31cd0921ace051e0a458be6074369e/cffi-2.1.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:47ff3a8bfd8cb9da1af7524b965127095055654c177fcfc7578debcb015eecd0", size = 208801, upload-time = "2026-07-06T21:33:13.617Z" }, + { url = "https://files.pythonhosted.org/packages/6f/08/f2e7d62c460faae0926f2d6e423694aa409ced3bc1fe2927a0a6e5f05416/cffi-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:799416bae98336e400981ff6e532d67d5c709cfb30afb79865a1315f94b0e224", size = 221808, upload-time = "2026-07-06T21:33:15.466Z" }, + { url = "https://files.pythonhosted.org/packages/38/37/04f54b8e63a02f3d908332c9effbf8c366167c6f733ed8a3d4f79b7e2a1e/cffi-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:961be50688f7fba2fa65f63712d3b9b341a22311f5253460ce933f52f0de1c8c", size = 225241, upload-time = "2026-07-06T21:33:16.869Z" }, + { url = "https://files.pythonhosted.org/packages/a9/d6/c72eecca433cd3e681c65ed313ab4835d9d4a379704d0f628a6a05f51c2e/cffi-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bf5c6cf48238b0eb4c086978c492ad1cbc22373fc5b2d7353b3a598ce6db887a", size = 223588, upload-time = "2026-07-06T21:33:18.239Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f0/81478e482afa03f6d18dc8f2afb5edc45b3080853b634b5ed91961be0998/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d2117334c3af3bdcb9a88522b844a2bdb5efdc4f71c6c822df55486ae1c3347a", size = 194142, upload-time = "2026-07-06T21:33:23.657Z" }, + { url = "https://files.pythonhosted.org/packages/7d/95/8de304305cd9204974b0ca051b86d307cafca13aa575a0ef1b44d92c0d8c/cffi-2.1.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:702c436735fbe99d59ada02a1f65cfc0d31c0ee8b7290912f8fbc5cd1e4b16c3", size = 196819, upload-time = "2026-07-06T21:33:25.007Z" }, + { url = "https://files.pythonhosted.org/packages/2e/d2/065fcae1c73979fac8e054462478d0ff8a29c40cdc2ed7ea5676a061df53/cffi-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:276f20fffd7b396e12516ba8edf9509210ac248cbbc5acbc39cd512f9f59ebe6", size = 222353, upload-time = "2026-07-06T21:33:29.178Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a5/e8bbb1ce5b3ac2f53ad6a10bde44318a5a8d99d4f4a000d44a6e39aeb3e4/cffi-2.1.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d5980a3433d4b71a5e120f9dd551403d7824e31e2e67124fe2769c404c06913", size = 210051, upload-time = "2026-07-06T21:33:30.534Z" }, + { url = "https://files.pythonhosted.org/packages/28/ed/c127d3ac36e899c965e3361357c3befacd6578c03f40125183e41c3b219e/cffi-2.1.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6ca4919c6e4f89aa99c42510b42cf54596892c00b3f9077f6bdd1505e24b9c8d", size = 208630, upload-time = "2026-07-06T21:33:31.753Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d7/97d3136f81db489ec8d1d67748c110d6c994268fd7528014aa9f2b085e4e/cffi-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d53d10f7da99ae46f7373b9150393e9c5eab9b224909982b43832668de4779f5", size = 221593, upload-time = "2026-07-06T21:33:33.044Z" }, + { url = "https://files.pythonhosted.org/packages/d3/27/93195977168ee63aed233a1a0993a2178798654d1f4bddcdd321d6fd3b21/cffi-2.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c351efb95e832a853a29361675f33a7ce53de1a109cd73fd47af0712213aa4ce", size = 225146, upload-time = "2026-07-06T21:33:34.224Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c1/6dbd291ee2ae5a50a034aa057207081f545923bbf15dad4511e985aafff5/cffi-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:dbf7c7a88e2bac086f06d14577332760bdeecc42bdec8ac4077f6260557d9326", size = 223240, upload-time = "2026-07-06T21:33:35.57Z" }, + { url = "https://files.pythonhosted.org/packages/14/d0/117dcd9209255ad8571fbc8c92ef32593a1d294dcec91ddc4e4db50606f2/cffi-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb4e8997a49aa2c08a3e43c9045d224448b8941d88e7ac163c7d383e560cbf98", size = 223899, upload-time = "2026-07-06T21:33:39.514Z" }, + { url = "https://files.pythonhosted.org/packages/b6/3d/f20f8b886b254e3ad10e15cd4186d3aed49f3e6a35ab37aab9f8f25f7c03/cffi-2.1.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bf01d8c84cbea96b944c73b22182e6c7c432b3475632b8111dbfdc95ddad6e13", size = 211652, upload-time = "2026-07-06T21:33:40.851Z" }, + { url = "https://files.pythonhosted.org/packages/28/3b/fad54de07260b93ddeef4b96d0131d57ea900675df1d410ae1deee52d7a6/cffi-2.1.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:33eb1ad83ebe8f313e0df035c406227d55a79456704a863fad9842136af5ad7d", size = 210755, upload-time = "2026-07-06T21:33:42.183Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/3d5c705acb7abbba9bbd7d79b8e62e0f25b6120eb7ae6ac49f1b721722fe/cffi-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ac0f1a2d0cfa7eea3f2aaf006ab6e70e8feeb16b75d65b7e5939982ca2f11056", size = 223933, upload-time = "2026-07-06T21:33:43.603Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d0/47e338384ab6b1004241002fa616301020cea4fc95f283506565d252f276/cffi-2.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c16914df9fb7f500e440e6875fa23ff5e0b31db01fa9c06af98d59a91f0dc2e4", size = 226749, upload-time = "2026-07-06T21:33:45.046Z" }, + { url = "https://files.pythonhosted.org/packages/70/25/65bd5b58ea4bfdfc15cde02cb5365f89ef8ab8b2adfb8fe5c4bd4233382f/cffi-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5ecbd0499275d57506d397eebe1981cee87b47fcd9ef5c22cab7ed7644a39a94", size = 225703, upload-time = "2026-07-06T21:33:46.374Z" }, + { url = "https://files.pythonhosted.org/packages/55/c7/8c8c50cb11c6750051daf12164098a9a6f027ac4356967fd4d800a07f242/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:2e9dabb9abcb7ad15938c7196ad5c1718a4e6d33cc79b4c0209bdb64c4a54a5c", size = 194121, upload-time = "2026-07-06T21:33:56.109Z" }, + { url = "https://files.pythonhosted.org/packages/99/e2/67680bf19a6b60d2bb7ff83baefa2a4c3d2d7dc0f3277034b802e1fc504c/cffi-2.1.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:37f525a7e7e50c017fdebe58b787be310ad59357ae43a053943a6e1a6c526001", size = 196820, upload-time = "2026-07-06T21:33:57.288Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c3/ad299dc38f3583f8d916b299f028af418a9ec98bc695fcbebeae7420691c/cffi-2.1.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:90bec57cf82089383bd06a605b3eb8daebf7e5a668520beaf6e327a83a947699", size = 222342, upload-time = "2026-07-06T21:34:01.814Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d8/df4543cc087245044ed02ef3ad8e0a26619d0075ac7a77a12dc81177851b/cffi-2.1.0-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6274dcb2d15cef48daa73ed1be5a40d501d74dccd0cd6db364776d12cb6ba022", size = 210073, upload-time = "2026-07-06T21:34:03.255Z" }, + { url = "https://files.pythonhosted.org/packages/2c/0e/fac738d73728c6cea2a88a2883dca54892496cbba88a1dc1f2909cb8a6f5/cffi-2.1.0-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b71d409cccee78310ab5dec549aed052aaea483346e282c7b02362596e01bb0", size = 208551, upload-time = "2026-07-06T21:34:04.433Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3f/0b04a700dd64f465c93020253a793a82c9b4dff9961f48facd0df945d9b8/cffi-2.1.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d3538f9c0e50670f4deb93dbb696576e60590369cae2faf7de681e597a8a1f1", size = 221649, upload-time = "2026-07-06T21:34:06.157Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/b7379a5704c79eda57ce075869ba70a0368d1c850f803b3c0d078d39dcaf/cffi-2.1.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:8f9ec95b8a043d3dfbc74d9abc6f7baf524dd27a8dc160b0a32ff9cdab650c28", size = 225203, upload-time = "2026-07-06T21:34:07.489Z" }, + { url = "https://files.pythonhosted.org/packages/5a/02/d5e6c43ea85c41bda2a184a3418f195fe7cf602967a8d2b94e085b83deef/cffi-2.1.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:af5e2915d41fe6c961694d7bfdc8562942638200f3ce2765dfb8b745cf997629", size = 223263, upload-time = "2026-07-06T21:34:08.712Z" }, + { url = "https://files.pythonhosted.org/packages/e0/27/1d0b408497e41a74795af122d7b603c418c5fed0171450f899afd04e594f/cffi-2.1.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0520e1f4c35f44e209cbbb421b67eec42e6a157f59444dfb6058874ff3610e5d", size = 223904, upload-time = "2026-07-06T21:34:12.606Z" }, + { url = "https://files.pythonhosted.org/packages/8b/31/e115c985105dd7ffb32444505f18ceb874bb42d992af05d5dced7ecf1980/cffi-2.1.0-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:3681e031db29958a7502f5c0c9d6bbc4c36cb20f7b104086fa642d1799631ff8", size = 211554, upload-time = "2026-07-06T21:34:13.987Z" }, + { url = "https://files.pythonhosted.org/packages/5a/67/9e6e09409336d9e515c58367e7cfcf4f89df06ad25252675595a58eb59d5/cffi-2.1.0-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:762f99479dcb369f60ab9017ad4ab97a36a1dd7c1ee5a3b15db0f4b8659120cd", size = 210795, upload-time = "2026-07-06T21:34:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/19/e5/d3cc82a4a0be7902af279c04181ad038449c096734464a5ae1de3e1401bd/cffi-2.1.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0611e7ebf90573a535ebdc33ae9da222d037853983e13359f580fab781ca017f", size = 223843, upload-time = "2026-07-06T21:34:17.509Z" }, + { url = "https://files.pythonhosted.org/packages/b9/65/b434abc97ce7cecc2c640fde160507c0ecc7e21544b483ba3325d2e2ea17/cffi-2.1.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:86cf8755a791f72c85dc287128cc62d4f24d392e3f1e15837245623f4a33cccc", size = 226773, upload-time = "2026-07-06T21:34:19.05Z" }, + { url = "https://files.pythonhosted.org/packages/b5/9f/d4dc66ca651eb1145a133314cda721abf13cfac3d28c4a0402263ae6ad75/cffi-2.1.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:ba00f661f8ba35d075c937174e27c2c421cec3942fd2e0ea3e66996757c0fdd9", size = 225719, upload-time = "2026-07-06T21:34:20.576Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/2a/23f34ec9d04624958e137efdc394888716353190e75f25dd22c7a2c7a8aa/charset_normalizer-3.4.9.tar.gz", hash = "sha256:673611bbd43f0810bec0b0f028ddeaaa501190339cac411f347ac76917c3ae7b", size = 152439, upload-time = "2026-07-07T14:34:58.454Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/96/5d9364e3342d69f3a045e1777bc47c85c383e6e9466d561b33fdb419d1f9/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b2aff1c7b3884512b9512c3eaadd9bab39fb45042ffaaa1dd08ff2b9f8109d9", size = 215802, upload-time = "2026-07-07T14:33:17.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4c/5361f9aa7f2cb58d94f2ab831b3d493f69efb1d239654b4744e3c09527cb/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9104ed0bd76a429d46f9ec0dbc9b08ad1d2dcdf2b00a5a0daa1c145329b35b44", size = 237171, upload-time = "2026-07-07T14:33:18.576Z" }, + { url = "https://files.pythonhosted.org/packages/50/78/ce342ca4ff30b2eb49fe6d9578df85974f90c67d294113e94efdd9664cbd/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b86a2b16095d250c6f58b3d9b2eee6f4147754344f3dab0922f7c9bf7d226c9", size = 233075, upload-time = "2026-07-07T14:33:20.084Z" }, + { url = "https://files.pythonhosted.org/packages/01/c4/4fa4c8b3097a11f3c5f09a35b72ed6855fb1d332469504962ab7bafcc702/charset_normalizer-3.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e226f6218febc71f6c1fc2fafb91c226f75bdc1d8fb12d66823716e891608fd", size = 224256, upload-time = "2026-07-07T14:33:21.747Z" }, + { url = "https://files.pythonhosted.org/packages/87/3a/ad914516df7e358a81aae018caa5e0470ba827fa6d763b1d2e87d920a5f6/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:90c44bc373b7687f6948b693cceaea1348ae0975d7474746559494468e3c1d84", size = 208784, upload-time = "2026-07-07T14:33:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/d7/74/3c12f9755717dfe5c5c87da63f35d765fa0c00382ec26bf23f7fae34f2ba/charset_normalizer-3.4.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cdef90ae47919cae358d8ab15797a800ed41da7aba5d72419fb510729e2ed4b", size = 219928, upload-time = "2026-07-07T14:33:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/33/9a/895095b83e7907abd6d3d99aad3a38ad0d9686cc186cb0c94c24320fe63e/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60f44ade2cf573dad7a277e6f8ca9a51a21dda572b13bd7d8539bb3cd5dbedde", size = 218489, upload-time = "2026-07-07T14:33:26.42Z" }, + { url = "https://files.pythonhosted.org/packages/a1/34/ef5c05f412f42520d7709b7d3784d19640839eb7366ded1755511585429f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:a1786910334ed46ab1dd73222f2cd1e05c2c3bb39f6dddb4f8b36fc382058a39", size = 210267, upload-time = "2026-07-07T14:33:27.952Z" }, + { url = "https://files.pythonhosted.org/packages/83/dc/9b29fa4412b318bf3bfea985c35d67eb55e04b59a7c3f2237168b0e0be6f/charset_normalizer-3.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:03d07803992c6c7bbc976327f34b18b6160327fc81cb82c9d504720ac0be3b62", size = 226030, upload-time = "2026-07-07T14:33:29.397Z" }, + { url = "https://files.pythonhosted.org/packages/d0/39/8ff066c672434225f8d25f8b739f992af250944392173dcc88362681c9bf/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21e764fd1e70b6a3e205a0e46f3051701f98a8cb3fad66eeb80e48bb502f8698", size = 214982, upload-time = "2026-07-07T14:33:36.996Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/3a47a3667c83c2df9483d91644c6c107de3bf8874aa1793da9d3012eb986/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e4fd89cc178bced6ad29cb3e6dd4aa63fa5017c3524dbd0b25998fb64a87cc8b", size = 236460, upload-time = "2026-07-07T14:33:38.536Z" }, + { url = "https://files.pythonhosted.org/packages/f1/60/b22cdbee7e4013dab8b0d7647fc6181120fbbbc8f7025c226d15bd5a47fc/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bd47ba7fc3ca94896759ea0109775132d3e7ab921fbf54038e1bab2e46c313c9", size = 232003, upload-time = "2026-07-07T14:33:40.059Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f8/72eb13dcabe7257035cea8aefd922caad2f110d252bf9f67c4c2ca763aee/charset_normalizer-3.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84fd18bcc17526fc2b3c1af7d2b9217d32c9c04448c16ec693b9b4f1985c3d33", size = 223149, upload-time = "2026-07-07T14:33:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3e/faee8f9de92b14ee1198e9163252bb15efee7301b31256a3b6d9ebfdd0dd/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:5b10cd92fc5c498b35a8635df6d5a100207f88b63a4dc1de7ef9a548e1e2cd63", size = 207901, upload-time = "2026-07-07T14:33:43.209Z" }, + { url = "https://files.pythonhosted.org/packages/3a/25/45f30093ae27dd7b92a793b61882a38685f993700113ca36e0c9c14965e1/charset_normalizer-3.4.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4fbdde9dd4a9ce5fd52c2b3a347bb50cc89483ef783f1cb00d408c13f7a96c0", size = 219176, upload-time = "2026-07-07T14:33:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/48/18/c8f397329c35e32f6a837e488986f4ae03bd2abebc453b48714991630c2f/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:416c229f77e5ea25b3dfd4b582f8d73d7e43c22320302b9ab128a2d3a0b38efe", size = 217356, upload-time = "2026-07-07T14:33:46.192Z" }, + { url = "https://files.pythonhosted.org/packages/86/7e/5ce0bba863470fd1902d5e5843968951bddf38abe4742fc97116ef4598b3/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:75286256590a6320cf106a0d28970d3560aad9ee09aa7b34fb40524792436d35", size = 209614, upload-time = "2026-07-07T14:33:47.705Z" }, + { url = "https://files.pythonhosted.org/packages/6c/ef/2473d3c4d869155be4af1191111d59c4d5c4e0173026f7e85b176e23bf65/charset_normalizer-3.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b157c5d3292bcd443faca052f3096f637f1e074b98212a933c074ae23dc3b8", size = 224991, upload-time = "2026-07-07T14:33:49.238Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/ef4a69ea338ad3c0deceea0f5f7d2380ae8b52132b06d652cb0d2cd86706/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a79d9f4d8001473a30c163556b3c3bfebec837495a412dde78b51672f6134f9", size = 215898, upload-time = "2026-07-07T14:33:56.334Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e7/5ddfd76fc061eb52de219658a4aa431cbacadf0a0219c8854f00da50d289/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:33bdcc2a32c0a0e861f60841a512c8acc658c87c2ac59d89e3a46dacf7d866e4", size = 236718, upload-time = "2026-07-07T14:33:57.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/768fa3f36048d81c477a0ce61f813bc1454d80917ccfe550abd9f44f5e24/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f840ed6d8ecba8255df8c42b87fadeda98ddfc6eeec05e2dc66e26d46dd6f58a", size = 232519, upload-time = "2026-07-07T14:33:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c4/b3e049d2aa3766180c78507110543d9d50894cc97f57de543f1be521dcdc/charset_normalizer-3.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c25fe15c70c59eb7c5ce8c06a1f3fa1da0ecc5ea1e7a5922c40fd2fa9b0d5046", size = 223143, upload-time = "2026-07-07T14:34:01.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/79/55c32d06d76ae4feafe053f061f3e3ab70bcf19f4007797ce8c3efda7830/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:f7fb7d750cfa0a070d2c24e831fd3481019a60dd317ea2b39acbcebc08b6ed81", size = 206742, upload-time = "2026-07-07T14:34:03.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/e0/47c079dd82d217c807479cd59ffd30af56307ea31c108b75758970459ad3/charset_normalizer-3.4.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4d1c96a7a18b9690a4d46df09e3e3382406ae3213727cd1019ebade1c4a81917", size = 219191, upload-time = "2026-07-07T14:34:04.657Z" }, + { url = "https://files.pythonhosted.org/packages/42/ab/b9bc2e77d6b44a7e46ef62ec5cac1c9a6ba7b9135a5d560f002696ec9995/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a4cfde78a9f2880208d16a93b795726a3017d5977e08d1e162a7a31322479c41", size = 218328, upload-time = "2026-07-07T14:34:06.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/78/c9c71d599f5aa2d42bcdd35cbbd46d7f535351a57e40ff7d8e5a7e219401/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d4d6fcde76f94f5cb9e43e9e9a61f16dacefd228cbbf6f1a09bd9b219a92f1a1", size = 207406, upload-time = "2026-07-07T14:34:07.554Z" }, + { url = "https://files.pythonhosted.org/packages/f6/39/c914445c321a845097ce4f6ac7de9a18228a77b766272125a1ce00d851eb/charset_normalizer-3.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:898f0e9068ca27d37f8e83a5b962821df851532e6c4a7d615c1c033f9da6eedf", size = 225157, upload-time = "2026-07-07T14:34:09.061Z" }, + { url = "https://files.pythonhosted.org/packages/cd/91/7253a32e86b7e1d1239b1b36ba6dd0f021a21107ab33054b53119cc083b9/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51447e9aa2684679af07ca5021c3db526e0284347ebf4ffcec1154c3350cfe32", size = 223022, upload-time = "2026-07-07T14:34:17.248Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/2e64bd2be10e89c61e57ebe6a93fd98ae88eb7ebe414b5121f22c96c69eb/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cc1b0fff8ead343dae06305f954eb8468ba0ec1a97881f42489d198e4ce3c632", size = 241590, upload-time = "2026-07-07T14:34:18.813Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ef/d96ec496cfea0c21db43b0ad03891308b02388d054cc902cf0e5a1ad6a88/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa36ec09ef71d158186bc79e359ff5fdd6e7996fe8ab638f00d6b93139ba4fcf", size = 239584, upload-time = "2026-07-07T14:34:20.52Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ce/9af95f7876194bd7a14e3dfe4a4de2e0bff02666a3910d72beafd06cc297/charset_normalizer-3.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df115d4d83168fdf2cae48ef1ff6d1cb4c466364e30861b37121de0f3bf1b990", size = 230224, upload-time = "2026-07-07T14:34:22.189Z" }, + { url = "https://files.pythonhosted.org/packages/52/94/af74dde74a3996bd959c350709bfe50e297823d70a8c1cbd54b838880863/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f86c6358749bd4fda175388691e3ba8c46e24c5347d0afd20f9b7edfc9faf07d", size = 212667, upload-time = "2026-07-07T14:34:23.857Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f0/f1c4fe746c395922961b5916ed1d7d6e7d4c84851d19ed43cc89980ec953/charset_normalizer-3.4.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:32286a2c8d167e897177b673176c1e3e00d4057caf5d2b64eef9a3666b03018e", size = 227179, upload-time = "2026-07-07T14:34:25.586Z" }, + { url = "https://files.pythonhosted.org/packages/e4/56/6c745619ac397e8871e2bcd3cea1eec86b877488f33888b3aef5c3ed506e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:83aed2c10721ddd90f68140685391b50811a880af20654c59af6b6c66c40513c", size = 225372, upload-time = "2026-07-07T14:34:27.212Z" }, + { url = "https://files.pythonhosted.org/packages/78/ad/98aae8630ac71f16711968e38a5acfecce41b778bf2f0312851020f565a8/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cd6c3d4b783c556fa00bf540854e42f135e2f256abd29669fcd0da0f2dec79c2", size = 215222, upload-time = "2026-07-07T14:34:28.774Z" }, + { url = "https://files.pythonhosted.org/packages/f7/40/9593d54209765207a7f11073c06494c1721e4ca4a0a426c597679bf7f91e/charset_normalizer-3.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ee2f2a527e3c1a6e6411eb4209642e138b544a2d72fe5d0d76daf77b24063534", size = 231958, upload-time = "2026-07-07T14:34:30.345Z" }, + { url = "https://files.pythonhosted.org/packages/98/2b/f97f1c193fb855c345d678f5077d6926034db0722df74c8f057020e05a25/charset_normalizer-3.4.9-py3-none-any.whl", hash = "sha256:68e5f26a1ad57ded6d1cfb85331d1c1a195314756471d97758c48498bb4dcdf5", size = 64538, upload-time = "2026-07-07T14:34:56.993Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "clmm" +version = "1.16.10" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "healpy", marker = "sys_platform == 'linux'" }, + { name = "matplotlib", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "qp-prob", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/73/7ff76d487cdbcddb9c80ec03313db1b11f48fe4fcb5e1609b6eca5a73159/clmm-1.16.10.tar.gz", hash = "sha256:48273784419c038a89619b798a140153ad1e451390ff56074f3b6825c91ebe32", size = 72475, upload-time = "2025-12-04T17:30:11.47Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/a6/2a730fd1b23bb67c31c83449b12e74d6a3369681e63a098f02e353bdb77f/clmm-1.16.10-py3-none-any.whl", hash = "sha256:97e70d1bb7f45f994ab19c07b405688d984bd28399d6e31187012e8a0bf2feb6", size = 89434, upload-time = "2025-12-04T17:30:10.009Z" }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "conda-inject" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/a8/8dc86113c65c949cc72d651461d6e4c544b3302a85ed14a5298829e6a419/conda_inject-1.3.2.tar.gz", hash = "sha256:0b8cde8c47998c118d8ff285a04977a3abcf734caf579c520fca469df1cd0aac", size = 3635, upload-time = "2024-05-27T12:20:58.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/4c/fc30b69fb4062aee57e3ab7ff493647c4220144908f0839c619f912045bf/conda_inject-1.3.2-py3-none-any.whl", hash = "sha256:6e641b408980c2814e3e527008c30749117909a21ff47392f07ef807da93a564", size = 4133, upload-time = "2024-05-27T12:20:57.332Z" }, +] + +[[package]] +name = "configargparse" +version = "1.7.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/0b/30328302903c55218ffc5199646d0e9d28348ff26c02ba77b2ffc58d294a/configargparse-1.7.5.tar.gz", hash = "sha256:e3f9a7bb6be34d66b2e3c4a2f58e3045f8dfae47b0dc039f87bcfaa0f193fb0f", size = 53548, upload-time = "2026-03-11T02:19:38.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/19/3ba5e1b0bcc7b91aeab6c258afd70e4907d220fed3972febe38feb40db30/configargparse-1.7.5-py3-none-any.whl", hash = "sha256:1e63fdffedf94da9cd435fc13a1cd24777e76879dd2343912c1f871d4ac8c592", size = 27692, upload-time = "2026-03-11T02:19:36.442Z" }, +] + +[[package]] +name = "connection-pool" +version = "0.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/df/c9b4e25dce00f6349fd28aadba7b6c3f7431cc8bd4308a158fbe57b6a22e/connection_pool-0.0.3.tar.gz", hash = "sha256:bf429e7aef65921c69b4ed48f3d48d3eac1383b05d2df91884705842d974d0dc", size = 3795, upload-time = "2020-09-17T02:48:28.824Z" } + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, +] + +[[package]] +name = "cosmo-numba" +version = "1.0.1.dev6+g188d272c6" +source = { git = "https://github.com/aguinot/cosmo-numba.git?rev=main#188d272c67d6d699d7cff7a7a53ded8dec759bb0" } +dependencies = [ + { name = "mpmath", marker = "sys_platform == 'linux'" }, + { name = "numba", marker = "sys_platform == 'linux'" }, + { name = "numbaquadpack", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "rocket-fft", marker = "sys_platform == 'linux'" }, + { name = "sympy", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "cosmology" +version = "2022.10.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/38/04099bb2b6a626bd69a3f117afc60f2c47c08899e0730e0e48c898bf4745/cosmology-2022.10.9.tar.gz", hash = "sha256:0c2857c9bf1fdd09f1f11ab5765df0389a4101f3a900fa11251c3f37696f02d4", size = 8488, upload-time = "2022-10-10T10:18:16.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/2c/c80db37593ad593e3f6c60705fbdf690b33f22c89edd5507d2731346cd87/cosmology-2022.10.9-py3-none-any.whl", hash = "sha256:3903658c2474177a1a1c75771ae14458d93200c516f8fc6c3f4d776f3287b288", size = 9341, upload-time = "2022-10-10T10:18:14.928Z" }, +] + +[[package]] +name = "coverage" +version = "7.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/8b/adeb62ea8951f13c4c7fef2e7a85e1a06b499c8d8237ea589d496029e53f/coverage-7.15.0.tar.gz", hash = "sha256:9ac3fe7a1435986463eaa8ee253ae2f2a268709ba4ae5c7dd1f52a05391ad78f", size = 925362, upload-time = "2026-07-02T13:10:50.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/17/99fa688541ae1d6e84543a0e544f83de0c944815b63e9e7b1ed411d15036/coverage-7.15.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e4d0bb73455bf97ab243a8f12c37c686ccf1c13bb614b7b85f1d062f06f42b2c", size = 252705, upload-time = "2026-07-02T13:09:05.059Z" }, + { url = "https://files.pythonhosted.org/packages/fb/02/6a95a5cd83b74839017ef9cf48d2d8c9ae60af919e17a3f336e6f9f1b7bd/coverage-7.15.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:20d9ccc4ebd0edc434d86dfd2a1dd2a8efa6b6b3073d0485a394fee86459ebb4", size = 255441, upload-time = "2026-07-02T13:09:06.559Z" }, + { url = "https://files.pythonhosted.org/packages/67/f2/406f6c57d600f68185942422c4c00f1a3255d60aee6e5fd961425cd9987e/coverage-7.15.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20c8a976c365c8cb12f0cbd099508772ea41fb5fa80657a8506df0e11bd278c5", size = 256556, upload-time = "2026-07-02T13:09:08.197Z" }, + { url = "https://files.pythonhosted.org/packages/74/8e/d3fa48489c15ecdec1ba48fd61f68798555dddd2f6716f9ad42adeb1a2a9/coverage-7.15.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f948fd5ba1b9cbca91f0ae08b4c1ce2b139509149a435e2585d056d57d70bf01", size = 258815, upload-time = "2026-07-02T13:09:09.691Z" }, + { url = "https://files.pythonhosted.org/packages/47/2e/2d40ddd110462c6a2769677cf7f1c119a52b45f568978fc6c98e4cc0dd0f/coverage-7.15.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f58185f06edf6ad68ec9fb155d63ef650c82f3fbd7e1770e2867751fb13158f4", size = 253117, upload-time = "2026-07-02T13:09:11.212Z" }, + { url = "https://files.pythonhosted.org/packages/51/c0/310782f0d7c3cb2b5ac05ba8d205fe91f24a36f6bf3256098f1782181c38/coverage-7.15.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02adc79a920c73c647c5d117f55747df7f2de94571884758ce8bc58e04f0a796", size = 254475, upload-time = "2026-07-02T13:09:13.029Z" }, + { url = "https://files.pythonhosted.org/packages/86/f7/702da6c275f8ae6ade423d2877243122932c9b27f5403003b9ef8c927d12/coverage-7.15.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6eb7c300fbed667fd6e3588eba71c1904cdb06110ca6fdf908c26bdd88b8e382", size = 252619, upload-time = "2026-07-02T13:09:14.699Z" }, + { url = "https://files.pythonhosted.org/packages/fb/84/c5b15a7e5ecba4e56218d772d99fe80a63e63f8d11f12783723a6005ab45/coverage-7.15.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b5fb23fa2de9dce1f5c36c09066d8fcda16cd96e8e26686caa2d7cb9b567d65c", size = 256689, upload-time = "2026-07-02T13:09:16.103Z" }, + { url = "https://files.pythonhosted.org/packages/95/2f/c8b07559b57701230c61b23a953858c052890c12ef568d81780c6c46e92e/coverage-7.15.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cec79341dbe6281484024979976d0c7f22beae08b4a254655decd25d42cbe766", size = 252189, upload-time = "2026-07-02T13:09:17.828Z" }, + { url = "https://files.pythonhosted.org/packages/6b/80/6d2f049dd3fd3dbfd60b62ba6b2162a04009e2c002ce70b24cf3878dec7a/coverage-7.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c664c5444b1d970b1b2a450e21fb19ee5c9cfdf151ded2dda37260031cca0da", size = 254059, upload-time = "2026-07-02T13:09:19.304Z" }, + { url = "https://files.pythonhosted.org/packages/7b/19/3a80b97d3b2a5c77a01ae359c6bed20c13738fe3d9380f08616d4fec0281/coverage-7.15.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bbcbb317c2e5ded5b21104af81c29f391be2af98d065693ffbe8d23949b948e5", size = 252227, upload-time = "2026-07-02T13:09:28.543Z" }, + { url = "https://files.pythonhosted.org/packages/a1/fa/b70062750686bd7da454da27927622f48bbac6990ac7a4c4a4653e7b0036/coverage-7.15.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27f31ecb458da3f859aab3f15ada871eb7a7768807d88df4a9f186bb17737970", size = 254823, upload-time = "2026-07-02T13:09:30.177Z" }, + { url = "https://files.pythonhosted.org/packages/a9/09/dad6a75a2e561b9dc5086a8c5257a7591d584246f67e23e70d2995b89ab6/coverage-7.15.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13fb759be317fdc62e0f56bffdf61cfcb45c7761ad6b71e3e583e71a67ae753c", size = 256059, upload-time = "2026-07-02T13:09:31.979Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e7/b5d2941fa9564573d44b693a871ff3156f0c42cbefe977a09fa7fdc59971/coverage-7.15.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d5cf007add5ab4bb8fa9f4c77e3732127c9e6cad501d7db43355fbfafca0be84", size = 258190, upload-time = "2026-07-02T13:09:34.035Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1d/8e895bcde3c57ccd46d896dda5f2b3d5df761a1b0c6c9d450d175dedc632/coverage-7.15.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc78d9843bd576fbe2118248258d485e968dc535f95ed504a7b0867ba9b51389", size = 252456, upload-time = "2026-07-02T13:09:35.765Z" }, + { url = "https://files.pythonhosted.org/packages/14/4c/f6997da343ddeb959be82c3b05322793f92c071ad45f7cb8a96336e2dd5f/coverage-7.15.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a263060f1de0b4b74b4e089c2a70b8003b3781c733329a9c8fd54995328f9950", size = 254192, upload-time = "2026-07-02T13:09:37.445Z" }, + { url = "https://files.pythonhosted.org/packages/17/27/a0bc09d032267b9da89d95a2d874cfbef2a5aebbf0e87cf7aba221d79a99/coverage-7.15.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c48decf16e0dfd5b049c7d5e82200c23c08126719142998d4f172444e3d0529e", size = 252153, upload-time = "2026-07-02T13:09:39.422Z" }, + { url = "https://files.pythonhosted.org/packages/54/c0/77fc233d9fba07b244c40948c53fe27308b8f21732fb3417f87fbd6fd992/coverage-7.15.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:08fb028000ed0aaa0a4cbdfbb98be7cb42f370db973fbbb469733505ab20e13e", size = 256310, upload-time = "2026-07-02T13:09:41.006Z" }, + { url = "https://files.pythonhosted.org/packages/d5/24/601cecfb5825becacb8d45219a018a3b55b9dbaec624efdb0ea249d08be2/coverage-7.15.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb7dc0c3b7d8a1077abea0b8546ebc5e26d6ef6ecefc2f0f5ad2b8a53bdad837", size = 251974, upload-time = "2026-07-02T13:09:42.733Z" }, + { url = "https://files.pythonhosted.org/packages/47/1e/6f45e5a5b3d5484318d368702af6716b5ab8913b0428bec981a562fcf296/coverage-7.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6cb3602054ccbe9f0d8c2dc04bbeba90d5719236e2cd06e042ddd6d3fc7b6e37", size = 253745, upload-time = "2026-07-02T13:09:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ce/22bae91e0b75445f68d365c7643ed0aa4880bbf77450ee74ca65bdae53a7/coverage-7.15.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:769e8ece11a596315ebf5aa7ec383aeeed016c091d2bf6363ffb996d41529092", size = 252286, upload-time = "2026-07-02T13:09:54.996Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1e/bec5e32aa508615d9d7a2790effb25fb4dc28606e995816afe400b25ece3/coverage-7.15.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:65a6b6164ee5c39e2f3803f314292d6c61a607ba7fee253d1e03c42dc3903502", size = 254789, upload-time = "2026-07-02T13:09:56.678Z" }, + { url = "https://files.pythonhosted.org/packages/17/29/0e865435b4354e4a7c03b1b7920046d31d0a273d55decefea27e011cb9bf/coverage-7.15.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75128817f95a5c45bb01d65fd2d8b9cb54bbe03d81608fb70e3e14b437ad56c2", size = 256135, upload-time = "2026-07-02T13:09:58.343Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/33a870b58a13325d62fc0a6c8f01fa0ff667cef60c7498e2382a147dfa18/coverage-7.15.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9887bb428fe2d4cd4bee89bac1a6c9932f484afd5b36fbd4ff6ea5f825bb1f5e", size = 258449, upload-time = "2026-07-02T13:10:00.057Z" }, + { url = "https://files.pythonhosted.org/packages/18/7b/6fffe596bf3ddba8462758d02c5dad730fd91055a6634aa2e4226229181a/coverage-7.15.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0bfc0be1f702042207a93a00523b1065ee1fe951e96edf311581c0bbc2e34888", size = 252313, upload-time = "2026-07-02T13:10:01.946Z" }, + { url = "https://files.pythonhosted.org/packages/58/1b/11468dd6c1676ab831a70cb9a8d4e198e8607fa0b7220ab918b73fe9bfbd/coverage-7.15.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f64627d55def5a43282d70e08396672692f77e4da610a5bb8bb4060b432b6859", size = 254142, upload-time = "2026-07-02T13:10:04.065Z" }, + { url = "https://files.pythonhosted.org/packages/79/41/29328e21d16b1b95092c30dd700e08cf915bd3734f836df8f3bdb0e8fa9f/coverage-7.15.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:2c6f0fa473003905c6d5bac328ee4eba9fbea654f15bc24b8a3274b23363fa99", size = 252108, upload-time = "2026-07-02T13:10:06.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/de/05ccfb990439655b35afbfd8e0d13fe66677565a7d4eb38c3f5ef2635e1c/coverage-7.15.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2bcf9afaf064172c6ec3c58a325a9957ad1178c05dd934e25f253321776e0676", size = 256385, upload-time = "2026-07-02T13:10:08.141Z" }, + { url = "https://files.pythonhosted.org/packages/51/0e/486828a3d2695ea7a2609f17ff572f6b01905e608379440a11da4b8dffbe/coverage-7.15.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:baf06bc987115d6fb938d403f7eab684a057766c490367999a2b71a6883110c6", size = 251923, upload-time = "2026-07-02T13:10:10.179Z" }, + { url = "https://files.pythonhosted.org/packages/18/c7/03582b6715f078e5e558354c87616d945b9894cda2dace8e4009b17035e4/coverage-7.15.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0405f2ff97b1c4c0e782cb32e02f32369bcf2e6b618b591d67e1ea754575dfe", size = 253580, upload-time = "2026-07-02T13:10:12.052Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b4/c0ca3028f42c9a08e51feb4561ef1192e5de99797cd1db5b04590c215bda/coverage-7.15.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:94c9686bfe8a9a6810297aecbd99beaa3445f9e8dc2f80b1382cca0d86b64461", size = 263267, upload-time = "2026-07-02T13:10:23.261Z" }, + { url = "https://files.pythonhosted.org/packages/5f/aa/a375e3846e5d3c013dc600b2a3231089055c73d77f5393dd2192a8d64da6/coverage-7.15.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9bd671c25f9d85f09d7ec481d0e43d5139f486c06a37139847a7ce569788af72", size = 265390, upload-time = "2026-07-02T13:10:25.152Z" }, + { url = "https://files.pythonhosted.org/packages/92/e1/5783cdabb797305e1c9e4809fea496d31834c51fa772514f73dc148bcfc9/coverage-7.15.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:110cbdf8d2e216577312cf06ccf85539c0e5a5420ef747e4a4719b5e483c88cd", size = 267811, upload-time = "2026-07-02T13:10:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/85/31/96d8bbf58b8e9193bc8389574a91a0db48355ee98feb66aa6bf8d1b32eea/coverage-7.15.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c5d4619214f1d9993e7b00a8600d14614b7e9d84e89507460b126aa5e6559e5", size = 268928, upload-time = "2026-07-02T13:10:29.242Z" }, + { url = "https://files.pythonhosted.org/packages/5e/7a/5294567e811a1cb7eda93140c628fa050d66189da28da320f93d1d815c73/coverage-7.15.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:781a704516e2d8346fbbd5be6c6f3412dd824785146528b3a01816f26c081007", size = 262378, upload-time = "2026-07-02T13:10:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/69/3f/3f48538421f899f28946f90a3d272136a4686e1abf461cc9249a783ee0f3/coverage-7.15.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd4a1b44bcb65ee29e947ac92bbee04956df3a6bfc6143641bb6cae7ede00fc9", size = 265263, upload-time = "2026-07-02T13:10:32.942Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d3/092df15efcab8a9c1467ee960eb8019bbad3f9300d115d89ea6195f369ff/coverage-7.15.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0e4950c9d6d3e39c64c991814ff315e2d0b9cb8152363594212c9e55208c0a8f", size = 262866, upload-time = "2026-07-02T13:10:35.104Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ab/0254d2b88665efb2c57ad368cc77ab5de3435bd8d5add4729c1b0e79431e/coverage-7.15.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:fe9c87ff42e5472d80d21704972e1f96e104a0a599d77c5e35db5a3c562e2571", size = 266599, upload-time = "2026-07-02T13:10:37.05Z" }, + { url = "https://files.pythonhosted.org/packages/a8/79/1cfa4023e489ce6fbc7be4a5d442dbc375edb4f4fda39a352cedb53263c2/coverage-7.15.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f00d5ae1dd2fe13fb8186e3e7d37bcbd8b25c0d764ff7d1b32cef9be058510a8", size = 261714, upload-time = "2026-07-02T13:10:38.966Z" }, + { url = "https://files.pythonhosted.org/packages/b7/eb/fee5c8665656be63f497418d410484637c438172568688e8ac92e06574e7/coverage-7.15.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:363ab38cc78b615f11c9cac3cf1d7eef950c18b9fdedfb9066f59461dcf84d68", size = 264025, upload-time = "2026-07-02T13:10:40.789Z" }, + { url = "https://files.pythonhosted.org/packages/52/30/21b2ad45959cd50e909e02ebac1e30b4ceb7162e91c11d4c570223a458b7/coverage-7.15.0-py3-none-any.whl", hash = "sha256:56da6a4cbe8f7e9e80bd072ca9cefe67d7106a440a7ec06519ec6507ac94ad19", size = 212632, upload-time = "2026-07-02T13:10:48.641Z" }, +] + +[[package]] +name = "cryptography" +version = "49.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" }, + { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" }, + { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" }, + { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" }, + { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" }, + { url = "https://files.pythonhosted.org/packages/86/12/c48a424f38db03027be9f7ed5c7dc5de9933dbee992865f98b13727a009d/cryptography-49.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d", size = 4678835, upload-time = "2026-06-12T20:02:48.743Z" }, + { url = "https://files.pythonhosted.org/packages/68/28/8a3ad4653662c93fc44dc4e5d8fd374c25c42e07b34bbfbadf49cf57a5a8/cryptography-49.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa", size = 4697239, upload-time = "2026-06-12T20:02:56.03Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b2/2193fc74f81aee4f9b62733133b73b5176718932ed8f2e4b03fa040480a6/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb", size = 4685593, upload-time = "2026-06-12T20:02:50.666Z" }, + { url = "https://files.pythonhosted.org/packages/47/f1/1d3eaa243bfc5de4a187b22aa8c048b3e4980bfbe830ac46e6bac2e66947/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d", size = 5289961, upload-time = "2026-06-12T20:01:46.468Z" }, + { url = "https://files.pythonhosted.org/packages/58/39/2d51306721330c486495853eda1c567880ff036de15a14c4b74f399934af/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561", size = 4731145, upload-time = "2026-06-12T20:02:16.832Z" }, + { url = "https://files.pythonhosted.org/packages/17/50/983e838c7fd0d87fd8c969bcdd328edaf5f756e38df5281637424c155873/cryptography-49.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122", size = 4321719, upload-time = "2026-06-12T20:02:52.611Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f5/8f571d7e27c55bce9f76f026143bcb1e040a4233149ecca0bea5fa5dd5f7/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505", size = 4685209, upload-time = "2026-06-12T20:02:07.282Z" }, + { url = "https://files.pythonhosted.org/packages/e7/84/0e27016a6fc5a0886f797018b26aa42f40c09a82332bff77822a451deaaa/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866", size = 5246285, upload-time = "2026-06-12T20:01:32.439Z" }, + { url = "https://files.pythonhosted.org/packages/11/2d/5e1fb307cb5931881516b464c98774b3f2c36b5d4bb9a2830253cf553cad/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8", size = 4730441, upload-time = "2026-06-12T20:02:01.469Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c0/bff5a02ee731d207d6a1ed51732549d8c53d2bc8da1d10ec6f2844201d68/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3", size = 4815869, upload-time = "2026-06-12T20:01:36.574Z" }, + { url = "https://files.pythonhosted.org/packages/b9/26/814681d14248d95d73d5c3eea0c39a94eb8302df966f670a2c60de90974b/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27", size = 4960948, upload-time = "2026-06-12T20:02:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" }, + { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" }, + { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" }, + { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" }, + { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" }, + { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" }, + { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" }, +] + +[[package]] +name = "cs-util" +version = "0.2.2" +source = { git = "https://github.com/CosmoStat/cs_util.git?rev=develop#bedcdbf50ac57fc4d0b72a62b251373cd1807824" } +dependencies = [ + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "camb", marker = "sys_platform == 'linux'" }, + { name = "datetime", marker = "sys_platform == 'linux'" }, + { name = "healpy", marker = "sys_platform == 'linux'" }, + { name = "healsparse", marker = "sys_platform == 'linux'" }, + { name = "keyring", marker = "sys_platform == 'linux'" }, + { name = "matplotlib", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "pyccl", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, + { name = "swig", marker = "sys_platform == 'linux'" }, + { name = "vos", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "dask" +version = "2026.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click", marker = "sys_platform == 'linux'" }, + { name = "cloudpickle", marker = "sys_platform == 'linux'" }, + { name = "fsspec", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "partd", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "toolz", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/b5/aa50877159f1efd65a744107e0662a15d2b80fa0c427d980313367f49493/dask-2026.7.0.tar.gz", hash = "sha256:b039970642ce97a063070bae2763dada8aae27e3cbd8ff6d894072f920a1e252", size = 11548914, upload-time = "2026-07-06T16:58:36.496Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/aa/ceeb81d9dc886d445416310f0eff5c3978f20224b4143e96e36b7e85b011/dask-2026.7.0-py3-none-any.whl", hash = "sha256:68def8b467529ab8425ef9fcc6735dcaefaaf715d5e19ae219485f99a394dbef", size = 1496878, upload-time = "2026-07-06T16:58:34.597Z" }, +] + +[package.optional-dependencies] +array = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "dask-image" +version = "2026.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dask", extra = ["array"], marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "pims", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, + { name = "tifffile", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/49/e592a13a5e1efdcdb8f1faab7c4e309c61648792e276f9ced5fb79381b33/dask_image-2026.5.0.tar.gz", hash = "sha256:ed6b462277e691b2c12b0890ba801a0f9a00cc1894b0aa71b195a7a1419b2b00", size = 80457, upload-time = "2026-05-27T14:05:57.383Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/5b/15d6d6ff8697b188787609be059fe4f07f99fc00f43f68e9e1540fa8733e/dask_image-2026.5.0-py3-none-any.whl", hash = "sha256:acf86cd7f0f1e97804198d30b7cc931efd29f9dec86c65ec004b50405c3f5227", size = 43814, upload-time = "2026-05-27T14:05:56.237Z" }, +] + +[[package]] +name = "datetime" +version = "6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytz", marker = "sys_platform == 'linux'" }, + { name = "zope-interface", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/32/decbfd165e9985ba9d8c2d34a39afe5aeba2fc3fe390eb6e9ef1aab98fa8/datetime-6.0.tar.gz", hash = "sha256:c1514936d2f901e10c8e08d83bf04e6c9dbd7ca4f244da94fec980980a3bc4d5", size = 64167, upload-time = "2025-11-25T08:00:34.586Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/7a/ea0f3e3ea74be36fc7cf54f966cde732a3de72697983cdb5646b0a4dacde/datetime-6.0-py3-none-any.whl", hash = "sha256:d19988f0657a4e72c9438344157254a8dcad6aea8cd5ae70a5d1b5a75e5dc930", size = 52637, upload-time = "2025-11-25T08:00:33.077Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/aa/12037145b7a56eaa5b29b41872f7a21b538e807e13f32c4d3c46e59be084/debugpy-1.8.21.tar.gz", hash = "sha256:a3c53278e84c94e11bd87c53970ec391d1a67396c8b22609fcac576520e611a6", size = 1697577, upload-time = "2026-06-01T19:30:35.156Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/09/59324b903599031ff9faaec1758292409f6561a0ec2492fe4b703327705a/debugpy-1.8.21-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:c193d474f0a211191f2b4449d2d06157c689013035bd952f3b617e0ef422b176", size = 3968900, upload-time = "2026-06-01T19:30:52.341Z" }, + { url = "https://files.pythonhosted.org/packages/48/57/412421516afc3055fa577516f00beec3d663f9b0ab330639547ae6c57720/debugpy-1.8.21-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:ecbd158386c31ffe71d46f72d44d56e66331ab9b16cad649156d514368f23ab2", size = 3962096, upload-time = "2026-06-01T19:30:59.235Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2d/6e7ec524984a1702777868de49a4c53202bddac2a432a76a093469587750/debugpy-1.8.21-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:3d6922439bf33fd38a3e2c447869ebc7b97da5cd3d329ff1ef9bc06c4903437e", size = 3927115, upload-time = "2026-06-01T19:31:05.863Z" }, + { url = "https://files.pythonhosted.org/packages/95/51/67e7cf11a53e40694f720457d5b3a1cdaaa3d5a9a633e482f225456b93ff/debugpy-1.8.21-py2.py3-none-any.whl", hash = "sha256:b1e37d333663c8851516a47364ef473da127f9caebe4417e6df6f5825a7e9a92", size = 5352888, upload-time = "2026-06-01T19:31:25.186Z" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "deprecated" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f", size = 11298, upload-time = "2025-10-30T08:19:00.758Z" }, +] + +[[package]] +name = "dill" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, +] + +[[package]] +name = "distro" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, +] + +[[package]] +name = "docutils" +version = "0.22.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, +] + +[[package]] +name = "donfig" +version = "0.8.1.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/71/80cc718ff6d7abfbabacb1f57aaa42e9c1552bfdd01e64ddd704e4a03638/donfig-0.8.1.post1.tar.gz", hash = "sha256:3bef3413a4c1c601b585e8d297256d0c1470ea012afa6e8461dc28bfb7c23f52", size = 19506, upload-time = "2024-05-23T14:14:31.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/d5/c5db1ea3394c6e1732fb3286b3bd878b59507a8f77d32a2cebda7d7b7cd4/donfig-0.8.1.post1-py3-none-any.whl", hash = "sha256:2a3175ce74a06109ff9307d90a230f81215cbac9a751f4d1c6194644b8204f9d", size = 21592, upload-time = "2024-05-23T14:13:55.283Z" }, +] + +[[package]] +name = "dpath" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/ce/e1fd64d36e4a5717bd5e6b2ad188f5eaa2e902fde871ea73a79875793fc9/dpath-2.2.0.tar.gz", hash = "sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e", size = 28266, upload-time = "2024-06-12T22:08:03.686Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/d1/8952806fbf9583004ab479d8f58a9496c3d35f6b6009ddd458bdd9978eaf/dpath-2.2.0-py3-none-any.whl", hash = "sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576", size = 17618, upload-time = "2024-06-12T22:08:01.881Z" }, +] + +[[package]] +name = "ducc0" +version = "0.41.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/e7/849dd1a079b994184fa53905d47278f86d0dd3dcfb6ff2b0e3eb7d6a1c1b/ducc0-0.41.0.tar.gz", hash = "sha256:bac084745bbdb243482a4aec3ecc857bdd46faec298c67e48bc0bb90350dbabd", size = 353129, upload-time = "2026-03-26T18:56:04.669Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/8e/3a28ebdef748b9b59c22d9a801116a9ea073d0ce66d9a738bf5db6c29e0c/ducc0-0.41.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94718e321194313232ae6ba73c528a3847d5eae212a9fc1ef67471e7113e6492", size = 4563683, upload-time = "2026-03-26T18:54:28.643Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/5132178a63fbbbc8868c10b07cbacee138f248ac6f319040537e5a45b3a9/ducc0-0.41.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c17565f332745f08dd012334e07a4dcbb591c9591c2b14f51a1d57ad40018f53", size = 5601347, upload-time = "2026-03-26T18:54:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/17/97/191420d245383304f20f96254774f14b96239e52a0eac44cab93c870941e/ducc0-0.41.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ca66a1806983545460c5447f053f15f6d9f8037b16b128b2a925f0410bcee06d", size = 4563741, upload-time = "2026-03-26T18:54:47.684Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e3/a8783330d7225def7cafe33ed9a2fd7e29eff8f91e7312306037048199a2/ducc0-0.41.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d058b71274f9d60d6edae70cc31d6f5a72e29b0ecc7229725905682566d1e605", size = 5602698, upload-time = "2026-03-26T18:54:53.816Z" }, + { url = "https://files.pythonhosted.org/packages/67/ca/fce0c5395faca711cd4b7203bc001e820288608e6957f81ee183218509ed/ducc0-0.41.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e8c2c49fbfae0c6f7f4ec759a46b936e00c0d4398eeba8f6cfafd562b7dbe55", size = 4563768, upload-time = "2026-03-26T18:55:05.598Z" }, + { url = "https://files.pythonhosted.org/packages/47/a4/70b5a521697c7482ceca8b00f4406bef5a111d37142a719b2fa4942252f6/ducc0-0.41.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:13f98aefcce65b3416e86fa998a0a81ee0ebd9f0feef2588f44c6694b2a50bf0", size = 5604100, upload-time = "2026-03-26T18:55:11.133Z" }, + { url = "https://files.pythonhosted.org/packages/0d/88/022d053b65c9acd69b2de2a9400afd3916ec3a409f7c5776dc906f86b228/ducc0-0.41.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:583d59d5eb4f23c3eb7c6f8a2b6f32da72e3868e9aa711598978a76a25425f96", size = 4579841, upload-time = "2026-03-26T18:55:19.689Z" }, + { url = "https://files.pythonhosted.org/packages/9a/91/428eca0cc8a1142b9952bef02c06bfe54526d730dd070de873424ab8c0bf/ducc0-0.41.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3a71fd23661ddd6a7f6b44433e778d35a25b3f1492c9239217cdfedbe8178b1", size = 5613706, upload-time = "2026-03-26T18:55:24.971Z" }, +] + +[[package]] +name = "emcee" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/53/1045ee878cb24281387079f8ee4f0ade1622c6aae1ed1fd91a53e4fa5b19/emcee-3.1.6.tar.gz", hash = "sha256:11af4daf6ab8f9ca69681e3c29054665db7bbd87fd4eb8e437d2c3a1248c637d", size = 2871117, upload-time = "2024-04-19T10:03:19.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/ef/2196b9bf88ffa1bde45853c72df021fbd07a8fa91a0f59a22d14a050dc04/emcee-3.1.6-py2.py3-none-any.whl", hash = "sha256:f2d63752023bdccf744461450e512a5b417ae7d28f18e12acd76a33de87580cb", size = 47351, upload-time = "2024-04-19T10:03:17.522Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + +[[package]] +name = "fitsio" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/6b/5658778e070faaa194f1a1133527cedfa948d173daed29d61f25c5487ab6/fitsio-1.4.1.tar.gz", hash = "sha256:2b2bf0bfd37790114b44283931c59a14b1fec25a653bf65c4fc555b8d3b24de9", size = 4148217, upload-time = "2026-07-10T21:21:31.585Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/a0/86e2bde46aa5559b7b9544208def3045675d055f0d132b235ff325279a9b/fitsio-1.4.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:de7ac1df97ce68626dac1da5014e6b396cff2789d1c617c36df03d6bc6d98a2d", size = 881494, upload-time = "2026-07-10T21:21:09.496Z" }, + { url = "https://files.pythonhosted.org/packages/a5/53/f7f644b812e572c57015ef5215f982922d9cdac8d239549c136ba48f2850/fitsio-1.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34df9129decab3ae85377601668b82442159ed704800bd1ed047428bc532c96d", size = 810043, upload-time = "2026-07-10T21:21:11.254Z" }, + { url = "https://files.pythonhosted.org/packages/83/5d/d71993140df9f939e81d2a5531f26d15cbd700855348a756921b0ad24235/fitsio-1.4.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:161806de2bb9971e271379558616d2cef795ce9590923270ec3bbdadea0d0b2f", size = 913505, upload-time = "2026-07-10T21:21:16.695Z" }, + { url = "https://files.pythonhosted.org/packages/ef/ae/e89778256e0aee3e5b51a620cdf9d91ac89f348504045461bee28006275d/fitsio-1.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5ed27e5b8aaf1ae51718c6624d00fec1d6054fddde8d602eaea3bb6686bcfb0a", size = 815241, upload-time = "2026-07-10T21:21:18.018Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/7f64a60d883a4b69a0a15c1ec60ba9313d8e774af83ac2b00f57d511b76d/fitsio-1.4.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:1ab4eadb13caf362630d45bce7cf7e57e407d3c971f361f639ca9c316f460bb2", size = 913536, upload-time = "2026-07-10T21:21:22.556Z" }, + { url = "https://files.pythonhosted.org/packages/de/46/9f45b3c8bd371057f1333aec8f92879cb786fe9ed05b6b0c2643fd228558/fitsio-1.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2627eeec3dff4b692402babb88aec3cccbf73a3ee22d19b4accfe76491bd67a8", size = 815239, upload-time = "2026-07-10T21:21:23.61Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3b/9a6d92637db9a603a18681f60689c30208f2485016ed91280e42b927df57/fitsio-1.4.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:5f499149738fdce6afa3324a76fd65a762082647d8b1d30a356dc002dd4a9178", size = 928341, upload-time = "2026-07-10T21:21:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/0a/fa/eeb997744bb1c2c9308dab9b492bcdb1843e4eb3dc5d1697d2f0a312c8b7/fitsio-1.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c2a0dba7a868b4b1716d7468431fda51bc89ee8d8f2a643ac28f9200d99d2e2b", size = 815548, upload-time = "2026-07-10T21:21:29.202Z" }, +] + +[[package]] +name = "flt" +version = "2026.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/66/538256582e373d81a944c0ee3a12fd0e4dd0f39d10136353c4ce914d7061/flt-2026.1.tar.gz", hash = "sha256:4bf2818d4a9137f5f715fd2ff13acfbf0175639373155cd89ea2b788edf00093", size = 12817, upload-time = "2026-03-20T22:47:29.754Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/0f/9911ee41dbb2eb043d6252aa8f9bade8995f7b7ee01406e049088c96acf1/flt-2026.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2962fd252df62d77bb2861859173ffc7cc436921a234a52c17eab7839bcce588", size = 479324, upload-time = "2026-03-20T22:46:55.38Z" }, + { url = "https://files.pythonhosted.org/packages/7c/86/c525fef761b2bf9cd961fa6e06a4e255ea9eca529d37e22098d8baa900f0/flt-2026.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8b73c4aac4874808dc66e2f7a3cbcdd20a65d0ef14d6f2d378a79930ff3d0bad", size = 478225, upload-time = "2026-03-20T22:46:56.902Z" }, + { url = "https://files.pythonhosted.org/packages/1e/14/9beb3e8a64536741b6f06f62324305171391f9b6d84b804c42e0519f472e/flt-2026.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e02e75d2c8d6441cd7de2d7a13e62bb8feb687cee2d70c4bd57c43c5c78dc630", size = 483678, upload-time = "2026-03-20T22:47:02.783Z" }, + { url = "https://files.pythonhosted.org/packages/95/05/086fd21633043fe19dbe972cab79a680199286c57ba66a88f899c1f51dc7/flt-2026.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ef91c6dd6e453062b5f5d3cbb0c489bd8b3ee1440ad9e5c940d22921664bb69a", size = 483418, upload-time = "2026-03-20T22:47:04.284Z" }, + { url = "https://files.pythonhosted.org/packages/f1/93/a24b0937fa882fc513d399713d6780262ac5beacdef16a3638370669c960/flt-2026.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28c43c464fffa6edbee4bcaaf07565fdd8046ef649764d5647b0de9b2faa19a7", size = 479350, upload-time = "2026-03-20T22:47:10.738Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/54d75cabcacbbfa79b3c54515167f5a3b2dcfcb7af1ec23e8df46bc59e52/flt-2026.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f011917cb43d3590c5fdb8e622a9641b5a42e5519d6fea27b4553aa8fc6c8f32", size = 480496, upload-time = "2026-03-20T22:47:11.894Z" }, + { url = "https://files.pythonhosted.org/packages/60/94/a12bc6dd3136b187dacbd5b820537c0e5507e8f63f5c7db10019eeb54394/flt-2026.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:999f1ffbea353fd77b1797ecd8b69a7bae7bb098723ae0dca51a05fc6e4df6dc", size = 480306, upload-time = "2026-03-20T22:47:17.933Z" }, + { url = "https://files.pythonhosted.org/packages/c0/7b/700fc7cfc5033090b27e14e69d9678b1973642f684cdfeffdcf08e561a98/flt-2026.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:10575dc192697bd024ab22f7948fa7f850c40ca6a036e80fe2e96afec6e5c703", size = 473443, upload-time = "2026-03-20T22:47:19.19Z" }, +] + +[[package]] +name = "fonttools" +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/8e/40/e76320afa1df918e146155ef239b1719ee266092e96f5423bfd075affba1/fonttools-4.63.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e874792a8212b44583ea02189d9e693906b2f78b261f372f95d6c563210ac1d", size = 5024840, upload-time = "2026-05-14T12:03:36.745Z" }, + { url = "https://files.pythonhosted.org/packages/ce/36/0b805d8c485f872f65a509cbe3b58a5d0d17bee855333b54a150c79d3061/fonttools-4.63.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22135da48a348785c5e2d5d2d9d6bec5ed44adacbaeb9db12d9493bf6c6bfa68", size = 4975801, upload-time = "2026-05-14T12:03:38.833Z" }, + { url = "https://files.pythonhosted.org/packages/c8/26/2cee03d0aa083ab022da5c07aff9ed3f689da1defb81ad6917c9627896da/fonttools-4.63.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ccf41f2efdf56994d22d73bef4ced1052161958169428d06ba9724ea9e9a64be", size = 4965009, upload-time = "2026-05-14T12:03:41.494Z" }, + { url = "https://files.pythonhosted.org/packages/7e/48/cc4b66d9058c0d0982c833fad10127c4b0e9324606aafa41382295ca4102/fonttools-4.63.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9ced0bd02ac751dd6319b0da88aaef24414e3b0dbc32bb4f24944821a3741a27", size = 5105892, upload-time = "2026-05-14T12:03:43.525Z" }, + { url = "https://files.pythonhosted.org/packages/dd/87/64cfa18a7a1621d17b7f4502b2b0ed8a135a90c3db51ea590ee99043e76b/fonttools-4.63.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b2248c5decb223562f7902ff6325077a073f608ee8e33e88ad88db734eb9f49", size = 5010526, upload-time = "2026-05-14T12:03:54.647Z" }, + { url = "https://files.pythonhosted.org/packages/36/e1/a8933a72c45a87177fbde2696e0d0755c8c9062f8c077a961c6215fa27b1/fonttools-4.63.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:308f957cdeaf8abe4e5f2f124902ef405448af92c90f80e302a3b771c2e6116b", size = 4923946, upload-time = "2026-05-14T12:03:56.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/60/872e6e233b8c5e8b41413796ff18b7fe479661bd40147e071b450dfad7a1/fonttools-4.63.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:bf00f21eb5fb721dbaf73d1e9da6d02a1af7768f2ebcf9798be98beab8ba90f6", size = 4962489, upload-time = "2026-05-14T12:03:59.443Z" }, + { url = "https://files.pythonhosted.org/packages/30/c4/83c24f2ec38b90cfda84bf4b1a1f49df80e84a1db4e7ac6e0d41bf23bc39/fonttools-4.63.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c1aaa4b9c75798400ac043ce04d74e7830376c85095a5a6ed7cba2f17a266bf4", size = 5071870, upload-time = "2026-05-14T12:04:02.122Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2b/0aa8db70f18cf52e49b4ed5ecec68547f981160bf5ded3b5aed6faa0a6f9/fonttools-4.63.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0eac00b9118c3c2f87d272e45341871c5b3066baa3c86897fa634a7c3fb59096", size = 5148649, upload-time = "2026-05-14T12:04:12.747Z" }, + { url = "https://files.pythonhosted.org/packages/7f/63/18e4369c25043096f1048e0c9915951adc4f842bd81c6b18155824d6fa99/fonttools-4.63.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51394295f1a51de8b5f30bdb1e1b9a4231536c7064ef5c6e211eec19fa36036f", size = 4932147, upload-time = "2026-05-14T12:04:14.806Z" }, + { url = "https://files.pythonhosted.org/packages/a1/3f/67f3eac2ffd8a98446c5022f8ed3864eac878a5ff7af8df4c8286dba16cc/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9e12f105d2b6342c559c298afb674006bb2893afc7102dcf8a1b55b0486b4e40", size = 5027237, upload-time = "2026-05-14T12:04:17.675Z" }, + { url = "https://files.pythonhosted.org/packages/1a/ba/4e6214cb38a7b04779e97bb7636de9a5c7f20af7018d03dee0b64c08510a/fonttools-4.63.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:796f27556dbe094c4824f75ca85267e4df776c79036c8441469a4df37038c196", size = 5053933, upload-time = "2026-05-14T12:04:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015, upload-time = "2021-03-11T07:16:29.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121, upload-time = "2021-03-11T07:16:28.351Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/a1/ae4e3e5003468d6391d2c77b6fa1cd73bd5d13511d81c642d7b28ac90ed4/fsspec-2026.6.0.tar.gz", hash = "sha256:f5bac145310fe30e16e1471bd6840b2d990d609e872251d7e674241822abf01a", size = 313646, upload-time = "2026-06-16T01:57:28.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/22/4222d7ddf3da30f363edaa98e329c2bce6c65497c9cb2810931c8b2c0fbc/fsspec-2026.6.0-py3-none-any.whl", hash = "sha256:02e0b71817df9b2169dc30a16832045764def1191b43dcff5bb85bdee212d2a1", size = 203949, upload-time = "2026-06-16T01:57:26.358Z" }, +] + +[[package]] +name = "future" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490, upload-time = "2024-02-21T11:52:38.461Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326, upload-time = "2024-02-21T11:52:35.956Z" }, +] + +[[package]] +name = "getdist" +version = "1.6.1" +source = { git = "https://github.com/benabed/getdist.git?rev=113cd22a9a0d013b6f72fe734be81f260f3d3be5#113cd22a9a0d013b6f72fe734be81f260f3d3be5" } +dependencies = [ + { name = "matplotlib", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", size = 219798, upload-time = "2026-05-06T04:01:26.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z" }, +] + +[[package]] +name = "glass" +version = "2025.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cosmology", marker = "sys_platform == 'linux'" }, + { name = "healpix", marker = "sys_platform == 'linux'" }, + { name = "healpy", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "transformcl", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/d6/26cd58e75834671259f26b9287a584d726e6023da35ddf7ca3b7f2c393fb/glass-2025.1.tar.gz", hash = "sha256:7b1aa2394e16010f7f1b4243f49e7e12d7a4dd28fcbf3e3f7cf25ce4905a8615", size = 48533, upload-time = "2025-02-21T18:43:48.046Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/e7/3e89bc5147a3e84245c783098afffbbacbcdf5678ba1aacc2c9c035434da/glass-2025.1-py3-none-any.whl", hash = "sha256:d7919a7d19e05ab8da4e52dbfbcfb5bd1ed2b72e0cc3afde39ec94ced22883c5", size = 47185, upload-time = "2025-02-21T18:43:46.649Z" }, +] + +[[package]] +name = "glass-ext-camb" +version = "2023.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "camb", marker = "sys_platform == 'linux'" }, + { name = "glass", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/1a/18bb47c0f7cc267c2f8c95273055b82b1975e4dccbfea6051e82a4d1f513/glass.ext.camb-2023.6.tar.gz", hash = "sha256:f7b6e521b2d45d3b68400353ce6ab1747c772631832a257567de028aa2060509", size = 2989, upload-time = "2023-06-30T22:27:31.511Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/50/e92d9db0d26966bad6c4c441822c345784af592767747ee563a65ee24450/glass.ext.camb-2023.6-py3-none-any.whl", hash = "sha256:f46015ecedf87cffabf008d21ac06be5d7a55557027f12c54e258ee11b85c44a", size = 3634, upload-time = "2023-06-30T22:27:30.171Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload-time = "2025-12-16T00:35:25.142Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/a9/a780cc66f86335a6019f557a8aaca8fbb970728f0efd2430d15ff1beae0e/google_crc32c-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411", size = 33364, upload-time = "2025-12-16T00:40:22.96Z" }, + { url = "https://files.pythonhosted.org/packages/21/3f/3457ea803db0198c9aaca2dd373750972ce28a26f00544b6b85088811939/google_crc32c-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454", size = 33740, upload-time = "2025-12-16T00:40:23.96Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload-time = "2025-12-16T00:40:24.742Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload-time = "2025-12-16T00:40:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload-time = "2025-12-16T00:40:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload-time = "2025-12-16T00:40:27.028Z" }, +] + +[[package]] +name = "greenlet" +version = "3.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/f1/fbbfef6af0bad0548f09bc28948ea3c275b4edb19e17fc5ca9900a6a634d/greenlet-3.5.3.tar.gz", hash = "sha256:a61efc018fd3eb317eeca31aba90ee9e7f26f22884a79b6c6ec715bf71bb62f1", size = 200270, upload-time = "2026-06-26T19:28:24.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/73/815dd90131c1b71ebdf53dbc7c276cafec2a1173b97559f97aba72724a87/greenlet-3.5.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:efa9f765dd09f9d0cdac651ffdf631ee59ec5dc6ee7a73e0c012ba9c52fbdf5b", size = 604761, upload-time = "2026-06-26T19:07:10.114Z" }, + { url = "https://files.pythonhosted.org/packages/9f/57/079cfe76bcef36b153b25607ee91c6fcb58f17f8b23c86bbbeabe0c88d72/greenlet-3.5.3-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7faba15ac005376e02a0384504e0243be3370ce010296a44a820feb342b505ab", size = 617044, upload-time = "2026-06-26T19:10:07.25Z" }, + { url = "https://files.pythonhosted.org/packages/37/87/b4d095775a3fb1bcafbb483fc206b27ebb785724c83051447737085dc54e/greenlet-3.5.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87142215824be6ac05e2e8e2786eec307ccbc27c36723c3881959df654af6861", size = 614244, upload-time = "2026-06-26T18:32:17.594Z" }, + { url = "https://files.pythonhosted.org/packages/8a/70/7559b609683650fa2b95b8ab84b4ab0b26556a635d19675e12aa832d826d/greenlet-3.5.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:215275b1b49320987352e6c1b054acca0064f965a2c66992bed9a6f7d913f149", size = 1574210, upload-time = "2026-06-26T19:09:03.077Z" }, + { url = "https://files.pythonhosted.org/packages/ae/73/be55392074c60fc37655ca40fa6022457bfbf6718e9e342a7b0b41f96dd2/greenlet-3.5.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b1b0eed82364b0e32c4ea0f221452d33e6bb17ae094d9f72aed9851812747ea", size = 1638627, upload-time = "2026-06-26T18:31:44.748Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fa/5401ac78021c826a25b6dde0c705e0a8f29b617509f9185a31dac15fbe1b/greenlet-3.5.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2d185dd1621757e70c3861cceffd5317ab4e7ed7eb09c82994828468527ade5", size = 607435, upload-time = "2026-06-26T19:07:11.412Z" }, + { url = "https://files.pythonhosted.org/packages/e9/76/1dc144a2e56e65d36405078ed774224375ea520a1870a6e46e08bb4ac7bf/greenlet-3.5.3-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1c514a468149bf8fbbab874188a3535cd8a48a3e353eb53a3d424296f8dbacd3", size = 619787, upload-time = "2026-06-26T19:10:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/bf/87/c298cee62df1de4ad7fec32abda73526cff347fd143a6ed4ac369246668a/greenlet-3.5.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:915f887cf2682b66419b879423a2e072634aa7b7dce6f3ada4957cfced3f1e9a", size = 616786, upload-time = "2026-06-26T18:32:19.128Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2e/e6f009885ed0705ccf33fe0583c117cfd03cde77e31a596dd5785a30762b/greenlet-3.5.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:766cfd421c13e450feb340cd472a3ed9957d438727b7b4593ad7c76c5d2b0deb", size = 1574316, upload-time = "2026-06-26T19:09:04.273Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fe/43fd110b01e40da0adb7c90ac7ea744bef2d43dca00de5095fd2351c2a68/greenlet-3.5.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2ecda9ec22edf38fa389369eaed8c3d37c05f3c54e69f69438dbb2cc1de1458b", size = 1638614, upload-time = "2026-06-26T18:31:46.297Z" }, + { url = "https://files.pythonhosted.org/packages/82/2f/146d218299046a43d1f029fd544b3d110d0f175a09c715c7e8da4a4a345d/greenlet-3.5.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df0a0628d1597eb0897b62f55d1343f772405fd25f3b2a796c76874b0c2e22e8", size = 654096, upload-time = "2026-06-26T19:07:12.71Z" }, + { url = "https://files.pythonhosted.org/packages/a0/cc/04738cafb3f45fa991ea44f9de94c47dcec964f5a972300988a6751f49d9/greenlet-3.5.3-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ebd933a6adabc298bab47731a130fe6bfb888bd934eee37810f151159544540d", size = 666304, upload-time = "2026-06-26T19:10:09.503Z" }, + { url = "https://files.pythonhosted.org/packages/ce/aa/4e0dad5e605c270c784ab911c43da6adb136ccd4d81180f763ca429a723d/greenlet-3.5.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b9d501b40e80b70e32323c799dd9b420a5577a9601469d362ae1ffb690f3a7c", size = 663635, upload-time = "2026-06-26T18:32:20.802Z" }, + { url = "https://files.pythonhosted.org/packages/d1/50/13efdbea246fe3d3b735e191fec08fb50809f53cd2383ebe123d0809e44b/greenlet-3.5.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a1fad1d11e7d6aab184107baa8e4ece11ccba3ec9599cd7efa5ff4d70d43256a", size = 1621252, upload-time = "2026-06-26T19:09:05.647Z" }, + { url = "https://files.pythonhosted.org/packages/f7/22/c0a336ae4a1410fd5f5121098e5bfbf1865f64c5ef80b4b5412886c4a332/greenlet-3.5.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:fad5aec764399f1b5cc347ad250a59660f20c8f8888ea6bae1f93b769cce1154", size = 1684824, upload-time = "2026-06-26T18:31:47.738Z" }, + { url = "https://files.pythonhosted.org/packages/00/92/715c44721abe2b4d1ae9abde4179411868a5bff312479f54e105d372f131/greenlet-3.5.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19131729ae0ddc3c2e1ef85e650169b5e37ee32e400f215f78b94d7b0d567310", size = 653382, upload-time = "2026-06-26T19:07:14.209Z" }, + { url = "https://files.pythonhosted.org/packages/a0/83/37a10372a1090a6624cca8e74c12df1a36c2dc36429ed0255b7fb1aeee23/greenlet-3.5.3-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1540dd8e5fc2a5aec40fbb98ef8e149fa47c89a4b4a1cf2575a14d3d1869d7a8", size = 659401, upload-time = "2026-06-26T19:10:10.876Z" }, + { url = "https://files.pythonhosted.org/packages/db/e2/d1509cad4207da559cc42986ecdd8fc67ad0d1bba2bf03023c467fd5e0f3/greenlet-3.5.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e81fa194a1d20967877bdf9c7794db2bc99063e5be36aee710c08f04c5bb087f", size = 656969, upload-time = "2026-06-26T18:32:22.272Z" }, + { url = "https://files.pythonhosted.org/packages/86/7d/eaf70de20aadca3a5884aec58362861c64ce45e7b277f47ed026926a3b89/greenlet-3.5.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:55cf4d777485d43110e47133cbba6d74a8885a87ec1227ef0267f9ee80c5aa21", size = 1617822, upload-time = "2026-06-26T19:09:06.893Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f9/414d38fc400ae4350d4185eaad1827676f7cf5287b9136e0ed1cbbe20a7f/greenlet-3.5.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:12a248ba75f6a9a236375f52296c498c89ff1d8badf32deb9eca7abd5853f7da", size = 1677983, upload-time = "2026-06-26T18:31:49.396Z" }, + { url = "https://files.pythonhosted.org/packages/4f/ca/69db42d447a1378043e2c8f19c09cbbd1263371505053c496b49066d3d16/greenlet-3.5.3-cp315-cp315-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78dbef602fda6d97d957eb7937f70c9ce9e9527330347f8f6b6f9e554a9e7a47", size = 659747, upload-time = "2026-06-26T19:07:15.565Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0b/af7ac2ef8dd41e3da1a40dda6305c23b9a03e13ba975ec916357b50f8575/greenlet-3.5.3-cp315-cp315-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f73857adb8fee13fa56c172bd11262f888c0c648f9fea113e777bb2c7904a81", size = 670419, upload-time = "2026-06-26T19:10:12.293Z" }, + { url = "https://files.pythonhosted.org/packages/51/1e/1d51640cacbfc455dbe9f9a9f594c49e4e244f63b9971a2f4764e46cc53d/greenlet-3.5.3-cp315-cp315-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:232fec92e823addaf02d9472cf7381e24a1d046a6ced1103c5caa4c21b9dfc1d", size = 668787, upload-time = "2026-06-26T18:32:24.298Z" }, + { url = "https://files.pythonhosted.org/packages/21/66/4030d5b0b5894500023f003bb054d9bb354dfbd1e186c3a296759172f5f5/greenlet-3.5.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:2421c3564da9429d5586d46ca31ebb26516b5498a802cf65c041a8e8a8980d34", size = 1626305, upload-time = "2026-06-26T19:09:08.281Z" }, + { url = "https://files.pythonhosted.org/packages/0e/50/5221371c7550108dfa3c378debc41d032aa9c78e89abb01d8011cfc93289/greenlet-3.5.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e0f0d160f0b2e558e6c75f7930967183255dc9735e5f5b8cae58ee09c9576d8b", size = 1688631, upload-time = "2026-06-26T18:31:51.278Z" }, + { url = "https://files.pythonhosted.org/packages/57/66/b3bfae3e220a9b63ea539a0eea681800c69ab1aada757eae8789f183e7ce/greenlet-3.5.3-cp315-cp315t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:629b614d2b786e89c50440e246f33eea78f58a962d0bdbbcc809e6d13605903f", size = 657221, upload-time = "2026-06-26T19:07:16.973Z" }, + { url = "https://files.pythonhosted.org/packages/7b/81/b6d4d73a709684fc77e7fa034d7c2fe82cffa9fc920fadcaa659c2626213/greenlet-3.5.3-cp315-cp315t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2b2e857ae16f5f72142edf75f9f176fe7526ba19a2841df1420516f83831c9f2", size = 663226, upload-time = "2026-06-26T19:10:13.723Z" }, + { url = "https://files.pythonhosted.org/packages/f5/07/e210b02b589f16e74ff48b730690e4a34ffe984219fce4f3c1a0e7ec8545/greenlet-3.5.3-cp315-cp315t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e515757e2e36bcbf1fad09a46e1557e8b1ae1797d4b44d09da7deed88ad28608", size = 660802, upload-time = "2026-06-26T18:32:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/eb/2e/5303eb3fa06bca089060f479707182a93e360683bc252acf846c3090d34e/greenlet-3.5.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:b363d46ed1ea431825fdb01471bb024fc08399bad1572a616e853c7684415adb", size = 1622157, upload-time = "2026-06-26T19:09:09.527Z" }, + { url = "https://files.pythonhosted.org/packages/54/70/50de47a488f14df260b50ae34fb5d56016e308b098eab02c878b5223c26a/greenlet-3.5.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:e44da2f5bbdaabaf7d80b73dbb430c7035771e9f244e3c8b769715c9d8fa0a16", size = 1681159, upload-time = "2026-06-26T18:31:52.986Z" }, +] + +[[package]] +name = "gsl" +version = "0.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/36/a8a99ab67918beb6ee8722fb6c27512796a5ff8ed4c10036f787eef51569/gsl-0.0.3.tar.gz", hash = "sha256:85a6071e00a284510c963b97ab74ef8a3e7d1786c5f52dc2ff444cbb7d94ee3c", size = 44404, upload-time = "2018-05-30T09:02:51.203Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/1e/14d4c4657bc7130b900c65033861ee0db508d2d9206f4223f5da7c855acc/gsl-0.0.3-py3-none-any.whl", hash = "sha256:081c77375bf65cb759a3e5129275b8806be18648452f50f7c420f40dac60529a", size = 39432, upload-time = "2018-05-30T09:02:49.93Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "h2" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hpack", marker = "sys_platform == 'linux'" }, + { name = "hyperframe", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" }, +] + +[[package]] +name = "h5py" +version = "3.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/33/acd0ce6863b6c0d7735007df01815403f5589a21ff8c2e1ee2587a38f548/h5py-3.16.0.tar.gz", hash = "sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738", size = 446526, upload-time = "2026-03-06T13:49:08.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/84/06281c82d4d1686fde1ac6b0f307c50918f1c0151062445ab3b6fa5a921d/h5py-3.16.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527", size = 5198852, upload-time = "2026-03-06T13:48:07.482Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e9/1a19e42cd43cc1365e127db6aae85e1c671da1d9a5d746f4d34a50edb577/h5py-3.16.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e", size = 5405250, upload-time = "2026-03-06T13:48:09.628Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/9790c1655eabeb85b92b1ecab7d7e62a2069e53baefd58c98f0909c7a948/h5py-3.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794", size = 5190108, upload-time = "2026-03-06T13:48:11.26Z" }, + { url = "https://files.pythonhosted.org/packages/51/d7/ab693274f1bd7e8c5f9fdd6c7003a88d59bedeaf8752716a55f532924fbb/h5py-3.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074", size = 5419216, upload-time = "2026-03-06T13:48:13.322Z" }, + { url = "https://files.pythonhosted.org/packages/da/1e/6172269e18cc5a484e2913ced33339aad588e02ba407fafd00d369e22ef3/h5py-3.16.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524", size = 5193860, upload-time = "2026-03-06T13:48:24.071Z" }, + { url = "https://files.pythonhosted.org/packages/bd/98/ef2b6fe2903e377cbe870c3b2800d62552f1e3dbe81ce49e1923c53d1c5c/h5py-3.16.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402", size = 5400417, upload-time = "2026-03-06T13:48:25.728Z" }, + { url = "https://files.pythonhosted.org/packages/bc/81/5b62d760039eed64348c98129d17061fdfc7839fc9c04eaaad6dee1004e4/h5py-3.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7", size = 5185214, upload-time = "2026-03-06T13:48:27.436Z" }, + { url = "https://files.pythonhosted.org/packages/28/c4/532123bcd9080e250696779c927f2cb906c8bf3447df98f5ceb8dcded539/h5py-3.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff", size = 5414598, upload-time = "2026-03-06T13:48:29.49Z" }, + { url = "https://files.pythonhosted.org/packages/58/a5/4964bc0e91e86340c2bbda83420225b2f770dcf1eb8a39464871ad769436/h5py-3.16.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965", size = 5198886, upload-time = "2026-03-06T13:48:38.879Z" }, + { url = "https://files.pythonhosted.org/packages/f1/16/d905e7f53e661ce2c24686c38048d8e2b750ffc4350009d41c4e6c6c9826/h5py-3.16.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd", size = 5404883, upload-time = "2026-03-06T13:48:41.324Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f2/58f34cb74af46d39f4cd18ea20909a8514960c5a3e5b92fd06a28161e0a8/h5py-3.16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c", size = 5192039, upload-time = "2026-03-06T13:48:43.117Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ca/934a39c24ce2e2db017268c08da0537c20fa0be7e1549be3e977313fc8f5/h5py-3.16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc", size = 5421526, upload-time = "2026-03-06T13:48:44.838Z" }, + { url = "https://files.pythonhosted.org/packages/f5/a1/af87f64b9f986889884243643621ebbd4ac72472ba8ec8cec891ac8e2ca1/h5py-3.16.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242", size = 5074061, upload-time = "2026-03-06T13:48:54.089Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d0/146f5eaff3dc246a9c7f6e5e4f42bd45cc613bce16693bcd4d1f7c958bf5/h5py-3.16.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16", size = 5279216, upload-time = "2026-03-06T13:48:56.75Z" }, + { url = "https://files.pythonhosted.org/packages/a1/9d/12a13424f1e604fc7df9497b73c0356fb78c2fb206abd7465ce47226e8fd/h5py-3.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7", size = 5070068, upload-time = "2026-03-06T13:48:59.169Z" }, + { url = "https://files.pythonhosted.org/packages/41/8c/bbe98f813722b4873818a8db3e15aa3e625b59278566905ac439725e8070/h5py-3.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725", size = 5300253, upload-time = "2026-03-06T13:49:02.033Z" }, +] + +[[package]] +name = "healpix" +version = "2025.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/1a/c1af658a2d06cdd2734b085b0eee34d51646f091ed13b1669d3a596de57c/healpix-2025.1.tar.gz", hash = "sha256:733f16f30c15d911c8209f4045f0b0934e5fcafa63b8b39d62e425a036adccea", size = 22744, upload-time = "2025-07-07T16:38:42.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/9e/a14baf09831eef05592a91b8c0c29918025b5069511c9300c4ce64ef5f25/healpix-2025.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1a1d41e0c2a98ef3d3cf48e18ca7edadb599641f1754e28e8df0a0a96471fdd4", size = 70836, upload-time = "2025-07-07T16:38:22.512Z" }, + { url = "https://files.pythonhosted.org/packages/0b/06/7946ec2c0fd5a4fb2b077c9c49358fb32577b21c4e27c7457464716780d3/healpix-2025.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e347f3c76407d7c8018cd8da7eccb4aebd715e46b8f60111dcf161e969bd25f", size = 69891, upload-time = "2025-07-07T16:38:23.692Z" }, + { url = "https://files.pythonhosted.org/packages/81/cb/82b05f0779924b73c2522f440a65bd4d27af2099aec876c44168bea01136/healpix-2025.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e8cacfd6359564c12c7bc81633e92fa7d6e74fffb834a1e08a38e88cb9ac3c50", size = 70865, upload-time = "2025-07-07T16:38:29.898Z" }, + { url = "https://files.pythonhosted.org/packages/fa/0c/fc40bad841a2c6d45b8e59973135be667c8f4b2000c870b374a3a746a66a/healpix-2025.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa546ca045be0661dfc42f7a4e7996f2134dd07d0d5639ae8d7d1a6b293470a2", size = 69939, upload-time = "2025-07-07T16:38:31.257Z" }, +] + +[[package]] +name = "healpy" +version = "1.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/4e/6f5328f375f88c8c38314f24f82b7e1486ec0358c557779500382db1503c/healpy-1.19.0.tar.gz", hash = "sha256:28e839cb885a23d36c77fc3423a3cb9271a07fda94085bd12fc329f941130ec5", size = 4075006, upload-time = "2025-12-02T08:27:19.766Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/51/c07439b92bc05966006897762b7291d7d2c83fde8807b8d53a48e140a8b4/healpy-1.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:730095eef4bbe3c94039edb330d1800285cf43c7e16a81ce5b87edb31a8ffa42", size = 8239086, upload-time = "2025-12-02T08:26:53.076Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/42745aeff172755e55af2487491c7a7475fe1068f152850cc14d64e04f30/healpy-1.19.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:89dbe14b270b5479a9652d1ab9f28fc7fce34253549db665f2e91e6cea588883", size = 8255685, upload-time = "2025-12-02T08:26:54.361Z" }, + { url = "https://files.pythonhosted.org/packages/9d/86/2a223bd92dde578de34f07095c71152c84b158644782c4057ca9b25e53b5/healpy-1.19.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:29bb5f7acde68ca5850c3a59ba33cacf4c3768c9e85f7013a99aa5fbd127ce84", size = 9042629, upload-time = "2025-12-02T08:26:55.773Z" }, + { url = "https://files.pythonhosted.org/packages/18/6d/037a7bb889c92b3e3f792de6a692e636de0577ea62bdd0038b1eb68270af/healpy-1.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:126bef3ae6594f461435ac85c6bcb32e427eca43f743881d00186bc3a55da1d8", size = 9376051, upload-time = "2025-12-02T08:26:57.516Z" }, + { url = "https://files.pythonhosted.org/packages/de/bb/314bf8c493701b5842cdd74a1b5b34cea1522444042efad5b7cb17b8d159/healpy-1.19.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:086bae2510ac60f7cf9bbb520e1d1b8864cc8fca74b46b16e24857e74d08f896", size = 8198878, upload-time = "2025-12-02T08:27:03.119Z" }, + { url = "https://files.pythonhosted.org/packages/f6/d4/a60ed9a50768ff5e896dd94d878496ae16767925ea32c49d5a4189ab818a/healpy-1.19.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:920c0a1c6749c05c8ad9522a5a2630f7bc83124c5742ef50f91b9f5e6a1bdcc7", size = 8205835, upload-time = "2025-12-02T08:27:04.416Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fd/5f4c989b53423bbad07c91a4b9d52de5cde9f1154e3d2b145b397e1b8cd8/healpy-1.19.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:26e3e6c50f2d256c9218f0fb0624406a93c4f22bc66deebf51a0f31fd5594b89", size = 8991846, upload-time = "2025-12-02T08:27:06.123Z" }, + { url = "https://files.pythonhosted.org/packages/d5/df/00636a5d2f1141b1fa9646069436c4fc68b35ac2c53ef520f8812b900f05/healpy-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bc3c243985abf1f1b5d91da12a23ceed49181dd9d0e46ed362babdc92c814aa8", size = 9325719, upload-time = "2025-12-02T08:27:08.138Z" }, + { url = "https://files.pythonhosted.org/packages/c5/ca/f583967e1395e41608225d0a6d29e582236f615d83023d730e63bac89baa/healpy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b3cf9c627af77a3fc670d6240d8a83485f373c274945ca8ad156fc2a25d6eb61", size = 8172544, upload-time = "2025-12-02T08:27:13.684Z" }, + { url = "https://files.pythonhosted.org/packages/85/ae/80a5e0d36ee51e72b27fb8e11d0d43dfb3f8e2ccc315a38865a2ccd5ed73/healpy-1.19.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:c22360ad7ec6f16bdbb650dececf52d21f7f0e03a943eb1a1046fdb9c51a3c5e", size = 8198134, upload-time = "2025-12-02T08:27:15.156Z" }, + { url = "https://files.pythonhosted.org/packages/36/7b/34b9954fdf76b1f5ab0a76228650c2575b189fb6f9f7865c98477a46086d/healpy-1.19.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1a479826c1d6ae8312476e079a3f5c7aa3e40911d74f2d7069adcd62e98604ad", size = 8986426, upload-time = "2025-12-02T08:27:16.417Z" }, + { url = "https://files.pythonhosted.org/packages/94/df/bb3ef51f423c62576fb0775fe72f0d2028a10e3ffb20b4fc76146ea8757b/healpy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a103e327102e124785c1b5bdd379c6e5469137633212b56a6196bf04ddd100ff", size = 9307512, upload-time = "2025-12-02T08:27:18.03Z" }, +] + +[[package]] +name = "healsparse" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hpgeom", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e3/33/36520faabae128fe9a4a5cbeb0916be864d2eb34cf7410d52dc532af044e/healsparse-1.13.0.tar.gz", hash = "sha256:c21e4eb075c686bd306bdc1b40e039134c4ca60ccfa4e7e73845c107a5b16544", size = 133589, upload-time = "2026-07-07T18:33:05.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/2f/7674b91031a12a9b3cd69f3bb675d3b1eac59657139e23bc528ed6d33d0a/healsparse-1.13.0-py3-none-any.whl", hash = "sha256:3b475a61d7701526246a592ed980758f94764caba4355429bf470a2f9b812964", size = 70673, upload-time = "2026-07-07T18:33:04.514Z" }, +] + +[[package]] +name = "hpack" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/5b/fcabf6028144a8723726318b07a32c2f3314acdff6265743cf08a344b18e/hpack-4.2.0.tar.gz", hash = "sha256:0895cfa3b5531fc65fe439c05eb65144f123bf7a394fcaa56aa423548d8e45c0", size = 51300, upload-time = "2026-06-23T18:34:46.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/b4/4a9fcfb2aef6ba44d9073ecd301443aa00b3dac95de5619f2a7de7ec8a91/hpack-4.2.0-py3-none-any.whl", hash = "sha256:858ac0b02280fa582b5080d68db0899c62a80375e0e5413a74970c5e518b6986", size = 34246, upload-time = "2026-06-23T18:34:45.472Z" }, +] + +[[package]] +name = "hpgeom" +version = "1.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/72/27640de7d85a566b8ecd27e7894f371a19669c56c268756e18111a137df8/hpgeom-1.5.4.tar.gz", hash = "sha256:85ac73e267c11f3f248920d3541a0e6ffab821cae54f0d44414d1939dfb91200", size = 153906, upload-time = "2026-02-24T19:03:01.954Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/7f/bae5e1a44d76fa7396c4a004e2e86acb5fe70d8aaaa7f91190c65eb09e97/hpgeom-1.5.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d544a9834477b0aedf61ee934ce4598170cf14f16742200cd1729103edb5f506", size = 192550, upload-time = "2026-02-24T19:02:49.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/4d/8b83dcbbd08bd7e713583490c14db848515a909515644037c80d20e2b80c/hpgeom-1.5.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7af0216ff1db0a49a771356562088c49185104a10502b68ab26c8ca2816d17b0", size = 197180, upload-time = "2026-02-24T19:02:50.453Z" }, + { url = "https://files.pythonhosted.org/packages/75/dc/4c0c6d7eba1d42be23794b03e6048af4de0d92c5805f4f2ed29bc1ca0f16/hpgeom-1.5.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7058b3396fb7deb8b8637ac7f2861bfaa213574c50b9e771bf80f4d1e9064f3", size = 192643, upload-time = "2026-02-24T19:02:54.045Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9a/41ba036857a5489d2c1e6f742903aae452d874a48c5b24889de79e02e668/hpgeom-1.5.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e160d40a18b8e80b7e233b4459adcbd4aea5d1fb48cefe7f07e8fc7dfbdcd9f3", size = 197257, upload-time = "2026-02-24T19:02:55.356Z" }, + { url = "https://files.pythonhosted.org/packages/a7/83/45d4208eb33432195df1998d5b5d75afc52d52cdec5ccdec80fa9d3fb2cc/hpgeom-1.5.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47fe1c0c334d9722110a0d6346d2e4222aaed4454138996f9b2638a78ec98b60", size = 192606, upload-time = "2026-02-24T19:02:58.915Z" }, + { url = "https://files.pythonhosted.org/packages/1d/67/ab80b95519d453e72cd65ccc6cd411f23a4d997f492ed9ad0dbc51bce0fa/hpgeom-1.5.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fce969f1311a2f44c4f1c58fca1302b472ef798e702725a75bc16a342f924a66", size = 197071, upload-time = "2026-02-24T19:03:00.063Z" }, +] + +[[package]] +name = "html2text" +version = "2025.4.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/27/e158d86ba1e82967cc2f790b0cb02030d4a8bef58e0c79a8590e9678107f/html2text-2025.4.15.tar.gz", hash = "sha256:948a645f8f0bc3abe7fd587019a2197a12436cd73d0d4908af95bfc8da337588", size = 64316, upload-time = "2025-04-15T04:02:30.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1d/84/1a0f9555fd5f2b1c924ff932d99b40a0f8a6b12f6dd625e2a47f415b00ea/html2text-2025.4.15-py3-none-any.whl", hash = "sha256:00569167ffdab3d7767a4cdf589b7f57e777a5ed28d12907d8c58769ec734acc", size = 34656, upload-time = "2025-04-15T04:02:28.44Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi", marker = "sys_platform == 'linux'" }, + { name = "h11", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "sys_platform == 'linux'" }, + { name = "certifi", marker = "sys_platform == 'linux'" }, + { name = "httpcore", marker = "sys_platform == 'linux'" }, + { name = "idna", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[package.optional-dependencies] +http2 = [ + { name = "h2", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "humanfriendly" +version = "10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" }, +] + +[[package]] +name = "hyperframe" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/84/93bcd1300216ea50811cee96873b84a1bebf8d0489ffaf7f2a3756bab866/imageio-2.37.3.tar.gz", hash = "sha256:bbb37efbfc4c400fcd534b367b91fcd66d5da639aaa138034431a1c5e0a41451", size = 389673, upload-time = "2026-03-09T11:31:12.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl", hash = "sha256:46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0", size = 317646, upload-time = "2026-03-09T11:31:10.771Z" }, +] + +[[package]] +name = "imagesize" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, +] + +[[package]] +name = "immutables" +version = "0.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/69/41/0ccaa6ef9943c0609ec5aa663a3b3e681c1712c1007147b84590cec706a0/immutables-0.21.tar.gz", hash = "sha256:b55ffaf0449790242feb4c56ab799ea7af92801a0a43f9e2f4f8af2ab24dfc4a", size = 89008, upload-time = "2024-10-10T00:55:01.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/52/cb9e2bb7a69338155ffabbd2f993c968c750dd2d5c6c6eaa6ebb7bfcbdfa/immutables-0.21-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b48b116aaca4500398058b5a87814857a60c4cb09417fecc12d7da0f5639b73d", size = 104270, upload-time = "2024-10-10T00:54:21.912Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a4/25df835a9b9b372a4a869a8a1ac30a32199f2b3f581ad0e249f7e3d19eed/immutables-0.21-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dad7c0c74b285cc0e555ec0e97acbdc6f1862fcd16b99abd612df3243732e741", size = 104864, upload-time = "2024-10-10T00:54:22.956Z" }, + { url = "https://files.pythonhosted.org/packages/4a/51/b548fbc657134d658e179ee8d201ae82d9049aba5c3cb2d858ed2ecb7e3f/immutables-0.21-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e44346e2221a5a676c880ca8e0e6429fa24d1a4ae562573f5c04d7f2e759b030", size = 99733, upload-time = "2024-10-10T00:54:23.99Z" }, + { url = "https://files.pythonhosted.org/packages/47/db/d7b1e0e88faf07fe9a88579a86f58078a9a37fff871f4b3dbcf28cad9a12/immutables-0.21-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8b10139b529a460e53fe8be699ebd848c54c8a33ebe67763bcfcc809a475a26f", size = 101698, upload-time = "2024-10-10T00:54:25.734Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d0/a5fb7c164ddb298ec37537e618b70dfa30c7cae9fac01de374c36489cbc9/immutables-0.21-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:583d2a63e444ce1538cc2bda56ae1f4a1a11473dbc0377c82b516bc7eec3b81e", size = 104334, upload-time = "2024-10-10T00:54:31.284Z" }, + { url = "https://files.pythonhosted.org/packages/f3/a5/5fda0ee4a261a85124011ac0750fec678f00e1b2d4a5502b149a3b4d86d9/immutables-0.21-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b274a52da9b106db55eceb93fc1aea858c4e6f4740189e3548e38613eafc2021", size = 104898, upload-time = "2024-10-10T00:54:32.295Z" }, + { url = "https://files.pythonhosted.org/packages/93/fa/d46bfe92f2c66d35916344176ff87fa839aac9c16849652947e722b7a15f/immutables-0.21-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:338bede057250b33716a3e4892e15df0bf5a5ddbf1d67ead996b3e680b49ef9e", size = 99966, upload-time = "2024-10-10T00:54:34.046Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f5/2a19e2e095f7a39d8d77dcc10669734d2d99773ce00c99bdcfeeb7d714e6/immutables-0.21-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8781c89583b68f604cf30f0978b722165824c3075888639fde771bf1a3e12dc0", size = 101773, upload-time = "2024-10-10T00:54:35.851Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl", hash = "sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7", size = 27789, upload-time = "2026-03-20T06:42:55.665Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "ipykernel" +version = "7.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm", marker = "sys_platform == 'linux'" }, + { name = "debugpy", marker = "sys_platform == 'linux'" }, + { name = "ipython", marker = "sys_platform == 'linux'" }, + { name = "jupyter-client", marker = "sys_platform == 'linux'" }, + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "matplotlib-inline", marker = "sys_platform == 'linux'" }, + { name = "nest-asyncio2", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "psutil", marker = "sys_platform == 'linux'" }, + { name = "pyzmq", marker = "sys_platform == 'linux'" }, + { name = "tornado", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/c4/e4a38f579de4225a561305666f7541cdabb30075def2aa1ac17bd73c1fb5/ipykernel-7.3.0.tar.gz", hash = "sha256:9acaaaf97d16355166e4085afe9d225bfbdf2b7ef520f9df3be8f2b248275e09", size = 184899, upload-time = "2026-06-10T08:41:25.481Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/02/77b271f5dc58bfbc0b577c877b2365d1ffea2afe66a80c13f2312820348c/ipykernel-7.3.0-py3-none-any.whl", hash = "sha256:897eb64da762549ef610698fca5e9675195ec6ac8ec7f19d81ce1ca20c876057", size = 120583, upload-time = "2026-06-10T08:41:23.648Z" }, +] + +[[package]] +name = "ipython" +version = "9.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "decorator", marker = "sys_platform == 'linux'" }, + { name = "ipython-pygments-lexers", marker = "sys_platform == 'linux'" }, + { name = "jedi", marker = "sys_platform == 'linux'" }, + { name = "matplotlib-inline", marker = "sys_platform == 'linux'" }, + { name = "pexpect", marker = "sys_platform == 'linux'" }, + { name = "prompt-toolkit", marker = "sys_platform == 'linux'" }, + { name = "psutil", marker = "sys_platform == 'linux'" }, + { name = "pygments", marker = "sys_platform == 'linux'" }, + { name = "stack-data", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/53/59/165d3b4d75cc34add3122c4417ecb229085140ac573103c223cd01dde96f/ipython-9.15.0.tar.gz", hash = "sha256:da2819ce2aa83135257df830660b1176d986c3d2876db24df01974fa955b2756", size = 4442580, upload-time = "2026-06-26T11:03:35.913Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/3a/948263ca3b9d65bb2b1b0c521b3a49fad5d59ada58724bd87d2bd5ff3f36/ipython-9.15.0-py3-none-any.whl", hash = "sha256:515ad9c3cdf0c932a5a9f6245419e8aba706b7bd03c3e1d3a1c83d9351d6aa6e", size = 630895, upload-time = "2026-06-26T11:03:33.809Z" }, +] + +[[package]] +name = "ipython-genutils" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/69/fbeffffc05236398ebfcfb512b6d2511c622871dca1746361006da310399/ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8", size = 22208, upload-time = "2017-03-13T22:12:26.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/bc/9bd3b5c2b4774d5f33b2d544f1460be9df7df2fe42f352135381c347c69a/ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", size = 26343, upload-time = "2017-03-13T22:12:25.412Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm", marker = "sys_platform == 'linux'" }, + { name = "ipython", marker = "sys_platform == 'linux'" }, + { name = "jupyterlab-widgets", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, + { name = "widgetsnbextension", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649, upload-time = "2020-11-01T11:00:00.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321, upload-time = "2020-11-01T10:59:58.02Z" }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/cf/ea4ef2920830dea3f5ab2ea4da6fb67724e6dca80ee2553788c3607243d0/jaraco_functools-4.5.0.tar.gz", hash = "sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03", size = 20272, upload-time = "2026-05-15T21:34:10.025Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl", hash = "sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4", size = 10594, upload-time = "2026-05-15T21:34:08.595Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "json5" +version = "0.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/7d/05c46a96a78147ae3bf99c2f4169ce144a70220b8d6fcd56f6ec368b8ce9/json5-0.15.0.tar.gz", hash = "sha256:7424d1f1eb1d56da6e3d70643f53619862b4ce81440bdb8ecfd6f875e5ba4a71", size = 53278, upload-time = "2026-06-19T20:08:27.716Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/be/59527c99478aade6bb33a68d72e6e18dd4e6ff6eacfc7d01bdb15bc76912/json5-0.15.0-py3-none-any.whl", hash = "sha256:56636a30c0e8a4665fe2179c0212f32eae3796dea89ea6f649b9436ecdb39618", size = 36570, upload-time = "2026-06-19T20:08:26.748Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs", marker = "sys_platform == 'linux'" }, + { name = "jsonschema-specifications", marker = "sys_platform == 'linux'" }, + { name = "referencing", marker = "sys_platform == 'linux'" }, + { name = "rpds-py", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn", marker = "sys_platform == 'linux'" }, + { name = "idna", marker = "sys_platform == 'linux'" }, + { name = "isoduration", marker = "sys_platform == 'linux'" }, + { name = "jsonpointer", marker = "sys_platform == 'linux'" }, + { name = "rfc3339-validator", marker = "sys_platform == 'linux'" }, + { name = "rfc3986-validator", marker = "sys_platform == 'linux'" }, + { name = "rfc3987-syntax", marker = "sys_platform == 'linux'" }, + { name = "uri-template", marker = "sys_platform == 'linux'" }, + { name = "webcolors", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "jupyter" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel", marker = "sys_platform == 'linux'" }, + { name = "ipywidgets", marker = "sys_platform == 'linux'" }, + { name = "jupyter-console", marker = "sys_platform == 'linux'" }, + { name = "jupyterlab", marker = "sys_platform == 'linux'" }, + { name = "nbconvert", marker = "sys_platform == 'linux'" }, + { name = "notebook", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959, upload-time = "2024-08-30T07:15:48.299Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657, upload-time = "2024-08-30T07:15:47.045Z" }, +] + +[[package]] +name = "jupyter-builder" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/df/db5efc4e28803a1421350445e53d85ec571a4e6928e3524ccc39f4e16584/jupyter_builder-1.1.0.tar.gz", hash = "sha256:b996e8af616900f18724fa34883169d869be2205497940bec78a3a1031eb897d", size = 971142, upload-time = "2026-07-11T07:24:02.4Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/fb/53adbc72931b4429275b160044c3e1bcbc8fbb5ea6b8f318a357834842fb/jupyter_builder-1.1.0-py3-none-any.whl", hash = "sha256:d9d5280e8845f726663545c3a6db55bd205127616eeb8958481091d6cba71b6a", size = 912964, upload-time = "2026-07-11T07:24:00.279Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "python-dateutil", marker = "sys_platform == 'linux'" }, + { name = "pyzmq", marker = "sys_platform == 'linux'" }, + { name = "tornado", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/dc/5512503b088997c2250b8bf18258fba9d9ce5ead641183700960d3c9d342/jupyter_client-8.9.1.tar.gz", hash = "sha256:a58f730dd9e728ba16ba1d62ebccf7ffe1ebbdbce4e95cfae941b7321ae1f4fa", size = 359256, upload-time = "2026-06-09T13:15:01.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/6f/56d39bf385c5c27988aebaf0c18a2a17e960575740100973511018bd904e/jupyter_client-8.9.1-py3-none-any.whl", hash = "sha256:0b7a295bc46e8751e9adae84781f726c851c1d911bd793edc4a3bde942e3da81", size = 109828, upload-time = "2026-06-09T13:14:58.835Z" }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel", marker = "sys_platform == 'linux'" }, + { name = "ipython", marker = "sys_platform == 'linux'" }, + { name = "jupyter-client", marker = "sys_platform == 'linux'" }, + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "prompt-toolkit", marker = "sys_platform == 'linux'" }, + { name = "pygments", marker = "sys_platform == 'linux'" }, + { name = "pyzmq", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363, upload-time = "2023-03-06T14:13:31.02Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510, upload-time = "2023-03-06T14:13:28.229Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "jupyter-events" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"], marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "python-json-logger", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "referencing", marker = "sys_platform == 'linux'" }, + { name = "rfc3339-validator", marker = "sys_platform == 'linux'" }, + { name = "rfc3986-validator", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/f8/475c4241b2b75af0deaae453ed003c6c851766dbc44d332d8baf245dc931/jupyter_events-0.12.1.tar.gz", hash = "sha256:faff25f77218335752f35f23c5fe6e4a392a7bd99a5939ccb9b8fbf594636cf3", size = 62854, upload-time = "2026-04-20T23:17:50.66Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/6c/6fcde0c8f616ed360ffd3587f7db9e225a7e62b583a04494d2f069cf64ea/jupyter_events-0.12.1-py3-none-any.whl", hash = "sha256:c366585253f537a627da52fa7ca7410c5b5301fe893f511e7b077c2d93ec8bcf", size = 19512, upload-time = "2026-04-20T23:17:48.927Z" }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/36/ff/1e4a61f5170a9a1d978f3ac3872449de6c01fc71eaf89657824c878b1549/jupyter_lsp-2.3.1.tar.gz", hash = "sha256:fdf8a4aa7d85813976d6e29e95e6a2c8f752701f926f2715305249a3829805a6", size = 55677, upload-time = "2026-04-02T08:10:06.749Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/e8/9d61dcbd1dce8ef418f06befd4ac084b4720429c26b0b1222bc218685eff/jupyter_lsp-2.3.1-py3-none-any.whl", hash = "sha256:71b954d834e85ff3096400554f2eefaf7fe37053036f9a782b0f7c5e42dadb81", size = 77513, upload-time = "2026-04-02T08:10:01.753Z" }, +] + +[[package]] +name = "jupyter-server" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "sys_platform == 'linux'" }, + { name = "argon2-cffi", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "jupyter-client", marker = "sys_platform == 'linux'" }, + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "jupyter-events", marker = "sys_platform == 'linux'" }, + { name = "jupyter-server-terminals", marker = "sys_platform == 'linux'" }, + { name = "nbconvert", marker = "sys_platform == 'linux'" }, + { name = "nbformat", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "prometheus-client", marker = "sys_platform == 'linux'" }, + { name = "pyzmq", marker = "sys_platform == 'linux'" }, + { name = "send2trash", marker = "sys_platform == 'linux'" }, + { name = "terminado", marker = "sys_platform == 'linux'" }, + { name = "tornado", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, + { name = "websocket-client", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/dc/db3a582633170186f8c8b31298d7eb26ad0eb031a1f53476c258b64eed05/jupyter_server-2.20.0.tar.gz", hash = "sha256:b5778ba337d8015a3dc2b80803ecdd5ac18d3797fddf61a50ea5fb472b4ebe14", size = 756523, upload-time = "2026-06-17T12:09:09.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/71/8c002223e873a870f5c41dc69b0a7c922301123e4a31d5d01ecb700aef77/jupyter_server-2.20.0-py3-none-any.whl", hash = "sha256:c3b67c93c471e947c18b5026f04f21614218adb706df8f48227d3ee8e0a7cdcc", size = 393143, upload-time = "2026-06-17T12:09:07.234Z" }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "terminado", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/a7/bcd0a9b0cbba88986fe944aaaf91bfda603e5a50bda8ed15123f381a3b2f/jupyter_server_terminals-0.5.4.tar.gz", hash = "sha256:bbda128ed41d0be9020349f9f1f2a4ab9952a73ed5f5ac9f1419794761fb87f5", size = 31770, upload-time = "2026-01-14T16:53:20.213Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/2d/6674563f71c6320841fc300911a55143925112a72a883e2ca71fba4c618d/jupyter_server_terminals-0.5.4-py3-none-any.whl", hash = "sha256:55be353fc74a80bc7f3b20e6be50a55a61cd525626f578dcb66a5708e2007d14", size = 13704, upload-time = "2026-01-14T16:53:18.738Z" }, +] + +[[package]] +name = "jupyterlab" +version = "4.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru", marker = "sys_platform == 'linux'" }, + { name = "httpx", marker = "sys_platform == 'linux'" }, + { name = "ipykernel", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "jupyter-builder", marker = "sys_platform == 'linux'" }, + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "jupyter-lsp", marker = "sys_platform == 'linux'" }, + { name = "jupyter-server", marker = "sys_platform == 'linux'" }, + { name = "jupyterlab-server", marker = "sys_platform == 'linux'" }, + { name = "notebook-shim", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "tornado", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/2a/d6af53bfd45a43a5bfe7e40ba47ee7a8921a807daf4bb708e3a295bbb54d/jupyterlab-4.6.1.tar.gz", hash = "sha256:75315982ed28427edaa62bb85eadb5105e4043a757643c910efd787fe6ed0837", size = 28179125, upload-time = "2026-06-29T12:48:45.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/81/90ac6cc31d248e83a0d1eab343a5e6e68bc783d3f74fbe61640f42a61da4/jupyterlab-4.6.1-py3-none-any.whl", hash = "sha256:85a58546c831f3dce6cf919468c26874c9065e99c42279fb4abb8e1b552a98bb", size = 17164660, upload-time = "2026-06-29T12:48:41.21Z" }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "json5", marker = "sys_platform == 'linux'" }, + { name = "jsonschema", marker = "sys_platform == 'linux'" }, + { name = "jupyter-server", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "requests", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c", size = 76996, upload-time = "2025-10-22T13:59:18.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968", size = 59830, upload-time = "2025-10-22T13:59:16.767Z" }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" }, +] + +[[package]] +name = "jupytext" +version = "1.19.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py", marker = "sys_platform == 'linux'" }, + { name = "mdit-py-plugins", marker = "sys_platform == 'linux'" }, + { name = "nbformat", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/52/e014296ac8f40ca783aeb73dae52e65edbb0eaae0dcdc1ea41bfaa8aebf7/jupytext-1.19.4.tar.gz", hash = "sha256:739bcd4bc12aa4fe298a38017cdb5ae27b08a6ba3a5470728d2fe9e04b155db1", size = 4581977, upload-time = "2026-06-21T21:48:58.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/e9/e2ae007456069dbe01865c69a4203a7ada6f7e337b78fc2f12e51bd3fae7/jupytext-1.19.4-py3-none-any.whl", hash = "sha256:032d4ef4bd2e96addcac780b9b1d6b5a266ca39beceaaca95bfb4f06e0b77029", size = 170889, upload-time = "2026-06-21T21:48:56.352Z" }, +] + +[[package]] +name = "keyring" +version = "25.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jaraco-classes", marker = "sys_platform == 'linux'" }, + { name = "jaraco-context", marker = "sys_platform == 'linux'" }, + { name = "jaraco-functools", marker = "sys_platform == 'linux'" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, + { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, + { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, + { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, + { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, + { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, + { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, + { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, + { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, + { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, + { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, + { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, + { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, + { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, + { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, + { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, + { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, +] + +[[package]] +name = "lark" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905", size = 382732, upload-time = "2025-10-27T18:25:56.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12", size = 113151, upload-time = "2025-10-27T18:25:54.882Z" }, +] + +[[package]] +name = "latexcodec" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/dd/4270b2c5e2ee49316c3859e62293bd2ea8e382339d63ab7bbe9f39c0ec3b/latexcodec-3.0.1.tar.gz", hash = "sha256:e78a6911cd72f9dec35031c6ec23584de6842bfbc4610a9678868d14cdfb0357", size = 31222, upload-time = "2025-06-17T18:47:34.051Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/40/23569737873cc9637fd488606347e9dd92b9fa37ba4fcda1f98ee5219a97/latexcodec-3.0.1-py3-none-any.whl", hash = "sha256:a9eb8200bff693f0437a69581f7579eb6bca25c4193515c09900ce76451e452e", size = 18532, upload-time = "2025-06-17T18:47:30.726Z" }, +] + +[[package]] +name = "lenspack" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/de/18cfc64028334a1907d44ba2b40e233a2c7a06d7c1e827acfd1785c0b293/lenspack-1.0.0.tar.gz", hash = "sha256:e528a5409473eb996b39695cccb744db067341eb5fac6f240cd8d0aa669c85ec", size = 32632, upload-time = "2020-09-04T08:33:53.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/3d/a93a1332b1412301ddb454f206507b5e0b3679e012471fbbb075ca3b0845/lenspack-1.0.0-py3-none-any.whl", hash = "sha256:f9c632697516bb681e16b3eff66a7210d6355926179b95aa7060c8936c2259cc", size = 37746, upload-time = "2020-09-04T08:33:50.114Z" }, +] + +[[package]] +name = "llvmlite" +version = "0.48.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/a0/acc8ffcd5bdc63df0097e22c719bfcd61b604358343089313a8aebbb24ab/llvmlite-0.48.0.tar.gz", hash = "sha256:543b19f9ef8f3c7c60d1468191e4ee1b1537bf9f8a3d56f64c0ddd98de92edd2", size = 184016, upload-time = "2026-07-02T20:20:05.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/f2/72409351db66d0a317ec5087e076f31fb7b773a640db8a90ce6b5cac9edd/llvmlite-0.48.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:416fa4c2c66c2c6dc6d0a402648c19206e548efa0aa1eff01ad5cdad0af8217d", size = 59890118, upload-time = "2026-07-01T18:41:44.886Z" }, + { url = "https://files.pythonhosted.org/packages/3a/27/5ae2f3722606360480707adb47f001ad89df8251d06b14ee80336e660b66/llvmlite-0.48.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5e5a5131045b72345c71062ea1a91910dde913792b6c9b28ebb2c1c0a712e98", size = 58343459, upload-time = "2026-07-01T18:41:40.306Z" }, + { url = "https://files.pythonhosted.org/packages/1b/4a/90715fa12006d681270b08d881195b6fab3ec39572e048764a1f7f59fed7/llvmlite-0.48.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8761b9e522f55207e24424fcd98370289eec2710bf8e915c82d1053f642450dc", size = 59890120, upload-time = "2026-07-01T18:42:00.748Z" }, + { url = "https://files.pythonhosted.org/packages/70/5e/7b3e20d64650ca3c80af0cdb664ec4b575ec83d9d4dd05bea8bd31f9bbb6/llvmlite-0.48.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fe5cb59b2063bfa039dcb8ca6481c0181bf552f340d10dcf61d7996a665556e", size = 58343457, upload-time = "2026-07-01T18:41:56.41Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e1/05b50692b647cac3c18200ac485b04f342f00ed173c9cc46767274469a15/llvmlite-0.48.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:05f0103c8f2f96a37441337e3643863c01b8e83e530aff38960dcb383c54a065", size = 59890115, upload-time = "2026-07-01T18:42:17.805Z" }, + { url = "https://files.pythonhosted.org/packages/f7/c3/470b8c4ff9ae2db2f9cf5c3e73de76ed908a32788ae9eb5602d43e6a476b/llvmlite-0.48.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37d66fae72802175b0bfe1ea06e624b51e2d7aee6c3c34bbd09739b8f88e8e0b", size = 58343457, upload-time = "2026-07-01T18:42:13.217Z" }, + { url = "https://files.pythonhosted.org/packages/27/98/a29133b4728671a175f7d616fab8b1c6e1d8c269d1523581d3160697bfb1/llvmlite-0.48.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d9f952dff6c350c529997423d4fa43abae9722a884ac7ffafc37a3af676e7db", size = 59890119, upload-time = "2026-07-01T18:42:33.88Z" }, + { url = "https://files.pythonhosted.org/packages/1a/cf/7aac11a1f1c7ec54b60c7f6814e87561fb6b55b2f290455d7941eb113420/llvmlite-0.48.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:054aa7d46595935565f276cf0c1659b4f10929c996dd4a606875fae26fba2a23", size = 58343460, upload-time = "2026-07-01T18:42:29.545Z" }, +] + +[[package]] +name = "lmfit" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asteval", marker = "sys_platform == 'linux'" }, + { name = "dill", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, + { name = "uncertainties", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/e5/a35942aed2de95e228728c34609b51fe3ec9182398eac50d288eef313aa2/lmfit-1.3.4.tar.gz", hash = "sha256:3c22c28c43f717f6c5b4a3bd81e893a2149739c26a592c046f2e33c23cfbe497", size = 630720, upload-time = "2025-07-19T20:09:01.876Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/7e/7b91c89a4cf0f543a83be978657afb20c86af6d725253e319589dcc4ce52/lmfit-1.3.4-py3-none-any.whl", hash = "sha256:afce1593b42324d37ae2908249b0c55445e2f4c1a0474ff706a8e2f7b5d949fa", size = 97662, upload-time = "2025-07-19T20:09:00.32Z" }, +] + +[[package]] +name = "locket" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/83/97b29fe05cb6ae28d2dbd30b81e2e402a3eed5f460c26e9eaa5895ceacf5/locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", size = 4350, upload-time = "2022-04-20T22:04:44.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3", size = 4398, upload-time = "2022-04-20T22:04:42.23Z" }, +] + +[[package]] +name = "lsstdesc-coord" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "future", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/e0/6806df4cfa54927a2d8e425407611b4fc031dd125bc952b4a31deb743305/lsstdesc_coord-1.3.1.tar.gz", hash = "sha256:60f878c29e1f30a9b50bf60dca3c466dc9cfb2cbc71f0a27c575ced969de57ab", size = 41647, upload-time = "2026-02-13T18:37:32.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/f8/63121ece13d3dc7521e8989b4224389868f092ce13d3aae4c410b0f5de12/lsstdesc_coord-1.3.1-py3-none-any.whl", hash = "sha256:06afe1621ef5da89f51e1225b1016f9ab640f6eb955bbab1231d60342e536336", size = 27105, upload-time = "2026-02-13T18:37:31.214Z" }, +] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" }, + { url = "https://files.pythonhosted.org/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" }, + { url = "https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171, upload-time = "2026-05-18T19:18:52.779Z" }, + { url = "https://files.pythonhosted.org/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" }, + { url = "https://files.pythonhosted.org/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" }, + { url = "https://files.pythonhosted.org/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139, upload-time = "2026-05-18T19:19:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329, upload-time = "2026-05-18T19:19:09.728Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564, upload-time = "2026-05-18T19:19:13.608Z" }, + { url = "https://files.pythonhosted.org/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467, upload-time = "2026-05-18T19:19:16.228Z" }, + { url = "https://files.pythonhosted.org/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304, upload-time = "2026-05-18T19:19:19.354Z" }, + { url = "https://files.pythonhosted.org/packages/1c/01/00b1b8442ed2041793336868ba0b9ea4b13d7da7c085c6404c207a63bf79/lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e", size = 5341607, upload-time = "2026-05-18T19:19:22.297Z" }, + { url = "https://files.pythonhosted.org/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168, upload-time = "2026-05-18T19:19:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487, upload-time = "2026-05-18T19:19:28.603Z" }, + { url = "https://files.pythonhosted.org/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231, upload-time = "2026-05-18T19:18:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450, upload-time = "2026-05-18T19:18:48.013Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874, upload-time = "2026-05-18T19:18:51.914Z" }, + { url = "https://files.pythonhosted.org/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987, upload-time = "2026-05-18T19:18:59.715Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276, upload-time = "2026-05-18T19:19:03.834Z" }, + { url = "https://files.pythonhosted.org/packages/d2/51/3904907c063451cf8d4a5c9fe0cad95fa1f4ec57f4e3884fa0731bd7a305/lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14", size = 4950022, upload-time = "2026-05-18T19:19:31.958Z" }, + { url = "https://files.pythonhosted.org/packages/94/cd/9c7611a51c37a2830928405817cc5d56a97f64fab83cc3f628748b135749/lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909", size = 5086695, upload-time = "2026-05-18T19:19:34.764Z" }, + { url = "https://files.pythonhosted.org/packages/da/d6/24e3b5906abb0b674ff2ae195bc3ce59708df2bcd17cf17703b2d7dd643a/lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00", size = 5031642, upload-time = "2026-05-18T19:19:37.771Z" }, + { url = "https://files.pythonhosted.org/packages/2d/db/6ec54f99019838bff54785c51da07f189eb4676861c5f2730962b0d8d665/lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955", size = 5647338, upload-time = "2026-05-18T19:19:40.553Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/ef4dcfffd22d27a61805d8ed9f7fb888495bc6aa88648fa07c1eaa5586b6/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13", size = 5239528, upload-time = "2026-05-18T19:19:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/62/bb/37fb3f0dff146bdcfa78eec47879273820b2a0bf350ec236ce14bd0b1c26/lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7", size = 5350730, upload-time = "2026-05-18T19:19:46.307Z" }, + { url = "https://files.pythonhosted.org/packages/90/42/43253f168388df4fae1f38c01df36ddb9bee39e2048167b54cdcbae85ea3/lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245", size = 4697530, upload-time = "2026-05-18T19:19:49.889Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a8/c5a8504f81bbdfc8e7094c2c850cdb4ed6777fc4d5ddd9e5ab819f3b0d54/lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5", size = 5250670, upload-time = "2026-05-18T19:19:53.199Z" }, + { url = "https://files.pythonhosted.org/packages/77/b7/c7e76ab18744d75e21f320ebf9ff9d1ceae2b54dd431ea5a64caf26c9672/lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462", size = 5084485, upload-time = "2026-05-18T19:19:08.422Z" }, + { url = "https://files.pythonhosted.org/packages/31/31/b35c53f8ef7b7c31cacd23d3638652fff7bcd1deb6eedb709ab43b685908/lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465", size = 4737635, upload-time = "2026-05-18T19:19:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/d9/06/31f23c813a7fe8e0cb1b175e915b08c9bf4e86d225b210feadbdbe519667/lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a", size = 5670681, upload-time = "2026-05-18T19:19:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bc/ce619bccc89b1fd9ad8a8e1330ee3f3beff9f2ff95b712d7bbcdd6e22fc3/lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590", size = 5238229, upload-time = "2026-05-18T19:19:18.131Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5d/b329acbbedc0b619ebc2be6cf7ee9ed07e80892c88d4dfd612c33805789a/lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb", size = 5264191, upload-time = "2026-05-18T19:19:21.118Z" }, + { url = "https://files.pythonhosted.org/packages/16/02/6f7061f4f95f51e545d48e87647c54791d204a4e881be4156e7a26ba5338/lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef", size = 4970291, upload-time = "2026-05-18T19:19:56.215Z" }, + { url = "https://files.pythonhosted.org/packages/b0/02/55fc057d8283427dea7d6edb102e7a840239c77a64a983d92f62a304c0e9/lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a", size = 5102822, upload-time = "2026-05-18T19:19:59.223Z" }, + { url = "https://files.pythonhosted.org/packages/e4/48/8e1cf78d89d66850121d9255a2a24414c98f775da93b90cf976956c24b14/lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c", size = 5027923, upload-time = "2026-05-18T19:20:01.549Z" }, + { url = "https://files.pythonhosted.org/packages/ed/00/0632a0647612c8af24d26997b3b961397daa9d5b2581444805933629a4cb/lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525", size = 5595843, upload-time = "2026-05-18T19:20:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/bc/86/ab008a7dc360711b66858d61c80a5979a70a09f2aa2b05d9698df80b803d/lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca", size = 5224515, upload-time = "2026-05-18T19:20:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/75/c6/2702ff375e728e34f56d9a45339a9cf7e4427e917f542225242d63a05afa/lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e", size = 5312511, upload-time = "2026-05-18T19:20:09.308Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/a5807c98f87a86f10ef9ffab35516df7c0f0c4b6d5d33e9f608ab9c04a31/lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038", size = 4639206, upload-time = "2026-05-18T19:20:11.704Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e1/8a0a2c35734812395f4da4eaf33748a7e5705bfb2a58b128da764339d5ec/lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e", size = 5232404, upload-time = "2026-05-18T19:20:14.064Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e2/0e6a4dd5ad84d01d99aa7bae7cfefd4a760a0e0f8176818241de17d9b6c0/lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072", size = 5083769, upload-time = "2026-05-18T19:19:23.758Z" }, + { url = "https://files.pythonhosted.org/packages/a0/7e/161f33d463f6ffc1c7679104b65086dea120080d49dde4d238f015aaee2f/lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52", size = 4758936, upload-time = "2026-05-18T19:19:27.256Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fb/2369825e3f6ca99305bf9f7b7085fda91c8b0922a89e54d900974aa3ef85/lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b", size = 5620296, upload-time = "2026-05-18T19:19:29.993Z" }, + { url = "https://files.pythonhosted.org/packages/30/90/d61e383146f74c5ab683947ea14dc7b82778838ab9b95ea73a23b60d0191/lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2", size = 5228598, upload-time = "2026-05-18T19:19:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/76/2d/2dafd8149e94b05bb070690efd5bb2680720681e03ff03fc57d2b70a1105/lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e", size = 5247845, upload-time = "2026-05-18T19:19:36.649Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy", marker = "sys_platform == 'linux'" }, + { name = "cycler", marker = "sys_platform == 'linux'" }, + { name = "fonttools", marker = "sys_platform == 'linux'" }, + { name = "kiwisolver", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'linux'" }, + { name = "pyparsing", marker = "sys_platform == 'linux'" }, + { name = "python-dateutil", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/24/080c99d223d158d3a8902769269ab6da5b50f7a0e6e072513907e02b7a6c/matplotlib-3.11.0.tar.gz", hash = "sha256:68c0c7be01b30dcca3638934f7f591df73401235cbdbf0d1ab1c71e7db7f8b57", size = 33251176, upload-time = "2026-06-12T02:29:15.508Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/95/7f522393c88313336b20d70fc849555757b2e5febc22b83b3a3f0fd4bce9/matplotlib-3.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be5f93a1d21981bfb802ded0d77a0caa92d4342a47d45754fac77e314a506344", size = 10031353, upload-time = "2026-06-12T02:27:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/87/ce/8f25a0e3186aefd61913e7467d1b999465bcd0d0c03ac695c1b26ca559b7/matplotlib-3.11.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41635d7909d19e52e924a521dde6d8f670b0f53ab1d0e8c331fa831554f681d1", size = 10839232, upload-time = "2026-06-12T02:27:57.746Z" }, + { url = "https://files.pythonhosted.org/packages/85/c2/db15da2bbdf9e3ca66df7db8e2c33a1dfed67be24a24d2c878efaaff01d6/matplotlib-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94f5000f67ca9faa300863ea17f8bce9175cb67b88bec4bc7780502d53dd7c9e", size = 10923899, upload-time = "2026-06-12T02:28:00.223Z" }, + { url = "https://files.pythonhosted.org/packages/a4/c0/1117d53077e3ac3152503a84e9cf7a5c239576805ee71276e80c2aaa7471/matplotlib-3.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be152b7570324dc8d01574cc9474dd2d803237acf528bcbb5b211fa347461a09", size = 10031623, upload-time = "2026-06-12T02:28:11.26Z" }, + { url = "https://files.pythonhosted.org/packages/92/7e/e937138daffad65b71bf831a377809dcbc830fb4f31a31e067dc1faa2575/matplotlib-3.11.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:126f256df600652d7e4b394cf3164ff75210a00038f287c95a012a6f58d0e83f", size = 10839372, upload-time = "2026-06-12T02:28:14.102Z" }, + { url = "https://files.pythonhosted.org/packages/1d/c2/438ecc197ffb8023b6b9922915542f2172f5fd45b76703b0b4fc47322243/matplotlib-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:03acfeddf87b0dddb11b081ef7740ad445a3ca8bcb6b8e3011b08f2cf802b75c", size = 10924099, upload-time = "2026-06-12T02:28:16.383Z" }, + { url = "https://files.pythonhosted.org/packages/95/e4/b4b7c33151e74e5c802f3cde1ba807ebfc38401e329b44e215a5888dd76d/matplotlib-3.11.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:565af866fd63e4bd3f987d580afe27c44c2552a3b3305f4ecbb85133601ea6f3", size = 10045491, upload-time = "2026-06-12T02:28:27.141Z" }, + { url = "https://files.pythonhosted.org/packages/71/28/394548efd68354110c1a1be11fe6b6e559e06d1a23da35908a0e316c55a9/matplotlib-3.11.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e6b3e64dea5062c570f04358e2711859f3531b459f29516274fbad889079e4f3", size = 10857059, upload-time = "2026-06-12T02:28:29.222Z" }, + { url = "https://files.pythonhosted.org/packages/c8/44/e7922e6e2a4d63bdfbc9dc4a53e3850ab438d46cf42e6779bb15ec92c948/matplotlib-3.11.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:942b37c5db1899610bd1543ce8e13e4ecff9a4633e7f63bb6aa9205d2644ebd1", size = 10939576, upload-time = "2026-06-12T02:28:31.66Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2d/4e1240ea82ee197dfb3851e71f71c87eeeb975f1753b56a0588e4e80739a/matplotlib-3.11.0-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9695457a467ff86d23f35037a43deb6f1134dd6d3e2ac8ce1e2087cff09ffb9", size = 10843005, upload-time = "2026-06-12T02:28:42.39Z" }, + { url = "https://files.pythonhosted.org/packages/29/dc/6377ecfaa5fef79430f74a1a16638b4e2aa30d4692bae2c19f9d76fe3b01/matplotlib-3.11.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19c16c61dea63b3582918503e6b294193961261d9daa806d4ae2151f1ad05430", size = 11127459, upload-time = "2026-06-12T02:28:44.483Z" }, + { url = "https://files.pythonhosted.org/packages/6f/41/795c405aa7560443a3b01309424cde4a1113b85c90b8a63417444a749617/matplotlib-3.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2d72ea8b7924f3cb955e61518d21e43b3df1e6c8a793b480a0c1214f185d30ba", size = 10925160, upload-time = "2026-06-12T02:28:46.564Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cb/22f6bc35711a0b5639a784e74e653e77c86210bd4304449dd399a482f74e/matplotlib-3.11.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfabef0230d0697aa0d717385194dd41162e00207a68bf4abf94c2bf4c27dca0", size = 10854181, upload-time = "2026-06-12T02:28:57.856Z" }, + { url = "https://files.pythonhosted.org/packages/3f/7e/9a9eaca731a2939589da520f0ebe8fd8753d0f51fca98c7d20af6dbe261a/matplotlib-3.11.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1644db30e759199443493ac5e5caec24fdb775a8f6123021f85ba47c4133c3cb", size = 11137715, upload-time = "2026-06-12T02:29:00.555Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f9/9b030b6088354acb0296871bb624b25befc1c42509d3c6cd17420c83a5b8/matplotlib-3.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15b0d160079cb10699a0e98b5989c70677b2df7cacdc62af67c30f2facec46d9", size = 10939427, upload-time = "2026-06-12T02:29:02.527Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz", hash = "sha256:a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0", size = 56114, upload-time = "2026-05-13T09:03:38.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl", hash = "sha256:214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d", size = 66663, upload-time = "2026-05-13T09:03:37.76Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mistune" +version = "3.3.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/a5/2dab368d6950e6808904dec98f54c7e726ee7be4a0c6afe00e6e011bd52d/mistune-3.3.3.tar.gz", hash = "sha256:c4c6c0c840b8637a2e9b8b6d607eb7c8f00888bf14c754409bcd339e848c2477", size = 115363, upload-time = "2026-07-09T06:18:05.268Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/70/b1e4737b84163db5bb1dfde6f216dbfbf32783330a9989c965e121172830/mistune-3.3.3-py3-none-any.whl", hash = "sha256:99de1585e42dcbd826faa9e11a202727a5e202e4e4722a4c69ac1ff615793dd7", size = 63569, upload-time = "2026-07-09T06:18:03.839Z" }, +] + +[[package]] +name = "more-itertools" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, +] + +[[package]] +name = "mpi4py" +version = "4.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/75/83/231445bbcf7ef10864746c244ff2d82000011449b79275642c5d4ed8c8f4/mpi4py-4.1.2.tar.gz", hash = "sha256:56860286dc45f20e8821e93cb06669e30462348bf866f685553fa4b712d58d02", size = 501709, upload-time = "2026-05-16T10:35:23.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/0a/1da7f403e0d8ce0e26d541f7538302cec00cf5b0a98a7a52b929f938a25c/mpi4py-4.1.2-cp310-abi3-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2ef63b2e3083e6062fd90e4de8c4e3acbf81e0772406e0226eb8dde6a48cab8e", size = 1327130, upload-time = "2026-05-16T10:34:00.269Z" }, + { url = "https://files.pythonhosted.org/packages/e6/f9/65999152ae82bad914c6a083821ee774afefd6d0544e633b940c9a9ebf3f/mpi4py-4.1.2-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6508e654b9c8ff9f611b19548b2a17d1e323b520a15168189f92221e6757b8ff", size = 1182268, upload-time = "2026-05-16T10:34:02.206Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2b/1e48c4c5f9acbdca8dd28beeba9123dde140cd2ca520f8e3a3cf22faeeaa/mpi4py-4.1.2-cp312-cp312-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:00f4cce8999d19f35243c3442ea22debbe3336f69c309cd5d3176df4e51c717a", size = 1358844, upload-time = "2026-05-16T10:34:28.247Z" }, + { url = "https://files.pythonhosted.org/packages/94/46/a37225d47997fcf30adca25d3849d035bbb61d972118b024db900306e528/mpi4py-4.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0a58e164776acb7b52414548b1bf0e5caafce0ee90345deff147873a64b6b2cc", size = 1227206, upload-time = "2026-05-16T10:34:29.866Z" }, + { url = "https://files.pythonhosted.org/packages/0d/5e/493415cdb0da0c1c0b6ec9a1fb65ab57a174e8111b25c87f7507f663d0b4/mpi4py-4.1.2-cp313-cp313-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:085e0cb05427398fe2281856f27a87984b9f234cd6d98a2a384a6fbfe679a56f", size = 1358571, upload-time = "2026-05-16T10:34:37.478Z" }, + { url = "https://files.pythonhosted.org/packages/6f/51/3822e834fc9cafd96811501b85232e02bd9b31596d42965536a269a6c112/mpi4py-4.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:429437883b4511583d56a57bc58ad0d02965fb6c19f84f39e30c0646e6c0cab9", size = 1226562, upload-time = "2026-05-16T10:34:39.652Z" }, + { url = "https://files.pythonhosted.org/packages/ec/5e/d358fadb8672d58abd6dce16c95eda56f497b378dec5642a31cd6ededfc4/mpi4py-4.1.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:85e332feaac3323d8ed1c71f17478fe3f529468f28f6f9bb4c9133ad2d3a3a6d", size = 1419007, upload-time = "2026-05-16T10:34:45.47Z" }, + { url = "https://files.pythonhosted.org/packages/27/eb/5cd53880337009cab9a9d17a007ad5aec731f3a55e211bdcc99dbb98a0e3/mpi4py-4.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e05dba75f6ad17ae761bdc01ee5c5271d15cd296e8a508e22c99c91b540dc99", size = 1298482, upload-time = "2026-05-16T10:34:46.858Z" }, + { url = "https://files.pythonhosted.org/packages/26/e4/32575e9b0d5380b08ffa04958c7a13b1bab86e3674f33b6de3827fbbe14c/mpi4py-4.1.2-cp314-cp314-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d53e8f7182bf125b37155f679b301a21cd64e5ae6861ca0ab989c9d2b2073bbd", size = 1368388, upload-time = "2026-05-16T10:34:53.665Z" }, + { url = "https://files.pythonhosted.org/packages/87/a8/ad5e925da9de402704ecfe8715348b068fb0b65059109c65dafb111f95e4/mpi4py-4.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cbf982d3425fd06890fbcff79ba19a7435e93bc74e5711ca8ac0b64d0c3ece9", size = 1238211, upload-time = "2026-05-16T10:34:55.094Z" }, + { url = "https://files.pythonhosted.org/packages/39/29/45a41d081342896af52d38a848017728bf6834c4c92814c50aa791dc750b/mpi4py-4.1.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db189238c37be98933eeb078a3e2b827eef969837e8fe0f3a2e6cdb7f4b1b05f", size = 1423092, upload-time = "2026-05-16T10:35:01.672Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6f/c2127d426d87f2f7cdb4beacbb4febe7b0c93047a3c615d0e56cecb42563/mpi4py-4.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d0fbf0bc100ed966c3d7f44231a19aef0025d523d1b813de468a1b114d0d9436", size = 1303134, upload-time = "2026-05-16T10:35:03.122Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msgpack" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/e3/10/ddf7b06db879e8792d13934ddda09ff20bd2a583fd84c9b59aae9b0e650b/msgpack-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f310233ef7fb9c14e201c93639fe5f5260b005f56f0b29048e999c30935596cc", size = 407518, upload-time = "2026-06-18T16:13:14.233Z" }, + { url = "https://files.pythonhosted.org/packages/79/d3/36a46a8ed992b781acbc05928bd5bee3c810cb0c3563bf81a7b0c04a1a76/msgpack-1.2.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:787c9bebb5833e8f6fc8abca3c0597683d8d87f56a8842b6b89c75a5f3176e2d", size = 416405, upload-time = "2026-06-18T16:13:15.435Z" }, + { url = "https://files.pythonhosted.org/packages/f9/84/e8e9598b557c0ba6ddae901a73780a4c75ac667dddf59414b1e56a42fb34/msgpack-1.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dc871b997a9370d855b7394465f2f350e847a5b806dd38dcc9c989e7d87da155", size = 376257, upload-time = "2026-06-18T16:13:17.022Z" }, + { url = "https://files.pythonhosted.org/packages/40/16/738fe6d875ad7e2a9429c165322a4ec088f4f273cdfae63d96a89c467961/msgpack-1.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:85f57e960d877f2977f6430896191b04a21f8901b3b4baf2e4604329f4db5402", size = 397469, upload-time = "2026-06-18T16:13:18.287Z" }, + { url = "https://files.pythonhosted.org/packages/ca/be/6d5952df75a7f24f35833af764c3a6860780364cb3a0030beb8099e1b2b4/msgpack-1.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1233ee2dd0cefba127583de50ea654677277047d238303521db35def3d7b2e7c", size = 372802, upload-time = "2026-06-18T16:13:19.685Z" }, + { url = "https://files.pythonhosted.org/packages/e1/39/e2ef7dbf0473bcb8dc7c50bf782a892d67414877b63e47fc88eb189ef5e6/msgpack-1.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e3dc2feb0876209d9c38aa56cb1de169bd6c4348f1aa48271f241226590993e6", size = 411273, upload-time = "2026-06-18T16:13:21.028Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/99e58722feaffc5f2fbcc0c8c0d1451ab9f84097f7af87291b46af2390f4/msgpack-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca0dacff965c47afdc3749a8469d7302a8f801d6a28758d55120d75e66ce6889", size = 406090, upload-time = "2026-06-18T16:13:28.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/03/8c63e8cf52958534ef688625965ab04c269a6cadd8caef16758b380a821a/msgpack-1.2.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e2bf9280bceb5efca998435904b5d3e9fdbcc11d90dc9df30aec7973252b720", size = 412106, upload-time = "2026-06-18T16:13:29.427Z" }, + { url = "https://files.pythonhosted.org/packages/63/d2/155d9e71b40e41fd934bc0c48b9b2770f22263e1ac20aad8e29fdca7be3f/msgpack-1.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6c4be5d1c02a42b066ca6ddb71adf36432868fdcdb6ee87e634e86e0674190", size = 374851, upload-time = "2026-06-18T16:13:30.631Z" }, + { url = "https://files.pythonhosted.org/packages/98/48/deaf2326262a8d5ea3295ce9649912ecd3f551ba7ec8e33c665d2ba583f3/msgpack-1.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec0e675d59150a6269ddc9139087c722292664a37d071a849c05c473350f1f2d", size = 396168, upload-time = "2026-06-18T16:13:31.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/2a/b4410f906c2ec0008f1608d3ab5143afc3ad3f4e6da0fed3ea2231d0bef4/msgpack-1.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:dd3bfe82d53edfe4b7fc9a7ec9761e23a7a5b1dac22264505af428253c29ed24", size = 371959, upload-time = "2026-06-18T16:13:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/59/86/1edc67270099a528fa2093ea60fe191233cd238e4bd30cfacf7db79fc959/msgpack-1.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ad5467fc3f68b5468e06c5f788d712e9f8ffc8b0cd1bcb160c105c1ee92dae7", size = 408457, upload-time = "2026-06-18T16:13:34.567Z" }, + { url = "https://files.pythonhosted.org/packages/a9/b4/b774d7eb95561739907fec675582f83203cf41c597a418c2589b4bfb8e9d/msgpack-1.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20466cca18c49c7292a8984bc15d65857b171e7264bdcb5f96baf8be238791fc", size = 427661, upload-time = "2026-06-18T16:13:41.574Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f9/3243191dc9937e00756c8bc1b0272fed8f23758e43df2a3b46f533e5090f/msgpack-1.2.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:196300e7e5d6e74d50f1607ab9c06c4a1484c383cd22defd727902591f7e8dde", size = 426375, upload-time = "2026-06-18T16:13:42.936Z" }, + { url = "https://files.pythonhosted.org/packages/23/c7/1693111db9944ba4ad4b67a1e788400d78a0b6af7a6523dc7e4e58f8274b/msgpack-1.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575957e79cd51903a4e8495a242442949641e08f1efd5197b43bebd3ea7682b4", size = 380495, upload-time = "2026-06-18T16:13:44.306Z" }, + { url = "https://files.pythonhosted.org/packages/3e/2b/92f86956a0c13e8662f7e2ad630c4eb4db07497b967589bd5245e018b2c1/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8c2ed1e48cc0f460bf3c7780e7137ff21a4e18433451916f2442c1b21036cd7d", size = 410897, upload-time = "2026-06-18T16:13:45.629Z" }, + { url = "https://files.pythonhosted.org/packages/da/ea/1479f72d200313a76fc2f823a79d1e07ed052ab7b8a0280640aa7b95de42/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5f6277e5f783c36786a145e0247fc189a03f35f84b251646e53592d2bc12b355", size = 378519, upload-time = "2026-06-18T16:13:46.998Z" }, + { url = "https://files.pythonhosted.org/packages/f5/4d/fa006060ffa1011d32bfae826fe766fe73e02982183601633b7121058ab3/msgpack-1.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f9389552ecf4784886345ead0647e4edc96bee37cbab05b75540f542f766c48c", size = 419815, upload-time = "2026-06-18T16:13:48.205Z" }, +] + +[[package]] +name = "myst-parser" +version = "5.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "markdown-it-py", marker = "sys_platform == 'linux'" }, + { name = "mdit-py-plugins", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "sphinx", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/21/dc/603751677fff302f34396e206b610f556a59d7fe58b9a2145f54e96b48e8/myst_parser-5.1.0.tar.gz", hash = "sha256:ab69322dc6719dcc7f296479dbb70181b66df6ed315064f92dbc85c0e1bf2f02", size = 101182, upload-time = "2026-05-13T09:38:19.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/dc/f3dfb7488b770f3f67e6545085bf2abea5172e88f57b8ad25ef860ca704c/myst_parser-5.1.0-py3-none-any.whl", hash = "sha256:9c91c52b3cdb4d94a6506e4fab4e2f296c7623a0da0dcbe6de1565c3dad67a8a", size = 85817, upload-time = "2026-05-13T09:38:17.904Z" }, +] + +[[package]] +name = "nbclient" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client", marker = "sys_platform == 'linux'" }, + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "nbformat", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/a5/b3bae4b590c0cbcada2c63a34f7580024e834a8ba213e949a2f906705787/nbclient-0.11.0.tar.gz", hash = "sha256:04a134a5b087f2c5887f228aca155db50169b8cd9334dee6942c8e927e56081a", size = 62535, upload-time = "2026-06-05T07:52:41.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/c9/94d73e5a01c5b926c3fa2496e97d7a8dc28ed5a77c0b2ed712f1a62e6694/nbclient-0.11.0-py3-none-any.whl", hash = "sha256:ef7fa0d59d6e1d41103933d8a445a18d5de860ca6b613b87b8574accdb3c2895", size = 25288, upload-time = "2026-06-05T07:52:40.115Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4", marker = "sys_platform == 'linux'" }, + { name = "bleach", extra = ["css"], marker = "sys_platform == 'linux'" }, + { name = "defusedxml", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "jupyterlab-pygments", marker = "sys_platform == 'linux'" }, + { name = "markupsafe", marker = "sys_platform == 'linux'" }, + { name = "mistune", marker = "sys_platform == 'linux'" }, + { name = "nbclient", marker = "sys_platform == 'linux'" }, + { name = "nbformat", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pandocfilters", marker = "sys_platform == 'linux'" }, + { name = "pygments", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema", marker = "sys_platform == 'linux'" }, + { name = "jsonschema", marker = "sys_platform == 'linux'" }, + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "ndindex" +version = "1.10.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/92/4b9d2f4e0f3eabcfc7b02b48261f6e5ad36a3e2c1bbdcc4e3b7b6c768fa6/ndindex-1.10.1.tar.gz", hash = "sha256:0f6113c1f031248f8818cbee1aa92aa3c9472b7701debcce9fddebcd2f610f11", size = 271395, upload-time = "2025-11-19T20:40:08.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/40/139b6b050ba2b2a0bb40e0381a352b1eb6551302dcb8f86fb4c97dd34e92/ndindex-1.10.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:046c1e88d46b2bd2fd3483e06d27b4e85132b55bc693f2fca2db0bb56eea1e78", size = 542901, upload-time = "2025-11-19T20:38:44.43Z" }, + { url = "https://files.pythonhosted.org/packages/27/ae/defd665dbbeb2fffa077491365ed160acaec49274ce8d4b979f55db71f18/ndindex-1.10.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03cf1e6cdac876bd8fc92d3b65bb223496b1581d10eab3ba113f7c195121a959", size = 546875, upload-time = "2025-11-19T20:38:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/59/43/6d54d48e8eaee25cdab70d3e4c4f579ddb0255e4f1660040d5ad55e029c6/ndindex-1.10.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:752e78a5e87911ded117c57a7246596f26c9c6da066de3c2b533b3db694949bb", size = 1510036, upload-time = "2025-11-19T20:38:47.444Z" }, + { url = "https://files.pythonhosted.org/packages/09/61/e28ba3b98eacd18193176526526b34d7d70d2a6f9fd2b4d8309ab5692678/ndindex-1.10.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9dd58d91220b1c1fe516324bfcf4114566c98e84b1cbbe416abe345c75bd557", size = 1571849, upload-time = "2025-11-19T20:38:48.951Z" }, + { url = "https://files.pythonhosted.org/packages/77/34/a51b7c6f7159718a6a0a694fc1058b94d793c416d9a4fd649f1924cce5f8/ndindex-1.10.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6928e47fb008903f2e41309b7ff1e59b16abbcd59e2e945454571c28b2433c9e", size = 524127, upload-time = "2025-11-19T20:38:59.412Z" }, + { url = "https://files.pythonhosted.org/packages/21/91/d8f19f0b8fc9c5585b50fda44c05415da0bdc5fa9c9c69011015dac27880/ndindex-1.10.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e69a2cb1ac7be955c3c77f1def83f410775a81525c9ce2d4c0a3f2a61589ed47", size = 528213, upload-time = "2025-11-19T20:39:00.882Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a9/77d9d037e871a3faa8579b354ca2dd09cc5bbf3e085d9e3c67f786d55ee3/ndindex-1.10.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cb76e0f3f235d8b1c768b17e771de48775d281713795c3aa045e8114ad61bdda", size = 1492172, upload-time = "2025-11-19T20:39:02.387Z" }, + { url = "https://files.pythonhosted.org/packages/ac/29/ad13676fc9312e0aa1a80a7c04bcb0b502b877ed4956136117ad663eced0/ndindex-1.10.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7da34a78410c14341d5fff73be5ce924bd36500bf7f640fc59b8607d3a0df95e", size = 1552614, upload-time = "2025-11-19T20:39:04.232Z" }, + { url = "https://files.pythonhosted.org/packages/e2/d7/1df02df24880ce3f3c8137b6f3ca5a901a58d9079dcfd8c818419277ff87/ndindex-1.10.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d0ebdba2fade3f6916fe21fd49e2a0935af4f58c56100a60f3f2eb26e20baee7", size = 632517, upload-time = "2025-11-19T20:39:13.259Z" }, + { url = "https://files.pythonhosted.org/packages/34/96/b509c2b14e9b10710fe6ab6ba8bda1ee6ce36ab16397ff2f5bbb33bbbba3/ndindex-1.10.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:346a4bf09f5771548665c8206e81daadb6b9925d409746e709894bdd98adc701", size = 616179, upload-time = "2025-11-19T20:39:14.757Z" }, + { url = "https://files.pythonhosted.org/packages/38/e3/f89d60cf351c33a484bf1a4546a5dee6f4e7a6a973613ffa12bd316b14ad/ndindex-1.10.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:23d35696f802548143b5cc199bf2f171efb0061aa7934959251dd3bae56d038c", size = 1588373, upload-time = "2025-11-19T20:39:16.62Z" }, + { url = "https://files.pythonhosted.org/packages/ee/19/002fc1e6a4abeef8d92e9aa2e43aea4d462f6b170090f7752ea8887f4897/ndindex-1.10.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a91e1a0398120233d5c3b23ccb2d4b78e970d66136f1a7221fa9a53873c3d5c5", size = 1636436, upload-time = "2025-11-19T20:39:18.266Z" }, + { url = "https://files.pythonhosted.org/packages/09/4a/028ab78a9f29fd2a7e86a90337cde4658eaa77b425c63045d83a1d2e4f26/ndindex-1.10.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf80241b40adffdc3276b2c9fb63a96c6c98b4a9d941892738de8add65083962", size = 528125, upload-time = "2025-11-19T20:39:26.798Z" }, + { url = "https://files.pythonhosted.org/packages/00/a9/bd823b345fb06c83ade6ef1c1933521d4357cd04490e684d4fa30126926c/ndindex-1.10.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf5855881884b8467dfcf45764ccf2e4279075be14b155b89c96994bb08d2e6f", size = 527328, upload-time = "2025-11-19T20:39:28.292Z" }, + { url = "https://files.pythonhosted.org/packages/91/4f/40b9c15588cbf9dde43c4fb88a31dd1f636a913fa29649f18f8e3ebca36a/ndindex-1.10.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e81a9bd36fe054b6c9fcc53d26bc9a28cf15d1ab52a0f5b854f894116f3a54e1", size = 1497508, upload-time = "2025-11-19T20:39:30.735Z" }, + { url = "https://files.pythonhosted.org/packages/24/8f/b8048f7837d2e9dff0af507b398307fa84a2aa9ea3db71b4aa800b21da4a/ndindex-1.10.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:588e8875d836a93b3cd9af482c8074bb02288ae1aff92cf277e1f02d9ae0f992", size = 1552625, upload-time = "2025-11-19T20:39:32.404Z" }, + { url = "https://files.pythonhosted.org/packages/4d/05/a6fda696a2f02a3f8dd2ee9d816cb2edff6423bf0110a4876cc3b1259732/ndindex-1.10.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c65ca639a7abf72d79f22424f4abd18dece1f289a2b7b028a0ca455edd2168d4", size = 630898, upload-time = "2025-11-19T20:39:41.495Z" }, + { url = "https://files.pythonhosted.org/packages/73/78/eb2e5d067d4c054451e33eaece74cbdcb58236dc60516e73d783dae34c7e/ndindex-1.10.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c3634a8df43e7928122225a3d64d850c8957bd1edf2e403907deacb478af27b", size = 614419, upload-time = "2025-11-19T20:39:43.254Z" }, + { url = "https://files.pythonhosted.org/packages/78/51/261bfb49eb7920c2a7314cacba5821930a529911dce48c7c6cd786096a5a/ndindex-1.10.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9d581f931e61f182478f18bdf5edd3955899df5da4892ed0d5de547a4cfd5b6f", size = 1587517, upload-time = "2025-11-19T20:39:44.809Z" }, + { url = "https://files.pythonhosted.org/packages/ec/37/084a332ecdf8b0049151bd78001a7baf2daf7f500d043beb8a1f95d0f4e3/ndindex-1.10.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:78ce45106ebf67aeba99714818c721d8fd5fb9534daebd2565665a2d64b50fc9", size = 1635372, upload-time = "2025-11-19T20:39:47.231Z" }, +] + +[[package]] +name = "nest-asyncio2" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b4/73/731debf26e27e0a0323d7bda270dc2f634b398e38f040a09da1f4351d0aa/nest_asyncio2-1.7.2.tar.gz", hash = "sha256:1921d70b92cc4612c374928d081552efb59b83d91b2b789d935c665fa01729a8", size = 14743, upload-time = "2026-02-13T00:34:04.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/3c/3179b85b0e1c3659f0369940200cd6d0fa900e6cefcc7ea0bc6dd0e29ffb/nest_asyncio2-1.7.2-py3-none-any.whl", hash = "sha256:f5dfa702f3f81f6a03857e9a19e2ba578c0946a4ad417b4c50a24d7ba641fe01", size = 7843, upload-time = "2026-02-13T00:34:02.691Z" }, +] + +[[package]] +name = "notebook" +version = "5.7.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel", marker = "sys_platform == 'linux'" }, + { name = "ipython-genutils", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "jupyter-client", marker = "sys_platform == 'linux'" }, + { name = "jupyter-core", marker = "sys_platform == 'linux'" }, + { name = "nbconvert", marker = "sys_platform == 'linux'" }, + { name = "nbformat", marker = "sys_platform == 'linux'" }, + { name = "prometheus-client", marker = "sys_platform == 'linux'" }, + { name = "pyzmq", marker = "sys_platform == 'linux'" }, + { name = "send2trash", marker = "sys_platform == 'linux'" }, + { name = "terminado", marker = "sys_platform == 'linux'" }, + { name = "tornado", marker = "sys_platform == 'linux'" }, + { name = "traitlets", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6e/22/b5dcce67559d63d0f22e46d806305710808c698a1b91c07eb09e389785e0/notebook-5.7.4.tar.gz", hash = "sha256:d908673a4010787625c8952e91a22adf737db031f2aa0793ad92f6558918a74a", size = 13389469, upload-time = "2018-12-17T10:06:00.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/a6/dbdf0954d073ab2cf5421cad20334d1e4c780da37205c04522c045298f67/notebook-5.7.4-py2.py3-none-any.whl", hash = "sha256:3ab2db8bc10e6edbd264c3c4b800bee276c99818386ee0c146d98d7e6bcf0a67", size = 8980706, upload-time = "2018-12-17T10:05:52.01Z" }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167, upload-time = "2024-02-14T23:35:18.353Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307, upload-time = "2024-02-14T23:35:16.286Z" }, +] + +[[package]] +name = "numba" +version = "0.66.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "llvmlite", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/a0/570e3dc53e5602b49108f62a13e529f1eec8bfc7ef37d49c825924dcf546/numba-0.66.0.tar.gz", hash = "sha256:b900e63a0e26c05ea9a6d5a3a5a0a177cb64c5011887bf43edb8c3ed2c38d363", size = 2806181, upload-time = "2026-07-01T23:12:46.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/55/25c319845e9a4e08f16611ddbda56a192eb7b6ed13e1a2bff2da272ffb97/numba-0.66.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0999e3ee1b18c48e1fb51d11af35ef59852c7f4f50569c9550c25faef0616ad1", size = 3866252, upload-time = "2026-07-01T23:12:20.429Z" }, + { url = "https://files.pythonhosted.org/packages/71/ef/a82d6fd6bf1b0fe461651e924d3647eeec9ac17f8eee4896264bf7480930/numba-0.66.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:efe0d2d5099790df945e0cb6e1b3104bd965d7bbfac50d62f1d5d1d6ade0825d", size = 3566974, upload-time = "2026-07-01T23:12:22.116Z" }, + { url = "https://files.pythonhosted.org/packages/44/b5/e930010965568fe7f2c6c962fd2849d458cb9f62c3ab7584af8a19a2b40a/numba-0.66.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:939316d5d8619751207b8972a67852b5a7646665298cb4de693cd6bf135152f4", size = 3873663, upload-time = "2026-07-01T23:12:27.308Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ec/5b51457cbe96e4831141d83e892e65191b23a1b78728456c62909d231ace/numba-0.66.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cdf506775d9f02eb92a87bf5c5b1e0d25506fd18cafd769f4ed914a8feac73e7", size = 3573529, upload-time = "2026-07-01T23:12:28.944Z" }, + { url = "https://files.pythonhosted.org/packages/0f/26/885774c006de6620ed3d10f45d8e20fe0b8e6aad6d573211a2cbc8b3e528/numba-0.66.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e2b101f23b8b63978d334574d2039f27f0dccfe1d891756f33a2e2f3e4c88cf4", size = 3842720, upload-time = "2026-07-01T23:12:33.938Z" }, + { url = "https://files.pythonhosted.org/packages/93/99/edebf7de890b73973d839dd971cf73734adfb81ffa1b4504f84b9059c3e5/numba-0.66.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63b943eb2c9ba371908ce2cd6dfc643db51fc40f7966993376a1701bc922f537", size = 3543537, upload-time = "2026-07-01T23:12:35.566Z" }, + { url = "https://files.pythonhosted.org/packages/39/fd/e9c9680a3813f3d781c20e5d53c1074801b787d4feecca0472fdd7c05ce1/numba-0.66.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:651a2b53298340956db26ecbe7ab043106b50a40c2807e66d617a4917245a4ab", size = 3878695, upload-time = "2026-07-01T23:12:40.302Z" }, + { url = "https://files.pythonhosted.org/packages/61/3a/9b363287b85fcd4537ea3878793822878b2ac1008a78159d2096fea628de/numba-0.66.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c1144ba1720ea59ad79f4f488ed54d149b2613b357f7e445678b7d0739c70e9", size = 3596323, upload-time = "2026-07-01T23:12:42.805Z" }, +] + +[[package]] +name = "numbaquadpack" +version = "0.1" +source = { git = "https://github.com/Nicholaswogan/NumbaQuadpack.git#9fa67a4a952860042177a3dba61e7102799671b3" } + +[[package]] +name = "numcodecs" +version = "0.16.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/bd/8a391e7c356366224734efd24da929cc4796fff468bfb179fe1af6548535/numcodecs-0.16.5.tar.gz", hash = "sha256:0d0fb60852f84c0bd9543cc4d2ab9eefd37fc8efcc410acd4777e62a1d300318", size = 6276387, upload-time = "2025-11-21T02:49:48.986Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/1e/98aaddf272552d9fef1f0296a9939d1487914a239e98678f6b20f8b0a5c8/numcodecs-0.16.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b554ab9ecf69de7ca2b6b5e8bc696bd9747559cb4dd5127bd08d7a28bec59c3a", size = 8534814, upload-time = "2025-11-21T02:49:28.547Z" }, + { url = "https://files.pythonhosted.org/packages/fb/53/78c98ef5c8b2b784453487f3e4d6c017b20747c58b470393e230c78d18e8/numcodecs-0.16.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad1a379a45bd3491deab8ae6548313946744f868c21d5340116977ea3be5b1d6", size = 9173471, upload-time = "2025-11-21T02:49:30.444Z" }, + { url = "https://files.pythonhosted.org/packages/0b/00/787ea5f237b8ea7bc67140c99155f9c00b5baf11c49afc5f3bfefa298f95/numcodecs-0.16.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:015a7c859ecc2a06e2a548f64008c0ec3aaecabc26456c2c62f4278d8fc20597", size = 8483064, upload-time = "2025-11-21T02:49:36.454Z" }, + { url = "https://files.pythonhosted.org/packages/c4/e6/d359fdd37498e74d26a167f7a51e54542e642ea47181eb4e643a69a066c3/numcodecs-0.16.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84230b4b9dad2392f2a84242bd6e3e659ac137b5a1ce3571d6965fca673e0903", size = 9126063, upload-time = "2025-11-21T02:49:38.018Z" }, + { url = "https://files.pythonhosted.org/packages/4e/15/e2e1151b5a8b14a15dfd4bb4abccce7fff7580f39bc34092780088835f3a/numcodecs-0.16.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49f7b7d24f103187f53135bed28bb9f0ed6b2e14c604664726487bb6d7c882e1", size = 8476987, upload-time = "2025-11-21T02:49:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/6d/30/16a57fc4d9fb0ba06c600408bd6634f2f1753c54a7a351c99c5e09b51ee2/numcodecs-0.16.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aec9736d81b70f337d89c4070ee3ffeff113f386fd789492fa152d26a15043e4", size = 9102377, upload-time = "2025-11-21T02:49:45.508Z" }, +] + +[[package]] +name = "numexpr" +version = "2.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/2f/fdba158c9dbe5caca9c3eca3eaffffb251f2fb8674bf8e2d0aed5f38d319/numexpr-2.14.1.tar.gz", hash = "sha256:4be00b1086c7b7a5c32e31558122b7b80243fe098579b170967da83f3152b48b", size = 119400, upload-time = "2025-10-13T16:17:27.351Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/94/cc921e35593b820521e464cbbeaf8212bbdb07f16dc79fe283168df38195/numexpr-2.14.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d686dfb2c1382d9e6e0ee0b7647f943c1886dba3adbf606c625479f35f1956c1", size = 452468, upload-time = "2025-10-13T16:13:29.531Z" }, + { url = "https://files.pythonhosted.org/packages/d9/43/560e9ba23c02c904b5934496486d061bcb14cd3ebba2e3cf0e2dccb6c22b/numexpr-2.14.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee6d4fbbbc368e6cdd0772734d6249128d957b3b8ad47a100789009f4de7083", size = 443631, upload-time = "2025-10-13T16:15:02.473Z" }, + { url = "https://files.pythonhosted.org/packages/7b/6c/78f83b6219f61c2c22d71ab6e6c2d4e5d7381334c6c29b77204e59edb039/numexpr-2.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3a2839efa25f3c8d4133252ea7342d8f81226c7c4dda81f97a57e090b9d87a48", size = 1417670, upload-time = "2025-10-13T16:13:33.464Z" }, + { url = "https://files.pythonhosted.org/packages/0e/bb/1ccc9dcaf46281568ce769888bf16294c40e98a5158e4b16c241de31d0d3/numexpr-2.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9f9137f1351b310436662b5dc6f4082a245efa8950c3b0d9008028df92fefb9b", size = 1466212, upload-time = "2025-10-13T16:15:12.828Z" }, + { url = "https://files.pythonhosted.org/packages/13/65/72b065f9c75baf8f474fd5d2b768350935989d4917db1c6c75b866d4067c/numexpr-2.14.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:06855053de7a3a8425429bd996e8ae3c50b57637ad3e757e0fa0602a7874be30", size = 455860, upload-time = "2025-10-13T16:13:35.811Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f9/c9457652dfe28e2eb898372da2fe786c6db81af9540c0f853ee04a0699cc/numexpr-2.14.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f9366d23a2e991fd5a8b5e61a17558f028ba86158a4552f8f239b005cdf83c", size = 446574, upload-time = "2025-10-13T16:15:17.367Z" }, + { url = "https://files.pythonhosted.org/packages/b6/99/8d3879c4d67d3db5560cf2de65ce1778b80b75f6fa415eb5c3e7bd37ba27/numexpr-2.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c5f1b1605695778896534dfc6e130d54a65cd52be7ed2cd0cfee3981fd676bf5", size = 1417306, upload-time = "2025-10-13T16:13:42.813Z" }, + { url = "https://files.pythonhosted.org/packages/ea/05/6bddac9f18598ba94281e27a6943093f7d0976544b0cb5d92272c64719bd/numexpr-2.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a4ba71db47ea99c659d88ee6233fa77b6dc83392f1d324e0c90ddf617ae3f421", size = 1466145, upload-time = "2025-10-13T16:15:27.464Z" }, + { url = "https://files.pythonhosted.org/packages/84/78/3c8335f713d4aeb99fa758d7c62f0be1482d4947ce5b508e2052bb7aeee9/numexpr-2.14.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33265294376e7e2ae4d264d75b798a915d2acf37b9dd2b9405e8b04f84d05cfc", size = 465972, upload-time = "2025-10-13T16:13:45.061Z" }, + { url = "https://files.pythonhosted.org/packages/35/81/9ee5f69b811e8f18746c12d6f71848617684edd3161927f95eee7a305631/numexpr-2.14.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83647d846d3eeeb9a9255311236135286728b398d0d41d35dedb532dca807fe9", size = 456953, upload-time = "2025-10-13T16:15:31.186Z" }, + { url = "https://files.pythonhosted.org/packages/6d/39/9b8bc6e294d85cbb54a634e47b833e9f3276a8bdf7ce92aa808718a0212d/numexpr-2.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6e575fd3ad41ddf3355d0c7ef6bd0168619dc1779a98fe46693cad5e95d25e6e", size = 1426199, upload-time = "2025-10-13T16:13:48.231Z" }, + { url = "https://files.pythonhosted.org/packages/1e/ce/0d4fcd31ab49319740d934fba1734d7dad13aa485532ca754e555ca16c8b/numexpr-2.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:67ea4771029ce818573b1998f5ca416bd255156feea017841b86176a938f7d19", size = 1474214, upload-time = "2025-10-13T16:15:38.893Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ed/aabd8678077848dd9a751c5558c2057839f5a09e2a176d8dfcd0850ee00e/numexpr-2.14.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5aedf38d4c0c19d3cecfe0334c3f4099fb496f54c146223d30fa930084bc8574", size = 455918, upload-time = "2025-10-13T16:13:50.338Z" }, + { url = "https://files.pythonhosted.org/packages/88/e1/3db65117f02cdefb0e5e4c440daf1c30beb45051b7f47aded25b7f4f2f34/numexpr-2.14.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439ec4d57b853792ebe5456e3160312281c3a7071ecac5532ded3278ede614de", size = 446512, upload-time = "2025-10-13T16:15:42.313Z" }, + { url = "https://files.pythonhosted.org/packages/9a/fb/7ceb9ee55b5f67e4a3e4d73d5af4c7e37e3c9f37f54bee90361b64b17e3f/numexpr-2.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e23b87f744e04e302d82ac5e2189ae20a533566aec76a46885376e20b0645bf8", size = 1417845, upload-time = "2025-10-13T16:13:53.836Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9b5764d0eafbbb2889288f80de773791358acf6fad1a55767538d8b79599/numexpr-2.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:44f84e0e5af219dbb62a081606156420815890e041b87252fbcea5df55214c4c", size = 1466211, upload-time = "2025-10-13T16:15:48.985Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/956a13e628d722d649fbf2fded615134a308c082e122a48bad0e90a99ce9/numexpr-2.14.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dd72d8c2a165fe45ea7650b16eb8cc1792a94a722022006bb97c86fe51fd2091", size = 466242, upload-time = "2025-10-13T16:13:55.795Z" }, + { url = "https://files.pythonhosted.org/packages/d6/dd/abe848678d82486940892f2cacf39e82eec790e8930d4d713d3f9191063b/numexpr-2.14.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70d80fcb418a54ca208e9a38e58ddc425c07f66485176b261d9a67c7f2864f73", size = 457149, upload-time = "2025-10-13T16:15:52.036Z" }, + { url = "https://files.pythonhosted.org/packages/fd/bb/797b583b5fb9da5700a5708ca6eb4f889c94d81abb28de4d642c0f4b3258/numexpr-2.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:edea2f20c2040df8b54ee8ca8ebda63de9545b2112872466118e9df4d0ae99f3", size = 1426493, upload-time = "2025-10-13T16:13:59.244Z" }, + { url = "https://files.pythonhosted.org/packages/77/c4/0519ab028fdc35e3e7ee700def7f2b4631b175cd9e1202bd7966c1695c33/numexpr-2.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:790447be6879a6c51b9545f79612d24c9ea0a41d537a84e15e6a8ddef0b6268e", size = 1474413, upload-time = "2025-10-13T16:15:59.211Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/bb/c5/7b863a97a91671a0338f4253bd3b5a3d3852f0692dae91711c9f4a10e787/numpy-2.4.6-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b", size = 15669392, upload-time = "2026-05-18T23:34:41.257Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9d/3584b9984ca4c047aea75214ce1a4c4c73d849bd71b604264b7f5653f8a8/numpy-2.4.6-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089", size = 16633220, upload-time = "2026-05-18T23:34:45.075Z" }, + { url = "https://files.pythonhosted.org/packages/05/ae/7c67fba23bd98caec7c99261f3a16072ade14813486b0282cb29846de832/numpy-2.4.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a", size = 17020800, upload-time = "2026-05-18T23:34:49.065Z" }, + { url = "https://files.pythonhosted.org/packages/d9/5d/3b6725cb31d983c5e66916f5d36f6d7e5521129e4c4404d64f918292a5b6/numpy-2.4.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605", size = 18357600, upload-time = "2026-05-18T23:34:52.709Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0f/037e64c494b67581ae18193d770adef354c41f3f2c8ebf865602d949bf8f/numpy-2.4.6-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20", size = 15728070, upload-time = "2026-05-18T23:35:14.79Z" }, + { url = "https://files.pythonhosted.org/packages/21/a6/5d2bae9c9542eb4df16dc9c46dc79c186e9bad53805dfa5399a6023c6db0/numpy-2.4.6-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d", size = 16681752, upload-time = "2026-05-18T23:35:18.836Z" }, + { url = "https://files.pythonhosted.org/packages/92/14/23d1dfb410ae362cd59ce53e936b1513d545eb40db3949ced632e19a459e/numpy-2.4.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67", size = 17086024, upload-time = "2026-05-18T23:35:22.52Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/23595a2c642cdf3bc567877064bdd7f91c8b0038a4453cf2daf7248eafe9/numpy-2.4.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd", size = 18403398, upload-time = "2026-05-18T23:35:26.398Z" }, + { url = "https://files.pythonhosted.org/packages/d5/91/64288395ee1799bd2e0b04a305dce9666da90c961e1f3fe982a05ee1c036/numpy-2.4.6-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b", size = 15685197, upload-time = "2026-05-18T23:35:50.863Z" }, + { url = "https://files.pythonhosted.org/packages/f3/eb/ebffaa97dc55502df69584a8f0dcf07f69a3e0b3e2323670a2722db9aa39/numpy-2.4.6-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8", size = 16638245, upload-time = "2026-05-18T23:35:54.752Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0b/54f9da33128d7e350fab89c7455902eeae70349ee52bddb448dc4a576f45/numpy-2.4.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402", size = 17036587, upload-time = "2026-05-18T23:35:58.355Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f0/fdebc1052db1cc37c64beb22072d67cd6d1c71adca1299f53dec2b5e20d3/numpy-2.4.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb", size = 18363226, upload-time = "2026-05-18T23:36:02.845Z" }, + { url = "https://files.pythonhosted.org/packages/82/dd/1206a7ca6ab15e3f02069707ca96222e202af681bb73756da7527f3cb837/numpy-2.4.6-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43", size = 15730496, upload-time = "2026-05-18T23:36:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/51/e7/38d3ea825dcab85a591734decb2f6c67caa7c8367d374df1a1c3842f9b07/numpy-2.4.6-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e", size = 16679616, upload-time = "2026-05-18T23:36:29.652Z" }, + { url = "https://files.pythonhosted.org/packages/93/b7/caabfdf53edf663e0b4eb74d7d405d83baef09eb5e83bcd32d601d72b93e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895", size = 17085145, upload-time = "2026-05-18T23:36:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/f9/45/68d7c33a6bcf3e5aa3bdbd57a367e6f615286dfd6482f97e8ffeb734306e/numpy-2.4.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4", size = 18403813, upload-time = "2026-05-18T23:36:37.369Z" }, +] + +[[package]] +name = "numpydoc" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/3c/dfccc9e7dee357fb2aa13c3890d952a370dd0ed071e0f7ed62ed0df567c1/numpydoc-1.10.0.tar.gz", hash = "sha256:3f7970f6eee30912260a6b31ac72bba2432830cd6722569ec17ee8d3ef5ffa01", size = 94027, upload-time = "2025-12-02T16:39:12.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/5e/3a6a3e90f35cea3853c45e5d5fb9b7192ce4384616f932cf7591298ab6e1/numpydoc-1.10.0-py3-none-any.whl", hash = "sha256:3149da9874af890bcc2a82ef7aae5484e5aa81cb2778f08e3c307ba6d963721b", size = 69255, upload-time = "2025-12-02T16:39:11.561Z" }, +] + +[[package]] +name = "opencv-python-headless" +version = "5.0.0.93" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/99/76b7c80252aa83c1af16393454aafd125a0287101afe8deb0a6821af0e30/opencv_python_headless-5.0.0.93.tar.gz", hash = "sha256:b82f9831daab90b725c7c1ee1b36cb5732c367096ac76d119e64e14eb70d5f3c", size = 81817738, upload-time = "2026-07-02T07:01:06.039Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/78/afca939f40ffe2b2380bfa86f812b2f7d4acc5a27b27dc41b49cad7ce7b4/opencv_python_headless-5.0.0.93-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:10818d91510e05c04568ae12b5cd120779c70c01bf897b001a6221fe430df80f", size = 36521085, upload-time = "2026-07-02T06:55:24.429Z" }, + { url = "https://files.pythonhosted.org/packages/2b/97/8170e9819764c47e436c130d3ff6cfb73b58f923eae9d3a03d8982b04aec/opencv_python_headless-5.0.0.93-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:09a872a157c1376ab922a69bbf22f9a95bcc7b658a9d8b436a60212b02b2eeb4", size = 56563598, upload-time = "2026-07-02T06:55:47.355Z" }, + { url = "https://files.pythonhosted.org/packages/3a/98/1a28a7101e31801042b3098871a74b76c61581d328ef40774ff4edb53a56/opencv_python_headless-5.0.0.93-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:840bd717c21e5c11cadadc022a823315ea417f961213d06b4df010e019eb16f4", size = 39648433, upload-time = "2026-07-02T06:56:04.255Z" }, + { url = "https://files.pythonhosted.org/packages/9b/21/f6ef335f6e65724aa78b8d792b48d40a48c381715f1e62f5a5049e09d07e/opencv_python_headless-5.0.0.93-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ed709fdf9aa0bd1f2ed8549e71d19449b03a675bb581eb292285f6861953be37", size = 61204038, upload-time = "2026-07-02T06:56:41.823Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "python-dateutil", marker = "sys_platform == 'linux'" }, + { name = "pytz", marker = "sys_platform == 'linux'" }, + { name = "tzdata", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "partd" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "locket", marker = "sys_platform == 'linux'" }, + { name = "toolz", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/3a/3f06f34820a31257ddcabdfafc2672c5816be79c7e353b02c1f318daa7d4/partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c", size = 21029, upload-time = "2024-05-06T19:51:41.945Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905, upload-time = "2024-05-06T19:51:39.271Z" }, +] + +[[package]] +name = "patsy" +version = "1.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/44/ed13eccdd0519eff265f44b670d46fbb0ec813e2274932dc1c0e48520f7d/patsy-1.0.2.tar.gz", hash = "sha256:cdc995455f6233e90e22de72c37fcadb344e7586fb83f06696f54d92f8ce74c0", size = 399942, upload-time = "2025-10-20T16:17:37.535Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl", hash = "sha256:37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a", size = 233301, upload-time = "2025-10-20T16:17:36.563Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, + { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, + { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, + { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, + { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, + { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, + { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, + { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, + { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, + { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, + { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, + { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, + { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, + { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, + { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, + { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, + { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, + { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, +] + +[[package]] +name = "pims" +version = "0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "imageio", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "slicerator", marker = "sys_platform == 'linux'" }, + { name = "tifffile", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b8/02/5bf3639f5b77e9b183011c08541c5039ba3d04f5316c70312b48a8e003a9/pims-0.7.tar.gz", hash = "sha256:55907a4c301256086d2aa4e34a5361b9109f24e375c2071e1117b9491e82946b", size = 87779, upload-time = "2024-06-10T19:20:42.842Z" } + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pulp" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/70/69be07a67621ad804d6cf347965eb4e0d7786a97330d99c31d735aaa6c5a/pulp-3.3.2.tar.gz", hash = "sha256:d0904700c207ac11e25e3b1213b70eae1d6fb25faa719d75f3f15054901258c0", size = 16305346, upload-time = "2026-05-25T09:41:26.207Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/6e/d674f1dde91c71e2ac19e5e5cf1ee6d5845e3aefecd9c39ed9c4b0c9a696/pulp-3.3.2-py3-none-any.whl", hash = "sha256:631b166f72086971a9597f7a0233ababa99bb8d50a01cd543f7758be5a9f86c0", size = 16391742, upload-time = "2026-05-25T09:41:22.2Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "py-cpuinfo" +version = "9.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/37/a8/d832f7293ebb21690860d2e01d8115e5ff6f2ae8bbdc953f0eb0fa4bd2c7/py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690", size = 104716, upload-time = "2022-10-25T20:38:06.303Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/a9/023730ba63db1e494a271cb018dcd361bd2c917ba7004c3e49d5daf795a2/py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5", size = 22335, upload-time = "2022-10-25T20:38:27.636Z" }, +] + +[[package]] +name = "pyarrow" +version = "25.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/f3/95428098d1fa7d04432fb750eed06b41304c2f6a5d3319985e64db2d9d41/pyarrow-25.0.0.tar.gz", hash = "sha256:d2d697008b5ec06d75952ef260c2e9a8a0f6ccfce24266c04c9c8ade927cb3b4", size = 1199181, upload-time = "2026-07-10T08:29:50.116Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/1a/22bfb6597dcdc861fa83c39c06e1457cb56f698940eff42fbb25de30e8e5/pyarrow-25.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:fa1482b3da10cac2d4db6e26b81da543e237616af2ef6d466018b31ca586496f", size = 46841966, upload-time = "2026-07-10T08:27:07.685Z" }, + { url = "https://files.pythonhosted.org/packages/55/0e/cd705c042bc4fe7022478db577fcab4abdcfabb9bc37ab7a75556b3fcb2b/pyarrow-25.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:5d1dbf24e151042f2fa3c129563f65d66674128868496fb008c4272b16bdf778", size = 50088993, upload-time = "2026-07-10T08:27:14.268Z" }, + { url = "https://files.pythonhosted.org/packages/98/ee/d822e1ee31fe31ec5d057210e0605c950b975dcd8d9a332976cc859a9df8/pyarrow-25.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:20887a762dd61dcc530f93a140840ab1f6aa7836b33270e42d627ab3cf11e537", size = 49941005, upload-time = "2026-07-10T08:27:21.274Z" }, + { url = "https://files.pythonhosted.org/packages/33/1b/207a90cc64619a095eb75a263ae069735f2810056d43c667befd573ec083/pyarrow-25.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:58d1ab556b0cea1c93fdb799b24ad58adb2f2a2788dbce782a94f64ae1a5cc9b", size = 53112355, upload-time = "2026-07-10T08:27:27.911Z" }, + { url = "https://files.pythonhosted.org/packages/53/55/6d1d5f5aff317ec5de9421594679ed51ed828fe7e2ce209327f819d801e4/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:59516c822d5fd8e544aaa0dfe72f36fed5d4c24ea8390aab1bcd31d7e959c6be", size = 46841701, upload-time = "2026-07-10T08:27:49.741Z" }, + { url = "https://files.pythonhosted.org/packages/b5/5d/f790fb6965ab54c9da0dda7856abc75fd0d7648d865f8d603c111d203a64/pyarrow-25.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6f9dbd83e91c239a1f5ee7ce13f108b5f6c0efbe40a4375260d8f08b43ad05e9", size = 50090118, upload-time = "2026-07-10T08:27:56.051Z" }, + { url = "https://files.pythonhosted.org/packages/0c/8c/faf025357ebf31bc96777f234277aa31e2aeca6dd4ecaa391f29085473c2/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:18dcc8cc50b5e72eae6fcbfc6c8776c21a007176b27a3cdec5c2f5bcf126708d", size = 49945559, upload-time = "2026-07-10T08:28:01.927Z" }, + { url = "https://files.pythonhosted.org/packages/07/a1/bd051871708ea99a5e0fc711926c26c6f2c6d0130c7aaac8093e34998af6/pyarrow-25.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4ec1895a87aa834c3b99b7a1e758747eb8bb57f922b32c0e0fa04afb8d6998b1", size = 53114238, upload-time = "2026-07-10T08:28:08.594Z" }, + { url = "https://files.pythonhosted.org/packages/af/9f/2d81ba89d1e4198d0cb25fe7529de936830fdaec0db926bb52a1ef7080d4/pyarrow-25.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:f57a39dbcb416345401c2e77a4373669b45fd111a1768e6cf267a7a0607ff0ec", size = 46905617, upload-time = "2026-07-10T08:28:29.376Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/0ed312ec800fb536f93783215126cee4b8977dcfeccba6f0f44df0cc87d7/pyarrow-25.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:447df764beb07c544f0178a5f6b70ef44b9ecf382b3cdfad4c2d7867353c3887", size = 50119765, upload-time = "2026-07-10T08:28:35.826Z" }, + { url = "https://files.pythonhosted.org/packages/ca/88/cab5063ba0c4d46a9f6b4b7eb1c9029dc0302d65cd5ab3510c949a386568/pyarrow-25.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac5dfeee59f9ceb4d45ba76e83b026c38c24334135bb329d8274baa49cec3c62", size = 50027563, upload-time = "2026-07-10T08:28:43.848Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fb/4d24f1b7fe2e042dc4ef315ef75e4e702d8e46fe10c37e63caff00502b03/pyarrow-25.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f0f100dacf2c0f400601664a79d1a907ced4740514bb2b00917341038e2ce76f", size = 53162437, upload-time = "2026-07-10T08:28:52.819Z" }, + { url = "https://files.pythonhosted.org/packages/8a/18/b37fc31a69cff4bdfb8842683def5612f551b93fff6f44375e4a4a6a5535/pyarrow-25.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b8af8ceedf0c9c160fd2b63440f2d205b9404db85866c1217bfea601de7cfb50", size = 46912304, upload-time = "2026-07-10T08:29:14.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/35/5cae19ba72493e5598022468b56f6a5571f399f485bf412f157356476caa/pyarrow-25.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c70a5fd9a82bd1a702fd482bdc62d38dcb672fb2b449b1d7c0d7d1f4be7b7bfe", size = 50073652, upload-time = "2026-07-10T08:29:22.467Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a5/ddd508424bdfd5e6945765e9e2ffc687e2f6115972badc8ecf423076c407/pyarrow-25.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0490a7f8b38ffe11cc26526b50c65d111cb54ddac3717cec781806793f1244dc", size = 50058654, upload-time = "2026-07-10T08:29:29.689Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a4/324d0db203ff5eebe8694ec2d6ec5a23f9aaa5d02e5b8c692914c518c33c/pyarrow-25.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e83916bbcf380866b4e14255850b33323ff678dc9758411d0409cdd2523880b0", size = 53140153, upload-time = "2026-07-10T08:29:36.041Z" }, +] + +[[package]] +name = "pyavm" +version = "0.9.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/ac/a925d36dd37fc37f89afccc1f62ffa03b7344c8e4ff7850be7879b4497e6/pyavm-0.9.9.tar.gz", hash = "sha256:bc0f605d957c1fd6d7765523fcba8b9a72377ac6c51461c2a838fe44600bcd9a", size = 220572, upload-time = "2026-03-12T09:54:50.969Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/ab/ba8d2b40aee05cd986807d58ee324369eb16248b717a08b51eee977f8d33/pyavm-0.9.9-py3-none-any.whl", hash = "sha256:8bba0ee9645a8a9f215af9ceea67b494a6ee1fe380cebdc00ba99d781539ad76", size = 379786, upload-time = "2026-03-12T09:54:49.455Z" }, +] + +[[package]] +name = "pybind11" +version = "3.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/f0/35145a3c3baffeef55d4b8324caa33abaa8fa56ab345ecd4b2211d09163e/pybind11-3.0.4.tar.gz", hash = "sha256:3286b59c8a774b9ee650169302dd5a4eedc30a8617905a0560dd8ee44775130c", size = 589533, upload-time = "2026-04-19T03:08:15.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/06/c3a23c9a0263b136c519f033a58d4641e73065fefc7754e9667ec206d992/pybind11-3.0.4-py3-none-any.whl", hash = "sha256:961720ee652da51d531b7b2451a6bd2bc042b0106e6d9baa48ecb7d58034ce63", size = 314166, upload-time = "2026-04-19T03:08:14.091Z" }, +] + +[[package]] +name = "pybtex" +version = "0.26.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "latexcodec", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/f5/f30da9c93f0fa6d619332b2f69597219b625f35780473a05164a9981fd9a/pybtex-0.26.1.tar.gz", hash = "sha256:2e5543bea424e60e9e42eef70bff597be48649d8f68ba061a7a092b2477d5464", size = 692991, upload-time = "2026-04-03T13:05:39.014Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/f6/775eb92e865b28cdb4ad1f2bed7a5446197516f76b58a950faa3be3fd08d/pybtex-0.26.1-py3-none-any.whl", hash = "sha256:e26c0412cc54f5f21b2a6d9d175762a2d2af9ccf3a8f651cdb89ec035db77aa1", size = 126134, upload-time = "2026-04-03T13:05:40.623Z" }, +] + +[[package]] +name = "pybtex-docutils" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils", marker = "sys_platform == 'linux'" }, + { name = "pybtex", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/84/796ea94d26188a853660f81bded39f8de4cfe595130aef0dea1088705a11/pybtex-docutils-1.0.3.tar.gz", hash = "sha256:3a7ebdf92b593e00e8c1c538aa9a20bca5d92d84231124715acc964d51d93c6b", size = 18348, upload-time = "2023-08-22T18:47:54.833Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/b1/ce1f4596211efb5410e178a803f08e59b20bedb66837dcf41e21c54f9ec1/pybtex_docutils-1.0.3-py3-none-any.whl", hash = "sha256:8fd290d2ae48e32fcb54d86b0efb8d573198653c7e2447d5bec5847095f430b9", size = 6385, upload-time = "2023-08-22T06:43:20.513Z" }, +] + +[[package]] +name = "pyccl" +version = "3.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/40/ff357d61a20c21420f1fe7417ca6d889be2e07a67b3564775aeaf6c3f366/pyccl-3.3.4.tar.gz", hash = "sha256:a9d22557354fd161df909e8f4f199e4f1c434c080fd6cddb2246609ddbd70e7c", size = 16783719, upload-time = "2026-05-14T16:26:27.327Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/80/1db2504f21eec9b481e1fe298b05deb96e108d06ddb1828494d16d32bf1c/pyccl-3.3.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0229c863acea5c3fc6748dc7c40611dd529709c9d26e3679ebdbc467511ef993", size = 3707759, upload-time = "2026-05-14T16:26:16.779Z" }, + { url = "https://files.pythonhosted.org/packages/1a/91/3000c5fc1ee8379636dc894946a3633baae74a3f1cce3c2d402e8991a0b5/pyccl-3.3.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:685d528a096251a2eb5d569e611b5a2e68cc3a4a0134734b16ac4e73a07e7f27", size = 3706950, upload-time = "2026-05-14T16:26:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/e5/66/803e8196149d8d8a75319b4f20268210b1e1b31b3158a1143ce99cacf953/pyccl-3.3.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:601b687b50b506f7f5775475d79fa55d221616a827a96ad5d6d68bf7a15de9b9", size = 3706955, upload-time = "2026-05-14T16:26:25.302Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types", marker = "sys_platform == 'linux'" }, + { name = "pydantic-core", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, + { name = "typing-inspection", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", size = 1976802, upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://files.pythonhosted.org/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", size = 2052446, upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://files.pythonhosted.org/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", size = 2232757, upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", size = 2309275, upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://files.pythonhosted.org/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", size = 2094467, upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://files.pythonhosted.org/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", size = 2134417, upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://files.pythonhosted.org/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", size = 2179782, upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", size = 2188782, upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://files.pythonhosted.org/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", size = 2328334, upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://files.pythonhosted.org/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", size = 2372986, upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://files.pythonhosted.org/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", size = 1978926, upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://files.pythonhosted.org/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", size = 2046785, upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://files.pythonhosted.org/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", size = 2228733, upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", size = 2307534, upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://files.pythonhosted.org/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", size = 2099732, upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://files.pythonhosted.org/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", size = 2129627, upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", size = 2179141, upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", size = 2184325, upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", size = 2323990, upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", size = 2369978, upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", size = 1974605, upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", size = 2030777, upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://files.pythonhosted.org/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", size = 2236641, upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", size = 2286404, upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", size = 2109219, upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://files.pythonhosted.org/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", size = 2110594, upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://files.pythonhosted.org/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", size = 2159542, upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://files.pythonhosted.org/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", size = 2168146, upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", size = 2306309, upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://files.pythonhosted.org/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", size = 2369736, upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, +] + +[[package]] +name = "pyerfa" +version = "2.0.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/39/63cc8291b0cf324ae710df41527faf7d331bce573899199d926b3e492260/pyerfa-2.0.1.5.tar.gz", hash = "sha256:17d6b24fe4846c65d5e7d8c362dcb08199dc63b30a236aedd73875cc83e1f6c0", size = 818430, upload-time = "2024-11-11T15:22:30.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/96/b6210fc624123c8ae13e1eecb68fb75e3f3adff216d95eee1c7b05843e3e/pyerfa-2.0.1.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0603e8e1b839327d586c8a627cdc634b795e18b007d84f0cda5500a0908254e", size = 692794, upload-time = "2024-11-11T15:22:19.429Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e0/050018d855d26d3c0b4a7d1b2ed692be758ce276d8289e2a2b44ba1014a5/pyerfa-2.0.1.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e43c7194e3242083f2350b46c09fd4bf8ba1bcc0ebd1460b98fc47fe2389906", size = 738711, upload-time = "2024-11-11T15:22:20.661Z" }, + { url = "https://files.pythonhosted.org/packages/b9/f5/ff91ee77308793ae32fa1e1de95e9edd4551456dd888b4e87c5938657ca5/pyerfa-2.0.1.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:07b80cd70701f5d066b1ac8cce406682cfcd667a1186ec7d7ade597239a6021d", size = 722966, upload-time = "2024-11-11T15:22:21.905Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pymaster" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ducc0", marker = "sys_platform == 'linux'" }, + { name = "healpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/45/470858f2a6a3f5133955bb87aed978a5e921d4052aea1c19718e6b72f0ae/pymaster-2.6.tar.gz", hash = "sha256:056a09bc8631cf338e93ef14d8c70272ad9554ef10498d919e920994531c57a2", size = 33707181, upload-time = "2025-12-16T09:18:28.905Z" } + +[[package]] +name = "pyopenssl" +version = "26.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/b7/da07bae88f5a9506b4def6f2f4903cf4c3b8831e560dba8fa18ca08f758f/pyopenssl-26.3.0.tar.gz", hash = "sha256:589de7fae1c9ea670d18422ed00fc04da787bbde8e1454aea872aa57b49ad341", size = 182024, upload-time = "2026-06-12T20:28:07.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/18/1dd71c9b43192ab83f1d531ad6002dc81108ac36c475f79fb7a295abe2f4/pyopenssl-26.3.0-py3-none-any.whl", hash = "sha256:46367f8f66b92271e6d218da9c87607e1ef5a0bc5c8dea5bb3db82f395c385a3", size = 56008, upload-time = "2026-06-12T20:28:05.999Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "iniconfig", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pluggy", marker = "sys_platform == 'linux'" }, + { name = "pygments", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", marker = "sys_platform == 'linux'" }, + { name = "pluggy", marker = "sys_platform == 'linux'" }, + { name = "pytest", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "python-json-logger" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/be/0631a861af4d1c875f096c07d34e9a63639560a717130e7a87cbc82b7e3f/python_json_logger-4.1.0-py3-none-any.whl", hash = "sha256:132994765cf75bf44554be9aa49b06ef2345d23661a96720262716438141b6b2", size = 15021, upload-time = "2026-03-29T04:39:55.266Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, +] + +[[package]] +name = "qp-prob" +version = "1.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, + { name = "tables-io", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b0/65/c54639ac63667800ee00d74c8851bd104ccaefcae95138073d6e77832d17/qp_prob-1.1.4.tar.gz", hash = "sha256:a68a3a3785d3ca57a2246c0524398338b7b7dffef0aef0722c231c64dde30107", size = 2460490, upload-time = "2026-06-25T20:08:34.63Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/9f/6df94f6a8fc6af157b2479c7ea0f1ef86d06e8ce7f6cba09bfbb004d5de7/qp_prob-1.1.4-py3-none-any.whl", hash = "sha256:e68d193ba0a4eb0a92f9b4861b9defc59194712865fa90e06db57196f8227e30", size = 112941, upload-time = "2026-06-25T20:08:32.68Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs", marker = "sys_platform == 'linux'" }, + { name = "rpds-py", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' and sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "regions" +version = "0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/86/44ff464efa2777247d6addc74416059f1872ab05c88588bbe1aadca27a7c/regions-0.12.tar.gz", hash = "sha256:1c9460770f250ef299e90a9d5c0b35941f7d05bbf879f6ffaa0538250c018ef9", size = 273609, upload-time = "2026-06-24T20:10:17.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/a2/fe550b219404e98f2afc742ebb1d1bcd27888a6ad48ce60baf5fa96bde97/regions-0.12-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf5a6d8f1060607eab07f131cf12709ef7c4e9b1918d4aa269572e6c49e68b12", size = 2410524, upload-time = "2026-06-24T20:10:11.56Z" }, + { url = "https://files.pythonhosted.org/packages/92/4c/21bed50e1f86aa9fc5148318057f23d68d81f9ce0c1b31038e6c5c0e9547/regions-0.12-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e3b74d83fc4042430e8f11a0f1a3939ec6f95a7244a7103caeb6ad115d845acf", size = 2426898, upload-time = "2026-06-24T20:10:13.042Z" }, +] + +[[package]] +name = "reproject" +version = "0.21.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "astropy-healpix", marker = "sys_platform == 'linux'" }, + { name = "dask", extra = ["array"], marker = "sys_platform == 'linux'" }, + { name = "dask-image", marker = "sys_platform == 'linux'" }, + { name = "fsspec", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "pillow", marker = "sys_platform == 'linux'" }, + { name = "pyavm", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, + { name = "zarr", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/44/6fd820ba336484277a91a2f4808b60d6ec0b9f033f588c237e778f20fe89/reproject-0.21.0.tar.gz", hash = "sha256:01ede715a1993c29431f52ff74189ef30f5e7b2e8b4dc88c1b002145a971dc1c", size = 1622661, upload-time = "2026-06-25T15:11:34.886Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/5b/8d9b51c754ab014194d374cb4873d0729b397f67997e67721538b643e682/reproject-0.21.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2132fc5d2fa3fbbd57337099f9d47582136e653ac82402783c7ceffa26804816", size = 1776590, upload-time = "2026-06-25T15:11:30.358Z" }, + { url = "https://files.pythonhosted.org/packages/da/2d/f9d76e8e308813978227e1e43a1f25f64cd0f4b030cecaeff8baeec9eeac/reproject-0.21.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8525baaca84e949a69532c02ff491c23993e3bc22a59f694af576e473f2a9d2f", size = 1791889, upload-time = "2026-06-25T15:11:31.741Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi", marker = "sys_platform == 'linux'" }, + { name = "charset-normalizer", marker = "sys_platform == 'linux'" }, + { name = "idna", marker = "sys_platform == 'linux'" }, + { name = "urllib3", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513, upload-time = "2021-05-12T16:37:54.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490, upload-time = "2021-05-12T16:37:52.536Z" }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760, upload-time = "2019-10-28T16:00:19.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242, upload-time = "2019-10-28T16:00:13.976Z" }, +] + +[[package]] +name = "rfc3987-syntax" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lark", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz", hash = "sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d", size = 14239, upload-time = "2025-07-18T01:05:05.015Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl", hash = "sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f", size = 8046, upload-time = "2025-07-18T01:05:03.843Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py", marker = "sys_platform == 'linux'" }, + { name = "pygments", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "rocket-fft" +version = "0.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numba", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/b0/09cbec3177ecf56e5ceb789a69fbcdcbabe758cbb682e5d36b14aa8c05fb/rocket_fft-0.3.1.tar.gz", hash = "sha256:ddc902a361099aff9fc02fe9ea3b0d036c2f67f93df356c2b754f7627d7fa4f4", size = 74276, upload-time = "2025-12-26T00:30:54.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/18/12d001c33cd7c4e012da59d25086879aec303e0e157d9ec737ecab8e8f58/rocket_fft-0.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46970c0dcc70bd9c365d6a9f4a235edec2e8eaad628097c0e21d920669e25abe", size = 2151682, upload-time = "2025-12-26T00:30:30.315Z" }, + { url = "https://files.pythonhosted.org/packages/c8/92/98bd01cad9e5ceeb383722d744597d066e37cdd0e54742906341aa369c28/rocket_fft-0.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d64c9fc81206f2c77f74f68761f54ac6f1ebe4c8840f0ef9795c28ab229463f", size = 2160197, upload-time = "2025-12-26T00:30:31.945Z" }, + { url = "https://files.pythonhosted.org/packages/48/2c/5bbe8d6b0c4e009f7bc6f9f4eee802a9b556ec2c3b02b9d5e5ccfa8edff1/rocket_fft-0.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5906c6517fc87295a1d142c7e6ebd1c55e057f6ee4c605549bbcecacab83774f", size = 2151627, upload-time = "2025-12-26T00:30:37.177Z" }, + { url = "https://files.pythonhosted.org/packages/55/0d/ac67fb0b2fac382ab5585719bbd1f4927c19ba0ee3bbc28dc8a1ef83e81d/rocket_fft-0.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d830aacc34d65b28daab715aa4a90d98489e89a48c2836039982f18ba1e2db3", size = 2160355, upload-time = "2025-12-26T00:30:38.81Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c6/3ff33ec86e61867c0e36436eb2c9ba258eceba94419594d73ff473460e27/rocket_fft-0.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:65a7577d7f3b4e3672de179f91fee8339211b3f5ae13eef1b30cb6a318f0308c", size = 2151746, upload-time = "2025-12-26T00:30:43.66Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/def65716cd225954d0cd5f1f6326c72c20601db5dc65557ef4b66157ccea/rocket_fft-0.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97614dbebb2686a644bbf6c6f8a6198f063052f4c88901d0ca2808536c2e83cc", size = 2160407, upload-time = "2025-12-26T00:30:44.959Z" }, +] + +[[package]] +name = "roman-numerals" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, + { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, + { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, + { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, + { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, + { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, + { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, + { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, + { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, + { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, + { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, + { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, + { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, + { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, + { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, + { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, + { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, + { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, + { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, + { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, + { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, + { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, + { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, + { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, + { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, + { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, + { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, + { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, + { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.21" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/36/6f65aa9989acdec45d417192d8f4e7921931d8a6cf87ac74bce3eed98a8e/ruff-0.15.21.tar.gz", hash = "sha256:d0cfc841c572283c36548f82664a54ce6565567f1b0d5b4cf2caac693d8b7500", size = 4769401, upload-time = "2026-07-09T20:01:34.005Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/c6/ede15cac6839f3dbce52565c8f5164a8210e669c7bc4decb03e5bdf47d0d/ruff-0.15.21-py3-none-linux_armv6l.whl", hash = "sha256:63ea0e965e5d73c90e95b2434beeafc70820536717f561b32ab6e777cb9bdf5d", size = 10854342, upload-time = "2026-07-09T20:00:53.998Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/b4523cc90ba239ede441447a19d0c968846a3012e5a0b0c5b62831a3d5e3/ruff-0.15.21-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01d65b4831c6b2a4ba8ee6faa84049d44d982b7a706e622c4094c509e51673be", size = 10990053, upload-time = "2026-07-09T20:01:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/92/cc/c6a9872a5375f0628875481cf2f66b13d7d865bf3ca2e57f91c7e762d976/ruff-0.15.21-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c5a913a589120ce67933d5d05fd6ddbcc2481c6a054980ee767f7414c72b4fd", size = 10666096, upload-time = "2026-07-09T20:01:04.299Z" }, + { url = "https://files.pythonhosted.org/packages/ab/97/c621f7a17e097f1790fa3af6374138823b330b2d03fc38337945daca212c/ruff-0.15.21-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef04b681d02ad4dc9620f00f83ac5c22f652d0e9a9cfe431d219b16ad5ccc41", size = 11537011, upload-time = "2026-07-09T20:01:06.771Z" }, + { url = "https://files.pythonhosted.org/packages/ea/51/d928727e476e25ccc57c6f449ffd80241a651a973ad949d39cfb2a771d28/ruff-0.15.21-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16d090c0740916594157e75b80d666eab8e78083b39b3b0e1d698f4670a17b86", size = 12347101, upload-time = "2026-07-09T20:01:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/1e/88/8cd62026802b16018ad06931d87997cf795ba2a6239ab659606c87d96bf0/ruff-0.15.21-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a10e74757dd65004d779b73e2f3c5210156d9980b41224d50d2ebcf1db51e67", size = 11572001, upload-time = "2026-07-09T20:01:11.092Z" }, + { url = "https://files.pythonhosted.org/packages/b2/97/f63084cf55444fc110e8cb985ebfcc592af47f597d44453d778cb81bc156/ruff-0.15.21-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bab0905d2f29e0d9fbc3c373ed23db0095edaa3f71f1f4f519ec15134d9e85c8", size = 11549239, upload-time = "2026-07-09T20:01:13.27Z" }, + { url = "https://files.pythonhosted.org/packages/9d/77/f107da4a2874b7715914b03f09ba9c54424de3ff8a1cc5d015d3ee2ce0ac/ruff-0.15.21-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:00eca240af5789fec6fe7df74c088cc1f9644ed83027113468efba7c92b94075", size = 11535340, upload-time = "2026-07-09T20:01:15.206Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e9/601deb322d3303a7bf212b0100ead6f2ee3f6a044d89c30f2f92bf83c731/ruff-0.15.21-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:262ab31557a75141325e32d3357f3597645a7f084e732b6b054dde428ecd9341", size = 10964048, upload-time = "2026-07-09T20:01:17.723Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2e/0f2176d1e99c15192caea19c8c3a0a955246b4cb4de795042eeb616345cd/ruff-0.15.21-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:659c4e7a4212f83306045ec7c5e5a356d16d9a6ef4ae0c7a4d872914fc655d9d", size = 10667055, upload-time = "2026-07-09T20:01:19.73Z" }, + { url = "https://files.pythonhosted.org/packages/48/60/abd74a02e0c4214f12a68becfd30af7165cfdcb0e661ecdc60bbb949c09a/ruff-0.15.21-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9e866eab611a5f959d36df2d10e446973a3610bc42b0c15b31dc27977d59c233", size = 11242043, upload-time = "2026-07-09T20:01:21.947Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c6/583075d8ccabb4b229345edcaf1545eb3d8d6be90f686a479d7e94088bbf/ruff-0.15.21-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e89bc93c0d3803ba870b55c29671bad9dc6d94bb1eb181b056b52eb05b52854f", size = 11648064, upload-time = "2026-07-09T20:01:24.023Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, +] + +[[package]] +name = "seaborn" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "pandas", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography", marker = "sys_platform == 'linux'" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, +] + +[[package]] +name = "send2trash" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c5/f0/184b4b5f8d00f2a92cf96eec8967a3d550b52cf94362dad1100df9e48d57/send2trash-2.1.0.tar.gz", hash = "sha256:1c72b39f09457db3c05ce1d19158c2cbef4c32b8bedd02c155e49282b7ea7459", size = 17255, upload-time = "2026-01-14T06:27:36.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "shear-psf-leakage" +version = "0.2.1" +source = { git = "https://github.com/CosmoStat/shear_psf_leakage.git?rev=develop#0b3c17523b77760c9259be15ba5bbba99d575d0a" } +dependencies = [ + { name = "camb", marker = "sys_platform == 'linux'" }, + { name = "cs-util", marker = "sys_platform == 'linux'" }, + { name = "emcee", marker = "sys_platform == 'linux'" }, + { name = "getdist", marker = "sys_platform == 'linux'" }, + { name = "gsl", marker = "sys_platform == 'linux'" }, + { name = "jupyter", marker = "sys_platform == 'linux'" }, + { name = "jupyter-server", marker = "sys_platform == 'linux'" }, + { name = "jupyterlab", marker = "sys_platform == 'linux'" }, + { name = "jupytext", marker = "sys_platform == 'linux'" }, + { name = "lenspack", marker = "sys_platform == 'linux'" }, + { name = "lmfit", marker = "sys_platform == 'linux'" }, + { name = "matplotlib", marker = "sys_platform == 'linux'" }, + { name = "notebook", marker = "sys_platform == 'linux'" }, + { name = "pandas", marker = "sys_platform == 'linux'" }, + { name = "pyccl", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, + { name = "stats", marker = "sys_platform == 'linux'" }, + { name = "swig", marker = "sys_platform == 'linux'" }, + { name = "tornado", marker = "sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'linux'" }, + { name = "treecorr", marker = "sys_platform == 'linux'" }, + { name = "uncertainties", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "skyproj" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "healsparse", marker = "sys_platform == 'linux'" }, + { name = "hpgeom", marker = "sys_platform == 'linux'" }, + { name = "matplotlib", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/cf/5158151ae6fc60459f430451b612a4bf2da07ebff2a9f52a37e73715a5ee/skyproj-2.5.0.tar.gz", hash = "sha256:cb8d5115927ca43cacdb6d92f00bb4fcc8563ee71028f755203ce1752e67c140", size = 8521587, upload-time = "2026-06-26T19:51:15.378Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/b1/1d86ee4ae4ae7a47e31cc770dc83057388ef16311498283ca90046b3bd04/skyproj-2.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cbfcbd4d3d600557ab19bb5cf79b750ec552da054e3be781bce88e996b9955d", size = 4146686, upload-time = "2026-06-26T19:51:04.011Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e9/f2dd235dcb9f6c3b2fec36ef04d7dd36aef4daf9afc4ab4390d6230c96dc/skyproj-2.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78618084c9362b62ddbfd336ca1864c94d99e2a1f26d2fbf3466fd19dc702c58", size = 4146630, upload-time = "2026-06-26T19:51:10.552Z" }, +] + +[[package]] +name = "slicerator" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/52/f38586b82b2935f8b59a09b0a79c545a22ed062e728c9418bafeb51f61e0/slicerator-1.1.0.tar.gz", hash = "sha256:44010a7f5cd87680c07213b5cabe81d1fb71252962943e5373ee7d14605d6046", size = 38283, upload-time = "2022-04-07T18:54:08.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/ae/fa6cd331b364ad2bbc31652d025f5747d89cbb75576733dfdf8efe3e4d62/slicerator-1.1.0-py3-none-any.whl", hash = "sha256:167668d48c6d3a5ba0bd3d54b2688e81ee267dc20aef299e547d711e6f3c441a", size = 10274, upload-time = "2022-04-07T18:54:07.029Z" }, +] + +[[package]] +name = "smart-open" +version = "7.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/c6/22e7a2acd5d27941e85e0d7ede398da5abe2e4677d2265c924157247c32e/smart_open-7.7.1.tar.gz", hash = "sha256:9414ba5733e28309f29b28a303b0f1054ad23fe0275f1a1b600c80a724f4bd1a", size = 54952, upload-time = "2026-06-26T07:56:35.309Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/c5/14732c140fa0af0e59345949eaf9016c75ad3f076586f2413e3d3566a8da/smart_open-7.7.1-py3-none-any.whl", hash = "sha256:cb62dc45f519bf39b612564d326d2a17556f3a6056e3c3a86a07215d670d45bc", size = 65061, upload-time = "2026-06-26T07:56:33.685Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, +] + +[[package]] +name = "snakemake" +version = "9.23.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "conda-inject", marker = "sys_platform == 'linux'" }, + { name = "configargparse", marker = "sys_platform == 'linux'" }, + { name = "connection-pool", marker = "sys_platform == 'linux'" }, + { name = "docutils", marker = "sys_platform == 'linux'" }, + { name = "dpath", marker = "sys_platform == 'linux'" }, + { name = "gitpython", marker = "sys_platform == 'linux'" }, + { name = "humanfriendly", marker = "sys_platform == 'linux'" }, + { name = "immutables", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "jsonschema", marker = "sys_platform == 'linux'" }, + { name = "nbformat", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "platformdirs", marker = "sys_platform == 'linux'" }, + { name = "psutil", marker = "sys_platform == 'linux'" }, + { name = "pulp", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "referencing", marker = "sys_platform == 'linux'" }, + { name = "requests", marker = "sys_platform == 'linux'" }, + { name = "smart-open", marker = "sys_platform == 'linux'" }, + { name = "snakemake-interface-common", marker = "sys_platform == 'linux'" }, + { name = "snakemake-interface-executor-plugins", marker = "sys_platform == 'linux'" }, + { name = "snakemake-interface-logger-plugins", marker = "sys_platform == 'linux'" }, + { name = "snakemake-interface-report-plugins", marker = "sys_platform == 'linux'" }, + { name = "snakemake-interface-scheduler-plugins", marker = "sys_platform == 'linux'" }, + { name = "snakemake-interface-storage-plugins", marker = "sys_platform == 'linux'" }, + { name = "sqlmodel", marker = "sys_platform == 'linux'" }, + { name = "tabulate", marker = "sys_platform == 'linux'" }, + { name = "tenacity", marker = "sys_platform == 'linux'" }, + { name = "throttler", marker = "sys_platform == 'linux'" }, + { name = "wrapt", marker = "sys_platform == 'linux'" }, + { name = "yte", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9e/c2/45aa858e55edbb7dbc243ed60859f4f3d92d63ecdd67a80632aa3659fe6b/snakemake-9.23.1.tar.gz", hash = "sha256:ef8d698bfce66a6669cc29df7e344b0b367fd90956c725e5ae0a79a556e8e93f", size = 6802587, upload-time = "2026-06-18T09:42:57.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/65/2cb1c99117746bea8aff34dc434703f8f23d3876860e2ff3ebeccb754b0f/snakemake-9.23.1-py3-none-any.whl", hash = "sha256:9fdbfff25f1b442cdf7906ca06b465fc24b9bf72e2d51514fb93d83e3f8aeb35", size = 1162133, upload-time = "2026-06-18T09:42:55.541Z" }, +] + +[[package]] +name = "snakemake-interface-common" +version = "1.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argparse-dataclass", marker = "sys_platform == 'linux'" }, + { name = "configargparse", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/c3/592f832f6e5d2d31f749392e48e8401b7625dec668d3d365d8d28f2b6c30/snakemake_interface_common-1.23.0.tar.gz", hash = "sha256:6ed14531a461417659364a0dd0acc51b786af4e26fc15cc5e00ff3d9fcaffacc", size = 13960, upload-time = "2026-03-08T21:54:29.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/90/a4a3652e832667917383f8d34112bdb37b78a6d14efc049e22a2c8192524/snakemake_interface_common-1.23.0-py3-none-any.whl", hash = "sha256:43bb10102d07149f27787dfc65a7342b86ff772973e7f9ca4940c89cb412a11e", size = 17162, upload-time = "2026-03-08T21:54:28.074Z" }, +] + +[[package]] +name = "snakemake-interface-executor-plugins" +version = "9.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argparse-dataclass", marker = "sys_platform == 'linux'" }, + { name = "snakemake-interface-common", marker = "sys_platform == 'linux'" }, + { name = "throttler", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/50/de06b284c45a8e94fb8e4a12d5235065e78b49b8f84329dc10fe39f4b7dd/snakemake_interface_executor_plugins-9.4.0.tar.gz", hash = "sha256:9d4138897beacbaadaedad94b63f948eaeb604b7fc78f9cf65ac57f090f2c066", size = 16549, upload-time = "2026-03-08T17:04:02.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/2c/4422eb14884bb4955ce65819799ff6452dcd3aa5f8e158540a287877bbcf/snakemake_interface_executor_plugins-9.4.0-py3-none-any.whl", hash = "sha256:d335c093185897e4e3654a39bab3a6f1c57dc1a54f998c92bd2d88640ab4a05e", size = 22567, upload-time = "2026-03-08T17:04:01.296Z" }, +] + +[[package]] +name = "snakemake-interface-logger-plugins" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "snakemake-interface-common", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/0c/3fa5d592663c65669a867526604aadc6fbc235fb9284e94b49c0ef59aa41/snakemake_interface_logger_plugins-2.1.0.tar.gz", hash = "sha256:c89a00d2a398490cecd91b6dc6db8049cba93712d82e1d8f3000f3040bf3791c", size = 15917, upload-time = "2026-05-20T15:12:35.259Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/43/cfdaf562303012024c8f48efebdfe258eef3d895665bd7e0000fdeb2411d/snakemake_interface_logger_plugins-2.1.0-py3-none-any.whl", hash = "sha256:601e3e0770dd1b460c1dcb7bd33f4fc2eb8af5016634b80d985cb993f674ef46", size = 14313, upload-time = "2026-05-20T15:12:34.186Z" }, +] + +[[package]] +name = "snakemake-interface-report-plugins" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "snakemake-interface-common", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/d6/6160ed98de665d6871dd356597dbf726688cc786e88668359ca37b7d9f54/snakemake_interface_report_plugins-1.3.0.tar.gz", hash = "sha256:fc9495298bec4e69721ab8afe6d6d88a86966fda2eeb003db56b9a88b86d5934", size = 4283, upload-time = "2025-10-31T10:52:36.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/f0/df73f6abc9b5910e43612ae28c7b6f666af80c4edd46a216ef47599ab6cb/snakemake_interface_report_plugins-1.3.0-py3-none-any.whl", hash = "sha256:78da3931f70e79eef51e5645a40b172929e555fe4d86ff45d6b856e521a379db", size = 7251, upload-time = "2025-10-31T10:52:35.474Z" }, +] + +[[package]] +name = "snakemake-interface-scheduler-plugins" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "snakemake-interface-common", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/d9/d480807d2cfc2d132bc760d877d45ec8fbe620a24200ec4d2697c4a26031/snakemake_interface_scheduler_plugins-2.0.2.tar.gz", hash = "sha256:2797e8fa9019d983132c2b403f14d6fcd3c5ad4c8d8a66b984b4740a71cacc46", size = 8642, upload-time = "2025-10-20T13:58:12.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/d0/f4e9894c8aaf37efe3bf1afe15ee3cf0546d82b2713a589e266ee47bf2ef/snakemake_interface_scheduler_plugins-2.0.2-py3-none-any.whl", hash = "sha256:b9ddfa508bd480711de1770dfb24f3b813cfa3cd0f862f0127ef721ae5346915", size = 10766, upload-time = "2025-10-20T13:58:11.898Z" }, +] + +[[package]] +name = "snakemake-interface-storage-plugins" +version = "4.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "humanfriendly", marker = "sys_platform == 'linux'" }, + { name = "snakemake-interface-common", marker = "sys_platform == 'linux'" }, + { name = "tenacity", marker = "sys_platform == 'linux'" }, + { name = "throttler", marker = "sys_platform == 'linux'" }, + { name = "wrapt", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/6e/f3c5b2d621fd6a6b78d8cfc01fef6b926fe2c277f5ed77c5e4deeacb94eb/snakemake_interface_storage_plugins-4.4.1.tar.gz", hash = "sha256:b2b5bf05318af36955ebf2ce76c921c0fb06904ca98fb30e1657d88b7b7b6945", size = 14924, upload-time = "2026-03-16T11:16:01.075Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/49/1f72d8c05d8588f06a61f1af3deb125a4ff8169d2a41f1b839d62c824d1c/snakemake_interface_storage_plugins-4.4.1-py3-none-any.whl", hash = "sha256:6e075f448543cc3d0cb1ee5e6e5a83af9761e7085f3ce0922011685d098f231e", size = 18256, upload-time = "2026-03-16T11:15:59.582Z" }, +] + +[[package]] +name = "snowballstemmer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/f8/0a71edf031f03c40db17503cb8ca78a69a171254e568e7db241b0ab57ea1/snowballstemmer-3.1.1.tar.gz", hash = "sha256:e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260", size = 123314, upload-time = "2026-06-03T00:56:40.194Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl", hash = "sha256:7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752", size = 104164, upload-time = "2026-06-03T00:56:38.614Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, +] + +[[package]] +name = "sp-validation" +version = "0.6.0" +source = { virtual = "." } +dependencies = [ + { name = "adjusttext", marker = "sys_platform == 'linux'" }, + { name = "astropy", marker = "sys_platform == 'linux'" }, + { name = "camb", marker = "sys_platform == 'linux'" }, + { name = "clmm", marker = "sys_platform == 'linux'" }, + { name = "colorama", marker = "sys_platform == 'linux'" }, + { name = "cosmo-numba", marker = "sys_platform == 'linux'" }, + { name = "cs-util", marker = "sys_platform == 'linux'" }, + { name = "emcee", marker = "sys_platform == 'linux'" }, + { name = "getdist", marker = "sys_platform == 'linux'" }, + { name = "h5py", marker = "sys_platform == 'linux'" }, + { name = "healpy", marker = "sys_platform == 'linux'" }, + { name = "healsparse", marker = "sys_platform == 'linux'" }, + { name = "importlib-metadata", marker = "sys_platform == 'linux'" }, + { name = "joblib", marker = "sys_platform == 'linux'" }, + { name = "jupyter", marker = "sys_platform == 'linux'" }, + { name = "jupyterlab", marker = "sys_platform == 'linux'" }, + { name = "jupytext", marker = "sys_platform == 'linux'" }, + { name = "lenspack", marker = "sys_platform == 'linux'" }, + { name = "lmfit", marker = "sys_platform == 'linux'" }, + { name = "matplotlib", marker = "sys_platform == 'linux'" }, + { name = "numba", marker = "sys_platform == 'linux'" }, + { name = "numexpr", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "opencv-python-headless", marker = "sys_platform == 'linux'" }, + { name = "pandas", marker = "sys_platform == 'linux'" }, + { name = "pyarrow", marker = "sys_platform == 'linux'" }, + { name = "pyccl", marker = "sys_platform == 'linux'" }, + { name = "pymaster", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "regions", marker = "sys_platform == 'linux'" }, + { name = "reproject", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, + { name = "seaborn", marker = "sys_platform == 'linux'" }, + { name = "shear-psf-leakage", marker = "sys_platform == 'linux'" }, + { name = "skyproj", marker = "sys_platform == 'linux'" }, + { name = "statsmodels", marker = "sys_platform == 'linux'" }, + { name = "tqdm", marker = "sys_platform == 'linux'" }, + { name = "treecorr", marker = "sys_platform == 'linux'" }, + { name = "uncertainties", marker = "sys_platform == 'linux'" }, +] + +[package.optional-dependencies] +develop = [ + { name = "myst-parser", marker = "sys_platform == 'linux'" }, + { name = "numpydoc", marker = "sys_platform == 'linux'" }, + { name = "pytest", marker = "sys_platform == 'linux'" }, + { name = "pytest-cov", marker = "sys_platform == 'linux'" }, + { name = "ruff", marker = "sys_platform == 'linux'" }, + { name = "sphinx", marker = "sys_platform == 'linux'" }, + { name = "sphinxawesome-theme", marker = "sys_platform == 'linux'" }, + { name = "sphinxcontrib-bibtex", marker = "sys_platform == 'linux'" }, +] +docs = [ + { name = "myst-parser", marker = "sys_platform == 'linux'" }, + { name = "numpydoc", marker = "sys_platform == 'linux'" }, + { name = "sphinx", marker = "sys_platform == 'linux'" }, + { name = "sphinxawesome-theme", marker = "sys_platform == 'linux'" }, + { name = "sphinxcontrib-bibtex", marker = "sys_platform == 'linux'" }, +] +glass = [ + { name = "cosmology", marker = "sys_platform == 'linux'" }, + { name = "fitsio", marker = "sys_platform == 'linux'" }, + { name = "glass", marker = "sys_platform == 'linux'" }, + { name = "glass-ext-camb", marker = "sys_platform == 'linux'" }, +] +test = [ + { name = "pytest", marker = "sys_platform == 'linux'" }, + { name = "pytest-cov", marker = "sys_platform == 'linux'" }, + { name = "ruff", marker = "sys_platform == 'linux'" }, +] +workflow = [ + { name = "mpi4py", marker = "sys_platform == 'linux'" }, + { name = "snakemake", marker = "sys_platform == 'linux'" }, +] + +[package.metadata] +requires-dist = [ + { name = "adjusttext" }, + { name = "astropy", specifier = ">=5.0" }, + { name = "camb", specifier = ">=1.6" }, + { name = "clmm" }, + { name = "colorama" }, + { name = "cosmo-numba", git = "https://github.com/aguinot/cosmo-numba.git?rev=main" }, + { name = "cosmology", marker = "extra == 'glass'", specifier = "==2022.10.9" }, + { name = "cs-util", git = "https://github.com/CosmoStat/cs_util.git?rev=develop" }, + { name = "emcee" }, + { name = "fitsio", marker = "extra == 'glass'" }, + { name = "getdist", git = "https://github.com/benabed/getdist.git?rev=113cd22a9a0d013b6f72fe734be81f260f3d3be5" }, + { name = "glass", marker = "extra == 'glass'", specifier = "==2025.1" }, + { name = "glass-ext-camb", marker = "extra == 'glass'", specifier = "==2023.6" }, + { name = "h5py" }, + { name = "healpy" }, + { name = "healsparse" }, + { name = "importlib-metadata" }, + { name = "joblib", specifier = ">=0.13" }, + { name = "jupyter" }, + { name = "jupyterlab" }, + { name = "jupytext", specifier = ">=1.15" }, + { name = "lenspack" }, + { name = "lmfit" }, + { name = "matplotlib" }, + { name = "mpi4py", marker = "extra == 'workflow'" }, + { name = "myst-parser", marker = "extra == 'docs'", specifier = ">=4.0" }, + { name = "numba" }, + { name = "numexpr" }, + { name = "numpy", specifier = ">=2.0" }, + { name = "numpydoc", marker = "extra == 'docs'", specifier = ">=1.8" }, + { name = "opencv-python-headless" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyccl" }, + { name = "pymaster" }, + { name = "pytest", marker = "extra == 'test'" }, + { name = "pytest-cov", marker = "extra == 'test'" }, + { name = "pyyaml" }, + { name = "regions" }, + { name = "reproject" }, + { name = "ruff", marker = "extra == 'test'" }, + { name = "scipy", specifier = "<1.18" }, + { name = "seaborn" }, + { name = "shear-psf-leakage", git = "https://github.com/CosmoStat/shear_psf_leakage.git?rev=develop" }, + { name = "skyproj" }, + { name = "snakemake", marker = "extra == 'workflow'" }, + { name = "sp-validation", extras = ["test", "docs"], marker = "extra == 'develop'" }, + { name = "sphinx", marker = "extra == 'docs'", specifier = ">=8.0" }, + { name = "sphinxawesome-theme", marker = "extra == 'docs'", specifier = ">=5.3,!=6.0.3" }, + { name = "sphinxcontrib-bibtex", marker = "extra == 'docs'", specifier = ">=2.6" }, + { name = "statsmodels" }, + { name = "tqdm" }, + { name = "treecorr", specifier = ">=5.0" }, + { name = "uncertainties" }, +] +provides-extras = ["test", "docs", "glass", "workflow", "develop"] + +[[package]] +name = "sphinx" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster", marker = "sys_platform == 'linux'" }, + { name = "babel", marker = "sys_platform == 'linux'" }, + { name = "docutils", marker = "sys_platform == 'linux'" }, + { name = "imagesize", marker = "sys_platform == 'linux'" }, + { name = "jinja2", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pygments", marker = "sys_platform == 'linux'" }, + { name = "requests", marker = "sys_platform == 'linux'" }, + { name = "roman-numerals", marker = "sys_platform == 'linux'" }, + { name = "snowballstemmer", marker = "sys_platform == 'linux'" }, + { name = "sphinxcontrib-applehelp", marker = "sys_platform == 'linux'" }, + { name = "sphinxcontrib-devhelp", marker = "sys_platform == 'linux'" }, + { name = "sphinxcontrib-htmlhelp", marker = "sys_platform == 'linux'" }, + { name = "sphinxcontrib-jsmath", marker = "sys_platform == 'linux'" }, + { name = "sphinxcontrib-qthelp", marker = "sys_platform == 'linux'" }, + { name = "sphinxcontrib-serializinghtml", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, +] + +[[package]] +name = "sphinxawesome-theme" +version = "6.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4", marker = "sys_platform == 'linux'" }, + { name = "sphinx", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/3f/ba7f8dc2837c0ac362127c6cd491578c23ac4d4e8cc6a37726531be29256/sphinxawesome_theme-6.0.5.tar.gz", hash = "sha256:ed3d82b7f0e30e3d6f38f5245d89775e9472a80a45ffd73d6a0a4b9d05ac5736", size = 343775, upload-time = "2026-06-15T15:09:36.094Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/5c/31521b6a35410cdced12af394b715387537a262bdd1bcf08b2a34a9a4df9/sphinxawesome_theme-6.0.5-py3-none-any.whl", hash = "sha256:c18e60b06f164f181e3ef7540a4a237f1cf4e82d8909a964e5c65e6e8293f51c", size = 376755, upload-time = "2026-06-15T15:09:34.523Z" }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, +] + +[[package]] +name = "sphinxcontrib-bibtex" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils", marker = "sys_platform == 'linux'" }, + { name = "pybtex", marker = "sys_platform == 'linux'" }, + { name = "pybtex-docutils", marker = "sys_platform == 'linux'" }, + { name = "sphinx", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/6a/8e0b2c2420286389e7fed78ff361ec30e2f1d58c8560af8d64df5e7b61e0/sphinxcontrib_bibtex-2.7.0.tar.gz", hash = "sha256:fee700f7aae29bb8f654c62913f00d34ac44fc0b8ca0fa67ac922ff4453addee", size = 120669, upload-time = "2026-05-06T09:29:24.935Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/c0/d28e62407f4733bbe0169287bc012f0ac3b4a2021066b285570654119c8b/sphinxcontrib_bibtex-2.7.0-py3-none-any.whl", hash = "sha256:28cf0ec7a957d1c7548d5749317ed472ce877e1b629f430f88e3789aa51f87b1", size = 40287, upload-time = "2026-05-06T09:29:23.253Z" }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "(platform_machine == 'AMD64' and sys_platform == 'linux') or (platform_machine == 'WIN32' and sys_platform == 'linux') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'amd64' and sys_platform == 'linux') or (platform_machine == 'ppc64le' and sys_platform == 'linux') or (platform_machine == 'win32' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux')" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/f1/a7a892f18d4d224e6b26f706531eafccc41e37594d37d304786969ee13cb/sqlalchemy-2.0.51.tar.gz", hash = "sha256:804dccd8a4a6242c4e30ad961e540e18a588f6527202f2d6791b01845d59fdc9", size = 9912201, upload-time = "2026-06-15T15:41:20.012Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/1c/71ee0f8a6b9d7316a1ccd30430b4c62b6c2e36adc96017a4e3a72dce49d6/sqlalchemy-2.0.51-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581921d849d6e6f994d560389192955e80e2950e18fcdfe2ccea863e01158e6e", size = 3343835, upload-time = "2026-06-15T16:19:42.613Z" }, + { url = "https://files.pythonhosted.org/packages/2b/7c/7ab9f9aadc5944fdd06612484ed7918fe376ad871a5f50404dc1536e0194/sqlalchemy-2.0.51-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d21ce524ab86c23046e992a5b81cb54c21079c6df6e78b8fc77d77cac70a6b9", size = 3358470, upload-time = "2026-06-15T16:26:38.011Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7d/ff77169fee6186de145a7f2b87006c39638391130abbab2b1f63ac6ea583/sqlalchemy-2.0.51-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c5d98a2709840027f5a347c3af0a7c3d5f6c1ff93af2ca1c54494e23cba8f389", size = 3289874, upload-time = "2026-06-15T16:19:45.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/3b/6c505903710d781b55bc3141ee34a062bf9745a6b5bc7333305b9ed63b33/sqlalchemy-2.0.51-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1181256e0f16479691b5616d36375dc2620ad8332b25978763c3d206ad3f3f1d", size = 3321692, upload-time = "2026-06-15T16:26:39.747Z" }, + { url = "https://files.pythonhosted.org/packages/17/6b/2dce8369b199cb855110e056032f94a9f66dacc2237d3d39c115a86eac56/sqlalchemy-2.0.51-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:483b11bd46bf35fc14c52faf338b04300c9e6ce554bce9b11be85bfec3bc3195", size = 3284735, upload-time = "2026-06-15T16:19:46.934Z" }, + { url = "https://files.pythonhosted.org/packages/53/ff/dbc495b8a14da840faffb353857a72d4190113cac33727906fb997047f0f/sqlalchemy-2.0.51-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1bed1ee8b01da6088210aa9412023326fb98a599ba502e6118308601dcbef77f", size = 3302756, upload-time = "2026-06-15T16:26:41.336Z" }, + { url = "https://files.pythonhosted.org/packages/cf/d5/fde8f4dddcf518ee15ab35a7c6a28acc32c8ba548d1d2aa451f96e6dbb0b/sqlalchemy-2.0.51-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:72ca54c952107ba5cd58854b67a5a6268631289d21651a1235396f3b98b47400", size = 3232055, upload-time = "2026-06-15T16:19:49.286Z" }, + { url = "https://files.pythonhosted.org/packages/67/d1/43d3a0ac955a58601c24fa23038b1c55ee3a1ec02c0f96ebb1eae2bcf614/sqlalchemy-2.0.51-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b3e693d15533a45cd5906f0589f9c35090bef6ef45bf1e8195c424aa0ae06a8d", size = 3269850, upload-time = "2026-06-15T16:26:43.017Z" }, + { url = "https://files.pythonhosted.org/packages/23/6b/2e0e38cf75c8780eca78d9b2e78164f8bcfd70125e5caa588ff5cbb9c9f4/sqlalchemy-2.0.51-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c45a496d6bc05dec41dcd4c3a2b183723f47473255c159cd80b503c8f246424d", size = 3282539, upload-time = "2026-06-15T16:19:51.065Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a1/e77854cb5336fd37dc3c6ae3b71de242c98caac5725120be0b526b31cbd0/sqlalchemy-2.0.51-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4004ada0aafe8ae1991b2cd1d99c6d9146126e123bd6f883c260d974aa012e54", size = 3287545, upload-time = "2026-06-15T16:26:44.735Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ab/9e17272fd4dac8df3b83c4fbe52b998a1c9d89a843c8c35ff29b74ff7364/sqlalchemy-2.0.51-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0f6bcad487aee1c638d707235682fc96f741de00663619881ab235400d03289e", size = 3230929, upload-time = "2026-06-15T16:19:52.625Z" }, + { url = "https://files.pythonhosted.org/packages/02/3c/52f408ea701781caee975606beccc48845f2aee8711ac29843d612c0306c/sqlalchemy-2.0.51-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:39a76529db6305693d8d4affa58ad5b5e2e18edd62daea628b29b97930b3513d", size = 3252888, upload-time = "2026-06-15T16:26:46.454Z" }, + { url = "https://files.pythonhosted.org/packages/bf/90/a1bb5c7cbba76b7bc1fbd586d0a5479a7bc9c27b4a8298f22ec9423b2bb3/sqlalchemy-2.0.51-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c6b36ed71f41942bdcd2ad2522be46bfce09d5705be5640ecf19bbc7660e4b7", size = 3566534, upload-time = "2026-06-15T15:58:35.024Z" }, + { url = "https://files.pythonhosted.org/packages/15/4b/481f1fed30e0e9e8dd24aecbb49f29eb57fe7657ece5cf06ee9b84bb97d8/sqlalchemy-2.0.51-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c2c62877097e1a0db401fba5cb4debee33265e5b2a55c4ccb489c02c53b4f72", size = 3535844, upload-time = "2026-06-15T16:02:43.973Z" }, + { url = "https://files.pythonhosted.org/packages/02/71/0aa64aeda645510af0a43f7d9ee70932f0d1dc4263aed34c50ee891d9df3/sqlalchemy-2.0.51-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0378d055e9e8cd6ce4d8dff683bdd3d7d413533c4ee51d67a2b1e0f9eacc0f23", size = 3475355, upload-time = "2026-06-15T15:58:36.592Z" }, + { url = "https://files.pythonhosted.org/packages/05/db/6061db32316446135a3abae5f308d144ab988a34234726042da3e58b1c63/sqlalchemy-2.0.51-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6e46fc36029eff666391e0531e5387b62ce6c4f1d8e50b3fb3099eaca1b42522", size = 3486591, upload-time = "2026-06-15T16:02:45.346Z" }, + { url = "https://files.pythonhosted.org/packages/e2/22/dbf013a12ec759e54a34a119e9e217435b3f71b2dd5c61a7ade0a25dae87/sqlalchemy-2.0.51-py3-none-any.whl", hash = "sha256:bb024d8b621d0be75f4f44ecc7c950450026e76d66dc8f791bb5331d7fed59d5", size = 1944334, upload-time = "2026-06-15T16:09:22.418Z" }, +] + +[[package]] +name = "sqlmodel" +version = "0.0.37" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic", marker = "sys_platform == 'linux'" }, + { name = "sqlalchemy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/26/1d2faa0fd5a765267f49751de533adac6b9ff9366c7c6e7692df4f32230f/sqlmodel-0.0.37.tar.gz", hash = "sha256:d2c19327175794faf50b1ee31cc966764f55b1dedefc046450bc5741a3d68352", size = 85527, upload-time = "2026-02-21T16:39:47.038Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/e1/7c8d18e737433f3b5bbe27b56a9072a9fcb36342b48f1bef34b6da1d61f2/sqlmodel-0.0.37-py3-none-any.whl", hash = "sha256:2137a4045ef3fd66a917a7717ada959a1ceb3630d95e1f6aaab39dd2c0aef278", size = 27224, upload-time = "2026-02-21T16:39:47.781Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens", marker = "sys_platform == 'linux'" }, + { name = "executing", marker = "sys_platform == 'linux'" }, + { name = "pure-eval", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "stats" +version = "0.1.2a0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/43/f2d8d8e2660740ecca9c0fab85a07bc02da27d1fcc5071ee481082888720/stats-0.1.2a.tar.gz", hash = "sha256:854e59fa99f92ce8319c16149ef8e9939dba3e2237bbb0fb6a6094c60155bd4c", size = 127625, upload-time = "2010-12-31T09:02:15.131Z" } + +[[package]] +name = "statsmodels" +version = "0.14.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "pandas", marker = "sys_platform == 'linux'" }, + { name = "patsy", marker = "sys_platform == 'linux'" }, + { name = "scipy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/81/e8d74b34f85285f7335d30c5e3c2d7c0346997af9f3debf9a0a9a63de184/statsmodels-0.14.6.tar.gz", hash = "sha256:4d17873d3e607d398b85126cd4ed7aad89e4e9d89fc744cdab1af3189a996c2a", size = 20689085, upload-time = "2025-12-05T23:08:39.522Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/f5/3a73b51e6450c31652c53a8e12e24eac64e3824be816c0c2316e7dbdcb7d/statsmodels-0.14.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c00a42863e4f4733ac9d078bbfad816249c01451740e6f5053ecc7db6d6368", size = 10058649, upload-time = "2025-12-05T23:10:12.775Z" }, + { url = "https://files.pythonhosted.org/packages/81/68/dddd76117df2ef14c943c6bbb6618be5c9401280046f4ddfc9fb4596a1b8/statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b58cf7474aa9e7e3b0771a66537148b2df9b5884fbf156096c0e6c1ff0469d", size = 10339446, upload-time = "2025-12-05T23:10:28.503Z" }, + { url = "https://files.pythonhosted.org/packages/56/4a/dce451c74c4050535fac1ec0c14b80706d8fc134c9da22db3c8a0ec62c33/statsmodels-0.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e7dcc5e9587f2567e52deaff5220b175bf2f648951549eae5fc9383b62bc37", size = 10368705, upload-time = "2025-12-05T23:10:44.339Z" }, + { url = "https://files.pythonhosted.org/packages/ee/77/0ec96803eba444efd75dba32f2ef88765ae3e8f567d276805391ec2c98c6/statsmodels-0.14.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89ee7d595f5939cc20bf946faedcb5137d975f03ae080f300ebb4398f16a5bd4", size = 10060269, upload-time = "2025-12-05T23:11:46.338Z" }, + { url = "https://files.pythonhosted.org/packages/10/b9/fd41f1f6af13a1a1212a06bb377b17762feaa6d656947bf666f76300fc05/statsmodels-0.14.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:730f3297b26749b216a06e4327fe0be59b8d05f7d594fb6caff4287b69654589", size = 10324155, upload-time = "2025-12-05T23:12:01.805Z" }, + { url = "https://files.pythonhosted.org/packages/ee/0f/a6900e220abd2c69cd0a07e3ad26c71984be6061415a60e0f17b152ecf08/statsmodels-0.14.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f1c08befa85e93acc992b72a390ddb7bd876190f1360e61d10cf43833463bc9c", size = 10349765, upload-time = "2025-12-05T23:12:18.018Z" }, + { url = "https://files.pythonhosted.org/packages/c1/98/b0dfb4f542b2033a3341aa5f1bdd97024230a4ad3670c5b0839d54e3dcab/statsmodels-0.14.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e443e7077a6e2d3faeea72f5a92c9f12c63722686eb80bb40a0f04e4a7e267ad", size = 10090802, upload-time = "2025-12-05T23:13:20.653Z" }, + { url = "https://files.pythonhosted.org/packages/34/0e/2408735aca9e764643196212f9069912100151414dd617d39ffc72d77eee/statsmodels-0.14.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3414e40c073d725007a6603a18247ab7af3467e1af4a5e5a24e4c27bc26673b4", size = 10337587, upload-time = "2025-12-05T23:13:37.597Z" }, + { url = "https://files.pythonhosted.org/packages/0f/36/4d44f7035ab3c0b2b6a4c4ebb98dedf36246ccbc1b3e2f51ebcd7ac83abb/statsmodels-0.14.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a518d3f9889ef920116f9fa56d0338069e110f823926356946dae83bc9e33e19", size = 10363350, upload-time = "2025-12-05T23:13:53.08Z" }, +] + +[[package]] +name = "swig" +version = "4.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/99/0556919f96b1c291a7ff83793adb328e2a1a5e6cfb379d5acc637cdec959/swig-4.4.1.tar.gz", hash = "sha256:db9a625653f6454530a6c6553d17cf576d7aa2d253c76dc8cdd5979f0cb15012", size = 25956, upload-time = "2025-12-27T03:25:49.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/4d/860e5475fe38b9c7dc36f61d0c370a62b6cc725d2bd11ada1d22a60ff5f7/swig-4.4.1-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:520fde8805b4775ef3814576929b8c44d666220b06d8da625f292192f9e74fe8", size = 1917511, upload-time = "2025-12-27T03:25:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/84/e1/5cd4de23ff2b1d225279f7c7826191b1dbdb77fc858fe12ee7be2562ddb7/swig-4.4.1-py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d8cca45a0e8d1e045a1490ea2d05bc1c49e2c266dbbe5954048e2a93d125ee07", size = 2066284, upload-time = "2025-12-27T03:25:19.624Z" }, + { url = "https://files.pythonhosted.org/packages/96/42/d49992f3c39c90d3d46c431a4afea60fc16bae542cf07f394b298a1b21b5/swig-4.4.1-py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:bfe6ce6189fc8b983f65f5ed3db8e1d8be03accb0ec3869f986a8343f014e4d9", size = 1912492, upload-time = "2025-12-27T03:25:21.843Z" }, + { url = "https://files.pythonhosted.org/packages/10/2e/4baa50fcf932f9d58bc8394b211c7daf3b7ec1e53c08d560142f1bc99cb9/swig-4.4.1-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9c98d7b882b6debe3cbb87e6503858e104162d7ce5ab4cfc23425da2e26e51b5", size = 1979872, upload-time = "2025-12-27T03:25:23.48Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7b/e3a14d053fa18b0d2e14efcc21883816964ddbe52a0c43018e195a99aba2/swig-4.4.1-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ae3da2bf679a4c942a2c100789395d4d167e7da8286018124e4665f5eff43e31", size = 1895896, upload-time = "2025-12-27T03:25:24.98Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a6/c961a911385a4cc4ae10b4dcbcf5dede0407530e59870ce6e4f7bacce47d/swig-4.4.1-py3-none-manylinux_2_24_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7945f153f7fc93f1ab280f44a3740d6bbfeec3829f954784ba83990fc61a11a8", size = 1912119, upload-time = "2025-12-27T03:25:27.661Z" }, + { url = "https://files.pythonhosted.org/packages/86/4b/a08a2673a2fd3185932db110de67a9f6fdfcece6bf9220e18502bf745f7e/swig-4.4.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5a9c74b87151d8247d802bda33f78cab9f27c759f0605b760a8f9c9893b5606b", size = 1885810, upload-time = "2025-12-27T03:25:29.562Z" }, + { url = "https://files.pythonhosted.org/packages/7e/38/efa343b506221a9d43bb1132f08b29fcb07d4113165f598d8a1ea733a1e4/swig-4.4.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a95ae66aebb8ccce4c50febd496e6927b888d98aba272dd5642fe9312bf61a3b", size = 2950985, upload-time = "2025-12-27T03:25:31.586Z" }, + { url = "https://files.pythonhosted.org/packages/de/0b/5b46e61798982f3cb0ed54fc30a30bad5fa6e3bdd1d9177e439976f7a7e5/swig-4.4.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a8f06227e6472832dad3ae34d5bd88710b7bbb109f2927e14a21e6725146e944", size = 2781782, upload-time = "2025-12-27T03:25:33.534Z" }, + { url = "https://files.pythonhosted.org/packages/17/e6/a15efd9cbf39b1289ee7c1acb8d18824a0c2532b85cdbd93acfdf15ee000/swig-4.4.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:98d61b45215982dd3a71745dfc31599176ed79d286b58bc712c10ed031432fdf", size = 3272993, upload-time = "2025-12-27T03:25:35.862Z" }, + { url = "https://files.pythonhosted.org/packages/d6/fa/516b95f9966c57acf1da9f2eb22e4e63104452d6e28686d57b216171ee7c/swig-4.4.1-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:b6909a8bd68037ea0df061a52c664431b062dbdfb1eb90768719518c120139d1", size = 3189093, upload-time = "2025-12-27T03:25:38.158Z" }, + { url = "https://files.pythonhosted.org/packages/0c/03/88ca92d3d8e9dd765a66985202db23745bd26a368570a8d8db9a218bfe90/swig-4.4.1-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:6a6a6331a5c7759ba5a910aa83aa5d33022b8e691b6cb466635c7fc2238facd2", size = 2967789, upload-time = "2025-12-27T03:25:40.24Z" }, + { url = "https://files.pythonhosted.org/packages/bf/97/5ca3d750f294048c983edfad1f2ad093a83480494fccb2f2e2496304f965/swig-4.4.1-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:2d076358cded172d2f44b3c617923c593dbae664b3fa45051641f028f7f74010", size = 3203253, upload-time = "2025-12-27T03:25:41.953Z" }, + { url = "https://files.pythonhosted.org/packages/97/44/96586955c0f08b0b9b6c8b2b68ecb43a815da94d5362cfb6691ede3b9fdf/swig-4.4.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:43a0a876b4660f6addb6ae72d14a72324dc1388e1c168ed38bb00fd123048749", size = 3060721, upload-time = "2025-12-27T03:25:44.322Z" }, +] + +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + +[[package]] +name = "tables" +version = "3.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "blosc2", marker = "sys_platform == 'linux'" }, + { name = "numexpr", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "py-cpuinfo", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/a3/d213ebe7376d48055bd55a29cd9f99061afa0dcece608f94a5025d797b0a/tables-3.11.1.tar.gz", hash = "sha256:78abcf413091bc7c1e4e8c10fbbb438d1ac0b5a87436c5b972c3e8253871b6fb", size = 4790533, upload-time = "2026-03-01T11:43:36.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/a3/ec228901fca4c996306b17f5c60a4105144df0bbd07b3a4a816f91f37b4a/tables-3.11.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56bf6fb9132ead989b7e76695d7613d6d08f071a8019038d6565ba90c66b9f3e", size = 6903733, upload-time = "2026-03-01T11:42:58.349Z" }, + { url = "https://files.pythonhosted.org/packages/99/29/c2dc674ea70fa9a4819417289a9c0d3e4780835beeed573eb66964cfb763/tables-3.11.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1e78fe190fdeb4afe430b79651bae2a4f341904eb85aa8dbafe5f1caee1c7f67", size = 7241357, upload-time = "2026-03-01T11:43:03.938Z" }, + { url = "https://files.pythonhosted.org/packages/59/3c/f4a694aa744d2b14d536e172c28dd70c84445f4787083a82d6d44a39e39f/tables-3.11.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a9c35f87fcb6a48c79fbc4e3ab15ca8f6053c4ce13063d6ca2ec36cbb58f40f", size = 7014135, upload-time = "2026-03-01T11:43:22.359Z" }, + { url = "https://files.pythonhosted.org/packages/45/82/94d4320d6c0fe5bd55230eec90cd142d58cda37b7cce00a318ac2a6abd93/tables-3.11.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4cf3218b76ba78d156d6ee75c19fb757d50682f6c7b4905370441afbfc9d77f3", size = 7349293, upload-time = "2026-03-01T11:43:27.569Z" }, +] + +[[package]] +name = "tables-io" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click", marker = "sys_platform == 'linux'" }, + { name = "deprecated", marker = "sys_platform == 'linux'" }, + { name = "h5py", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "pandas", marker = "sys_platform == 'linux'" }, + { name = "tables", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/12/1b/61bed3c55ce4602be5379362ce939b71a2e707e856ee497c1d1e72f8ff3d/tables_io-1.1.2.tar.gz", hash = "sha256:ea27eac8b22ff4e3500afd92140794bd41161f768a2c84520b91b3b58e945182", size = 91394, upload-time = "2026-06-18T16:21:20.896Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/68/025307ebd3c54c65e540d2a4ced11d0e5aa370c8ddb6d0e83066e5a39054/tables_io-1.1.2-py3-none-any.whl", hash = "sha256:4361e04dfcc10471bf9a3940d9ee6a1f903ac76ece51d32ef7fec7ea572b20c0", size = 39206, upload-time = "2026-06-18T16:21:19.577Z" }, +] + +[[package]] +name = "tabulate" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/46/58/8c37dea7bbf769b20d58e7ace7e5edfe65b849442b00ffcdd56be88697c6/tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d", size = 91754, upload-time = "2026-03-04T18:55:34.402Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/55/db07de81b5c630da5cbf5c7df646580ca26dfaefa593667fc6f2fe016d2e/tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3", size = 39814, upload-time = "2026-03-04T18:55:31.284Z" }, +] + +[[package]] +name = "tenacity" +version = "9.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/c6/ee486fd809e357697ee8a44d3d69222b344920433d3b6666ccd9b374630c/tenacity-9.1.4.tar.gz", hash = "sha256:adb31d4c263f2bd041081ab33b498309a57c77f9acf2db65aadf0898179cf93a", size = 49413, upload-time = "2026-02-07T10:45:33.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/c1/eb8f9debc45d3b7918a32ab756658a0904732f75e555402972246b0b8e71/tenacity-9.1.4-py3-none-any.whl", hash = "sha256:6095a360c919085f28c6527de529e76a06ad89b23659fa881ae0649b867a9d55", size = 28926, upload-time = "2026-02-07T10:45:32.24Z" }, +] + +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt' and sys_platform == 'linux'" }, + { name = "tornado", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701, upload-time = "2024-03-12T14:34:39.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154, upload-time = "2024-03-12T14:34:36.569Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "throttler" +version = "1.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/3f/47baf510c31e0e52ac0d80d9071e5e166ca069167fee4a6c13841f9d5f5f/throttler-1.2.3.tar.gz", hash = "sha256:d2f5b0b499d62f1fc984dcac8043450b606549b0097753a9c8a707f7427c27e1", size = 11792, upload-time = "2026-01-27T00:48:11.552Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/70/42d8796acc57c8bcd9ae395b1a6a0bbc833f738492a8ed192a44ccd58035/throttler-1.2.3-py3-none-any.whl", hash = "sha256:241ea3e97438dec4dc2f31ddc56dbd96262787a9b1d0598adfcc0bada1134b66", size = 9704, upload-time = "2026-01-27T00:48:09.544Z" }, +] + +[[package]] +name = "tifffile" +version = "2026.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/38/5e2ecef5af2f4fd4a89bb8d6240de9458bab4d51a4cbd97aeb3a0cd618e2/tifffile-2026.6.1.tar.gz", hash = "sha256:626c892c0e899d959b9438e7c0e1491dc154a7fead1f1f37a991724a50eceba9", size = 429694, upload-time = "2026-05-31T23:57:12.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/59/208f71d70ddc6184f79b8c6d87d46eb7d7b12c19186a817dec9c9c3f3693/tifffile-2026.6.1-py3-none-any.whl", hash = "sha256:0d7382d2769b855b81ce358528e2b40c16d48aa39031746efa81215205332a8d", size = 267108, upload-time = "2026-05-31T23:57:10.597Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" }, +] + +[[package]] +name = "toolz" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", hash = "sha256:27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b", size = 52613, upload-time = "2025-10-17T04:03:21.661Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", hash = "sha256:15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8", size = 58093, upload-time = "2025-10-17T04:03:20.435Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/24/95ec527ad67b76d59299e5465b3935d05e4294b7e0290a3924b7487df30b/tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2", size = 519252, upload-time = "2026-06-08T17:34:51.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" }, + { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" }, + { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" }, +] + +[[package]] +name = "tqdm" +version = "4.68.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/5f/57ff8b434839e70dab45601284ea413e947a63799891b7553e5960a793a8/tqdm-4.68.4.tar.gz", hash = "sha256:19829c9673638f2a0b8617da4cdcb927e831cd88bcfcb6e78d42a4d1af131520", size = 792418, upload-time = "2026-07-07T09:58:18.369Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/2a/5e5e750890ada51017d18d0d4c30da696e5b5bd3180947729927628fc3cb/tqdm-4.68.4-py3-none-any.whl", hash = "sha256:5168118b2368f48c561afda8020fd79195b1bdb0bdf8086b88442c267a315dc2", size = 676612, upload-time = "2026-07-07T09:58:16.256Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/a9/a2584b8313b89f94869ddb3c4074617a691de1812a614d2d50e32ca5a7a6/traitlets-5.15.1.tar.gz", hash = "sha256:7b1c07854fe25acb39e009bae49f11b79ff6cbb2f27999104e9110e7a6b53722", size = 163344, upload-time = "2026-06-03T12:26:06.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl", hash = "sha256:770a53705f84b81ac107e83a1b3328ff2dae16094d8fc3cfc004e4b22dfd8e92", size = 85858, upload-time = "2026-06-03T12:26:04.395Z" }, +] + +[[package]] +name = "transformcl" +version = "2026.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "array-api-compat", marker = "sys_platform == 'linux'" }, + { name = "flt", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/ce/ae8373b67259c3ea6033425161f7d195387b1e68b17d4d00eee1b68e5edd/transformcl-2026.1.tar.gz", hash = "sha256:14551c33d164f3db24b9141f1f77553182a4b9c789f883476eb33d87ea4d8f13", size = 4850, upload-time = "2026-03-02T19:18:21.221Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/98/de7a05005238e03bdc57cd2885c27ad9140539bbaddf2b6ad2b2a0aa9863/transformcl-2026.1-py3-none-any.whl", hash = "sha256:fe9c380074ef783a4f854e0d326eadac677d6a35bc683e3b429d5b49a8e57223", size = 3597, upload-time = "2026-03-02T19:18:19.832Z" }, +] + +[[package]] +name = "treecorr" +version = "5.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lsstdesc-coord", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "pybind11", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, + { name = "setuptools", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5d/95/ff399cb37b9e3d7c758f8cf0d5757f06a38093f223f2a65d7cc5b50313d5/treecorr-5.1.3.tar.gz", hash = "sha256:d921ccace064325a8ebb93f371c624f13fcc9559373e3b37cc216cb94ae81ed2", size = 1146147, upload-time = "2026-03-18T18:38:03.626Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/74/1cc590e4fe1afb69ec2f10a67ee8e0a92ecafd36512052755362ff302d9c/treecorr-5.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596b6f5eea3115a9e211dc83ec6465887983f41b24e484e08fc47170c6cf4e26", size = 20941767, upload-time = "2026-03-18T18:37:37.874Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bb/5ba5aa1021fce0cf459fa264cb0d298dfd095ddb48d63fb6589b90fdefac/treecorr-5.1.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:660dacd47a9af18790de279bcb6e7f375369096ad77e7cc64bf21a9b78f6c430", size = 19785388, upload-time = "2026-03-18T18:37:40.573Z" }, + { url = "https://files.pythonhosted.org/packages/be/92/be01211263a4fa488e768c9288c6f9b0f4402870423a88de4d60031b3384/treecorr-5.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73c938c6c31e1bad4d5338ad4519d1d78eedf3b7ef579b1e3a19d983e220ed93", size = 20940568, upload-time = "2026-03-18T18:37:44.966Z" }, + { url = "https://files.pythonhosted.org/packages/dc/a3/69e5a16aa33600ba22d28a47c6d8de3b3118292e79f9ae77dc69a3df7c77/treecorr-5.1.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc17b1f623bae6769148f57cac8c3a295e26e5d6215698117bd97e14c8bb0d6b", size = 19781991, upload-time = "2026-03-18T18:37:47.468Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/92/ff/5a28bdfd8c3ebec42564ac7d0e54ca3db65044a9314a97f9564fa7a1e926/tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415", size = 198674, upload-time = "2026-07-10T08:50:37.887Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168, upload-time = "2026-07-10T08:50:36.46Z" }, +] + +[[package]] +name = "uncertainties" +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/0c/cb09f33b26955399c675ab378e4063ed7e48422d3d49f96219ab0be5eba9/uncertainties-3.2.3.tar.gz", hash = "sha256:76a5653e686f617a42922d546a239e9efce72e6b35411b7750a1d12dcba03031", size = 160492, upload-time = "2025-04-21T19:58:28.63Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/5e/f1e1dd319e35e962a4e00b33150a8868b6329cc1d19fd533436ba5488f09/uncertainties-3.2.3-py3-none-any.whl", hash = "sha256:313353900d8f88b283c9bad81e7d2b2d3d4bcc330cbace35403faaed7e78890a", size = 60118, upload-time = "2025-04-21T19:58:26.864Z" }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678, upload-time = "2023-06-21T01:49:05.374Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140, upload-time = "2023-06-21T01:49:03.467Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "vos" +version = "3.6.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aenum", marker = "sys_platform == 'linux'" }, + { name = "cadcutils", marker = "sys_platform == 'linux'" }, + { name = "html2text", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/6c/445bbedf2f90e71c09ff890aa8b409af5d074b1578eef383117cbcdfd09a/vos-3.6.4.tar.gz", hash = "sha256:67e4e24689ee881124b6670d7d2fc6527cc404687fc527fffc20cf5b1bd4c0bd", size = 103445, upload-time = "2025-12-12T00:20:56.398Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/21/e2d351883aa11b9175223a78d3a77b0fedf86461596cdbfb019893ca9260/vos-3.6.4-py3-none-any.whl", hash = "sha256:4a7b2248bad0f50da465a47ab1c819dff8378c189c184c2d8e2c17a714c62f17", size = 153404, upload-time = "2025-12-12T00:20:53.232Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, +] + +[[package]] +name = "webcolors" +version = "25.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d", size = 14905, upload-time = "2025-10-31T07:51:01.778Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websocket-client" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98", size = 70576, upload-time = "2025-10-07T21:16:36.495Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef", size = 82616, upload-time = "2025-10-07T21:16:34.951Z" }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" }, +] + +[[package]] +name = "wrapt" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/a4/282c8e64300a59fc834518a54bf0afabb4ff9218b5fa76958b450459a844/wrapt-2.2.2.tar.gz", hash = "sha256:0788e321027c999bf221b667bd4a54aaefd1a36283749a860ac3eb77daed0302", size = 129068, upload-time = "2026-06-20T23:49:44.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/b3/7e6e9fcf4fe7e1b69a49fe6cc5a44e8224bab6283c5233c97e132f14908e/wrapt-2.2.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2e096c9d39a59b35b63c9aacfbbbec2088ff51ff1fc31051acc60a07f42f273a", size = 169828, upload-time = "2026-06-20T23:48:02.719Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/894f132d857ed5a9904d937baf368badcbe5ea9e436e2f1930fe21c9f1f0/wrapt-2.2.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d1a6050405bf334be33bf66296f113563622972a34900ae6fa60fd283a1a900", size = 171544, upload-time = "2026-06-20T23:48:04.266Z" }, + { url = "https://files.pythonhosted.org/packages/29/de/3c833e03725b477e9ea34028224dd21a48781830101e4e036f77e8b6b102/wrapt-2.2.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10adb01371408c6de504a6658b9886480f1a4919a83752748a387a504a21df79", size = 160663, upload-time = "2026-06-20T23:48:05.708Z" }, + { url = "https://files.pythonhosted.org/packages/33/be/27edce350b24e3054d9d047f65f16d4c4d4c1f3f31c4278a1f8a95c723c8/wrapt-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3442eee2a5798f9b451f1b2cd7518ce8b7e28a2a364696c414460a0e295c012a", size = 169387, upload-time = "2026-06-20T23:48:07.243Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c4/9fd9679af8bf38e146652c7f47b6b352c3e5795b4ad1c0b7f94e15ac2aa7/wrapt-2.2.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6c99012a22f735a85eed7c4b86a3e99c30fdd57d9e115b2b45f796264b58d0bf", size = 158849, upload-time = "2026-06-20T23:48:08.91Z" }, + { url = "https://files.pythonhosted.org/packages/bc/c2/aa6c0c2206803068c6859dabe01f8c84c43744da93d4c67b8946d21655ee/wrapt-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b686cfc008776a3952d6213cb296ed7f45d782a8453936406faa89eac0835ab", size = 168147, upload-time = "2026-06-20T23:48:10.374Z" }, + { url = "https://files.pythonhosted.org/packages/15/ff/63ad96f98eb58a742b1a20d80f21da88924405910149950b912368150468/wrapt-2.2.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb18fc51e813df0d9c98049e3bf2298a5495a648602040e21fa3c7329371159e", size = 167882, upload-time = "2026-06-20T23:48:18.764Z" }, + { url = "https://files.pythonhosted.org/packages/20/1f/8bb62d8933df7acf3247194e6e9fc68edf9d2fa203252c89c94b319dd472/wrapt-2.2.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94b00b00f806eb3ef2abe9049ed45994a81ee9284884d96e6b8314927c6cea3d", size = 167411, upload-time = "2026-06-20T23:48:20.315Z" }, + { url = "https://files.pythonhosted.org/packages/17/09/8789dcb09ee1de715727db7521aabbb68ffa68dfade3a49468440cfced49/wrapt-2.2.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:62415fd095bc590b842b6d092f2b5d9ccbaeb7e0b28535c03dcea2718b48636b", size = 158607, upload-time = "2026-06-20T23:48:21.728Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/66e02562d53ee67d841f175e38e3c993c2d78a3e104c576cad61c028b43c/wrapt-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a41e758d80dc0ab8c210f641ac892009d356cf1f955d97db544c8dd317b4d14c", size = 166367, upload-time = "2026-06-20T23:48:23.177Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a3/832ac4e41222fb263b3042d42c2f08d305db7d0f0c9b1d3a271a9eede8f6/wrapt-2.2.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b84cd4058001c9727b0e9980b7a9e66325b5ca748b1b578e822cade1bc6b304f", size = 157176, upload-time = "2026-06-20T23:48:24.711Z" }, + { url = "https://files.pythonhosted.org/packages/b7/01/1bd5e4d2df9c0178989ac8da9186543465388588ee2ef153e2591accebef/wrapt-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:26fc73a1b15e0946d2942b9a4426d162b51676338327dc067ccd8d2d76385f94", size = 167025, upload-time = "2026-06-20T23:48:26.118Z" }, + { url = "https://files.pythonhosted.org/packages/18/1e/f060df47755e87b57684cee7bfc1362b204df55fac96ffebc0631b697b79/wrapt-2.2.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0065a3b657cec06813b4241d2462ccec287f6863103d7445b725fb3a889736f9", size = 203399, upload-time = "2026-06-20T23:48:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/c4/de/2316a757a1abb6453700b79d83e532146dcef2611348282d4d8889792161/wrapt-2.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30f7424af5c5c345b7f26490e097f74a2ef45b3d08b664dc33571aee3bd3b56c", size = 210461, upload-time = "2026-06-20T23:48:36.569Z" }, + { url = "https://files.pythonhosted.org/packages/ed/29/d1160785ae18ca2495a6d82a21154103d74f656c9fd457fb35f6b11b965a/wrapt-2.2.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:07fdcb012821859168641acf68afad61ef9783cf37100af85f152550e9677194", size = 195313, upload-time = "2026-06-20T23:48:38.175Z" }, + { url = "https://files.pythonhosted.org/packages/f5/2d/7caa9598ae61a9cf0989cc501739cbeeb7d650ab3193cca1407b9af0c6ab/wrapt-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f90038ab58fafb584801ca62d72384d7d5225d93c76f7b773c22fae545bd8066", size = 206116, upload-time = "2026-06-20T23:48:39.804Z" }, + { url = "https://files.pythonhosted.org/packages/ac/02/281ea1088b8650d865f311b35cf86fd21df89128e2909714f1161e01c9d0/wrapt-2.2.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:c5d7825491bfa2d08b97e9557768987952c7b9ae687d06c3320b40a37ccb7f20", size = 192668, upload-time = "2026-06-20T23:48:41.346Z" }, + { url = "https://files.pythonhosted.org/packages/be/7d/976e2d5b4b5c5babda40974edd54d0a5585cb60132ed86b46f4b80239b16/wrapt-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0ad520e6daa9bbf136f14de735474dbec7dcc0891f718e1d274ce8dc92e645af", size = 198891, upload-time = "2026-06-20T23:48:43.056Z" }, + { url = "https://files.pythonhosted.org/packages/74/eb/df7b7f0b631dbbc750f39be27d8b55f65777d8ac86da80e12be41a644c4b/wrapt-2.2.2-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0abfd648dac9ac9c5b3aa9b523d27f1789046640b58dcd5652a720ddb325e1fc", size = 167713, upload-time = "2026-06-20T23:48:52.598Z" }, + { url = "https://files.pythonhosted.org/packages/4d/9a/d1bd36f6d088c8e652a9383cabbd49af30b8c576302a7eccddbab6963e3f/wrapt-2.2.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4bfd8d1eb438153eff8b8cfe87f032ba65731e1ce06138b5090f745a33f6f95", size = 166779, upload-time = "2026-06-20T23:48:54.33Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ae/24ffacd4187fac2740a1972093929e836dea092d42c87d728cd98fee11a6/wrapt-2.2.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c427c9d06d859848a69f0d928fe28b5c33a941b2265d10a0e1f15cd244f1ee33", size = 158407, upload-time = "2026-06-20T23:48:55.944Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ed/974427668249a356051e8d67d47fa54ef6c777f0fcf3bae9d292c047d4b6/wrapt-2.2.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4250b43d1a129d947e083c4dc6baf333c9bb34edd26f912d5b0457841fc858ab", size = 166594, upload-time = "2026-06-20T23:48:57.617Z" }, + { url = "https://files.pythonhosted.org/packages/fb/5f/e1d7c6e4523f78db2fbd7826babd0348da1d5e0834c4f918b9ab5757dfae/wrapt-2.2.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:173e5bb5ca350a6e0abab60b7ec7cdd7992a814cb14b4de670a28f067f105663", size = 157068, upload-time = "2026-06-20T23:48:59.171Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c1/7ebd1027f00700c0b0233b20aceef2b4784294ed64971424c4a78e069e34/wrapt-2.2.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:aa14b01804bce36c6d63d7b6a4f55df390f29f8648cc13a1f40b166f4d54680d", size = 166470, upload-time = "2026-06-20T23:49:00.737Z" }, + { url = "https://files.pythonhosted.org/packages/4e/ea/1a89e6d3b7a83c3affe5c09cde77792c947e63e4bc85ad84cd5bb9abb0d8/wrapt-2.2.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:45c2f2768e790c9f8db90f239ef23a2af8e7570f25a35619ef902df4a738447f", size = 203362, upload-time = "2026-06-20T23:49:09.811Z" }, + { url = "https://files.pythonhosted.org/packages/19/d8/3b58763d9863b5a73771c0d97110f9595d248db454009e07e1535ee905a4/wrapt-2.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbf00ee0cb55ec24e2b0995a71942b85b21a066db8f3f46e1dbfdb9433ffba81", size = 210449, upload-time = "2026-06-20T23:49:11.521Z" }, + { url = "https://files.pythonhosted.org/packages/2d/6f/17fd9e053103d8be148d20d5d7505facc72d5fe1f9127973904ceaed79cf/wrapt-2.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2252f77663651b89255895f58cc6ac08fcb206d4371813e5af61bb62d4f7689c", size = 195349, upload-time = "2026-06-20T23:49:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/ef/04/d0d1ccaaa12cb7dccf28a23f0279a608ba498f71e81d949d5ed54bcfd5c1/wrapt-2.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cd7181ab1c31192ff5219269830744b5a62020b3a6d433588c4f1c95b8f8bff", size = 206099, upload-time = "2026-06-20T23:49:15.051Z" }, + { url = "https://files.pythonhosted.org/packages/44/b3/e8aa07b619890a2aa6cde1931b1887abb08820721b564a5f80b7ca3f3aa0/wrapt-2.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:6fe35fd51b74867d8b80174c277bd6bbf6a73e443f908129dc531c4b688a20d5", size = 192728, upload-time = "2026-06-20T23:49:16.854Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f0/1819fb50f0d3c9bd758d8a83b56f1b470dee8b5b8eac8702b7c137cea9d4/wrapt-2.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:11d95fc2fbad3163596c39d440e6f21ca9fccece74b56e30a37ac2fca786a07c", size = 198842, upload-time = "2026-06-20T23:49:18.504Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d2/6317eb6d4554855bbf12d61857774af34747bf88a42c19bf306de67e2fa3/wrapt-2.2.2-py3-none-any.whl", hash = "sha256:5bad217350f19ce99ca5b5e71d406765ea86fe541628426772b657375ee1c048", size = 61460, upload-time = "2026-06-20T23:49:42.966Z" }, +] + +[[package]] +name = "yte" +version = "1.9.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argparse-dataclass", marker = "sys_platform == 'linux'" }, + { name = "dpath", marker = "sys_platform == 'linux'" }, + { name = "pyyaml", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/f5/7e44620e6e077bfe624b9a17c329b8e0d0159e176e1f1a93c2790428ab2c/yte-1.9.4.tar.gz", hash = "sha256:86a47e6d722cec9419a7ac88be57d0d6c4ce28f02860393b71a66f2c674069f6", size = 8101, upload-time = "2025-11-27T12:55:00.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/63/6a44729fdc60eb255a7b156a84e7552290174a9bf151e3b6c18e83d6fbfa/yte-1.9.4-py3-none-any.whl", hash = "sha256:5dac63303d3e6bc2ebadc36ece3c3fb09343772fe6e25e9356d9baf8f9dfaf6d", size = 10618, upload-time = "2025-11-27T12:55:01.685Z" }, +] + +[[package]] +name = "zarr" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "donfig", marker = "sys_platform == 'linux'" }, + { name = "google-crc32c", marker = "sys_platform == 'linux'" }, + { name = "numcodecs", marker = "sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/8d/aeb164004f87543b06ef54f885d02c342c31ceb274e2bbec470a98927621/zarr-3.2.1.tar.gz", hash = "sha256:71565b738a0e7e8ed226f0516eba8c6bb53440ad7669a8c48ebb3534a161d035", size = 675161, upload-time = "2026-05-05T12:37:22.383Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/0a/469e2bd01be1490336e6c8707386845655d59261543315778a3ccc7e8019/zarr-3.2.1-py3-none-any.whl", hash = "sha256:f78cdd3d9687ad0e9f9cba2c5683b64f0c52589c19f685eeabe872e93cc0d2c7", size = 319617, upload-time = "2026-05-05T12:37:20.66Z" }, +] + +[[package]] +name = "zipp" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", size = 26214, upload-time = "2026-05-18T20:08:57.967Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", size = 10238, upload-time = "2026-05-18T20:08:57.045Z" }, +] + +[[package]] +name = "zope-interface" +version = "8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/08/dc/50550cfcbb2ea3cbca5f1d7ed05c8aa840f831a0f2d63aec0a953f7c590e/zope_interface-8.5.tar.gz", hash = "sha256:7a3ba1c5877f0f3e3906b02ddf793abed2becc2948116414ce0e1dd820b68d6d", size = 257957, upload-time = "2026-05-26T06:50:14.574Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/c3/005032195ff3b210c139b7c560ed5c534e844b0907d8e44d2b3d8919305e/zope_interface-8.5-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:e6347b8d8d12c5eca6502450a92be30079b7acfade2c4f693efa0deb8871b06e", size = 265296, upload-time = "2026-05-26T06:49:29.741Z" }, + { url = "https://files.pythonhosted.org/packages/c5/66/1036543d6a66bc04c19df3cf650f3ad938a002ab0a443c24e23e8de5e8b9/zope_interface-8.5-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5e970dabea777a24b0b0bbf9dae3ab75ce8b2d8e948edf4875627034b21f3560", size = 270689, upload-time = "2026-05-26T06:49:31.767Z" }, + { url = "https://files.pythonhosted.org/packages/30/4c/8b56259558cace4414e753ca6740396a1f59d4a95ddb55b4658600408670/zope_interface-8.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0b48ccadaa9839e09ff81e969703cecb3f402c813bfe8b958652e699bea69f5", size = 270280, upload-time = "2026-05-26T06:49:33.489Z" }, + { url = "https://files.pythonhosted.org/packages/aa/a5/692a2b8d70f78e848793231d5fae5fecbf8d0cccd73430fdc34802a6d3c1/zope_interface-8.5-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:7849ad8fa90763cc1087f4dda78ca3a233e950b3e08fac7079297c9cafbbd7bb", size = 265191, upload-time = "2026-05-26T06:49:43.449Z" }, + { url = "https://files.pythonhosted.org/packages/70/8d/454a9cfc7a050c394ab4f11b3371f7897828b7415e096afff724637e65e0/zope_interface-8.5-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5578c9421ca409a1f39f153d6f7803e4cde01da592ec75a9ac5e1b777d18d33b", size = 270626, upload-time = "2026-05-26T06:49:45.425Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/db8409cfa3575b8e9b4800babd7d49f8228433cd1f0c56814bd0ada49c33/zope_interface-8.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e1bd7d96b4ca5fa311f54c9eac16dce4886b428c1531dbe06067763ccdf123b4", size = 270444, upload-time = "2026-05-26T06:49:47.025Z" }, + { url = "https://files.pythonhosted.org/packages/32/67/bc8b4f465d388039255003e230c284a175cedf1203c692f23cb7bff64efe/zope_interface-8.5-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:3090e3a663d20194756a59a272e0c8508b889341e31d5894223331fe6b4f9b21", size = 266827, upload-time = "2026-05-26T06:49:54.873Z" }, + { url = "https://files.pythonhosted.org/packages/a7/eb/37d05b935ede53d79690fecc8d201440084418e590bcfc05f384451c7593/zope_interface-8.5-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9342fb74e2afefdb081bf1df727d209ea56995c6e13f5a0540e6d7aff4beafb8", size = 270139, upload-time = "2026-05-26T06:49:57.116Z" }, + { url = "https://files.pythonhosted.org/packages/8b/0b/fd0c54579e2ce8dc6cf1a757903f3374bc6fbda929a46af9e0f53cb0e5f0/zope_interface-8.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6c54725d818f1b57a7efb8b16528326e1f3c257b602b32393fd255c45af8799d", size = 270338, upload-time = "2026-05-26T06:49:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/d97430abd5ae9677e8b9295b58720c0064a5b557dbb6b8bf5928484cf0d8/zope_interface-8.5-cp314-cp314t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:14b0e9799351d4c34fe99afd67f0cdd76e55ba15c66a98699d5fc22ea8241e08", size = 294905, upload-time = "2026-05-26T06:50:07.384Z" }, + { url = "https://files.pythonhosted.org/packages/41/ec/a0f8f3dad6e74992f4654bdd94802be0929eabca7b871cac3b6fbb5e961b/zope_interface-8.5-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0cd6a732ac84b94eb1ef9222a117347a27efd294ee16810ffdf7ecd307677ed5", size = 300885, upload-time = "2026-05-26T06:50:08.997Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/6881b48803a0ee8d23eb5efa30fce3ed218a2bd9de5758ce489d224fee81/zope_interface-8.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:798b7c87d0e59a7d5d086d642208d0d8700ff0d55c4029134b3c479c3bfb110f", size = 304672, upload-time = "2026-05-26T06:50:10.563Z" }, +] diff --git a/workflow/common.py b/workflow/common.py index 3df3413b..694518c8 100644 --- a/workflow/common.py +++ b/workflow/common.py @@ -7,17 +7,13 @@ # Output roots are env-overridable so a reproduction run can write into a # fresh tree without clobbering (or silently reusing) prior products. -COSMO_VAL = Path( - os.environ.get( - "COSMO_VAL", "/n17data/cdaley/unions/code/sp_validation/cosmo_val/output" - ) -) +SP_VALIDATION = Path(__file__).resolve().parents[1] +COSMO_VAL = Path(os.environ.get("COSMO_VAL", SP_VALIDATION / "results/cosmo_val")) COSMO_INFERENCE = Path( - os.environ.get( - "COSMO_INFERENCE", "/n17data/cdaley/unions/code/sp_validation/cosmo_inference" - ) + os.environ.get("COSMO_INFERENCE", SP_VALIDATION / "cosmo_inference") ) -CAT_CONFIG = "/n17data/cdaley/unions/code/sp_validation/cosmo_val/cat_config.yaml" +CAT_CONFIG = SP_VALIDATION / "cosmo_val/cat_config.yaml" + BLINDS = ["A", "B", "C"] BLOCK_PAIRS = [("++", "1"), ("--", "2"), ("+-", "3")] @@ -37,6 +33,7 @@ "min_sep": r"[0-9.]+", "max_sep": r"[0-9.]+", "gaussian": r"(g|ng)", + "probe": r"(wl|ggl|3x2pt)", "block_pm": r"(\+\+|--|\+-)", "block_i": r"[123]", "mask_suffix": r"(_masked)?", @@ -46,15 +43,17 @@ FIDUCIAL = None DEFAULT_MASK_SUFFIX = "" +DEFAULT_PROBE = "wl" CATALOG_CONFIG = None PLANCK18 = None def configure(workflow_config): """Install config-derived values after Snakemake has loaded configfiles.""" - global CATALOG_CONFIG, DEFAULT_MASK_SUFFIX, FIDUCIAL, PLANCK18 + global CATALOG_CONFIG, DEFAULT_MASK_SUFFIX, DEFAULT_PROBE, FIDUCIAL, PLANCK18 CATALOG_CONFIG = workflow_config FIDUCIAL = workflow_config["fiducial"] + DEFAULT_PROBE = workflow_config.get("probe") or "wl" DEFAULT_MASK_SUFFIX = ( "_masked" if workflow_config["covariance"].get("default_masked", False) else "" ) @@ -76,44 +75,78 @@ def resolve_covariance_version(version): return version +# Single source of truth for the covariance naming scheme. Rule outputs use +# this with wildcards left in braces; covariance_base() fills concrete values. +# Keep the two in sync by construction: covariance_base() formats this string. +COV_BASE_TEMPLATE = ( + "covariance_{version}_{blind}_{gaussian}" + "_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}_{probe}{mask_suffix}" +) + + +def cov_output(suffix): + """Wildcard-bearing output path under the covariance tree. + + E.g. cov_output(".ini") -> + /data/covariance//.ini + with {version}, {blind}, ... left as Snakemake wildcards. + """ + return str( + COSMO_INFERENCE + / f"data/covariance/{COV_BASE_TEMPLATE}/{COV_BASE_TEMPLATE}{suffix}" + ) + + +def cov_output_dirfile(filename): + """Wildcard-bearing path to a fixed-name file inside the covariance dir.""" + return str(COSMO_INFERENCE / f"data/covariance/{COV_BASE_TEMPLATE}/{filename}") + + def covariance_base( version, blind, - gaussian="ng", + gaussian=None, min_sep=None, max_sep=None, nbins=None, + probe=None, mask_suffix=None, resolve_version=True, fiducial=None, default_mask_suffix=None, ): - """Construct covariance base name.""" + """Construct covariance base name (concrete values, no wildcards).""" fiducial = fiducial or FIDUCIAL + gaussian = gaussian if gaussian is not None else fiducial["gaussian"] min_sep = min_sep if min_sep is not None else fiducial["min_sep"] max_sep = max_sep if max_sep is not None else fiducial["max_sep"] nbins = nbins if nbins is not None else fiducial["nbins"] - mask_suffix = ( - mask_suffix - if mask_suffix is not None - else ( + probe = probe if probe is not None else DEFAULT_PROBE + if mask_suffix is None: + mask_suffix = ( DEFAULT_MASK_SUFFIX if default_mask_suffix is None else default_mask_suffix ) - ) cov_version = resolve_covariance_version(version) if resolve_version else version - return ( - f"covariance_{cov_version}_{blind}_{gaussian}" - f"_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}" + return COV_BASE_TEMPLATE.format( + version=cov_version, + blind=blind, + gaussian=gaussian, + min_sep=min_sep, + max_sep=max_sep, + nbins=nbins, + probe=probe, + mask_suffix=mask_suffix, ) def covariance_dir( version, blind, - gaussian="ng", + gaussian=None, min_sep=None, max_sep=None, nbins=None, + probe=None, mask_suffix=None, resolve_version=True, ): @@ -125,6 +158,7 @@ def covariance_dir( min_sep, max_sep, nbins, + probe, mask_suffix, resolve_version=resolve_version, ) @@ -134,12 +168,13 @@ def covariance_dir( def covariance_path( version, blind, - gaussian="ng", + gaussian=None, min_sep=None, max_sep=None, nbins=None, + probe=None, mask_suffix=None, - suffix="_processed.txt", + suffix=".dat", resolve_version=True, ): """Construct covariance file path.""" @@ -150,22 +185,39 @@ def covariance_path( min_sep, max_sep, nbins, + probe, mask_suffix, resolve_version=resolve_version, ) return str(COSMO_INFERENCE / f"data/covariance/{base}/{base}{suffix}") -def build_redshift_path(version, blind): +def build_redshift_dir(version): """Construct n(z) filepath for given catalog version and blind.""" base_version = re.sub(r"_leak_corr$", "", version) base_version = re.sub(r"_ecut\d+", "", base_version) if "v1.4.11" in base_version: base_version = "SP_v1.4.6" version_dir = base_version.replace("SP_", "") - return ( - f"/n17data/sguerrini/UNIONS/WL/nz/{version_dir}/nz_{base_version}_{blind}.txt" - ) + return f"/n17data/sguerrini/UNIONS/WL/nz/{version_dir}/" + + +def build_redshift_path_lens(version, blind): + """Construct n(z) filepath for given catalog version and blind.""" + base_version = re.sub(r"_leak_corr$", "", version) + base_version = re.sub(r"_ecut\d+", "", base_version) + if "v1.4.11" in base_version: + base_version = "SP_v1.4.6" + return f"nz_{base_version}_{blind}_lens.txt" + + +def build_redshift_path_source(version, blind): + """Construct n(z) filepath for given catalog version and blind.""" + base_version = re.sub(r"_leak_corr$", "", version) + base_version = re.sub(r"_ecut\d+", "", base_version) + if "v1.4.11" in base_version: + base_version = "SP_v1.4.6" + return f"nz_{base_version}_{blind}_clust.txt" # TO DO: check lens and source file format def get_shear_catalog(wildcards): diff --git a/workflow/rules/covariance.smk b/workflow/rules/covariance.smk index 49e40201..c823b15d 100644 --- a/workflow/rules/covariance.smk +++ b/workflow/rules/covariance.smk @@ -1,14 +1,23 @@ # BLOCK_PAIRS, PLANCK18, COSMOLOGY_PARAMS defined in Snakefile +import os +def get_cat_params(w): + """Extract covariance parameters (sigma_e, n_eff, area) from catalog config. -def get_cat_params(version): - """Extract covariance parameters (area, n_e, sigma_e) from catalog config.""" - base_version = version.replace("_leak_corr", "") + Returns (sigma_e, (n_e_lens, n_e_clust), (A_lens, A_ggl, A_clust)). + For probe == "wl" the clustering/ggl slots are empty strings. + """ + base_version = w.version.replace("_leak_corr", "") if base_version not in config: raise KeyError(f"Catalog configuration not found for {base_version}") cov_th = config[base_version]["cov_th"] - return cov_th["A"], cov_th["n_e"], cov_th["sigma_e"] - + if w.probe == "wl": + return cov_th["sigma_e"], (cov_th["n_e"], ""), (cov_th["A"], "", "") + return ( + cov_th["sigma_e"], + (cov_th["n_e_lens"], cov_th["n_e_clust"]), + (cov_th["A_lens"], cov_th["A_ggl"], cov_th["A_clust"]), + ) # covariance_dir(), covariance_base(), covariance_path() defined in Snakefile # Additional wildcard constraints defined locally for pseudo-Cl rules (line 327) @@ -17,21 +26,46 @@ def get_cat_params(version): # Footprint mask power spectra (nside=4096, from comprehensive catalog with spatial cuts only) MASK_CLS_BASE = str(COSMO_INFERENCE / "data/mask") MASK_CLS_FILES = { - "footprint": f"{MASK_CLS_BASE}/mask_cls_footprint_nside_4096_norm.txt", - "footprint_starhalo": f"{MASK_CLS_BASE}/mask_cls_footprint_starhalo_nside_4096_norm.txt", + "footprint_lens": "mask_cls_footprint_nside_4096_norm.txt", + "footprint_ggl": "mask_cls_footprint_nside_4096_norm.txt", + "footprint_clust": "mask_cls_footprint_nside_4096_norm.txt", + "footprint_lens_starhalo": "mask_cls_footprint_starhalo_nside_4096_norm.txt", } # v1.4.8 uses the star-halo footprint; all other versions use the standard footprint STARHALO_VERSIONS = {"v1.4.8"} +# Number of cores to use to execute OneCovariance +ONECOV_THREADS = 8 + +def get_mask_cls_file(version, kind="lens"): + """Return the mask Cl *filename* (OneCov wants dir and file separately).""" + version_dir = version.replace("_leak_corr", "").replace("SP_", "") + version_dir = re.sub(r"_ecut\d+", "", version_dir) + if kind == "lens" and version_dir in STARHALO_VERSIONS: + return MASK_CLS_FILES["footprint_lens_starhalo"] + return MASK_CLS_FILES[f"footprint_{kind}"] + -def get_mask_cls_path(version): - """Return absolute mask Cl path for the requested catalog version.""" - version_dir = version.replace('_leak_corr', '').replace('SP_', '') - version_dir = re.sub(r'_ecut\d+', '', version_dir) - key = "footprint_starhalo" if version_dir in STARHALO_VERSIONS else "footprint" - return MASK_CLS_FILES[key] +def _onecov_mask_params(w): + """Resolve OneCov mask settings for one job. + Returns dict with keys: dir, lens, ggl, clust. Empty strings when the + job is unmasked or the probe doesn't use a given field. + """ + if w.mask_suffix != "_masked": + return {"dir": "", "lens": "", "ggl": "", "clust": ""} + out = { + "dir": MASK_CLS_BASE, + "lens": get_mask_cls_file(w.version, "lens"), + "ggl": "", + "clust": "", + } + if w.probe in ("ggl", "3x2pt"): + out["ggl"] = get_mask_cls_file(w.version, "ggl") + if w.probe == "3x2pt": + out["clust"] = get_mask_cls_file(w.version, "clust") + return out rule cosmology_params: """Generate cosmology parameters JSON from sp_validation. @@ -57,112 +91,200 @@ with open('{output}', 'w') as f: " """ - -rule covariance_ini: +rule covariance_ini_onecov: input: - nz_file=lambda w: build_redshift_path(w.version, w.blind), - mask=lambda w: [] if w.mask_suffix != "_masked" else [get_mask_cls_path(w.version)], + # Ensures planck18.json exists before get_planck18() is called below. + cosmo=COSMOLOGY_PARAMS, output: - str(COSMO_INFERENCE / "data/covariance/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}.ini") + cov_output(".ini"), params: outdir=lambda w: covariance_dir( - w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, w.mask_suffix, - resolve_version=False + w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, + w.probe, w.mask_suffix, resolve_version=False, ), - ng_value=lambda wildcards: "1" if wildcards.gaussian == "ng" else "0", + out_filename=lambda w: covariance_base( + w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, + w.probe, w.mask_suffix, resolve_version=False, + ) + ".dat", + out_plot_filename=lambda w: covariance_base( + w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, + w.probe, w.mask_suffix, resolve_version=False, + ) + "_corr_plot.pdf", + ng_value=lambda w: "1" if w.gaussian == "ng" else "0", + do_ggl=lambda w: str(w.probe in ("ggl", "3x2pt")), + do_clustering=lambda w: str(w.probe == "3x2pt"), omega_m=PLANCK18["Omega_m"], omega_v=PLANCK18["Omega_v"], sigma_8=PLANCK18["sigma_8"], n_s=PLANCK18["n_s"], h=PLANCK18["h"], omega_b=PLANCK18["Omega_b"], - area=lambda w: get_cat_params(w.version)[0], - n_e=lambda w: get_cat_params(w.version)[1], - sigma_e_param=lambda w: get_cat_params(w.version)[2], - mask=lambda w: get_mask_cls_path(w.version) if w.mask_suffix == "_masked" else "", + hmcode_logT_AGN=7.75, + sigma_e_param=lambda w: get_cat_params(w)[0], + n_e_lens_line=lambda w: ( + f"n_eff_lensing = {get_cat_params(w)[1][0]}"), + n_e_clust_line=lambda w: ("" + if w.probe == "wl" + else f"n_eff_clust = {get_cat_params(w)[1][1]}"), + area_lens_line=lambda w: ( + f"survey_area_lensing_in_deg2 = {get_cat_params(w)[2][0]}"), + area_ggl_line=lambda w: ( + "" + if w.probe == "wl" + else f"survey_area_ggl_in_deg2 = {get_cat_params(w)[2][1]}" + ), + area_clust_line=lambda w: ( + "" + if w.probe == "wl" + else f"survey_area_clust_in_deg2 = {get_cat_params(w)[2][2]}" + ), + mask_dir=lambda w: _onecov_mask_params(w)["dir"], + mask_lens=lambda w: _onecov_mask_params(w)["lens"], + mask_ggl=lambda w: _onecov_mask_params(w)["ggl"], + mask_clust=lambda w: _onecov_mask_params(w)["clust"], + nz_dir=lambda w: build_redshift_dir(w.version), + nz_lens=lambda w: build_redshift_path_lens(w.version, w.blind), + nz_clust=lambda w: ( + "" if w.probe == "wl" + else build_redshift_path_source(w.version, w.blind) + ), threads: 1 shell: """ mkdir -p {params.outdir} - cat > {output} << 'EOF' -# -# Cosmological parameters -# -Omega_m : {params.omega_m} -Omega_v : {params.omega_v} -sigma_8 : {params.sigma_8} -n_spec : {params.n_s} -w0 : -1 -wa : 0 -omb : {params.omega_b} -h0 : {params.h} - - -# Survey and galaxy parameters -# -# area in degrees -# n_gal,lens_n_gal in gals/arcmin^2 - -area : {params.area} -sourcephotoz : multihisto -lensphotoz : multihisto -source_tomobins : 1 -lens_tomobins : 1 -sigma_e : {params.sigma_e_param} -source_n_gal : {params.n_e} -lens_n_gal : {params.n_e} - - -shear_REDSHIFT_FILE : {input.nz_file} -clustering_REDSHIFT_FILE : {input.nz_file} -c_footprint_file : {params.mask} - - -# IA parameters -IA : 1 -A_ia : 0.0 -eta_ia : 0.0 - - -# Covariance parameters -# -# tmin,tmax in arcminutes -tmin : {wildcards.min_sep} -tmax : {wildcards.max_sep} -ntheta : {wildcards.nbins} -ng : {params.ng_value} -cng : {params.ng_value} - - -outdir : ./ -filename : cov_tmp -ss : true -ls : false -ll : false + cat > "{output}" << 'EOF' +[covariance terms] +gauss = True +split_gauss = False +nongauss = {params.ng_value} +ssc = {params.ng_value} +sn_only = False + +[observables] +cosmic_shear = True +est_shear = xi_pm +clustering = {params.do_clustering} +ggl = {params.do_ggl} +est_ggl = gamma_t +est_clust = w + +[output settings] +directory = {params.outdir} +file = {params.out_filename} +style = matrix +save_configs = False +corrmatrix_plot = {params.out_plot_filename} + +[covTHETAspace settings] +theta_min = {wildcards.min_sep} +theta_max = {wildcards.max_sep} +theta_bins = {wildcards.nbins} +theta_type = log +xi_pp = True +xi_mm = True +theta_accuracy = 1e-3 +integration_intervals = 400 + +[survey specs] +mask_directory = {params.mask_dir} +mask_file_lensing = {params.mask_lens} +mask_file_clust = {params.mask_clust} +mask_file_ggl = {params.mask_ggl} +ellipticity_dispersion = {params.sigma_e_param} +{params.area_lens_line} +{params.area_clust_line} +{params.area_ggl_line} +{params.n_e_lens_line} +{params.n_e_clust_line} + +[redshift] +zlens_directory = /n23data1/n06data/lgoh/scratch/UNIONS/OneCovariance/input/redshift_distribution/ +# {params.nz_dir} +zlens_file = K1000_NS_V1.0.0A_ugriZYJHKs_photoz_SG_mask_LF_svn_309c_2Dbins_v2_goldclasses_THELI_INT_DIRcols_Fid_blindC_TOMO1_Nz.ascii,K1000_NS_V1.0.0A_ugriZYJHKs_photoz_SG_mask_LF_svn_309c_2Dbins_v2_goldclasses_THELI_INT_DIRcols_Fid_blindC_TOMO2_Nz.ascii +# {params.nz_lens} +zclust_file = {params.nz_clust} +value_loc_in_lensbin = mid +value_loc_in_clustbin = mid + +[cosmo] +sigma8 = {params.sigma_8} +h = {params.h} +omega_m = {params.omega_m} +omega_b = {params.omega_b} +omega_de = {params.omega_v} +w0 = -1.0 +wa = 0.0 +ns = {params.n_s} +neff = 3.046 +m_nu = 0.06 +tcmb0 = 2.725 + +[IA] +A_IA = 0.0 +eta_IA = 0.0 +z_pivot_IA = 0.3 + +[powspec evaluation] +non_linear_model = mead2020_feedback +HMCode_logT_AGN = {params.hmcode_logT_AGN} +log10k_bins = 300 +log10k_min = -3.46 +log10k_max = 3.15 + +[hod] +model_mor_cen = double_powerlaw +model_mor_sat = double_powerlaw +dpow_logm0_cen = 10.51 +dpow_logm1_cen = 11.38 +dpow_a_cen = 7.096 +dpow_b_cen = 0.2 +dpow_norm_cen = 1.0 +dpow_norm_sat = 0.56 +model_scatter_cen = lognormal +model_scatter_sat = modschechter +logn_sigma_c_cen = 0.35 +modsch_logmref_sat = 13.0 +modsch_alpha_s_sat = -0.858 +modsch_b_sat = -0.024, 1.149 + +[halomodel evaluation] +m_bins = 900 +log10m_min = 6 +log10m_max = 18 +hmf_model = Tinker10 +mdef_model = SOMean +mdef_params = overdensity, 200 +disable_mass_conversion = True +delta_c = 1.686 +transfer_model = CAMB +small_k_damping_for1h = damped + +[misc] +num_cores = {ONECOV_THREADS} + EOF """ - -rule covariance_cosmocov: +rule covariance_onecov: input: - rules.covariance_ini.output, + rules.covariance_ini_onecov.output, output: - str(COSMO_INFERENCE / "data/covariance/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}/cov_tmp_ssss_{block_pm}_cov_Ntheta{nbins}_Ntomo1_{block_i}") + cov_output(".dat") params: - block_i="{block_i}", outdir=lambda w: covariance_dir( - w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, w.mask_suffix, - resolve_version=False + w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, + w.probe, w.mask_suffix, resolve_version=False, ), ini_path=lambda w: covariance_path( - w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, w.mask_suffix, - suffix=".ini", resolve_version=False + w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, + w.probe, w.mask_suffix, suffix=".ini", resolve_version=False, ), - cosmocov=config["tools"]["cosmocov_executable"], + onecov=config["tools"]["onecov_executable"], + python_executable=config["tools"]["python_executable"], container: None - threads: 1 + threads: ONECOV_THREADS shell: """ module unload gcc || true @@ -172,68 +294,73 @@ rule covariance_cosmocov: module load openmpi cd {params.outdir} - {params.cosmocov} {params.block_i} {params.ini_path} + {params.python_executable} {params.onecov} {params.ini_path} """ -rule covariance_cat: - input: - cov_block=lambda w: [ - f"{covariance_dir(w.version, w.blind, w.gaussian, w.min_sep, w.max_sep, w.nbins, w.mask_suffix, resolve_version=False)}" - f"/cov_tmp_ssss_{pm}_cov_Ntheta{w.nbins}_Ntomo1_{idx}" - for pm, idx in BLOCK_PAIRS - ], - threads: 1 - output: - str(COSMO_INFERENCE / "data/covariance/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}.txt") - shell: - """ - cat {input} > {output} - """ - +# Glass-mock roots. Env/config-overridable for the same reason as COSMO_*. +GLASS_MOCK_RESULTS = config.get("glass_mocks", {}).get( + "results_dir", "/n09data/guerrini/glass_mock_v1.4.6/results" +) +GLASS_MOCK_COV_DIR = config.get("glass_mocks", {}).get( + "covariance_dir", + "/automnt/n17data/cdaley/unions/analyses/shear_2d/bmodes_2d/results/covariance/glass_mock_v1.4.6", +) rule covariance_glass_mock: input: xi=expand( - "/n09data/guerrini/glass_mock_v1.4.6/results/xi_glass_mock_{seed:05d}_4096_nbins=20.fits", - seed=range(config["glass_mocks"]["seed_range"][0], config["glass_mocks"]["seed_range"][1] + 1), + GLASS_MOCK_RESULTS + "/xi_glass_mock_{seed:05d}_4096_nbins=20.fits", + seed=range( + config["glass_mocks"]["seed_range"][0], + config["glass_mocks"]["seed_range"][1] + 1, + ), ), cl=expand( - "/n09data/guerrini/glass_mock_v1.4.6/results/cl_glass_mock_{seed:05d}_4096.npy", - seed=range(config["glass_mocks"]["seed_range"][0], config["glass_mocks"]["seed_range"][1] + 1), + GLASS_MOCK_RESULTS + "/cl_glass_mock_{seed:05d}_4096.npy", + seed=range( + config["glass_mocks"]["seed_range"][0], + config["glass_mocks"]["seed_range"][1] + 1, + ), ), output: - xi_covariance="/automnt/n17data/cdaley/unions/pure_eb/results/covariance/glass_mock_v1.4.6/xi_covariance.npy", - cl_covariance="/automnt/n17data/cdaley/unions/pure_eb/results/covariance/glass_mock_v1.4.6/cl_covariance.npy", - combined_covariance="/automnt/n17data/cdaley/unions/pure_eb/results/covariance/glass_mock_v1.4.6/combined_covariance.npy", - correlation_plot="/automnt/n17data/cdaley/unions/pure_eb/results/covariance/glass_mock_v1.4.6/combined_correlation.png", - xi_mean="/automnt/n17data/cdaley/unions/pure_eb/results/covariance/glass_mock_v1.4.6/xi_mean.npy", - cl_mean="/automnt/n17data/cdaley/unions/pure_eb/results/covariance/glass_mock_v1.4.6/cl_mean.npy", - combined_mean="/automnt/n17data/cdaley/unions/pure_eb/results/covariance/glass_mock_v1.4.6/combined_mean.npy", + xi_covariance=f"{GLASS_MOCK_COV_DIR}/xi_covariance.npy", + cl_covariance=f"{GLASS_MOCK_COV_DIR}/cl_covariance.npy", + combined_covariance=f"{GLASS_MOCK_COV_DIR}/combined_covariance.npy", + correlation_plot=f"{GLASS_MOCK_COV_DIR}/combined_correlation.png", + xi_mean=f"{GLASS_MOCK_COV_DIR}/xi_mean.npy", + cl_mean=f"{GLASS_MOCK_COV_DIR}/cl_mean.npy", + combined_mean=f"{GLASS_MOCK_COV_DIR}/combined_mean.npy", script: "../scripts/compute_glass_mock_covariance.py" - -# fiducial_binning_suffix() defined in Snakefile - - rule generate_glass_mock_rhotau_samples: """Generate sampled tau statistics for glass mocks. Only tau is sampled; inference_prep_glass_mock uses real rho data. """ input: - cov_tau=str(COSMO_VAL / f"rho_tau_stats/cov_tau_{FIDUCIAL['mock_version']}{fiducial_binning_suffix()}_th.npy"), - ref_tau=str(COSMO_VAL / f"rho_tau_stats/tau_stats_{FIDUCIAL['mock_version']}{fiducial_binning_suffix()}.fits"), + cov_tau=str( + COSMO_VAL + / f"rho_tau_stats/cov_tau_{FIDUCIAL['mock_version']}{fiducial_binning_suffix()}_th.npy" + ), + ref_tau=str( + COSMO_VAL + / f"rho_tau_stats/tau_stats_{FIDUCIAL['mock_version']}{fiducial_binning_suffix()}.fits" + ), output: tau="results/glass_mock_rhotau_samples/{mock_id}/tau_stats_sampled.fits", params: mock_id="{mock_id}", output_dir="results/glass_mock_rhotau_samples", + # Resolved relative to this .smk file instead of a hard-coded checkout. + script=workflow.source_path( + "../scripts/generate_glass_mock_rhotau_samples.py" + ), threads: 1 shell: """ - python /n17data/cdaley/unions/pure_eb/code/sp_validation/workflow/scripts/generate_glass_mock_rhotau_samples.py \ + python {params.script} \ --cov-tau {input.cov_tau} \ --ref-tau {input.ref_tau} \ --output-dir {params.output_dir} \ @@ -241,55 +368,36 @@ rule generate_glass_mock_rhotau_samples: """ -rule covariance_process: - input: - str(COSMO_INFERENCE / "data/covariance/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}.txt") - output: - matrix=str(COSMO_INFERENCE / "data/covariance/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}_processed.txt"), - gaussian=str(COSMO_INFERENCE / "data/covariance/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}_processed_g.txt"), - plot=str(COSMO_INFERENCE / "data/covariance/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}_processed_plot.pdf") - params: - output_stub=str(COSMO_INFERENCE / "data/covariance/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}/covariance_{version}_{blind}_{gaussian}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}{mask_suffix}_processed") - threads: 1 - shell: - """ - python /n17data/cdaley/unions/pure_eb/code/sp_validation/cosmo_inference/scripts/cosmocov_process.py {input} {params.output_stub} - """ - - -def fiducial_covariance_outputs(mask_suffix=""): +def fiducial_covariance_outputs(mask_suffix="", probe=None): """Return processed covariance files for fiducial version/blind.""" - ng_path = covariance_path( - FIDUCIAL["version"], FIDUCIAL["blind"], "ng", - FIDUCIAL["min_sep"], FIDUCIAL["max_sep"], FIDUCIAL["nbins"], mask_suffix + probe = probe or DEFAULT_PROBE + path = covariance_path( + FIDUCIAL["version"], FIDUCIAL["blind"], FIDUCIAL["gaussian"], + FIDUCIAL["min_sep"], FIDUCIAL["max_sep"], FIDUCIAL["nbins"], + probe, mask_suffix, ) - g_path = covariance_path( - FIDUCIAL["version"], FIDUCIAL["blind"], "g", - FIDUCIAL["min_sep_int"], FIDUCIAL["max_sep_int"], FIDUCIAL["nbins_int"], mask_suffix - ) - return [ng_path, g_path] - + return path rule covariance: input: - fiducial_covariance_outputs(mask_suffix=DEFAULT_MASK_SUFFIX) - + fiducial_covariance_outputs(mask_suffix=DEFAULT_MASK_SUFFIX, probe=DEFAULT_PROBE), rule covariance_masked: input: - fiducial_covariance_outputs(mask_suffix="_masked") - + fiducial_covariance_outputs(mask_suffix="_masked", probe=DEFAULT_PROBE), rule covariance_unmasked: input: - fiducial_covariance_outputs(mask_suffix="") + fiducial_covariance_outputs(mask_suffix="", probe=DEFAULT_PROBE), +rule covariance_3x2pt: + input: + fiducial_covariance_outputs(mask_suffix="", + probe="3x2pt"), -ruleorder: covariance_ini > covariance_cosmocov > covariance_cat > covariance_process > covariance +# ruleorder: covariance_ini_onecov > covariance_onecov > covariance localrules: cosmology_params, - covariance_ini, - covariance_cat, - covariance_process, + covariance_ini_onecov, generate_glass_mock_rhotau_samples, diff --git a/workflow/rules/inference.smk b/workflow/rules/inference.smk index a93c0e71..d2847976 100644 --- a/workflow/rules/inference.smk +++ b/workflow/rules/inference.smk @@ -29,7 +29,7 @@ GLASS_MOCK_FITS_PATTERN = str( ) GLASS_MOCK_CONFIG_PATTERN = str( COSMO_INFERENCE_PROD - / f"cosmosis_config/cosmosis_pipeline_glass_mocks_{GLASS_MOCK_VERSION}_glass_mock_{{mock_id}}.ini" + / f"cosmosis_config/output/cosmosis_pipeline_glass_mocks_{GLASS_MOCK_VERSION}_glass_mock_{{mock_id}}.ini" ) # Fiducial harmonic-binning tag the pseudo-Cl producer (twopoint.smk) stamps @@ -78,7 +78,7 @@ rule inference_prep: ), config_file=str( COSMO_INFERENCE_PROD - / "cosmosis_config/cosmosis_pipeline_{version}_{blind}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}_npatch={npatch}.ini" + / "cosmosis_config/output/cosmosis_pipeline_{version}_{blind}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}_npatch={npatch}.ini" ) params: cosmosis_root="{version}_{blind}_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}_npatch={npatch}", diff --git a/workflow/scripts/generate_cosmocov_ini.py b/workflow/scripts/generate_cosmocov_ini.py deleted file mode 100644 index 11e785cf..00000000 --- a/workflow/scripts/generate_cosmocov_ini.py +++ /dev/null @@ -1,149 +0,0 @@ -"""Generate a CosmoCov ``.ini`` for one (version, blind, grid, flavour, mask). - -CLI refactor of the former ``rule covariance_ini`` heredoc. Cosmology is read -from the frozen ``planck18.json`` snapshot (the cosmology_snapshot lc output — -source of truth is cs_util.cosmo.PLANCK18); survey (area, n_eff, -sigma_e) from the catalog config's per-version ``cov_th``; n(z) via the same -path convention as workflow/common.build_redshift_path; the footprint mask -power spectrum is passed explicitly (empty string for the unmasked variant). -The emitted ``.ini`` is byte-compatible with the paper's covariance_ini rule. - - python generate_cosmocov_ini.py \ - --version SP_v1.4.6.3_leak_corr --blind A \ - --planck18-json /planck18.json \ - --cat-config \ - --min-sep 0.5 --max-sep 300.0 --nbins 1000 --gaussian g \ - --mask-cls \ - --out-ini -""" - -import argparse -import json -import os -import re - -import yaml - - -def build_redshift_path(version, blind): - """Replicate workflow/common.build_redshift_path.""" - base_version = re.sub(r"_leak_corr$", "", version) - base_version = re.sub(r"_ecut\d+", "", base_version) - if "v1.4.11" in base_version: - base_version = "SP_v1.4.6" - version_dir = base_version.replace("SP_", "") - return ( - f"/n17data/sguerrini/UNIONS/WL/nz/{version_dir}/nz_{base_version}_{blind}.txt" - ) - - -INI_TEMPLATE = """\ -# -# Cosmological parameters -# -Omega_m : {Omega_m} -Omega_v : {Omega_v} -sigma_8 : {sigma_8} -n_spec : {n_s} -w0 : -1 -wa : 0 -omb : {Omega_b} -h0 : {h} - - -# Survey and galaxy parameters -# -# area in degrees -# n_gal,lens_n_gal in gals/arcmin^2 - -area : {area} -sourcephotoz : multihisto -lensphotoz : multihisto -source_tomobins : 1 -lens_tomobins : 1 -sigma_e : {sigma_e} -source_n_gal : {n_e} -lens_n_gal : {n_e} - - -shear_REDSHIFT_FILE : {nz} -clustering_REDSHIFT_FILE : {nz} -c_footprint_file : {mask} - - -# IA parameters -IA : 1 -A_ia : 0.0 -eta_ia : 0.0 - - -# Covariance parameters -# -# tmin,tmax in arcminutes -tmin : {min_sep} -tmax : {max_sep} -ntheta : {nbins} -ng : {ng} -cng : {ng} - - -outdir : ./ -filename : cov_tmp -ss : true -ls : false -ll : false -""" - - -def main(argv=None): - ap = argparse.ArgumentParser(description=__doc__.split("\n")[0]) - ap.add_argument("--version", required=True) - ap.add_argument("--blind", default="A") - ap.add_argument("--planck18-json", required=True) - ap.add_argument("--cat-config", required=True) - ap.add_argument("--min-sep", required=True, help="tmin arcmin (string, e.g. 0.5)") - ap.add_argument("--max-sep", required=True, help="tmax arcmin (string, e.g. 300.0)") - ap.add_argument("--nbins", required=True, help="ntheta (string, e.g. 1000)") - ap.add_argument("--gaussian", required=True, choices=["g", "ng"]) - ap.add_argument( - "--mask-cls", default="", help="footprint mask Cl path ('' = unmasked)" - ) - ap.add_argument("--out-ini", required=True) - a = ap.parse_args(argv) - - with open(a.planck18_json) as f: - cosmo = json.load(f) - with open(a.cat_config) as f: - cat_config = yaml.safe_load(f) - - base_version = a.version.replace("_leak_corr", "") - cov_th = cat_config[base_version]["cov_th"] - - ng_value = "1" if a.gaussian == "ng" else "0" - - ini = INI_TEMPLATE.format( - Omega_m=cosmo["Omega_m"], - Omega_v=cosmo["Omega_v"], - sigma_8=cosmo["sigma_8"], - n_s=cosmo["n_s"], - Omega_b=cosmo["Omega_b"], - h=cosmo["h"], - area=cov_th["A"], - sigma_e=cov_th["sigma_e"], - n_e=cov_th["n_e"], - nz=build_redshift_path(a.version, a.blind), - mask=a.mask_cls, - min_sep=a.min_sep, - max_sep=a.max_sep, - nbins=a.nbins, - ng=ng_value, - ) - - os.makedirs(os.path.dirname(os.path.abspath(a.out_ini)), exist_ok=True) - with open(a.out_ini, "w") as f: - f.write(ini) - print(f"Wrote {a.out_ini}") - - -if __name__ == "__main__": - main() diff --git a/workflow/scripts/run_cosmocov_chain.sh b/workflow/scripts/run_cosmocov_chain.sh deleted file mode 100644 index 80a80370..00000000 --- a/workflow/scripts/run_cosmocov_chain.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env bash -# CosmoCov covariance chain (lc-native, container:none recipe). -# -# Faithful port of covariance_ini -> covariance_cosmocov (x3 blocks) -> -# covariance_cat -> covariance_process. The CosmoCov C++ binary runs on the -# bare host (module load gcc/intelpython/openmpi, as in the original -# container:None rule); the .ini generation and cosmocov_process step run inside -# the sp_validation apptainer container. The 3 shear-shear blocks (++,--,+-) are -# independent and run in parallel. -# -# Usage: -# run_cosmocov_chain.sh --version SP_v1.4.6.3_leak_corr --blind A \ -# --min-sep 0.5 --max-sep 300.0 --nbins 1000 --gaussian g \ -# --planck18-json /planck18.json \ -# --cat-config --mask-cls \ -# --out -set -euo pipefail - -CONTAINER=/n17data/cdaley/containers/containers/ -WT=/n17data/cdaley/unions/code/sp_validation.worktrees/repro-paper-ii-astra -SRC=$WT/src -BIND=/home,/scratch,/automnt,/n17data,/n23data1,/n09data -COSMOCOV=/n23data1/n06data/lgoh/scratch/UNIONS/CosmoCov/covs/cov - -VERSION=""; BLIND="A"; MINSEP=""; MAXSEP=""; NBINS=""; GAUSSIAN="" -PLANCK18=""; CATCONFIG=""; MASKCLS=""; OUT="" -while [ $# -gt 0 ]; do - case "$1" in - --version) VERSION="$2"; shift 2;; - --blind) BLIND="$2"; shift 2;; - --min-sep) MINSEP="$2"; shift 2;; - --max-sep) MAXSEP="$2"; shift 2;; - --nbins) NBINS="$2"; shift 2;; - --gaussian) GAUSSIAN="$2"; shift 2;; - --planck18-json) PLANCK18="$2"; shift 2;; - --cat-config) CATCONFIG="$2"; shift 2;; - --mask-cls) MASKCLS="$2"; shift 2;; - --cosmocov) COSMOCOV="$2"; shift 2;; - --out) OUT="$2"; shift 2;; - *) echo "unknown arg: $1" >&2; exit 2;; - esac -done - -mkdir -p "$OUT" -# Absolutize OUT before any `cd` below: the CosmoCov binary writes its block -# files into cwd, so we cd into OUT (line ~61); every other OUT-relative path -# ($INI, block logs, covariance.txt, cosmocov_process output) must therefore be -# absolute or it re-resolves against the new cwd and double-nests. lc templates -# {output} as a project-relative path, so this makes the recipe robust to both -# relative (lc) and absolute (direct-run) --out. -OUT="$(cd "$OUT" && pwd)" -INI="$OUT/covariance.ini" - -echo "[cosmocov] generating .ini" -apptainer exec --bind "$BIND" --env PYTHONPATH="$SRC" "$CONTAINER" \ - /usr/local/bin/python "$WT/workflow/scripts/generate_cosmocov_ini.py" \ - --version "$VERSION" --blind "$BLIND" \ - --planck18-json "$PLANCK18" --cat-config "$CATCONFIG" \ - --min-sep "$MINSEP" --max-sep "$MAXSEP" --nbins "$NBINS" --gaussian "$GAUSSIAN" \ - --mask-cls "$MASKCLS" --out-ini "$INI" - -echo "[cosmocov] loading modules + running 3 blocks (parallel)" -source /etc/profile.d/modules.sh -module unload gcc 2>/dev/null || true; module load gcc -module unload intelpython 2>/dev/null || true; module load intelpython/3-2024.1.0 -module load openmpi - -cd "$OUT" -# BLOCK_PAIRS = [("++","1"), ("--","2"), ("+-","3")] — one CosmoCov invocation per block -for idx in 1 2 3; do - ( "$COSMOCOV" "$idx" "$INI" > "$OUT/cosmocov_block_${idx}.log" 2>&1 ) & -done -wait - -# Concatenate blocks in BLOCK_PAIRS order (++, --, +-) — as covariance_cat does -CAT="$OUT/covariance.txt" -: > "$CAT" -for pm_idx in "++:1" "--:2" "+-:3"; do - pm="${pm_idx%%:*}"; idx="${pm_idx##*:}" - blk="$OUT/cov_tmp_ssss_${pm}_cov_Ntheta${NBINS}_Ntomo1_${idx}" - [ -f "$blk" ] || { echo "MISSING block $blk (see cosmocov_block_${idx}.log)" >&2; exit 1; } - cat "$blk" >> "$CAT" -done -echo "[cosmocov] concatenated -> $CAT" - -echo "[cosmocov] processing (positive-definite check, G/G+NG extract, QA plot)" -apptainer exec --bind "$BIND" --env PYTHONPATH="$SRC" "$CONTAINER" \ - /usr/local/bin/python "$WT/cosmo_inference/scripts/cosmocov_process.py" \ - "$CAT" "$OUT/covariance_processed" -echo "[cosmocov] done -> $OUT/covariance_processed.txt (+_g.txt, +_plot.pdf)"