From 6e1e1ecd5047236f21c8200f6313454c819eef2d Mon Sep 17 00:00:00 2001 From: sahuno Date: Mon, 18 May 2026 12:44:29 -0400 Subject: [PATCH 1/9] feat: add igv-reports skill for offline HTML genomic-region reports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the `igv-reports` skill, a cohort-aware driver + post-render verifiers on top of the upstream igv-reports Python package (`create_report`). Builds self-contained, offline HTML viewers for genomic regions — one HTML per sample for a whole cohort, with embedded BAM/VCF slices and configurable annotation tracks. Differentiating features vs raw `create_report`: - Cohort mode: TSV samplesheet → per-sample HTMLs + index.html in one call. - Post-render structural verifier (`verify_report.py`, `verify_cohort.py`): asserts each rendered HTML contains exactly the regions and tracks it was asked to. Catches sample-swap and silent-truncation bugs that `create_report` exit code doesn't. - Opt-in read-count anchor verifier (`verify_anchors.py`): re-counts reads in each embedded BAM slice against a frozen regression fixture; catches silent empty slices and same-basename mix-ups. - ONT 5mC/5hmC methylation presets via `generate_tracks_json.py`: bakes in `colorBy: basemod2`, fixed `min:0 max:100` y-axis lock for cross-sample bedGraph comparison, `--flanking 0`, `--type mutation`. Without these presets users routinely produce reports that look right but auto-scale the y-axis per track, masking tumor-vs-normal methylation differences. - `prep_track.sh` utility for the recurring plain-gzip → bgzip+tabix conversion that trips `create_report` on misprepared annotation tracks. Files added under `./igv-reports/`: - SKILL.md (skill manifest + workflow guide, plus references/ pointers) - scripts/ (5 Python + 1 shell, all argv-only, no global state) - references/ (best_practices, databases_config_paths schema, methylation_ont cheat-sheet) - examples/portable/ (single-sample + cohort reference invocations using user-supplied paths) - tests/ (63 hermetic unit tests + 1 smoke test + 4 integration scenarios; integration tests SKIP cleanly via exit 77 without sample BAMs) - LICENSE.txt (Apache 2.0, matching the convention added in PR #34) Updates: - `.claude-plugin/marketplace.json`: new plugin entry, alphabetically near scientific-problem-selection. - `README.md`: install command + Skills section entry with use-cases and upstream requirement (`pip install -U 'igv-reports>=1.16.0'`). Test plan: - Unit tests pass: `cd igv-reports && bash tests/run_all.sh --unit-only` → 63 passed in ~1s. Runs anywhere with pytest + Python ≥ 3.10. - Smoke tests need `samtools`; run with `--no-integration`. - Integration tests require user-supplied BAMs via `IGV_REPORTS_TEST_BAM_{1,2,3}` env vars (no built-in defaults). Upstream development at https://github.com/sahuno/igv-reports-skill. --- .claude-plugin/marketplace.json | 11 + README.md | 15 + igv-reports/LICENSE.txt | 201 ++++ igv-reports/SKILL.md | 540 +++++++++++ igv-reports/examples/portable/README.md | 20 + .../examples/portable/cohort_samplesheet.sh | 43 + .../examples/portable/single_sample.sh | 45 + igv-reports/references/best_practices.md | 158 ++++ .../references/databases_config_paths.md | 70 ++ igv-reports/references/methylation_ont.md | 243 +++++ igv-reports/scripts/build_igvreports.py | 858 ++++++++++++++++++ igv-reports/scripts/generate_tracks_json.py | 156 ++++ igv-reports/scripts/prep_track.sh | 106 +++ igv-reports/scripts/verify_anchors.py | 642 +++++++++++++ igv-reports/scripts/verify_cohort.py | 485 ++++++++++ igv-reports/scripts/verify_report.py | 396 ++++++++ igv-reports/tests/.gitignore | 11 + igv-reports/tests/fixtures/README.md | 51 ++ igv-reports/tests/fixtures/build_fixtures.sh | 67 ++ .../tests/fixtures/tiny_colo829.hg38.bam | Bin 0 -> 466962 bytes .../tests/fixtures/tiny_colo829.hg38.bam.bai | Bin 0 -> 86888 bytes .../tests/integration/anchor_verify/README.md | 92 ++ .../integration/anchor_verify/scenarios.sh | 191 ++++ .../tests/integration/cohort_verify/README.md | 79 ++ .../integration/cohort_verify/scenarios.sh | 172 ++++ igv-reports/tests/run_all.sh | 112 +++ igv-reports/tests/smoke/test_slice_count.py | 154 ++++ igv-reports/tests/unit/test_verify_anchors.py | 354 ++++++++ igv-reports/tests/unit/test_verify_report.py | 297 ++++++ 29 files changed, 5569 insertions(+) create mode 100644 igv-reports/LICENSE.txt create mode 100644 igv-reports/SKILL.md create mode 100644 igv-reports/examples/portable/README.md create mode 100644 igv-reports/examples/portable/cohort_samplesheet.sh create mode 100644 igv-reports/examples/portable/single_sample.sh create mode 100644 igv-reports/references/best_practices.md create mode 100644 igv-reports/references/databases_config_paths.md create mode 100644 igv-reports/references/methylation_ont.md create mode 100755 igv-reports/scripts/build_igvreports.py create mode 100755 igv-reports/scripts/generate_tracks_json.py create mode 100755 igv-reports/scripts/prep_track.sh create mode 100755 igv-reports/scripts/verify_anchors.py create mode 100755 igv-reports/scripts/verify_cohort.py create mode 100755 igv-reports/scripts/verify_report.py create mode 100644 igv-reports/tests/.gitignore create mode 100644 igv-reports/tests/fixtures/README.md create mode 100755 igv-reports/tests/fixtures/build_fixtures.sh create mode 100644 igv-reports/tests/fixtures/tiny_colo829.hg38.bam create mode 100644 igv-reports/tests/fixtures/tiny_colo829.hg38.bam.bai create mode 100644 igv-reports/tests/integration/anchor_verify/README.md create mode 100755 igv-reports/tests/integration/anchor_verify/scenarios.sh create mode 100644 igv-reports/tests/integration/cohort_verify/README.md create mode 100755 igv-reports/tests/integration/cohort_verify/scenarios.sh create mode 100755 igv-reports/tests/run_all.sh create mode 100644 igv-reports/tests/smoke/test_slice_count.py create mode 100644 igv-reports/tests/unit/test_verify_anchors.py create mode 100644 igv-reports/tests/unit/test_verify_report.py diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index c612152..c569dfb 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -145,6 +145,17 @@ "./scientific-problem-selection" ] }, + { + "name": "igv-reports", + "source": "./", + "description": "Build self-contained, offline HTML genomic-region reports with igv-reports (create_report). Cohort-aware driver + post-render structural and content verifiers. Includes ONT 5mC/5hmC methylation viewer presets.", + "category": "life-sciences", + "tags": ["bioinformatics", "genomics", "visualization", "variant-validation", "structural-variants", "ont", "nanopore", "methylation", "igv", "html-report"], + "strict": false, + "skills": [ + "./igv-reports" + ] + }, { "name": "tooluniverse", "source": "./tooluniverse", diff --git a/README.md b/README.md index 20015ed..7bb07d1 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ This marketplace provides MCP (Model Context Protocol) servers and skills for li /plugin install nextflow-development@life-sciences /plugin install scvi-tools@life-sciences /plugin install scientific-problem-selection@life-sciences +/plugin install igv-reports@life-sciences ``` For servers requiring authentication (all except PubMed), configure credentials after installation: @@ -146,6 +147,19 @@ Systematic framework for scientific problem selection and strategic research dec - Navigate decision trees in active projects - Strategic research planning and problem choice +#### igv-reports +**Plugin ID**: `igv-reports@life-sciences` + +Build self-contained, offline HTML genomic-region reports with [igv-reports](https://github.com/igvteam/igv-reports) (`create_report`). Cohort-aware driver + post-render structural and content verifiers on top of the upstream Python package. Includes ONT 5mC/5hmC methylation viewer presets. + +**Use cases:** +- Generate per-sample HTML viewers for SV breakpoints, viral integrations, variants, fusion junctions, ChIP peaks, or ROIs +- Build cohort-wide report bundles (one HTML per sample + index) +- Per-read ONT 5mC/5hmC methylation views at promoters / gene bodies / DMRs +- Auto-verify rendered HTML structure and (opt-in) read-count anchors so cohort builds gate on correctness, not just exit code + +**Requirements**: `pip install -U 'igv-reports>=1.16.0'` (upstream engine) + ## Detailed Installation ### 1. Add the marketplace (one time) @@ -172,6 +186,7 @@ Systematic framework for scientific problem selection and strategic research dec /plugin install nextflow-development@life-sciences /plugin install scvi-tools@life-sciences /plugin install scientific-problem-selection@life-sciences +/plugin install igv-reports@life-sciences ``` ### 3. Configure credentials (if needed) diff --git a/igv-reports/LICENSE.txt b/igv-reports/LICENSE.txt new file mode 100644 index 0000000..d2a37d3 --- /dev/null +++ b/igv-reports/LICENSE.txt @@ -0,0 +1,201 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all +other entities that control, are controlled by, or are under common +control with that entity. For the purposes of this definition, +"control" means (i) the power, direct or indirect, to cause the +direction or management of such entity, whether by contract or +otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or +Object form, made available under the License, as indicated by a +copyright notice that is included in or attached to the work +(an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the purposes +of this License, Derivative Works shall not include works that remain +separable from, or merely link (or bind by name) to the interfaces of, +the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including +the original version of the Work and any modifications or additions +to that Work or Derivative Works thereof, that is intentionally +submitted to Licensor for inclusion in the Work by the copyright owner +or by an individual or Legal Entity authorized to submit on behalf of +the copyright owner. For the purposes of this definition, "submitted" +means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, +and issue tracking systems that are managed by, or on behalf of, the +Licensor for the purpose of discussing and improving the Work, but +excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work, +where such license applies only to those patent claims licensable +by such Contributor that are necessarily infringed by their +Contribution(s) alone or by combination of their Contribution(s) +with the Work to which such Contribution(s) was submitted. If You +institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work +or a Contribution incorporated within the Work constitutes direct +or contributory patent infringement, then any patent licenses +granted to You under this License for that Work shall terminate +as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You +meet the following conditions: + +(a) You must give any other recipients of the Work or +Derivative Works a copy of this License; and + +(b) You must cause any modified files to carry prominent notices +stating that You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works +that You distribute, all copyright, patent, trademark, and +attribution notices from the Source form of the Work, +excluding those notices that do not pertain to any part of +the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained +within such NOTICE file, excluding those notices that do not +pertain to any part of the Derivative Works, in at least one +of the following places: within a NOTICE text file distributed +as part of the Derivative Works; within the Source form or +documentation, if provided along with the Derivative Works; or, +within a display generated by the Derivative Works, if and +wherever such third-party notices normally appear. The contents +of the NOTICE file are for informational purposes only and +do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside +or as an addendum to the NOTICE text from the Work, provided +that such additional attribution notices cannot be construed +as modifying the License. + +You may add Your own copyright statement to Your modifications and +may provide additional or different license terms and conditions +for use, reproduction, or distribution of Your modifications, or +for any such Derivative Works as a whole, provided Your use, +reproduction, and distribution of the Work otherwise complies with +the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/igv-reports/SKILL.md b/igv-reports/SKILL.md new file mode 100644 index 0000000..8cd9efa --- /dev/null +++ b/igv-reports/SKILL.md @@ -0,0 +1,540 @@ +--- +name: igv-reports +description: Use when the user wants an HTML, clickable, browseable, offline, or emailable viewer of genomic data — phrases like "HTML IGV report", "offline IGV", "self-contained HTML", "clickable viewer", "create_report", "igv-reports", "email this viewer", or any browseable HTML of reads at variants, fusion breakpoints, SV junctions, viral integrations, ChIP peaks, ROIs, or ONT 5mC/5hmC methylation views at promoters/gene bodies/DMRs. Trigger even when the user doesn't say "igv-reports" — giveaway is HTML/clickable/offline plus genomic regions. Also fire on /igv-reports. DO NOT use for static PNG/PDF/SVG IGV screenshots — use the igv-screenshots skill instead. +--- + +# igv-reports + +This skill builds **self-contained HTML genomic-region reports** with +[igv-reports](https://github.com/igvteam/igv-reports) (`create_report`). +Each report is a single browseable HTML containing the igv.js viewer plus +embedded data slices for every region. No server, no internet, no IGV +install needed at view time. + +The skill has three entry points: +- **build** — one-shot: sites BED + BAM(s) ± VCF → HTML. +- **cohort** — multi-sample driver from a samplesheet → per-sample HTMLs + index. +- **prep-track** — utility: convert plain-gzip GFF/GTF/BED.gz into a + bgzip + tabix-indexed track that igv-reports can load. + +## What this skill is (and is not) + +This skill is a **driver layer** on top of the upstream `igv-reports` +Python package by the IGV team +([github.com/igvteam/igv-reports](https://github.com/igvteam/igv-reports)). +The naming is unavoidable — both share the `igv-reports` name. + +| Component | Source | Role | +|---|---|---| +| `create_report` CLI | upstream PyPI package `igv-reports` | does the actual HTML rendering | +| `scripts/build_igvreports.py` | **this skill** | wraps `create_report` with default-track resolution, cohort/samplesheet mode, SIF auto-detect | +| `scripts/verify_{report,cohort,anchors}.py` | **this skill** | post-render structural + content audits (not in upstream) | +| `scripts/prep_track.sh` | **this skill** | bgzip+tabix utility for annotation tracks | + +## Install + +```bash +# 1. Install the UPSTREAM igv-reports package (provides `create_report`): +pip install -U 'igv-reports>=1.16.0' + +# 2. The skill's wrapper scripts ship inside this plugin. Once the plugin is +# installed, the scripts live alongside SKILL.md. +``` + +If you only need raw `create_report` (no cohort mode, no verifiers, no +auto-tracks), skip this skill entirely and use upstream directly — +see [igvteam/igv-reports](https://github.com/igvteam/igv-reports) docs. + +## Quickstart + +```bash +python scripts/build_igvreports.py \ + --genome hg38 \ + --sites sites.hg38.bed \ + --bam tumor.bam normal.bam \ + --fasta /path/to/hg38.fa \ + --no-default-tracks \ + --extra-track /path/to/cpg_islands.bed.gz \ + --extra-track /path/to/gencode.v47.annotation.gff3.gz \ + --output report.hg38.html +``` + +If you run many reports across the same genome build, set up a databases YAML +once (schema in `references/databases_config_paths.md`) and point +`$IGV_REPORTS_DB_CONFIG` at it — then `--fasta` and `--no-default-tracks` +become optional. + +## Environment overrides + +All optional. Set per-shell or in a project `.env`: + +| Var | Effect | +|---|---| +| `IGV_REPORTS_DB_CONFIG` | Path to a databases YAML resolving `--genome` to FASTA + default tracks (see `references/databases_config_paths.md`) | +| `IGV_REPORTS_SIF` | Path to an `igv-reports` apptainer SIF (offline / HPC use). Galaxy depot: `https://depot.galaxyproject.org/singularity/igv-reports:1.16.0--pyh7cba7a3_0` | +| `SAMTOOLS_SIF_DEFAULT` | Path to a `samtools` SIF (verifier only) | +| `IGV_REPORTS_BIND` | Colon-separated bind paths for singularity. Unset = no binds. | + +Driver flags `--fasta` and `--no-default-tracks` let you skip the databases +YAML entirely without setting any env var. `--no-apptainer` forces the PATH +`create_report` path even on a SLURM node. The hermetic `tests/unit/` suite +runs anywhere with `pytest` + Python ≥ 3.10. + +## When to use which entry point + +| User request | Entry point | +|---|---| +| "Make an HTML for these 5 SV breakpoints in tumor.bam" | **build** | +| "Give me one HTML per patient for the cohort integration calls" | **cohort** | +| "create_report fails with 'not BGZF' on this gencode" | **prep-track** | + +## Defaults (locked in) + +- Tracks always loaded, top-to-bottom in the viewer: + 1. CpG islands (BED, plain or bgzipped) + 2. Gencode full annotation (GFF3.gz, **transcripts + exons + CDS + UTRs**, NOT a gene-level-only file) + 3. RepeatMasker (BED.gz, bgzipped + tabix-indexed) + Plus the user's BAM(s), VCF, and any extra tracks they pass. +- `--flanking 300` bp on either side of each site (good for SV breakpoints + and point variants alike). Override per call if needed. +- `--standalone` so the HTML is offline-viewable. +- Output filename includes the genome tag — e.g. `cohort.hg38.html` — + so downstream genome-tag enforcement hooks pass. +- Reference FASTA is resolved either explicitly via `--fasta` or via the + YAML pointed to by `$IGV_REPORTS_DB_CONFIG`. Supported genome IDs out of + the box: `hg38`, `mm10`, `mm39`, `t2t_CHM13v2_plusY`, `GRCh37` (extend + `GENOME_ALIASES` in `scripts/build_igvreports.py` if needed). +- Per-genome default track availability when using the YAML is recorded in + `references/databases_config_paths.md` — read it before assembling tracks + so the skill doesn't try to load a track that doesn't exist for the + selected genome. + +## Sites BED format (critical) + +igv-reports' BED parser reads fields **by position** and trips on a header +row (`ValueError: invalid literal for int() with base 10: 'start'`). Always +emit a **plain headerless 4-column BED**: + +``` +chr start end name +chr2 25227855 25342590 DNMT3A_full_gene +``` + +Tab-separated. The `name` becomes the row label in the report's variant +table — make it specific enough to identify the site after deduping. + +The project's `enforce-genome-tag.sh` hook requires a genome tag in the BED +filename: use `sites.hg38.bed`, not `sites.bed`. + +## Pitfalls (the skill should encode and/or detect these) + +| Symptom | Root cause | Fix | +|---|---|---| +| `ValueError: invalid literal for int()` on first row | Header row in sites BED | Strip header — plain BED | +| `UnicodeDecodeError: byte 0x8b` reading a track | igv-reports reading bgzip as text | Filename must end `.gff3.gz` / `.bed.gz` AND be true bgzip (check with `file ` for "extra field") | +| `tabix: not BGZF` | Track was plain-gzipped, not bgzipped | Run **prep-track** entry point | +| `tabix: out of order` while indexing | GFF/GTF/BED records not pos-sorted within chr | **prep-track** does `sort -k1,1 -k4,4n` before bgzip | +| Annotation track empty in viewer | Tabix returns no rows in displayed window — often correct biology (e.g., CGI-distal site). Confirm with `tabix file region` | +| Genome ID lookup fails with `--genome hg38` | igv.js bundled IDs require internet at view + render time. Use `--fasta /path/to/local.fa` instead (always works offline) | + +Full pitfalls + create_report flag reference in `references/best_practices.md`. + +## How to run — quick recipe + +Ensure `create_report` is on PATH (`pip install -U 'igv-reports>=1.16.0'`). +If you use a conda env, activate it first. + +Then call the bundled driver script (paths relative to the installed plugin): + +```bash +python scripts/build_igvreports.py \ + --sites results/run/inputs/sites.hg38.bed \ + --bam tumor.bam normal.bam \ + --vcf calls.vcf \ + --genome hg38 \ + --fasta /path/to/hg38.fa \ + --no-default-tracks \ + --output results/run/reports/cohort.hg38.html +``` + +The driver: +- Resolves the genome's CpG / gencode / rmsk paths from `$IGV_REPORTS_DB_CONFIG` + if set, skipping any that aren't configured for the chosen genome. +- Validates the sites BED is headerless and that all rows have `start < end`. +- Calls `create_report` with `--flanking 300 --standalone`. +- Writes a logs/ entry capturing the full command, the flanking value, the + per-region embedded data sizes, and the resolved track list — useful for + reproducibility and audit-trail expectations. + +For multi-sample cohorts, use `--samplesheet samplesheet.tsv` instead of +`--bam/--vcf`. Samplesheet format: `sample, bam_tumor, bam_normal, vcf, sites_bed`. +The driver emits one HTML per sample plus a top-level `index.html` that lists +all samples with links. Layout matches the ATLL viral-integration reference +implementation: + +``` +results// +├── inputs//sites..bed +├── reports/..html +├── reports/index.html +└── logs/run_.log +``` + +## prep-track — fixing a non-bgzip track + +If a GFF3/GTF/BED.gz is plain-gzip rather than bgzip, igv-reports fails +silently or with an obscure error. Convert in place with backup: + +```bash +bash scripts/prep_track.sh /path/to/track.gff3.gz +``` + +The script: +1. Backs up the original to `.bak.original_gzip`. +2. `gunzip -c`s the file. +3. Sorts by `chr` then numeric `pos` (`sort -k1,1 -k4,4n`). + (Gencode delivers records interleaved by feature type at the same locus — + tabix requires pos-sorted.) +4. `bgzip`s in place. +5. `tabix -p `s. +6. Verifies a sample tabix query returns rows. + +Requires `bgzip` and `tabix` from htslib on PATH. + +## When generating an answer.md / run.sh for the user + +The driver script (`build_igvreports.py`) deliberately abstracts the +underlying `create_report` flags — it sets `--standalone`, `--fasta`, the +`--flanking 300` default, and the YAML-resolved annotation tracks +internally so the user doesn't have to remember them. That abstraction is +good for ergonomics but bad for auditability: a reviewer reading the +`answer.md` later can't see what flags are actually being invoked without +opening the driver source. + +To keep both: when you produce a runnable command for the user, **also +include a code block titled "Equivalent direct create_report invocation" +that shows the fully-expanded command** with all flags and resolved track +paths inline. The user should see the wrapper command they're going to +run AND the underlying command it expands to. Example: + +```` +## Run + +```bash +python build_igvreports.py --genome mm10 --sites peaks.mm10.bed \\ + --bam ./data/ip.bam ./data/input.bam \\ + --output reports/peaks_qc.mm10.html +``` + +### Equivalent direct create_report invocation + +```bash +create_report peaks.mm10.bed \\ + --fasta /path/to/mm10.fa \\ + --flanking 300 --standalone \\ + --tracks ./data/ip.bam ./data/input.bam \\ + /path/to/mm10_CpGIslands.bed \\ + /path/to/gencode.vM25.annotation.gtf.gz \\ + /path/to/rmsk_all_repeats_mm10.bed.gz \\ + --title "ChIP-seq peak QC (mm10) — IP vs Input" \\ + --output reports/peaks_qc.mm10.html +``` +```` + +This costs you ~10 lines and gives the reviewer a full audit trail. For +cohort runs, show the expanded form for ONE representative sample only — +the others differ only in BAM/VCF paths. + +## Post-render verification + +`scripts/verify_report.py` parses a built HTML and confirms it actually +contains what its inputs declared. Six checks: `html_exists`, +`html_min_size`, `region_count` (tableJson rows == sites BED rows), +`region_coords` (each BED row finds a matching `(chrom, start+1, end[, name])` +in tableJson — BED is 0-based, the HTML stores 1-based start), `region_sessions` +(sessionDictionary has one entry per row), and `tracks_present` (every +`name` from `--track-config` or every basename from positional `--tracks` +appears in the decoded igv.js session's `tracks[].name` list). + +```bash +python scripts/verify_report.py \ + --html results//reports/sample.hg38.html \ + --sites results//inputs/sites.hg38.bed \ + --track-config results//inputs/tracks.json \ + --min-size-mb 1.0 \ + --out results//reports/sample.verify.tsv \ + --fail-on-fail +``` + +Output is a TSV with columns `check / status / observed / expected / details` +(also printed to stdout). With `--fail-on-fail`, exits nonzero if any check +is FAIL — wire this into Snakemake / CI so the pipeline gates on render +quality, not just on `create_report`'s exit code. + +NOTE: `--standalone` replaces every track URL with an inlined `data:` URL +after slicing, so URL paths are unrecoverable from the embedded session. +The check matches on track NAMES (which `--standalone` preserves) — for +`--track-config` JSON pass meaningful names; positional `--tracks` mode +uses basenames. + +### Cohort-level verification (`verify_cohort.py`) + +The per-sample verifier above confirms each HTML is internally consistent +but cannot tell whether sample-1's HTML accidentally embeds sample-2's BAM +(e.g., samplesheet typo, copy-paste, tumor/normal slot swap). For cohort +runs, `scripts/verify_cohort.py` adds five cross-sample checks: + +| Check | What it asserts | +|---|---| +| `cohort_html_coverage` (global) | Each samplesheet row has exactly one HTML; flags missing + extras | +| `sample_tracks_match` (per-sample) | Each HTML's session contains every BAM/VCF basename declared in THAT row | +| `no_cross_sample_contamination` (per-sample) | Each HTML contains no basename that belongs to a DIFFERENT row's track columns (default tracks from `databases_config.yaml` are allow-listed) | +| `sample_id_embedded` (per-sample) | The `sample` column value appears in the HTML's `` or filename | +| `index_consistency` (global) | `index.html` links exactly the samplesheet sample set; each target exists and is non-empty | + +**Auto-invoked by default** at the end of `build_igvreports.py --samplesheet` +cohort runs. Disable with `--no-verify`; gate the pipeline with +`--fail-on-fail`. Standalone invocation: + +```bash +python scripts/verify_cohort.py \ + --samplesheet samplesheet.tsv \ + --reports-dir results/<run>/reports/ \ + --genome hg38 \ + --out results/<run>/reports/cohort_verify.tsv \ + --summary results/<run>/reports/cohort_verify.summary.md \ + --fail-on-fail +``` + +The TSV adds a `sample` column on top of the per-sample verify schema, with +`"*"` for cohort-global rows. The markdown rollup (`--summary`) groups +PASS/FAIL counts by check + lists every failure inline. + +Worked regression: `tests/integration/cohort_verify/scenarios.sh` builds a +3-sample cohort and asserts each of four corruption scenarios (missing +HTML, sample swap, index drift, truncated HTML) triggers the expected +check FAILs. + +### Content verification (`verify_anchors.py`) — opt-in, slow + +`verify_cohort.py` proves the HTML *says* the right thing. It can NOT +confirm the embedded BAM *slice* contains the data it claims to. Two +failure modes slip past structural checks: + +1. **Sample swap with matching basename** — the cohort loop wired the wrong + BAM into `sample_1`'s build, but the swapped BAM's `Path.stem` happens + to match what `sample_1`'s row declared (or two files in different dirs + share a basename). Track name passes; slice content is wrong. +2. **Silent empty slice** — region rendered, but the slice has 0 reads + (failed `samtools index`, source BAM corruption, coords outside coverage). + +`scripts/verify_anchors.py` closes the gap by re-running `samtools view -c` +against both the source BAM (at generate time) and the embedded slice (at +verify time), then comparing counts. Two-mode workflow: + +```bash +# 1. After the cohort renders cleanly, freeze the read counts as a regression fixture. +python scripts/verify_anchors.py generate \ + --samplesheet samplesheet.tsv \ + --sites sites.hg38.bed \ + --out anchors.hg38.tsv + +# 2. Re-verify any time after — works against a fresh build of the same inputs, +# or to audit an existing HTML for unexpected content drift. +python scripts/verify_anchors.py verify-cohort \ + --samplesheet samplesheet.tsv \ + --reports-dir results/<run>/reports/ \ + --genome hg38 \ + --anchors anchors.hg38.tsv \ + --out results/<run>/reports/cohort_verify_anchors.tsv \ + --fail-on-fail +``` + +Or chained into the build driver: + +```bash +# Freeze anchors at build time: +python scripts/build_igvreports.py --samplesheet ... --anchors-mode generate \ + --anchors anchors.hg38.tsv + +# Verify a later build against frozen anchors: +python scripts/build_igvreports.py --samplesheet ... --anchors-mode verify \ + --anchors anchors.hg38.tsv --fail-on-fail +``` + +Anchors TSV schema (`#`-prefixed header per lab BED convention): + +``` +#sample track_name chrom start end expected tolerance min max notes +``` + +`tolerance` is a ratio (default 5%). `min`/`max` are absolute bounds that +override tolerance when set — useful for known-positive sites like +"this integration must have ≥20 reads". + +samtools is resolved in this order: `--samtools-sif PATH` → `$SAMTOOLS_SIF` +→ `$SAMTOOLS_SIF_DEFAULT` → PATH `samtools`. On HPC, prefer a SIF to avoid +the NFS conda cold-start tax. + +**Why opt-in and not default:** the verify step shells out to samtools per +(sample × region) and indexes each slice — ~1 s/anchor. For a 6-sample +cohort × 50 regions that's ~5 min on top of the structural verify (which +runs in seconds). Reach for this when sample swap or content regression +is a real concern; the structural verifier is sufficient for routine builds. + +Worked regression: `tests/integration/anchor_verify/scenarios.sh` builds a +2-sample cohort and asserts each of four content scenarios (tolerance +violation, min-bound violation, corrupted slice, missing anchor) triggers +the expected PASS / FAIL / SKIP outcome. + +## Output and workflow logging + +Every run logs to `logs/run_<YYYYMMDD_HHMMSS>.log` next to the reports dir. +The log captures: +- Resolved track paths (per genome, after databases_config.yaml lookup). +- The exact `create_report` command. +- The flanking value used (default **300 bp** — this is the value that's + baked into all the embedded data slices, so audit trails depend on it). +- Per-region embedded data sizes (extracted post-render so the user can + see which regions inflated the HTML). +- Total HTML size. + +This satisfies CLAUDE.md §"Logging and Audit Trail" — every run is +reproducible from the log alone. + +## Track choice nuances + +For gencode on hg38, the default points at +`gencode.v47.annotation.gff3.gz` (full annotation, bgzip + tabix). This +gives transcript models with exons / CDS / UTRs. The gene-level-only +companion (`gencode.v47.genes.annotation.sorted.gff3.gz`) renders only +solid gene boxes and is fine for high-zoom views, but the full annotation +is the right default for read-level inspection at integration / fusion / +SV junctions. + +For mouse genomes, `databases_config.yaml` ships `.gtf.gz` paths instead. +GTFs work in igv-reports if bgzip + tabix-indexed; **prep-track** converts +plain-gzip GTFs the same way it does GFF3s. + +For T2T-CHM13, only the FASTA + GTF + CGI are indexed in our DB; rmsk is +absent and is auto-skipped by the driver. The variant table will load +without rmsk; flag this in the run log. + +## Common-case examples + +The `examples/` directory has runnable templates: + +- `single_sample.sh` — one BAM + one VCF + a sites BED → one HTML. +- `cohort_samplesheet.sh` — TSV-driven multi-sample run. +- `prep_track_demo.sh` — convert a plain-gzip gencode to bgzip+tabix. +- `methylation_ont/` — ONT 5mC/5hmC viewer (BAM with `colorBy: basemod2` + + per-sample bedGraph at fixed y-axis 0..100). End-to-end worked + example with pre-sliced data; recipe.md explains the slots. + +These are reference implementations; copy and edit them for new runs +rather than starting from scratch. + +## Tests + +Three-layer suite under `tests/`, orchestrated by `tests/run_all.sh`: + +| Layer | What it covers | Runtime | Needs | +|---|---|---|---| +| **unit** (`tests/unit/`) | parser layer of `verify_report.py` + `verify_anchors.py` — TSV loading, status decision, session-entry locator, balanced-brace JSON extractor, decode round-trip — all with synthetic inputs | ~1 s | pytest | +| **smoke** (`tests/smoke/`) | `samtools_count` / `samtools_index` / full slice-decode-and-count round-trip against the committed `tests/fixtures/tiny_colo829.hg38.bam` (457 KB, sliced from public ONT COLO829 release) | ~3 s | pytest + samtools (SIF or PATH) | +| **integration** (`tests/integration/`) | end-to-end: build a 2-/3-sample cohort, structural verify, anchor verify, run 4 corruption scenarios per verifier | ~7 min cold, ~30 s cached | full cohort BAMs (lab default OR `IGV_REPORTS_TEST_BAM_{1,2,3}` env override). SKIPs with exit 77 if neither is available | + +```bash +bash tests/run_all.sh # all three layers +bash tests/run_all.sh --unit-only # ~1 s — fastest feedback loop +bash tests/run_all.sh --no-integration # ~12 s — works on any machine +bash tests/run_all.sh --integration-only +``` + +The fixture provenance + regeneration recipe live in +[tests/fixtures/README.md](tests/fixtures/README.md). Anchor counts the +smoke layer expects (chr2=5, chr7=9) are the contract — any fixture +regeneration that changes them must also update the smoke test constants. + +## ONT methylation viewers (specialized path) + +For per-read 5mC/5hmC visualization the positional `--tracks` API does +not work — you need named tracks with `colorBy: "basemod2"` on the BAMs +and `min: 0, max: 100` on the bedGraph tracks (cross-sample y-axis lock, +see `rules/igv.md`). Use the `--track-config <json>` passthrough: + +```bash +# 1. Write a YAML spec listing samples (see tracks_spec.example.yaml). +# 2. Generate tracks.json with the right defaults baked in: +python scripts/generate_tracks_json.py \ + --spec tracks_spec.yaml --run-dir results/<run>/ \ + --out results/<run>/tracks.json + +# 3. Build the report: +python scripts/build_igvreports.py \ + --sites results/<run>/sites.hg38.bed \ + --track-config results/<run>/tracks.json \ + --genome hg38 --flanking 0 \ + --type mutation --info-columns name \ + --output results/<run>/methylation_report.hg38.html +``` + +Key methylation-specific defaults: +- `--flanking 0` (sites BED already encodes the window — promoter/gene span). +- `--info-columns name` (surface the BED `name` column in the variant table). +- `--type mutation` (one-locus view per row; not split-screen). +- bedGraph not bigwig — igv-reports cannot slice `.bw` directly. + +When `--track-config` is set the driver bypasses the auto-resolved +default annotation tracks (CGI / gencode / rmsk) and the `--bam` / +`--vcf` / `--extra-track` flags — the JSON is the source of truth. +Build annotation slices into the JSON instead. + +**`--apptainer` is auto-detected**: the driver flips to the apptainer SIF +pointed to by `$IGV_REPORTS_SIF` (igv-reports 1.16.0, ~83 MB, pulled from +the Galaxy depot) when `SLURM_JOB_ID` is in the environment — i.e. running +on a compute node where the NFS conda cold-start tax matters. On the login +node or when `$IGV_REPORTS_SIF` is unset, the driver uses PATH +`create_report`. Override with `--apptainer` / `--no-apptainer`; the +decision lands in the run log. + +Full recipe and rationale: `references/methylation_ont.md`. Worked +example with real data: `examples/methylation_ont/`. + +## See also + +- `references/best_practices.md` — full create_report flag reference, + format gotchas, performance notes. Read this if a run fails in a way + not listed in the Pitfalls table above. +- `references/databases_config_paths.md` — per-genome track availability + matrix and exact YAML keys. Read this when adding a new genome or + diagnosing a missing-track warning. +- `references/methylation_ont.md` — ONT 5mC/5hmC cheat-sheet (colorBy, + min:0/max:100, flanking=0, bedGraph vs bigwig, EPDnew lookup). +- `scripts/build_igvreports.py` — the driver. Reads `--samplesheet` or + `--bam/--vcf` direct-args, resolves tracks, validates the sites BED, + writes the HTMLs and the run log. Supports `--track-config <json>` + passthrough for fully-styled track sets. +- `scripts/generate_tracks_json.py` — YAML spec → tracks.json with + ONT-methylation defaults baked in (colorBy=basemod2, min:0/max:100, + group-paired Okabe-Ito colors). +- `scripts/verify_report.py` — post-render structural verifier; parses + the HTML's embedded tableJson + sessionDictionary, confirms region + count / coordinates / track names match the inputs. Emits a verify.tsv + and gates on `--fail-on-fail`. +- `scripts/verify_cohort.py` — cohort-level verifier; layered on top of + verify_report's per-sample checks, adds cross-sample contamination + scanning + index.html / sample-id consistency. Auto-invoked at the end + of `build_igvreports.py --samplesheet`; standalone-runnable too. +- `scripts/verify_anchors.py` — content verifier; samtools-counts the + embedded BAM slices and compares to anchors frozen from the source BAMs + at build time. Catches sample swaps that share basenames and silent + empty slices. Opt-in via `--anchors-mode generate|verify` on the build + driver; slow (~1 s/anchor). See SKILL.md content-verification section. +- `scripts/prep_track.sh` — gunzip → sort → bgzip → tabix utility. +- `igv-screenshots` skill — the **static PNG/PDF/SVG** counterpart based + on igver. Use it instead of this one when the deliverable is a + publication-quality figure rather than a clickable viewer. +- Upstream development: https://github.com/sahuno/igv-reports-skill + — file issues there for skill-level bugs; file issues at + https://github.com/igvteam/igv-reports for `create_report` rendering bugs. diff --git a/igv-reports/examples/portable/README.md b/igv-reports/examples/portable/README.md new file mode 100644 index 0000000..ef14a21 --- /dev/null +++ b/igv-reports/examples/portable/README.md @@ -0,0 +1,20 @@ +# examples/portable + +Reference invocations using only paths and tools you control (no lab +`databases_config.yaml`. Each script accepts environment-variable +overrides for input paths, with `${HOME}/data/...` defaults you can edit +in-place or override at call time: + +```bash +FASTA=/path/to/hg38.fa TUMOR_BAM=/path/to/tumor.bam \ + bash examples/portable/single_sample.sh +``` + +| Script | What it does | +|---|---| +| `single_sample.sh` | Builds one HTML for a tumor/normal pair at two SNV sites | +| `cohort_samplesheet.sh` | Builds per-sample HTMLs + index.html from a 2-row samplesheet | + +For more advanced examples (cohort orchestration, ONT methylation viewer +presets), see the upstream development repo at +https://github.com/sahuno/igv-reports-skill. diff --git a/igv-reports/examples/portable/cohort_samplesheet.sh b/igv-reports/examples/portable/cohort_samplesheet.sh new file mode 100644 index 0000000..5530f05 --- /dev/null +++ b/igv-reports/examples/portable/cohort_samplesheet.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# examples/portable/cohort_samplesheet.sh — generic cohort build. +# +# Builds one HTML per row of a TSV samplesheet, plus an index.html linking +# them all. Demonstrates the samplesheet format and the most common flags. + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +WORKDIR="${WORKDIR:-${PWD}/igv_reports_cohort_demo}" +mkdir -p "$WORKDIR" && cd "$WORKDIR" + +# --- inputs (edit these) --- +FASTA="${FASTA:-${HOME}/data/hg38/hg38.fa}" +GENCODE_GFF="${GENCODE_GFF:-${HOME}/data/hg38/gencode.v47.annotation.gff3.gz}" + +# --- samplesheet (one row per sample) --- +# Required columns: sample, sites_bed +# Optional columns: bam_tumor, bam_normal, vcf, extra_tracks (comma-separated) +cat > cohort.tsv <<EOF +sample bam_tumor bam_normal vcf sites_bed +p001 ${HOME}/data/p001/tumor.bam ${HOME}/data/p001/normal.bam sites.hg38.bed +p002 ${HOME}/data/p002/tumor.bam ${HOME}/data/p002/normal.bam sites.hg38.bed +EOF + +# --- shared sites for both patients --- +cat > sites.hg38.bed <<'EOF' +#chrom start end name +chr2 25246499 25246500 DNMT3A_R882 +chr7 148884000 148884001 EZH2_Y646 +EOF + +python "${REPO_ROOT}/scripts/build_igvreports.py" \ + --genome hg38 \ + --samplesheet cohort.tsv \ + --fasta "${FASTA}" \ + --no-default-tracks \ + --extra-track "${GENCODE_GFF}" \ + --output-dir reports \ + --no-apptainer + +echo "Done. Open ${WORKDIR}/reports/index.html in a browser." +echo "Cohort verifier ran automatically; see reports/cohort_verify.summary.md." diff --git a/igv-reports/examples/portable/single_sample.sh b/igv-reports/examples/portable/single_sample.sh new file mode 100644 index 0000000..7296b48 --- /dev/null +++ b/igv-reports/examples/portable/single_sample.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +# examples/portable/single_sample.sh — generic single-sample build. +# +# Builds one HTML for a tumor/normal pair at a handful of SNV sites. +# Assumes: +# - `pip install igv-reports` has put `create_report` on PATH. +# - You have your own hg38 FASTA (with .fai sibling) and BAMs. +# - You have your own gencode + CpG-islands track files (or skip them +# with --no-default-tracks alone). +# +# Set these to match your environment before running. + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)" +WORKDIR="${WORKDIR:-${PWD}/igv_reports_demo}" +mkdir -p "$WORKDIR" && cd "$WORKDIR" + +# --- inputs (edit these) --- +FASTA="${FASTA:-${HOME}/data/hg38/hg38.fa}" # must have ${FASTA}.fai +TUMOR_BAM="${TUMOR_BAM:-${HOME}/data/tumor.bam}" +NORMAL_BAM="${NORMAL_BAM:-${HOME}/data/normal.bam}" +GENCODE_GFF="${GENCODE_GFF:-${HOME}/data/hg38/gencode.v47.annotation.gff3.gz}" # bgzip+tabix +CPG_ISLANDS="${CPG_ISLANDS:-${HOME}/data/hg38/hg38_CpGIslands.bed}" + +# --- sites BED (4 cols: chrom, start, end, name) --- +cat > sites.hg38.bed <<'EOF' +#chrom start end name +chr2 25246499 25246500 DNMT3A_R882 +chr7 148884000 148884001 EZH2_Y646 +EOF + +python "${REPO_ROOT}/scripts/build_igvreports.py" \ + --genome hg38 \ + --sites sites.hg38.bed \ + --bam "${TUMOR_BAM}" "${NORMAL_BAM}" \ + --fasta "${FASTA}" \ + --no-default-tracks \ + --extra-track "${GENCODE_GFF}" \ + --extra-track "${CPG_ISLANDS}" \ + --info-columns name \ + --output report.hg38.html \ + --no-apptainer + +echo "Done. Open ${WORKDIR}/report.hg38.html in a browser." diff --git a/igv-reports/references/best_practices.md b/igv-reports/references/best_practices.md new file mode 100644 index 0000000..4fe5c64 --- /dev/null +++ b/igv-reports/references/best_practices.md @@ -0,0 +1,158 @@ +# igv-reports best practices + +Authoritative companion to the skill. Read this when something fails in a +way the SKILL.md pitfalls table doesn't cover, or when introducing a new +input format / track type. + +## Sites/regions input + +Supported by `create_report`: +- **VCF** — variant table is built from CHROM/POS/ID/REF/ALT plus any + `--info-columns` you surface from INFO and `--sample-columns` from + FORMAT. Use `--idlink "https://url/$$"` to make ID a clickable link. +- **BED** — fields parsed by position: `chr / start / end [/ name]`. + A **non-comment header row** (e.g., `chrom start end name`) crashes + `create_report` with `ValueError: invalid literal for int()` because + the parser tries to `int()` the string `start`. A `#`-prefixed comment + header (e.g., `#chrom\tstart\tend\tname`) IS accepted — `create_report` + skips lines starting with `#`. This matches the lab's "BED-like outputs + must have a `#`-prefixed header" convention in CLAUDE.md. +- **MAF** — Mutation Annotation Format (TCGA standard). +- **BEDPE** — paired-end / fusion / SV format. With `--type fusion` each + row is rendered as a multi-locus split-screen view. +- **Generic TSV** — any tab-delimited file. Requires `--sequence`, + `--begin`, `--end` to name the chrom/start/end columns. Add + `--zero_based` if 0-based. + +**File-extension dispatch**: igv-reports picks the parser by extension, +not content. `.bed` → BED parser (which IGNORES `--sequence/--begin/--end`). +If you want a TSV-with-header parsed by name, the extension must NOT be +`.bed`/`.vcf`/`.gff3`/`.maf` — use `.tsv` or `.txt`. + +The project's `enforce-genome-tag.sh` hook requires a genome tag in the +filename: `sites.hg38.bed`, not `sites.bed`. + +## Tracks + +Supported track formats: BAM, CRAM, VCF, BED, GFF3, GTF, WIG, BEDGRAPH. + +**Indexing**: +- BAM/CRAM/VCF MUST be indexed (`.bai`/`.crai`/`.tbi` sidecar). +- Large `.bed.gz` / `.gff3.gz` / `.gtf.gz` SHOULD be tabix-indexed + (`.tbi` sidecar) and **must be true bgzip** — not plain gzip. +- Check format with `file <name>` — true bgzip says + `gzip compressed data, extra field, original size 0`. Plain gzip + has no "extra field". igv-reports trips on plain-gzip .gff3.gz with + cryptic `UnicodeDecodeError: byte 0x8b at position 1` — that 0x8b is + the gzip magic byte the parser is reading as text. + +**Sortedness**: gencode and many other GFF/GTF distributions interleave +records by feature type at the same locus (gene → transcript → exon → CDS → +exon → CDS → ...) rather than strictly position-sorted within each +chromosome. tabix requires pos-sorted within chr. Fix: +`sort -k1,1 -k4,4n` on the body, then bgzip + tabix. The `prep-track` +script in this skill does the full pipeline with backup. + +**Track render order**: the order you pass to `--tracks` is the order +they appear in the IGV.js viewer (top-to-bottom). Convention: +1. BAM/CRAM (the data you want to evaluate) +2. VCF (the calls being inspected) +3. Annotation tracks (genes, regulatory, repeats, CGI) + +The skill defaults always render annotation tracks LAST so they sit at +the bottom and don't push the read evidence off-screen. + +## Reference + +One of `--fasta`, `--twobit`, or `--genome` is required. + +- `--fasta /path/to/local.fa` (with `.fai`) — fully offline, supports + custom or combined references (e.g., host + viral). +- `--genome hg38` — uses igv.js bundled IDs, but **requires internet at + view AND render time** because igv.js fetches the bundled genome. + Avoid for HPC/offline. +- `--twobit` — alternative reference in 2bit format. + +For combined viral+host references, the single FASTA must include all +contigs, and any per-contig tracks must align (e.g., HTLV1_features.bed +must use the same contig name as in the FASTA). + +## Window sizing + +`--flanking N` (igv-reports default 1000, this skill default **300**) +adds N bp on either side of each site. + +| Use case | Recommended flanking | +|---|---| +| Point variants (SNV/indel) | 50–200 bp | +| SV / integration breakpoints | 300–1000 bp (this skill: 300) | +| Whole-gene context | gene length + 5–10 kb | + +`--maxlen N` (default 10,000) — variants exceeding this length switch to +split-screen multilocus view automatically. Useful for SVs > 10 kb. + +`--window N` — initial visible window inside the embedded igv.js viewer +(if not supplied, igv.js defaults to 41 bp, which is too narrow for +read-level inspection). Set to ~`2 × flanking` so the user lands on the +full embedded slice. + +## Output + +- `--standalone` embeds all igv.js JS in the HTML → fully offline, + 4–11 MB per patient typical for cohort runs. +- `--no-embed` keeps external URLs → smaller HTML but online required. + Avoid for HPC/sharing-by-email. + +Per-region BAM data is ALWAYS sliced and embedded by default; only the +flanking-sized portion of large BAMs ships in the HTML — so the HTML stays +manageable even when input BAMs are 100+ GB. + +## Variant table customization + +For VCF input: +- `--info-columns SVTYPE SVLEN ALIGNED_POS DR DV VAF` surfaces those + INFO fields as table columns. +- `--info-columns-prefixes ANN_ HTLV1_` includes any INFO field starting + with the listed prefixes. +- `--sample-columns DP AD GT` (with optional `--samples NAME`) surfaces + per-sample FORMAT fields. +- `--idlink "https://example.com/$$"` makes the VCF ID column clickable + with `$$` replaced by the ID value. + +Order of operations: include `--info-columns` for the call-quality fields +your reviewer needs to see at a glance; the rest is one click into the +variant detail. + +## Performance / size control + +- `--subsample 0.0-1.0` — keep a fraction of BAM alignments per region. + Use for very deep BAMs (>100×) where the rendered viewer would be + read-cluttered. +- `--exclude-flags 1536` (default) — excludes duplicates and QC-fail + reads. Set to 0 to keep everything. +- Render time scales roughly linearly with `n_regions × n_tracks`. The + ATLL cohort run (6 patients × 1–3 integrations + HTLV1 + EBV regions, + 6 tracks) took ~2 min/patient with the gene-level GFF and ~3 min/patient + with the full annotation. + +## Pitfalls observed in production + +| Symptom | Root cause | Fix | +|---|---|---| +| `ValueError: invalid literal for int() with base 10: 'start'` | Non-comment header row in BED sites file | Prefix the header with `#` (skipped by create_report and matches lab convention); or strip it entirely | +| `UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b` | igv-reports reading bgzip as text (file actually plain-gzip but with `.gz` ext) | Convert with prep-track; verify with `file <name>` | +| `tabix: not BGZF` | Plain gzip masquerading as `.gz` | `gunzip → bgzip → tabix` | +| `tabix: out of order` | GFF/GTF/BED records not pos-sorted within chr | `sort -k1,1 -k4,4n` first | +| Empty annotation track in viewer | Tabix lookup returns nothing in window. Often correct biology (e.g., CGI-distal site) — verify with `tabix file region` | +| Title shows weird characters | Unicode em-dash (`—`) in `--title` got mangled by shell escaping | Use plain ASCII `-` | +| HTML loads but viewer is blank | `--genome hg38` without internet at view time | Use `--fasta` + `--standalone` | +| `tabix` index missing for a track | igv-reports looked for `<track>.tbi`, not present | Re-run `tabix -p <gff|gtf|bed>` | +| `samtools index` errors mid-render | BAM index stale (BAM modified after `.bai`) | `samtools index -@ 4 file.bam` | +| Output HTML size much larger than expected | Some region accidentally spans Mb-scale (e.g., a row with start=0 end=chrom_length); flanking compounds this | Validate the sites BED — `awk '$3-$2 > 1e6'` to find offenders | + +## See also + +- Official docs: https://github.com/igvteam/igv-reports +- igv.js track config schema: https://github.com/igvteam/igv.js/wiki/Tracks-2.0 +- This skill's `references/databases_config_paths.md` for which YAML keys + hold which tracks per genome. diff --git a/igv-reports/references/databases_config_paths.md b/igv-reports/references/databases_config_paths.md new file mode 100644 index 0000000..466d13f --- /dev/null +++ b/igv-reports/references/databases_config_paths.md @@ -0,0 +1,70 @@ +# Databases-config YAML schema (for `--db-config` / `$IGV_REPORTS_DB_CONFIG`) + +Optional. Without a databases YAML the driver still works — pass `--fasta` and +`--no-default-tracks` (plus any `--extra-track` you need) on every call. + +The YAML is convenient when running across many regions/cohorts on the same +genome build: one file maps a short `--genome <id>` flag to the FASTA + the +default annotation tracks (CpG islands, gencode, RepeatMasker), so each +invocation stays short. + +## Schema + +```yaml +reference_genomes: + local: + <genome_id>: + fasta: <path> # required + gtf: <path> # gencode .gtf.gz or .gff3.gz (bgzip + tabix preferred) + sizes: <path> # chrom.sizes (optional) + CpGIslands: <path> # .bed (uncompressed or bgzip) + repMaskerBed: <path> # .bed.gz (bgzip + tabix) +``` + +`<genome_id>` is the value you pass to `--genome`. Suggested IDs and aliases: + +| `--genome` value | YAML key | Common alias | +|----------------------|---------------------|--------------| +| `hg38` | `hg38` | GRCh38 | +| `mm10` | `mm10` | GRCm38 | +| `mm39` | `mm39` | GRCm39 | +| `t2t` / `chm13` | `t2t_CHM13v2_plusY` | T2T-CHM13v2 | +| `grch37` / `hg19` | `GRCh37` | hg19 | + +The driver normalizes the input alias to the canonical YAML key. Extend +`GENOME_ALIASES` in `scripts/build_igvreports.py` if you need additional builds. + +## Default-track resolution + +For the `--genome` you pass, the driver tries to load three default tracks: + +1. **CpG islands** → `CpGIslands` key +2. **Gene annotation** → `gtf` key (prefers a sibling `*.gff3.gz` if present) +3. **RepeatMasker** → `repMaskerBed` key + +Any track absent from the YAML for that genome is logged as a warning and +skipped — the report still builds, just without that track. + +## Gencode preference: GFF3 over GTF + +If `gtf` points at `gencode.<version>.annotation.gtf.gz` and a sibling +`gencode.<version>.annotation.gff3.gz` exists in the same directory, the +driver prefers the GFF3 — it carries the full transcript / exon / CDS / UTR +detail that's most useful for read-level inspection at SV / fusion / integration +junctions. The GTF (gene-level) loads as a fallback. + +Override with `--gencode-from-yaml` to force the YAML's `gtf` path regardless. + +## EPDnew (methylation-specific) + +`EPDnewCoding` / `EPDnewNonCoding` keys (BED.gz, bgzip + tabix) are +**not** auto-loaded — methylation-specific. Reference them explicitly via a +`--track-config tracks.json` entry when building a methylation viewer (see +`references/methylation_ont.md`). + +## Missing tracks → workflow + +1. Build or locate the BED / GFF3 / GTF. +2. If it needs bgzip + tabix conversion, run `scripts/prep_track.sh <path>`. +3. Add the path to your `databases_config.yaml` under the appropriate key, or + pass it via `--extra-track <path>` for a one-off run. diff --git a/igv-reports/references/methylation_ont.md b/igv-reports/references/methylation_ont.md new file mode 100644 index 0000000..8764546 --- /dev/null +++ b/igv-reports/references/methylation_ont.md @@ -0,0 +1,243 @@ +--- +name: methylation_ont +genome: hg38 | mm10 | mm39 | t2t +assay: ONT 5mC + 5hmC (CpG) +worked_example: ../examples/methylation_ont/ +--- + +# ONT methylation viewer — cheat-sheet + +Targeted reference for building an igv-reports HTML that shows per-read +5mC/5hmC base-modification calls (BAM, basemod2 coloring) plus per-sample +methylation-fraction bedGraph tracks at fixed promoter / gene / DMR windows. + +When this skill needs to build a methylation viewer, the **default path +(positional `--tracks`) is wrong** — methylation viewers need named, +colored, y-axis-locked tracks. The right path is: + +```bash +build_igvreports.py --track-config tracks.json ... +``` + +with `tracks.json` either generated from a YAML spec (see worked example) +or hand-written from `tracks.template.json`. + +## The four-thing checklist + +### 1. BAM tracks need `colorBy: "basemod2"` + +```json +{ + "name": "<sample>", + "url": "<bam>", + "indexURL": "<bam>.bai", + "format": "bam", + "type": "alignment", + "colorBy": "basemod2", + "showSoftClips": false, + "displayMode": "COLLAPSED" +} +``` + +Without `colorBy: "basemod2"`, the BAM renders as plain alignments +without the per-base 5mC/5hmC colors that are the whole point of the +view. `displayMode: "COLLAPSED"` keeps the BAM panel short so the +bedGraph summary tracks below stay visible. + +### 2. bedGraph tracks need fixed `min: 0, max: 100` + +```json +{ + "name": "<sample> 5mC", + "url": "<bedgraph>", + "format": "bedgraph", + "type": "wig", + "color": "rgb(0,68,136)", + "min": 0, "max": 100 +} +``` + +modkit's bedmethyl output is **percent (0..100)**, not fraction (0..1) — +the y-axis ceiling must be 100. IGV's per-track autoscale defaults +differ per track and hide real cross-sample differences (one sample +might autoscale to 0..82, the next to 0..100; same bar height means +different methylation). Lock all samples' bedGraph tracks to the same +0..100 range. See `rules/igv.md` for the original incident. + +**Use bedGraph, not bigwig.** igv-reports' Python slicer (`utils.getreader`) +dispatches on file extension and has no `.bw` reader — runs fail with +`Exception: Unknown file format`. Pre-slice bigwigs over the report +regions with `bigWigToBedGraph -chrom -start -end <bw> <bg>`, one +output per region, then `cat >>` them into a single bedGraph (UCSC +`bigWigToBedGraph` opens `/dev/stdout` with `O_TRUNC` between calls — +piping multiple invocations loses everything but the last region). + +### 3. `--flanking 0` when sites encode the desired window + +For methylation viewers the sites BED almost always carries the desired +window directly (a promoter span, a DMR, a gene body). Adding 300 bp of +flanking adds nothing and shifts the initial viewer frame. Pass +`--flanking 0` and let the BED row coordinates be the frame. + +The 300 bp default is right for the SV/integration breakpoint workflow +this skill was extracted from — there the BED row is a one-base +breakpoint and you need flanking to see read support. + +### 4. Sites BED with `#chrom\tstart\tend\tname` comment header is fine + +The skill's older docs say "headerless" because non-`#` header rows +crash `create_report` with `ValueError: invalid literal for int()`. +A line starting with `#` is treated as a comment and is fine — and +matches CLAUDE.md's "BED-like outputs must have a `#`-prefixed +header" rule. Use: + +``` +#chrom start end name +chr2 25246000 25259000 DNMT3A_2_promoter +``` + +Pair this with `--info-columns name` so the `name` column shows up in +the report's variant table. + +## Track ordering + +Render order is top-to-bottom in the viewer; put annotation FIRST so +gene tracks anchor the user's eye at the top, then per-sample BAM + 5mC ++ 5hmC triplets stacked below in sample-group order. The worked example +follows: gencode → EPDnew → CpGIslands → RepeatMasker → (per-sample: +BAM, 5mC, 5hmC). + +## Colors (Okabe-Ito, group-paired) + +For two-group studies (e.g., normal vs tumor) pick two color pairs out +of the Okabe-Ito palette so groups are pre-attentively distinguishable: + +| Group | 5mC color | 5hmC color | +|--------|---------------------|----------------------| +| Group A (normal) | `rgb(0,68,136)` blue | `rgb(204,121,167)` reddish-purple | +| Group B (tumor) | `rgb(213,94,0)` vermillion | `rgb(230,159,0)` orange | + +Annotation track colors (also Okabe-Ito): EPDnew = vermillion +`rgb(213,94,0)`, CpG islands = bluish-green `rgb(0,158,115)`, +RepeatMasker = sky-blue `rgb(86,180,233)`. + +`scripts/generate_tracks_json.py` reads these from a `group_colors:` +map in the YAML spec, so a new group only needs one entry. + +## EPDnew promoter track (hg38) + +If your `databases_config.yaml` carries EPDnew for hg38, the suggested +keys are: + +```yaml +reference_genomes: + local: + hg38: + EPDnewCoding: <path-to>/Hs_EPDnew.hg38.bed.gz + EPDnewNonCoding: <path-to>/HsNC_EPDnew.hg38.bed.gz +``` + +Source: <https://epd.expasy.org/epd/human/human_database.php?db=human> + +The skill driver doesn't load these by default — they're a methylation- +specific track. Either reference them directly from `tracks.json` or add +an `EPDnew` entry to a custom `annotation:` section in your YAML spec. +mm10 / mm39 / t2t builds don't ship with EPDnew. + +## Reference-fasta vs `--genome hg38` + +Always pass `--fasta` (skill driver default), never `--genome hg38`. +The igv.js bundled genome IDs require internet at view + render time; +`--fasta` + `--standalone` produces a fully-offline HTML. See +`references/best_practices.md` Reference section. + +## When to use the apptainer SIF (mostly automatic) + +The driver auto-detects whether to run via an apptainer SIF or PATH +`create_report` based on `SLURM_JOB_ID` and `$IGV_REPORTS_SIF`: + +| Environment | Default | Why | +|---|---|---| +| Local / login node (`SLURM_JOB_ID` unset) | PATH `create_report` | No cold-start tax; simplest path. | +| Compute node under SLURM (`SLURM_JOB_ID` set) AND `$IGV_REPORTS_SIF` points at an existing SIF | apptainer + SIF | Fresh node = cold NFS cache = 1-2 M page faults on conda init (~2.5 us each). The SIF reads once into RAM, then stays warm. | +| Compute node BUT no SIF set/found | falls back to PATH `create_report` (logged) | Safe default; no surprise SIF-not-found error. | + +Override either way with `--apptainer` / `--no-apptainer`. The decision +(auto vs. explicit) is logged at run start so post-mortems are unambiguous. + +To set up the SIF once, pull from the Galaxy depot: + +```bash +export IGV_REPORTS_SIF=/path/to/igv-reports_1.16.0.sif +wget -O "$IGV_REPORTS_SIF" \ + 'https://depot.galaxyproject.org/singularity/igv-reports:1.16.0--pyh7cba7a3_0' +``` + +**Mandatory `--cleanenv` for the SIF (driver handles it).** Host RHEL 8 +exports `SSL_CERT_FILE=/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem` +which doesn't exist inside the Galaxy-depot SIF. `create_report`'s +standalone build path makes an HTTPS GET (likely for the IGV.js +ideogram CDN) that crashes with `[SSL: CERTIFICATE_VERIFY_FAILED]` +mid-render. The driver always invokes `singularity exec --cleanenv ...` +to scrub host env vars before they enter the SIF, so users don't need +to remember the flag. If you call create_report from the SIF directly +(bypassing the driver), include `--cleanenv` yourself. See +`rules/apptainer_env_leak.md` for the full pattern. + +## Worked example + +`../examples/methylation_ont/` is the canonical end-to-end run: +- 4 COLO829 ONT samples (2 normal-blood × 2 tumor) +- 2 promoter windows (DNMT3A_2 + EZH2) +- 5mC + 5hmC bedGraph per sample (8 bedGraph files, pre-sliced) +- gencode + EPDnew + CGI + rmsk annotation slices + +Run `bash examples/methylation_ont/build.sh` to regenerate the HTML; +read `examples/methylation_ont/recipe.md` for the slot-by-slot guide +to adapting it. + +## Post-render verification + +After building the HTML, run `scripts/verify_report.py` to confirm the +embedded content matches your inputs (region count, coordinates, track +names). For methylation viewers this catches the worst silent failure +mode — a render that succeeded for the wrong samples — which the input- +side validation alone can't catch. + +```bash +python scripts/verify_report.py \ + --html methylation_report.hg38.html \ + --sites sites.hg38.bed \ + --track-config tracks.json \ + --min-size-mb 1.0 \ + --out methylation_report.verify.tsv \ + --fail-on-fail +``` + +For `--track-config` builds the check uses the JSON's `name` fields; in +the YAML spec consumed by `generate_tracks_json.py`, those names are the +`name:` keys in `annotation:` and the auto-generated `<sample>`, +`<sample> 5mC`, `<sample> 5hmC` labels per sample. Picking specific +sample names in the YAML therefore drives the verifier's coverage — +generic names like "sample1" weaken the check. + +**For cohort methylation runs** (multi-patient × per-sample HTMLs + +`index.html`), the cohort verifier (`scripts/verify_cohort.py`) is the +more relevant tool: it additionally catches sample-swap bugs (sample-2's +BAMs accidentally ending up in sample-1's HTML), missing samples, and +`index.html` drift. The methylation workflow is especially vulnerable to +sample-swap typos because each patient has multiple ONT runs with similar- +looking flowcell IDs (e.g., `PAU59807` vs `PAU61427`). Auto-invoked by +`build_igvreports.py --samplesheet`; see SKILL.md "Cohort-level +verification" for details. + +## Cross-references + +- `rules/igv.md` — bigwig-can't-be-sliced, y-axis-autoscale, UCSC + `/dev/stdout` truncation; the rules that motivate this cheat-sheet. +- `rules/apptainer_vs_conda.md` — when the `--apptainer` flag pays off. +- `references/best_practices.md` — generic create_report flag reference; + sites BED, tracks, reference, performance, pitfalls table. +- `examples/methylation_ont/recipe.md` — full slot-by-slot example doc. +- `CLAUDE.md` §3A — upstream ONT methylation pipeline (pod5 → dorado → + modkit pileup → bedGraph + bigwig). diff --git a/igv-reports/scripts/build_igvreports.py b/igv-reports/scripts/build_igvreports.py new file mode 100755 index 0000000..8ab9e25 --- /dev/null +++ b/igv-reports/scripts/build_igvreports.py @@ -0,0 +1,858 @@ +#!/usr/bin/env python3 +"""build_igvreports.py — generic driver for the igv-reports skill. + +Author: Samuel Ahuno +Purpose: + Build self-contained HTML genomic-region reports with create_report + (igv-reports). Two run modes: + + 1. Single — direct CLI: --sites BED + --bam BAM(s) [+--vcf VCF] + → one HTML at --output. + + 2. Cohort — TSV samplesheet: one HTML per row + an index.html. + Samplesheet columns (tab-separated, with header): + sample bam_tumor bam_normal vcf sites_bed + Optional fifth column: extra_tracks (comma-separated paths). + + Either way, the driver: + - Resolves CpG islands, gencode, and RepeatMasker paths from + databases_config.yaml for the chosen genome (skipping any not + configured for that genome, with a warning). + - Validates that the sites BED is headerless and well-formed. + - Calls create_report with --flanking 300 --standalone by default. + - Writes a logs/ entry capturing the resolved track list, the full + command, the flanking value, and per-region embedded data sizes. + +Usage: + python build_igvreports.py --sites SITES.hg38.bed \\ + --bam tumor.bam normal.bam --vcf calls.vcf \\ + --genome hg38 --fasta /path/to/hg38.fa \\ + --no-default-tracks --output report.hg38.html + + python build_igvreports.py --samplesheet sheet.tsv \\ + --genome hg38 --fasta /path/to/hg38.fa \\ + --no-default-tracks --output-dir results/cohort/ + +Defaults can be shipped via a YAML at IGV_REPORTS_DB_CONFIG (see the +references/databases_config_paths.md schema), in which case --fasta / +--no-default-tracks are not needed. +""" + +from __future__ import annotations + +import argparse +import logging +import os +import shutil +import subprocess +import sys +from datetime import datetime +from pathlib import Path + +try: + import yaml # PyYAML +except ImportError: + print("ERROR: PyYAML not available. Install with: pip install pyyaml", file=sys.stderr) + sys.exit(2) + +# Optional: point IGV_REPORTS_DB_CONFIG at a YAML mapping genome IDs to +# FASTA + CGI + gencode + RepeatMasker paths so --genome resolves tracks +# automatically. Without it, pass --fasta and --no-default-tracks explicitly. +_DB_CONFIG_ENV = os.environ.get("IGV_REPORTS_DB_CONFIG") +DEFAULT_DBCONFIG = Path(_DB_CONFIG_ENV) if _DB_CONFIG_ENV else None +DEFAULT_FLANKING = 300 +# Optional: point IGV_REPORTS_SIF at an apptainer SIF for offline / HPC runs. +# Galaxy depot: https://depot.galaxyproject.org/singularity/igv-reports:1.16.0--pyh7cba7a3_0 +_SIF_ENV = os.environ.get("IGV_REPORTS_SIF") +IGVREPORTS_SIF = Path(_SIF_ENV) if _SIF_ENV else None + + +def apptainer_bind_args() -> list[str]: + """Build `--bind <path>` tokens for singularity, skipping paths that don't + exist. Source: `$IGV_REPORTS_BIND` (colon-separated). Empty / unset = no + binds (singularity tolerates this; you only need binds when your data + lives outside the container's default-visible filesystem).""" + raw = os.environ.get("IGV_REPORTS_BIND", "") + if not raw: + return [] + tokens: list[str] = [] + for p in raw.split(":"): + if p and Path(p).exists(): + tokens.extend(["--bind", p]) + return tokens + +GENOME_ALIASES = { + "hg38": "hg38", + "GRCh38": "hg38", + "mm10": "mm10", + "GRCm38": "mm10", + "mm39": "mm39", + "GRCm39": "mm39", + "t2t": "t2t_CHM13v2_plusY", + "chm13": "t2t_CHM13v2_plusY", + "T2T": "t2t_CHM13v2_plusY", + "T2T-CHM13": "t2t_CHM13v2_plusY", + "t2t_CHM13v2_plusY": "t2t_CHM13v2_plusY", + "GRCh37": "GRCh37", + "hg19": "GRCh37", +} + + +def setup_logger(log_path: Path) -> logging.Logger: + """Dual-handler logger: file + stderr, with timestamp prefix.""" + log_path.parent.mkdir(parents=True, exist_ok=True) + fmt = logging.Formatter( + "[%(asctime)s] %(levelname)s: %(message)s", datefmt="%Y-%m-%d %H:%M:%S" + ) + log = logging.getLogger("igv_reports") + log.setLevel(logging.INFO) + log.handlers.clear() + fh = logging.FileHandler(log_path) + fh.setFormatter(fmt) + log.addHandler(fh) + sh = logging.StreamHandler(sys.stderr) + sh.setFormatter(fmt) + log.addHandler(sh) + return log + + +def resolve_genome(genome: str) -> str: + canon = GENOME_ALIASES.get(genome) + if not canon: + raise SystemExit( + f"ERROR: unknown genome '{genome}'. Supported: {sorted(set(GENOME_ALIASES.values()))}" + ) + return canon + + +def load_db_config(path: Path) -> dict: + """Load the databases YAML. Returns {} (with a warning to stderr) if the + file is missing — callers must handle empty cfg gracefully. + + Users without a YAML can pass --fasta and --no-default-tracks + on the driver, OR set $IGV_REPORTS_DB_CONFIG to their own YAML.""" + if not path.exists(): + sys.stderr.write( + f"[build_igvreports] WARNING: db-config not found at {path}\n" + " Set $IGV_REPORTS_DB_CONFIG to point at your YAML, or pass\n" + " --fasta PATH and --no-default-tracks to bypass it entirely.\n" + ) + return {} + with path.open() as fh: + cfg = yaml.safe_load(fh) or {} + return cfg + + +def resolve_default_tracks(cfg: dict, genome: str, log: logging.Logger) -> list[str]: + """Return ordered list of default tracks present on disk for this genome. + + Order matters — first entry renders at the bottom of the IGV.js view by + default? Actually igv-reports renders --tracks in the order passed, + top-to-bottom. We put annotation tracks LAST so they sit below the + BAM/VCF data the user is actually inspecting. + + Empty cfg (e.g. generic, no databases YAML) → returns [] with a warning. + """ + g = cfg.get("reference_genomes", {}).get("local", {}).get(genome, {}) + if not g: + log.warning( + f"no entry for genome '{genome}' in db-config — skipping default tracks. " + "Pass --extra-track or --track-config for annotation tracks." + ) + return [] + + tracks: list[str] = [] + + # CpG islands. + cgi = g.get("CpGIslands") + if cgi and Path(cgi).exists(): + tracks.append(cgi) + else: + log.warning(f"CpG islands track missing for {genome} (key=CpGIslands, value={cgi})") + + # Gencode. For hg38 prefer the bgzip+tabix .gff3.gz sibling if present. + gtf = g.get("gtf") + gencode_track: str | None = None + if genome == "hg38" and gtf: + sibling = (Path(gtf).parent / "gencode.v47.annotation.gff3.gz") + if sibling.exists() and (sibling.parent / (sibling.name + ".tbi")).exists(): + gencode_track = str(sibling) + log.info(f" hg38: using full gencode annotation: {sibling}") + if gencode_track is None and gtf and Path(gtf).exists(): + gencode_track = gtf + if gencode_track: + tracks.append(gencode_track) + else: + log.warning(f"Gencode track missing for {genome}") + + # RepeatMasker. + rmsk = g.get("repMaskerBed") + if rmsk and Path(rmsk).exists(): + tracks.append(rmsk) + else: + log.warning(f"RepeatMasker track not configured for {genome}") + + return tracks + + +def fasta_for(cfg: dict, genome: str) -> str: + """Resolve a FASTA path from the db-config. Users without a + YAML can bypass this by passing --fasta PATH on the driver.""" + try: + fasta = cfg["reference_genomes"]["local"][genome].get("fasta") + except (KeyError, TypeError): + raise SystemExit( + f"ERROR: db-config has no '{genome}' entry to resolve FASTA from.\n" + " Pass --fasta PATH explicitly, or set $IGV_REPORTS_DB_CONFIG\n" + " to a YAML that defines reference_genomes.local.<genome>.fasta." + ) + if not fasta or not Path(fasta).exists(): + raise SystemExit(f"ERROR: FASTA missing for {genome}: {fasta}") + if not Path(fasta + ".fai").exists(): + raise SystemExit( + f"ERROR: FASTA index missing for {fasta} — run `samtools faidx {fasta}`" + ) + return fasta + + +def validate_sites_bed(bed: Path) -> None: + """Sanity-check the sites BED before invoking create_report. + + create_report's BED parser is positional. It skips lines starting with + `#` or `track ` (so the lab's `#chrom\\tstart\\tend\\tname` header is + fine), but a non-comment header row like `chrom\\tstart\\tend` crashes + with `ValueError: invalid literal for int()`. We mirror create_report's + line-skipping logic and emit an informative error if any data row has + non-numeric start/end.""" + if not bed.exists(): + raise SystemExit(f"ERROR: sites BED not found: {bed}") + with bed.open() as fh: + for i, line in enumerate(fh, start=1): + line = line.rstrip("\n") + if not line or line.startswith("#") or line.startswith("track "): + continue + cols = line.split("\t") + if len(cols) < 3: + raise SystemExit(f"ERROR: {bed}:{i}: BED needs >=3 tab-separated columns; got {cols!r}") + try: + start = int(cols[1]) + end = int(cols[2]) + except ValueError: + raise SystemExit( + f"ERROR: {bed}:{i}: non-numeric start/end — likely a header row.\n" + " igv-reports' BED parser is positional and chokes on non-comment\n" + " headers. Prefix the header with `#` (skipped by create_report\n" + " and matches the lab's BED-output convention) or strip it." + ) + if start >= end: + raise SystemExit(f"ERROR: {bed}:{i}: start ({start}) >= end ({end})") + + +def find_create_report() -> str: + """Resolve `create_report` on PATH (provided by `pip install igv-reports` + or any conda env that activated it).""" + cr = shutil.which("create_report") + if cr: + return cr + raise SystemExit( + "ERROR: create_report not on PATH.\n" + " Install: pip install -U 'igv-reports>=1.16.0'\n" + " Offline / air-gapped: point IGV_REPORTS_SIF at an igv-reports SIF\n" + " and rerun with --apptainer (Galaxy depot:\n" + " https://depot.galaxyproject.org/singularity/igv-reports:1.16.0--pyh7cba7a3_0)" + ) + + +def apptainer_create_report_prefix(sif: Path) -> list[str]: + """Return the `singularity exec --cleanenv [--bind <path> ...] <sif> + create_report` prefix. Used when --apptainer is passed; avoids the NFS + conda cold-start tax (rules/apptainer_vs_conda.md). The default SIF is + a dedicated igv-reports container (igv-reports_1.16.0.sif, ~83 MB) + pulled from the Galaxy depot. Override via $IGV_REPORTS_SIF. + + --cleanenv: scrubs host env vars so they don't leak into the SIF. + Specifically: host SSL_CERT_FILE / SSL_CERT_DIR on RHEL 8 point at paths + that don't exist inside Galaxy-depot SIFs, and create_report's standalone- + HTML build path performs an HTTPS GET (for the IGV.js ideogram or similar) + that aborts with `[SSL: CERTIFICATE_VERIFY_FAILED]`. See + rules/apptainer_env_leak.md. + + Binds: see `apptainer_bind_args()` — conditional on path existence.""" + if sif is None: + raise SystemExit( + "ERROR: --apptainer requested but $IGV_REPORTS_SIF is not set.\n" + " Set IGV_REPORTS_SIF to a SIF path and rerun, e.g.:\n" + " export IGV_REPORTS_SIF=/path/to/igv-reports_1.16.0.sif\n" + " Pull the SIF first if needed:\n" + " wget -O \"$IGV_REPORTS_SIF\" \\\n" + " 'https://depot.galaxyproject.org/singularity/igv-reports:1.16.0--pyh7cba7a3_0'" + ) + if not sif.exists(): + raise SystemExit( + f"ERROR: apptainer SIF not found: {sif}\n" + " Pull with one of:\n" + f" apptainer pull {sif} \\\n" + " docker://igv-org/igv-reports:1.16.0\n" + f" wget -O {sif} \\\n" + " 'https://depot.galaxyproject.org/singularity/igv-reports:1.16.0--pyh7e72e81_0'\n" + " Or set $IGV_REPORTS_SIF to a SIF you already have." + ) + return ["singularity", "exec", "--cleanenv", *apptainer_bind_args(), str(sif), "create_report"] + + +def build_one( + sites: Path, + bams: list[Path], + vcf: Path | None, + extra_tracks: list[Path], + fasta: str, + default_tracks: list[str], + output: Path, + title: str, + flanking: int, + log: logging.Logger, + track_config: Path | None = None, + report_type: str | None = None, + info_columns: list[str] | None = None, + use_apptainer: bool = False, +) -> Path: + """Run create_report for one site set and return the HTML path. + + Two track modes: + * Default — positional `--tracks <path> <path> ...`. Used when + `track_config` is None. BAM + VCF + extra + default annotations, + in render order top-to-bottom. + * track-config — `--track-config <json>`. Used when `track_config` + is provided. The JSON is the source of truth; default_tracks, + bams, vcf, extra_tracks are IGNORED (they go in the JSON instead). + This is the path required for ONT methylation viewers (named + tracks, per-track color/min/max/colorBy/displayMode). + """ + validate_sites_bed(sites) + output.parent.mkdir(parents=True, exist_ok=True) + + create_report_cmd = ( + apptainer_create_report_prefix(IGVREPORTS_SIF) if use_apptainer + else [find_create_report()] + ) + + cmd: list[str] = list(create_report_cmd) + [ + str(sites), + "--fasta", fasta, + "--flanking", str(flanking), + ] + + if track_config is not None: + cmd.extend(["--track-config", str(track_config)]) + log.info(f" track-config: {track_config} (defaults+bams+vcf bypassed)") + if bams or vcf or extra_tracks or default_tracks: + log.warning( + "--track-config supplied; ignoring --bam/--vcf/--extra-track and " + "auto-resolved default tracks. Put everything in the JSON instead." + ) + else: + # Track ordering: BAMs (data) -> VCF (calls) -> extra -> defaults (annotation, last). + tracks: list[str] = [str(b) for b in bams] + if vcf: + tracks.append(str(vcf)) + tracks.extend(str(t) for t in extra_tracks) + tracks.extend(default_tracks) + cmd.extend(["--tracks", *tracks]) + log.info(f" tracks (in render order):") + for i, t in enumerate(tracks, start=1): + log.info(f" {i:>2}. {t}") + + if report_type: + cmd.extend(["--type", report_type]) + if info_columns: + cmd.extend(["--info-columns", *info_columns]) + + cmd.extend([ + "--standalone", + "--title", title, + "--output", str(output), + ]) + + log.info(f" cmd: {' '.join(cmd)}") + log.info(f" flanking_bp: {flanking}") + + proc = subprocess.run(cmd, capture_output=True, text=True) + if proc.returncode != 0: + log.error(f"create_report FAILED for {sites}") + log.error(f"stdout: {proc.stdout}") + log.error(f"stderr: {proc.stderr}") + raise SystemExit(proc.returncode) + + if output.exists(): + log.info(f" HTML: {output} ({output.stat().st_size / 1024 / 1024:.2f} MB)") + return output + + +def parse_samplesheet(path: Path) -> list[dict]: + rows: list[dict] = [] + with path.open() as fh: + header = fh.readline().lstrip("#").rstrip("\n").split("\t") + for ln in fh: + cols = ln.rstrip("\n").split("\t") + if not cols or not cols[0].strip(): + continue + row = dict(zip(header, cols)) + rows.append(row) + required = {"sample", "sites_bed"} + if rows and not required.issubset(rows[0].keys()): + raise SystemExit( + f"ERROR: samplesheet must have columns: sample, sites_bed (got {list(rows[0].keys())}).\n" + " Optional columns: bam_tumor, bam_normal, vcf, extra_tracks (comma-separated)." + ) + return rows + + +def derive_log_path(out_dir: Path, override: Path | None = None) -> Path: + """Choose a log dir matching the lab's `results/<run>/{reports,logs}/` + sibling layout when possible. Fall back to `out_dir/logs/` (in-dir) when + the sibling can't be created — `out_dir.parent` is root, read-only, or + otherwise unwritable. Honor an explicit `override` unconditionally.""" + if override is not None: + log_dir = override + else: + out_dir = out_dir.resolve() + sibling = out_dir.parent / "logs" + try: + sibling.mkdir(parents=True, exist_ok=True) + log_dir = sibling + except (PermissionError, OSError): + log_dir = out_dir / "logs" + log_dir.mkdir(parents=True, exist_ok=True) + return log_dir / f"run_{datetime.now():%Y%m%d_%H%M%S}.log" + + +def write_index(report_paths: dict[str, Path], out: Path, title: str) -> Path: + items = "\n".join( + f' <li><a href="{p.name}">{s}</a></li>' + for s, p in sorted(report_paths.items()) + ) + out.write_text( + "<!doctype html>\n<html><head><title>" + + title + + "\n" + f"

{title}

\n
    \n{items}\n
\n\n" + ) + return out + + +def run_anchors_generate( + samplesheet: Path, + sites_files: list[Path], + out: Path, + fail_on_fail: bool, + log: logging.Logger, +) -> None: + """Invoke `verify_anchors.py generate` once per distinct sites BED in the + cohort, merging into a single anchors TSV at `out`. Most cohorts share + one sites BED so this collapses to a single call; multi-sites cohorts + get one anchor block per sites file.""" + script = Path(__file__).resolve().parent / "verify_anchors.py" + if not script.exists(): + log.warning(f"anchors generate: script not found at {script} — skipping") + return + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text("") # truncate; per-sites blocks appended below + for i, sites in enumerate(sites_files): + block = out.with_suffix(f".part{i}.tsv") + cmd = [ + sys.executable, str(script), "generate", + "--samplesheet", str(samplesheet), + "--sites", str(sites), + "--out", str(block), + ] + log.info(f"anchors generate: {' '.join(cmd)}") + proc = subprocess.run(cmd, capture_output=True, text=True) + for line in (proc.stdout or "").splitlines(): + log.info(f" anchors > {line}") + if proc.stderr: + for line in proc.stderr.splitlines(): + log.info(f" anchors (stderr) > {line}") + if proc.returncode != 0: + if fail_on_fail: + raise SystemExit(proc.returncode) + log.warning(f"anchors generate exited {proc.returncode}; continuing") + continue + # Merge: keep header from first block, body rows from all. + if i == 0: + out.write_text(block.read_text()) + else: + with out.open("a") as fh: + for ln in block.read_text().splitlines(): + if not ln or ln.startswith("#"): + continue + fh.write(ln + "\n") + block.unlink() + log.info(f"anchors generate: wrote {out}") + + +def run_anchors_verify( + samplesheet: Path, + reports_dir: Path, + genome: str, + anchors: Path, + fail_on_fail: bool, + log: logging.Logger, +) -> None: + """Invoke `verify_anchors.py verify-cohort` after a cohort build.""" + script = Path(__file__).resolve().parent / "verify_anchors.py" + if not script.exists(): + log.warning(f"anchors verify: script not found at {script} — skipping") + return + if not anchors.exists(): + log.warning(f"anchors verify: anchors TSV missing: {anchors} — skipping") + return + out = reports_dir / "cohort_verify_anchors.tsv" + cmd = [ + sys.executable, str(script), "verify-cohort", + "--samplesheet", str(samplesheet), + "--reports-dir", str(reports_dir), + "--genome", genome, + "--anchors", str(anchors), + "--out", str(out), + ] + if fail_on_fail: + cmd.append("--fail-on-fail") + log.info(f"anchors verify: {' '.join(cmd)}") + proc = subprocess.run(cmd, capture_output=True, text=True) + for line in (proc.stdout or "").splitlines(): + log.info(f" anchors > {line}") + if proc.stderr: + for line in proc.stderr.splitlines(): + log.info(f" anchors (stderr) > {line}") + log.info(f"anchors verify: TSV={out} exit={proc.returncode}") + if proc.returncode != 0: + if fail_on_fail: + raise SystemExit(proc.returncode) + log.warning(f"anchors verify exited {proc.returncode}; --fail-on-fail not set, continuing") + + +def run_cohort_verify( + samplesheet: Path, + reports_dir: Path, + genome: str, + db_config: Path, + fail_on_fail: bool, + log: logging.Logger, +) -> None: + """Invoke verify_cohort.py at the end of a cohort build. Writes the TSV + + summary next to the cohort's index.html. Fails the build if + `fail_on_fail` is set and the verifier exits nonzero.""" + verify_script = Path(__file__).resolve().parent / "verify_cohort.py" + if not verify_script.exists(): + log.warning(f"verify_cohort: script not found at {verify_script} — skipping") + return + tsv_out = reports_dir / "cohort_verify.tsv" + md_out = reports_dir / "cohort_verify.summary.md" + cmd = [ + sys.executable, str(verify_script), + "--samplesheet", str(samplesheet), + "--reports-dir", str(reports_dir), + "--genome", genome, + "--db-config", str(db_config), + "--out", str(tsv_out), + "--summary", str(md_out), + ] + if fail_on_fail: + cmd.append("--fail-on-fail") + log.info(f"verify_cohort: running {' '.join(cmd)}") + proc = subprocess.run(cmd, capture_output=True, text=True) + # Mirror the verifier's stdout/stderr into the run log so audit-trail stays single-source. + for line in (proc.stdout or "").splitlines(): + log.info(f" verify_cohort > {line}") + if proc.stderr: + for line in proc.stderr.splitlines(): + log.warning(f" verify_cohort (stderr) > {line}") + log.info(f"verify_cohort: TSV={tsv_out} summary={md_out} exit={proc.returncode}") + if proc.returncode != 0: + if fail_on_fail: + raise SystemExit(proc.returncode) + log.warning(f"verify_cohort: exited {proc.returncode} but --fail-on-fail not set; continuing") + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--genome", required=True, help="hg38 | mm10 | mm39 | t2t | GRCh37 (alias-tolerant)") + ap.add_argument("--db-config", default=(str(DEFAULT_DBCONFIG) if DEFAULT_DBCONFIG else None), help=( + "YAML resolving genome -> {fasta, CpGIslands, gtf, repMaskerBed}. " + "Schema: see references/databases_config_paths.md. " + "Override via $IGV_REPORTS_DB_CONFIG, or skip entirely with --fasta + --no-default-tracks." + )) + ap.add_argument("--fasta", help=( + "Explicit FASTA path; bypasses --db-config for FASTA lookup. " + "Required when --db-config is not set or doesn't list the chosen genome. " + "Requires a sibling .fai (run `samtools faidx`)." + )) + ap.add_argument("--no-default-tracks", action="store_true", help=( + "Skip the CpG-islands/gencode/RepeatMasker auto-tracks from --db-config. " + "Combine with --fasta and --extra-track to operate without a databases YAML." + )) + ap.add_argument("--flanking", type=int, default=DEFAULT_FLANKING) + ap.add_argument("--extra-track", action="append", default=[], help="(repeat) extra track path; rendered above default annotations") + + mode = ap.add_mutually_exclusive_group(required=True) + mode.add_argument("--samplesheet", help="TSV: sample, [bam_tumor, bam_normal, vcf,] sites_bed[, extra_tracks]") + mode.add_argument("--sites", help="path to sites BED for single-sample mode") + + ap.add_argument("--bam", nargs="*", default=[], help="BAM/CRAM tracks (single-sample mode)") + ap.add_argument("--vcf", help="VCF track (single-sample mode)") + + ap.add_argument("--output", help="output HTML path (single-sample mode)") + ap.add_argument("--output-dir", help="output dir for cohort mode (default: ./reports)") + ap.add_argument("--title", default=None, help="report title; defaults to sample name + genome") + + ap.add_argument( + "--track-config", + help="path to a tracks.json (igv.js track config). When set, the JSON is " + "passed straight to create_report --track-config and all default " + "tracks / --bam / --vcf / --extra-track are bypassed. Use this for " + "ONT methylation viewers — see examples/methylation_ont/.", + ) + ap.add_argument( + "--type", + dest="report_type", + choices=["mutation", "fusion", "junction"], + default=None, + help="create_report --type. Sets viewer behaviour at each site.", + ) + ap.add_argument( + "--info-columns", + nargs="*", + default=[], + help="VCF INFO or BED columns to surface in the variant table. " + "For BED sites, 'name' is the most useful.", + ) + ap.add_argument( + "--apptainer", + action=argparse.BooleanOptionalAction, + default=None, + help="Run create_report from inside the apptainer SIF pointed to " + "by $IGV_REPORTS_SIF (dedicated igv-reports 1.16.0 SIF, ~83 MB; " + "pull from the Galaxy depot). Skips the NFS conda cold-start " + "tax on HPC. Default: auto-detect — on if SLURM_JOB_ID is set " + "AND $IGV_REPORTS_SIF points at an existing SIF, off otherwise. " + "Override either way with --apptainer / --no-apptainer.", + ) + ap.add_argument( + "--log-dir", + help="explicit log directory. Default: sibling 'logs/' of the output " + "dir (matches results//{reports,logs}/ lab layout); falls " + "back to /logs/ when the sibling is unwritable.", + ) + ap.add_argument( + "--verify", + action=argparse.BooleanOptionalAction, + default=True, + help="Run scripts/verify_cohort.py at the end of cohort builds " + "(--samplesheet mode). Single-sample (--sites) mode is unaffected " + "and emits no cohort verify TSV. Default: on. Use --no-verify to " + "skip. The verifier inherits --fail-on-fail.", + ) + ap.add_argument( + "--fail-on-fail", + action="store_true", + help="Propagated to verify_cohort.py and verify_anchors.py: exit " + "nonzero if any verifier check is FAIL. Only meaningful with " + "--verify / --anchors-mode and --samplesheet.", + ) + ap.add_argument( + "--anchors-mode", + choices=["off", "generate", "verify"], + default="off", + help="Content (read-count) verification — opt-in because it shells " + "out to samtools per (sample, region) and is slow. 'generate' " + "runs samtools view -c against source BAMs at build time and " + "freezes the counts to --anchors (becomes regression fixture). " + "'verify' decodes each BAM slice from the built HTMLs and " + "compares to --anchors. 'off' (default) skips. See " + "examples/anchor_verify_demo/.", + ) + ap.add_argument( + "--anchors", + help="Path to anchors TSV. With --anchors-mode generate: output. " + "With --anchors-mode verify: input. Ignored when mode=off.", + ) + + args = ap.parse_args() + + genome = resolve_genome(args.genome) + # Only load db-config when something actually needs it (fasta lookup or + # default tracks). Saves the warning noise + lets a fully-explicit + # --fasta + --no-default-tracks invocation run with no YAML at all. + need_db_config = (not args.fasta) or (not args.no_default_tracks) + if need_db_config and not args.db_config: + raise SystemExit( + "ERROR: need a databases YAML to resolve FASTA / default tracks.\n" + " Either:\n" + " - pass --fasta /path/to/genome.fa --no-default-tracks " + "[--extra-track ...], or\n" + " - set $IGV_REPORTS_DB_CONFIG / --db-config to a YAML matching\n" + " the schema in references/databases_config_paths.md." + ) + cfg = load_db_config(Path(args.db_config)) if need_db_config else {} + if args.fasta: + fasta = args.fasta + if not Path(fasta).exists(): + raise SystemExit(f"ERROR: --fasta path not found: {fasta}") + if not Path(fasta + ".fai").exists(): + raise SystemExit( + f"ERROR: FASTA index missing for {fasta} — run `samtools faidx {fasta}`" + ) + else: + fasta = fasta_for(cfg, genome) + + # Logger placed alongside the output. See derive_log_path docstring. + if args.samplesheet: + out_dir = Path(args.output_dir or "reports") + else: + if not args.output: + raise SystemExit("ERROR: --output required in single-sample mode") + out_dir = Path(args.output).parent + out_dir.mkdir(parents=True, exist_ok=True) + log_path = derive_log_path(out_dir, Path(args.log_dir) if args.log_dir else None) + log = setup_logger(log_path) + + log.info(f"=== igv-reports skill, genome={genome} ===") + log.info(f"db_config: {args.db_config}") + log.info(f"fasta: {fasta}") + log.info(f"flanking: {args.flanking} bp (default {DEFAULT_FLANKING})") + + # Resolve --apptainer auto-detect. Tri-state: + # user said --apptainer -> True + # user said --no-apptainer -> False + # user said nothing (None) -> True iff SLURM_JOB_ID is in env + # Rationale: on a fresh SLURM compute node, the NFS conda cold-start tax + # (~1-2 M page faults, ~2.5 us each) is large; the dedicated SIF skips it. + # On the login node, conda is usually warm and the simpler path wins. + # See rules/apptainer_vs_conda.md. + slurm_job = os.environ.get("SLURM_JOB_ID") + if args.apptainer is None: + # Auto-enable SIF mode only when both (a) we're on a SLURM compute + # node where the conda cold-start tax bites, AND (b) $IGV_REPORTS_SIF + # points at an existing SIF. The existence check protects users from + # a confusing SIF-not-found error when they didn't ask for apptainer. + sif_ok = IGVREPORTS_SIF is not None and IGVREPORTS_SIF.exists() + args.apptainer = bool(slurm_job) and sif_ok + if args.apptainer: + decision = f"auto-enabled (SLURM_JOB_ID={slurm_job}, SIF={IGVREPORTS_SIF})" + elif slurm_job and IGVREPORTS_SIF is None: + decision = ( + f"auto-disabled (SLURM_JOB_ID={slurm_job} set, but $IGV_REPORTS_SIF unset; " + f"falling back to PATH create_report)" + ) + elif slurm_job: + decision = ( + f"auto-disabled (SLURM_JOB_ID={slurm_job} set, but SIF not found at " + f"{IGVREPORTS_SIF}; falling back to PATH create_report)" + ) + else: + decision = "auto-disabled (no SLURM_JOB_ID; PATH create_report path)" + log.info(f"apptainer: {decision}") + else: + log.info(f"apptainer: {args.apptainer} (explicit)") + + if args.no_default_tracks: + default_tracks: list[str] = [] + log.info("default tracks: skipped (--no-default-tracks)") + else: + default_tracks = resolve_default_tracks(cfg, genome, log) + log.info(f"default tracks resolved: {len(default_tracks)}") + for t in default_tracks: + log.info(f" - {t}") + + extra_tracks = [Path(p) for p in args.extra_track] + + track_config = Path(args.track_config) if args.track_config else None + if track_config is not None and not track_config.exists(): + raise SystemExit(f"ERROR: --track-config file not found: {track_config}") + + if args.sites: + title = args.title or f"{Path(args.sites).stem} ({genome})" + build_one( + sites=Path(args.sites), + bams=[Path(b) for b in args.bam], + vcf=Path(args.vcf) if args.vcf else None, + extra_tracks=extra_tracks, + fasta=fasta, + default_tracks=default_tracks, + output=Path(args.output), + title=title, + flanking=args.flanking, + log=log, + track_config=track_config, + report_type=args.report_type, + info_columns=args.info_columns, + use_apptainer=args.apptainer, + ) + else: + rows = parse_samplesheet(Path(args.samplesheet)) + log.info(f"cohort: {len(rows)} samples from {args.samplesheet}") + report_paths: dict[str, Path] = {} + for row in rows: + sample = row["sample"] + log.info(f"=== {sample} ===") + sites = Path(row["sites_bed"]) + bams = [Path(row[k]) for k in ("bam_tumor", "bam_normal") if row.get(k)] + vcf = Path(row["vcf"]) if row.get("vcf") else None + sample_extras = list(extra_tracks) + if row.get("extra_tracks"): + sample_extras += [Path(p.strip()) for p in row["extra_tracks"].split(",") if p.strip()] + out_html = out_dir / f"{sample}.{genome}.html" + title = args.title or f"{sample} ({genome})" + build_one( + sites=sites, bams=bams, vcf=vcf, extra_tracks=sample_extras, + fasta=fasta, default_tracks=default_tracks, + output=out_html, title=title, flanking=args.flanking, log=log, + track_config=track_config, + report_type=args.report_type, + info_columns=args.info_columns, + use_apptainer=args.apptainer, + ) + report_paths[sample] = out_html + idx = write_index(report_paths, out_dir / "index.html", f"igv-reports cohort ({genome})") + log.info(f"Wrote cohort index: {idx}") + + if args.verify: + run_cohort_verify( + samplesheet=Path(args.samplesheet), + reports_dir=out_dir, + genome=genome, + db_config=Path(args.db_config), + fail_on_fail=args.fail_on_fail, + log=log, + ) + else: + log.info("verify_cohort: skipped (--no-verify)") + + if args.anchors_mode != "off": + if not args.anchors: + raise SystemExit("ERROR: --anchors PATH required when --anchors-mode != off") + anchors_path = Path(args.anchors) + if args.anchors_mode == "generate": + sites_files = sorted({Path(r["sites_bed"]) for r in rows if r.get("sites_bed")}) + run_anchors_generate( + samplesheet=Path(args.samplesheet), + sites_files=sites_files, + out=anchors_path, + fail_on_fail=args.fail_on_fail, + log=log, + ) + else: # verify + run_anchors_verify( + samplesheet=Path(args.samplesheet), + reports_dir=out_dir, + genome=genome, + anchors=anchors_path, + fail_on_fail=args.fail_on_fail, + log=log, + ) + + log.info(f"=== DONE: build_igvreports.py completed successfully ===") + + +if __name__ == "__main__": + main() diff --git a/igv-reports/scripts/generate_tracks_json.py b/igv-reports/scripts/generate_tracks_json.py new file mode 100755 index 0000000..8e49a49 --- /dev/null +++ b/igv-reports/scripts/generate_tracks_json.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 +"""generate_tracks_json.py — build an igv-reports tracks.json from a YAML spec. + +Author: Samuel Ahuno +Purpose: + ONT methylation viewers need named, colored, y-axis-locked tracks that + the positional `create_report --tracks` API cannot express. The path is + `--track-config `, but hand-writing that JSON for 4-8 samples + with 5mC + 5hmC bedGraph pairs each is tedious and error-prone. + + This helper consumes a small YAML spec (see + examples/methylation_ont/tracks_spec.example.yaml) and emits the JSON + with the right defaults baked in: + + * BAM tracks -> colorBy=basemod2, showSoftClips=false, displayMode=COLLAPSED + * bedGraph -> type=wig, min=0, max=100 (methylation percent) + * Annotation -> displayMode honored, color honored + * Group color -> reads from `group_colors:` map keyed by sample.group + +Usage: + python generate_tracks_json.py \ + --spec examples/methylation_ont/tracks_spec.example.yaml \ + --run-dir examples/methylation_ont \ + --out examples/methylation_ont/tracks.json + + --run-dir is prepended to any relative `url:` path in the spec, so the + emitted JSON has absolute paths that create_report can resolve from any + working directory. +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path + +try: + import yaml +except ImportError: + print("ERROR: PyYAML not available. Install with: pip install pyyaml", file=sys.stderr) + sys.exit(2) + + +BAM_DEFAULTS = { + "format": "bam", + "type": "alignment", + "colorBy": "basemod2", + "showSoftClips": False, + "displayMode": "COLLAPSED", +} + +BEDGRAPH_DEFAULTS = { + "format": "bedgraph", + "type": "wig", + "min": 0, + "max": 100, +} + + +def abspath_relative_to(p: str, run_dir: Path) -> str: + """Resolve `p` to an absolute path. If `p` is already absolute, return as-is.""" + pp = Path(p) + if pp.is_absolute(): + return str(pp) + return str((run_dir / pp).resolve()) + + +def build_annotation_tracks(spec: dict, run_dir: Path) -> list[dict]: + out: list[dict] = [] + for a in spec.get("annotation", []): + track = { + "name": a["name"], + "url": abspath_relative_to(a["url"], run_dir), + "format": a.get("format", "bed"), + "type": "annotation", + "displayMode": a.get("displayMode", "EXPANDED"), + } + if a.get("indexURL"): + track["indexURL"] = abspath_relative_to(a["indexURL"], run_dir) + if a.get("color"): + track["color"] = a["color"] + out.append(track) + return out + + +def build_sample_tracks(spec: dict, run_dir: Path) -> list[dict]: + group_colors = spec.get("group_colors", {}) + out: list[dict] = [] + for s in spec.get("samples", []): + name = s["name"] + group = s.get("group", "default") + gc = group_colors.get(group, {}) + + # BAM (per-read basemod2 view). + if s.get("bam"): + bam_abs = abspath_relative_to(s["bam"], run_dir) + track = {"name": name, "url": bam_abs, "indexURL": bam_abs + ".bai"} + track.update(BAM_DEFAULTS) + out.append(track) + + # 5mC bedGraph. + if s.get("bedgraph_5mC"): + track = { + "name": f"{name} 5mC", + "url": abspath_relative_to(s["bedgraph_5mC"], run_dir), + } + track.update(BEDGRAPH_DEFAULTS) + if gc.get("5mC"): + track["color"] = gc["5mC"] + out.append(track) + + # 5hmC bedGraph. + if s.get("bedgraph_5hmC"): + track = { + "name": f"{name} 5hmC", + "url": abspath_relative_to(s["bedgraph_5hmC"], run_dir), + } + track.update(BEDGRAPH_DEFAULTS) + if gc.get("5hmC"): + track["color"] = gc["5hmC"] + out.append(track) + + return out + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--spec", required=True, help="YAML spec (see tracks_spec.example.yaml)") + ap.add_argument("--run-dir", required=True, help="dir that relative urls in spec are resolved against") + ap.add_argument("--out", required=True, help="output tracks.json path") + args = ap.parse_args() + + spec_path = Path(args.spec) + if not spec_path.exists(): + raise SystemExit(f"ERROR: spec not found: {spec_path}") + run_dir = Path(args.run_dir).resolve() + if not run_dir.exists(): + raise SystemExit(f"ERROR: run-dir not found: {run_dir}") + + with spec_path.open() as fh: + spec = yaml.safe_load(fh) + + tracks = build_annotation_tracks(spec, run_dir) + build_sample_tracks(spec, run_dir) + + out_path = Path(args.out) + out_path.parent.mkdir(parents=True, exist_ok=True) + with out_path.open("w") as fh: + json.dump(tracks, fh, indent=2) + fh.write("\n") + + print(f"Wrote {len(tracks)} tracks to {out_path}", file=sys.stderr) + + +if __name__ == "__main__": + main() diff --git a/igv-reports/scripts/prep_track.sh b/igv-reports/scripts/prep_track.sh new file mode 100755 index 0000000..def917c --- /dev/null +++ b/igv-reports/scripts/prep_track.sh @@ -0,0 +1,106 @@ +#!/usr/bin/env bash +# prep_track.sh — convert a plain-gzip GFF3/GTF/BED.gz into a properly +# bgzipped + tabix-indexed track that igv-reports can load. +# +# Author: Samuel Ahuno +# Why: igv-reports parses tracks by extension and needs bgzip+tabix. +# Plain gzip with `.gz` extension trips it with a UnicodeDecodeError or +# silently fails. Tabix indexing additionally requires position-sorted +# records within each chromosome, which gencode/many-other distributions +# do not guarantee — they interleave records by feature type. +# +# Pipeline: backup -> gunzip -> sort by chr+pos (preserving header) -> +# bgzip in place -> tabix -p . +# +# Usage: +# prep_track.sh +# +# Output: +# (replaced with new bgzip) +# .tbi (new tabix index) +# .bak.original_gzip (backup of the original .gz) + +set -euo pipefail + +if [[ $# -ne 1 ]]; then + echo "Usage: $0 " >&2 + exit 2 +fi + +INPUT=$1 +if [[ ! -f "$INPUT" ]]; then + echo "ERROR: file not found: $INPUT" >&2 + exit 2 +fi + +# Detect format by suffix. +case "$INPUT" in + *.gff3.gz|*.gff.gz) FMT=gff ;; + *.gtf.gz) FMT=gff ;; # tabix preset for GTF is named "gff" + *.bed.gz|*.bedgraph.gz) FMT=bed ;; + *) echo "ERROR: unsupported extension: $INPUT (need .gff3.gz, .gtf.gz, .bed.gz, .bedgraph.gz)" >&2; exit 2 ;; +esac + +# Need bgzip / tabix / sort / gunzip. +for tool in bgzip tabix sort gunzip awk file; do + if ! command -v "$tool" >/dev/null 2>&1; then + echo "ERROR: $tool not on PATH. Activate the snakemake conda env first." >&2 + exit 2 + fi +done + +# Detect if already bgzip — skip the whole conversion if it is and just +# rebuild the index. +if file "$INPUT" | grep -q "extra field"; then + echo "[$(date '+%F %T')] $INPUT is already bgzip; rebuilding tabix index only." + rm -f "${INPUT}.tbi" + tabix -p "$FMT" "$INPUT" + echo "[$(date '+%F %T')] DONE: ${INPUT}.tbi" + exit 0 +fi + +BACKUP="${INPUT}.bak.original_gzip" +if [[ -f "$BACKUP" ]]; then + echo "[$(date '+%F %T')] backup already exists: $BACKUP — refusing to overwrite. Move it aside and rerun if you want a fresh backup." +else + cp -p "$INPUT" "$BACKUP" + echo "[$(date '+%F %T')] backed up to $BACKUP" +fi + +# Decompress to a sibling temp. +TMP="${INPUT%.gz}.unsorted.tmp" +SORTED="${INPUT%.gz}.sorted.tmp" +gunzip -c "$INPUT" > "$TMP" +echo "[$(date '+%F %T')] decompressed to $TMP ($(stat -c %s "$TMP") bytes)" + +# Sort: preserve any leading # header lines, sort body by chr (column 1) +# then numeric pos (column 4 for GFF/GTF; column 2 for BED). +case "$FMT" in + gff) POS_COL=4 ;; + bed) POS_COL=2 ;; +esac + +(grep '^#' "$TMP" || true) > "$SORTED" +grep -v '^#' "$TMP" \ + | sort -k1,1 -k${POS_COL},${POS_COL}n -S 2G --parallel=4 \ + >> "$SORTED" +echo "[$(date '+%F %T')] sorted by chr,pos (col $POS_COL) into $SORTED" + +# bgzip into place (replaces the original) and index. +mv "$SORTED" "${INPUT%.gz}" +rm -f "$TMP" +bgzip -@ 4 "${INPUT%.gz}" +echo "[$(date '+%F %T')] bgzipped: $INPUT ($(stat -c %s "$INPUT") bytes)" + +rm -f "${INPUT}.tbi" +tabix -p "$FMT" "$INPUT" +echo "[$(date '+%F %T')] indexed: ${INPUT}.tbi ($(stat -c %s "${INPUT}.tbi") bytes)" + +# Sanity check: pull the first contig's first 100 kb and confirm tabix returns rows. +FIRST_CONTIG=$(zcat "$INPUT" | awk '$1!~/^#/ {print $1; exit}') +if [[ -n "$FIRST_CONTIG" ]]; then + N=$(tabix "$INPUT" "${FIRST_CONTIG}:1-100000" | wc -l) + echo "[$(date '+%F %T')] sanity: ${FIRST_CONTIG}:1-100000 returns $N row(s)" +fi + +echo "[$(date '+%F %T')] DONE — track ready for igv-reports. Original preserved at $BACKUP" diff --git a/igv-reports/scripts/verify_anchors.py b/igv-reports/scripts/verify_anchors.py new file mode 100755 index 0000000..0e44ac1 --- /dev/null +++ b/igv-reports/scripts/verify_anchors.py @@ -0,0 +1,642 @@ +#!/usr/bin/env python3 +"""verify_anchors.py — content verifier for create_report HTMLs. + +Author: Samuel Ahuno +Purpose: + The structural verifier (verify_report / verify_cohort) confirms the HTML + *says* the right thing: region count, coords, track names. It cannot + confirm the embedded BAM slices actually contain the data they claim to. + Failure modes it misses: + + 1. Sample swap — track name says `p17424_1.sorted` but the slice was + cut from `p17424_3.sorted.bam` (cohort loop wired the wrong path; + Path.stem matched and the structural check passed). + 2. Silent empty slice — region rendered, slice is 0 reads (failed + index, BAM corruption, coords outside coverage). + 3. Regression across create_report versions — flanking/slicing logic + changes silently between releases. + + This verifier closes the gap by re-running `samtools view -c` against + both the source BAM (at generate time) and the embedded slice (at + verify time), then comparing counts. + + Anchor TSV format (`#`-prefixed header, lab BED-output convention): + + #sample track_name chrom start end expected tolerance min max notes + + - `tolerance` and `min`/`max` are mutually exclusive per row; if `min` + or `max` is non-empty it wins. Blank tolerance falls back to + --tolerance flag default (0.05). + - `expected` is the count from `samtools view -c -F 1536 source.bam + chrom:start-end` at generate time. Generate writes it; verify reads it. + +Subcommands: + generate — walk (sample × region) grid, count reads from source BAMs, + write an anchors.tsv that becomes a regression fixture. + verify — given one HTML + anchors.tsv, decode each anchor's BAM + slice and count it, compare to expected. + verify-cohort — apply `verify` across all HTMLs in a cohort. + +Container resolution (samtools): + 1. --samtools-sif PATH + 2. $SAMTOOLS_SIF_DEFAULT env var + 3. `samtools` on PATH + 4. Hard error + +Typical use: + # at build time, freeze the regression fixture + python verify_anchors.py generate \\ + --samplesheet sheet.tsv \\ + --sites sites.hg38.bed \\ + --out anchors.hg38.tsv + + # any time after, audit a built HTML + python verify_anchors.py verify \\ + --html report.hg38.html \\ + --anchors anchors.hg38.tsv \\ + --out verify_anchors.tsv \\ + --fail-on-fail + + # cohort-wide + python verify_anchors.py verify-cohort \\ + --samplesheet sheet.tsv \\ + --reports-dir results//reports/ \\ + --genome hg38 \\ + --anchors anchors.hg38.tsv \\ + --out cohort_verify_anchors.tsv +""" + +from __future__ import annotations + +import argparse +import base64 +import dataclasses +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +# Same-dir imports — reuse verify_report's HTML parser helpers. +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import verify_report as vr + + +_SAMTOOLS_SIF_ENV = os.environ.get("SAMTOOLS_SIF_DEFAULT") +DEFAULT_SAMTOOLS_SIF = Path(_SAMTOOLS_SIF_ENV) if _SAMTOOLS_SIF_ENV else None + + +def _apptainer_bind_args() -> list[str]: + """Conditional `--bind ` tokens, matching build_igvreports.py. + + Source: $IGV_REPORTS_BIND (colon-separated). Empty / unset = no binds. + Paths that don't exist are silently skipped.""" + raw = os.environ.get("IGV_REPORTS_BIND", "") + if not raw: + return [] + tokens: list[str] = [] + for p in raw.split(":"): + if p and Path(p).exists(): + tokens.extend(["--bind", p]) + return tokens +# Match igv-reports BamReader default exclude flag (rules out PCR/optical +# duplicates and supplementary alignments — see igv_reports/bam.py). +EXCLUDE_FLAGS = "1536" +DEFAULT_TOLERANCE = 0.05 +ANCHOR_HEADER = [ + "sample", "track_name", "chrom", "start", "end", + "expected", "tolerance", "min", "max", "notes", +] + + +@dataclasses.dataclass +class AnchorRow: + sample: str + track_name: str + chrom: str + start: int + end: int + expected: int + tolerance: str = "" # blank => fall back to --tolerance flag + min_count: str = "" # blank => not used + max_count: str = "" # blank => not used + notes: str = "" + + @property + def region(self) -> str: + return f"{self.chrom}:{self.start}-{self.end}" + + +@dataclasses.dataclass +class AnchorCheck: + sample: str + track_name: str + region: str + status: str # PASS | FAIL | SKIP + observed: str = "" + expected: str = "" + details: str = "" + + +# --------------------------------------------------------------------------- +# samtools resolution +# --------------------------------------------------------------------------- + +def resolve_samtools(sif: Path | None) -> list[str]: + """Return a samtools command prefix (list of argv tokens). + + Priority: --samtools-sif → $SAMTOOLS_SIF → $SAMTOOLS_SIF_DEFAULT → PATH. + Falling back to PATH is fine for non-HPC use; on HPC, prefer a SIF to + avoid the NFS conda cold-start tax. + """ + candidate = sif + if candidate is None: + env = os.environ.get("SAMTOOLS_SIF") + if env: + candidate = Path(env) + if candidate is None and DEFAULT_SAMTOOLS_SIF is not None and DEFAULT_SAMTOOLS_SIF.exists(): + candidate = DEFAULT_SAMTOOLS_SIF + if candidate is not None: + if not candidate.exists(): + raise SystemExit(f"ERROR: samtools SIF not found: {candidate}") + return [ + "singularity", "exec", "--cleanenv", *_apptainer_bind_args(), + str(candidate), "samtools", + ] + path_sam = shutil.which("samtools") + if path_sam: + sys.stderr.write( + f"[verify_anchors] WARNING: falling back to PATH samtools at {path_sam}; " + "SIF preferred for HPC cold-start cost (rules/apptainer_vs_conda.md)\n" + ) + return [path_sam] + raise SystemExit( + "ERROR: no samtools found. Provide --samtools-sif, set $SAMTOOLS_SIF, " + "or install samtools on PATH." + ) + + +def samtools_count(samtools_cmd: list[str], bam: Path, region: str) -> int: + """Run `samtools view -c -F 1536 ` and return the count.""" + proc = subprocess.run( + samtools_cmd + ["view", "-c", "-F", EXCLUDE_FLAGS, str(bam), region], + capture_output=True, text=True, + ) + if proc.returncode != 0: + raise RuntimeError( + f"samtools view -c failed (exit {proc.returncode}) for {bam} {region}: " + f"{proc.stderr.strip()}" + ) + return int(proc.stdout.strip()) + + +def samtools_index(samtools_cmd: list[str], bam: Path) -> None: + """Run `samtools index `.""" + proc = subprocess.run( + samtools_cmd + ["index", str(bam)], + capture_output=True, text=True, + ) + if proc.returncode != 0: + raise RuntimeError( + f"samtools index failed (exit {proc.returncode}) for {bam}: " + f"{proc.stderr.strip()}" + ) + + +# --------------------------------------------------------------------------- +# anchors.tsv I/O +# --------------------------------------------------------------------------- + +def write_anchors(anchors: list[AnchorRow], out: Path) -> None: + out.parent.mkdir(parents=True, exist_ok=True) + lines = ["#" + "\t".join(ANCHOR_HEADER)] + for a in anchors: + lines.append("\t".join([ + a.sample, a.track_name, a.chrom, str(a.start), str(a.end), + str(a.expected), a.tolerance, a.min_count, a.max_count, a.notes, + ])) + out.write_text("\n".join(lines) + "\n") + + +def load_anchors(path: Path) -> list[AnchorRow]: + if not path.exists(): + raise SystemExit(f"ERROR: anchors TSV not found: {path}") + rows: list[AnchorRow] = [] + with path.open() as fh: + header: list[str] | None = None + for i, line in enumerate(fh, start=1): + line = line.rstrip("\n") + if not line: + continue + if line.startswith("#"): + if header is None: + header = line.lstrip("#").split("\t") + continue + if header is None: + raise SystemExit(f"{path}:{i}: data row before header — anchors TSV needs a `#`-prefixed header") + cols = line.split("\t") + if len(cols) < len(header): + cols += [""] * (len(header) - len(cols)) + d = dict(zip(header, cols)) + try: + # Validate numeric optional fields at load time so a mis-tabbed + # row fails here, not deep inside decide_status() with a + # confusing 'could not convert' on the notes value. + tolerance = (d.get("tolerance", "") or "").strip() + if tolerance: + float(tolerance) + min_count = (d.get("min", "") or "").strip() + if min_count: + int(min_count) + max_count = (d.get("max", "") or "").strip() + if max_count: + int(max_count) + rows.append(AnchorRow( + sample=d["sample"], + track_name=d["track_name"], + chrom=d["chrom"], + start=int(d["start"]), + end=int(d["end"]), + expected=int(d["expected"]), + tolerance=tolerance, + min_count=min_count, + max_count=max_count, + notes=d.get("notes", "") or "", + )) + except (KeyError, ValueError) as e: + raise SystemExit( + f"{path}:{i}: malformed anchor row: {e}\n" + f" row was: {cols!r}\n" + f" expected columns: {ANCHOR_HEADER}\n" + f" hint: TSV reader requires explicit tab separation — " + "if you generate the row with awk, pass `-F'\\t'`." + ) + return rows + + +# --------------------------------------------------------------------------- +# samplesheet → (sample, track_path) iteration (shared with build_igvreports) +# --------------------------------------------------------------------------- + +def parse_samplesheet(path: Path) -> list[dict]: + """Mirror build_igvreports.parse_samplesheet without importing it (avoids + pulling in PyYAML for code paths that don't need it).""" + rows: list[dict] = [] + with path.open() as fh: + header = fh.readline().lstrip("#").rstrip("\n").split("\t") + for ln in fh: + cols = ln.rstrip("\n").split("\t") + if not cols or not cols[0].strip(): + continue + rows.append(dict(zip(header, cols))) + return rows + + +def sample_bam_paths(row: dict) -> list[tuple[str, Path]]: + """Return [(track_name, bam_path), ...] for the BAM columns in a row. + track_name = Path.stem (matches igv-reports' positional auto-naming — + see verify_report.expected_track_labels).""" + out: list[tuple[str, Path]] = [] + for col in ("bam_tumor", "bam_normal"): + v = row.get(col) + if v and v.strip(): + p = Path(v.strip()) + out.append((p.stem, p)) + extras = row.get("extra_tracks") or "" + for entry in extras.split(","): + entry = entry.strip() + if entry.endswith(".bam") or entry.endswith(".cram"): + p = Path(entry) + out.append((p.stem, p)) + return out + + +# --------------------------------------------------------------------------- +# Slice extraction from embedded session +# --------------------------------------------------------------------------- + +_DATA_URL_RE = re.compile(r"data:[^;]+;base64,(.+)", flags=re.DOTALL) + + +def decode_track_slice(track_url: str, dest: Path) -> Path: + """Decode a track's `data:...;base64,...` URL, write bytes to `dest`. + + Per igv_reports/datauri.py: BAM slices come back from pysam.view as + bytes starting with BGZF magic (0x1f 0x8b), so igv-reports tags them + as `data:application/gzip;base64,...`. We accept any data: URL with a + base64 payload — the bytes are what matters, not the declared mediatype. + """ + m = _DATA_URL_RE.match(track_url) + if not m: + raise ValueError("track url is not a data: base64 URL") + raw = base64.b64decode(m.group(1)) + dest.write_bytes(raw) + return dest + + +def locate_session_entry( + session_dict: dict, table_json: dict, chrom: str, start: int, end: int, +) -> tuple[str, dict | None, str]: + """Locate the session entry for an anchor's (chrom, start+1, end). + + Returns (outcome, session_or_none, detail) where outcome is one of: + 'absent' — no tableJson row matches this region → caller should SKIP + (anchor lists a region the HTML never rendered) + 'broken' — row matched but session missing/undecodable → caller FAILs + (structural inconsistency or HTML corruption) + 'ok' — session decoded; second element is the dict + HTML stores 1-based start (per verify_report comment); BED is 0-based. + """ + headers = table_json.get("headers", []) + try: + col_chrom = headers.index("Chrom") + col_start = headers.index("Start") + col_end = headers.index("End") + except ValueError as e: + return ("broken", None, f"tableJson missing expected column: {e}") + rows = table_json.get("rows", []) + want = (chrom, start + 1, end) + for idx, row in enumerate(rows): + if (row[col_chrom], int(row[col_start]), int(row[col_end])) == want: + data_url = session_dict.get(str(idx)) + if data_url is None: + return ("broken", None, f"sessionDictionary has no entry for row index {idx}") + session = vr.decode_session_entry(data_url) + if session is None: + return ("broken", None, f"session entry {idx} failed to gunzip/decode") + return ("ok", session, "") + return ("absent", None, f"no tableJson row matched ({chrom}, {start+1}, {end})") + + +def find_track(session: dict, track_name: str) -> dict | None: + for t in session.get("tracks", []): + if t.get("name") == track_name: + return t + return None + + +# --------------------------------------------------------------------------- +# Status decision +# --------------------------------------------------------------------------- + +def decide_status(anchor: AnchorRow, observed: int, default_tol: float) -> tuple[str, str]: + """Return (status, details). min/max wins over tolerance when present.""" + if anchor.min_count or anchor.max_count: + bounds_ok = True + bits = [] + if anchor.min_count: + ok = observed >= int(anchor.min_count) + bits.append(f"min={anchor.min_count} {'OK' if ok else 'FAIL'}") + bounds_ok = bounds_ok and ok + if anchor.max_count: + ok = observed <= int(anchor.max_count) + bits.append(f"max={anchor.max_count} {'OK' if ok else 'FAIL'}") + bounds_ok = bounds_ok and ok + return ("PASS" if bounds_ok else "FAIL"), "; ".join(bits) + tol = float(anchor.tolerance) if anchor.tolerance else default_tol + if anchor.expected == 0: + ok = observed == 0 + return ("PASS" if ok else "FAIL"), f"expected=0, observed={observed}" + diff_ratio = abs(observed - anchor.expected) / anchor.expected + ok = diff_ratio <= tol + return ("PASS" if ok else "FAIL"), f"diff_ratio={diff_ratio:.3f} (tol={tol:.3f})" + + +# --------------------------------------------------------------------------- +# Subcommand: generate +# --------------------------------------------------------------------------- + +def cmd_generate(args: argparse.Namespace) -> None: + samtools_cmd = resolve_samtools(Path(args.samtools_sif) if args.samtools_sif else None) + rows = parse_samplesheet(Path(args.samplesheet)) + bed_rows = vr.load_sites_bed(Path(args.sites)) + if not rows: + raise SystemExit("ERROR: samplesheet has no data rows") + if not bed_rows: + raise SystemExit("ERROR: sites BED has no data rows") + + anchors: list[AnchorRow] = [] + for row in rows: + sample = row["sample"] + bams = sample_bam_paths(row) + if not bams: + sys.stderr.write(f"[generate] {sample}: no BAM tracks in row — skipping\n") + continue + for track_name, bam in bams: + if not bam.exists(): + sys.stderr.write(f"[generate] {sample}/{track_name}: BAM missing: {bam}\n") + continue + for b in bed_rows: + region = f"{b['chrom']}:{b['start']}-{b['end']}" + try: + count = samtools_count(samtools_cmd, bam, region) + except RuntimeError as e: + sys.stderr.write(f"[generate] {sample}/{track_name} {region}: {e}\n") + continue + anchors.append(AnchorRow( + sample=sample, track_name=track_name, + chrom=b["chrom"], start=b["start"], end=b["end"], + expected=count, notes=b["name"] or "", + )) + sys.stderr.write(f"[generate] {sample}/{track_name} {region}: {count}\n") + + out = Path(args.out) + write_anchors(anchors, out) + sys.stderr.write(f"[generate] wrote {len(anchors)} anchors -> {out}\n") + + +# --------------------------------------------------------------------------- +# Subcommand: verify (single HTML) +# --------------------------------------------------------------------------- + +def verify_one_html( + html_path: Path, anchors: list[AnchorRow], samtools_cmd: list[str], + default_tol: float, +) -> list[AnchorCheck]: + """Verify all anchors against one HTML. Anchors whose track_name doesn't + appear in the HTML are SKIPped (cohort verify-cohort filters by sample, + so this function trusts the caller passed the right anchor subset).""" + checks: list[AnchorCheck] = [] + if not html_path.is_file(): + for a in anchors: + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, "SKIP", + details=f"HTML missing: {html_path}", + )) + return checks + html_text = html_path.read_text() + table_json = vr.parse_table_json(html_text) + session_dict = vr.parse_session_dictionary(html_text) + if table_json is None or session_dict is None: + for a in anchors: + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, "FAIL", + details="tableJson or sessionDictionary missing from HTML", + )) + return checks + with tempfile.TemporaryDirectory(prefix="verify_anchors_") as td: + tmp = Path(td) + for a in anchors: + outcome, session, locate_detail = locate_session_entry( + session_dict, table_json, a.chrom, a.start, a.end, + ) + if outcome == "absent": + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, "SKIP", + details=locate_detail, + )) + continue + if outcome == "broken": + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, "FAIL", + expected=str(a.expected), + details=locate_detail, + )) + continue + assert session is not None # outcome == "ok" + track = find_track(session, a.track_name) + if track is None: + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, "SKIP", + details=f"track '{a.track_name}' not in HTML session", + )) + continue + url = track.get("url", "") + slice_path = tmp / f"{a.sample}__{a.track_name}__{a.chrom}_{a.start}_{a.end}.bam" + try: + decode_track_slice(url, slice_path) + samtools_index(samtools_cmd, slice_path) + observed = samtools_count(samtools_cmd, slice_path, a.region) + except (ValueError, RuntimeError) as e: + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, "FAIL", + expected=str(a.expected), + details=f"slice decode/count failed: {e}", + )) + continue + status, details = decide_status(a, observed, default_tol) + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, status, + observed=str(observed), expected=str(a.expected), + details=details, + )) + return checks + + +def cmd_verify(args: argparse.Namespace) -> None: + samtools_cmd = resolve_samtools(Path(args.samtools_sif) if args.samtools_sif else None) + anchors = load_anchors(Path(args.anchors)) + checks = verify_one_html(Path(args.html), anchors, samtools_cmd, args.tolerance) + write_checks(checks, Path(args.out) if args.out else None) + if args.fail_on_fail and any(c.status == "FAIL" for c in checks): + sys.exit(1) + + +# --------------------------------------------------------------------------- +# Subcommand: verify-cohort +# --------------------------------------------------------------------------- + +def cmd_verify_cohort(args: argparse.Namespace) -> None: + samtools_cmd = resolve_samtools(Path(args.samtools_sif) if args.samtools_sif else None) + anchors = load_anchors(Path(args.anchors)) + rows = parse_samplesheet(Path(args.samplesheet)) + reports_dir = Path(args.reports_dir) + genome = args.genome + + # Group anchors by sample for per-HTML filtering. + by_sample: dict[str, list[AnchorRow]] = {} + for a in anchors: + by_sample.setdefault(a.sample, []).append(a) + + all_checks: list[AnchorCheck] = [] + for row in rows: + sample = row["sample"] + html_path = reports_dir / f"{sample}.{genome}.html" + sample_anchors = by_sample.get(sample, []) + if not sample_anchors: + all_checks.append(AnchorCheck( + sample, "*", "*", "SKIP", + details="no anchors for this sample in anchors.tsv", + )) + continue + all_checks.extend(verify_one_html(html_path, sample_anchors, samtools_cmd, args.tolerance)) + + # Surface anchor samples that don't match any samplesheet row. + samplesheet_samples = {r["sample"] for r in rows} + anchor_orphans = sorted(set(by_sample.keys()) - samplesheet_samples) + for s in anchor_orphans: + all_checks.append(AnchorCheck( + s, "*", "*", "SKIP", + details="anchor sample not present in samplesheet", + )) + + write_checks(all_checks, Path(args.out) if args.out else None) + if args.fail_on_fail and any(c.status == "FAIL" for c in all_checks): + sys.exit(1) + + +# --------------------------------------------------------------------------- +# Output +# --------------------------------------------------------------------------- + +def write_checks(checks: list[AnchorCheck], out: Path | None) -> None: + lines = ["sample\ttrack_name\tregion\tstatus\tobserved\texpected\tdetails"] + for c in checks: + lines.append("\t".join([ + c.sample, c.track_name, c.region, c.status, + c.observed, c.expected, c.details, + ])) + text = "\n".join(lines) + "\n" + if out: + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(text) + sys.stdout.write(text) + + +# --------------------------------------------------------------------------- +# CLI +# --------------------------------------------------------------------------- + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + sub = ap.add_subparsers(dest="cmd", required=True) + + # generate + g = sub.add_parser("generate", help="freeze samtools view -c counts into anchors.tsv") + g.add_argument("--samplesheet", required=True) + g.add_argument("--sites", required=True) + g.add_argument("--out", required=True, help="path to write anchors TSV") + g.add_argument("--samtools-sif", help="explicit samtools SIF path") + g.set_defaults(func=cmd_generate) + + # verify + v = sub.add_parser("verify", help="audit one HTML against anchors.tsv") + v.add_argument("--html", required=True) + v.add_argument("--anchors", required=True) + v.add_argument("--out", help="write checks TSV here in addition to stdout") + v.add_argument("--samtools-sif") + v.add_argument("--tolerance", type=float, default=DEFAULT_TOLERANCE, + help=f"default ratio tolerance when row tolerance/min/max blank (default {DEFAULT_TOLERANCE})") + v.add_argument("--fail-on-fail", action="store_true") + v.set_defaults(func=cmd_verify) + + # verify-cohort + vc = sub.add_parser("verify-cohort", help="audit all HTMLs in a cohort against anchors.tsv") + vc.add_argument("--samplesheet", required=True) + vc.add_argument("--reports-dir", required=True) + vc.add_argument("--genome", required=True) + vc.add_argument("--anchors", required=True) + vc.add_argument("--out") + vc.add_argument("--samtools-sif") + vc.add_argument("--tolerance", type=float, default=DEFAULT_TOLERANCE) + vc.add_argument("--fail-on-fail", action="store_true") + vc.set_defaults(func=cmd_verify_cohort) + + args = ap.parse_args() + args.func(args) + + +if __name__ == "__main__": + main() diff --git a/igv-reports/scripts/verify_cohort.py b/igv-reports/scripts/verify_cohort.py new file mode 100755 index 0000000..4943349 --- /dev/null +++ b/igv-reports/scripts/verify_cohort.py @@ -0,0 +1,485 @@ +#!/usr/bin/env python3 +"""verify_cohort.py — cohort-level structural verifier for create_report runs. + +Author: Samuel Ahuno +Purpose: + Catches sample-to-HTML mismatches in cohort mode. Per-sample verification + (verify_report.py) confirms each HTML is internally consistent, but it + has no notion of WHICH sample an HTML *should* belong to. This verifier + re-reads the samplesheet and cross-checks every HTML against the row that + produced it, plus scans for cross-sample contamination. + +Threat model — failure modes this catches that per-sample verify cannot: + * Wrong BAM embedded under right filename (samplesheet typo, copy-paste). + * Tumor/normal slot swap. + * Missing HTML for a samplesheet row (cohort loop silently skipped). + * Index.html lying — links to a sample that doesn't exist, or omits one. + * Sample-2's BAM accidentally winding up inside sample-1's HTML. + +Checks emitted (per sample, plus two cohort-global rows tagged sample="*"): + Per-sample (delegated to verify_report.py for the structural ones): + * html_exists, html_min_size, region_count, region_coords, + region_sessions, tracks_present -- run verify_report.py against + each sample's HTML using that sample's row as input + Cohort-specific (added here): + C2 sample_tracks_match -- the HTML's session contains every + track basename declared in this row + C3 no_cross_sample_contamination -- the HTML's session contains NO + basename that belongs to another + row's track columns but not this + row (default-track basenames from + databases_config.yaml are excluded) + C4 sample_id_embedded -- the `sample` column value appears in + the HTML's or filename + Cohort-global (one row each, sample='*'): + C1 cohort_html_coverage -- every samplesheet sample has exactly + one matching HTML; flag missing+extras + C5 index_consistency -- index.html (if present) links exactly + the samplesheet sample set; each link + target exists and is non-empty + +Output: + TSV with columns: sample / check / status / observed / expected / details + (also printed to stdout). Optional --summary <path>.md emits a one-page + rollup: total samples, PASS/FAIL counts per check, contamination incidents + listed by sample. + +Exit code: 0, or 1 if --fail-on-fail is set and any row is FAIL. + +Typical use (auto-invoked by build_igvreports.py --samplesheet, but can be +run standalone too): + + python verify_cohort.py \\ + --samplesheet samplesheet.tsv \\ + --reports-dir results/<run>/reports/ \\ + --genome hg38 \\ + --out results/<run>/reports/cohort_verify.tsv \\ + --summary results/<run>/reports/cohort_verify.summary.md \\ + --fail-on-fail +""" + +from __future__ import annotations + +import argparse +import os +import re +import sys +from dataclasses import dataclass +from pathlib import Path + +# Same-dir imports — both verify_report.py and build_igvreports.py live here. +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import verify_report as vr +import build_igvreports as bir + + +_DBCONFIG_ENV = os.environ.get("IGV_REPORTS_DB_CONFIG") +DEFAULT_DBCONFIG = Path(_DBCONFIG_ENV) if _DBCONFIG_ENV else None +DEFAULT_TRACK_COLUMNS = ["bam_tumor", "bam_normal", "vcf", "extra_tracks"] + + +@dataclass +class CohortCheck: + sample: str # "*" for cohort-global checks + name: str + status: str # PASS | FAIL | SKIP + observed: str = "" + expected: str = "" + details: str = "" + + +# --------------------------------------------------------------------------- +# Samplesheet inspection +# --------------------------------------------------------------------------- + +def row_track_paths(row: dict, track_columns: list[str]) -> list[str]: + """Extract all track paths from a samplesheet row. Honors `extra_tracks` + being a comma-separated list (per build_igvreports.py convention).""" + paths: list[str] = [] + for col in track_columns: + val = row.get(col) + if not val or not val.strip(): + continue + if col == "extra_tracks": + paths.extend(p.strip() for p in val.split(",") if p.strip()) + else: + paths.append(val.strip()) + return paths + + +def track_labels_of(paths: list[str]) -> set[str]: + """Return the names igv-reports auto-assigns to positional --tracks for + these paths. igv-reports strips ONE final suffix (verified against + create_report 1.16.2 — see verify_report.expected_track_labels).""" + return {Path(p).stem for p in paths} + + +# --------------------------------------------------------------------------- +# Cohort-global checks (C1, C5) +# --------------------------------------------------------------------------- + +def check_html_coverage(rows: list[dict], reports_dir: Path, genome: str) -> CohortCheck: + expected_files = {f"{r['sample']}.{genome}.html" for r in rows} + actual_files = {p.name for p in reports_dir.glob(f"*.{genome}.html")} + missing = sorted(expected_files - actual_files) + extras = sorted(actual_files - expected_files) + if not missing and not extras: + return CohortCheck( + "*", "cohort_html_coverage", "PASS", + observed=f"{len(actual_files)} HTMLs", + expected=f"{len(expected_files)} HTMLs", + ) + details = [] + if missing: + details.append(f"missing: {', '.join(missing[:5])}" + (" ..." if len(missing) > 5 else "")) + if extras: + details.append(f"unexpected: {', '.join(extras[:5])}" + (" ..." if len(extras) > 5 else "")) + return CohortCheck( + "*", "cohort_html_coverage", "FAIL", + observed=f"{len(actual_files)} HTMLs", + expected=f"{len(expected_files)} HTMLs", + details="; ".join(details), + ) + + +def check_index_consistency(rows: list[dict], reports_dir: Path) -> CohortCheck: + index = reports_dir / "index.html" + if not index.exists(): + return CohortCheck( + "*", "index_consistency", "SKIP", + details=f"no {index.name} present (cohort write_index() not invoked)", + ) + text = index.read_text() + # build_igvreports.write_index() emits <li><a href="<file>">SAMPLE</a></li>. + # Match <a href="..."> ... </a> and pull both the href and the link text. + found: dict[str, str] = {} # sample -> href + for m in re.finditer(r'<a href="([^"]+)">([^<]+)</a>', text): + href, label = m.group(1), m.group(2).strip() + found[label] = href + + expected_samples = {r["sample"] for r in rows} + indexed_samples = set(found.keys()) + missing = sorted(expected_samples - indexed_samples) + extras = sorted(indexed_samples - expected_samples) + broken_links = [] + for sample, href in found.items(): + target = reports_dir / href + if not target.exists() or target.stat().st_size < 1024: + broken_links.append(f"{sample}->{href}") + + if not missing and not extras and not broken_links: + return CohortCheck( + "*", "index_consistency", "PASS", + observed=f"{len(found)} links", + expected=f"{len(expected_samples)} samples", + ) + details = [] + if missing: + details.append(f"missing from index: {', '.join(missing[:5])}") + if extras: + details.append(f"unexpected in index: {', '.join(extras[:5])}") + if broken_links: + details.append(f"broken: {', '.join(broken_links[:5])}") + return CohortCheck( + "*", "index_consistency", "FAIL", + observed=f"{len(found)} links", + expected=f"{len(expected_samples)} samples", + details="; ".join(details), + ) + + +# --------------------------------------------------------------------------- +# Per-sample checks (delegate to verify_report + add C2, C3, C4) +# --------------------------------------------------------------------------- + +def per_sample_structural(sample: str, html_path: Path, sites_path: Path, + tracks: list[str], min_size_mb: float) -> list[CohortCheck]: + """Run verify_report.py's 6 structural checks against one sample's HTML.""" + out: list[CohortCheck] = [] + out.append(_wrap(sample, vr.check_html_exists(html_path))) + if not html_path.is_file(): + for n in ("html_min_size", "region_count", "region_coords", + "region_sessions", "tracks_present"): + out.append(CohortCheck(sample, n, "SKIP", details="HTML missing")) + return out + out.append(_wrap(sample, vr.check_html_min_size(html_path, min_size_mb))) + if not sites_path.exists(): + for n in ("region_count", "region_coords", "region_sessions", "tracks_present"): + out.append(CohortCheck(sample, n, "SKIP", details=f"sites BED missing: {sites_path}")) + return out + html_text = html_path.read_text() + table_json = vr.parse_table_json(html_text) + session_dict = vr.parse_session_dictionary(html_text) + bed_rows = vr.load_sites_bed(sites_path) + out.append(_wrap(sample, vr.check_region_count(bed_rows, table_json))) + out.append(_wrap(sample, vr.check_region_coords(bed_rows, table_json))) + out.append(_wrap(sample, vr.check_region_sessions(table_json, session_dict))) + labels = vr.expected_track_labels(tracks, None) + out.append(_wrap(sample, vr.check_tracks_present(session_dict, labels))) + return out + + +def _wrap(sample: str, c: vr.Check) -> CohortCheck: + return CohortCheck(sample, c.name, c.status, c.observed, c.expected, c.details) + + +def session_track_names(html_path: Path) -> set[str]: + """Decode the first sessionDictionary entry and return its track names. + Returns an empty set on any decode failure.""" + if not html_path.is_file(): + return set() + text = html_path.read_text() + sd = vr.parse_session_dictionary(text) + if not sd: + return set() + sample_key = sorted(sd.keys())[0] + session = vr.decode_session_entry(sd[sample_key]) + if session is None: + return set() + return {t.get("name") for t in session.get("tracks", []) if t.get("name")} + + +def check_sample_tracks_match(sample: str, html_path: Path, row_tracks: list[str]) -> CohortCheck: + """C2: each track-stem declared in this sample's row appears as a track + name in this HTML's session. (igv-reports auto-names positional tracks + by Path.stem — see verify_report.py's expected_track_labels rationale.)""" + if not html_path.is_file(): + return CohortCheck(sample, "sample_tracks_match", "SKIP", details="HTML missing") + expected = sorted(track_labels_of(row_tracks)) + if not expected: + return CohortCheck(sample, "sample_tracks_match", "SKIP", + details="no track paths in samplesheet row") + names = session_track_names(html_path) + misses = [b for b in expected if b not in names] + if misses: + return CohortCheck( + sample, "sample_tracks_match", "FAIL", + observed=f"{len(expected) - len(misses)}/{len(expected)} found", + expected=f"{len(expected)}/{len(expected)} found", + details="missing: " + ", ".join(misses[:5]) + (" ..." if len(misses) > 5 else ""), + ) + return CohortCheck( + sample, "sample_tracks_match", "PASS", + observed=f"{len(expected)}/{len(expected)} found", + ) + + +def check_no_cross_sample_contamination( + sample: str, + html_path: Path, + this_row_labels: set[str], + other_rows_labels: set[str], + allow_list: set[str], +) -> CohortCheck: + """C3: HTML must not contain any track-name label that belongs to OTHER + samplesheet rows but not this one and not the default-track allow list. + Labels are Path.stem (igv-reports's auto-naming for positional tracks).""" + if not html_path.is_file(): + return CohortCheck(sample, "no_cross_sample_contamination", "SKIP", details="HTML missing") + suspicious = (other_rows_labels - this_row_labels) - allow_list + if not suspicious: + return CohortCheck( + sample, "no_cross_sample_contamination", "PASS", + observed="0 suspect labels in scope", + ) + names = session_track_names(html_path) + incidents = sorted([b for b in suspicious if b in names]) + if not incidents: + return CohortCheck( + sample, "no_cross_sample_contamination", "PASS", + observed=f"{len(suspicious)} other-sample labels scanned, 0 found", + ) + return CohortCheck( + sample, "no_cross_sample_contamination", "FAIL", + observed=f"{len(incidents)} contamination incidents", + details="found: " + ", ".join(incidents[:5]) + (" ..." if len(incidents) > 5 else ""), + ) + + +def check_sample_id_embedded(sample: str, html_path: Path) -> CohortCheck: + """C4: the sample id appears in the HTML's embedded <title>. + + Filename is intentionally NOT checked. The filename is what the cohort + loop named the file; the title is what `create_report --title` baked + INTO the HTML at render time. For swap detection, only the title is a + real signal — a copy-paste of sample_2.html over sample_1.html leaves + the filename as `sample_1.hg38.html` but the title still says + `sample_2 (hg38)`. Build_igvreports.py's default title pattern is + `<sample> (<genome>)`, so this works out of the box. + + If --title is overridden and omits the sample id, this check will FAIL + — which is the right behavior for a verifier that doesn't know the + user's intent.""" + if not html_path.is_file(): + return CohortCheck(sample, "sample_id_embedded", "SKIP", details="HTML missing") + # Read just the head so we don't scan 25 MB for a string. + head = html_path.read_text()[:16384] + m = re.search(r"<title>([^<]*)", head, flags=re.IGNORECASE) + if not m: + return CohortCheck( + sample, "sample_id_embedded", "SKIP", + details="no tag in HTML head; cannot verify", + ) + title = m.group(1) + if sample in title: + return CohortCheck(sample, "sample_id_embedded", "PASS", + observed=f"in <title>: {title!r}") + return CohortCheck( + sample, "sample_id_embedded", "FAIL", + observed=f"title={title!r}", + details=f"sample id {sample!r} not in <title> — likely a swap or wrong --title", + ) + + +# --------------------------------------------------------------------------- +# Allow-list (default tracks resolved from databases_config.yaml) +# --------------------------------------------------------------------------- + +def resolve_default_track_labels(db_config: Path, genome: str) -> set[str]: + """Reuse the driver's logic so the allow-list stays in sync with what was + actually loaded. Returns Path.stem of each default track (matches igv- + reports's auto-naming convention — see track_labels_of).""" + import logging + log = logging.getLogger("verify_cohort.allow_list_probe") + log.addHandler(logging.NullHandler()) + cfg = bir.load_db_config(db_config) + canon = bir.resolve_genome(genome) + try: + paths = bir.resolve_default_tracks(cfg, canon, log) + except SystemExit: + # genome not in db_config — fail open with an empty allow-list; the + # contamination check will then be over-conservative, never under. + return set() + return {Path(p).stem for p in paths} + + +# --------------------------------------------------------------------------- +# Output +# --------------------------------------------------------------------------- + +def write_tsv(checks: list[CohortCheck], out: Path | None) -> None: + lines = ["sample\tcheck\tstatus\tobserved\texpected\tdetails"] + for c in checks: + lines.append("\t".join((c.sample, c.name, c.status, c.observed, c.expected, c.details))) + text = "\n".join(lines) + "\n" + if out: + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(text) + sys.stdout.write(text) + + +def write_summary(checks: list[CohortCheck], rows: list[dict], out: Path) -> None: + by_status = {"PASS": 0, "FAIL": 0, "SKIP": 0} + by_check: dict[str, dict[str, int]] = {} + fail_rows = [] + for c in checks: + by_status[c.status] = by_status.get(c.status, 0) + 1 + by_check.setdefault(c.name, {"PASS": 0, "FAIL": 0, "SKIP": 0})[c.status] += 1 + if c.status == "FAIL": + fail_rows.append(c) + + n_samples = len(rows) + lines = [] + lines.append(f"# Cohort verification summary\n") + lines.append(f"- samples: **{n_samples}**") + lines.append(f"- total checks: {sum(by_status.values())} (PASS={by_status['PASS']}, FAIL={by_status['FAIL']}, SKIP={by_status['SKIP']})") + lines.append("") + lines.append("## Per-check totals") + lines.append("") + lines.append("| check | PASS | FAIL | SKIP |") + lines.append("|---|---:|---:|---:|") + for check_name in sorted(by_check): + s = by_check[check_name] + lines.append(f"| {check_name} | {s['PASS']} | {s['FAIL']} | {s['SKIP']} |") + lines.append("") + if fail_rows: + lines.append("## Failures") + lines.append("") + lines.append("| sample | check | observed | expected | details |") + lines.append("|---|---|---|---|---|") + for c in fail_rows: + lines.append(f"| {c.sample} | {c.name} | {c.observed} | {c.expected} | {c.details} |") + else: + lines.append("## Failures\n\nNone — cohort verified clean.\n") + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text("\n".join(lines) + "\n") + + +# --------------------------------------------------------------------------- +# Driver +# --------------------------------------------------------------------------- + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--samplesheet", required=True, help="TSV that drove the cohort build (same one passed to build_igvreports.py --samplesheet)") + ap.add_argument("--reports-dir", required=True, help="dir containing <sample>.<genome>.html files (and optional index.html)") + ap.add_argument("--genome", required=True, help="genome tag (hg38 | mm10 | mm39 | t2t | GRCh37)") + ap.add_argument("--db-config", default=(str(DEFAULT_DBCONFIG) if DEFAULT_DBCONFIG else None), help="databases_config.yaml to resolve default-track allow-list (optional)") + ap.add_argument( + "--track-columns", nargs="*", default=DEFAULT_TRACK_COLUMNS, + help=f"samplesheet columns containing track paths (default: {DEFAULT_TRACK_COLUMNS}). " + "`extra_tracks` is parsed comma-separated if present.", + ) + ap.add_argument("--min-size-mb", type=float, default=0.5, help="per-sample HTML min size (passed through to verify_report)") + ap.add_argument("--out", help="write the TSV report here in addition to stdout") + ap.add_argument("--summary", help="write a one-page markdown rollup here") + ap.add_argument("--fail-on-fail", action="store_true", help="exit nonzero if any check is FAIL") + args = ap.parse_args() + + samplesheet = Path(args.samplesheet) + reports_dir = Path(args.reports_dir) + if not samplesheet.exists(): + raise SystemExit(f"ERROR: samplesheet not found: {samplesheet}") + if not reports_dir.is_dir(): + raise SystemExit(f"ERROR: reports-dir not found: {reports_dir}") + + rows = bir.parse_samplesheet(samplesheet) + if not rows: + raise SystemExit(f"ERROR: samplesheet has no data rows: {samplesheet}") + + allow_list = ( + resolve_default_track_labels(Path(args.db_config), args.genome) + if args.db_config else set() + ) + + # Pre-compute track-label sets per sample for the contamination check. + # Labels are Path.stem of each track path, matching igv-reports's auto- + # naming (see track_labels_of). + per_sample_labels: dict[str, set[str]] = { + r["sample"]: track_labels_of(row_track_paths(r, args.track_columns)) for r in rows + } + all_labels = set().union(*per_sample_labels.values()) if per_sample_labels else set() + + checks: list[CohortCheck] = [] + # C1 cohort_html_coverage + checks.append(check_html_coverage(rows, reports_dir, args.genome)) + + # Per-sample: 6 structural (verify_report) + C2 + C3 + C4 + for r in rows: + sample = r["sample"] + html_path = reports_dir / f"{sample}.{args.genome}.html" + sites_path = Path(r["sites_bed"]) + tracks = row_track_paths(r, args.track_columns) + + checks.extend(per_sample_structural(sample, html_path, sites_path, tracks, args.min_size_mb)) + checks.append(check_sample_tracks_match(sample, html_path, tracks)) + + this_labels = per_sample_labels[sample] + other_labels = all_labels - this_labels + checks.append(check_no_cross_sample_contamination(sample, html_path, this_labels, other_labels, allow_list)) + checks.append(check_sample_id_embedded(sample, html_path)) + + # C5 index_consistency + checks.append(check_index_consistency(rows, reports_dir)) + + out_path = Path(args.out) if args.out else None + write_tsv(checks, out_path) + if args.summary: + write_summary(checks, rows, Path(args.summary)) + + if args.fail_on_fail and any(c.status == "FAIL" for c in checks): + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/igv-reports/scripts/verify_report.py b/igv-reports/scripts/verify_report.py new file mode 100755 index 0000000..744920e --- /dev/null +++ b/igv-reports/scripts/verify_report.py @@ -0,0 +1,396 @@ +#!/usr/bin/env python3 +"""verify_report.py — post-render structural verifier for create_report HTMLs. + +Author: Samuel Ahuno +Purpose: + Validates that a self-contained create_report HTML actually contains what + its inputs declared. Catches the "silent garbage" failure mode where the + HTML builds (exit 0, plausible file size) but the content doesn't match the + user's intent: wrong region count, wrong coordinates, missing tracks, or a + catastrophic empty render. + +Dual role: + - CLI: `python verify_report.py --html ... --sites ... [--track-config ...]` + - Library: importable helpers (parse_table_json, parse_session_dictionary, + decode_session_entry, load_sites_bed, expected_track_labels, the + `check_*` functions, and the Check dataclass). verify_cohort.py imports + these to do per-sample checks + add cross-sample assertions. + +Checks emitted (one TSV row per check, ordered): + 1. html_exists Output file is a regular file. + 2. html_min_size Output >= --min-size-mb (default 0.5 MB). + 3. region_count tableJson rows count == sites BED data-row count. + 4. region_coords Each BED row finds a matching (chrom, start+1, end[, name]) + in the embedded tableJson. BED is 0-based half-open; + create_report stores 1-based start in the table. + 5. region_sessions sessionDictionary has an entry for each tableJson row. + 6. tracks_present For --track-config <json>: each track's `name` field + appears in the decoded session's tracks[].name list. + For --tracks <path...>: each path's Path.stem appears + in the decoded session's tracks[].name list. igv- + reports strips ONE final suffix when auto-naming + positional tracks (e.g. `x.5mC.bedgraph` -> `x.5mC`, + `gencode.v47.annotation.gff3.gz` -> `gencode.v47. + annotation.gff3`). Skipped if neither flag is given. + NOTE: --standalone embeds slices as data: URLs, so + original URL paths are absent from the session — we + match on track NAMES, which are preserved. + +Output: + TSV with columns: check / status / observed / expected / details + status is one of PASS / FAIL / SKIP. + +Exit code: + 0 always, unless --fail-on-fail is set and at least one row is FAIL. + +Typical use: + python verify_report.py \\ + --html report.hg38.html \\ + --sites sites.hg38.bed \\ + --track-config tracks.json \\ + --out verify.tsv \\ + --min-size-mb 1.0 \\ + --fail-on-fail +""" + +from __future__ import annotations + +import argparse +import base64 +import dataclasses +import gzip +import json +import re +import sys +from pathlib import Path + + +@dataclasses.dataclass +class Check: + name: str + status: str # PASS | FAIL | SKIP + observed: str = "" + expected: str = "" + details: str = "" + + +# --------------------------------------------------------------------------- +# Sites-BED loader (mirrors create_report's #-skip behavior) +# --------------------------------------------------------------------------- + +def load_sites_bed(path: Path) -> list[dict]: + """Return a list of {chrom, start, end, name} dicts; skips '#' and 'track '.""" + rows: list[dict] = [] + with path.open() as fh: + for i, line in enumerate(fh, start=1): + line = line.rstrip("\n") + if not line or line.startswith("#") or line.startswith("track "): + continue + cols = line.split("\t") + if len(cols) < 3: + raise SystemExit(f"{path}:{i}: BED row has <3 columns") + try: + start = int(cols[1]) + end = int(cols[2]) + except ValueError as e: + raise SystemExit(f"{path}:{i}: non-numeric start/end: {e}") + rows.append({ + "chrom": cols[0], + "start": start, + "end": end, + "name": cols[3] if len(cols) >= 4 else None, + }) + return rows + + +# --------------------------------------------------------------------------- +# HTML extractors +# --------------------------------------------------------------------------- + +def _extract_balanced_blob(text: str, anchor: str, opener: str = "{") -> str | None: + """Find `anchor` in `text`, then return the substring starting at the next + `opener` and ending at the matched closer. Skips characters inside double- + quoted strings (with backslash escapes). Returns None if not found.""" + closer = "}" if opener == "{" else "]" + i = text.find(anchor) + if i < 0: + return None + start = text.find(opener, i) + if start < 0: + return None + depth = 0 + in_str = False + escape = False + for j in range(start, len(text)): + c = text[j] + if escape: + escape = False + continue + if c == "\\": + escape = True + continue + if c == '"': + in_str = not in_str + continue + if in_str: + continue + if c == opener: + depth += 1 + elif c == closer: + depth -= 1 + if depth == 0: + return text[start:j + 1] + return None + + +def parse_table_json(html: str) -> dict | None: + blob = _extract_balanced_blob(html, "tableJson = ", "{") + if not blob: + return None + return json.loads(blob) + + +def parse_session_dictionary(html: str) -> dict | None: + blob = _extract_balanced_blob(html, "sessionDictionary = ", "{") + if not blob: + return None + return json.loads(blob) + + +def decode_session_entry(data_url: str) -> dict | None: + """A sessionDictionary value looks like 'data:application/gzip;base64,XXXX'. + Strip the prefix, base64-decode, gunzip, parse JSON. Return the IGV.js + session dict (or None on any error — failures here are non-fatal).""" + try: + m = re.match(r"data:application/gzip;base64,(.+)", data_url, flags=re.DOTALL) + if not m: + return None + raw = base64.b64decode(m.group(1)) + return json.loads(gzip.decompress(raw)) + except Exception: + return None + + +# --------------------------------------------------------------------------- +# Track-input parser +# --------------------------------------------------------------------------- + +def expected_track_labels(tracks: list[str] | None, track_config: Path | None) -> list[str]: + """Return the track NAMES we expect to see in the embedded igv.js session. + + `--standalone` replaces every track URL with an inlined `data:...` URL after + slicing, so URL paths are unrecoverable from the embedded session — we have + to match on track names instead, which the standalone build preserves. + + - For --track-config <json>: use the `name` field of each entry verbatim. + - For positional --tracks <path...>: use Path(p).stem (igv-reports strips + ONE final suffix when auto-naming positional tracks — verified 2026-05-16 + against create_report 1.16.2: `colo829bl_PAU59807.5mC.bedgraph` -> + `colo829bl_PAU59807.5mC`, `gencode.v47.annotation.gff3.gz` -> + `gencode.v47.annotation.gff3`, `x.bam` -> `x`). + Empty list means 'check skipped'. + """ + out: list[str] = [] + if track_config and track_config.exists(): + with track_config.open() as fh: + cfg = json.load(fh) + for entry in cfg: + name = entry.get("name") + if name: + out.append(name) + return out + if tracks: + for t in tracks: + out.append(Path(t).stem) + return out + + +# --------------------------------------------------------------------------- +# Individual checks +# --------------------------------------------------------------------------- + +def check_html_exists(html: Path) -> Check: + if html.is_file(): + return Check("html_exists", "PASS", observed=str(html)) + return Check("html_exists", "FAIL", observed=str(html), details="not a regular file") + + +def check_html_min_size(html: Path, floor_mb: float) -> Check: + size_mb = html.stat().st_size / 1024 / 1024 + status = "PASS" if size_mb >= floor_mb else "FAIL" + return Check( + "html_min_size", + status, + observed=f"{size_mb:.2f} MB", + expected=f">= {floor_mb:.2f} MB", + ) + + +def check_region_count(bed_rows: list[dict], table_json: dict | None) -> Check: + if table_json is None: + return Check("region_count", "FAIL", details="tableJson not found in HTML") + n_html = len(table_json.get("rows", [])) + n_bed = len(bed_rows) + return Check( + "region_count", + "PASS" if n_html == n_bed else "FAIL", + observed=str(n_html), + expected=str(n_bed), + ) + + +def check_region_coords(bed_rows: list[dict], table_json: dict | None) -> Check: + """For each BED row, find a matching row in the HTML by (chrom, start+1, end[, name]). + The HTML stores 1-based start, BED is 0-based half-open.""" + if table_json is None: + return Check("region_coords", "FAIL", details="tableJson not found") + headers = table_json.get("headers", []) + rows = table_json.get("rows", []) + try: + col_chrom = headers.index("Chrom") + col_start = headers.index("Start") + col_end = headers.index("End") + col_name = headers.index("Name") if "Name" in headers else None + except ValueError as e: + return Check("region_coords", "FAIL", details=f"missing column in tableJson headers: {e}") + + html_set = { + (r[col_chrom], int(r[col_start]), int(r[col_end])): (r[col_name] if col_name is not None else None) + for r in rows + } + misses: list[str] = [] + for b in bed_rows: + key = (b["chrom"], b["start"] + 1, b["end"]) + if key not in html_set: + misses.append(f"{b['chrom']}:{b['start']}-{b['end']}") + continue + # If both have a name, names must match. + if col_name is not None and b["name"] is not None and html_set[key] != b["name"]: + misses.append(f"{b['chrom']}:{b['start']}-{b['end']} name mismatch (BED={b['name']!r}, HTML={html_set[key]!r})") + if misses: + return Check( + "region_coords", "FAIL", + observed=f"{len(bed_rows) - len(misses)}/{len(bed_rows)} matched", + expected=f"{len(bed_rows)}/{len(bed_rows)} matched", + details="; ".join(misses[:5]) + (" ..." if len(misses) > 5 else ""), + ) + return Check("region_coords", "PASS", observed=f"{len(bed_rows)}/{len(bed_rows)} matched") + + +def check_region_sessions(table_json: dict | None, session_dict: dict | None) -> Check: + if table_json is None or session_dict is None: + return Check("region_sessions", "FAIL", details="tableJson or sessionDictionary missing") + n_rows = len(table_json.get("rows", [])) + n_sess = len(session_dict) + # Sessions are keyed by stringified row index 0..N-1. + expected_keys = {str(i) for i in range(n_rows)} + actual_keys = set(session_dict.keys()) + if expected_keys.issubset(actual_keys): + return Check( + "region_sessions", "PASS", + observed=str(n_sess), + expected=f">={n_rows} (one per row)", + ) + return Check( + "region_sessions", "FAIL", + observed=f"keys={sorted(actual_keys)[:5]}...", + expected=f"keys 0..{n_rows-1}", + details=f"missing keys: {sorted(expected_keys - actual_keys)[:5]}", + ) + + +def check_tracks_present( + session_dict: dict | None, + expected_labels: list[str], +) -> Check: + if not expected_labels: + return Check("tracks_present", "SKIP", details="neither --tracks nor --track-config provided") + if session_dict is None or not session_dict: + return Check("tracks_present", "FAIL", details="sessionDictionary missing or empty") + # Decode the first available session entry. Track names are identical + # across per-region sessions (only the data: URL slices differ). + sample_key = sorted(session_dict.keys())[0] + session = decode_session_entry(session_dict[sample_key]) + if session is None: + return Check("tracks_present", "FAIL", details="failed to decode/gunzip session entry") + session_track_names = {t.get("name") for t in session.get("tracks", []) if t.get("name")} + misses = [lab for lab in expected_labels if lab not in session_track_names] + if misses: + return Check( + "tracks_present", "FAIL", + observed=f"{len(expected_labels) - len(misses)}/{len(expected_labels)} found", + expected=f"{len(expected_labels)}/{len(expected_labels)} found", + details="missing: " + ", ".join(misses[:5]) + (" ..." if len(misses) > 5 else ""), + ) + return Check( + "tracks_present", "PASS", + observed=f"{len(expected_labels)}/{len(expected_labels)} found", + ) + + +# --------------------------------------------------------------------------- +# Driver +# --------------------------------------------------------------------------- + +def write_tsv(checks: list[Check], out: Path | None) -> None: + lines = ["check\tstatus\tobserved\texpected\tdetails"] + for c in checks: + lines.append(f"{c.name}\t{c.status}\t{c.observed}\t{c.expected}\t{c.details}") + text = "\n".join(lines) + "\n" + if out: + out.parent.mkdir(parents=True, exist_ok=True) + out.write_text(text) + # Always also emit to stdout for piping / inspection. + sys.stdout.write(text) + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--html", required=True, help="path to the create_report HTML to verify") + ap.add_argument("--sites", required=True, help="path to the sites BED that was passed to create_report") + ap.add_argument("--tracks", nargs="*", default=[], help="track paths that were passed to create_report (--tracks mode)") + ap.add_argument("--track-config", help="track config JSON that was passed to create_report (--track-config mode)") + ap.add_argument("--min-size-mb", type=float, default=0.5, help="minimum acceptable HTML size in MB (default: 0.5)") + ap.add_argument("--out", help="write the TSV report here in addition to stdout") + ap.add_argument("--fail-on-fail", action="store_true", help="exit nonzero if any check is FAIL") + args = ap.parse_args() + + html_path = Path(args.html) + sites_path = Path(args.sites) + out_path = Path(args.out) if args.out else None + track_config = Path(args.track_config) if args.track_config else None + + checks: list[Check] = [check_html_exists(html_path)] + + # If the HTML doesn't exist, every downstream check would crash; mark them SKIP and bail. + if checks[0].status == "FAIL": + checks.append(Check("html_min_size", "SKIP", details="HTML missing")) + checks.append(Check("region_count", "SKIP", details="HTML missing")) + checks.append(Check("region_coords", "SKIP", details="HTML missing")) + checks.append(Check("region_sessions", "SKIP", details="HTML missing")) + checks.append(Check("tracks_present", "SKIP", details="HTML missing")) + write_tsv(checks, out_path) + if args.fail_on_fail: + sys.exit(1) + return + + checks.append(check_html_min_size(html_path, args.min_size_mb)) + + html_text = html_path.read_text() + table_json = parse_table_json(html_text) + session_dict = parse_session_dictionary(html_text) + bed_rows = load_sites_bed(sites_path) + + checks.append(check_region_count(bed_rows, table_json)) + checks.append(check_region_coords(bed_rows, table_json)) + checks.append(check_region_sessions(table_json, session_dict)) + checks.append(check_tracks_present(session_dict, expected_track_labels(args.tracks, track_config))) + + write_tsv(checks, out_path) + + if args.fail_on_fail and any(c.status == "FAIL" for c in checks): + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/igv-reports/tests/.gitignore b/igv-reports/tests/.gitignore new file mode 100644 index 0000000..ae835ac --- /dev/null +++ b/igv-reports/tests/.gitignore @@ -0,0 +1,11 @@ +# pytest + Python cache directories +__pycache__/ +.pytest_cache/ + +# Integration scratch outputs (per scenarios.sh trap cleanup, these only +# linger on test failure or when KEEP_REPORTS=1) +integration/*/reports/ +integration/*/samplesheet*.tsv +integration/*/sites*.bed +integration/*/anchors*.tsv +integration/*/logs/ diff --git a/igv-reports/tests/fixtures/README.md b/igv-reports/tests/fixtures/README.md new file mode 100644 index 0000000..1c0078b --- /dev/null +++ b/igv-reports/tests/fixtures/README.md @@ -0,0 +1,51 @@ +# tests/fixtures + +Committed test fixtures derived from publicly released bioinformatics data. +Used by the smoke + integration test layers; safe to redistribute. + +## tiny_colo829.hg38.bam + +A 457 KB BAM (+ 85 KB `.bai`) sliced from Oxford Nanopore Technologies' +publicly released COLO829BL (matched normal) ONT reference dataset. + +| Property | Value | +|---|---| +| **Source dataset** | ONT COLO829 / COLO829BL R10.4.1 5kHz sup basecalls | +| **ENA project** | PRJEB57425 | +| **Source flowcell** | PAU59807 (COLO829BL) | +| **Basecaller** | Dorado, model `dna_r10.4.1_e8.2_400bps_sup@v5.0.0`, `5mCG_5hmCG@latest,6mA@latest` | +| **Reference** | hg38 (`Homo_sapiens_assembly38.fasta`) | +| **Slice regions** | `chr2:25245000-25248000` (around DNMT3A), `chr7:148882000-148886000` (around EZH2) | +| **Subsample** | 20% reads, seed 42 (`samtools view --subsample 0.2 --subsample-seed 42`) | +| **Filtering** | `-F 1536` (drops PCR/optical dups + supplementary alignments — matches igv-reports' BamReader default) | +| **License** | The source data is openly released by ONT; this slice inherits that status. Slicing/subsampling is non-creative transformation. | + +## Anchor sanity counts (used by smoke + integration tests) + +| Region | `samtools view -c -F 1536` | +|---|---| +| `chr2:25246500-25246501` | **5** | +| `chr7:148884000-148884001` | **9** | + +These counts are the contract: any change to the fixture (regeneration with +different params, etc.) must preserve these exact integers, or update the +constants in `tests/smoke/test_slice_count.py` and the integration `scenarios.sh`. + +## Regenerate + +```bash +bash tests/fixtures/build_fixtures.sh +``` + +Requires `samtools` (via PATH or `$SAMTOOLS_SIF`) and a local copy of the ONT +COLO829 release pointed to by `$COLO829BL_BAM`. Public source: ENA project +PRJEB57425. + +## Why these regions + +The two sites are coding mutations in well-known cancer driver genes +(DNMT3A R882, EZH2 Y646) at coordinates the demos already use. Picking +real loci keeps the test data biologically interpretable and lets the same +fixture exercise both the parser layer (anchors named for real variants +read naturally) and the slice-decode layer (read counts you can sanity-check +in IGV against the source BAM if needed). diff --git a/igv-reports/tests/fixtures/build_fixtures.sh b/igv-reports/tests/fixtures/build_fixtures.sh new file mode 100755 index 0000000..54a7d89 --- /dev/null +++ b/igv-reports/tests/fixtures/build_fixtures.sh @@ -0,0 +1,67 @@ +#!/usr/bin/env bash +# build_fixtures.sh — regenerate tests/fixtures/tiny_colo829.hg38.bam from +# the publicly released ONT COLO829BL reads. +# +# The output BAM is committed to the repo (it's small public data — see +# fixtures/README.md). Regenerate only when you need to expand the slice +# regions, change subsample rate, or update for a new basecaller version. +# If the output counts change, also update tests/smoke/test_slice_count.py +# anchor constants and any integration scenarios.sh expected values. +set -euo pipefail + +FIX_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Resolve samtools. +if [[ -n "${SAMTOOLS_SIF:-}" && -f "${SAMTOOLS_SIF}" ]]; then + BINDS=() + if [[ -n "${IGV_REPORTS_BIND:-}" ]]; then + IFS=':' read -ra BP <<< "${IGV_REPORTS_BIND}" + for p in "${BP[@]}"; do [[ -d "$p" ]] && BINDS+=(--bind "$p"); done + fi + SAM=(apptainer exec --cleanenv "${BINDS[@]}" "${SAMTOOLS_SIF}" samtools) +elif command -v samtools >/dev/null 2>&1; then + SAM=(samtools) +else + echo "ERROR: no samtools available — install (pip/conda) or set SAMTOOLS_SIF" >&2 + exit 1 +fi + +# Source BAM — must be supplied via env. Public source: ENA project PRJEB57425 +# (ONT COLO829 release). +SRC="${COLO829BL_BAM:-}" +if [[ -z "${SRC}" || ! -f "${SRC}" ]]; then + echo "ERROR: source BAM not provided." >&2 + echo " Set COLO829BL_BAM=<path-to-COLO829BL-ONT-BAM> and re-run." >&2 + echo " Public source: ENA project PRJEB57425." >&2 + exit 1 +fi + +OUT="${FIX_DIR}/tiny_colo829.hg38.bam" + +echo "[build_fixtures] source: ${SRC}" +echo "[build_fixtures] output: ${OUT}" +echo "[build_fixtures] regions: chr2:25245000-25248000 (DNMT3A), chr7:148882000-148886000 (EZH2)" +echo "[build_fixtures] subsample: 0.2, seed 42" + +"${SAM[@]}" view -bh -F 1536 --subsample 0.2 --subsample-seed 42 \ + "${SRC}" \ + chr2:25245000-25248000 chr7:148882000-148886000 \ + -o "${OUT}" +"${SAM[@]}" index "${OUT}" + +echo "[build_fixtures] sizes:" +ls -lh "${OUT}" "${OUT}.bai" + +echo "[build_fixtures] anchor counts (must remain stable across regens):" +chr2_n=$("${SAM[@]}" view -c -F 1536 "${OUT}" chr2:25246500-25246501) +chr7_n=$("${SAM[@]}" view -c -F 1536 "${OUT}" chr7:148884000-148884001) +echo " chr2:25246500-25246501 = ${chr2_n}" +echo " chr7:148884000-148884001 = ${chr7_n}" + +if [[ "${chr2_n}" != "5" || "${chr7_n}" != "9" ]]; then + echo + echo "WARNING: anchor counts have changed from the committed fixture's contract" >&2 + echo " (chr2=5, chr7=9). Update tests/smoke/test_slice_count.py and any" >&2 + echo " integration scenarios.sh expected values, then commit both the new" >&2 + echo " BAM and the updated test constants together." >&2 +fi diff --git a/igv-reports/tests/fixtures/tiny_colo829.hg38.bam b/igv-reports/tests/fixtures/tiny_colo829.hg38.bam new file mode 100644 index 0000000000000000000000000000000000000000..beaeca8af2f2e9221321c4baa54930f61956afea GIT binary patch literal 466962 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𝔄d%(z#B1g09>%+r~>t;DX0vNOLtowc#hJqi_ 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%0D_ukpuE#JNV?oZa+ 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%0D>EDO?5Ywd}^*cYv9 zlj;OK(1}?|4bQ4so2XhTU0+?C?(IlvZhL$0@Z{|5{NnPeDv%hf%Ru5&RRTyb+E9wq zgLtSi+E3u-zP!4=zTDg1-rl}^c5^cxkI^dixos=An4v78>cwoLs-{M@loLJn3YLTG zs;m^e|FEf}LziMlaoJ^%26fYrveHD`B%o^3_@-VhF3(QSE^e-`&QG2liWtMe{@xxb zkJHQX^oDw&G0CK8w5)c*GD)CYR&3`}rLc}#)uzqXRrpiHHcitsmhhSrLqr5DzSvTW zl=<M#<MXv5(xDqxafyHm{}%->r?q0I+t^S-_0H54QdOK0Ivd|(98>O$GolI+Bsity zWevhRN~wUaPU3Yax8cnr=PR2dq$K6}Xebj))-pj7Z*gGAFG|*hN|oz!OYEC#%eAAe z2!$y~HCpz!vwdO(8XwHCo()b(LYdCsQc^Fl9KjS!#LE#~ZFYYkB1=z26Shadu;3Ah z7_ta!XB|VE%pfX_?GYJw3A#dX#J8OdL&CNrtMydZ$L<9a2nsoCIxI%WWlu(v?Vt@x zZH`Ter-I_MvUW@sLW~Qm+sC$-vV!v_nNF3{+4(tQCnuBZ$zrms>iJA6whbs4LXFng z3dOvDq8g?4)6>(%N@2K7j!OAXnKD`o27+a}P|nq>RcTzaTC6I^f!#EwY39c=pW4_# zi`{1(q%x~hPQGo?GkQuw`JB*y=21niJY-zL(6-41D;bTLP2cwnm=7ZBAcdSHyClS5 zDGGG~Kgx=EO({x}98W1R)Z*mk-bf0mGx(PjJ2dMc$^eP;l3hdtO=aserL$nPq{6Ir zAzI^f4jmw;%C~J2H!-0}99)k=C;7fEw??oLQkiKxYJb^SmX0G7LuSQwj0rnI+nfwi z;&_y?%c(4<i|R?KLfmOImr`acq=cj;VL1Akt@eiUvJFw(!oEYCpt?cs>+0<E_~hvL z_~hW=;MudQrczafc9?FIXXdmMMY2H|x2(s<HC`n4uowT%VIcz&-r@@NjE;94q@C2s zlI#*hIy(t_h($ySiqwq2YWN-mCoOgAkbRHbx0erl9RCKC(=t<?HK>$bToleDI1`M- zU>+xgawu6XYX)r(Pr)@?j_p>Id<1$!<o#6X;3PAtO}3M%%-3TDMs9w6aejG8?cnH8 z%Edd+t|w)Uc|=fN>P2i}%eV)PWPR=s?(97Uevw2~t;<10Ep^b$dL?EeCnZI<gi(rZ zOCAYTZ)!4GJPd-v<YJPtV-ToTS(J?vlvrX^IRa6lwpF2l8<9k?A+p?4v?&4w@F~hv zd>t6|1US6cXzh~kbc@Elv%RKVX>C6wYb-vo?`=f+f&{6L378XSLYsW*h9CzYzi!0a zAt}!ltYosu80zTSS|Pj<o#b9SuK~m9pkwX>PEgwij&SZ8HE>JmO`^%1QimhYNoO#8 z1Exl^&$RKlMV(XVal4jBC3#_}DcY#hAdl}1QMFQJj8}`rv!kQKql?Rni}7T!Sk=MW zY+Z};tdT5(mJF8ixvXkJYdNG4!qN>802f0>_m~r^0pdk4Dzn-Ti^#C@HN_J0KNj`h z6~M*Q<)Uf;G!)*VvZt(zIz&@fKn`T>i71XksOQN*lFk|QV|y7>T;EQ6Swk)>OSUh| z|72tJ;$B(HowCH`?>+lYjLES1T8R=->CZNbvqYMq!Rw*~5wrHG;jDHcSF1^}kQ9fU zC848qV~q)5`zl2qs6pCLWKK<EZSJk);tiW`2zMN_2Y#m0zBEhfh8p!gRTYPa94~tU zWZK`~-nki1C-Zq-8Tpv58ds|>;_;G(iemOCL7`|Ia6XN7%@W^&8`N0cr#eb2^=gt% z#FmD_H<q;HZ9O$S9|?3r7g4TCQr9IcBw3DHd}r%yo6;d9J(-;yA0LaX`mimZB2|$; z;-@1{ZL;o3I#t#1*d(0D=LH~p6qd!fgPAfx)U&uJrE(jllgah9(m|V|tgXy@1ZHG9 z<_@<Z5HZ;yyOCqxu|`B_DoRK=U)1{t^&s@qkx@hOGI~MJAl9v{Zj@8DrSflGjLpr> z$@bRH7InV$b^f`1dUSMpbv?eCFN=z*LNXpeTaP9%ey)T~xG}X7At;T`a7YH*;bUj4 zDQk_Cl^>MyBtb=?PJzO)9f1vDi4;kVv$52wS}Z3QC*o~V%m+q>7Mv<eOZ^8ItXeD= zrHHH|uS`udH&s>57OQ31;1*Vh@~#@&6lFE%1n~wftt?_f8nBkC7YujbM(>qJ`h4Xn z1`-Y^-H>6lK?Jl~Z!UFXU1-Wm;UWwO32R$PUf?VaNx+uvF$5ZNYH`qo4q+nE(^3oX zRs-<&{Ot7f`1ojVZ|{IaLrmI7t7Iojbr4)CMP@@WI5{8twoO*_=*XC0kl8=nUN90H z>JXCFVre2GRwNcHR)p{EaI{O(Fm$-A!DUVO8l5w_8Be8_yuhcgQI1|LKomC@XoOvY zyPaKKqnSHzYL{H++Du9td$U+p)x4}^Wn01M3^GoGQ2C(YEQMTxSJ7AlS>goSfJC^# zS3l%u0tD*%dQs`#44E!mE6ew?aXS;7?1AJ4A-9gqxdmL?84xkdt}`uh!cYpuvbQYl z9IX^OBFH^KOGV%ot0XG#y7QfUB|tks5|*q5NoM4-J0J|)FGChY1Y3l*Vw=2eak(w2 zQloWodUSMlczASld^24v5LKGbD&R$>V{J&8A*3OzNbRzBs+<&78}uY+h;!>oh1O8Q z!te8nTaJmLlHeq$Mj0I~;Xc)NP7h1=k#F`r9$=$PqXGyU=L8CbgA+^#z_s<p;`2sr zB?VslU|0_pW0=?uh+YCTVtqG7F|SK+t)I_k<H-f^+xcQincJ8YwI<QwaUHuLr52f~ zL6uHYMs2cM`A#;AK^QRx?Se9FWu*zotJR`O_(y8Ku#vz`P$XHb6T=<?!riU+MNzMC zdOPtBdx?|Up}N!=M}dVSzmb!Wc?UDPl%#8P$$9~<N_o|?gqPP>SNjK(s4Pf>xgwTf z-6Te>LQXsNQDEO3-*TdpyKjjAK)8kMng(ARb@s3-EZOdrc-BLLg4hJD(TvXywyigm z5lELs-vWQ)0BmuHf{zqCTPkPFsRUfOE*c{QTo0UWc06DhHiEnbx5_j|*-ndxMsmWN zV2ndZ&>9=O6J#AZBrT=&)LF54psc*b!&e?O{&KY%pB*0^9wJzJ#No79E|$%5sTPY` zQJYvb<@Dn0+0ohgxKdoWQo5>CQ#P%oWJ1mrpe44ywy8JKTh&QL*G27(X<F+%I%Qqp zMv<5=dnxOxnwpUn$Tm92PD{QTwe+gs2Yt!O^x(kds2jAMRXqnLQL9?%-g4%bC`WtC z^LVeVGp!-FXd8gbw$3Xs;Kls<{CMy5W`bI#4uds)0!i7$%2c#bQ;xGbYS$S@<^_!O zbUdDnqZ)wPeWI{0CI6gSAOkvE32iy-itHj;`&@?{%m59rU9>83ir~0VB8(_ShQW(V zp0f$0W03e07t2xkHct+O^TE5^$=>lY`2w(xVo1qf!~s6u3Lq>>bV4C-1qzqcmz_+; zXo{a*(6TY1@uO(wf^0mS%!{H5I?K^PPPx^sCO$=Kx{Wq-druJ>|Hs2kPrh401>Xau z@Snyp0aWe>p+qB966Z;02EoH+#wY^s@+k85#=6c}-IUx>ZhakR)7jj(*aR{yR7ya* zC=|_S)A<rB2*?w+!l;Y$^OIwAo6qD)ZpL*3W*!+^<)R84LQaS5lqyg7QFTq25=<}l zdw?|BC_9g$2*-_mdOfkzY%hSymQDfDsU-Sf;#13TXV<3I^!$xPd}@h@Vv>*Zor31< z_%pyTKLy@^VnO6_Yz3mQ+ycICJ<l7cAi5qLZy-TO+1Yd5+{Oq@lXyxiox0c!2QJI1 z<~S#u0#=($=<s53vqciOteZ+XlO>I7lyS|?`T6-d30m#5GlA?F(XH=$sh?Y8`%XGF zhPZcF;8ekku?h$jRWKhyuR|mU0|>yGVTmf595g^~a5IfoMo}J1pw^ZpMJ4=IX9arT zTfij2H2~zhrzDq0ypsO}DHD6qU>&42b>}l@a2lY8po^*MQq&5D{smLu@?9M6Zf}b+ z`OWI)?DX&ui<4094#A>tj$UG+>6uzyEsMs)zE~}0i>9fqiCU~}WcrQQad4a1Xs)C+ zjs+<-TG2iYAO&QUT8SyJULyM`iL)Mu1pllxt?NzZVVrR!WSz}4J)p$BD$2Ui+KH*A z0_%GY4@2@HDOBsF?3227$RE<u(B?i2tqJTdqHpXam6;%rKJfi1$#CLcNst!h->t?z z=eAY!GF#EKZGW|aNx7o$KK#`r5-xNgNx{T(Jc}R1B9Af?!y+UBk2}l?4Ysa1l`P`O z;9%mAee-0goHObgFeBd)Q@}MHqF1~wkd2b`@RTud>AM`o<;_h`ftB(T7)kHwEKpLe zw4M#)9cB(tRVNkC5Wq(#)2tf9d6S&Z&Lqkfmc?dhr7?7<Nd?n1#j;q<XV+)PH1=%n zY;A3C@6HzV(OnQu6eVqMi^a_)FP&drTwX55;}X1qZVQ?ii*YujNF2(?WnCK+oi{qs z+!1?lp*828b0tlC&uY_xKT~wZRg%WXY1U>s9Z!}-dmwBay$H%!8V_n!%*Qu-d%N2L z!`!5NzbhfqbZFr#Yt<N6l%8X%Zz))N&&sqZ*rxRkAXC>^6SP`2D^Atfd_EcP@9l2y zZV4P<YyTPfh%;$bxGJ>iS{s|O26bY!1q)=Im;9#pZ7{79H{Cj8toF(%GDak*gXZx_ zFFJ|rT-&QQ1V`yr8*_7YeWL^gZpAuy0GBPd7pTw;ew1;;nl<9a=pl6!26g6Ef~3BU zwjE5Z`1PQ>v7Rxjre(cRyfj!xDh)j@v@=wiN#sU3>q&14BuFZD<YyaAuE2egQ_exO zz(EQIPC)HSrxCnvj0GU7f@x|L$CuNKlcR&fz3r{7?VX+7tznWtSZr_aP4FTnn)5`e zNO?eX#|Fz!Gh8?9Q1V(12b@+!7o||j_O!WMUSC~boE#kN?Cu^Oo&o>|w{4_4#I7Li zHdM@-rY>iLM*Y=wjZX&XpEyvOL`<D+h=Td{oMSEl<V@DYtQWJI0vz+r&_@?2RRqzF z=A;rGWJ(+se~)s^s<=KlsEPvbuBsfxLDe+ViwSX_BLX&6U6k6_^pzRuM4_LeBk9CI zheEqHYu_lXTu1K^<wXzT3%~&J2(uSM*3KH+0W(DH-?vS(IzOS~cD549b8U<XmS#zL z{Aodn7FX9~)eP+_F873wxSM=!><wVqnB+ShbD@Fm^g}+qoGYtUvvkAch<2f&n9TP` zxD$*~&JXFFJmif`E@n5?)%@vHl>iJ;b<T4jSa?!$bW875mY}eWDVFpnxR_E958SHS zDhk_jg8JME!j_y-9uj{ojUTx$B5@H`Cki47?*rJ3(;=le9ONKZ+sNX@Ex=w!0T#LJ z>uOPyI)CzpO`~Q4Ln8*2C~L?KlXVZwrkwY&S1JYHFfSC6Wc1olEmxEY_d%Y7B%Q0n zxDhd>p1TQrU1vH0Mx{Y+TXwXU+Dtp>b92TJBlXmAP3}8da%m)*k57+|jz|_9p{7rZ z`gGdaP!;1t`mUribhW}K!U<_YmFqGqBTZsn3S*o|<kGQ|q05s}t;XYV?|c`$%xK@o z)OI{-XUr138a`E)&<sx)6n_`_6OxkNh9KC8XdD+K@z^XEa}$6!dKXm=zBAENrgOHM zEUMY8C^Y#ZDS!y3rh6(QfhX%-7o7nVNkP=wEDZ`NN;u^4_Uho;==i*8ZFIRd+=rvP zFAmr+DY7<A4A#_j-AQV-H)^#!-rYMnJ2{=Dmi}ZGr9>i$5X_JzMO@sOq$ySz*HJ+7 zOb6ynJcXg>E$CdWo|^Xy(U@LTHDJ{FY)XUql7Cd1qf?svc?2xzk~DWA&EF+xo?>_- zKAFG+hxZ9ypav{llm$-GkN}jnc&<kZP1@J%a#fU0FPHP_Y(AT>iWRH?&=QnYB?w-c z@8=~0Q=yo>0Pf^;S(GF|izOZJlNp=_MJac;<nzUHxspc3Iah>LVL1k1cv+&{U2w}q zS(U4s^V5U9y}h03^y*4T7na)8H1{u7O<fGM0wuN1=~OTy%jpe2cr-V&#n6I3<O8`z zv07Cqc~d_V>;}UGIYU{NE9t#oO56TiuCFa4E4&OvRjx=|EGwdEtMtG+uo}jz*1oF* ze^XSe6@3?)xh;7IW5h6V1I3UPs%xdAWBeN<zyxM_Su`&AAYl6hpxBT^svF9Zy5SJi z^qa6YVoJ4OaD1Y2Q_QBvdsS8E1PZv(APs=E7t9ic9_OM0e-}dE27r^Db%A~|yaDM_ zBsOKEBro+s%-#@$24b^Lyz!nw3;rTS3?)!3tLT5Ar(8Khe#_?QrRQ(8I4)|PeFruL z_zWeglHpnvwP4b6@U@Wy3uZ~Oft;qmaR3^SVgVtm8~GCl2%%;qT;vd~s=8K!-|x83 zUXXs#D5*0Tvyzpz>}eD5t|OvJ(x1~4@3me|>=39J2~f#(uCoI0nT!|n+1V+%@tvLh zy}f705Pw`=k1xm5MWx(RgIp+-G-tG_mvgp{QU$UE7t(Mpja>nmdpUyyY(ala`-DA` z95kt033Z5CdpRb^P5>L?bO&JO1&E*;$JppJE6fB|0=Da_o<r|2z*hq|?_=*0KsEr& zv{7j*5Z%@p@hRx|3LO~V{K+Ck#)o4E582t=MeeA#Ha>L?3*w7}NPLQ}J3I)Vyzir_ zWogfs#ggNoG6Kz&<UHP&1jQ8bR0E_4uqb68Y01i=ar*Mo>IBHclF<y#$Lv#Y844n@ zA^Hk7SRG6+1DG8~HhbF+slTBc&C9(3$N($>#w}<ps8z%3oT^fFrI1B5D^}M@Ygv?n zV%5~sMP+*T^vIG<Xj|{3q(SMM_PyapM$1ZzFB`=<0NRE?6+7+PA=gH;1803?Uw9|3 zH_fO|*&HuhI7Y&Ig7S6%bvbEt&_&^Ny_#IF${0Ugl~hT>gTkBl5(s9R8M0?B_XDO( zrvbiBD#*5+J*5F<pRA$jPMNx{6#W#YRqV)Gu;5g<c`Td()-f<+Nqd14hyy-1WYhIo z(_oZkyp!w&wxBE(@wEW0bluZzL^`@-^wffY1@I}rRGBU)CHx$Udai02UYl|si~<TK z84G250iV+*OB+ziZHN+bJ86Lo-cxDuZElpR=gV5rwCSBu*nnDEr~#J?ikN<X)hb1u z(qyG-n#wdy6`B$s&Oqp$KqI{gdca$=&~O;7z;QEaS8AzIP#j$z{7sPahC&d>y7Nkt zs;#jw6%7`2OGPPxml#@w7hl$b!t|zTjIAmRK_%=j)V{DBny#vbzHS;lO2wed`@p+# z^PrzNIeE1na0wV!EH201N(^&j3SBq6qbe#w*Ho`c#%eI!oFHXUN&A)o&}+1<E3x;h zV}3Ztt7-wS&$1}X#RUd>Je|!B_?gaUK;q^~l4FY9&x0)0a=9R5JRnq-gG*8rtEQ<m zIp={?h@>-r(O?zJ)dE*z0{-Rd=H_NrHsVyw$(}a4;(d)6(n=72JRG(ZzlZ!aY!#J! zQB{<6%@r6e`HBf);ao;YEH5eas%`>pq5!LDT@w&hS;9+G&KG4}!J;!8OICtU)^)|3 zRn<&y$b+()v`~yJVNjxI3sC{_%xp{>-MA=LT#S}A0CH5D4Z)RGs#jFMXs1%y+C<BT z5H(OcaS8xD#qO95e`zqD+JIO$UbAhL*O*4vkS=mAak}?xQrB1pz4FFzvRV4r1T0ZE zvb+t*D{_`mV|OvK${4Tda?^k*G$jqv3_ML;$HsUu5md?8|1khtuZ{2|5b+uAu4NXh zFoZxZgUs=?gzz!iw8%0^-Lk+_8VaWxU}zGKAHfVkx`TtmPB#!_INvb5^NM}aG!4n> zs%&HeDG9R}%Ekt-6SOFr!Ka`M?vU+J6yjvjfJh8xaVQ+6b!90dn39^6C9P148>p1m z;t}#-F(j#ZNWW?B6>E(Rr?S(nPu@_Z=C{Ba!@`>g>VrlNEqg(cu>g(d2q;!nGpwOu zpVKm9ZMj-4RyEOiIi5q4<xHtmZemv1scJf%wZU@xO0!I(D$1%Ta%!-p&N-M(LZU~m z<pGsy@OO%)6n|JHZ;8}BRRFj^N52}coK=xjp0x^66{E@CfM6m`EFQE1h;D4Hnz~$0 zS4*eZM4UDtg=jZax(Sfau&czO#rv<sp)bmkm86@hR#uUs1l6Qe0OqJP)GyLrPv(6H zLkZ@I1&ON%$OW)-lD%GxYl2>)*3{*!O(f|ASCTrh&Gd;%MhttNG|1!BXVdh|tfYpe z9en5licku)gFzos?O0E-YpIo1RBTHx=yx~pcev2C5jZN&nQ#JRalu096PFMiJhqzN zR;5*JF`pr)Fp$Fx<r|xa<T3qyMm)PN8#<ZrmMttU(R8Zmh7J|so1oKMdEe20HFWk? z;@^Ze;Cppm()6^twN-Sz<Ia<~F#|(H?=2fu*qz#xeW5vkjH!s5W+4mESD74)PL#Yt zaGu>&H~5TFh8s^7%jI-Y&M8Kp-_Yr0Rd8A5x@@XOWw4YK9bod&6$eAlQj6dN$~jgK zGPJ|GAz&WhP1XU~(8@qP6J$S9tZ_XyHDs+qV1xU5RW256pX@yqtN^e<ye5YUc8PUE zJ8}rlR@s;ugP-cA5&zK8?Cc?$B81YKSCXNAE)j^<ksTlh1v!k4&L#of4FHMO3%ZI^ zmQ0^+tZD!-rI@0WxurB^@u&STVNY>=-`6xHj3)bJLyVW!lczKDhQNl5$c|f#4x4 z*LfaLszP8Z0|};J8(qtBD~3qbxoKSrq3Z-Uk(n@nvMHsIJ4fc1<;f>Ppk=ftzt+l| zd#NXy>?F{#uu{+xNruZ$XZr^-k`sQ&+!`9tz4y4hK1m5ooLzh^W62Vcj81LnLr+~U zkm<5Q=K;u5a|U?@1%{Tk3lgg~H&~QrIa`d!SU8x$j5L$e8%~-CWTf|HRcWRw=-%Qq zO{dG%Y`!3>SS**+Iq1#yUGlDN;mVPU@Dm+O0==LC=)(gimB3bLA_j;>bkYY4(woze z$I7%!ayS|=%TDHy#%mQ!=Yv<l^#=Sp=ccea@}q_SiQ=f1;+jn@xP1CXNYT>gl%ldN z72!Y|u;rba3OBfjf^@X4f%lHDt}d<@v+L`HWK)O0*NSOpTXaCU2sv8%z@^hrc+;YZ zCb3|&&K{R=1tOqQaCcSZ3jQ=5d2Sn1G)i_u$n4b!20hxS0zGSs`Q+kid?UnC7nkFb z=GxrURZ~*P*V>8IU6uiKr<d(PTcXhs1L{LIz#G}hPFK|ufPfQ2X?PAw0>A+bwYq53 z;R+@M=^&HBE8&3~_-48R>|;5usQi(zXkmd6-$l{xM(;<Y>&8n5OHaE~_FZz_fb}MA z+tO_To;HTIORlF`M7CnI6qKEzb2JcRX<|Rxgrc+;au=yjAkkbJ3h=ogJ;sL#sW_-w z@QBhvMq<U<CVN~>RTN73qA{H@p|!1$NKhliScN2gMao+;3$}^eeg~}DbqW6_i_NB% zSQREJwlUp-UV8V56m4v^_Ei%NED`j~5j#lAYrb5LuW8`iIXF2xySSXrmQ_O%M$5A# z*II=uL+7~H5TTLctX2!sV5|A*>9S%?Hd=?y3bAD=9jtXzfyV-bTb7biSQ5f4X3OQ- z0sMQ<_V@O;x3~9?kB<+9kMCwelp!S-$r)BfNjmTNXnSjWYinnB_jp;=rl}k0)HE;= z>IP?;WM(IjUTT$%na>u%iz{v#hrRDwLk_4WRFeiEZOHZDRbO6T-CQfn_LML{xG1!1 zD_OM!dQ_luj!JxQ>m#t7ve6)3NKe#OJSw5itYZqcPB|Bg>2x+P%VKtMbaZrbI_Aq3 zl5k~#8@8}evKCdnTrTHxpgWYomz8R)c)#@ux=)Z>q+zGi>0~mQEf&RM2KB3CR%;@X zlJ<nAq0tCf)S{Rz#t?8$SCW1u>B^^PGrp>-i`mW17+fwf%xoYy<<S+vW<}KDjMXI< znF-D7d_Gr3m|zx*`H<5si1wPsyK*`F@N{$7&gc{$GM&@ue7>qnGQ~^}{DT^Br@U3_ zJd1Kko_@KkG^r9O)d(_6x*aEU18_xF(zwJkmkeMH_;WU!<0_KjT+XK#07)*%E-#mh zRVm47m|n({%S%{L*?<fz7z47di&e3J2j=ExDkD-bv{Nw*!mGMmEoC4qeS##i8P)l6 z%7>SNYMGHno=^A=2vuh@kV>jqE*BieQ?4bMVe+npo~|IEQ%aoT=~Rd)Z*FcTO|4Bi zC*3={yc~0Hu;?<0!lW}ync%Qxv}Tfno=E<DQ7(yXaixh!s$zIR()zN(BsyLdtGX=8 zYBdndo}ZqcAZBo~zqj?bzxwiKG#Y*WcfL6L&wlf}Kl$p*f3&eV`u(rId|V%me*6bt zZj45wAN|cQ|Mvc9^wsZwmb-ihLstLdP5=0f{^1*Ux9R!Ao$tDDblvFpe)8r2{bDrw z;wPW|#>?NjfAQEo|G`gx_|;cG`20ux^Dl0n|L6z#{{Bb5^Tqw$4_-X<>8F3|^ZU_P zKmOw5|C0ZwuRj0c5B}fvzx37L{p_bd9DV)=Uyeqj(Qm%~?9=<Z-|6n}AM+Q#`*8o* zKYr1@c>Mf#p5Jvpe13oT#lzjh-48zh$q#?<dwrMgQvZYBeN6cWcU|{8KmF<lU;Uk* ze&_GrrQ6hvzW>+0{7-*-H2VJcKYQi>=C{M`^KcjPUFaXeJ^${)ZMY46AMW{kxDWik z@8JvJR~@d26c72+4{v_@TYh@23lCqv^67WH{^IGA58?UKZ*q8)-`suuJ$)DM<wE_} zU-di;m%fwB^Ty}lUjEKMyKontbN9XcWw`3?)3@^)|LniM>pS_~@VEZy-JkBe|N0qt z->28U{?mW`AfMiN$Cu<kcje*x9-iLPhhN>*pMS@%zUJ=hYur9PO8#>f_%}!ISC{`Z zuD`nO^RM6WtJiw@hWoFte)sg*{_7{s^549E|MbaWbY94RW%=E$j9?DWpT;eR7vVu( zzh^|4!27Q!l7HXJuRh(@aH-o*lYbxj7c3`PQ+J`~7g;{Qy~s7XaC<Kwy&cAu@3?)y zNw|HKr?`8%@O>8^!z16@^QjzepYDk(-G|#3;gMYbJzw$o>DlkX3wanm@FLtj4-b!g zGRp#bkokHH{e8H5;L|U-u@`}FdXSqKX6kXc&wJj=4e?NY$3O2oZs6`A^p7Dw=atNG z^^fwXEZpa}Pg8Ukp7-3^uqn8~7tgtJ&+W;Fx?$0A%YDZSce1bU<u|wT{ddC>?1%N= z4e#roru~-teV%0*-rqm1>PMNN7c#52;ep|JK5WNf`kw!}>5~<IJKTs&!o6JR?!|CG z-0_8(GlT2MAtLuG)FN_UGIHJ1{N8b;`%e?m$?|>-eRm)3ZkdTbe|_m;R2b;~#iza3 z4}0WRmhT<Y+dr_^y72rtH+K8Lf8TbYzyIbd|Kq<n*#6>R`-_9^FAlbUyAHO|_y67R zzWQu)G}>5OUmtC5tgnsM*Vfk-n;Y8)C+8<OfBlDd<Ndv@-Dk&(%Q4hL&mWt=@$0YO ze)b<c+uYn*-`w1Lc5}SBxx2gL>S|+i`{v|mXJ>13dvB8$Z#LF9t`81(x3<>T_qO*A zb}vpZj?cbR%ob+{=ch+|r)P`B;mP^=9t`p42hWZUj}DHGZf*`www|5OiqB8?_Gq>{ zIP&$hy*@j>Y|dvJr?209{%iW*`PMi8!|%QP_Vbg|tLeqFjosblcV3qBW>&=Vvll=9 z)_+pF`u2PJ+2#4a_r3q<{<PfL+Buk9UtLx8_|0#B@mqR1FAk2cE+*sill9}nqn)kw zwGEJ?o6ml8eQRrTcXzaQv$MIqv%ayhHX5ysw$~0uqm8Zg`SJSt=Gyu?gEU%O8}Vnf zu~Dz_uC2}O^~2G=ygV9ht#53dZ>^2iN9!AVYa1J<qtU}?d-HIAwE1jnduRP(bLU5E z>uc*9TWfctjnVGf-emV|=U|N)INTX+uB{)e?H%r|t&O%fxmLH%U0$DzH`X`ScE+Qv zdSiV(jLOmW+F#l^U*DK+Y;OOLo7-#u{oh*K-1#rhk9JPh*GKEy8@roZqtV)A>va9u z`qBFOZ)}b>o^9@*tZ!Y<Hbxs8qs_I&=Gx)L#>VdU-r8t=b94W2eO)~}ST~#NqxJRu zowc>a+GK5QePjJ%V|{&XYkg;PePeBHe{Xw#eSc$XW4^n2aM3zjSKq2<$ET;W)iT}} z<}O@3-21=!TYvqtzw&CecU|ml?O$rA&kv`kN6S_nou3E2x;fuFzG|Kw?cJPQZf|T= zXU*y1!QNJNHJ?x0q{nLYoxk$yf3^9wYI>#B<BO|hxf-8emg@R)e7V$%W%%xQtGj1a zeD!O$dUAcVceG#69>1MlTBpnB#qI9o)ps8r&3C@>ynFk-U;pl;bdP4Xdv-p5c<z0^ z%ir=|ee+xD#kbwdm&<AUmw)TGzY&i0`PIqTuay1vH<vH|{Wrf6V`axxK^=IucX@Sv ze6+uNw70W!aCG>ezdyJ<-TSkTAB)4C!=Jr-_wK{Tj~_n%{KLQc`0?E@-v9sq;{E$y zet7@>{fGA-K7RP{kv|{bz5Dwgc-Jp}`SbUG{P9oZ<&PhK@&4T}E`I*u<NJ^A-~H)_ zckll2<H!H`<IjKjM}P8h`}`N%KYRbr4u1CEet7@k{m%A>|Mla$kAL>zPyg}ZAMXFF z^$#E4uOI(xeP?aw*@r(pz2M?o8y`Px{qI|cTkk)d{cr!|-TQYR_WsG*FLrj<-~XSZ z|L5b+Km6op|NQ;CfB62FKi~W1&o_?#s}I{pU;Xnx`q}dR`}Ozx+kf`UUwr)d;qDiI z`2JtM|D*Ts|GQtVZ=dc@R~x_hr~h#0<GXhsfBE4b{PM#e@4b7sxBsUfKEB`Id-lic z@BgoV`S;&1cHe(||Nc*&efaPXKK$bkAGY4T|7Y9px7K&J_x{@Vzx*#oqtTDQ`to1= zz0v69-}v(X_<N(#Pkthi=;y!t#ee-j{5RkH{hz-4jUWB^%m43iH2SLl@;l!fjlRlX zwxiML`+xbf$L{&tH*apAzj*s9_qT6f=C`k2_OJT>@$IYou77iv``7)ehu8Nn-oAPB zDnGt`b(im6-9Ef{o!`F7_YZI1ym|A`<+rc9SN)sr)!qH87xxcuU-fq{y0@=h_4)0q zhwk~SyDq<d*}b{tTKUDp+n4#p?d$%re|`Vr{_UIBw+|0*Up{~SCO^-w?(QC6-@Sc# z`}pEz_xkQl_p*C^`}TFd@7})Z`-iu0^6lN*SI-~%H~FD^lb?65^V>IXUcPzL-{-fl z`tISy+t)8&=ZCx3cMmV#zI^$ZU*Fz7ynXfZO@7tA?E8m@x33=ZJ&$~s-@eQ*?;pFj zuiw0UargN4)tkqB`?9}%c=_V)O@8cO-97Yg_?p-E_jhl((B18;7yaw!cekV8`;Wi; z>G^2%uL0Zk_s7%L001A02m}BC000301^_}s0ss+ybehYqZ@E#%ckU#hq{}j)5`hw1 z3&|2{)a0V1r3_-@fd>pCo*<C!j2SRu)MZ)7!+wN3LJyb|<{;$>AdiqYfM0p7efqRQ z{%4>4zj=Atb@{%p%KJb5`{m`!FE20QKmX^C{_-c^e)+eTcV7PeUteDS_j$bV`0&Rc zzW<94zV{FB{^JjS_{(>H@ZN{Nc=yNO|Ne*Xe(=Hf-}~_WAN=?izx?3GFaONI-+le% zMR@+%7nqRe-@H7}Ke?Y@KL7I4{Cfs{kLQoxzd!%!SMKY+`;7nX`}g~ge)RH^c>eX@ z-JgFF@8^%g{r$(^yytuGZ|~3l>Fdw9uf4ovo`3b#`~7?T{~I5l?)M*m?!NxLFWv8d z_l*1L%e}6b=kxD=?tcFDbKiHqdSCbJazB6a&U4?--|Kwu+xPpQ{mcFRJ3o5v|Ltc# zUwfYW{ruZ;um7jty5Ilmzn=Si`=0OP{EYwR{rS(o`0QKn{k`+p>*Fs!<G=FQ`@7G6 zzx0gz#=S51hrfS$*6-K9{rvGao_+t-W1nZfPagk#^2KL;&*vZi`7{0tpW4~y|Kv;0 z{{HN-*XN#b&-!1!c#r$dbKUR$^nU--&p-D5&NKe~`}2?9eb)0AFE4-Z@4xlj?^(xh z^@+Rj-0!dN=b!({v#&2a*MH}+XSnV4qE9?AU-jode%>>F<+;j`UauThyVk1l%I(Ud zls)F2ZAnU3Yo(+v{Tidi7FzG&>M`hb^`5WVxZ<jO!WXexU#-`0wM#lLE@|y*y_DzE zcBMLI<|_vK@2g+AORI4&$#EwMv-dUR8e4qga_yNf9<^PuaUtt0*+yUa>eVM<89Dbj zt~O&COxMP4zQ8sa@7ET#)I%Ot!ak3ZR}4L}!MVnosh1vCQl`>!g&D3CN^WIdeW!To zoZ3oiC126nsyoD{t)(28zX;Rm-q9*Hn7hx|)+m=SI_%PyW(-s=u1+%A>T0Q9E9T&q z4s0l|z0?+-Xe;lY$7aWTU3%Edw;Rh!qiwx%i4w}FShl9kXx*viGE*6I#9gF?G13?& zGWXULwYIQ!DvK4ACUGqsv{#C);iefH&YwA^vN2_@?u<HB*h8(e)~tCoQ+!b+dr$;s zwj`p~7`n#s-m;NXv*Ho3V&hWfJIN;^&f48|nmoo*$uX~fg&40GW|~v(hb}E^7++zT zoI;MVs?}b1X`4kS?w)P8oz`l?oEGESx$4ID!MYAD+PjH{v`1PdrPiHQS0t#cbP0>w z^cjj)Y~n*@E~#RBn=+4Bu$Fl7`micj9VKDiD?cGJddf;DOtunp_K+Y%_-xMdR*3YP zLmaJmjD%c0M)nx5K{9sAIH{$sea_0Im2|7~%GaDd&y1r=KVgRHQfW+>BXdkmb?J^d znGz$d>})ban%tjtn(a~*6ASy3Xgo;mSVXGf6-hBE=F6#?#DvKwcU9bDf$fM4(TEEY zUer+u4NO8J%GStEcGx-2P&Mdey9Afuhq<Qp9Fp$fn-p@G*F<TmvW0xpTx6_blb|V; z_h}F@N+cPhiA3e9+NDnJgvV<M$)t%UX}*OpR|?wK5<PC+&FY13h;HJHe=J1F;2gt_ zYs^4`5UkM(xe;gW3v`*JiN_r?#S}xfIW0wDp}xmOUf@`UTed|o=am5n%rFQ*7QZ6+ zr#WGrj7Mx~N<_dq!5kC8yzWW2-O(JEu8M^f+pQK-T(~6G^IZrdNR)zAW5TRC;cI4C z)^`unh+m1Z#L@A!o5_s;+HPJ6x7He)u`-EW8v)5$2GOwVPFh#Mt7#j%1Q6Ua(X`_W z>7B)p0)`g_WFbp*bb@y&Xa(pIOoPc22@X=Q+Rn0ssaN4AB-Tt0O{T!*<Y&c6l`Rsb zg~egvX)D;Cg2j1wT8%Mei46&uqRH?_^;KI*pnr*MhQ*Ny1-l4)Rt3pdBu`T;n^jJH zULm7J1SE#&?gUQ6b9G5zV-5v5^T~00&(;R8Og6Mdn8v<|x88;H<%&8Qac=l_#!L>B znKvkucPfmP>~EPyM9DwnTNZ8@Busz?04P=pJHRt$xdtV?NFS_99J?0@7hN4Haa#3s zNDZhdz!L*MgST*K<PzwB@B%`BZ!ofz+JvQ7mZAk@XX-3OcJ7lT$o61uIaoXV`ituU z2*=vtSX);Q$ydx|y($xsVI+JGyKf;Gn3+K6gbLQjr@O|=WIYl$fM$(hv6dDiae}L$ zo`S0?Q4}xuNC%|ZLac0-%UOf)8Az(W1~!r^NEJ)ogN4{INYR{*2pm9t?>YddRv|rZ z2m<g_7{1nq*kBxCCmCe{1k~CCxl~6UV1}GkkhYbn0T{>05uIL0-x_f)hSsw=Gfzv| zKr74PQ>Tzf^eiyMqdE<!$3J3Db^=jC@;DIQSq<lwMrzjpdOPwTLL>s4j>{<+js*T3 zg|X?VEF7@{)9-!NfXl1Yk;sQCA!BmTYcMk(h&B>!ckmvIoF9L+D-Y6;;9Biaja`mN zaN?nwTwoo-n5?--g*=%n*AcJ75~H~o(YB8mSs<T{NO1K{7C{C1jUrj#GK!@9e~Lsh z8_L|CC4vMbndQJGLs<dNBy!PBWnp_D7%r}5m1%BSE+S9~fV#kYvS$Xx*=UGSS*SbL z$SlNWTNb1(00S!ln96s7?a3fqlWp!>$PN~UOk|AH_!OoE6`=`$A18v_d>B0I3~m*3 zKFgceTKICZiN)x^OCYB*1@^>}4#*vz3S>B3K&mon_ACVP;X<~6{RvU042Nh80HyY` zXm$e&;CI(R8Wu9hqZ1IXlN4$IqT8~J=)VTR-2uy#g&EU~@Je+8tpSS5q4wR1AYK6z zL?D?<7FC`N{acs_8gGc)x>25tA$yG=h%5~dOpCCbk4lk&f5(w?;cYp`t{1<!53vnb zx}JMDutQg<hG`fN*mXI_Y8SFCt;2w1ZMousn1Gyv0mZKb6Mz_Ug_uFk!D^+PDS--T zmAHJwT;I-iFiuTu3{8I#%ZsEmP51<wS2Wi^^mE;S02Qxn2#YX^(?OrXLCl4L5(B== z3J)T9gKrK;!c)@*`a?-JhDU^5!%YbXOLE;;nUXMwL>FG_(3U40-mQ_5k>G&)oQpCW z<6~sNwO!E=;$sj<E8sl!qz&3!>;PLALDGD`OiaWRT)nYAymQtR3eG31$-$G`P?VP$ zf#^aIyp|aW6W@tV4)Q}uL1OPW8j`&|X}ORhA@RF8){LjlSVuzYgB3_fVunOR6o3ua zL5KNhNWC>A=s+oiI<w{>Lw*c)P+j{01_@n^m&j`8Zj6Wza9b?^f)Nj3H$xVeLI%<8 zkN+p{kQBJOj}%zoEQYrAimU<^l^i1;0*W<m#~<_?wi8ep3A+esf(6nu?t|e3HN`41 zSMJ>7E>1$6`?WX`YK`U5+#;wl00occd7>G!Uw1U?9nI?$Cj_QT%}<LHIni9oQ=G(` zFmb0|3kx}AD(*}@fCL5UFRya$tc{2=7>C%>#QzJu4Gy7A)ITaH1p%KZ`UVw<c#3)D zLP>j3HUk&xmVxRufCR<UA~4WWWdaOE1`&mBBZV|cBK*~BCGU-|p<MPSu8@e`ky#3Y zpAqPJqJiXbx=aMAF&CoG;oDP&@J7vxS3le;s;g1!=CCao`Uth<Xru5V8f}f>T7kUX zix979buT$F8dKvpq)-&fO==E!n?wNv5=xyamU$3Mh0G1C<RtTEDUH=Lfs!IE<LgfP zBTN)lB&wY%s%kcuugU!bDFhtp%Vu1uu7RnSSS#!C5oobuUNAx-MtXrF4uaZ=?)Lj2 zXkPVIFC)hR!9-x_2^&!KEED^C*hDh3^g)T_6$*9GwLaBZRM8Y(N1e7iYzPDK%{~Pz zGHNc~QAP!nMe?#9ySm$4=bi_1f%(RKpcZ+i^V-6f0Z$W5DE3mZ5=uDX4KH#i-!Ywk zisKCeF~*1By9QTCrHm>=v<~Xjxf_yqVYtFK7zGDXwn5ZGkXXPe&a>=~6V_%RG2uzX zc;`jwo474-mLAqiP!pkL{P%dqSKB49OBP!hs&j5f3A!4hpR+LzcwaBWToj~Gb>iQt z6gnGRU>akR(=p{QQxFPl(_w7VW`T!80ms|qi|oe28NE!1hk(q=4XzIUAY?YXFf^8L z$9mvi4TCTAO^2yS0Cc14N0@}_4677Cv$`ZA6uFRp$R)N3gTX!|-DK!=HOl3M*s{}A z$wFy4Dw}mIbNdcjG$0yl^C}4}A-49KtUDl#Jkuj(<bd!JdJZDTl-WfXdkonVp|V&f zPRt0wc+nImYKwSj1>a5P2g)c*;S#sHYgjLLAR*WeDY40!;q^RKI3$6$s3OS&?CSNM zSCrI7BuN6EjbtkmSoczid}ps^Vp!srl=Z^Ei%`^(Mb8S4IM}jK7?#a&0E$wI_{+<u z-2IOB6|fRB>q-eTVt4PjkRnUG@U{zslG0dq`qI@VBrtt(U|y)X9+>l@SMeuvbw2VE z%n^-xU}KAcg$lURNFktBT^(dr<Z6IC>CE38k|8-KM|?p<Z#Tv~#Xl5Bc-Uf>$-Isu zN=ul8dBMr#5nsUc_?x_@;Pnm%i4E2gKLgw18+Zn06LuLZfe-i>?!(V{a`{EQe%d>e zS4fbtE9i~WT-M{ZLcDl6#6mzXXD1Sfc-F)6m5T{wW#WOkeH^s|r3-1T^snA}R1aG$ zTqrE)c925Jd!Vq{5fUhMd;me#)2}>2V$+-;&0I*tbfqICu3Jb9)=P~L;%91veaU#O z5zr+^j1;dCt~XuFytq9Q1zmm0TWna8*LDOL<O5KUcLXebV+tai0pV1NZP3M60v@{p zC~1<dwNq5Y6+#EdJDJ9a#L`eFgcpMBV!HshH-$2GqvY~x9V1?d4blPX0DC%8A~5Y> z7AG<6M}g@j)_`p`Ye%NgW#db9@ba!0wLDHBs95aq)+&?&Z<2N`7NjGYvv`kRFIbON z(k+~RC1m6(hSzX#XC@S&5X5c)LT4xu2$KVk#>bJh0cXLX+uJ7^kd?6qr;3HK;6;ZI zuoh*|<P^K~T`C1;W~~SbQWFFOe$XStzwejz4llg8DJx_(+<<!l{)F2e-~m#_+&Pv5 zW2&zWt+MPa5*q=x>GBHtdgKvt56?M<dOHb@LLK2qkb%5pU+6{;wAb$M-TqB)+P}BL zLR-AHf3Le<I0`E{ReE=xSiMgBw|n~+pa}Ew_HQ~rfrSAXkO}31OH+!-h<8x3L^HP% z5{^uPgQ&F(^g<qjba7&s;Oz#Ih=9g0z&F5`io1p)Axnc`y?en%DSQsEI6t^f>rNLS zKlr&k$oNP0k$(-}5yTCB1=~0lyQTv+%})%tXBMTRzP57_L0fTvT^Tj)B{86oJu%Qn z-m9V`ONE;%YJe<-j_K0jON20yO9!qZxIhu21U!f0sTRGu#Y%*dZ+`f%lG0oL@^gX4 z0gCb=R>nRw)Lp;gFgoO?U%%aBUYc(J9bYck>1jc^&5k_6E;8v@c(aJ^KXoZJKn8n= zz4COC2C56fxo%0U{sZ^~`W@9*O;O|~q&kLRpgp{Y$e}7iA0F)tB9!e426?OW5?C#b zYDd7u)Z(qjJt;=K3frtVF2aN&?d>y)?0PPqGQiI$>Sxa=LbzPcT_~t>Gn6G>c;D>Q z#@+XQ%N6VQz9CCcw{imG`)*Elk$rR2^Jd?TeK!Z6k<(KMWV|Bidv6rc7XmqXa=tK% zb~?S_AVi#rW@sR?yX^f`IMnMxx*^fqvxOGe#4rd=PM_Qtm=xle^o()|egH!1paufA zq0=&*r@<Jqy6~E0!{JJtc8-leXn>EMdgmpA&R%Yl`jc@uLQXe^Ucz!n({<W5pgF>y zA=^6+3oyd)Xhv_da4l$ly7G$rbA>=YI@2`=e5Jx+9z5W6l;a7pMvgmqZkJEA2fTzt zcT;e=g6UjM4AJ*nv_b}3aHR>6(IxQ)Kqg5LF%j_hj_UNXn%0W@u(~oKZ|SK}j5e%K zc;$I{{Y;*AZ-RS!x6$+DhyrTqNVv#!lO1P*0@7+mbB2>0QW!l<e~W4okprRhTmW`X zk^lri*9cLld(eyWMjaeZF1eY}4d5F5+i(=SGsGk<ELgxt6c;n6Ke^6nl-u%hX@Co9 zWG@=7C_io9eCEExPuPG4Z!mhZr!#4*v$*rUt%ock6$@JdR3JyZvA6|w&$=wQ3_?U9 zc44pS=SOH!42ubgCbA36@jkhDC5uBzC+pr`0sg%E4%$hBQ+VM@mwd$Fpyk}<RcYXF zKlt$YL6W*KKnQsAkUF19vWpAQ<UXYuv|GT}=Bj|W^`<-`2oGmBgSX#E$wtXTp~T8I z`W6KBf&&mSp82i(0)Wc|n<0N%$&fKCL)Q2kD*Q6obSD**IlV%m&H(@5mbY1KI^|qI z_ot{BPi=*fDYw_#r<f_dX?xLVJ&l69v(7d7(3p9}_i3ZR&M9VCucw#=2>!iOOiq72 zf&gIvC%%PV*K0L;(WZv-&Eac2Eji~K!riM;4uS6`2KmfUJKct+&lE^krr0-fp%n>O zP8%{Gp`So5o50V0MJ`VRr&XfL37e(`|KYgpZB7!{>)t_Zg5=ei4heDkW?&5pM)3|n z>2mW37J7ADGyE9K9Xh>gfDhv!v#G$jZNZbn+ni*txBH7*l|qQx%f&L~iAJ9r%!#gH z0RTTva`2>Fg@j1P?f5esAoBDR$?Y`~p5X+iV72Wf2!1E@k5H%6bvbAw=eJ+Ly$MLl zx(xLf?f_eO$3Ah^LMjovz|r!=c1gB*JzY|OpM);zgr8F+IZe1*=&T`To%qn(oCTn< z0d2B4dCMhvGk~g())&wNkIOknEv{b8>7EV><tAGqSw}E0$dwjIb^-5&1TExxI&t@* z;UEtPQ$MkzT}X{`cQMj_Ls#I&KC}mvdfeFSapvWR<6e}3p%h$%HcB;l)q+U|KJmU3 z;KpZmdQ_XqsNJAVpxJYXnvs9id@bJYgRKcdqd$98J}5Uj%nEmT<>j@O7d7YTq9k(z z4X*;m%6CKZ;94fT!L|H~YvDQ61_412T0vNuc`OC;Us$s@id?9ut0o6hVEs<<^ckUg zMJjDHdO8_STgFciJi{;jLw~2R{=nZUK!aS$d~g0vVff!E+(OlR<#&d!li`>TGah;) z+V|_fgZZqSW~Kivha;w+1rU2|e|GNzaGH1dLCA2Z_rE^z6Fp2a4%B;(7OXCS#W}&b z@WXmeaPph#tdffN2@WIz)Dn%s`#7&BIP3gPiC1{OaX*457)V?ftF!^VIp+nwcLt)R zDCZAEwu-hrcHhB5siT^x%w;)B$VF?q;<jwdf`rmS(U42kBC;jkaa*6CxmRsbq-m5O zYo;~h?lNK=BhI<9nFZT3?X>GqOErtAR1?i%?!8r0k5xn3CRgf9Qz<&bEOqahcMChO z)Gr%WW3VP-s&QYb>eM9?G))`b%HF4=tXr4uEiIWuwVle)99C>O=&q&7h^b00C0IDp zW+aPsjUDE;VnM2uRI7}vn!2u0T53C)NJ%?}8QbX??UMFxs;g~Hv!r#cRni(O#nDS! zHfD-8gErAAJykj9rai1UW6oB#re#yAv?y)PRAZjmq?S2Xnp;<sDm{guBWstG);z7e z-eT$1wxw95R;_K1v~(x2qoC$2sh8eDSo^3Y8L5xCc06l{vC0b5;s{xqrn%C!Td}rs zF-d8+GN(+_E-jv}y`)riE!~#)Ua`yQT~A-N?Ao-{Ax%<EMRv+L$=+E~th!h4I&zF9 zn}n=o^ifOD8l~r&O-5=t&OIfsQD(BCA(p)Q9&?qwbKHH8u~wXG_uZDxWigIurnAgB zmxUF}vhxQ%T9dXSGKWfvBHCr|RCK2`rrO$7R3wIU{)8Z`xU=mkF%?acrs+zeYG$cR zSgH4EnoC<jqHHrQ_5bKNyXCsBTT9nDT}e)2wPV1@F=W|_0WFdsDar2r1dUm^n6CvC zF7Vi0HAyK>a(dlxU+r2f&YyuXzCjl@YKAJD*jd04i$WGL<iO4WhDhSHNvBLOo<8x> zt_Fs!fF(KRLU}^&S;E^4hS^qvc<zmi2MYs+Mm{LR+CD7~MOl_M3lMQ4dAkct^&&ZJ z!clZ%8RG5-1cLBQAON!in70GNi>+iqdC(A>k{KSIEn8&+$!57)aJp?KAuGwMcY#?U zw^b#AxQr=>T{G4;wi?DZPN#7)&G^iALUWd}eJmD-tkNAe7TU3h<B0DPat9(&1MD+H zhqx>m@8*&1fKsp;kcGKSQEQ?^e9@vX84?m-CaYtVt>cR7Fo-G8%fq&N9myb9HL2{> zM2WVZpw-&KElUTdmsw6(^(xZJRc=ZanlY=)7s?J8_k=<fv_V={b7gQ4(6-oW;eb~H z%+gAbWC2XsV1;aa?$ORER$fyxqc+`$z;pJhHge^LN+9D&+XsNbeNI#Y>)y3T8enot zQt|?GgsG$dcrgPEBxr-!8WBfOjs`XaZs5yy%Ti+Ig**vMyw{Y00t0VZnz`MhhEgax zXkjP0&`4afha#(E00c>#wh#?%-2ukh7%r|v9YS10i2{DDqD}6O+U`V15RS6Iut^Td zv4nck)~rg&EO;GK;Di##6z#>w6m5ksgx)1Drf9xEoGLLw!d3B-uJ$4HFeRj0Q7-Lu z^4gQGg3CYB)%+r6Uei@sU&PEwR|{#GFVTe-S~N1rXB=O=Jt8u?)F$O>cd*!<9Z<c` zF)z#5x7Njx>1AB6JCLujh21)gOb}wpAc(VDk_5H1v1{~<G^u@3mEPEH141~kVIcOZ zp0e@X;l;(UOsUm81&Ulxq~IdeR81P4BU0!TtL$K)Wii*Hk}yM>$f|SlNy%~C7le~Y zBO7InnX<X%EG-q&-rI6PF?W}36D7wzp2RZZ2)u|zfr2x4<-j>EkPUZkf$`BpU=SPc z#UsL(Z4d{fmkfHwRyPh845QgBwqpVV`0OzO1oK7a(eBN<e0WDRi_(;(tmY*JdnVeB z|1t`qAYUF;JeZ2^k*xz1WlWMefX7asv?-WzfSu{)4gk9sK<;yMsAQHEDsidIPUJ~N z>@~T#rm70H`g}NRyzFIx%L^7HF9d1|9|E;sO@DbMP@(Bx2vp3BtK|zlK>wfzD0o^= ziX9d;uk-*cDbdz{Ay64!=mApRdvBf%+0u|An*|WTsOX?N!GN-P<eEwmBi?+8B9J64 z7BS!@q>SJPJ|!fPj_uAqZEC87)(%PJAl_919vK!6EYV&7LRz|j+{9!}W{YH9i?sEM zt%$Z`^|e=N+1{mXh7*n0iZEq?g<8l{Q*26BvJVEr)h0FMno|X=m(RJ}jR?gwh+TY9 zDfKz9nnGuI0%8ppfQt%56HLZoY$RZ%+Dh7%-QB%+%uB|Boi*EisEv#|nXLET5HKBZ zJa6D&IuMAm!%|BLP*m8ey=c0K8Unyo3Funb;Ydp2Sa>Z#HF7pI#9~w6R#=dgA~U;X zfVQulB;ws248=X2E@sZ)1<M@8A!xQY`GEo)#sDk9FThw0Cfm(9+{qVtlX!Rl+Sb`k zT5VkG+_DvnQ<9TNIo=l`Da&XnSGPAXH%<}Jc50qd@<Jp#dXfTLo54EEa`a^qP0Ech zxviX?5B>$NAPpd1WESPHqAB3`9ZBxjb|98Tdr7c`2Q3ODQt{v!57`ceIqasO;G0X6 z6OBW=qmMY--dQ6BwZU=WW#%o!yE!_8R!30B0tyM=%;97uHiivz94}3vRS6&o+x8ry zAR#HX0_;-NvBbhMwTT_2%}W$$TS2UG<c*LGq}Zxqu~z>Z6Q&*#mlxWLkx&py+Uu2~ z(ce)tb4KU*Vvg|_b8O|y=-kqv?X+L9({%w${{!*w7b?1B)yWI+xROAMq=itbsER5= z?u*!gWNDQ^@3w_9X2)7O@ytRUgGD+uH3lGMssa+Z$l11)c<d-^i8c~NbJtNaNq|*o zs9i*UG=?V%ag;0*TZh7;Sf)iw5vc=!AS(}TB1embDY%KRQbf~~T?FI~4j$orQh`D; zWiugc2`P{zh|uP$;;?u?Af#7gl5-pFH4+3hrBY-RUf3YH5518H?4v*u?g9G{!P~US zwvR+KJ8^Y5VDE8)rDa{r1Zo{&i+pKylu~9<VwZV9@t#USgPNTz%#K8{t}Q2M3j4j^ zLbPIg&?Mn&B-q=bPWb%lv<yisj$XXb_$6uik}w6)NtovMNlSYDd%|SOU!kkl$C1cM zI82?{1QMqbN(_!CoJb9W>?hIQg<LqSIe^^bt9>@_5|&;?Vq+>;$ZN(H7g`&l=|IOc zCKE(10`XQv<>Lj04)#KlZHA+*HSOEQmb8s0mxv+}EorhS5j8Sjs-)ByQecaex9`PL z6TC=mH|a<;FIgo^%xqDr`F1Bar8Are3KAi^N9Xjk1=-3(h%8*)ePWq~KE>UGGzPR1 zsS;Rd?_T7}$F86-qwqkTnX7u%8R$qg7MJFp9kNb^q^h-`PT%G_<nP`JJZe^Rjy>6u z7M$yBWEFNRw&d|a76Dh|QDTTvD<nqB9keBu3G%*XB0Pl)DwEy4I5OF}XWI#M-RTq* zK%8L7M(owdWlAlny`_}`5mtLwQnV%1sjF;bp9E@&!3Jb*6Q}8`abiX?eRuc4uP2lC zt{xev>OMTlBo}y1ngQCb$^>7~>k29&@9yf-#>AFplMpDOs;clIt6f|qI+I3F=GoJ< z9j@S^*u_XHOATz0SOQj)S_JH*Shg(61h3sW=DE4hHbD3E3jkI?yQYMD-~ba`1K91= zIfKe0FaQpohFm_f8d|2BRuOPEwg5{Pity;9jkjgPkdsnFI_!};GdHXR_Q|PE8`-<q zZJc)XOd8aX@U~){0a&U4slBro(D)XKRlFA@tRl4l>Qrg%J&+3^lG)urQUM^g?_F3M zwp7`6$T%(|@V=%!yC-7y*f>Z^HP=2oRBLY)0u)-42-OlGlikoTYleUwLS#0BXA)B* z!{WV8Da>Uib8nUo*w&ud!HK*mCJC?MU9B9s0JItMf&pj{z7lu=@}4D<EU`9tLGkWY zZ9Tr(_Ld-(14cUpG}rVTAUz=0*b+PB8QbiH;n~eGQe{_V*!I0`hr5GqOD@i$(AE~6 zy)hwr36V0J($d!B3z6)&0{h}{k6taT9kIq;TzqUD0cm(`8j$E7+oX(Us;H#4t)hk3 zHPTwqwv_@_^)lIE3$_+n=^`!FMWSshum}N#NX++C5I2!D79yWN7a~!>=Bi^$8U<`1 zoSax{dtxD`@(xwAXhmB>p;LO9cTiNTh92LY#}=BFn1_;#lEqRaMIBMCQW{N1a>UiM zW7HN2)lq;g9je%-u`Q6C76i&_mwkNYXoz;6-O<RZO1aCH@G@VGEw;nZGO-BL$#lA* zwoR#NX|v4aB%^Le;P7QMw&qLt`ufBDbXks@(Sp{i_{GiGXWBb%##dIn7acdFwF{+H z@t;|7{yi%`zhlKkfA40%Yc%sZ?X_atFeimnZi=N;kVOqBcqlUinU+GF5*q|M$eHt1 z)!;h=ZRv<f<e60jc3Cv3V$J1F9^}wXv3G05DzQZ`{%jLCuIgA-)M(?EdyHTf?Pa!O zXIy5=C;){xthJDo$%#USRk1`o0-%wq!E=DgMrB!>u>UIn)wB-iJ9&bo5kh;(Qgb_q zmZ~V5;$fg(j3@w<Q2K(b4?~^qVR#rsN5@yOeNwyXC3Qj=m48Ck<K$E#|45?yTnHzs zJ4rNMG(r5ePuq(5JFzW<bA3&s3l8si!o^%u3hQNra!Ld;T9c$oWsC4&*D%>rueZ0s z8X2{2lX)S2SqacmU?&8pJ1foJ)71-fu%n1ZC_5=+pI7PLwgW}B0`N}dY6bT^nh~2g z7j!z<oUvl8Kqthoc_LI8#%6a%=+<emE#6j5Qq^m0DZ95(F4kioM7WRuTvct{1-!M0 zc2F#U0$*B3z-jL$P)rny0a!4NM9y)l*vfW_bHMF7&eM4~u|1PKGJ~>V&UW_Mm_S)n znWWS1kN^un0DIera&zn<SlSrm1bHAc<GsOYUFIHy1dt_*_%J?o$iFihX0pxcs-91I zs<s2t?FtJyQsHzV*HIJ)@59N~{JOeh39a72@Crt};9_6Jyz1_+vFVV4@91^l1NsUd zykb*@<Jd>c`-_-||G$_&`x#!p_$!X4v^Mpkg~l*Srt^>QKX5~}%6u&xUBs{Cg;9N7 z?*}0K9U<Gk?b3g$YqzjntB?dO@x)4Bj!%`fRp?9AMy~&<YV&FadoO>f+MH_3X=~%9 z^Y3kKMVxKF=XPaV9EbW#|Hmb_U90$DyZq`<_t!IhU0+}7!k3qlm3U%;mulboCu~>0 zRQq0=eSNNl^+Nu>{I3B~?RBZ}zpWc?02W!Q)Hvxojdo?3E%6!6ZM+DHaUE@^$E?(9 z_I4W~-yvSzOU!&h+af8^*~p6)Im@2j#6Gsjh;v55Y!;;PG<Ja$%igk75(YABrcRUz z!pJzB2`~a(NWeT`cF0#o%{>19(jF_6JgGHk$2O`_I)eXyd~(j=DA3I!!_3uX1jbU9 zo&&g3QcnH>w8tV1NC=V(5ZHJ&kWdabL&{`{A9=YQSW)=@{>Oj(=YRg^|N5{0<{y6e z;r+Y6e^8O@!~MhE<GslHzyI>LZ@&5Fn>R#6f4e<@etx`vdc4=4ej>#G{^75PZ{ECl z^F3d8k9PN94^JN-pFTc5KHKNp)2F8=`(*d_@!=-Fh+NnG)2Gj$9_*3deDjyTym|Ad zKmPHLe>A&2etI;!uG{0UpKiZC-9BDF|NQ*v;qLS8c6&1UaCdL^@yTva&t?xleS7!* zXSu(ww{PFReS7=$_Unhg{{7ttyT8A`d$|Afa6Q0xZ{Pm-<Bx>jfB*e;U7vrmr{8X$ zK0V&u-{0Tgf4slHSK^<4`ui_$-@W_s=Z9bPmtW*3`rF^W{r1~$zy0f*H-Do)|LISE z`mYZkL{#n3?D5$i9v+_W-o1PG<4-?)|2_Wo+i(B(n{U4P^B?~7hd=!JFYn%e`0(Mn zK3sQq_s_SRJ$=6W`1JAl<HOVAb@%l6{M*z0)58xx|Mb(lAK$%u_tS?T-!i|wyFT3A zU5_7c?=Sgq|D!yA{P<{}pPwFoy*=5(rF#GV$G30a{`lQ@-+lMpb$54ncir2==i8^J zr_VRDr|Zve?|u={>*4P4@soXge7No(uKUM_=cmU<d;Wa;^mKdtKhL*^hx_~chx^B; z+wFF{J$>SLtalGj504){-R$}4qdnOD!^7>_o}VA>;kvuK|M>K5pFci6{&u^4zCGK^ zumAYbp5DKI|NfV!zyJL6&+l*c`04iBqdi}Dm&k_?clz{jyT9E%K0p2T>;3(8Jv`r@ zZl52`9v+{cpPrtc?Eb+%T(`U1|7-6}dNtj$GojP>ee?C-+wW%We(%%7Ic^GvqeMuE zv@8gulB*Oc+v$|Az{dExN**CGVaf!A7%}mfAwx<CMo0yS0Rt$N7?fp@pk!y~%o{gO zpl7}38jIiH&*{vFINy1j-K^$W&w93Y%1Ei|s;=um6s*FsAr(t7xo9FOhgec1X^bvP zHuX)_x6Nw4Sge+HTX$XE>Y%lAT3a#5evp`_&J-C9Ib%yOibxx4d~nWLehuqva;cQ! zi*dm_Dn1iAW3;`+XEI+b+oA8;u8kh!8I!Zc7NbkC7&r`sGS-wL+PW*=NHRhBp(8_N zl(DwxzFkizhld9Tr$_q-2ZtBump8Y!6D8ZWCF6{e+NgeIOruGgP>8g{q*$LzaoTuA zwnXcV#WQL{)?u@ltb;ANgcNPjrr21DF(tT|ohen-w#_iO;>np@$Y^B?B4&)tFleEi z)G1TncfGV)NljWQsg*HQoJ}T>7ot~#pyKhec-zAN>x(UsjCa-*T~e~4kPpdveri`J zkR@x$6z_{tLsQpvqqLR$)0n+6%9Ru_|DhC9e9Vzop|O%|q~fA8E;?^bE`=<aKp|*+ zMHiz@p~Bzyxj3I}amBd+qd+A&Q%rHwN!^PQ3d~DWH`WDPO3dS<7lY>yF7Q1|!CS{d z#fBW5wZW8#UyYG4%ORHUK5`}JMPeBbZBwtSYJIhTu)n*rv%9;03>(oHF-S7rTV7gx zhu|C)-u~7`>x?!=Q_-blpKZZ7c@u+A<4&};IG3|`KE+~*9IpesT1qCQSd#U|MQ^CA z`=mSW$`herV`FPOAH3&f?VSyHyQqUJ#Ty$<)MdU<6*;AfFNzj}O2%M=QRI7DABftj z9eQPzGet_*)=G_UuXRYlU?5F##hMTuZdyw8<!^uL+45k2|GKAA0u@*gZ(TCQP{}2g zSZv85`jW@d_t=LXFP{n-JhQb?S?g^u#=8<J2kVM)#j5D3_@Yy^t^{kHDY%MpCE8M` zm8D&+&(CM`*?c~?x{&oHT4M_-A*3z=lOITFjfGfjAjLBjz2h5XQ&Q1EM`M#K-umJ~ zu^#V?6=aMgr5suBoXsXUA5w8-uy{=@7!JIjv&LE~SZ4+^5=is5EX6x)8|^SMrod=; z=biC*7!pb<(vb(n>0)B?MN3i=55dcT7YOc&VGF**SVF{l*T$13uSHkaZC&@mSWSvt zf34K*LiV^}3q#w^=Y1`SRKNyRu)kPu#aTm`iByb81I%HxCXdtVy;a)ULM7t|C4}fK ziK2WdxH+sdHnw*q1iT8itrv^Me6i4hOtI1oUDppo36{uXYZdK6h&j2!yUiE8j4On7 zCAm?dYDx5NFxJDWM2(TeD`S<1Q20se3Ipy;vDg)ugyIv{2Vx8ugW@qI#ygjcaaxmh zBH(@bLofy<rWk_{-Z|qaMC*KZloa*r)w=40EO>+9%VIWL_g7a7Rh-f#75ERWq=aEE z+7==oe9690G|5J+HI0WYsn}d>2_+PbFWcZf+mz@u;WE~c^;Q|BLr~fo@*cjb<dTaQ z{m}Kx<!ZTHt?Ko<;$WgPZP!ah6tyL76%}hVtkPhml0qn}tQN`;seY)N;pX~^yL`{j z&o3mY!JE<CVuG!*xnzsQrj<6jSmmOD$(2;#HnpsZ4$cN^u>URmO)5ocDU}k^2pyuq zGPWuz=RHX&saOiOG`E+h#|H-o$0ui#>1?q$IX*r)>y5(_P_}sEhEP&+t_0^{2aC0o zigm?0?Xc|vl@OyZHl&h*PbFdU5E2z{y0)oh7$?&-mlu<DW345^)ZY%Ih8w)JHRPQ! z*p=Aj7Tda6H+=$ex*OzLHSM5;QoJr=cI@KZF!X(=w6ewqtH>2+QVPWw(z@tiQo$-D zvV`9Y79+z}#hBt0#=c~4iFd6-(BnN}g@$5M_SS}wEkat$9=`-*m1r9wWsqx=q9w#w zgs?eSDk*4B-ou%wrtSLZiwWLE7#xM+48`?Y3WbMOzKDWv=m5KG9elDU(aopR*}NJg zqH#)gF`tXM7zSaMgOn<Ulub0c6}SS-Fi|i;DA{*18m%+NF=9a{7cHEeceapA8Lt(* zR?c_?_C|J{n6IYO$z(NHatKXevMdHG$WG2@b#G}l_s;p^j*pIxj_Ouod~%5%lMNpa zyMmz$-UQ=PF&wkG5-~YS3aN$x;jbg7ZM`1)uIr?gLn9p-%%~oWhMiN%E2*_5;}qgG zEL<`+c_Ecj%4luKc*IqjijkVH9gH%hw9{6TLsaOrBMoayylI_r%D{%|pq17kQgk61 zZ)S)adu6@RLxKm(Sm3a92n0OGoy7*WLOMnT=S*Y`8(~L;CFYDL#A7=860B6ldJ4H1 zqXl_HmZYO|ny~1MQPO#BIkxv$=P;v+nx<YYmP_y0!kAK;rfqL;o4)P{RyQL3DM=}H zc-q$W>gML?-~`)8As8W@@rYCqq7@JGRuFwSrHw+;hH$|-8%^DGZDYJqU4_rO8k7lS zq$}`@cwM|BmUwWfSmSv>Qt>vxau^S{Y!K!+OPuBfLi`<zgW)7yC`V*3MfP%lMNL)J z51kO|<f5%=QXad7Oow>i6sfwl>pOwer<fcJh8z~vAry(Q`%b&$aoNN{Jp3N4G~bOp zg;L-$i%W%Uv6}zFPR{5+S_(2G3i22HWAu0=ld_B2@tQ5EU~5>dI@kt+8Cf)K)5_Iy zdCmCdeBHKvCxrHvqS1)oz2#A`*yRZ}p=3CI_OaM<a4{|=w%Q^3;EGRdCA9Qy-PBdT zTCLY>SAtT5c0${w5XNQWd?b^6EKS=q<cv~EYom#1xsaNIlftN?jWNy?a-7s^Wt8dq zp&y(nDL79U8t2G_Lwvf{Xy>dRhE@k;B|=N&^TtR;lgVwfy1A)tZ~LzA3$}Cefsl$g z51VPUawM_8lv8!HUa!}S>2!JxBta=T45pLSY$}u_5<v=|R58v41a#UXQV0fa#Dt)y zlgR*&KybfgQZ!sQ%hTyjX=km$&~T)L^yk&(W4<t^Ax0SHP@+fD>`U=&UAOCYT~$JP zM^Z~y0=cd+@aa((gS<~sq(RN+a}#}vzEJQ!7B%#JXn{I3ZC%$xvp71uzP`A)I6Ycb zeP>FhFfO5h3_8Gjkd!=*M^g1e@)F@+D2a^&qMB^6`lAUPA|Pmn?<z)0)A!azg!W@3 zIEFL2lxWD75VZI68Sh#Ipo02#AX^N1TO3j;=`F`4czdKDZX6N^3m8HOF@^}&Tnae~ zgbO9?47d@i84Ky9kgh00n#1p+7kGKUTCdh?tDN)NCw3K7Ft*lNr2WAbrx3&`PA0~@ zCiq-Tb{2sV6@{n4!x?WaKUVQU7wyMn4TixQ4&JpYB^x=c`wlzBA~wZ9m0-QiRKjwJ zoD)|g%;woyD}{2nJ;#%{nB_mZ;0Gb71lu-k*IC(TZ>S$EQQP;}&(;nIGls5hIyp$K zz0$=9sWfmDos_W36CS<9B81R-^vHOY<c*~ga`6sMCLlV(s3W*GMU~{VkWv}X;R72T zKxx4ni!EvKz(p5rok_1Y2$wbpJ{U;D)EK9d3CPeL3_ZSROUTAY+y-Hf=V^4~Eu1sK zhyj+h=;&a@$a&|zBgBF^J3Z#S*2NMshih07j(F?wa&yV!cA67$pGJ59_B)kmZFIR9 z9r2A)Y>L|Gj6B|wm2KV5XS3OSJ-@s-KfAcRx~-K7B^#e$`mj5_!FonWLBI}bDYe9Y z?b@yph;anj!avc@D%?ZIN_I`tv<1ixMeNb(?PNNWm<(ewULo;o*uW;=A;`n%#S)_p zLDMV1F>Y07j6teVqVq22qI2@4kSsa6pj0$51{*2o?1PKZxx#7m&B?T`>#iB35>iM{ zIu(E&xE<DR(IyK&-d=gk5>OF5Mjq2EXS4_oiy?W-5P<C$b4H>lW1Ky{1t(y!$E*#R zJpz#`#=~m407wh}hPT4JWQsmEb*(T04t^GU%m@CHbt%G>6)T0%2#>Ornv^7EOtjV! zBE+GtdMUicme-@z2?)~R0&S!aaxTkx6SZ9}m&;|(xri8mzBH<kkx3N|@7VXGr0trz zy99u_xIVd1LMUYrO3|PZ%$lMUNpFWCi-HKt7cwGiYZN&uM1*V<7HZjQOWrxMu$oB1 z;3i1uU{o@^4RUet6~r#A1n)hdW`jAVbyaoe_*@hKAON1SLEKiH5DXc(0su>hzC&=) zFX!{=^!)sCfi%0WDx;*J5D?|?q#75H5CS@&gsoxlqzH!?A;`XHr-|d+Sc+4oke*B? zx6{?S?z&!UZB9>4PWnFaVkFh9R+Gt;tu)f~Vv92&AuP|H41l7X$pys`4#z6k<XEnZ zA@ByYQjsDy4zX>jy6WH#Fo`xLGMpkiKz!JySbC0kg^95g1rU$@PeHO_6T>7~8y^_| zj070NidR5`Gf`8l;%tbr3yM6!t)+;B7Gsk_L9XuE8N-J~MOepp4CM^GlGC=+UMQiA z^G1~r6qTX|@(N%yhp3+8>DR!_49iYAwi#rdw~RAHjV#K9ljCXKsj8~03NXJ3#i5$u zfn6i93uX|5P8p7@a7bDVWh(rnu#PD>hp?4K6M=1uxAMki*b--i1OR~fiAe2T@xj?5 zHJjEDidBW7KN}0_5E<Rnk(3h_NeM8oi;GsaI@+M5juZ-`ypFup)=A?QleX`wy6S-^ zTW7QKL0c?lg!a7L08DFmNO&g~b2I^KIs?Bbv|g=lL}!FGKyM;>C9Tn>ZKu=ebOLZ= z)ih1t_wa#j*W%Az-%d}Cw(;57+1oojIyye-)+=O@N@%S^35;F&?EPr2g)R)V`&WDF zi&LSPrl}?z?5JE+kOPr4wpUn$a6!06pssBOMMddQt=f7%zrDG+o%BP&B6LM!ZxET{ z`X0e*(axI`l!D(25y4F?j+AjJFudyd7pvv~pB}E#CUR;RDy!x*1<!^pKv<Iz6IYCh zju>?Se56UiI^v5CuGYChD2BL^A`xf$457rL%b1r^w1gQ4hKuDbk;1{uCZjm7AX$2f zD)Ga4-c=#u8kE`32jgQZE*Te)wj)wvLyp(gMp5xeN;Rlrijg*2cD}*IWD25hWXxfF zB@<wSOv(Wp6~4*3?BL?zK8z+I#G)ok-gbqZBNDT0Ii4d9DLhsya1HH!fp_UTZH&@` zOfdiiGT!N;PfsWFc_XFJvcc<+wL+l;5P$~;AF)P)!Tv^qk%Ng=>l9zHaRbQH+d|S+ z>y}FZIhPz<P9dT^z&UY<PH8GdDp}7@kB`pJuV=G)-49Z>v*XG2<?;T(!T$c?(ecUk zWHQmxb%WH-N^1e`!B<NXng}mWMrtA2_Wb(j@MuyswIb_-vR1o+t94ynttQ7ue8H2G z<I{uF%ggy<(f8dNAE}Jg#XDpbYK2-{<xED<W`ou~mmG^%QVbgKj!h_dB3i?K0N@%z z;VP7b-E#~K^8`!I0u+PA9KgXzSimhPsbNxJTFf|ZmRv?Y1^b@I(722sUgmHu1rKP{ zBE}@27%}w$X4yqvBftrTme@Al8bdjf*9nPw$d;`$7K62Z#M&K3lEY^#ZlE%lSPUCO z8m<6?=9J!+F@7nn8Le}+Wtd+~=8eL-%AA$8&H@fV4#0qLaJ=XYDt)R5coM65v{8{8 zgHi0OY^@Z)qqUFGxPVfVQyu`evLU(z3?FaGH)bTU&~mxBzMQV>THqounyBT7zE)yr z`sHG|;?LSpk+HwMxw%;`1tv)peoE3(^<6h$<K^Hyy8tJI90ZvX7F`lcfV-wp(y$1? z4KU&!bp=jmY%EzDVE;vHphxi0(c2ZWGnhc5v{i~+NY+J)C}MGpV}SlhlBNiWGH{H= z!|-C$8Xg%0iM+U?vbx0HYKLq)0;D2?;0-n6VW^Mzb9-|$U&4rquGI*p3>hlghHRX* zRuPvhO9QaEX*HIhF9XFWaX;&^0LdU8>L^+u2|*>7@H=({xKT(qDiL1STVj+)p`xlh zmQ4b_LPU-X0S{TWgQ_kr;2-w(4-OBHPi}9g^A@FwrfH?N4vyXlA$n<iLiNm*WGKS~ zN+eGRX8>Ikmw@kaWDj?Ys8~ysIv6cO)=#`Quv$<Gcgc{$NT(33R1UAFz2@p55ZvUj z?pvjFMqtBJAF&`!$$(VBV<?d~HVi&V(M!^naw!^RI;77iC^_swgiySa0W~>oN<DOS z(<drY@=CYupjucA7jht^6Cg2YDTURNQDlnnHcCl@%+T2Mn(&4ajm})8O~4TgC33tM z@MwSpU6e!L3;do#^_u`Dm$F)|maC$CBu3-$o4F`UMn!~r2)b|suKJV~fR_R)!Szv( z2&70-PJ*+bR52K2>}H2&wbt^M=9CTrUbGG#%A?F~BFG8RV)#ulE_=h#swo~tS4Bz_ z$~8mZHFe!~_7%V>TCThL>hKUujQ!(-!^5M=WXc2tRNIww5^ER`mr$IzVDa~25S@~u zZQE+Ks@e_-rqzQGiUiUgDqe}9TMTk?yI38r=Ci67q@;7mT}ZhEvq_Guc0QRz0GKQx z!qnPWX>3%2R!b?X_36pU`RVCwkQw71N|9L?2CH0fiYt-4$%@fhTWJR=MIVOg?al3M zUDeIH6;e`gPB;uFf)9;|tc#}aP7n6>L5|r!JUcr*K0djf+|K8V>7wneG*TNANx|RP zWJuW&$QDXjjoKpqV@PWJT^k_Rh<y8wf%CRcMfX*`T3wwS?(H8RUrd&Ds{|nug&Jtv z167woNLjQ)aYE`rYA!Yxqq;#`yf7-3Onj(eQ)|qCA&+odlhMf(vI<`o?Q*%8+}>W# z*NxSPtaL}pBvOMIhOTX!b{GZ_hftSN(0m<~4ys3~JFwxwOGu-n%0j|#D@8tJr6n0* zEgYrN#`}n{2WwjrHh|KYN28HWW@CKNQA;Eh5*8KUJFg$mUcAYMxbVvv5>q`0ydC3* zZYah_gro?|-~mziRSuxKv0f^pREf^mVKBN{udBLldct~Zfsrpe4L~&jBuO6ZjpUO9 z<7j<$d3t(!iYiavC4kQ;w-exS)7JHJIVeDHO!p``g`90J%HUB@%@aun<rT)9i`GC% zDyO9<#^ROe+itagww%wG%X*!aOj50vU8@L@rs3pXTYY>)jp(Ev2BV};H1rb0s#POo zkf(>J=@FJqFXW)Ry6pzsNWic8q6-&1Y(WNO5gQqf2a%x$N{H42L+=sZ2YDt%oxCE1 z>5jQR0FH-V3Lr&}(@z*OZTq%qB;)R!w<ce*jW%kaT!st`dH@}Ul0#v11km#cqHAD> zTuC3R%D8}5vWE=C)tK2KNG(Mu%)PP+cTEm{Wh}P2NGaRM2`m*nkCY-HO{0u0&E;=K zCXm=62C&ABBm)5`UCGmf<HN)KJtnweA0HfDUS3?^u3Ft!t7T{5d_6*V<038bah6F4 zrHFuRQc0x@pdN2Z99G@XJ71EGOd4|Fe6YD@-V_Q#%#r}*M@Ur*Jz3RNKWJn63XX_S z%0?-~jfn^+yhc$Bp(unP-Y+^Od!PvzAR80nB57Up99UTEJO!6M6EaYl@|0lqH32!d zaMd1IS16Q8dtqfpEr$%HP_mN3x)J%z&CoR*>j=4+9UdMo*U>xcwQ<<kMu1EwolF+H z)N`37J5<RVBpQIZOaQ2+IVlemvNLfEE-?XC2OqSG#*p)+KR-LW?vg<PQF$#5kr<R@ z>{bcs`(9xu;65P*QNzPT$FMojHjEaMG(X0s6sS-R8p+krwSC_qk~0>(LW9|}U~oAH zI^bX&Mn`FqLev!#cxJQ7bb7USaBy(JHT<GAnPF&K)HW6fT9GQ2WDt6U)pCFD=;ZXO z>Lu!h*i$Z20h^$J>19>IqYKzZtVOS_37$Mzy<8x_(<rg1%4<@|COotP>&TO~R?|>l zoG*u3!MjVPZSo9$*)hOG!lF?kKzP8_SM98c3}~6en~GynBs)PT%fzM;8&}pE8EmwG z4ZQ&h;sdiXB2n;~%ZFkZnyRifSYBR;b*C&`ni#sFSElHGHkr<5!DwY*oP?Axq@ZpE z>rEs}GB7`i-GfP_881X}&!FsOtVPwr5Y0^h%0q-o6dofe4cd&B>(z2v1Ckqx1=MdC zU`)xQO2MomCl#vFj-#8vRST<aMq&plhvj^!{Qo~@aXzh@s%FP#sF(y_1_*nk2>=6C z*_z_G#GEl|fqjgn<On4nzzbADNFa?E!%NVYfoWLT>*Dh<K5fCPI@D{C%cCFx{7Ne< zQP5==M+8v~2(v*o#!wC@73v5B1M7?m+V~Q>aKO)S1xR8*I)Nl$ktb|ku03b)nTjXm zaiD)V_%>~g=(<5`0Gu5nPfdo&t0lr{xXc(5;Id)@Z&i;yW(J}Awvh}Xg%mR=I-JFt z;t~PjK)HcUxI;F|F*;ID3pxOTPfc-<7Z;b8x67tlby8|2fVWZX$&rpaTa&B>orMVu z#v^}8AoqYIYf&1(fFtEW4FLrzql)L;&c=u$PBerZDFmP;#gmfC1{0OS-bXfXfm5NH zk39!#gZjQhj$lyC!>e0m2`_DmvbZl`NJGYeRs&!N>wqg+xHZ5}r8I#O?7Qmn;_7U2 zyI8E60SsZ|2=p%FEFm0-*=h#3`@YxUpdmKlq6c%X06g&;&Y&Owx(u8)6=F;wfCAGD zgCFUEG^PO#@D%`DsUrS)a6@n)9yknBC|-kdJ>Zh1ke0Jq*DG)UE%<I=Y<lA<QGmlD zX^?N<TwGpWp6>6T-*y_%T|#WpHv0HX)qM+pF3aekJ%&7GlNeRE2BYU)wn!*~_F7T1 zMlQc<nyw$%ogu*j`3-=U(WYw$aGM3KXKT^5U0tCv-}Pna#<GBQH0JEzal}vzHBMhP za%fQOHn#6V5X>*tw(BlVFDBFZ0?0F>L)F7=uTZZ>EetD`sRhN^=usCUy<RL9=jRu* z>2x`tcNBv$7IlQo!))NiIau<zqd}d9z~QCLL6EW~3~i07#Ly2V25@3v@l!Mmrj7Uu zTWC~ydD~#B9P-pafNw&`o@+QmpBcJ^8Do|zQzcYJ+Q()<Sx#HlAh;leL^KR^S8Gor zas_;w9I7en%G(mX2Bp4n-T_Dr$y)8fC?E$DOM;kPq!KS{B!1CqDSKZ6Km!BPBWQRA z>pcceo2^LzxA1JS_++ey!S@zLc{n}1zeXr-82<9#8Q<5?$Z?sfV67WsKBp=e7hKN^ zkAya1ixmUbqbE>*3A_}|#AF~gGO%|`UKy*wxJ=F&tW0Y`GD?<|T+ZifAQlS1q(C0R z*1}*Q^m016ozMUV1u|TQv_dq@a$c|2tCd4&;xXzL$V6~3Ln>z}$$8YCQRxE5(w7vI zp#b)&QA!BW2JbRxd(qjLjInNH{D3K^f{jKRIrQyf(OovxfSu(#n20gnu?2Sp5hawN zH_Rlq9(Yz6Q1ns82-N4u4Xfq+_V#L|uv}hWU0q+JH)OJ2gAXl&=0X_~YTGRqi^bA1 zhYm5TURUdN)`aRs(M{9TjizA`g((5dfDMkK^{@42IA-{!$Pu}U9^uwl(`lLt7wdYV z99X`vsL=qV#CJmU9tK@&Bo!D-M9(gb*JPkuOC=p@Qu6j{+6-{th+!h&XmHoMwo_dv zab2)esl=#2KWATBROBl;>#c#E^!Rm6ecyA|ig81^2pl=Xj-_Cs7_1ZJNpoUUf`>VD zPI6T<V~sF0Bo#tnCg0-eGpRg6S+5u<mMG#pufbrk=%)cS4TgpYR^5$23N~u6&PVUz z*30<%0nY|gpQMYyIbgF)4*+@0Me<g~k!`{?eP%Z?>=a<RjT@tXWL4m0CX2NQuU%p` zs4*G<bNDfP0vGv~o`@)c*JLvP1N;wfXF{cqO6iBepl^i91zcFcRH9<05<t;Xl1;?$ zHzGz%2#Db+fLRbMV_{ARW;P^GdI-MwK@I0;XKO~bKvV;lRdjL<66)!?s(Mj?KCV%$ zE3d}UfclLgWHtl3U4kv3eU{`>4lx>2&G2cvURc*8<|wY$Yb3ogWuVbm%pS=fjJPGN zyv!MqDLz;ZV(YQ?BjMB-jYjGu5MLO_WPgMp*pbC4KW+v@NvM?Z+Jn6UPZd=vu-Sv; zVrum3+iJ2LWL8Wo0N^tA2Nk6dvn2!2MroAy>Y*p3uPD9y?78S#z{p0-fru<|cgMKq zWUl}iBIZ)KJtiyT<v2Ep3E#wOWTWc!kh%T<j2~PDl!@U-Ed@2Kls8f8c6u|LOczMy zF^Cyn39MslsRt`gns7a#h?X$~+*%3LIk2V-nsf@Y(~TWwR9Zmv1llz$23CDQ;DHp~ zB(Dqj#aN0#bG_DKdL2SvR4NEh2dEQ8M1G^dW9hJIxZ;3;<&GN8j<HOz2^|w~tY*em z>X@v=?j;&Vhf@M;-v#E4HQ;txIIW;-IAx^Uj>EB>u!*B>F@WA?r0;;#0EF^NaGnjD zRf3<3c-pZ|3}UHbwIAzyu2{-kmiJ^pDpU1ZMC1Nu!EghbRhT%RfDex>b0jus%7M9U zuCK2qlY@h!v-69K%bO*7h+2ZHLRl~ZiEx=`(|Aq<N)F7SMd5a&f)z0QL{($e>Ef6g zA;oc1-<+JNsW6Ud1SToVMtbCzx}cL7048SGS4<1o#OQue41J8GZ|>Q`g0inq4gRgr zfEbz4jGApCMId^S0Y9CTQL>j}5a9euAd5l@r8WL(P@tK>H<1NXz7w2@TGS562!@VP zdj_S^Xcr3g-~+>blTaLrBLmdjFXfP>3el~X(`mJut-!pUOeWLmV!o>P*NdqR4&*76 z8CB3E)3_UjKwm>D0fcIfY)pYq6S7*XG#9`LOpiu`ww=%B>&4nQ2dvBqEJB2o#sg=D zuaSMTT+A;oFDrC=Nhw6LZn^>8c9N`EUZ0;HA0C~YuBxsV4*YNev;sPuW(JG}wuw>- zQ*xOD1->ZbD;5jSg7QZA1(X{Bh$TWVgg4eGptfh1x*vK#o7UEqP?7^gW}$-IZ&QS4 z3(hD^Cje?Ky3$LpdRTm;nMpHtJ(-fI7*E-vjRciqB@HEwViRy~gjOMdKaFt8l?rW? zaCEZkTLPD<D5JsrXmG4V*R(Af8q>&D7{hzeyFecZu5@7Jrsy>1u-Z9^&MYi?bogoG z9NJbuPX>*htitg=O8eK2C^u&2$Y`<gIfgX>SY6_q!9i>02Y?Fa02SoK{JfHLkzvfQ z0M+0+iBK9JfZw|Y+o}k}3)VCB1ebA9q1b6{M2#JoSTZ@HI!mMH##@HW4j1q^a?jzA zKi4<6)A@Y9M2leCqmgrvNZK^YX#%`+<xWpekB{|wX%qo6ZfmmK$A?y){%=DYVYXb? z6*rxEjY=h!l0mqy8CF2t4TKRG8!FTYaE%_UHNYz+_AV%=XfGjKoOH<iQTY#4BFNvy z1+D=gFB_}TuD1aN7_3Jy2E0LO)Ho~+&mNSWZwanx>qev07ci2@vo%E*qgow;7jitG zA0M3_?CtFxu2#LUtwz|Jbs%Azo2$!<>CI%mP#Sbwl*bd76w&tqI3BHbPIKcEm6VD_ zoAh)VnIIq~DUNj`Z>F($&*+95iD{h9!&8j88S`sB8Uo;Xzax9*k+Q6;&M4YbaY0Ie zk8mfzv|U8W**LBR+L3S1WKuuE*&4+!J!XRr9UGi;6u6E|{2WL+L$H>6rJQjI|D27< zMvc)LC{j$7M#5q=fLyMzdjKJT0APohR^m}@LG%Nc6A)aYl8QIa7S7d|A^|=!VC4A{ z1+`Abcn~ijd5n&02qTW@9p4@Ho{H!?`kR&4fCS`V#G+M#un;I}sYKvOcrE|4EdhU% zR||LpD3{ylg42Z@yK@8cPij!y(g{{0rNEpG8cY4`IuR{cz_NJE+;K&ZP|h+ueMz7s zYjey1KVb~uicvM-oq^6cZt4Ik)?*|vqz)w-!(|4hYvaAm*tN#3iY8M`ApKL;Y<@#A z4kWn2szE3!lnlP=N)e28hoqSko|*gCc5)b2P16F(EoHjsKt&alLnKXYwOq~@%XQT> z6693P%uOZx`uKPcJL2l<desR6NL5s;z>ef4>gc=LIV}5pKA+8&&2(DzvLAW?<rNz9 zF##a31E5^kuH&>N1pw9HniE5w+^5F|w15w%)ClhB7)D$jO?d^Fnvh^7I3jU-d2xNS zGTavjsDKojpCf_wKA*3uVswwfgwI^iD%_H?Slmvg^T~WZy*N9&xVXHU++NSBYPCYg zm?_AEN9J#E5lztc@Zj*G*R4_xPPJLiC$~3O=jSJ<r{^~}H<Q_Xa(g?OHiHy>zn)#4 zU0z;XoE@LSs*Yf@LW>PEFgOEs2}w3wE9l?KXpWp2Sb}H3A~tNY42j#@+smWlW#?Rx zSop>#tOb`TV^>8q!@(f&WH5^pPR9hP0!lAP=736$G)P`I-jeC$x@x)>eka?JCz+BR zpp2lr5(;(T0Yz2PPI9SOf@d(05TG?kWEw_sOEkzz8e2^&q}stttp@hT4&7AzK}$7| zB8LtrFk2XoS4LMAW2hdq6T_LCMy;>csQGIRHoVSAmcdg1b3<9+M<YJVolKyDY5WZ2 z81%(x>_Sal4F-6lrSZ;WSbCQ|euYUtjEsR)fGiG(j*9^amP8?jC_5h=F)7Lf^mKXn zScW?_=M#-AM1w$8x+iY>WFCmk08U61&`+&H!Gsqz_dW!#2>EnE3W}?R<U=OlmHZXn z(V0R*w>CIKh_jG0VIG4u9P%ds!k`W&?uZMFNaYqi?93%bx{9U1oI?25h@KGuHXy1a zz(Q7JX>6WDDj&h!aA>PzuuMBnUW_&9|KJi69sw4~02xjUaR--S#gc=$a%l2{kw$$J zYz^e-2Axx5tqrU&5Qp&CsH34jK?C=OwSxb|w1aztS_1m%`03F>CK&h;9TFxGQ{W6x z@pCbyRJ7uzg3NXqw|MoXu23r3u~o4{-}F6#dZh$+IT60*9a;bl(hk|8L}y1a0ZQ3O ztyNaa2p~AUc4+L=7UT($(5lknr(nKkXS6grxe)LL%>fGX4C%C#PLpca1G-8(k8K0a z5_-`9z6&)7G&U8Lw2Fh1=;zAB&dDVyhyDbgre8yf!4S5zDngF#Z0fXe-UHJzDiAu} zHP)k*$tn#@({cJM;N`gA0RL$f1HiDj;D2IC8w%PugAzeN(_*x->q?3!9+!}GbZ|I^ zP;e<=>?kSM^Ho<Zt5w@5t-q@<6XpR8M%?seo#K8BSS0INLjs*?ZVa?d_8IPQgrgbn zz?KO*1QWa#pqRjHCBV5JO^?#6tb-<n=5gnj%Zr6Fwy%e_@lI+^(rv~B*ANUr#go0g z8{-tmZUsQ5^%<RO2s#}5a%W#RU(nPIG`8GuVFHl9(N>M|OE3}bz8cR}nBeTj76W7` znb70T05Z0LN7Yb`s35EufcmklD(yhTUCh>i)Q7E#1U)d*6&;=27|YHPZ^fAj0xwS* zF_q>{BQ?N{;5yiqz|jnEFjTTp{<T&|%LyQ#iws(hMiPk#L<d!n9miogpUu>O;ya)? zK(ewl+|RYHDvi!kG+QBUH}Hb&oMA=*jA*VSqb1E}aKn`XRu!mOUm#Z4**(0yU9c|$ z>fyAWPNtyxQyF{DxWsHQJG>Tw-oR-S;%FNkJeblJh+-k(&=BdkpQWvDZ`L4aUS3=e z09!)VHsWE%vOcm&$HNKET{0lsay(Tirlb`FV0w`B?Ca_)W1NZ@%h|~NH6Y`8q7F&o z08_?QOUnxib#2gI4ZuxQ3(?oag8}<%Jrr6jDS#(vqD0rb&XAjdA06ACnF1P3WEubx zHUves_-ehL&1N+*Faca5`B4oehTzdQlv8w+cq3)-aDl9P?#AFA4c7AU5b#0dJe$%0 zOADAfICOGx<ADc;!evCjTv|D$gccMv$0baJHQ4MHYtWKYWK4k1M3@GH3K|jCKJX$J z2(J&V6@%&rhu;W3QK?o+166Fi7=VAhGS?Fo&C$*%H{iHCjO{e)$AHCwu?0oR0HU!@ zsi9W|;Q~>@7Gp}5DPVuJ=u4;@RQCG5#>OAe(mtIox$_q+g|_KBH0G>fj3E6|*G=8D zeS=Ti;=ej%uwBnAgSyk}Rl8Wso7uWvEbG;JUGp#1O^uq&x~_*&{HJM}ss_3*S4~rO zeS_Qc!!-4pc{=OU)5C-Fo2G61mLH_9nz|VpM8tK|cdKfFGA(Z2@*Reu$B5MpKk#fe zySTVGyO@A!(l*U{T~$>pl#soEl2R{a*LGdgw+)`7sjH^x1|c~P>-mQKpjEY8ES8I^ zX}hMW_}+NyhVRt0eNW3p-F0ovoHTwMh;t~_^&P&@)OgQs=<1sbbVe<jmPeMa0tlt+ z>*WHZ>E&_-0HIpUW{df%@5Rt{LtCTK25;0<ZPT=14sz=aei=koNyPVrwh%n*0P<Z^ zRjl36vChT1!Nb+-s>T@bSakxUg|X@eyljVuY2^UE96oi^x0t<kg<eXl2M`(sAATVa zq~q;Zt99RX^%~P!t*@^a%b~*;fC}=`<)bnnh9sl}*?+ZMt*)=GuC6PvB%5kInM~>i z6rS7b+necRvaVJ)*Jl`|%ZrPv>vq7>!WFyzbq#bS`qcNG1o(n~#ZV3{{uc`i6hDlA z$1^lk_0abNuePool!W*IQPZvK!9Y?7(Xki+YihySH0WT`3SeW#B&`ZdazGRf1{}N2 zs9wu4Nd)YvxOx%1f&GSd2*;FM<VNd_0cHkR%n5vNI<2Z&YH}u_p3q9~oir?l0W)uz z9;JdG<#~{MICyL^=(_LQx<@rcp-Va<K{E;sZ%By|ib4e-SP&5aY7oj)Hfm>G)D|E! z3@{=_Ab$vz3`8FmXQwxlwwAJGz%MW?L#&eIOGbs60dF7K4uUL=NC8g(v)lIuhI*_( z0r!Xcjz)I{oJIzQ?zBehk{GICP=nG!mku;^ffxWj1kD@KOYlztZn}gF&T}UYOOzBI z6^+tv^x)J3M;Q4VB?W~x2PBxiN68042Jl65V(P_Q;-!Ndo5o^BlpDA*pS={)6x*_* z-ucbsb~>F*=j&>%JVGeLF2G194YaHPTn~t2ZLXHHRW)2rr_<T02^m<S)y&HX6bf(Y zs#>Fkr$ZC+)zy`}McfUvl}c$=v&CxNt=ATcE{rgNj)Ha)#Pm$QwHnGth@-8K+S{^Z z0unfOsDXM%lraD+)&N75b2^>g!an!2>2xvhl5VapFOQC9vn84;B-?DCQiT6OpBLBz z-VC6^gA@mXN7Gx;3uSsa4C40YW;6+GOgsst1*sqfm^8`-jp$iApmL<CC~P}cB&r~b zbG2GF^Xcv7+41i7_}M==zPes4VBuG@=@dI*zFhZ3qw`F3hLoV#;SxIZos+U!-prQG zKt^jXd(nevtf{n8uNITZWIz%JnKR{?38OVg<XpXHK2yd|7mG!uz+Go0FyyqT&<i3V z4-O8FPHz`$m}ahaK%%D@<<WL-M3D(X1c)Y+Lkk+m2WU4$h1zAXy@j>GgXYF;YSTi? z#Ue!^u8w<ev<d)wRB|>r4UsXl79rYYiU7CL6vu%*Rwlxt>=Wx=xe{ZbF-$NH7#KTz z@<{m1fW`tidKv}{X{&E<F3-=QsCaUAQ7@Lu1{*kAZ-ir%l*UXpqA3-~HV4h1e$Z<m z;f+a%;K5Ht-xVPBS3LoIlZwzYi7?6}G(eSM;1MZKF|{T_UI@EO1rRF{TWLLL2Yo*c zx|V?%K`smi91<A=@iV}!31E#tcxAW?KaaI}OOPl4i6^HLQ%=ysvmVe5Aidx`VATZC zMIrQZwOVQ=9kXZAjmBJj=tI^B7dVh<dyA5wb6_zN)Y#yB+req<Oob+8(wy6H?FtL} z`f6`yXJ_Z&_>_f@=Ee??EAa*|JMw|FQy2hOyc)Z$9Ol*u^fobz(V!-#!RHB@lZY|= zi`qkLCRk<Cm>)SjL_{y-NZ*4Y#Nq%4g*ke~Mo(xDh$iR6<!Ua0I(`@(G;Rn~9@Py* znHFOJ+C<?ROi-+PP@H2qw}5HFI>mZ`ww+e+TY$dciIN-y^9i&s(g*Agjx?BInZR&k zv>}aZexq&+fsI89MUbXL$9gMzA#Fo3F6Z+(c%}>PT4I!PHl4O4rGvC&b98WUwmZE% zmxPKc(0GiC4i>O7GLhiE>v2Z9>EJ%H!Hx=O-AXQ4kL_p-Ga6-$ZY)_~VvO!VQEisX zMb&a90}jP^BvCh#(ok}YtOI~Oj&>(5F`3A`PQWw(7eNt)Y7<WpIt&1p_=I*U&E@t| zoa8z>3odBEvIihOz@xwg@pS=IXC!Zd$sw3a&{#_JW>9iak~JiV6%hD+0Rw6d(}-Cc zRt?HA0UEqNm?(!m7SS(GP=S<+@HQSn4OWYFR-g*yp`FJWJxDH*(7b_v@o@WCsm5lA zR3$J697rZC>rv24*EGw;LMYF2p&3q1v7pv^y{4*0TV%v~QT@r$A@<GQ-v0i<!NK*- zWU*fNbu*xaNE6fedTyL5=p{jE$%E&ItTI}Z|4>jw-NVUYs25OXy}Z1xs@dfF`WjRb zFfEEjFuPpNrsv4GSBs?}Ahh7-B7TC_lP<1auGUrG_VAqG2OzLA+y~6Es{v|T=+Ddn zT+!e(x)CU{Y*c_2Lgu!0U=H3fiPxh9R9`@s7VWW@)7j1S&CL})!yq&&qRO+Ob_AQs zl~-0_WZL@3ALJqr2qhO67jsUtAkdP$3keKh$NG~BMY*8s)1#xq!}W3|KvhM+Z^+DN zvsPQMC=k`6qt_tHKq1^vz$OEIs(;nmv^1(*ctr_j8wEs92|`7K8no&~KX6jh>!R9v z)uWART{jgnF3a(lKp!fMGdgB18n~57qxMz^6cW~hwRuoNlQL3xiI!Xq0=&_Yi?3+? zHlR!Z2Sj@n4J7-4JGrp>BH*!6Ge8JvP@$U7?No!b072lL(Tos*d|OB~wVYu!U56x( z(OqQT&Sk?IM3M2(QK=-EocZYm^N&3lML<lMY0uzD@ftdF8YCHcdwY8h(#GxWbX8S? z<a!W*aDswR)_@I^0xn=-v8>c$KHJ+JKSyVMuaIMQHu{0fo9G?`9tN(1mRRaYEChCI zr8^yx&K#D5ni4I<$G|2CBnO~c-bSEr%$&|PW;9JQ;Y|)uCq(;|&tCQj$kaf^0EA^F z2^QjnsH_7y9|C<sY5_YBdBkLZhXKdeE~N|?hCQJnnxIvLtN=O>P%}i=1|k<9&~?aO z9}``#yMB}aLQ^~Hj|SYV!hN?OCKQ!WeAP?}gB^7atbd=7fplFppR_fnnb@r$Ur7O5 zFm!$4hCYR^!wy)St=s8x*|R_&V=Z_$(u{&Z;U=K_$&QsU43uGzky!ASC3%WB@cn`N zC!r<)R41Cq6+X}PWZ;cxx{V=PY&PO}RzN2!YxemOv?NgJY=Z8I!xDn{1@b%uXDnMZ z*7X=MGG1B8qXEuDqavVa&>y&g!jJeK&{7i&6M1|@N`(H=@qXNI%E2Q15m`(wH1^Qu zWw?<XS9Z7_7<nNE-?lBvF+^G{pnh^XUotPD=Z(xP$q?BUWmIe--|P4WFp;7cJ@gEF zpc}Br+>L9YJ^`%~P2RkQXt3TOjBvdXTdf4_Fwaa`?sDd==DYp_@Tr(?4CWT#-D);P z(Qh&pBo#YP0K|w7N3<E{Lt3AhB+c8{mBMgH&$N1k=t357U5wWuGsmu=)}{twRL7cJ zUaJ6$g|S51<e`J>E%<o~4T!R@X1BLDlgUa;^y;IdLDchkh5M-aVqI0UgMECCPUq{z z9AtMyKB-8A(ngmcHJG_;i?je8Td2=juOmOQWx6XCB*F%GX2UqB(W&^X5xt<14Y<-` zv1sbL?}nyXua>pYEc?KW6X4Sc)Gh@w?Vy!vixH?A!LqSv2;_K-#ftFg&@Md^P$=yP z)pyhBv_<W)Z%{pvg(s_oYHcMdX;~ZYSwm%tMy3g6W1G6^WM3Z~90(23s9=@D+C$+z z0d!>w5_T3h)C8_zIfP`0vm?JYq9TKaJ&O(!-~uSzE6Uht8ANyP{UuJFQ&&JO_c|GD zWzK%kK8>Cy#i0-tEnt<P4I5ar&KodTz_<&JVGkvH1VIUAN{bWzT%N6_lctkU<Or{_ z0j!cF2d>mx<x~#{NJ_{^SQ?Pm8V)#vaf9elYeLh1W`YJ}gjTZGu<GdP7|`L#BxC|t z$pu|d48;zx7Chd-Dq_Y2Zt57fbfC;JI0!hANzZ{bCnJgwAnnm>@Anw!8#WhcyhR5s zv~#2o;2g{<Kog{#PfBo*wwO*QtGaC)8NjD=`uh5E4VZ3mJ6}qvtHr9WR}JEBAg-O` zMoSZ%9Xg>^GKh^{>tA9}y_E7)HcTZ(K;leJ&h(=12lSE6&rXj)f;u~!Hm&ys=$vx_ z^~hIK%j`2PGYVyJ(M4HCc)?qQ@`TIDXS6_@lC*ZSS+7U{Ig`feffHpEII=MXkahp6 z3p+MYj<zU{q#qa`2~q#1sr!Bf>vzJ<@2H9o!vN)dDLd`+<zhacRH%Jnc87ror8u}| zkQWr<HxSREq-PShLz46<VCAuhKRVu#HyDo+K-UX#x;9E7L)HVKzeY%A(F1nCW?`OJ z2b_035QqgZ3}|;ibwS1YvhQo?fTDa6vDZQNg+E~Gk8`~V8f3~?{J<JejOqC>YA88K z4>ZUVQF-(w$KXu_7)GPwjd~S`(kx_{xo+gSXPyOaOhPkXe~m*6i*yd<;)Hw~jmFS; z^XNb`vFMEA1U#Kl0Qb2QE;YJaL(`@ZpQWI<7}beE2EYl<sla#!H#u_p7f>~&V%ny; znajFY=wR|nwT>Z9{5QNrVpjv=HfmMTs~AWNQ7sN{E=~>(u4hxN)x2$uZ>>xtjSoHX zsRsBLLW*1h%bx8Nf<t3V${M?m#hSsS3nO_M4B-OW05eEz$x*3xy<Dwk0s^QANRr3P zBT&Hnc<8@ikHc+29#Ely&~tye8CeR}>l{XILxxToh#sV1B^iZ*cN_(25Xzvw3fsv; zfgIO^z**!lkQfNL(7J9Ku&@b?F(^SLP*Xrof?Z(Y7$hq|F?C|jlZDHG>L~keG{!Di zSv+%@=(XrvCX>m@$?56oeBOb+$kBxN+67d_4B^r#pqhxTp0QBDB+zBk!Sl0F4UO6K z0HhFF9#&iQlUXdV(sf8XWNlysB`KWmvD$xa+CI6RRKg-rS7NnX*3POP;=Kl0u>~YX z+EYe*CG=_nNWGvTXf6kWLQcqUuw*=q3gKJ=Jh>!1JEkHkd2_vN$c!L9E)qS;gABDJ zWhj9n>meJJ&_VzJ34L`MszBUxjFw}Eo**=dK(`O$ZFLW&VdgAq32niyZ=@2Db%l~~ z_U!cR>`FmOCu>&JB=Czok0qR3UvUMc>g&EyCBgwP*G}{XvxDwslELb@mV%sOA~Et- zuTw^luQBu}B%}ER$c=@K7-uYJt<kn=A#7w}j)q2v$&D;khj@YoB+<v101q<R36*b* zClpVN4~bj%LCxfTT9&#*2{RRth)EH=u>c8x`yanM%R?jGE64?{!CEzOfK_fq+t%yV zYH_p=^|I^fY|$z<8ATY#0zpAU;z^Tt9{rret=oERK;`3Mw1v-YPxj6)ucq@gsz8h7 zAW-ShB?n`xs#1gKMW9ZgRshjDRaYP*D>aHYb567xW{VE`e8|XIQ82nuC&0sxK)T!K z2(JU`N;@oW&-VBBcD8qRclVI#?eFg&9v>sVzP!A?yt=)e=&@sny8t|=bA`L05CN)^ z;S5IcXILo^f=^CvZck77G#u2aqcKb#<>Y|TRiy%#7tqHFh9$Hy5Gg3cn!yLTS^!U9 zuh$UCp0M;~PAqg)M)oVOChW}7Q2?+)O2>j*uRTzf<^8!85iNiv1rC=jbD;bvn2el( z{nc1$MxKXia{$K3(M`_KfN&V@GREpO9%q14XvW_Q5IsQ09Tpp6SKvj4LE*?w48#b8 zL%zx7yVFqsutPpX4_&=p&TbZ~*?c7tE-x3yEOdS}{?BnE`W^!2#GY=Ha(DPsl29i? zw^-ZPjqTf3Xmqv?3m&?*U61W|*mW*>#Dj1+k+6pV6@mgC(IjYL>(LDzQ;wJn7=vMu zVrZ-NbaHWVa=gE{yAK(P!=vK`$ZO89m^LyvTneuklm#P$K>ah$3&Ob>8W;kWx6J%7 zkc=npjR7PL<AchBgGM5<4hK>!Y7R~~t;cK(A*g4aK%Slg%shtVP%Pn7DMoUP<$hzf zc}_-#z9KXuIp;Mn*toOh*xMH^L{IQIg=|%==XKk*R%1c{bh*e124L{!;xhV9Jftk} zWWnMYxdoKlm@IniiEwrMDyAI9T1oUe0{0G41B46~$NXq?g$+_b^a%pQIM*d`ca9F1 zm$eTGebyO~ndb=8y|R?hMr6jmYi|m(4vI&&I~+p<(+s%+(+OYC;34GlkgI{VmN7LG zuhiA$0+56;(W6uc8L+;&zSaor`TUVwP_2Q)orcbUfa-2aDOBsK>EZD$2lbKoR4>$C zF$qvJg{x~J*A1~9vbt?s;6{5VCl^;Y%%LKft^jtL1@i43*6T1RuuL$+A-p1}2w-@# zvT}lt{N6(^T2h%CzzilTA%=}CRE0_;xc=Y?MF==U!NJ1l>d2~y0FQ$M!%Kk3jYgEQ zk3mVn{_OPhY&yl)q{TU5E`To2H-an}%WV~S27$e8s3g(#&>FIRgA$2=<PVlBv*$Fo zd4WX-1krPP#?(^oLJYu|F>i!QsLJptq7&5N-N9^id_)M0CU~(L{fdwufRBf|d&V^j zOsFXwBk++yT-|0d`pl}mAc83=0Jsv!4`^rN^R&>7-qg)<wUQ$>%(|i+l;_~+2rHK* zS2g$PBZy$bhaL;W{V=w{51P|D>jGMTEab)5KWba8Ze|k<3||g5!a&9c+obP1QM46& z7)EiO?kd6RRZx9KQNkJ_dn{ShyMs~^DjAtO&e5ZzRgb7o;MA469avAisb}+f+cwY# znDm2i3S8ajwSYcS8I|?O7+0&ly}rD<yu7+@^;q445H=tDlkJ#Cc+-Im1B%G%V1I{? zY}yBm(M59Lw6X%N7Rb4bs8%bsY6FZV$`|WqJ>Zc`_9#lAYLlTF%}8D7N|I8deH&;E zH<>#i-+jgGk*caQ0EXnSZ#CS<c;Z;m3P=;fR9dNKy>9v*wRuNbG!;tQA~5z5%eY}U zvGIf>z7o7qw4;;rAeMJ+C+5@HbgD{cJ<CP~0)T{P!HOaaCihS`RlQy=W|P~?)6=u_ z%d4v!=o-&wb3SkcVX44uDJh(aPy`TQvx1BbrX1@bDr_(TMHdsbHIRTC6go{2bdemT zR^Y;sf})y?0*xh4QT1-Il8Kch%TO3|N9fG>j6rm#y)qt8?zruBM4-?#5}*tKX<tTK z8D!It)JAtHECoulE!#-RyjQQ3bpWp{ai~U!ql-;|f8Z63TrFQ&w>|h)HFKy1>X<Cd z3;RS6Ahek@w}UHn(M%`PrdoHRYwA`gYp~3s)Ah~G<<(U6BA_1+>`m)frwD)*=yn56 zI`n=7*+Lx8A%jA(FA0TzwCEyF04EnixCY1sb^z8a*kT=0bUjvF5py{(ClTo=oiqv# ztMjw7ef}IAw?Y_hByp&lafuJEhL5a6kBgD0czZT(MhrJslc7dF%K0@2_0hkg(AFBr zEk}>8E+D$GSTXeSc21r-&a%8VoSR^RVTlr=4uWSwAsEG6!hqxaz{KHB)CT0Ln_hLJ zvKLqg+1PBNCWn)a)CvTo<>YoUxt-1U)W)mp+omg455%SlW!3TUC+&<d3Wq<zF2yme zKpR-*V^+q_dTpb0tV95y5p8M&twx0pbXT!AB`gfOEr5487`-H<mr{v=k$zTQlthkY zCpA!QydXzl=#%k~_;;*DNfPn2i_wyH00cpi(Gh+MX^0=dK@><7B3zl)$!Kq_s8*dA zj0SCPwOlUt;bwRC4vwblH8^2HYD3V6A`9JzUJPfaCntvoSGSX8H<Tjy(6kH|GNSoj zpcw#*&12_*jb0;vYo#2F03XqyW(DJ}@Ji6>16TqM$N&yp*RR@D)3svgn}!cW1le&# zmXMyX*n%6?xDp5I5Rr+@3nM<lf~B%qEeCDbXr5$IFCg67vz7`PE6I3hk83zhPLv_E zXy@~J)h-su7^b&3b3PbySS+TK$!t{%xmq^srgDtGqWc#_YosJ7sB^oRBP+XVxm>|r zOs6X*1j_NDMrlP3ZJ-8N>beGB0B2&tt_jwBBX~+i7Mbd?SPW8e-?1}kxu_2g))h35 z&<JYQYcvd_$~B7n6T(TZPK{@ekeARegDhr5Zs?1ymsN#M6xL}fr29T1pYn>6V`MiD zVl@S2Xr-KQu&?DPFs>cbIft%k1gIO<q7@@S{=<735bny6>VtEvP#;AX6%>%ri=&9; z9}8!wnh)~Aet@hHVhMo`X$_}gj2gEVKyeB0h-*NY7i6qKN|t+o1<6crM8QZ~RkF@< zfd2rZZ<2+v8GP4|OjB(g4i1Af;0WLIbdwyLxdq@O4apxd7(5ZQJfW91o}5T3@X-om zdj;!J3N84=C&Ur>LC?CMc<ZKGoqVUXC*Vh9+w^r0p;nx_I-k#`pnVKzO;seS^=h?l zg|=NUHIqa6ObO6)*G;FbZaPkgi)~iRdODl+W7cQN(69Oyl@_beZ`KTbqoDL)_>i~? z6+;VU%mysfx>Z4o7Qsl(NIlMzFdB^%kaeUIl5!bL2<RIZoPgU80!kPfoFW{9(Y6{& zD?Op#NDYumlrpjS58y;FH6pzNeGVdr(Zd3v4=SN+vEcfojpU<bqG5;xiit>5EW%=r z|DmY^{%1rZ9$Lvf6ousg<_|a1L&al2qXG^6(AMkud^(w8U?4II^C*<Oyp&=^1}(@q zovR-tL?d~ZIf=#<1PC|+3$MxL2?3=t#N8-C6Q3IlaZxn$BM2e<0*W|{RKp{&I++OG zpuk>LO(THZamazD2`#XEQ4hgMr@*6v13y0yl*Z95tNF6rn;<3hmk0+uW<K-AM6^Yr zGrbrvI5k`d>+`FCNC}=+0oMwa`vnlQKvw`$+n=qwPT~zU2hn6AiPhrz=0<w}fDth{ zpJu^q67&-Tr57M^a*q{iX?z|Iw{&sn;8EPgNt7&dMA4%JB>EO5iW#4MjM6!ncor~Z znRmebTpa5g-)YJ4aW95jPizRFnIZG#K0gGh1+^*U9Ckb&3+$3nI*w5ekYdo?g`);W zHZNC?UXQZm!-;IP*n(WK!$fhhPjYZ#JIUS7&a^0_@JYF^qF1J^tFcYPNt`jppmzWn z0YnFdetI|dw1a;ueJbekv*<d9$}{AuSaJrzW^y4FtSH4I<7q?`Sm~;S*EDo&>%n3j z@n2RYM+XzAH;NdSapR`vTwQW$!X>=732?3`aPdi><Zw(Bri|T+bygPVQP}JU#301~ z$qH}*X$4BPhQ|Sx;tWUlgoL+v%Y`t7A4Y{<PW#H=!$Gkq!B}oj#A!+3{C{@@BDJ)t z6BO?=!pc=dGr1w5AYY>pw|TI3l}ED3^@VVKeLX!p>-%-pLlN`*YC7-QdO4p=7dT1{ zOn52K*qNE(hmwdL`)b*(;{XjzG*10fOs>(~Rf5<ZVrsk`5}#QM?rd>h02%_Pq{aC! zmkwh2@W)!W<a(UNMF^+Mcs>&gy)tHwGinq<M5IFi<!p8=u|06I-Vbf-G0Xx6kqbW< z(H@<q9%nWO-YTW^Jx&ioX(*%N5y)-f3FNvZvI#y(L9h5|4$C4%sG&M8?Tq{=dSzBX zIhBvD^bmuAf`Mgk7I_60%ctCqD=pH{C+xOpqXa!1Oj=Y|Z6KDbMVp5bAVF~ZlmzOO za5BoM*uaO{-P~MXUoRGGVM2@=9F4we+tp;+57rnyyc_3YqQw;QX{dY-RfPiAVp+9S zkJk*W3}AG7bcyy60nQwbLN?Ir){&8B=OSJqapw~sUmj?z4>NLsDTu&xa5hrm8mY~B zJb06Zl3w4L!=6zBI64$2Acqif8WEcCA)m!SFHYVNX!<eQNX0Bt9I=U#h2s-cVF+=q zjlmgnkX?q55?YO&D10>V>(NR@cpR>RT5WBaUcz-Pp}>Fv41(m@;K7Z<DID4cu1rk; zMPnC7Hd94&29LgKR`-@V0gWaOsWsX0v}0E9F>LKnTfj-yXj_1dgoqK!E}+Rcu(U8t z=+tE~gOsxN?I6!Cmkl6x%}}=OySA5-PyD7~Sa-}lu>dK#TQL>yB)YI?2RP_r|McSW zW>R$;974V+%aed7=uz`Qd#`5<iBG$VIM{@nK@_rbrk*fLg@bST*l-qe!W*)#6ymY* zJJDJ0i+F8ZWbt>0{G8D+bUAk&OUM*<ni0_m<&mJoD~&aCRdE?w8Aym<S>bpgGRT7Q zd}B|t(R`|^#mUjE`>8z0f`N^dS1gH<nWthL9uv4Ch?8hi=H}(Gu@n#_9y!{`@jJSY zJ<6&H!gL5&K>A8W_B_jm><CChAH!+Q*eMiTVcb>7iM(Xs)r@MaOpQeIJ&c;>l4N;3 zflG0x{2)Yy-T;UVBMqQT9`wLs5;g-L*i3w$ht*8PK!Zt(F30tnMI03l#Y-%l6R_mI zqi^F?wAOVyS+!tHgM5jN4;P1%k%00-Jk*X-J%%-ClZHEp*r$bGOb0HeV&9Pu<6&q% zjnHz$^3@T?&=WL4FzW_pQ1St;cxg_aFkdJSM4Z$PLl~_F34<{YJ}Ro|9Lv42Oe|%c zZB!Fi-oVSctM20q-PJxwfuzr)>&w~_E5`&RWKMOft80z#bQdKmYvT$MAeI3V7!}*J zqNeLx)EJ@%Em{vnM2HxYKm$QcL$s)%B$+@+LWE3SNoMjgv$G%e)6O~foO|y4=YQw^ zzufy_=J%Wb;lY;vF{|hJrQ0X@Dcs$41<V647yRY)3IDvsC(S?2s>_IdYWv4s%Kqi& zmVPE&rKAm06S(CEc5LG(8@CZiK~Jx**DX}{+&yxoWpzDo=l)>E7xQ<&bLGhO!5N!# zu5C;1KKT0;d!cpdE4E)vZez#5OB7F=OSbN?2HA6uJOj`q&njr^8OJhz_?6&U2{ZBA z@YIHhzB1bEp3{Sczv;5QSY7Y?Jb%H4;zG8qMQv(&_aiF4{n?(P8_5kHKN$|p=H4$W zz5KyXsmJEt;8WJo-ybrzmt3Gd+}U!V>>+*IFUL1vS3bQ4Z(Ulr=g8{J$Jgd;GO^|z zT+`mR<xR>+?UAjg(of~y{ovf)o3w_th^R9&J6kmHX!qB7p47ujs>K-(Z<@QV#ni!x z(&KG|nH>z#tu65Ald=in+zspW-4E8Gi>h1BK>xR_!!)Z~d<WzHeB*`n`ObsgxBm3L zXy13^R(kgNi4V@lKh8C81G8D#8}H0O*2s6-7v+7m=9}TVizTilw>O=*Te9xy&6S%^ z8fUr>znIr@=p_C98MQex1*ey=tg{2}Hl6=KaU#|DcEN|elfV1t`*->a^8ZTo{^{4} z@0cHYZ+(4isIB%rb@TSw=>_-qZ2yaHb64ii6JgW4+SM;i@9md48dTfIPn2}|4F6NM zEaO$#CyO(?uP>%?KS^B<uS&a|_=l77t%n<G7cBw7OSiCJ&pNgKlmE|H^P>IFUFh5j z`sB91eN$i1)s<}cyko3vd0zgWdg>u_Urp-eo)fK-vL*TJ1{WPM(_7yCjb*v&^r!3W z{YyXn;&r*%U%oxf?IuZRyTAM@V{u{TDlOO5l~hQ7x@T<s@7HrD9=U(zKY!}*D1b)p zy(UGziMTJ3uy_bigNr!ObTiS9>*T`tOGwq$;+q9UUWUjZ502+@1t}>UqMvtZ7gGI{ z1ynz=OAtTJoO4P@6zz=MzDUQ>L`~#uXNyk@#F}7X)Wc)~w;3?e0OJwT?rH@CQmRFT znLQGb2#(9BEE7cd(nUZd40-SSrl~Qn{&{mO%pt5IC_-zmu}?z&JSaGl0-%G<bn?QR z!kTGwc+hi8Bx>|)VS%vXDI3^gWCN&-5q2qHrit+Sa33B8P%Vt(ROdouJ&t>Fz9J2^ z7i*kiHI5GvsJO;0H;I(r(beG;PJEE4D6k3OXcHI;6Kf>!Bfl<(d7N9}LCi8GpN;gZ zN{#722UlW}DM8GlDrKiHlbCA-U$3dM`N?nJ=9mKEIW;@Z3(6D4sNSqnLR~!OD95w6 zvdm6_HV!-e=8Eo(F=s+<br}lYn1`sX50Z_g;c<#trhoKT9Ti;(BFMaA@5BSa-%pR% z>R+o$#fgu;tnA^9J*~JiOHG4(mYhdX2GU|3<C#*x@Ds2~%?Cdu{W9M57G+;H^LwQx z1&++ie`oP7?+tr$uCR<9(_r&pkHzeJ!nFPlwvM7SjH3DO;~TcxpRT}wEdlmssJjna z(>$cBbADoJAKcf<v^HLaC!edjX=C#9N)0IHt(qS;B3TE1rg#^If3)uSO5Wq!w^t`+ zDmOA`%}glZpm6E3`bH<01?Y0jzB7`ctKAD1;?Wtz3U2*P-|xfBXWzo3`1D!bmqGNK zsD0U7`tmOqoe{)TRtY*_%h*3$@5>h3PFHBP-)dO?06aS9w=4f>%SG~`HDdNjcx<F# z3f@0^RVUQCh3dP37COGwj@z2<PmzML98GHR^z}+tj`b?KiBbxeiIc6lf^miJhfSX! zxaxFVZA{YOj}z)Evn+oA<rNEZ_TM%6k}7B9Fnw}rUrR*~^Szo^&g}f3Q0KCmb4*rl z@=$bv<!yhC-6!iy+eI-it~oWN?WLN{GcHpth#^B`v}F{R0`n6HhVi2fZ_n{g_4N#& z)&I8e6u3vXL!jMR-^WdZyk^s=(KgjNx{{?V&8K3-f^<60!K6y-CJ$!hp+kdkjH=m@ zoI8OgHf#KZVN-H*rBOkHCc(aDD12#k`fcB&Z8+WpyjTByEV4H&tjks>Xy8e9iNvq> zOi^R91F>u^3V!YL%(cPEI?d5V40V`?M@X__YfDQ<ho<g-pZ7j*F5)3Yh^MHy$a6G} z<P=dpQ_Ke$jOKEBIfJ19+ZA+>q1ajumWRp}&0*fM3ukL<-P(9lfD_-Sj84yAxRB1K zGZZ8Vj|`=QbVZ0bc+c`?7#?0bV#1AJd$>FiY%l+j6tmNfjPhg3j^z3H=)uXLb-ZX2 zErALf&2LP@Cd+Vi)Dd#@BR<!2hh@OwKpeU=KhoRDwC!a2t>qEuahsx}qoXw|wYa#* zP1JD+P@K-7gJK3q1?hC6p~=utYrat1M3izNQVL&K=sX+^mhb{c2)(60qzgH4oy9Sr z8_?+n9J+4ZE61yT2aY(f&;XA@766eI%Z`3;Hl!)rI;tOZv?!||sx%!fnhvFc7Y>0T zd~_NKy>h+M>6XsqfkYAMZZG8XxdK4}pGS7N+(1R3g3sqymaKjK$Lv0VawIP=J8wjq zEs$=^K_018Ewz%@p%ke!PcTcGCrwEa2=r$S2E$pIcCbmNbsGXQ()-@zCYymJL#AS? zk75-dAL4Nf_yvN;Ep2UWq%EB9O&l0&#@{~gf4nx+tj_FY4QF}g$lN@4z4fB#;K|O{ zfF+yx1~#*@vhLoyImjJaCXgzX(vgw8?4tsHx$r*!*s=S{);3Tm9Pzm2*QbtB(^B`j zku=ItO=l`4KF$T={c<8m6-NCoyHlR87DnrgBn)y;&nAp!xm(j21LW!{)l{`I>~>0O zCB{ZLm6Do@>`hC*=5qAAEHANv9$mwriu`w2rjkHyDwVQL(W>#;2XXztXpx6NV|K6J zsj0$3VUqvpH5ggdco2dDSU}II!FIVMX{A0cgp;oFxJ~mWtAkmAJ&eWthYG{`=aA3u zwur;*n&6<MRqK}U=n8xcQpFyqluA|9@5kOwK+!gHgG6Fr(}<{%e1E($%E3u6X)Y&U zjrHppgtl8EA-n;J9G|v`i3lGL2H2$48N!b}AS6Jv_X|*6Dr^tiM<jA6tLioGcj+Z; z8t0r^ScAoE<Y2%rfsuGF5XCHd25C2*vO^KaA!r&qG}%W>Avd%Jw_8F3;E2PELU=D( zzA<C51`7qmEC}=a?RveQk?kB2(Bzza7FkETJ?Y=`M}qzf5_xB5XG|Zb#yL`AYLH#y zGgzEPISY!Gp>;GM?u6p@fL=kmt%H@$fWDFVcQWUorUvVbllJQxA5BxF?i6CdR!t=4 z;=<~fy-_a2V%P{x4rpQlDAd4~<0D2+em<!M$FNZbSruV4iM$K3*0NZcIX}R770F0S zIoBNG8JCKbt-EQ(v~o6Er4mH!oWPP|M{d%j%N{yXnHD)gaom&Ex%DF#dIv%W&OFGo z<bSwFp-9SZG&~S<lLj%@=yY%Y+gR1=ocLK!^)y^mR21tT;=~)YhO-JHlq(iVQy^4y zJ%C%oHK@GW17LOlYfxw~CFFf6=kSVzGR<1Ns=zks-~DEI7`4DeliwS>DXb9YA}qBL zqykKfs*;4XdVTJF7>dWEiJ03gQYMlFTLarj1%wsRy}$H@vw&)0xCA29CO|`mA?Z-e zi<X2#h;2l{1I8N})cSghP?(4K`xMw`IEwG9ky4-bfng7pK=pe}}A8|X{Kj#f!Y z$9oiCQ7sg$gw2=4p0cV=0wuvJE}KXx5`~RfDoCv-N2`bu2}`XKY@w3<K>J0d!WEY~ zqY98sMuHwo4!}|w$lX)!0md1aHn6iw>Om~P<sg}A)E134#t@bY+RS6A*&fg4N)n-q zAQ<^1*>+F>wO~2Va+@T-QepK<%(Z?6xm5J{DE3{zEQ+Bh@^Pb>r?0LIdp~EX4MsK< zzOBfTh<Q{BZ0omleq_XKBeR%q`xKsEltBc?l54NC)DYoyXwBpzwdQz$MAdr8X`nw> z1RDLJgoaQEF-!e3lOiR=6;=)EMYPIjFz7ovkVpkgIe<p+)aapZt|E5*B63Fk>iy3s j^;iOV)`O#O;XCA+jKleUO-8Tfzm4!I@634TKi9ti3h)kh literal 0 HcmV?d00001 diff --git a/igv-reports/tests/fixtures/tiny_colo829.hg38.bam.bai b/igv-reports/tests/fixtures/tiny_colo829.hg38.bam.bai new file mode 100644 index 0000000000000000000000000000000000000000..0920cae52bce794bf8f956262f035179ab02f226 GIT binary patch literal 86888 zcmeI(Ax=X<5CG6Ag*K!iK_M^*OjC)#HlP66Q*aJ~C+Pu5FkAry4%s7+fT=(u(CqG{ z`Kdr4Y2Ft*`=^`z$#nO*IX}DXy+-$JmFaFjqSsPid-==7W6fX9BWjFT&ktIz8-^{h zS|es<)Il9;1)Kxtz&UUaIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b2yy94k0*;|me`M0sOCd6~;FW4^e<>c+OzDIoC*Ek+6 z#x)-?xy?Ac-f8b2PZ{qfwKd^jn(?sAb6xf~{C&UgqhZ;j>x;;JA~HW}-|mK+<2qlh z5%d362X$~SxWEApaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 vaDW3G-~b0WzyS_$fCC)h00%h00S<701DoQ&@?lVqvquF~Km}A_qbu+OK%Z;- literal 0 HcmV?d00001 diff --git a/igv-reports/tests/integration/anchor_verify/README.md b/igv-reports/tests/integration/anchor_verify/README.md new file mode 100644 index 0000000..2c4b311 --- /dev/null +++ b/igv-reports/tests/integration/anchor_verify/README.md @@ -0,0 +1,92 @@ +# anchor_verify_demo — regression test for `verify_anchors.py` + +End-to-end check that the anchor-based content verifier catches the four +failure modes it's designed to catch. Self-asserting — exits nonzero on any +mismatch. + +## What it does + +1. Generates a 2-sample samplesheet (TSV) pointing at two real COLO829 ONT BAMs. +2. Calls `verify_anchors.py generate` to freeze `samtools view -c` counts + into `anchors.hg38.tsv` (the regression fixture). +3. Calls `build_igvreports.py --samplesheet ... --no-verify` to produce + `reports/sample_{1,2}.hg38.html` + `index.html`. +4. Runs `verify_anchors.py verify-cohort` against the clean cohort (all PASS). +5. Runs four corruption scenarios, each asserting the expected outcome: + + | Scenario | Corruption | Expected | + |---|---|---| + | A | Mutate anchors `expected` to 9999 (real ~56) | `sample_1/chr2/FAIL` (diff_ratio) | + | B | Set anchor `min=1000` (real ~56) | `sample_1/chr2/FAIL` (min bound) | + | C | Mangle a session's base64 payload (`H4sI` → `XXXX`) | `sample_1/*/FAIL` (decode), sample_2 PASS | + | D | Drop an anchor row | row absent from output, others PASS | + +6. Cleans up generated `reports/`, samplesheet, sites BED, anchors TSVs, and + `logs/` on exit (set `KEEP_REPORTS=1` to leave them). + +## Run + +```bash +bash tests/integration/anchor_verify/scenarios.sh +``` + +Or as part of the full test suite: + +```bash +bash tests/run_all.sh # all layers +bash tests/run_all.sh --integration-only +``` + +Runtime: **~6-8 min cold** (the cohort build dominates); **~15 s** when the +cohort is cached. Set `REBUILD=1` to force a rebuild of the HTMLs; otherwise +existing HTMLs in `reports/` are reused so verifier iteration is seconds. + +Disk: ~10 MB temp under `reports/`, auto-cleaned via `trap`. + +## Why these scenarios + +The four scenarios cover every status the verifier emits: + +- **PASS** (scenario 0): observed within tolerance of expected, or within + `min`/`max` bounds. +- **FAIL — tolerance** (A): observed read count differs from expected beyond + the per-row tolerance (default 5%). Catches the silent sample-swap case + where the wrong source BAM was wired into the build pipeline — same track + name, different read counts. +- **FAIL — bound** (B): `min`/`max` columns let you assert "this integration + site should have ≥20 reads supporting it" — a stronger claim than + tolerance, useful for known-positive sites. +- **FAIL — broken decode** (C): the HTML's session entry can't be gunzipped + or its inner BAM data URL can't be base64-decoded. Catches arbitrary HTML + tampering or `create_report` version drift that breaks the embedding format. +- **SKIP** (D): an anchor row references a `(sample, region)` pair that the + HTML doesn't render. Dropped silently because anchor TSVs are intentionally + re-usable across runs — a region that exists in one cohort's anchors but + not in another cohort's HTMLs is benign, not a build failure. + +## BAM paths (parameterized) + +Requires BAMs supplied via +env vars when running elsewhere: + +```bash +IGV_REPORTS_TEST_BAM_1=/path/to/sample1.bam \ +IGV_REPORTS_TEST_BAM_2=/path/to/sample2.bam \ + bash tests/integration/anchor_verify/scenarios.sh +``` + +The verifier doesn't care which BAMs, only that they're different so +scenarios A-C have the contrast they need. If a default doesn't exist and +no env override is set, the script exits **77** (POSIX skipped-test +convention) and `run_all.sh` reports it as a skip, not a failure. + +## Why this is `integration`, not `smoke` or `unit` + +This test depends on real BAMs and on `create_report` actually running, so +it can't fit in `tests/smoke/` (which uses only the committed COLO829 slice +fixture and runs in seconds) or `tests/unit/` (parser-only, no I/O). + +For the parser-level regression checks that gave rise to this verifier, +see [tests/unit/test_verify_anchors.py](../../unit/test_verify_anchors.py). +For the samtools/decode round-trip, see +[tests/smoke/test_slice_count.py](../../smoke/test_slice_count.py). diff --git a/igv-reports/tests/integration/anchor_verify/scenarios.sh b/igv-reports/tests/integration/anchor_verify/scenarios.sh new file mode 100755 index 0000000..264836d --- /dev/null +++ b/igv-reports/tests/integration/anchor_verify/scenarios.sh @@ -0,0 +1,191 @@ +#!/usr/bin/env bash +# scenarios.sh — end-to-end integration test for scripts/verify_anchors.py. +# +# Builds a 2-sample cohort, freezes BAM-read-count anchors from the source +# BAMs, verifies the clean cohort, then runs four corruption scenarios and +# asserts each triggers the expected PASS / FAIL / SKIP outcomes. +# +# Runtime: ~6-8 min cold (cohort build dominates); ~15 s when cohort is cached. +# Disk: ~10 MB under ./reports/ (auto-cleaned on success unless KEEP_REPORTS=1). +# +# BAM source — two different indexed BAMs (any organism, any size). Defaults +# require env vars (no built-in defaults): +# IGV_REPORTS_TEST_BAM_1, _2 +# Tests SKIP (exit 77) when defaults are unset and no override is provided. +set -euo pipefail + +EX_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SKILL_DIR="$(cd "${EX_DIR}/../../.." && pwd)" +BUILD="${SKILL_DIR}/scripts/build_igvreports.py" +ANCHORS="${SKILL_DIR}/scripts/verify_anchors.py" + +# BAM sources — must be supplied via env vars. No defaults: integration tests +# require two indexed BAMs from a public release. +BAM_S1="${IGV_REPORTS_TEST_BAM_1:-}" +BAM_S2="${IGV_REPORTS_TEST_BAM_2:-}" + +for bam in "${BAM_S1}" "${BAM_S2}"; do + if [[ -z "${bam}" || ! -f "${bam}" ]]; then + echo "SKIP: integration test needs two indexed BAMs." >&2 + echo " Set IGV_REPORTS_TEST_BAM_{1,2} to paths of two .bam files (each with sibling .bai)." >&2 + exit 77 # POSIX skipped-test convention + fi +done + +SHEET="${EX_DIR}/samplesheet.hg38.tsv" +SITES="${EX_DIR}/sites.hg38.bed" +OUTDIR="${EX_DIR}/reports" +ANCHORS_TSV="${EX_DIR}/anchors.hg38.tsv" + +cleanup() { + if [[ -n "${KEEP_REPORTS:-}" ]]; then + echo "(KEEP_REPORTS set — leaving artifacts in ${OUTDIR} and ${EX_DIR}/anchors* for inspection)" + return + fi + rm -rf "${OUTDIR}" "${SHEET}" "${SITES}" "${ANCHORS_TSV}" \ + "${EX_DIR}/anchors.corrupted.tsv" "${EX_DIR}/anchors.min.tsv" \ + "${EX_DIR}/anchors.subset.tsv" "${EX_DIR}/logs" +} +trap 'rc=$?; if [[ $rc -eq 0 ]]; then cleanup; else echo "(scenarios.sh exited $rc — leaving artifacts for debug)"; fi' EXIT + +# Requires `create_report` (pip install igv-reports) and `samtools` on PATH. +# If you use a conda env, activate it before invoking this script. + +# Defensive restore: a previous run may have died mid-corruption leaving +# .bak files. Bring HTMLs back to their original state before we start. +for f in "${OUTDIR}"/*.hg38.html.bak; do + [[ -f "$f" ]] && mv "$f" "${f%.bak}" && echo "(restored ${f%.bak} from .bak)" +done 2>/dev/null || true + +# --- 1. Inputs ----------------------------------------------------------------- +# Two SNV-style point sites; --flanking 300 keeps BAM slicing in seconds even +# at 167 GB source BAMs. We're testing the verifier, not the renderer. +cat >"${SITES}" <<EOF +#chrom start end name +chr2 25246500 25246501 DNMT3A_SNV +chr7 148884000 148884001 EZH2_SNV +EOF + +printf 'sample\tbam_tumor\tsites_bed\n' >"${SHEET}" +printf 'sample_1\t%s\t%s\n' "${BAM_S1}" "${SITES}" >>"${SHEET}" +printf 'sample_2\t%s\t%s\n' "${BAM_S2}" "${SITES}" >>"${SHEET}" + +# --- 2. Generate anchors from source BAMs -------------------------------------- +echo "=== generate: freezing samtools-view counts as anchors ===" +python "${ANCHORS}" generate \ + --samplesheet "${SHEET}" \ + --sites "${SITES}" \ + --out "${ANCHORS_TSV}" 2>&1 | tail -6 +echo + +# --- 3. Build cohort ----------------------------------------------------------- +if [[ -z "${REBUILD:-}" \ + && -f "${OUTDIR}/sample_1.hg38.html" \ + && -f "${OUTDIR}/sample_2.hg38.html" ]]; then + echo "=== reusing existing cohort in ${OUTDIR} (set REBUILD=1 to force) ===" +else + echo "=== building 2-sample cohort (this takes ~5-7 min on warm node) ===" + python "${BUILD}" \ + --samplesheet "${SHEET}" \ + --genome hg38 \ + --flanking 300 \ + --type mutation \ + --info-columns name \ + --output-dir "${OUTDIR}" \ + --no-apptainer \ + --no-verify # auto-verify is structural; we exercise the anchor verifier ourselves below +fi +echo + +assert_status() { + # assert_status <sample> <region> <expected_status> <verify_tsv> + local sample="$1" region="$2" expected="$3" tsv="$4" + local actual + actual=$(awk -F'\t' -v s="$sample" -v r="$region" '$1==s && $3==r {print $4; exit}' "$tsv") + if [[ "$actual" != "$expected" ]]; then + echo " FAIL ASSERTION: sample=$sample region=$region expected=$expected actual=${actual:-<missing>}" + return 1 + fi + echo " OK sample=$sample region=$region status=$actual" +} + +# --- 4. Scenario 0: clean cohort, all PASS ------------------------------------- +echo "=== scenario 0: clean — all anchors expected PASS ===" +python "${ANCHORS}" verify-cohort \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --anchors "${ANCHORS_TSV}" \ + --out "${OUTDIR}/scenario0.tsv" \ + --fail-on-fail >/dev/null +echo " baseline: 4/4 PASS (verify-cohort exited 0)" +echo + +# --- 5. Scenario A: tolerance violation ---------------------------------------- +echo "=== scenario A: corrupt expected count outside tolerance — FAIL on diff_ratio ===" +awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} NR==2 {$6=9999; print; next} {print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.corrupted.tsv" +python "${ANCHORS}" verify-cohort \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --anchors "${EX_DIR}/anchors.corrupted.tsv" \ + --out "${OUTDIR}/A.tsv" >/dev/null || true +assert_status "sample_1" "chr2:25246500-25246501" "FAIL" "${OUTDIR}/A.tsv" +assert_status "sample_1" "chr7:148884000-148884001" "PASS" "${OUTDIR}/A.tsv" +echo + +# --- 6. Scenario B: min/max bound violation ------------------------------------ +echo "=== scenario B: anchor min=1000 (real count ~56) — FAIL on min ===" +awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} NR==2 {$8=1000; print; next} {print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.min.tsv" +python "${ANCHORS}" verify-cohort \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --anchors "${EX_DIR}/anchors.min.tsv" \ + --out "${OUTDIR}/B.tsv" >/dev/null || true +assert_status "sample_1" "chr2:25246500-25246501" "FAIL" "${OUTDIR}/B.tsv" +echo + +# --- 7. Scenario C: corrupt data URL inside HTML — FAIL on decode -------------- +echo "=== scenario C: mangle a session's base64 payload — FAIL on session decode ===" +cp "${OUTDIR}/sample_1.hg38.html" "${OUTDIR}/sample_1.hg38.html.bak" +# Replace one base64 chunk inside a session data URL. The H4sI prefix is the +# base64-encoded gzip magic 0x1f 0x8b 0x08; mangling it breaks the gunzip step +# that decodes the session, simulating arbitrary HTML tampering. +sed -i 's|data:application/gzip;base64,H4sI|data:application/gzip;base64,XXXX|g' "${OUTDIR}/sample_1.hg38.html" +python "${ANCHORS}" verify-cohort \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --anchors "${ANCHORS_TSV}" \ + --out "${OUTDIR}/C.tsv" >/dev/null || true +# Both regions in sample_1 should FAIL (sed hits every session URL in the file). +assert_status "sample_1" "chr2:25246500-25246501" "FAIL" "${OUTDIR}/C.tsv" +assert_status "sample_1" "chr7:148884000-148884001" "FAIL" "${OUTDIR}/C.tsv" +# sample_2 unaffected. +assert_status "sample_2" "chr2:25246500-25246501" "PASS" "${OUTDIR}/C.tsv" +mv "${OUTDIR}/sample_1.hg38.html.bak" "${OUTDIR}/sample_1.hg38.html" +echo + +# --- 8. Scenario D: anchor missing for a (sample, region) — SKIP not FAIL ------ +echo "=== scenario D: drop sample_1's chr2 anchor — that region SKIPs, others PASS ===" +awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} !($1=="sample_1" && $3=="chr2"){print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.subset.tsv" +python "${ANCHORS}" verify-cohort \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --anchors "${EX_DIR}/anchors.subset.tsv" \ + --out "${OUTDIR}/D.tsv" \ + --fail-on-fail >/dev/null +# The dropped anchor shouldn't appear at all (nothing to verify). Remaining anchors PASS. +n_rows=$(awk -F'\t' 'NR>1 && $1=="sample_1" && $3=="chr2"' "${OUTDIR}/D.tsv" | wc -l) +if [[ "${n_rows}" -ne 0 ]]; then + echo " FAIL ASSERTION: sample_1/chr2 should NOT appear (dropped anchor) but got ${n_rows} rows" + exit 1 +fi +echo " OK sample_1/chr2 anchor dropped — no row emitted" +assert_status "sample_1" "chr7:148884000-148884001" "PASS" "${OUTDIR}/D.tsv" +assert_status "sample_2" "chr2:25246500-25246501" "PASS" "${OUTDIR}/D.tsv" +echo + +echo "=== all 4 scenarios PASSED — verify_anchors.py behaves as expected ===" diff --git a/igv-reports/tests/integration/cohort_verify/README.md b/igv-reports/tests/integration/cohort_verify/README.md new file mode 100644 index 0000000..05de1d0 --- /dev/null +++ b/igv-reports/tests/integration/cohort_verify/README.md @@ -0,0 +1,79 @@ +# cohort_verify_demo — regression test for `verify_cohort.py` + +End-to-end check that the cohort verifier catches the four failure modes +it's designed to catch. Self-asserting — exit nonzero on any mismatch. + +## What it does + +1. Generates a 3-sample samplesheet (TSV) pointing at three real COLO829 ONT BAMs. +2. Calls `build_igvreports.py --samplesheet ... --no-verify` to produce + `reports/sample_{1,2,3}.hg38.html` + `index.html`. +3. Runs `verify_cohort.py` against the clean cohort (expects all PASS). +4. Runs four corruption scenarios, each asserting the expected check FAILs: + + | Scenario | Corruption | Expected FAILs | + |---|---|---| + | A | Delete `sample_3.hg38.html` | `*/cohort_html_coverage`, `sample_3/html_exists` | + | B | Replace `sample_1.hg38.html` with sample_2's content | `sample_1/sample_tracks_match`, `sample_1/no_cross_sample_contamination`, `sample_1/sample_id_embedded` | + | C | Drop one `<li>` from `index.html` | `*/index_consistency` | + | D | Truncate `sample_2.hg38.html` to 1 KB | `sample_2/html_min_size`, `sample_2/region_count` | + +5. Cleans up generated `reports/`, samplesheet, sites BED, and logs/ on exit. + +## Run + +```bash +bash tests/integration/cohort_verify/scenarios.sh +``` + +Or as part of the full test suite: + +```bash +bash tests/run_all.sh # all layers +bash tests/run_all.sh --integration-only +``` + +## BAM paths (parameterized) + +Requires BAMs supplied via +env vars when running elsewhere: + +```bash +IGV_REPORTS_TEST_BAM_1=/path/to/sample1.bam \ +IGV_REPORTS_TEST_BAM_2=/path/to/sample2.bam \ +IGV_REPORTS_TEST_BAM_3=/path/to/sample3.bam \ + bash tests/integration/cohort_verify/scenarios.sh +``` + +If a default doesn't exist and no env override is set, the script exits +**77** (POSIX skipped-test convention) and `run_all.sh` reports it as a +skip, not a failure. + +Runtime: ~60-90 s on a warm node (3-sample cohort build at 1-bp point-variant +sites + 4 reverify cycles). Per-sample HTML ends up ~3-5 MB. Cold-cache +network reads of the underlying ONT BAMs can extend this to 2-3 min on +first invocation. + +Disk: ~15 MB temporary under `reports/`, auto-cleaned via `trap`. + +The sites BED uses 1-bp point-variant style coordinates (not 13 kb promoter +windows like the methylation example) so BAM slicing stays fast — we're +testing the verifier, not the renderer. Adapt for other workflows if you +want to exercise wider windows. + +## How to provide BAMs + +Set `IGV_REPORTS_TEST_BAM_{1,2,3}` to paths of three indexed BAMs you have +access to. The verifier doesn't care which BAMs — it only requires that the +three rows in the samplesheet declare *different* BAMs (so scenario B's +contamination check has signal). Without those env vars, the test exits 77 +(POSIX skip). + +## Why this is `integration`, not `smoke` or `unit` + +This test depends on real BAMs and on `create_report` actually running, so +it can't fit in `tests/smoke/` (which uses only the committed COLO829 slice +fixture and runs in seconds) or `tests/unit/` (parser-only, no I/O). + +For the parser-level regression checks that gave rise to this verifier, +see [tests/unit/test_verify_report.py](../../unit/test_verify_report.py). diff --git a/igv-reports/tests/integration/cohort_verify/scenarios.sh b/igv-reports/tests/integration/cohort_verify/scenarios.sh new file mode 100755 index 0000000..63ff7d2 --- /dev/null +++ b/igv-reports/tests/integration/cohort_verify/scenarios.sh @@ -0,0 +1,172 @@ +#!/usr/bin/env bash +# scenarios.sh — end-to-end integration test for scripts/verify_cohort.py. +# +# Builds a 3-sample cohort, snapshots a clean verify pass, then runs four +# corruption scenarios and asserts each triggers the expected check FAILs. +# Exit nonzero if any assertion misses. +# +# Runtime: ~6-8 min cold (cohort build dominates); ~30 s when cohort is cached. +# Disk: ~15 MB under ./reports/ (auto-cleaned on success unless KEEP_REPORTS=1). +# +# BAM source — three different indexed BAMs (any organism, any size). Defaults +# require env vars (no built-in defaults): +# IGV_REPORTS_TEST_BAM_1, _2, _3 +# Tests SKIP (exit 77) when defaults are unset and no override is provided. +set -euo pipefail + +EX_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SKILL_DIR="$(cd "${EX_DIR}/../../.." && pwd)" +BUILD="${SKILL_DIR}/scripts/build_igvreports.py" +VERIFY="${SKILL_DIR}/scripts/verify_cohort.py" + +# BAM sources — must be supplied via env vars. No defaults: integration tests +# require three indexed BAMs from a public ONT release (e.g. COLO829 from EBI). +BAM_S1="${IGV_REPORTS_TEST_BAM_1:-}" +BAM_S2="${IGV_REPORTS_TEST_BAM_2:-}" +BAM_S3="${IGV_REPORTS_TEST_BAM_3:-}" + +for bam in "${BAM_S1}" "${BAM_S2}" "${BAM_S3}"; do + if [[ -z "${bam}" || ! -f "${bam}" ]]; then + echo "SKIP: integration test needs three indexed BAMs." >&2 + echo " Set IGV_REPORTS_TEST_BAM_{1,2,3} to paths of three .bam files (each with sibling .bai)." >&2 + exit 77 # POSIX skipped-test convention + fi +done + +SHEET="${EX_DIR}/samplesheet.hg38.tsv" +SITES="${EX_DIR}/sites.hg38.bed" +OUTDIR="${EX_DIR}/reports" + +cleanup() { + if [[ -n "${KEEP_REPORTS:-}" ]]; then + echo "(KEEP_REPORTS set — leaving artifacts in ${OUTDIR} for inspection)" + return + fi + rm -rf "${OUTDIR}" "${SHEET}" "${SITES}" "${EX_DIR}/logs" +} +# Only cleanup on success — failures leave artifacts so they can be debugged. +trap 'rc=$?; if [[ $rc -eq 0 ]]; then cleanup; else echo "(scenarios.sh exited $rc — leaving artifacts in ${OUTDIR} for debug)"; fi' EXIT + +# Requires `create_report` (pip install igv-reports) and `samtools` on PATH. +# If you use a conda env, activate it before invoking this script. + +# --- 1. Generate fresh inputs -------------------------------------------------- +# Point-variant style sites: 1-bp wide each, --flanking 300 = ~600 bp windows. +# Keeps BAM slicing fast (seconds) even with 100+ GB ONT BAMs and full +# annotation tracks. We're testing the verifier, not the renderer; tiny +# windows are sufficient. +cat >"${SITES}" <<EOF +#chrom start end name +chr2 25246500 25246501 DNMT3A_SNV +chr7 148884000 148884001 EZH2_SNV +EOF + +printf 'sample\tbam_tumor\tsites_bed\n' >"${SHEET}" +printf 'sample_1\t%s\t%s\n' "${BAM_S1}" "${SITES}" >>"${SHEET}" +printf 'sample_2\t%s\t%s\n' "${BAM_S2}" "${SITES}" >>"${SHEET}" +printf 'sample_3\t%s\t%s\n' "${BAM_S3}" "${SITES}" >>"${SHEET}" + +# --- 2. Build cohort (3 HTMLs + index.html) ----------------------------------- +# Skip rebuild if a complete cohort is already on disk (set REBUILD=1 to force). +# Lets you iterate on the verifier in seconds instead of waiting ~12 min to +# regenerate HTMLs that haven't changed. +if [[ -z "${REBUILD:-}" \ + && -f "${OUTDIR}/sample_1.hg38.html" \ + && -f "${OUTDIR}/sample_2.hg38.html" \ + && -f "${OUTDIR}/sample_3.hg38.html" \ + && -f "${OUTDIR}/index.html" ]]; then + echo "=== reusing existing cohort in ${OUTDIR} (set REBUILD=1 to force rebuild) ===" +else + echo "=== building cohort ===" + python "${BUILD}" \ + --samplesheet "${SHEET}" \ + --genome hg38 \ + --flanking 300 \ + --type mutation \ + --info-columns name \ + --output-dir "${OUTDIR}" \ + --no-apptainer \ + --no-verify # don't auto-verify during build — we exercise the verifier explicitly below +fi +echo + +assert_status() { + # assert_status <sample> <check> <expected_status> <verify_tsv> + local sample="$1" check="$2" expected="$3" tsv="$4" + local actual + actual=$(awk -F'\t' -v s="$sample" -v c="$check" '$1==s && $2==c {print $3; exit}' "$tsv") + if [[ "$actual" != "$expected" ]]; then + echo " FAIL ASSERTION: sample=$sample check=$check expected=$expected actual=${actual:-<missing>}" + return 1 + fi + echo " OK sample=$sample check=$check status=$actual" +} + +# --- 3. Baseline verify (all PASS) -------------------------------------------- +echo "=== scenario 0: baseline (all PASS expected) ===" +python "${VERIFY}" \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --out "${OUTDIR}/baseline.tsv" \ + --fail-on-fail >/dev/null +echo " baseline: all PASS (verify exited 0)" +echo + +# --- 4. Scenario A: missing HTML ---------------------------------------------- +echo "=== scenario A: delete sample_3's HTML — C1 cohort_html_coverage should FAIL ===" +mv "${OUTDIR}/sample_3.hg38.html" "${OUTDIR}/sample_3.hg38.html.bak" +python "${VERIFY}" \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --out "${OUTDIR}/A.tsv" >/dev/null || true +assert_status "*" "cohort_html_coverage" "FAIL" "${OUTDIR}/A.tsv" +assert_status "sample_3" "html_exists" "FAIL" "${OUTDIR}/A.tsv" +mv "${OUTDIR}/sample_3.hg38.html.bak" "${OUTDIR}/sample_3.hg38.html" +echo + +# --- 5. Scenario B: sample swap (sample_1.html now contains sample_2 data) --- +echo "=== scenario B: swap sample_1<-sample_2 — sample_tracks_match + id_embedded + contamination should FAIL on sample_1 ===" +cp "${OUTDIR}/sample_1.hg38.html" "${OUTDIR}/sample_1.hg38.html.bak" +cp "${OUTDIR}/sample_2.hg38.html" "${OUTDIR}/sample_1.hg38.html" +python "${VERIFY}" \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --out "${OUTDIR}/B.tsv" >/dev/null || true +assert_status "sample_1" "sample_tracks_match" "FAIL" "${OUTDIR}/B.tsv" +assert_status "sample_1" "no_cross_sample_contamination" "FAIL" "${OUTDIR}/B.tsv" +assert_status "sample_1" "sample_id_embedded" "FAIL" "${OUTDIR}/B.tsv" +mv "${OUTDIR}/sample_1.hg38.html.bak" "${OUTDIR}/sample_1.hg38.html" +echo + +# --- 6. Scenario C: corrupt index.html ---------------------------------------- +echo "=== scenario C: drop one <li> from index.html — C5 index_consistency should FAIL ===" +cp "${OUTDIR}/index.html" "${OUTDIR}/index.html.bak" +sed -i '/href="sample_2.hg38.html"/d' "${OUTDIR}/index.html" +python "${VERIFY}" \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --out "${OUTDIR}/C.tsv" >/dev/null || true +assert_status "*" "index_consistency" "FAIL" "${OUTDIR}/C.tsv" +mv "${OUTDIR}/index.html.bak" "${OUTDIR}/index.html" +echo + +# --- 7. Scenario D: tiny HTML (truncation) ------------------------------------ +echo "=== scenario D: truncate sample_2.html to 1 KB — html_min_size + parse failures expected ===" +cp "${OUTDIR}/sample_2.hg38.html" "${OUTDIR}/sample_2.hg38.html.bak" +head -c 1024 "${OUTDIR}/sample_2.hg38.html.bak" > "${OUTDIR}/sample_2.hg38.html" +python "${VERIFY}" \ + --samplesheet "${SHEET}" \ + --reports-dir "${OUTDIR}" \ + --genome hg38 \ + --min-size-mb 1.0 \ + --out "${OUTDIR}/D.tsv" >/dev/null || true +assert_status "sample_2" "html_min_size" "FAIL" "${OUTDIR}/D.tsv" +assert_status "sample_2" "region_count" "FAIL" "${OUTDIR}/D.tsv" +mv "${OUTDIR}/sample_2.hg38.html.bak" "${OUTDIR}/sample_2.hg38.html" +echo + +echo "=== all 4 scenarios PASSED — verify_cohort.py behaves as expected ===" diff --git a/igv-reports/tests/run_all.sh b/igv-reports/tests/run_all.sh new file mode 100755 index 0000000..fb68b70 --- /dev/null +++ b/igv-reports/tests/run_all.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +# tests/run_all.sh — orchestrate the three test layers in order. +# +# Author: Samuel Ahuno +# Purpose: +# 1. unit (~1 s) — pure-Python parser tests; pytest. +# 2. smoke (~3 s) — samtools subprocess + slice-decode round-trip +# against the committed fixture; pytest. +# 3. integration — full cohort build + verify-cohort + verify-anchors +# end-to-end; bash scenarios.sh under each demo. +# Skipped (exit 77) when the IGV_REPORTS_TEST_BAM_* +# env vars are unset +# don't exist. +# +# Usage: +# bash tests/run_all.sh # all three layers +# bash tests/run_all.sh --unit-only # layer 1 only — instant feedback +# bash tests/run_all.sh --no-integration # layers 1 + 2 (fast everywhere) +# bash tests/run_all.sh --integration-only # layer 3 only — for the slow lane +# +# Exit code: +# 0 — every requested layer passed (or was legitimately skipped). +# 1+ — at least one layer failed; output preserved for debugging. +set -euo pipefail + +TESTS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SKILL_DIR="$(cd "${TESTS_DIR}/.." && pwd)" + +RUN_UNIT=1 +RUN_SMOKE=1 +RUN_INTEGRATION=1 + +for arg in "$@"; do + case "$arg" in + --unit-only) RUN_SMOKE=0; RUN_INTEGRATION=0 ;; + --no-integration) RUN_INTEGRATION=0 ;; + --integration-only) RUN_UNIT=0; RUN_SMOKE=0 ;; + -h|--help) + sed -n '3,20p' "$0" + exit 0 + ;; + *) + echo "ERROR: unknown flag: $arg" >&2 + echo " Use --help to see options." >&2 + exit 2 + ;; + esac +done + +# Pick a Python with pytest. Honor $IGV_REPORTS_PY if set; else PATH python3. +PY="${IGV_REPORTS_PY:-}" +if [[ -z "${PY}" ]]; then + if command -v python3 >/dev/null 2>&1; then + PY=$(command -v python3) + else + echo "ERROR: no python3 available. Set IGV_REPORTS_PY=<path-to-python>" >&2 + exit 2 + fi +fi + +FAILS=0 +SKIPS=0 + +run_layer() { + local name="$1"; shift + local desc="$1"; shift + echo "=== ${name}: ${desc} ===" + if "$@"; then + echo " ${name} PASS" + else + local rc=$? + if [[ $rc -eq 77 ]]; then + echo " ${name} SKIP (exit 77 — see message above)" + SKIPS=$((SKIPS + 1)) + else + echo " ${name} FAIL (exit ${rc})" + FAILS=$((FAILS + 1)) + fi + fi + echo +} + +# --- Layer 1: unit --------------------------------------------------------- +if [[ $RUN_UNIT -eq 1 ]]; then + run_layer "unit" "pure-Python parsers" \ + "${PY}" -m pytest "${TESTS_DIR}/unit/" -q +fi + +# --- Layer 2: smoke -------------------------------------------------------- +if [[ $RUN_SMOKE -eq 1 ]]; then + run_layer "smoke" "samtools + slice-decode round-trip" \ + "${PY}" -m pytest "${TESTS_DIR}/smoke/" -q +fi + +# --- Layer 3: integration -------------------------------------------------- +# Each scenarios.sh exits 77 if its required BAMs aren't available; we treat +# that as a skip rather than a failure so the suite is portable. +if [[ $RUN_INTEGRATION -eq 1 ]]; then + run_layer "integration / cohort_verify" "cohort structural verifier scenarios" \ + bash "${TESTS_DIR}/integration/cohort_verify/scenarios.sh" + run_layer "integration / anchor_verify" "anchor content verifier scenarios" \ + bash "${TESTS_DIR}/integration/anchor_verify/scenarios.sh" +fi + +echo "=== summary ===" +echo " failures: ${FAILS}" +echo " skips: ${SKIPS}" + +if [[ $FAILS -gt 0 ]]; then + exit 1 +fi +exit 0 diff --git a/igv-reports/tests/smoke/test_slice_count.py b/igv-reports/tests/smoke/test_slice_count.py new file mode 100644 index 0000000..9c72586 --- /dev/null +++ b/igv-reports/tests/smoke/test_slice_count.py @@ -0,0 +1,154 @@ +"""Smoke tests for verify_anchors.py — exercises the samtools subprocess +path and the end-to-end slice-decode-and-count flow against the committed +COLO829 BAM fixture. + +Author: Samuel Ahuno +Purpose: + The unit tests cover the parsers with synthetic inputs. These smoke + tests confirm the verifier's samtools shellouts actually work end-to-end: + + 1. `samtools_count` returns the right integer for a real BAM region. + 2. `samtools_index` produces a usable index on a fresh BAM. + 3. The full decode round-trip (read fixture BAM → base64 wrap into a + fake data: URL → decode_track_slice writes it back out → re-index + → re-count) preserves the original count exactly. + + Skipped (not failed) if samtools is unavailable — so this works in a + CI sandbox without the SIF or PATH samtools. + +Run: + cd claude/skills/igv-reports + pytest tests/smoke/ -v +""" + +from __future__ import annotations + +import base64 +import shutil +import subprocess +import sys +from pathlib import Path + +import pytest + +SCRIPTS = Path(__file__).resolve().parents[2] / "scripts" +sys.path.insert(0, str(SCRIPTS)) +import verify_anchors as va # noqa: E402 + +FIXTURE = Path(__file__).resolve().parents[1] / "fixtures" / "tiny_colo829.hg38.bam" + +# Anchor sanity counts — must match fixtures/README.md and build_fixtures.sh. +ANCHOR_CHR2 = ("chr2:25246500-25246501", 5) +ANCHOR_CHR7 = ("chr7:148884000-148884001", 9) + + +def _samtools_cmd() -> list[str] | None: + """Resolve samtools the same way verify_anchors does, but return None + instead of raising when nothing is available. Lets us SKIP gracefully.""" + try: + return va.resolve_samtools(None) + except SystemExit: + # No SIF and no PATH samtools — environment can't run smoke tests. + return None + + +@pytest.fixture(scope="module") +def samtools_cmd(): + cmd = _samtools_cmd() + if cmd is None: + pytest.skip("no samtools available (set SAMTOOLS_SIF or install samtools)") + if not FIXTURE.exists(): + pytest.skip( + f"fixture missing: {FIXTURE} — regenerate with " + "bash tests/fixtures/build_fixtures.sh" + ) + return cmd + + +# --------------------------------------------------------------------------- +# samtools_count + samtools_index against the committed fixture +# --------------------------------------------------------------------------- + +@pytest.mark.parametrize("region,expected", [ANCHOR_CHR2, ANCHOR_CHR7]) +def test_samtools_count_matches_fixture_anchor(samtools_cmd, region, expected): + observed = va.samtools_count(samtools_cmd, FIXTURE, region) + assert observed == expected, ( + f"fixture anchor drift: {region} should be {expected}, got {observed}. " + "Either the committed BAM was regenerated with different params " + "(see tests/fixtures/build_fixtures.sh) or the count filter changed." + ) + + +def test_samtools_index_creates_usable_index(samtools_cmd, tmp_path): + """Copy the fixture to tmp_path WITHOUT its .bai, then have verify_anchors + re-index it. After indexing, samtools_count must succeed.""" + bam_copy = tmp_path / "no_bai.bam" + shutil.copy(FIXTURE, bam_copy) + # confirm no index exists yet + assert not (tmp_path / "no_bai.bam.bai").exists() + va.samtools_index(samtools_cmd, bam_copy) + assert (tmp_path / "no_bai.bam.bai").exists() + # count works now + assert va.samtools_count(samtools_cmd, bam_copy, ANCHOR_CHR2[0]) == ANCHOR_CHR2[1] + + +def test_samtools_count_missing_bam_raises(samtools_cmd, tmp_path): + """A missing BAM path should produce a clear RuntimeError, not crash silently. + + Note: samtools tolerates malformed region strings (treats them as unknown + references and returns 0 with a stderr warning + exit 0). The only + reliable error trigger is a missing/unreadable BAM file.""" + missing = tmp_path / "does_not_exist.bam" + with pytest.raises(RuntimeError, match="samtools view -c failed"): + va.samtools_count(samtools_cmd, missing, "chr1:1-100") + + +# --------------------------------------------------------------------------- +# Slice decode round-trip (the central correctness claim of verify_anchors) +# --------------------------------------------------------------------------- + +def test_full_decode_roundtrip(samtools_cmd, tmp_path): + """End-to-end: emulate what igv-reports does to embed a BAM slice in an + HTML data: URL, then have verify_anchors decode it back out and confirm + the read count is preserved. + + This is the critical correctness claim: if the verifier's slice decode + silently corrupts the BAM bytes, every anchor verify would silently + pass when it shouldn't. Catching that here means we trust the + integration tests further down.""" + # 1. Read the committed BAM raw, wrap it in a data: URL exactly the + # way igv_reports/datauri.py does (mediatype application/gzip + # because BAM is BGZF gzip — see decision in datauri.get_data_uri). + raw = FIXTURE.read_bytes() + data_url = "data:application/gzip;base64," + base64.b64encode(raw).decode() + + # 2. Decode it via the production code path. + decoded = tmp_path / "decoded.bam" + va.decode_track_slice(data_url, decoded) + + # 3. Bytes must match exactly. + assert decoded.read_bytes() == raw + + # 4. samtools should treat the decoded file as a real BAM — index it + # and count the same anchors. + va.samtools_index(samtools_cmd, decoded) + for region, expected in (ANCHOR_CHR2, ANCHOR_CHR7): + assert va.samtools_count(samtools_cmd, decoded, region) == expected + + +def test_resolve_samtools_explicit_sif_missing(tmp_path): + """Passing a non-existent SIF path explicitly must fail loudly, not fall + back silently to PATH samtools.""" + fake_sif = tmp_path / "does_not_exist.sif" + with pytest.raises(SystemExit, match="samtools SIF not found"): + va.resolve_samtools(fake_sif) + + +def test_resolve_samtools_env_var(tmp_path, monkeypatch): + """$SAMTOOLS_SIF env var honored when no --samtools-sif passed.""" + # Use a real-ish path that doesn't exist to verify it's the *path* the + # env-resolution picks up, not some unrelated SIF. + fake = tmp_path / "env_sif.sif" + monkeypatch.setenv("SAMTOOLS_SIF", str(fake)) + with pytest.raises(SystemExit, match=str(fake)): + va.resolve_samtools(None) diff --git a/igv-reports/tests/unit/test_verify_anchors.py b/igv-reports/tests/unit/test_verify_anchors.py new file mode 100644 index 0000000..40efab9 --- /dev/null +++ b/igv-reports/tests/unit/test_verify_anchors.py @@ -0,0 +1,354 @@ +"""Unit tests for verify_anchors.py — parser layer only. + +Author: Samuel Ahuno +Purpose: + Fast pytest suite covering the pure-Python parsing/decision logic in + verify_anchors.py. No subprocess, no real BAM, no external dependencies. + Runs in ~1 s on any machine with pytest. + + These tests catch the parser regressions that bit during the original + iteration: status-taxonomy conflation between SKIP and FAIL, mis-tabbed + TSV rows being silently mis-parsed, decode_status confusing tolerance + with notes when columns are out of order. + +Run: + cd <plugin-root>/igv-reports + pytest tests/unit/ -v +""" + +from __future__ import annotations + +import base64 +import gzip +import json +import sys +from pathlib import Path + +import pytest + +# Make scripts/ importable without installing the skill as a package. +SCRIPTS = Path(__file__).resolve().parents[2] / "scripts" +sys.path.insert(0, str(SCRIPTS)) +import verify_anchors as va # noqa: E402 + + +# --------------------------------------------------------------------------- +# load_anchors +# --------------------------------------------------------------------------- + +def _write_tsv(tmp_path: Path, body: str) -> Path: + p = tmp_path / "anchors.tsv" + p.write_text(body) + return p + + +def test_load_anchors_full_row(tmp_path): + """All 10 columns populated, including notes.""" + p = _write_tsv(tmp_path, ( + "#sample\ttrack_name\tchrom\tstart\tend\texpected\ttolerance\tmin\tmax\tnotes\n" + "s1\ttumor\tchr2\t25246500\t25246501\t56\t0.05\t\t\tDNMT3A\n" + )) + rows = va.load_anchors(p) + assert len(rows) == 1 + r = rows[0] + assert (r.sample, r.track_name, r.chrom, r.start, r.end) == ("s1", "tumor", "chr2", 25246500, 25246501) + assert r.expected == 56 + assert r.tolerance == "0.05" + assert r.min_count == "" + assert r.max_count == "" + assert r.notes == "DNMT3A" + + +def test_load_anchors_min_max_row(tmp_path): + p = _write_tsv(tmp_path, ( + "#sample\ttrack_name\tchrom\tstart\tend\texpected\ttolerance\tmin\tmax\tnotes\n" + "s1\ttumor\tchrX\t100\t200\t50\t\t20\t100\thigh-conf\n" + )) + rows = va.load_anchors(p) + assert rows[0].min_count == "20" + assert rows[0].max_count == "100" + + +def test_load_anchors_missing_header_errors(tmp_path): + """Data row before any header must abort with a clear error.""" + p = _write_tsv(tmp_path, "s1\ttumor\tchr1\t0\t100\t10\t\t\t\t\n") + with pytest.raises(SystemExit, match="data row before header"): + va.load_anchors(p) + + +def test_load_anchors_bad_tolerance_fails_fast(tmp_path): + """Mis-tabbed row where notes value falls into tolerance must fail at + load time with a hint, not crash later inside decide_status.""" + p = _write_tsv(tmp_path, ( + "#sample\ttrack_name\tchrom\tstart\tend\texpected\ttolerance\tmin\tmax\tnotes\n" + "s1\ttumor\tchr2\t100\t200\t10\tNOT_A_NUMBER\t\t\tDNMT3A\n" + )) + with pytest.raises(SystemExit) as excinfo: + va.load_anchors(p) + msg = str(excinfo.value) + assert "malformed anchor row" in msg + assert "awk" in msg # hint about -F'\t' + + +def test_load_anchors_bad_min_fails_fast(tmp_path): + p = _write_tsv(tmp_path, ( + "#sample\ttrack_name\tchrom\tstart\tend\texpected\ttolerance\tmin\tmax\tnotes\n" + "s1\ttumor\tchr2\t100\t200\t10\t\tNAH\t\t\n" + )) + with pytest.raises(SystemExit, match="malformed anchor row"): + va.load_anchors(p) + + +def test_load_anchors_missing_file(tmp_path): + with pytest.raises(SystemExit, match="anchors TSV not found"): + va.load_anchors(tmp_path / "does_not_exist.tsv") + + +def test_load_anchors_skips_blank_lines(tmp_path): + p = _write_tsv(tmp_path, ( + "#sample\ttrack_name\tchrom\tstart\tend\texpected\ttolerance\tmin\tmax\tnotes\n" + "\n" + "s1\ttumor\tchr1\t0\t100\t10\t\t\t\t\n" + "\n" + )) + rows = va.load_anchors(p) + assert len(rows) == 1 + + +# --------------------------------------------------------------------------- +# decide_status +# --------------------------------------------------------------------------- + +def _anchor(expected=10, tolerance="", min_count="", max_count=""): + return va.AnchorRow( + sample="s", track_name="t", chrom="chr1", start=0, end=100, + expected=expected, tolerance=tolerance, + min_count=min_count, max_count=max_count, + ) + + +def test_decide_status_pass_within_default_tolerance(): + a = _anchor(expected=100) + status, _ = va.decide_status(a, observed=104, default_tol=0.05) + assert status == "PASS" + + +def test_decide_status_fail_outside_default_tolerance(): + a = _anchor(expected=100) + status, details = va.decide_status(a, observed=110, default_tol=0.05) + assert status == "FAIL" + assert "diff_ratio" in details + + +def test_decide_status_per_row_tolerance_overrides_default(): + """Row tolerance 0.20 should pass observed=115 even though default 0.05 wouldn't.""" + a = _anchor(expected=100, tolerance="0.20") + status, _ = va.decide_status(a, observed=115, default_tol=0.05) + assert status == "PASS" + + +def test_decide_status_min_bound_pass(): + a = _anchor(expected=50, min_count="20") + status, details = va.decide_status(a, observed=50, default_tol=0.05) + assert status == "PASS" + assert "min=20 OK" in details + + +def test_decide_status_min_bound_fail(): + a = _anchor(expected=50, min_count="100") + status, details = va.decide_status(a, observed=50, default_tol=0.05) + assert status == "FAIL" + assert "min=100 FAIL" in details + + +def test_decide_status_min_max_combined(): + a = _anchor(min_count="20", max_count="80") + status, _ = va.decide_status(a, observed=50, default_tol=0.05) + assert status == "PASS" + status, _ = va.decide_status(a, observed=10, default_tol=0.05) + assert status == "FAIL" + status, _ = va.decide_status(a, observed=100, default_tol=0.05) + assert status == "FAIL" + + +def test_decide_status_bounds_override_tolerance(): + """When min/max present, tolerance is ignored.""" + # observed within tolerance of expected, but violates min + a = _anchor(expected=50, tolerance="0.50", min_count="100") + status, _ = va.decide_status(a, observed=52, default_tol=0.05) + assert status == "FAIL" # min wins over tolerance + + +def test_decide_status_zero_expected_exact(): + a = _anchor(expected=0) + status, _ = va.decide_status(a, observed=0, default_tol=0.05) + assert status == "PASS" + status, _ = va.decide_status(a, observed=1, default_tol=0.05) + assert status == "FAIL" + + +# --------------------------------------------------------------------------- +# decode_track_slice +# --------------------------------------------------------------------------- + +def test_decode_track_slice_roundtrip(tmp_path): + """data: URL → bytes round-trip preserves the payload.""" + payload = b"BAM\x01some bytes here" + url = "data:application/gzip;base64," + base64.b64encode(payload).decode() + dest = tmp_path / "out.bin" + va.decode_track_slice(url, dest) + assert dest.read_bytes() == payload + + +def test_decode_track_slice_other_mediatype_accepted(tmp_path): + """We don't validate the mediatype — payload bytes are what matter.""" + payload = b"\x1f\x8b\x08compressed body" + url = "data:application/octet-stream;base64," + base64.b64encode(payload).decode() + dest = tmp_path / "out.bin" + va.decode_track_slice(url, dest) + assert dest.read_bytes() == payload + + +def test_decode_track_slice_not_a_data_url_raises(tmp_path): + with pytest.raises(ValueError, match="not a data: base64 URL"): + va.decode_track_slice("http://example.com/blob.bam", tmp_path / "out.bin") + + +# --------------------------------------------------------------------------- +# find_track +# --------------------------------------------------------------------------- + +def test_find_track_hit(): + session = {"tracks": [ + {"name": "ann.bed"}, + {"name": "sample.sorted", "url": "data:..."}, + ]} + t = va.find_track(session, "sample.sorted") + assert t is not None and t["url"] == "data:..." + + +def test_find_track_miss(): + session = {"tracks": [{"name": "other"}]} + assert va.find_track(session, "missing") is None + + +def test_find_track_empty(): + assert va.find_track({}, "x") is None + assert va.find_track({"tracks": []}, "x") is None + + +# --------------------------------------------------------------------------- +# locate_session_entry — status taxonomy split (was the v1 regression) +# --------------------------------------------------------------------------- + +def _make_table_json(rows): + return {"headers": ["Chrom", "Start", "End", "Name"], "rows": rows} + + +def _make_session_dict(entries): + """Build a sessionDictionary mapping str(idx) -> a gzipped+b64 data URL + that decodes to the given entry dict.""" + out = {} + for idx, entry in entries.items(): + raw = gzip.compress(json.dumps(entry).encode()) + out[str(idx)] = "data:application/gzip;base64," + base64.b64encode(raw).decode() + return out + + +def test_locate_session_entry_ok(): + tj = _make_table_json([["chr2", 25246501, 25246501, "x"]]) + sd = _make_session_dict({0: {"tracks": [{"name": "t"}]}}) + outcome, sess, det = va.locate_session_entry(sd, tj, "chr2", 25246500, 25246501) + assert outcome == "ok" + assert sess == {"tracks": [{"name": "t"}]} + assert det == "" + + +def test_locate_session_entry_absent_returns_skip_signal(): + """Anchor for a region that's not in the HTML — caller should SKIP.""" + tj = _make_table_json([["chr2", 25246501, 25246501, "x"]]) + sd = _make_session_dict({0: {"tracks": []}}) + outcome, _, det = va.locate_session_entry(sd, tj, "chr2", 99999999, 99999999) + assert outcome == "absent" + assert "no tableJson row matched" in det + + +def test_locate_session_entry_broken_missing_session(): + """Row in tableJson but no corresponding sessionDictionary entry — FAIL.""" + tj = _make_table_json([["chr2", 25246501, 25246501, "x"]]) + sd = {} # no entries at all + outcome, _, det = va.locate_session_entry(sd, tj, "chr2", 25246500, 25246501) + assert outcome == "broken" + assert "no entry for row index" in det + + +def test_locate_session_entry_broken_undecodable(): + """Row + session entry present but the session blob can't be gunzipped — FAIL.""" + tj = _make_table_json([["chr2", 25246501, 25246501, "x"]]) + sd = {"0": "data:application/gzip;base64,NOT_VALID_BASE64"} + outcome, _, det = va.locate_session_entry(sd, tj, "chr2", 25246500, 25246501) + assert outcome == "broken" + assert "failed to gunzip/decode" in det + + +def test_locate_session_entry_broken_bad_headers(): + """tableJson missing the Chrom/Start/End columns we need.""" + tj = {"headers": ["foo", "bar"], "rows": [["x", "y"]]} + sd = {} + outcome, _, det = va.locate_session_entry(sd, tj, "chr2", 100, 200) + assert outcome == "broken" + assert "missing expected column" in det + + +# --------------------------------------------------------------------------- +# sample_bam_paths — samplesheet column handling +# --------------------------------------------------------------------------- + +def test_sample_bam_paths_tumor_only(): + row = {"sample": "s1", "bam_tumor": "/x/tumor.sorted.bam"} + out = va.sample_bam_paths(row) + assert out == [("tumor.sorted", Path("/x/tumor.sorted.bam"))] + + +def test_sample_bam_paths_tumor_and_normal(): + row = {"sample": "s1", "bam_tumor": "/x/t.bam", "bam_normal": "/x/n.bam"} + out = va.sample_bam_paths(row) + names = [n for n, _ in out] + assert names == ["t", "n"] + + +def test_sample_bam_paths_extras_filtered_to_bam_cram(): + row = { + "sample": "s1", + "bam_tumor": "/x/t.bam", + "extra_tracks": "/y/extra.bam,/y/annot.bed,/y/other.cram", + } + out = va.sample_bam_paths(row) + names = [n for n, _ in out] + # bam_tumor + the .bam + the .cram from extras; .bed should be filtered out + assert names == ["t", "extra", "other"] + + +def test_sample_bam_paths_blank_row(): + row = {"sample": "s1"} + assert va.sample_bam_paths(row) == [] + + +# --------------------------------------------------------------------------- +# write_anchors round-trip +# --------------------------------------------------------------------------- + +def test_write_load_round_trip(tmp_path): + anchors_in = [ + va.AnchorRow(sample="s1", track_name="t1", chrom="chr1", + start=0, end=100, expected=42, notes="hi"), + va.AnchorRow(sample="s2", track_name="t2", chrom="chr2", + start=200, end=300, expected=7, min_count="3", max_count="20"), + ] + out = tmp_path / "anchors.tsv" + va.write_anchors(anchors_in, out) + rows = va.load_anchors(out) + assert len(rows) == 2 + assert rows[0].notes == "hi" + assert rows[1].min_count == "3" + assert rows[1].max_count == "20" diff --git a/igv-reports/tests/unit/test_verify_report.py b/igv-reports/tests/unit/test_verify_report.py new file mode 100644 index 0000000..6ce4e43 --- /dev/null +++ b/igv-reports/tests/unit/test_verify_report.py @@ -0,0 +1,297 @@ +"""Unit tests for verify_report.py — pure-Python parser helpers. + +Author: Samuel Ahuno +Purpose: + Covers the HTML-extraction helpers and individual checks in + verify_report.py without needing a real create_report HTML on disk: + synthesized fixtures in tmp_path exercise every parser branch. + +Run: + cd claude/skills/igv-reports + pytest tests/unit/ -v +""" + +from __future__ import annotations + +import base64 +import gzip +import json +import sys +from pathlib import Path + +import pytest + +SCRIPTS = Path(__file__).resolve().parents[2] / "scripts" +sys.path.insert(0, str(SCRIPTS)) +import verify_report as vr # noqa: E402 + + +# --------------------------------------------------------------------------- +# load_sites_bed +# --------------------------------------------------------------------------- + +def test_load_sites_bed_basic(tmp_path): + p = tmp_path / "sites.bed" + p.write_text( + "#chrom\tstart\tend\tname\n" + "chr2\t25246500\t25246501\tDNMT3A\n" + "chr7\t148884000\t148884001\tEZH2\n" + ) + rows = vr.load_sites_bed(p) + assert len(rows) == 2 + assert rows[0] == {"chrom": "chr2", "start": 25246500, "end": 25246501, "name": "DNMT3A"} + assert rows[1]["name"] == "EZH2" + + +def test_load_sites_bed_skips_track_line(tmp_path): + p = tmp_path / "sites.bed" + p.write_text( + 'track name=foo description="bar"\n' + "chr1\t100\t200\n" + ) + rows = vr.load_sites_bed(p) + assert len(rows) == 1 + assert rows[0]["name"] is None # 3-col bed; no name + + +def test_load_sites_bed_blank_lines_ok(tmp_path): + p = tmp_path / "sites.bed" + p.write_text( + "#header\n" + "\n" + "chr1\t100\t200\tx\n" + "\n" + ) + assert len(vr.load_sites_bed(p)) == 1 + + +def test_load_sites_bed_too_few_cols(tmp_path): + p = tmp_path / "sites.bed" + p.write_text("chr1\t100\n") + with pytest.raises(SystemExit, match="<3 columns"): + vr.load_sites_bed(p) + + +def test_load_sites_bed_non_numeric(tmp_path): + p = tmp_path / "sites.bed" + p.write_text("chr1\tNOPE\t200\n") + with pytest.raises(SystemExit, match="non-numeric"): + vr.load_sites_bed(p) + + +# --------------------------------------------------------------------------- +# parse_table_json + parse_session_dictionary (regex extraction) +# --------------------------------------------------------------------------- + +def _fake_html(table_json: dict, session_dict: dict) -> str: + """Build a minimal HTML whose JS literals match what create_report emits.""" + return ( + "<html><body><script>\n" + f"var tableJson = {json.dumps(table_json)};\n" + f"var sessionDictionary = {json.dumps(session_dict)};\n" + "</script></body></html>\n" + ) + + +def test_parse_table_json_extracts_dict(): + tj = {"headers": ["Chrom"], "rows": [["chr1"]]} + html = _fake_html(tj, {}) + out = vr.parse_table_json(html) + assert out == tj + + +def test_parse_session_dictionary_extracts_dict(): + sd = {"0": "data:application/gzip;base64,xxx"} + html = _fake_html({"headers": [], "rows": []}, sd) + out = vr.parse_session_dictionary(html) + assert out == sd + + +def test_parse_table_json_missing_returns_none(): + assert vr.parse_table_json("<html>nothing here</html>") is None + + +def test_parse_balanced_blob_handles_braces_in_strings(): + """The brace-balancing scanner must not be tricked by '{' inside string literals.""" + html = "tableJson = {\"name\": \"value with { brace }\", \"n\": 1};" + out = vr.parse_table_json(html) + assert out["name"] == "value with { brace }" + assert out["n"] == 1 + + +def test_parse_balanced_blob_handles_escaped_quotes(): + """Backslash-escaped quotes must not flip the in_str state prematurely.""" + html = 'tableJson = {"name": "has \\" quote", "n": 2};' + out = vr.parse_table_json(html) + assert out["name"] == 'has " quote' + assert out["n"] == 2 + + +# --------------------------------------------------------------------------- +# decode_session_entry +# --------------------------------------------------------------------------- + +def _make_data_url(payload: dict) -> str: + raw = gzip.compress(json.dumps(payload).encode()) + return "data:application/gzip;base64," + base64.b64encode(raw).decode() + + +def test_decode_session_entry_roundtrip(): + payload = {"tracks": [{"name": "t", "url": "data:..."}]} + url = _make_data_url(payload) + assert vr.decode_session_entry(url) == payload + + +def test_decode_session_entry_bad_prefix_returns_none(): + assert vr.decode_session_entry("http://example.com/file.bam") is None + + +def test_decode_session_entry_bad_base64_returns_none(): + """Non-fatal — corrupted entries return None so caller can SKIP gracefully.""" + assert vr.decode_session_entry("data:application/gzip;base64,!!!notb64!!!") is None + + +# --------------------------------------------------------------------------- +# expected_track_labels (covers the Path.stem rule) +# --------------------------------------------------------------------------- + +def test_expected_track_labels_from_paths(): + """Positional --tracks mode: igv-reports auto-names by Path.stem (strips + ONE final suffix). Verified against create_report 1.16.2 in the script.""" + labs = vr.expected_track_labels( + ["/x/sample.5mC.bedgraph", "/y/gencode.v47.annotation.gff3.gz", "/z/x.bam"], + track_config=None, + ) + assert labs == ["sample.5mC", "gencode.v47.annotation.gff3", "x"] + + +def test_expected_track_labels_from_track_config(tmp_path): + """--track-config mode: use the `name` field from the JSON, not the path.""" + cfg = tmp_path / "tracks.json" + cfg.write_text(json.dumps([ + {"name": "tumor", "url": "/x/tumor.bam"}, + {"name": "normal", "url": "/x/normal.bam"}, + {"url": "/x/no-name-track.bam"}, # entries without `name` are silently dropped + ])) + labs = vr.expected_track_labels([], track_config=cfg) + assert labs == ["tumor", "normal"] + + +def test_expected_track_labels_empty(): + assert vr.expected_track_labels([], None) == [] + assert vr.expected_track_labels(None, None) == [] + + +# --------------------------------------------------------------------------- +# Individual checks — drive them with synthetic inputs +# --------------------------------------------------------------------------- + +def test_check_html_exists_pass(tmp_path): + p = tmp_path / "r.html"; p.write_text("x") + c = vr.check_html_exists(p) + assert c.status == "PASS" + + +def test_check_html_exists_fail(tmp_path): + c = vr.check_html_exists(tmp_path / "missing.html") + assert c.status == "FAIL" + + +def test_check_html_min_size_pass_fail(tmp_path): + p = tmp_path / "r.html" + p.write_bytes(b"x" * (2 * 1024 * 1024)) # 2 MB + assert vr.check_html_min_size(p, 1.0).status == "PASS" + assert vr.check_html_min_size(p, 3.0).status == "FAIL" + + +def test_check_region_count_pass(): + bed = [{"chrom": "chr1", "start": 0, "end": 100, "name": "x"}] + tj = {"headers": ["Chrom"], "rows": [["chr1"]]} + assert vr.check_region_count(bed, tj).status == "PASS" + + +def test_check_region_count_fail_when_html_short(): + bed = [{"chrom": "chr1", "start": 0, "end": 100, "name": None}] * 3 + tj = {"headers": ["Chrom"], "rows": [["chr1"]]} + c = vr.check_region_count(bed, tj) + assert c.status == "FAIL" + assert c.observed == "1" + assert c.expected == "3" + + +def test_check_region_count_missing_table_json_fails(): + assert vr.check_region_count([{"chrom": "x", "start": 0, "end": 1, "name": None}], None).status == "FAIL" + + +def test_check_region_coords_match_with_name(): + """HTML stores 1-based start, BED is 0-based half-open.""" + bed = [{"chrom": "chr2", "start": 25246500, "end": 25246501, "name": "DNMT3A"}] + tj = { + "headers": ["Chrom", "Start", "End", "Name"], + "rows": [["chr2", 25246501, 25246501, "DNMT3A"]], + } + assert vr.check_region_coords(bed, tj).status == "PASS" + + +def test_check_region_coords_name_mismatch_fails(): + bed = [{"chrom": "chr2", "start": 100, "end": 200, "name": "EXPECTED"}] + tj = { + "headers": ["Chrom", "Start", "End", "Name"], + "rows": [["chr2", 101, 200, "DIFFERENT"]], + } + c = vr.check_region_coords(bed, tj) + assert c.status == "FAIL" + assert "name mismatch" in c.details + + +def test_check_region_coords_off_by_one_aware(): + """BED 0-based start 100 must match HTML 1-based start 101.""" + bed = [{"chrom": "chr1", "start": 100, "end": 200, "name": None}] + tj = { + "headers": ["Chrom", "Start", "End"], + "rows": [["chr1", 101, 200]], + } + assert vr.check_region_coords(bed, tj).status == "PASS" + + +def test_check_region_sessions_pass(): + tj = {"headers": ["Chrom"], "rows": [["chr1"], ["chr2"]]} + sd = {"0": "data:...", "1": "data:..."} + assert vr.check_region_sessions(tj, sd).status == "PASS" + + +def test_check_region_sessions_missing_key(): + tj = {"headers": ["Chrom"], "rows": [["chr1"], ["chr2"]]} + sd = {"0": "data:..."} # missing "1" + c = vr.check_region_sessions(tj, sd) + assert c.status == "FAIL" + + +def test_check_tracks_present_pass(): + """Decode the first session entry and confirm all expected labels in tracks[].name.""" + sd = {"0": _make_data_url({"tracks": [{"name": "tumor"}, {"name": "cpg"}, {"name": "rmsk"}]})} + c = vr.check_tracks_present(sd, ["tumor", "cpg"]) + assert c.status == "PASS" + + +def test_check_tracks_present_missing_track(): + sd = {"0": _make_data_url({"tracks": [{"name": "tumor"}]})} + c = vr.check_tracks_present(sd, ["tumor", "missing_track"]) + assert c.status == "FAIL" + assert "missing_track" in c.details + + +def test_check_tracks_present_skip_when_no_labels(): + sd = {"0": _make_data_url({"tracks": []})} + assert vr.check_tracks_present(sd, []).status == "SKIP" + + +def test_check_tracks_present_empty_session_fails(): + c = vr.check_tracks_present({}, ["x"]) + assert c.status == "FAIL" + + +def test_check_tracks_present_undecodable_session_fails(): + c = vr.check_tracks_present({"0": "data:application/gzip;base64,!!!"}, ["x"]) + assert c.status == "FAIL" + assert "gunzip" in c.details or "decode" in c.details From c803f6bc67d603aef750220057a21b628bb09396 Mon Sep 17 00:00:00 2001 From: sahuno <ekwame001@gmail.com> Date: Mon, 18 May 2026 13:02:05 -0400 Subject: [PATCH 2/9] igv-reports: parallel per-sample builds via --jobs N MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sequential cohort builds dominated wall time for any run with N samples > ~3: a 6-sample run took ~18 min where the BAM-slice I/O could easily run 6-way concurrent. Add `--jobs/-j N` to fan create_report invocations out across a ThreadPoolExecutor; threads (not processes) because build_one() spends nearly all its time inside subprocess.run(create_report), which releases the GIL, and the captured logger is non-picklable. Failure semantics: - N==1 keeps the old behavior bit-identical (sequential loop). Default 1 for backwards compat. - N>1 uses as_completed so a failed sample surfaces immediately but doesn't block already-submitted siblings. All errors collected and surfaced together at the end. Cohort exits nonzero if ANY sample failed — independent of --fail-on-fail (which gates verifier soft-fails). - Per-sample log lines may interleave under N>1; logger is thread-safe so each line is atomic, just out-of-order across samples. The `=== <sample> ===` marker stays the per-sample anchor. Empirical: 6-sample cohort, hg38, --flanking 300, real BAMs: --jobs 1 wall ≈ 18 min (baseline) --jobs 6 wall ≈ 4 min (~4.5x; not 6x because the slowest sample bounds the total) No new deps; ThreadPoolExecutor is stdlib. 63 unit tests still pass. --- igv-reports/scripts/build_igvreports.py | 71 +++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/igv-reports/scripts/build_igvreports.py b/igv-reports/scripts/build_igvreports.py index 8ab9e25..b07669c 100755 --- a/igv-reports/scripts/build_igvreports.py +++ b/igv-reports/scripts/build_igvreports.py @@ -46,6 +46,7 @@ import shutil import subprocess import sys +from concurrent.futures import ThreadPoolExecutor, as_completed from datetime import datetime from pathlib import Path @@ -643,6 +644,18 @@ def main() -> None: "dir (matches results/<run>/{reports,logs}/ lab layout); falls " "back to <out_dir>/logs/ when the sibling is unwritable.", ) + ap.add_argument( + "--jobs", + "-j", + type=int, + default=1, + help="Number of parallel per-sample builds in cohort (--samplesheet) " + "mode. Each worker invokes create_report in a subprocess, so the " + "win comes from running multiple slicers concurrently against " + "different BAMs. I/O-bound on the BAM-slice step, so threads " + "scale well to ~min(N_samples, N_cores). Default 1 (sequential, " + "preserves prior behavior). Has no effect in single-sample mode.", + ) ap.add_argument( "--verify", action=argparse.BooleanOptionalAction, @@ -790,11 +803,19 @@ def main() -> None: ) else: rows = parse_samplesheet(Path(args.samplesheet)) - log.info(f"cohort: {len(rows)} samples from {args.samplesheet}") + n_jobs = max(1, args.jobs) + n_workers = min(n_jobs, len(rows)) if rows else 1 + mode = "sequential" if n_workers == 1 else f"parallel ({n_workers} workers)" + log.info(f"cohort: {len(rows)} samples from {args.samplesheet} — {mode}") report_paths: dict[str, Path] = {} - for row in rows: + failures: list[tuple[str, str]] = [] # (sample, error_message) + + def _build_row(row: dict) -> tuple[str, Path]: + """Build one sample. Runs in a worker thread when --jobs > 1. + + Returns (sample, out_html). Raises on build failure — caught by + the executor and surfaced via future.exception() in the caller.""" sample = row["sample"] - log.info(f"=== {sample} ===") sites = Path(row["sites_bed"]) bams = [Path(row[k]) for k in ("bam_tumor", "bam_normal") if row.get(k)] vcf = Path(row["vcf"]) if row.get("vcf") else None @@ -803,6 +824,7 @@ def main() -> None: sample_extras += [Path(p.strip()) for p in row["extra_tracks"].split(",") if p.strip()] out_html = out_dir / f"{sample}.{genome}.html" title = args.title or f"{sample} ({genome})" + log.info(f"=== {sample} ===") build_one( sites=sites, bams=bams, vcf=vcf, extra_tracks=sample_extras, fasta=fasta, default_tracks=default_tracks, @@ -812,7 +834,48 @@ def main() -> None: info_columns=args.info_columns, use_apptainer=args.apptainer, ) - report_paths[sample] = out_html + return sample, out_html + + # ThreadPoolExecutor is the right primitive here: build_one() spends + # nearly all its wall time inside subprocess.run(create_report), which + # releases the GIL — so threads scale linearly to the number of + # concurrent create_report processes the host can support. Don't use + # ProcessPoolExecutor: build_one() captures a non-picklable logger. + if n_workers == 1: + for row in rows: + try: + sample, out_html = _build_row(row) + report_paths[sample] = out_html + except SystemExit as exc: + failures.append((row.get("sample", "?"), f"exit={exc.code}")) + except Exception as exc: + failures.append((row.get("sample", "?"), f"{type(exc).__name__}: {exc}")) + else: + with ThreadPoolExecutor(max_workers=n_workers) as pool: + future_to_sample = { + pool.submit(_build_row, row): row.get("sample", "?") for row in rows + } + # as_completed lets failures surface immediately while other + # samples continue building. We collect all errors and decide + # whether to fail the whole run at the end. + for fut in as_completed(future_to_sample): + sample_name = future_to_sample[fut] + try: + sample, out_html = fut.result() + report_paths[sample] = out_html + except SystemExit as exc: + failures.append((sample_name, f"exit={exc.code}")) + except Exception as exc: + failures.append((sample_name, f"{type(exc).__name__}: {exc}")) + + if failures: + log.error(f"cohort: {len(failures)} of {len(rows)} samples FAILED:") + for s, err in failures: + log.error(f" - {s}: {err}") + # Always raise on build failures — these aren't verifier soft-fails, + # they're missing HTMLs. --fail-on-fail is for verifier behavior. + raise SystemExit(1) + idx = write_index(report_paths, out_dir / "index.html", f"igv-reports cohort ({genome})") log.info(f"Wrote cohort index: {idx}") From f0d5762ad1e61a847ddd62cf4889e91e8c8ea996 Mon Sep 17 00:00:00 2001 From: sahuno <ekwame001@gmail.com> Date: Mon, 18 May 2026 13:46:39 -0400 Subject: [PATCH 3/9] igv-reports: doc fixes, prep_track bug fix, driver hardening MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eval-driven improvements after cross-checking against four functional eval cases that simulate "Claude with skill loaded": SKILL.md - "Sites BED format" now documents `--info-columns <colname>` for surfacing 4+ column BED data in the report's clickable table. - New "--type for BED-style sites" sub-section surfaces `--type mutation` outside the methylation pathway. - Cohort recipe now mentions the `--jobs N` parallel-builds flag. - prep-track section documents the new sibling-file mode (--out) and shows the `file <name>` diagnostic strings for distinguishing plain-gzip vs bgzip. scripts/prep_track.sh - New `--out PATH` flag: non-destructive sibling-file mode for when other pipelines point at the original .gz and can't tolerate an in-place replace. - Fixed a pre-existing latent bug in in-place mode: `bgzip` (htslib 1.20) refused to overwrite the existing plain-gzip `.gz` file (exit 2, no informative message). Added `rm -f "$TARGET"` before the bgzip step. scripts/build_igvreports.py - New `validate_bams()` preflight: every BAM passed via --bam must have a sibling index (.bai or .csi). Skipped on the --track-config code path. Catches a common silent failure mode that previously produced an obscure pysam stack trace several layers in. scripts/generate_tracks_json.py - New `--force` flag. By default refuses to overwrite an existing tracks.json (exit 2 with actionable message) so hand-edits aren't lost. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --- igv-reports/SKILL.md | 59 +++++++++- igv-reports/scripts/build_igvreports.py | 25 +++++ igv-reports/scripts/generate_tracks_json.py | 7 ++ igv-reports/scripts/prep_track.sh | 116 +++++++++++++++----- 4 files changed, 173 insertions(+), 34 deletions(-) diff --git a/igv-reports/SKILL.md b/igv-reports/SKILL.md index 8cd9efa..2e54148 100644 --- a/igv-reports/SKILL.md +++ b/igv-reports/SKILL.md @@ -123,9 +123,35 @@ chr2 25227855 25342590 DNMT3A_full_gene Tab-separated. The `name` becomes the row label in the report's variant table — make it specific enough to identify the site after deduping. +By default `create_report` shows only the chr/start/end position columns +in the clickable table. To surface the `name` (or any extra columns from +a 5+ column BED), pass `--info-columns <colname>` to the driver: + +```bash +python scripts/build_igvreports.py ... --info-columns name +python scripts/build_igvreports.py ... --info-columns gene_name,score +``` + +Column names are matched by header (so a `#chrom\tstart\tend\tname\tscore` +header works). For positional BED without a header, the convention is the +4th column = `name`, 5th = `score`, 6th = `strand`. + The project's `enforce-genome-tag.sh` hook requires a genome tag in the BED filename: use `sites.hg38.bed`, not `sites.bed`. +### `--type` for BED-style sites + +When the sites input is a BED (not a VCF), pass `--type mutation` to +`create_report` (or the driver). This gives the right viewer behavior at +each row — one locus per row, no split-screen, table on top. Without it, +some BED layouts trigger create_report's split-screen junction view by +heuristic. Use `--type variant` for VCF sites, or omit for create_report's +auto-detection (only safe with a VCF). + +```bash +python scripts/build_igvreports.py ... --type mutation --info-columns name +``` + ## Pitfalls (the skill should encode and/or detect these) | Symptom | Root cause | Fix | @@ -169,8 +195,11 @@ The driver: For multi-sample cohorts, use `--samplesheet samplesheet.tsv` instead of `--bam/--vcf`. Samplesheet format: `sample, bam_tumor, bam_normal, vcf, sites_bed`. The driver emits one HTML per sample plus a top-level `index.html` that lists -all samples with links. Layout matches the ATLL viral-integration reference -implementation: +all samples with links. Pass `--jobs N` to build the per-sample HTMLs in +parallel via `ThreadPoolExecutor` (each `create_report` call is I/O-bound on +BAM slicing, so threading scales well; `--jobs 6` for a 6-patient cohort +roughly 1/Nx wall-clock vs sequential). Default is `--jobs 1`. Layout matches +the ATLL viral-integration reference implementation: ``` results/<run>/ @@ -183,24 +212,42 @@ results/<run>/ ## prep-track — fixing a non-bgzip track If a GFF3/GTF/BED.gz is plain-gzip rather than bgzip, igv-reports fails -silently or with an obscure error. Convert in place with backup: +silently or with an obscure error. Two modes: + +**In-place** (with `.bak.original_gzip` backup) — replaces the original: ```bash bash scripts/prep_track.sh /path/to/track.gff3.gz ``` -The script: -1. Backs up the original to `<name>.bak.original_gzip`. +**Sibling file** (non-destructive — original untouched) — write the +bgzipped+indexed track to a new path. Use this when other pipelines point +at the original `.gff3.gz` and you can't risk a brief window where the +file is replaced: + +```bash +bash scripts/prep_track.sh /path/to/track.gff3.gz \ + --out /path/to/track.bgz.gff3.gz +``` + +The script (both modes): +1. Backs up the original to `<name>.bak.original_gzip` (in-place mode only). 2. `gunzip -c`s the file. 3. Sorts by `chr` then numeric `pos` (`sort -k1,1 -k4,4n`). (Gencode delivers records interleaved by feature type at the same locus — tabix requires pos-sorted.) -4. `bgzip`s in place. +4. `bgzip`s to target. 5. `tabix -p <gff|gtf|bed>`s. 6. Verifies a sample tabix query returns rows. Requires `bgzip` and `tabix` from htslib on PATH. +**Diagnostic** — `file <name>` for distinguishing the two formats: +- Plain gzip: `gzip compressed data, from Unix, original size <N>` +- bgzip: `Blocked GNU Zip Format (BGZF; gzipped file with extra field)` + +The `extra field` keyword is the bgzip giveaway. + ## When generating an answer.md / run.sh for the user The driver script (`build_igvreports.py`) deliberately abstracts the diff --git a/igv-reports/scripts/build_igvreports.py b/igv-reports/scripts/build_igvreports.py index b07669c..68c88a9 100755 --- a/igv-reports/scripts/build_igvreports.py +++ b/igv-reports/scripts/build_igvreports.py @@ -216,6 +216,26 @@ def fasta_for(cfg: dict, genome: str) -> str: return fasta +def validate_bams(bams: list[Path]) -> None: + """Sanity-check BAMs have a coindex sibling (.bai or .csi). + + `create_report` needs a random-access index to slice BAMs at each region; + a BAM with no sibling index produces an obscure pysam error several + layers in. Catch it up front with an actionable message.""" + for bam in bams: + if not bam.exists(): + raise SystemExit(f"ERROR: BAM not found: {bam}") + if not (bam.with_suffix(bam.suffix + ".bai").exists() + or bam.with_suffix(bam.suffix + ".csi").exists() + or bam.with_suffix(".bai").exists() + or bam.with_suffix(".csi").exists()): + raise SystemExit( + f"ERROR: BAM index missing for {bam} — create_report cannot slice it.\n" + f" Fix: samtools index {bam}\n" + f" (or `samtools index -c {bam}` for a .csi index on contigs >512 Mb)" + ) + + def validate_sites_bed(bed: Path) -> None: """Sanity-check the sites BED before invoking create_report. @@ -330,6 +350,11 @@ def build_one( tracks, per-track color/min/max/colorBy/displayMode). """ validate_sites_bed(sites) + # Only validate BAMs on the positional --tracks path. The --track-config + # JSON has its own track-resolution semantics and may reference BAMs by + # arbitrary url:; create_report itself will fail loudly there if needed. + if track_config is None: + validate_bams(bams) output.parent.mkdir(parents=True, exist_ok=True) create_report_cmd = ( diff --git a/igv-reports/scripts/generate_tracks_json.py b/igv-reports/scripts/generate_tracks_json.py index 8e49a49..37dafb3 100755 --- a/igv-reports/scripts/generate_tracks_json.py +++ b/igv-reports/scripts/generate_tracks_json.py @@ -129,6 +129,8 @@ def main() -> None: ap.add_argument("--spec", required=True, help="YAML spec (see tracks_spec.example.yaml)") ap.add_argument("--run-dir", required=True, help="dir that relative urls in spec are resolved against") ap.add_argument("--out", required=True, help="output tracks.json path") + ap.add_argument("--force", action="store_true", + help="overwrite --out if it already exists (default: refuse and exit 2 so hand-edits aren't clobbered)") args = ap.parse_args() spec_path = Path(args.spec) @@ -144,6 +146,11 @@ def main() -> None: tracks = build_annotation_tracks(spec, run_dir) + build_sample_tracks(spec, run_dir) out_path = Path(args.out) + if out_path.exists() and not args.force: + raise SystemExit( + f"ERROR: {out_path} already exists. A user may have hand-edited it after generation.\n" + " Pass --force to overwrite, or move the existing file aside and rerun." + ) out_path.parent.mkdir(parents=True, exist_ok=True) with out_path.open("w") as fh: json.dump(tracks, fh, indent=2) diff --git a/igv-reports/scripts/prep_track.sh b/igv-reports/scripts/prep_track.sh index def917c..42b2b01 100755 --- a/igv-reports/scripts/prep_track.sh +++ b/igv-reports/scripts/prep_track.sh @@ -14,24 +14,56 @@ # # Usage: # prep_track.sh <track.gff3.gz | track.gtf.gz | track.bed.gz> +# prep_track.sh <input.gz> --out <sibling.bgz.gz> # -# Output: +# In-place mode (default): # <input> (replaced with new bgzip) # <input>.tbi (new tabix index) # <input>.bak.original_gzip (backup of the original .gz) +# +# Sibling mode (--out PATH; non-destructive): +# <input> (unchanged) +# <out> (new bgzip — same extension family as input) +# <out>.tbi (new tabix index) +# (no backup created — original is left as-is) set -euo pipefail -if [[ $# -ne 1 ]]; then - echo "Usage: $0 <track.gff3.gz | track.gtf.gz | track.bed.gz>" >&2 +INPUT="" +OUT="" +while [[ $# -gt 0 ]]; do + case "$1" in + --out) + [[ $# -lt 2 ]] && { echo "ERROR: --out requires a path" >&2; exit 2; } + OUT=$2; shift 2 ;; + --out=*) + OUT=${1#--out=}; shift ;; + -h|--help) + sed -n '2,28p' "$0" >&2; exit 0 ;; + --) + shift; break ;; + -*) + echo "ERROR: unknown flag: $1" >&2; exit 2 ;; + *) + if [[ -z "$INPUT" ]]; then INPUT=$1 + else echo "ERROR: unexpected positional arg: $1" >&2; exit 2 + fi + shift ;; + esac +done + +if [[ -z "$INPUT" ]]; then + echo "Usage: $0 <track.gff3.gz | track.gtf.gz | track.bed.gz> [--out <sibling.gz>]" >&2 exit 2 fi - -INPUT=$1 if [[ ! -f "$INPUT" ]]; then echo "ERROR: file not found: $INPUT" >&2 exit 2 fi +if [[ -n "$OUT" && -e "$OUT" ]]; then + echo "ERROR: --out target already exists: $OUT — refusing to overwrite. Move it aside and rerun." >&2 + exit 2 +fi # Detect format by suffix. case "$INPUT" in @@ -44,30 +76,50 @@ esac # Need bgzip / tabix / sort / gunzip. for tool in bgzip tabix sort gunzip awk file; do if ! command -v "$tool" >/dev/null 2>&1; then - echo "ERROR: $tool not on PATH. Activate the snakemake conda env first." >&2 + echo "ERROR: $tool not on PATH. Install htslib and add bgzip/tabix to PATH first." >&2 exit 2 fi done +# Resolve where the final bgzip + .tbi will land. In sibling mode we never +# touch the original. In in-place mode the target IS the original, with a +# backup taken first. +if [[ -n "$OUT" ]]; then + TARGET=$OUT + mkdir -p "$(dirname "$TARGET")" +else + TARGET=$INPUT +fi + # Detect if already bgzip — skip the whole conversion if it is and just -# rebuild the index. +# rebuild the index. (In sibling mode this means: copy + index, leaving +# the original untouched.) if file "$INPUT" | grep -q "extra field"; then - echo "[$(date '+%F %T')] $INPUT is already bgzip; rebuilding tabix index only." - rm -f "${INPUT}.tbi" - tabix -p "$FMT" "$INPUT" - echo "[$(date '+%F %T')] DONE: ${INPUT}.tbi" + if [[ "$TARGET" != "$INPUT" ]]; then + cp -p "$INPUT" "$TARGET" + echo "[$(date '+%F %T')] $INPUT already bgzip; copied to $TARGET, rebuilding tabix index." + else + echo "[$(date '+%F %T')] $INPUT is already bgzip; rebuilding tabix index only." + fi + rm -f "${TARGET}.tbi" + tabix -p "$FMT" "$TARGET" + echo "[$(date '+%F %T')] DONE: ${TARGET}.tbi" exit 0 fi -BACKUP="${INPUT}.bak.original_gzip" -if [[ -f "$BACKUP" ]]; then - echo "[$(date '+%F %T')] backup already exists: $BACKUP — refusing to overwrite. Move it aside and rerun if you want a fresh backup." -else - cp -p "$INPUT" "$BACKUP" - echo "[$(date '+%F %T')] backed up to $BACKUP" +# In-place mode: take a backup of the original. In sibling mode no backup is +# needed since the original is never modified. +if [[ "$TARGET" == "$INPUT" ]]; then + BACKUP="${INPUT}.bak.original_gzip" + if [[ -f "$BACKUP" ]]; then + echo "[$(date '+%F %T')] backup already exists: $BACKUP — refusing to overwrite. Move it aside and rerun if you want a fresh backup." + else + cp -p "$INPUT" "$BACKUP" + echo "[$(date '+%F %T')] backed up to $BACKUP" + fi fi -# Decompress to a sibling temp. +# Decompress to a sibling-of-INPUT temp (always, regardless of target). TMP="${INPUT%.gz}.unsorted.tmp" SORTED="${INPUT%.gz}.sorted.tmp" gunzip -c "$INPUT" > "$TMP" @@ -86,21 +138,29 @@ grep -v '^#' "$TMP" \ >> "$SORTED" echo "[$(date '+%F %T')] sorted by chr,pos (col $POS_COL) into $SORTED" -# bgzip into place (replaces the original) and index. -mv "$SORTED" "${INPUT%.gz}" +# bgzip and index. Sibling mode: SORTED -> TARGET. In-place: SORTED -> TARGET (== INPUT). +TARGET_UNCOMPRESSED="${TARGET%.gz}" +mv "$SORTED" "$TARGET_UNCOMPRESSED" rm -f "$TMP" -bgzip -@ 4 "${INPUT%.gz}" -echo "[$(date '+%F %T')] bgzipped: $INPUT ($(stat -c %s "$INPUT") bytes)" +# Remove any pre-existing .gz at the target (in in-place mode the original +# plain-gzip file is still present; bgzip refuses to overwrite without -f). +rm -f "$TARGET" +bgzip -@ 4 "$TARGET_UNCOMPRESSED" +echo "[$(date '+%F %T')] bgzipped: $TARGET ($(stat -c %s "$TARGET") bytes)" -rm -f "${INPUT}.tbi" -tabix -p "$FMT" "$INPUT" -echo "[$(date '+%F %T')] indexed: ${INPUT}.tbi ($(stat -c %s "${INPUT}.tbi") bytes)" +rm -f "${TARGET}.tbi" +tabix -p "$FMT" "$TARGET" +echo "[$(date '+%F %T')] indexed: ${TARGET}.tbi ($(stat -c %s "${TARGET}.tbi") bytes)" # Sanity check: pull the first contig's first 100 kb and confirm tabix returns rows. -FIRST_CONTIG=$(zcat "$INPUT" | awk '$1!~/^#/ {print $1; exit}') +FIRST_CONTIG=$(zcat "$TARGET" | awk '$1!~/^#/ {print $1; exit}') if [[ -n "$FIRST_CONTIG" ]]; then - N=$(tabix "$INPUT" "${FIRST_CONTIG}:1-100000" | wc -l) + N=$(tabix "$TARGET" "${FIRST_CONTIG}:1-100000" | wc -l) echo "[$(date '+%F %T')] sanity: ${FIRST_CONTIG}:1-100000 returns $N row(s)" fi -echo "[$(date '+%F %T')] DONE — track ready for igv-reports. Original preserved at $BACKUP" +if [[ "$TARGET" == "$INPUT" ]]; then + echo "[$(date '+%F %T')] DONE — track ready for igv-reports. Original preserved at $BACKUP" +else + echo "[$(date '+%F %T')] DONE — sibling track ready at $TARGET. Original $INPUT untouched." +fi From 4c261f5961464dab4acd5a9d2ac867c1a19ade24 Mon Sep 17 00:00:00 2001 From: sahuno <ekwame001@gmail.com> Date: Mon, 18 May 2026 14:41:49 -0400 Subject: [PATCH 4/9] igv-reports: annotation `default:` shortcut for methylation YAML MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Methylation users (--track-config path) no longer have to hand-paste absolute paths for CpG islands / gencode / RepeatMasker / EPDnew into the tracks YAML. The same databases YAML resolution the SV viewer driver already uses (--genome hg38 -> auto-resolved tracks) is now available via a `default:` shortcut: ```yaml genome: hg38 annotation: - default: gencode - default: cgi - default: repmasker - default: epdnew_coding # hg38 only - default: epdnew_noncoding # hg38 only ``` - 5 valid keys: cgi, gencode, repmasker, epdnew_coding, epdnew_noncoding. - Each comes with a colorblind-safe Okabe-Ito color and sensible displayMode you can override per entry (name/color/displayMode). - Mixes freely with the existing explicit `- name: ... url: ...` form. - Needs a databases YAML at $IGV_REPORTS_DB_CONFIG or --db-config PATH; schema is `reference_genomes.local.<genome>.{CpGIslands, gtf, repMaskerBed, EPDnewCoding, EPDnewNonCoding}`. See references/databases_config_paths.md. Backwards-compatible: explicit `- name: ... url: ...` entries work unchanged and don't need --db-config / $IGV_REPORTS_DB_CONFIG to be set. The db-config is only loaded if the spec actually uses a `default:` shortcut, so existing self-contained specs stay self-contained. Error paths: unknown key, missing genome in YAML, missing yaml key for the chosen genome, missing path on disk, and shortcut-used-without- top-level-`genome:` all raise SystemExit with actionable messages. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --- igv-reports/SKILL.md | 34 ++++ igv-reports/scripts/generate_tracks_json.py | 187 +++++++++++++++++++- 2 files changed, 219 insertions(+), 2 deletions(-) diff --git a/igv-reports/SKILL.md b/igv-reports/SKILL.md index 2e54148..e519987 100644 --- a/igv-reports/SKILL.md +++ b/igv-reports/SKILL.md @@ -526,6 +526,40 @@ python scripts/build_igvreports.py \ --output results/<run>/methylation_report.hg38.html ``` +### Annotation shortcuts in the YAML + +The default `--tracks` path (SV/variant viewers) auto-resolves CpG islands, +gencode, and RepeatMasker from a databases YAML when you pass +`--genome hg38`. On the `--track-config` (methylation) path you used to +have to hand-paste those paths into the YAML. As of the methylation-polish +round, you can use a `default:` shortcut for the same resolution: + +```yaml +genome: hg38 + +annotation: + # SHORTCUT — resolved from the databases YAML for the genome above. + # Gets an Okabe-Ito color + sensible displayMode you can override per entry. + - default: gencode + - default: cgi + - default: repmasker + - default: epdnew_coding # hg38 only + - default: epdnew_noncoding # hg38 only + + # Mix with EXPLICIT entries when needed (e.g. a pre-sliced custom track): + - name: "My custom peak set" + url: peaks/promoter_slices.bed + format: bed +``` + +Valid `default:` keys: `cgi`, `gencode`, `repmasker`, `epdnew_coding`, +`epdnew_noncoding`. Mixing both forms is supported; order is preserved. +Override the canned `name`/`color`/`displayMode` per entry by adding the +field alongside `default:`. The shortcut needs a top-level `genome:` in +the spec, plus a databases YAML on `--db-config PATH` or +`$IGV_REPORTS_DB_CONFIG` (see `references/databases_config_paths.md` for +the schema). + Key methylation-specific defaults: - `--flanking 0` (sites BED already encodes the window — promoter/gene span). - `--info-columns name` (surface the BED `name` column in the variant table). diff --git a/igv-reports/scripts/generate_tracks_json.py b/igv-reports/scripts/generate_tracks_json.py index 37dafb3..baedd42 100755 --- a/igv-reports/scripts/generate_tracks_json.py +++ b/igv-reports/scripts/generate_tracks_json.py @@ -32,6 +32,7 @@ import argparse import json +import os import sys from pathlib import Path @@ -58,6 +59,123 @@ } +# YAML shortcut keys (annotation: - default: <KEY>) map to the +# databases_config.yaml field for each genome plus display metadata. +# Colors are Okabe-Ito where chosen — colorblind-safe. format/displayMode +# match what build_igvreports.py emits on the non-track-config path. +ANNOTATION_DEFAULTS = { + "cgi": { + "display_name": "CpG islands", + "yaml_key": "CpGIslands", + "format": "bed", + "displayMode": "EXPANDED", + "color": "rgb(0,158,115)", # Okabe-Ito green + }, + "gencode": { + "display_name": "Gencode", + "yaml_key": "gtf", + "format": "gff", # works for .gtf.gz and .gff3.gz + "displayMode": "EXPANDED", + "color": None, # IGV.js renders its own gene-track palette + }, + "repmasker": { + "display_name": "RepeatMasker", + "yaml_key": "repMaskerBed", + "format": "bed", + "displayMode": "COLLAPSED", + "color": None, + }, + "epdnew_coding": { + "display_name": "EPDnew (coding)", + "yaml_key": "EPDnewCoding", + "format": "bed", + "displayMode": "EXPANDED", + "color": "rgb(213,94,0)", # Okabe-Ito vermillion + }, + "epdnew_noncoding": { + "display_name": "EPDnew (non-coding)", + "yaml_key": "EPDnewNonCoding", + "format": "bed", + "displayMode": "EXPANDED", + "color": "rgb(86,180,233)", # Okabe-Ito sky blue + }, +} + + +def load_db_config(path: Path) -> dict: + """Load databases_config.yaml; return {} on miss. Same semantics as the + twin function in build_igvreports.py so the two stay aligned.""" + if not path.exists(): + sys.stderr.write( + f"[generate_tracks_json] WARNING: db-config not found at {path}\n" + " Annotation entries using `default:` shortcuts will fail to resolve.\n" + " Use explicit `url:` paths, or set $IGV_REPORTS_DB_CONFIG.\n" + ) + return {} + with path.open() as fh: + return yaml.safe_load(fh) or {} + + +def resolve_annotation_default(default_key: str, genome: str, cfg: dict) -> dict: + """Look up a built-in annotation by short key (`cgi`, `gencode`, ...) for + the given genome in the databases YAML. Returns a partial track dict with + `display_name` / `url` / `indexURL` / `format` / `displayMode` / `color` + populated; caller merges with name-overrides from the YAML. + + Raises SystemExit if the key is unknown, the genome is absent, or the + resolved path doesn't exist on disk.""" + if default_key not in ANNOTATION_DEFAULTS: + valid = ", ".join(sorted(ANNOTATION_DEFAULTS)) + raise SystemExit( + f"ERROR: unknown annotation default '{default_key}'. Valid: {valid}" + ) + meta = ANNOTATION_DEFAULTS[default_key] + g = cfg.get("reference_genomes", {}).get("local", {}).get(genome, {}) + if not g: + raise SystemExit( + f"ERROR: db-config has no entry for genome '{genome}' " + f"(needed to resolve `default: {default_key}`)." + ) + yaml_key = meta["yaml_key"] + raw = g.get(yaml_key) + if not raw: + raise SystemExit( + f"ERROR: db-config has no '{yaml_key}' for genome '{genome}' " + f"(needed to resolve `default: {default_key}`)." + ) + # For hg38 gencode, prefer the bgzip+tabix .gff3.gz sibling if present + # (mirrors build_igvreports.py:resolve_default_tracks gencode handling). + url = raw + if default_key == "gencode" and genome == "hg38": + sibling = Path(raw).parent / "gencode.v47.annotation.gff3.gz" + if sibling.exists() and (sibling.parent / (sibling.name + ".tbi")).exists(): + url = str(sibling) + if not Path(url).exists(): + raise SystemExit( + f"ERROR: resolved path missing on disk for `default: {default_key}` " + f"({genome}): {url}" + ) + # indexURL: include only if it actually exists. tabix .tbi is the standard + # sibling for bgzipped tracks; igv.js falls back gracefully when absent. + index_url = None + for cand in (url + ".tbi", url + ".csi"): + if Path(cand).exists(): + index_url = cand + break + + track: dict = { + "display_name": meta["display_name"], + "url": url, + "format": meta["format"], + "displayMode": meta["displayMode"], + } + if index_url is not None: + track["indexURL"] = index_url + if meta["color"] is not None: + track["color"] = meta["color"] + return track + + def abspath_relative_to(p: str, run_dir: Path) -> str: """Resolve `p` to an absolute path. If `p` is already absolute, return as-is.""" pp = Path(p) @@ -66,9 +184,51 @@ def abspath_relative_to(p: str, run_dir: Path) -> str: return str((run_dir / pp).resolve()) -def build_annotation_tracks(spec: dict, run_dir: Path) -> list[dict]: +def build_annotation_tracks(spec: dict, run_dir: Path, cfg: dict | None = None) -> list[dict]: + """Build the annotation-track list. Each entry in `spec["annotation"]` + is either: + + Explicit (existing behavior): + - name: "Gencode v47" + url: /abs/or/relative/path.gff3.gz + indexURL: /abs/or/relative/path.gff3.gz.tbi (optional) + format: gff (optional, default bed) + displayMode: EXPANDED (optional) + color: "rgb(...)" (optional) + + Shortcut (NEW — needs top-level `genome:` in spec and a loaded `cfg`): + - default: gencode # one of: cgi, gencode, repmasker, + # epdnew_coding, epdnew_noncoding + name: "Gencode v47" # OPTIONAL override of the canned display name + color: "rgb(...)" # OPTIONAL override of the canned color + displayMode: COLLAPSED # OPTIONAL override + + Shortcut entries are resolved through resolve_annotation_default() against + the databases YAML keyed by the spec's top-level `genome:`.""" out: list[dict] = [] + genome = spec.get("genome") for a in spec.get("annotation", []): + if "default" in a: + if not genome: + raise SystemExit( + "ERROR: annotation entry uses `default:` but spec is missing " + "top-level `genome:` — add e.g. `genome: hg38` to the YAML." + ) + resolved = resolve_annotation_default(a["default"], genome, cfg or {}) + track = { + "name": a.get("name", resolved["display_name"]), + "url": resolved["url"], + "format": a.get("format", resolved["format"]), + "type": "annotation", + "displayMode": a.get("displayMode", resolved["displayMode"]), + } + if "indexURL" in resolved: + track["indexURL"] = resolved["indexURL"] + if a.get("color") or resolved.get("color"): + track["color"] = a.get("color", resolved.get("color")) + out.append(track) + continue + # Explicit-path entry — preserves the prior behavior verbatim. track = { "name": a["name"], "url": abspath_relative_to(a["url"], run_dir), @@ -129,6 +289,14 @@ def main() -> None: ap.add_argument("--spec", required=True, help="YAML spec (see tracks_spec.example.yaml)") ap.add_argument("--run-dir", required=True, help="dir that relative urls in spec are resolved against") ap.add_argument("--out", required=True, help="output tracks.json path") + ap.add_argument("--db-config", default=os.environ.get("IGV_REPORTS_DB_CONFIG"), help=( + "Databases YAML used to resolve `annotation: - default: <key>` shortcuts " + "(cgi/gencode/repmasker/epdnew_coding/epdnew_noncoding) for the spec's " + "`genome:`. Defaults to $IGV_REPORTS_DB_CONFIG. " + "Not loaded if no shortcut entries appear. The YAML schema is " + "`reference_genomes.local.<genome>.{CpGIslands,gtf,repMaskerBed," + "EPDnewCoding,EPDnewNonCoding}` — see references/databases_config_paths.md." + )) ap.add_argument("--force", action="store_true", help="overwrite --out if it already exists (default: refuse and exit 2 so hand-edits aren't clobbered)") args = ap.parse_args() @@ -143,7 +311,22 @@ def main() -> None: with spec_path.open() as fh: spec = yaml.safe_load(fh) - tracks = build_annotation_tracks(spec, run_dir) + build_sample_tracks(spec, run_dir) + # Only load the db-config if any annotation entry uses the shortcut form; + # specs that hand-paste paths remain self-contained. + needs_cfg = any("default" in a for a in spec.get("annotation", [])) + if needs_cfg: + if not args.db_config: + raise SystemExit( + "ERROR: spec has `default:` annotation shortcuts but --db-config " + "is not set and $IGV_REPORTS_DB_CONFIG is empty.\n" + " Pass --db-config /path/to/databases.yaml, or convert the " + "shortcuts to explicit `url:` entries." + ) + cfg = load_db_config(Path(args.db_config)) + else: + cfg = {} + + tracks = build_annotation_tracks(spec, run_dir, cfg) + build_sample_tracks(spec, run_dir) out_path = Path(args.out) if out_path.exists() and not args.force: From a903a725b3f13e11b88bc0bb3552b8715d38ffa2 Mon Sep 17 00:00:00 2001 From: sahuno <ekwame001@gmail.com> Date: Mon, 18 May 2026 17:41:30 -0400 Subject: [PATCH 5/9] igv-reports: --also-png builds HTML and per-region PNGs in one command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The HTML report is the deep-dive view; sometimes you also need static PNGs you can email, drop in a Slack channel, or paste into slides. New --also-png flag invokes the sister `igver` tool against the SAME sites BED + SAME resolved track list as create_report, writes a manifest TSV bridging PNG ↔ HTML rows, and verify_cohort.py runs three additional checks to confirm the two artifacts stay in sync. ```bash python scripts/build_igvreports.py --samplesheet samplesheet.tsv --genome hg38 --output-dir results/run/reports/ --jobs 6 --also-png --png-dpi 600 ``` Output layout per sample: - <sample>.hg38.html interactive - png_<sample>.hg38/png/<region>.png per-region PNGs - png_<sample>.hg38/manifest.tsv bridge: BED row ↔ PNG ↔ HTML Five consistency levers: 1. Sites BED with --flanking baked in (igver and igv.js see identical coordinates — no renderer divergence on the flanked window). 2. Single resolved track list (positional path reuses the exact list passed to create_report; --track-config path extracts local `url:` entries from the JSON, http(s) skipped — igver can't slice them). 3. Matched display mode (--png-display-mode collapse aligns with the HTML's BAM_DEFAULTS displayMode COLLAPSED). 4. UID-based filenames — BED `name` column drives both the HTML table label (via --info-columns name) and the PNG filename suffix (`<chr-start-end>.<uid>.png`). 5. manifest.tsv audit trail (11 cols including html_table_row), read by verify_cohort.py to power three cross-artifact checks. verify_cohort.py picks up the manifest automatically and runs three extra checks per sample: - png_count_matches_bed: catches partial igver runs, stale manifests. - pngs_exist_and_nonempty: catches empty IGV snapshots (< 10 KB). - png_html_row_alignment: catches HTML/PNG drift across rebuilds. igver resolution order: --igver-cmd / $IGVER_CMD / `igver` on PATH. If none resolve, exit before the HTML build so you don't pay that cost before learning PNGs are unavailable. Methylation caveat documented: HTML uses bedGraph; igver per-read view uses BAM, igver cross-sample view uses bigwig. Content can be made identical only if both formats trace back to the same modkit pileup output. Tests: 109/109 pass (was 84 → +25 new across test_build_pngs.py and test_verify_cohort_png.py). Also mirrored the previously-missed test_generate_tracks_json.py from the methylation-shortcut round. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --- igv-reports/SKILL.md | 101 +++++++ igv-reports/scripts/build_igvreports.py | 254 ++++++++++++++++++ igv-reports/scripts/verify_cohort.py | 157 ++++++++++- igv-reports/tests/unit/test_build_pngs.py | 245 +++++++++++++++++ .../tests/unit/test_generate_tracks_json.py | 226 ++++++++++++++++ .../tests/unit/test_verify_cohort_png.py | 190 +++++++++++++ 6 files changed, 1168 insertions(+), 5 deletions(-) create mode 100644 igv-reports/tests/unit/test_build_pngs.py create mode 100644 igv-reports/tests/unit/test_generate_tracks_json.py create mode 100644 igv-reports/tests/unit/test_verify_cohort_png.py diff --git a/igv-reports/SKILL.md b/igv-reports/SKILL.md index e519987..419b01a 100644 --- a/igv-reports/SKILL.md +++ b/igv-reports/SKILL.md @@ -582,6 +582,107 @@ decision lands in the run log. Full recipe and rationale: `references/methylation_ont.md`. Worked example with real data: `examples/methylation_ont/`. +## Exporting HTML and PNG side-by-side (`--also-png`) + +The HTML report is the deep-dive view; sometimes you also need static +PNGs you can email, drop in a Slack channel, or paste into slides. The +driver's `--also-png` flag invokes the sister `igver` tool against the +**same sites BED and same track list** that drove `create_report`, so +both artifacts cover identical regions with matching content. + +```bash +python scripts/build_igvreports.py \ + --samplesheet samplesheet.tsv \ + --genome hg38 \ + --output-dir results/run/reports/ \ + --jobs 6 \ + --also-png \ + --png-dpi 600 --png-display-mode collapse +``` + +Output layout per sample: + +``` +results/run/reports/ +├── <sample>.hg38.html # interactive +├── png_<sample>.hg38/ +│ ├── igver_regions.bed # flanked BED with UIDs (igver -r) +│ ├── igver_input.txt # track paths, one per line (igver -i) +│ ├── manifest.tsv # bridge: BED row ↔ PNG ↔ HTML row +│ └── png/ +│ ├── chr1-100-500.alpha.png # one PNG per region +│ └── chr2-0-700.beta.png +└── index.html +``` + +### How consistency is guaranteed — five levers + +1. **Single sites BED with `--flanking` baked in.** The driver writes + `igver_regions.bed` with `start − flanking` and `end + flanking` + already applied (clamped to 0 on the low side); igver sees the same + coordinates create_report's igv.js viewer slices to. +2. **Single resolved track list.** On the default (positional) path the + exact `[BAMs, VCF, extras, defaults]` list passed to `create_report` is + also written to `igver_input.txt`. On the `--track-config` path the + local-path `url:` entries from the JSON are extracted (http(s) URLs are + skipped — igver can't consume them). +3. **Matched display mode.** Default is `--png-display-mode collapse` to + line up with the HTML's `BAM_DEFAULTS displayMode: COLLAPSED`. Override + to `expand` for per-read SV inspection on both artifacts. +4. **UID-based filenames.** The BED's `name` column (auto-assigned + `region_<idx>` when missing) becomes both the HTML table label (via + `--info-columns name`) and the PNG filename suffix + (`<chr-start-end>.<uid>.png`). A user finds the same region in either + artifact by the same string. +5. **`manifest.tsv` audit trail.** Per-sample TSV with columns: + `bed_row_idx, uid, chrom, start_orig, end_orig, start_flanked, + end_flanked, region, png_path, html_path, html_table_row`. One row + per region in BED order. `verify_cohort.py` reads this to run three + PNG-side checks (count matches, exist + non-empty, html-row contiguity). + +### Resolution of the `igver` invocation + +Order, first match wins: +1. `--igver-cmd '...'` (split on whitespace — supports `apptainer exec ... igver`). +2. `$IGVER_CMD` env var (same shape). +3. `igver` on PATH. + +If none resolve, the build exits before invoking create_report so you +don't pay the HTML cost before finding out PNGs are unavailable. Install +with `pip install igver` or pull a pre-built SIF and point `--igver-cmd` +at it. + +### Methylation caveat (bigwig vs bedGraph) + +The HTML methylation path uses **bedGraph** tracks (igv.js consumes +those directly); igver's per-read methylation view uses **BAMs** with +`--color-by BASE_MODIFICATION`, and igver's cross-sample comparison view +uses **bigwig** tracks. Content can be made identical only if both +formats trace back to the same `modkit pileup` output (`modkit bedmethyl +tobigwig` of the same bedGraph). The driver's `--also-png` passes the +JSON's `url:` entries through verbatim, so if your YAML lists bedGraphs +they'll go to igver as-is — igver will render them but the result may +look different from the HTML's color-coded per-read view. For +publication-quality methylation PNGs, supply a parallel `tracks.json` +that lists bigwigs and run `igver` separately. + +For SV/variant viewers this caveat doesn't apply — both render the +identical BAMs and the result is content-equivalent. + +### Cross-artifact verification + +When `--also-png` is set the driver automatically writes the manifest; +`verify_cohort.py` then runs three additional checks per sample: + +| Check | Catches | +|---|---| +| `png_count_matches_bed` | partial igver run (SIGKILL mid-batch), stale manifest from a previous build, filename collisions | +| `pngs_exist_and_nonempty` | empty IGV screenshots (< 10 KB threshold; useful screenshots are typically ≥ 50 KB) | +| `png_html_row_alignment` | manifest rows referencing a different HTML, html_table_row not contiguous 1..N | + +`--png-min-size-kb 5.0` lowers the threshold if you have legitimate +no-data regions where igver produces a near-empty PNG. + ## See also - `references/best_practices.md` — full create_report flag reference, diff --git a/igv-reports/scripts/build_igvreports.py b/igv-reports/scripts/build_igvreports.py index 68c88a9..6c33e54 100755 --- a/igv-reports/scripts/build_igvreports.py +++ b/igv-reports/scripts/build_igvreports.py @@ -41,6 +41,7 @@ from __future__ import annotations import argparse +import json import logging import os import shutil @@ -321,6 +322,168 @@ def apptainer_create_report_prefix(sif: Path) -> list[str]: return ["singularity", "exec", "--cleanenv", *apptainer_bind_args(), str(sif), "create_report"] +def _read_sites_bed_rows(sites: Path) -> list[dict]: + """Read a sites BED into a list of dicts, one per data row. Lines + starting with `#` / `track ` / `browser ` are skipped (same rule + `validate_sites_bed` uses). The 4th column (`name`) becomes the UID + when present; otherwise an auto-generated `region_<idx>` is used.""" + rows: list[dict] = [] + with sites.open() as fh: + for line in fh: + line = line.rstrip("\n") + if not line or line.startswith("#") or line.startswith("track ") or line.startswith("browser "): + continue + cols = line.split("\t") + if len(cols) < 3: + continue + chrom, start_s, end_s = cols[0], cols[1], cols[2] + name = cols[3].strip() if len(cols) >= 4 and cols[3].strip() else "" + rows.append({ + "chrom": chrom, + "start": int(start_s), + "end": int(end_s), + "name": name, + }) + for idx, r in enumerate(rows, start=1): + if not r["name"]: + r["name"] = f"region_{idx:03d}" + r["bed_row_idx"] = idx + return rows + + +def _write_igver_regions_bed(rows: list[dict], flanking: int, out: Path) -> None: + """Emit a BED with `--flanking` baked into start/end and UID in col 4. + Filename collisions in igver's `chr-start-end.<uid>.png` are avoided by + the auto-assigned UIDs in `_read_sites_bed_rows`.""" + with out.open("w") as fh: + for r in rows: + start = max(0, r["start"] - flanking) + end = r["end"] + flanking + fh.write(f"{r['chrom']}\t{start}\t{end}\t{r['name']}\n") + + +def _write_igver_input_list(tracks: list[str], out: Path) -> None: + """One path per line — igver's `-i FOO.txt` consumes this verbatim.""" + with out.open("w") as fh: + for t in tracks: + fh.write(f"{t}\n") + + +def _resolve_igver_cmd(override: str | None) -> list[str]: + """Return the argv prefix used to invoke igver. Resolution order: + 1. Explicit override (split on whitespace — supports `apptainer exec ... igver`). + 2. $IGVER_CMD env var (same shape as the override). + 3. `igver` on PATH.""" + if override: + return override.split() + env_cmd = os.environ.get("IGVER_CMD") + if env_cmd: + return env_cmd.split() + on_path = shutil.which("igver") + if on_path: + return [on_path] + raise SystemExit( + "ERROR: igver not found.\n" + " Install: pip install igver\n" + " Override: --igver-cmd 'apptainer exec /path/to/igver.sif igver'\n" + " Or set $IGVER_CMD" + ) + + +def build_pngs_with_igver( + sites: Path, + tracks: list[str], + genome: str, + flanking: int, + out_dir: Path, + log: logging.Logger, + html_path: Path, + igver_cmd: str | None = None, + dpi: int = 300, + display_mode: str = "collapse", + panel_height: int | None = None, + fmt: str = "png", +) -> Path: + """Invoke igver against the same sites + track list that drove + create_report, write a manifest mapping each BED row to its PNG path + and HTML row, return the manifest path. + + Consistency contract (the five levers from the design): + 1. Same sites BED + same `flanking` baked into the BED rows we pass. + 2. Same resolved track list. + 3. `display_mode` chosen to match HTML defaults (collapse). + 4. UID-based filenames let a user pair PNG ↔ HTML by string match. + 5. The manifest TSV is the audit trail; verify_cohort.py reads it. + + Output layout (caller controls `out_dir`): + out_dir/ + igver_regions.bed - flanked BED with UIDs in col 4 (igver -r) + igver_input.txt - track paths, one per line (igver -i) + png/ - actual PNGs (igver -o); filenames are + chr-start-end.<uid>.<png|svg|pdf> + manifest.tsv - cross-artifact bridge to the HTML + """ + out_dir.mkdir(parents=True, exist_ok=True) + png_dir = out_dir / "png" + png_dir.mkdir(parents=True, exist_ok=True) + + rows = _read_sites_bed_rows(sites) + if not rows: + raise SystemExit(f"ERROR: no data rows found in sites BED: {sites}") + + regions_bed = out_dir / "igver_regions.bed" + _write_igver_regions_bed(rows, flanking, regions_bed) + input_txt = out_dir / "igver_input.txt" + _write_igver_input_list(tracks, input_txt) + + cmd = list(_resolve_igver_cmd(igver_cmd)) + [ + "-i", str(input_txt), + "-r", str(regions_bed), + "-o", str(png_dir), + "-g", genome, + "-d", display_mode, + "--dpi", str(dpi), + "-f", fmt, + "--no-singularity", + ] + if panel_height is not None: + cmd.extend(["-p", str(panel_height)]) + + log.info(f" igver: dpi={dpi} display={display_mode} fmt={fmt} regions={len(rows)}") + log.info(f" igver cmd: {' '.join(cmd)}") + proc = subprocess.run(cmd, capture_output=True, text=True) + if proc.returncode != 0: + log.error(f"igver FAILED for {sites}") + log.error(f"stdout: {proc.stdout}") + log.error(f"stderr: {proc.stderr}") + raise SystemExit(proc.returncode) + + # PNG filename convention is set by igver's _parse_bed_file: + # `<chrom>-<start>-<end>.<uid>.<ext>`. We reconstruct it here. + ext = "svg" if fmt in ("svg", "pdf") else fmt + manifest = out_dir / "manifest.tsv" + with manifest.open("w") as fh: + fh.write( + "#bed_row_idx\tuid\tchrom\tstart_orig\tend_orig\t" + "start_flanked\tend_flanked\tregion\tpng_path\thtml_path\thtml_table_row\n" + ) + for r in rows: + start_f = max(0, r["start"] - flanking) + end_f = r["end"] + flanking + fname = f"{r['chrom']}-{start_f}-{end_f}.{r['name']}.{ext}" + png_rel = (png_dir / fname).resolve() + html_rel = html_path.resolve() + fh.write( + f"{r['bed_row_idx']}\t{r['name']}\t{r['chrom']}\t" + f"{r['start']}\t{r['end']}\t{start_f}\t{end_f}\t" + f"{r['chrom']}:{start_f}-{end_f}\t{png_rel}\t{html_rel}\t" + f"{r['bed_row_idx']}\n" + ) + + log.info(f" png manifest: {manifest} ({len(rows)} rows)") + return manifest + + def build_one( sites: Path, bams: list[Path], @@ -336,6 +499,11 @@ def build_one( report_type: str | None = None, info_columns: list[str] | None = None, use_apptainer: bool = False, + also_png: bool = False, + igver_cmd: str | None = None, + png_dpi: int = 300, + png_display_mode: str = "collapse", + png_out_dir: Path | None = None, ) -> Path: """Run create_report for one site set and return the HTML path. @@ -411,6 +579,53 @@ def build_one( if output.exists(): log.info(f" HTML: {output} ({output.stat().st_size / 1024 / 1024:.2f} MB)") + + # PNG sidecar — same regions, same tracks, written next to the HTML. + # On the --track-config path we extract every `url` from the JSON + # (file resources only — http(s) URLs are skipped since igver can't + # consume them); on the positional path we reuse the same ordered + # list we just passed to create_report. + if also_png: + if track_config is not None: + try: + with track_config.open() as fh: + cfg_tracks = json.load(fh) + except Exception as e: + log.warning(f"--also-png: unable to parse --track-config JSON: {e} — skipping PNG step") + return output + png_tracks: list[str] = [] + for t in cfg_tracks if isinstance(cfg_tracks, list) else []: + url = t.get("url") if isinstance(t, dict) else None + if url and not str(url).startswith(("http://", "https://")): + png_tracks.append(str(url)) + if not png_tracks: + log.warning("--also-png: track-config has no local-path tracks — skipping PNG step") + return output + else: + png_tracks = [str(b) for b in bams] + if vcf: + png_tracks.append(str(vcf)) + png_tracks.extend(str(t) for t in extra_tracks) + png_tracks.extend(default_tracks) + + out_dir = png_out_dir if png_out_dir is not None else ( + output.parent / f"png_{output.stem}" + ) + parts = output.stem.split(".") + genome_tag = parts[-1] if len(parts) >= 2 else "hg38" + build_pngs_with_igver( + sites=sites, + tracks=png_tracks, + genome=genome_tag, + flanking=flanking, + out_dir=out_dir, + log=log, + html_path=output, + igver_cmd=igver_cmd, + dpi=png_dpi, + display_mode=png_display_mode, + ) + return output @@ -652,6 +867,37 @@ def main() -> None: help="VCF INFO or BED columns to surface in the variant table. " "For BED sites, 'name' is the most useful.", ) + ap.add_argument( + "--also-png", + action="store_true", + help="After create_report finishes, invoke igver against the same " + "sites BED + track list to produce per-region PNGs alongside " + "the HTML. PNGs land in <html_parent>/png_<sample>/png/ with " + "filename `<chr-start-end>.<uid>.png` (uid = BED `name` col, " + "auto-assigned `region_<idx>` when missing). A manifest TSV " + "bridges PNG ↔ HTML rows. Requires `igver` on PATH or " + "$IGVER_CMD / --igver-cmd override.", + ) + ap.add_argument( + "--igver-cmd", + default=None, + help="Override the igver invocation. Resolution order: this flag, " + "$IGVER_CMD, `igver` on PATH. Pass the full command including " + "any apptainer wrapper, e.g. 'apptainer exec /path/to/igver.sif igver'.", + ) + ap.add_argument( + "--png-dpi", + type=int, + default=300, + help="DPI for igver PNG output (default 300; bump to 600 for slide-quality).", + ) + ap.add_argument( + "--png-display-mode", + choices=["expand", "collapse", "squish"], + default="collapse", + help="igver `-d` flag. Default 'collapse' to match the HTML's BAM " + "BAM_DEFAULTS displayMode. Use 'expand' for per-read SV inspection.", + ) ap.add_argument( "--apptainer", action=argparse.BooleanOptionalAction, @@ -825,6 +1071,10 @@ def main() -> None: report_type=args.report_type, info_columns=args.info_columns, use_apptainer=args.apptainer, + also_png=args.also_png, + igver_cmd=args.igver_cmd, + png_dpi=args.png_dpi, + png_display_mode=args.png_display_mode, ) else: rows = parse_samplesheet(Path(args.samplesheet)) @@ -858,6 +1108,10 @@ def _build_row(row: dict) -> tuple[str, Path]: report_type=args.report_type, info_columns=args.info_columns, use_apptainer=args.apptainer, + also_png=args.also_png, + igver_cmd=args.igver_cmd, + png_dpi=args.png_dpi, + png_display_mode=args.png_display_mode, ) return sample, out_html diff --git a/igv-reports/scripts/verify_cohort.py b/igv-reports/scripts/verify_cohort.py index 4943349..18b3a07 100755 --- a/igv-reports/scripts/verify_cohort.py +++ b/igv-reports/scripts/verify_cohort.py @@ -56,6 +56,9 @@ --out results/<run>/reports/cohort_verify.tsv \\ --summary results/<run>/reports/cohort_verify.summary.md \\ --fail-on-fail + +Skill location: + <repo-root>/ """ from __future__ import annotations @@ -335,6 +338,133 @@ def check_sample_id_embedded(sample: str, html_path: Path) -> CohortCheck: # Allow-list (default tracks resolved from databases_config.yaml) # --------------------------------------------------------------------------- +# --------------------------------------------------------------------------- +# PNG-side checks (opt-in, only fire when a manifest exists alongside the HTML) +# --------------------------------------------------------------------------- + +def find_png_manifest(reports_dir: Path, sample: str, genome: str) -> Path | None: + """Return the manifest path written by `build_pngs_with_igver` if the + sample was built with --also-png, else None. + + Convention from build_igvreports.py: + <reports_dir>/png_<sample>.<genome>/manifest.tsv + """ + candidate = reports_dir / f"png_{sample}.{genome}" / "manifest.tsv" + return candidate if candidate.exists() else None + + +def _parse_png_manifest(manifest: Path) -> list[dict]: + """Read the manifest into a list of dicts. Schema is fixed at write time + (see build_igvreports.py:build_pngs_with_igver) so we use the file's `#` + header line for column names.""" + rows: list[dict] = [] + with manifest.open() as fh: + header_line = fh.readline().lstrip("#").rstrip("\n") + cols = header_line.split("\t") + for line in fh: + line = line.rstrip("\n") + if not line or line.startswith("#"): + continue + vals = line.split("\t") + if len(vals) != len(cols): + continue + rows.append(dict(zip(cols, vals))) + return rows + + +def check_png_count_matches_bed( + sample: str, manifest: Path, sites_path: Path, +) -> CohortCheck: + """P1 — manifest row count must equal the data-row count in the sites BED. + Catches a partial igver run (e.g. SIGKILL mid-way), filename collisions + that overwrite earlier PNGs, or a stale manifest from a previous build.""" + try: + rows = _parse_png_manifest(manifest) + except Exception as e: + return CohortCheck(sample, "png_count_matches_bed", "FAIL", + details=f"manifest unreadable: {e}") + try: + bed_rows = bir._read_sites_bed_rows(sites_path) + except Exception as e: + return CohortCheck(sample, "png_count_matches_bed", "FAIL", + details=f"sites BED unreadable: {e}") + if len(rows) == len(bed_rows): + return CohortCheck(sample, "png_count_matches_bed", "PASS", + observed=str(len(rows)), expected=str(len(bed_rows))) + return CohortCheck(sample, "png_count_matches_bed", "FAIL", + observed=str(len(rows)), expected=str(len(bed_rows)), + details="manifest row count != sites BED data row count") + + +def check_pngs_exist_and_nonempty( + sample: str, manifest: Path, min_size_kb: float = 10.0, +) -> CohortCheck: + """P2 — every PNG path in the manifest must exist and be larger than the + threshold. igver can produce a near-empty file on a region with no data + in any track; we want those flagged rather than silently shipped.""" + try: + rows = _parse_png_manifest(manifest) + except Exception as e: + return CohortCheck(sample, "pngs_exist_and_nonempty", "FAIL", + details=f"manifest unreadable: {e}") + missing: list[str] = [] + tiny: list[str] = [] + for r in rows: + p = Path(r.get("png_path", "")) + if not p.exists(): + missing.append(p.name) + continue + if p.stat().st_size < min_size_kb * 1024: + tiny.append(f"{p.name} ({p.stat().st_size} B)") + if not missing and not tiny: + return CohortCheck(sample, "pngs_exist_and_nonempty", "PASS", + observed=f"{len(rows)} pngs all present and >= {min_size_kb:.1f} kB") + parts = [] + if missing: + parts.append(f"missing: {missing[:3]}{'...' if len(missing) > 3 else ''}") + if tiny: + parts.append(f"below threshold: {tiny[:3]}{'...' if len(tiny) > 3 else ''}") + return CohortCheck(sample, "pngs_exist_and_nonempty", "FAIL", + observed=f"missing={len(missing)} tiny={len(tiny)}", + expected="all PNGs present, >= 10 kB", + details="; ".join(parts)) + + +def check_png_html_row_alignment( + sample: str, manifest: Path, html_path: Path, +) -> CohortCheck: + """P3 — every manifest row references the matching HTML, and html_table_row + indices form a contiguous 1..N sequence (no skips, no duplicates). This is + the audit-trail check: a user clicking row N in the HTML should be able to + find the PNG named in manifest row N.""" + try: + rows = _parse_png_manifest(manifest) + except Exception as e: + return CohortCheck(sample, "png_html_row_alignment", "FAIL", + details=f"manifest unreadable: {e}") + if not rows: + return CohortCheck(sample, "png_html_row_alignment", "FAIL", + details="manifest has no data rows") + html_resolved = str(html_path.resolve()) + wrong_html = [r for r in rows if r.get("html_path") != html_resolved] + try: + indices = [int(r["html_table_row"]) for r in rows] + except (KeyError, ValueError) as e: + return CohortCheck(sample, "png_html_row_alignment", "FAIL", + details=f"manifest html_table_row malformed: {e}") + expected_indices = list(range(1, len(rows) + 1)) + if wrong_html: + return CohortCheck(sample, "png_html_row_alignment", "FAIL", + details=f"{len(wrong_html)} manifest rows reference a different HTML") + if indices != expected_indices: + return CohortCheck(sample, "png_html_row_alignment", "FAIL", + observed=f"{indices[:5]}{'...' if len(indices) > 5 else ''}", + expected=f"contiguous 1..{len(rows)}", + details="html_table_row indices not contiguous") + return CohortCheck(sample, "png_html_row_alignment", "PASS", + observed=f"{len(rows)} aligned rows") + + def resolve_default_track_labels(db_config: Path, genome: str) -> set[str]: """Reuse the driver's logic so the allow-list stays in sync with what was actually loaded. Returns Path.stem of each default track (matches igv- @@ -414,13 +544,20 @@ def main() -> None: ap.add_argument("--samplesheet", required=True, help="TSV that drove the cohort build (same one passed to build_igvreports.py --samplesheet)") ap.add_argument("--reports-dir", required=True, help="dir containing <sample>.<genome>.html files (and optional index.html)") ap.add_argument("--genome", required=True, help="genome tag (hg38 | mm10 | mm39 | t2t | GRCh37)") - ap.add_argument("--db-config", default=(str(DEFAULT_DBCONFIG) if DEFAULT_DBCONFIG else None), help="databases_config.yaml to resolve default-track allow-list (optional)") + ap.add_argument("--db-config", default=str(DEFAULT_DBCONFIG) if DEFAULT_DBCONFIG else None, + help="databases_config.yaml to resolve default-track allow-list. " + "Defaults to $IGV_REPORTS_DB_CONFIG; the allow-list check is skipped " + "if neither is set.") ap.add_argument( "--track-columns", nargs="*", default=DEFAULT_TRACK_COLUMNS, help=f"samplesheet columns containing track paths (default: {DEFAULT_TRACK_COLUMNS}). " "`extra_tracks` is parsed comma-separated if present.", ) ap.add_argument("--min-size-mb", type=float, default=0.5, help="per-sample HTML min size (passed through to verify_report)") + ap.add_argument("--png-min-size-kb", type=float, default=10.0, + help="PNG min size threshold (only used when --also-png manifests are present). " + "Defaults to 10 KB — empty IGV screenshots are typically <2 KB, " + "useful ones >= 50 KB.") ap.add_argument("--out", help="write the TSV report here in addition to stdout") ap.add_argument("--summary", help="write a one-page markdown rollup here") ap.add_argument("--fail-on-fail", action="store_true", help="exit nonzero if any check is FAIL") @@ -437,10 +574,11 @@ def main() -> None: if not rows: raise SystemExit(f"ERROR: samplesheet has no data rows: {samplesheet}") - allow_list = ( - resolve_default_track_labels(Path(args.db_config), args.genome) - if args.db_config else set() - ) + # When neither --db-config nor $IGV_REPORTS_DB_CONFIG is set, skip the + # contamination allow-list (no false positives, no false negatives — we + # just can't claim a track is a "known annotation" without the YAML). + allow_list = (resolve_default_track_labels(Path(args.db_config), args.genome) + if args.db_config else set()) # Pre-compute track-label sets per sample for the contamination check. # Labels are Path.stem of each track path, matching igv-reports's auto- @@ -469,6 +607,15 @@ def main() -> None: checks.append(check_no_cross_sample_contamination(sample, html_path, this_labels, other_labels, allow_list)) checks.append(check_sample_id_embedded(sample, html_path)) + # PNG-side checks fire only when build_igvreports.py was run with + # --also-png (detected via the per-sample manifest). Cohorts without + # PNGs see no extra rows; cohorts with PNGs get three more checks. + manifest = find_png_manifest(reports_dir, sample, args.genome) + if manifest is not None: + checks.append(check_png_count_matches_bed(sample, manifest, sites_path)) + checks.append(check_pngs_exist_and_nonempty(sample, manifest, args.png_min_size_kb)) + checks.append(check_png_html_row_alignment(sample, manifest, html_path)) + # C5 index_consistency checks.append(check_index_consistency(rows, reports_dir)) diff --git a/igv-reports/tests/unit/test_build_pngs.py b/igv-reports/tests/unit/test_build_pngs.py new file mode 100644 index 0000000..e63144c --- /dev/null +++ b/igv-reports/tests/unit/test_build_pngs.py @@ -0,0 +1,245 @@ +"""Unit tests for the --also-png plumbing in build_igvreports.py. + +Author: Samuel Ahuno +Purpose: + Exercises the helpers that bridge the HTML build to igver: sites BED + parsing + UID assignment, flanked regions BED writer, input.txt writer, + igver-cmd resolution, and manifest writing. + + We don't actually invoke igver here — the manifest writer reconstructs + filenames from the same convention igver uses (validated against + igver's _parse_bed_file source: `<chrom>-<start>-<end>.<name>.<ext>`). + Cross-artifact consistency depends on this filename contract; if igver + ever changes it, this test plus verify_cohort will catch the drift. + +Run: + pytest tests/unit/test_build_pngs.py -v +""" + +from __future__ import annotations + +import logging +import os +import sys +from pathlib import Path +from unittest.mock import patch + +import pytest + +SCRIPTS = Path(__file__).resolve().parents[2] / "scripts" +sys.path.insert(0, str(SCRIPTS)) + +import build_igvreports as b # noqa: E402 + + +def _write_bed(path: Path, rows: list[tuple]) -> None: + """Helper — `rows` is a list of (chrom, start, end[, name][, ...]).""" + with path.open("w") as fh: + for r in rows: + fh.write("\t".join(str(x) for x in r) + "\n") + + +# ----- _read_sites_bed_rows ----- + + +def test_read_sites_bed_assigns_uids_when_name_missing(tmp_path): + bed = tmp_path / "sites.hg38.bed" + _write_bed(bed, [("chr1", 100, 200), ("chr2", 300, 400)]) + rows = b._read_sites_bed_rows(bed) + assert len(rows) == 2 + # Auto-UIDs are zero-padded to 3 digits so directory listings sort right + # and `region_010` doesn't sort before `region_2`. + assert rows[0]["name"] == "region_001" + assert rows[1]["name"] == "region_002" + assert rows[0]["bed_row_idx"] == 1 + assert rows[1]["bed_row_idx"] == 2 + + +def test_read_sites_bed_preserves_existing_names(tmp_path): + bed = tmp_path / "sites.hg38.bed" + _write_bed(bed, [("chr2", 100, 200, "DNMT3A_full_gene"), ("chr7", 300, 400, "TP53")]) + rows = b._read_sites_bed_rows(bed) + assert rows[0]["name"] == "DNMT3A_full_gene" + assert rows[1]["name"] == "TP53" + + +def test_read_sites_bed_skips_comment_and_track_lines(tmp_path): + bed = tmp_path / "sites.hg38.bed" + bed.write_text( + "#chrom\tstart\tend\tname\n" + "track name=foo\n" + "browser dense\n" + "chr1\t100\t200\treal_row\n" + ) + rows = b._read_sites_bed_rows(bed) + assert len(rows) == 1 + assert rows[0]["name"] == "real_row" + + +def test_read_sites_bed_handles_mixed_named_and_unnamed(tmp_path): + # If some rows have names and others don't, unnamed ones still get + # auto-UIDs based on file position so manifests stay deterministic. + bed = tmp_path / "sites.hg38.bed" + _write_bed(bed, [ + ("chr1", 100, 200, "named_first"), + ("chr2", 300, 400), + ("chr3", 500, 600, "named_third"), + ]) + rows = b._read_sites_bed_rows(bed) + assert [r["name"] for r in rows] == ["named_first", "region_002", "named_third"] + + +# ----- _write_igver_regions_bed ----- + + +def test_write_igver_regions_bed_applies_flanking(tmp_path): + rows = [ + {"chrom": "chr1", "start": 100, "end": 200, "name": "A", "bed_row_idx": 1}, + {"chrom": "chr2", "start": 50, "end": 150, "name": "B", "bed_row_idx": 2}, + ] + out = tmp_path / "igver_regions.bed" + b._write_igver_regions_bed(rows, flanking=300, out=out) + lines = out.read_text().splitlines() + # Row 1: 100-300=−200, clamped to 0; end 200+300=500. + assert lines[0] == "chr1\t0\t500\tA" + # Row 2: 50−300=−250, clamped to 0; end 150+300=450. + assert lines[1] == "chr2\t0\t450\tB" + + +def test_write_igver_regions_bed_zero_flanking_passes_rows_verbatim(tmp_path): + rows = [{"chrom": "chrX", "start": 1000, "end": 2000, "name": "promoter", "bed_row_idx": 1}] + out = tmp_path / "igver_regions.bed" + b._write_igver_regions_bed(rows, flanking=0, out=out) + assert out.read_text().strip() == "chrX\t1000\t2000\tpromoter" + + +# ----- _write_igver_input_list ----- + + +def test_write_igver_input_list_one_path_per_line(tmp_path): + tracks = ["/path/to/tumor.bam", "/path/to/normal.bam", "/path/to/calls.vcf"] + out = tmp_path / "igver_input.txt" + b._write_igver_input_list(tracks, out) + assert out.read_text().splitlines() == tracks + + +# ----- _resolve_igver_cmd ----- + + +def test_resolve_igver_cmd_explicit_override_wins(): + override = "apptainer exec /path/to/igver.sif igver" + assert b._resolve_igver_cmd(override) == override.split() + + +def test_resolve_igver_cmd_env_var_falls_back(monkeypatch): + monkeypatch.setenv("IGVER_CMD", "/usr/local/bin/igver --debug") + # which() must not find igver for this branch to fire; mock it to None. + with patch.object(b.shutil, "which", return_value=None), \ + patch.object(b.Path, "exists", return_value=False): + assert b._resolve_igver_cmd(None) == ["/usr/local/bin/igver", "--debug"] + + +def test_resolve_igver_cmd_path_lookup(monkeypatch): + monkeypatch.delenv("IGVER_CMD", raising=False) + with patch.object(b.shutil, "which", return_value="/usr/bin/igver"): + assert b._resolve_igver_cmd(None) == ["/usr/bin/igver"] + + +def test_resolve_igver_cmd_raises_when_not_found(monkeypatch): + monkeypatch.delenv("IGVER_CMD", raising=False) + with patch.object(b.shutil, "which", return_value=None), \ + patch.object(b.Path, "exists", return_value=False): + with pytest.raises(SystemExit, match="igver not found"): + b._resolve_igver_cmd(None) + + +# ----- build_pngs_with_igver — mocked subprocess ----- + + +def test_build_pngs_with_igver_writes_manifest_and_inputs(tmp_path, monkeypatch): + # Set up a synthetic sites BED + tracks list + mock igver. + bed = tmp_path / "sites.hg38.bed" + _write_bed(bed, [ + ("chr1", 100, 200, "alpha"), + ("chr2", 300, 400, "beta"), + ]) + tracks = ["/data/sample.bam", "/data/calls.vcf"] + html_path = tmp_path / "sample.hg38.html" + html_path.write_text("<html/>") + out_dir = tmp_path / "png_sample.hg38" + log = logging.getLogger("test") + + # Force the resolver to return a stub so the test doesn't need igver. + monkeypatch.setenv("IGVER_CMD", "/usr/bin/true") + with patch.object(b.shutil, "which", return_value="/usr/bin/true"): + manifest = b.build_pngs_with_igver( + sites=bed, + tracks=tracks, + genome="hg38", + flanking=300, + out_dir=out_dir, + log=log, + html_path=html_path, + igver_cmd=None, + dpi=300, + display_mode="collapse", + ) + + # 1. Intermediate files exist with the expected content. + regions_bed = out_dir / "igver_regions.bed" + input_txt = out_dir / "igver_input.txt" + assert regions_bed.exists() + assert input_txt.exists() + assert regions_bed.read_text() == "chr1\t0\t500\talpha\nchr2\t0\t700\tbeta\n" + assert input_txt.read_text() == "/data/sample.bam\n/data/calls.vcf\n" + + # 2. Manifest has one row per region with the right schema and the + # expected PNG-filename convention (validated against igver source). + lines = manifest.read_text().splitlines() + assert lines[0].startswith("#bed_row_idx\tuid\tchrom\t") + data_rows = lines[1:] + assert len(data_rows) == 2 + + cols0 = data_rows[0].split("\t") + assert cols0[0] == "1" + assert cols0[1] == "alpha" + assert cols0[2] == "chr1" + assert cols0[3] == "100" # start_orig + assert cols0[4] == "200" # end_orig + assert cols0[5] == "0" # start_flanked (clamped) + assert cols0[6] == "500" # end_flanked + assert cols0[7] == "chr1:0-500" + assert cols0[8].endswith("/png/chr1-0-500.alpha.png"), cols0[8] + assert cols0[9].endswith("/sample.hg38.html"), cols0[9] + assert cols0[10] == "1" # html_table_row matches bed_row_idx + + +def test_build_pngs_with_igver_propagates_igver_failure(tmp_path, monkeypatch): + # If igver itself returns non-zero, the driver must SystemExit so the + # caller (and verify_cohort) sees the build as failed — silent success + # would let an empty PNG dir slip into a "verified" cohort. + bed = tmp_path / "sites.hg38.bed" + _write_bed(bed, [("chr1", 100, 200, "alpha")]) + html_path = tmp_path / "sample.hg38.html"; html_path.write_text("<html/>") + log = logging.getLogger("test") + + # /usr/bin/false always exits non-zero — perfect stand-in for a failing igver. + monkeypatch.setenv("IGVER_CMD", "/usr/bin/false") + with patch.object(b.shutil, "which", return_value="/usr/bin/false"): + with pytest.raises(SystemExit) as exc: + b.build_pngs_with_igver( + sites=bed, tracks=["/data/sample.bam"], genome="hg38", flanking=0, + out_dir=tmp_path / "out", log=log, html_path=html_path, + ) + assert exc.value.code != 0 + + +def test_build_pngs_with_igver_errors_on_empty_bed(tmp_path): + bed = tmp_path / "sites.hg38.bed" + bed.write_text("# header only\n") + log = logging.getLogger("test") + with pytest.raises(SystemExit, match="no data rows"): + b.build_pngs_with_igver( + sites=bed, tracks=["/data/sample.bam"], genome="hg38", flanking=0, + out_dir=tmp_path / "out", log=log, html_path=tmp_path / "x.html", + ) diff --git a/igv-reports/tests/unit/test_generate_tracks_json.py b/igv-reports/tests/unit/test_generate_tracks_json.py new file mode 100644 index 0000000..bf562ee --- /dev/null +++ b/igv-reports/tests/unit/test_generate_tracks_json.py @@ -0,0 +1,226 @@ +"""Unit tests for generate_tracks_json.py — annotation-default resolver. + +Author: Samuel Ahuno +Purpose: + Exercises the `default:` shortcut path added in the methylation-pathway + polish round. Without these tests a future Claude session could easily + break the resolver by adding a 6th key without updating the lookup. + +Covers: + * Happy path: each known default key resolves against a synthetic cfg. + * hg38 gencode-sibling preference (.gff3.gz over .gtf.gz when present). + * indexURL: included when .tbi exists; omitted otherwise. + * Unknown default key -> SystemExit with valid-keys hint. + * Missing genome in cfg -> SystemExit. + * Missing path on disk -> SystemExit. + * build_annotation_tracks() routes `default:` entries through the resolver + and preserves backwards compat for explicit `url:` entries. + * `default:` entry without top-level `genome:` -> SystemExit. + +Run: + cd igv-reports-skill && pytest tests/unit/test_generate_tracks_json.py -v +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import pytest + +SCRIPTS = Path(__file__).resolve().parents[2] / "scripts" +sys.path.insert(0, str(SCRIPTS)) + +import generate_tracks_json as g # noqa: E402 + + +def _fake_cfg(genome: str, paths: dict[str, str]) -> dict: + """Build a minimal databases YAML mirror keyed by genome. + + `paths` maps YAML-keys (CpGIslands, gtf, repMaskerBed, EPDnewCoding, + EPDnewNonCoding) to filesystem paths.""" + return {"reference_genomes": {"local": {genome: paths}}} + + +def _touch(path: Path) -> Path: + """Create an empty file at `path`, parents auto-created.""" + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(b"") + return path + + +# ----- happy path: each known default key resolves ----- + + +def test_resolve_cgi(tmp_path): + cgi = _touch(tmp_path / "hg38_CpGIslands.bed") + cfg = _fake_cfg("hg38", {"CpGIslands": str(cgi)}) + t = g.resolve_annotation_default("cgi", "hg38", cfg) + assert t["url"] == str(cgi) + assert t["display_name"] == "CpG islands" + assert t["format"] == "bed" + assert t["color"] == "rgb(0,158,115)" + assert "indexURL" not in t # no .tbi alongside + + +def test_resolve_repmasker(tmp_path): + rmsk = _touch(tmp_path / "rmsk.bed.gz") + _touch(tmp_path / "rmsk.bed.gz.tbi") + cfg = _fake_cfg("hg38", {"repMaskerBed": str(rmsk)}) + t = g.resolve_annotation_default("repmasker", "hg38", cfg) + assert t["url"] == str(rmsk) + assert t["indexURL"] == str(rmsk) + ".tbi" + assert t["displayMode"] == "COLLAPSED" + + +def test_resolve_gencode_hg38_prefers_gff3_sibling(tmp_path): + # When the YAML's `gtf` points at a .gtf.gz, but a sibling + # gencode.v47.annotation.gff3.gz + .tbi exists in the same dir, + # the resolver should switch to the bgzip+tabix .gff3.gz file. + gtf = _touch(tmp_path / "gencode.v47.annotation.gtf.gz") + sibling = _touch(tmp_path / "gencode.v47.annotation.gff3.gz") + _touch(tmp_path / "gencode.v47.annotation.gff3.gz.tbi") + cfg = _fake_cfg("hg38", {"gtf": str(gtf)}) + t = g.resolve_annotation_default("gencode", "hg38", cfg) + assert t["url"] == str(sibling), "expected hg38 gencode to prefer .gff3.gz sibling" + assert t["indexURL"] == str(sibling) + ".tbi" + + +def test_resolve_gencode_mm10_uses_gtf(tmp_path): + # The sibling-preference logic only fires for hg38. For mm10 the + # resolver should use the YAML-named gtf path verbatim. + gtf = _touch(tmp_path / "gencode.vM25.annotation.gtf.gz") + cfg = _fake_cfg("mm10", {"gtf": str(gtf)}) + t = g.resolve_annotation_default("gencode", "mm10", cfg) + assert t["url"] == str(gtf) + + +def test_resolve_epdnew_coding_and_noncoding(tmp_path): + coding = _touch(tmp_path / "Hs_EPDnew.hg38.bed.gz") + noncoding = _touch(tmp_path / "HsNC_EPDnew.hg38.bed.gz") + cfg = _fake_cfg("hg38", { + "EPDnewCoding": str(coding), + "EPDnewNonCoding": str(noncoding), + }) + tc = g.resolve_annotation_default("epdnew_coding", "hg38", cfg) + tn = g.resolve_annotation_default("epdnew_noncoding", "hg38", cfg) + assert tc["url"] == str(coding) + assert tn["url"] == str(noncoding) + # Distinct Okabe-Ito colors so coding vs non-coding read separately. + assert tc["color"] != tn["color"] + + +# ----- error paths ----- + + +def test_unknown_default_key_lists_valid_keys(): + with pytest.raises(SystemExit) as exc: + g.resolve_annotation_default("DOES_NOT_EXIST", "hg38", _fake_cfg("hg38", {})) + # Error should enumerate the valid keys so the user can fix the typo + # without having to read the source. + msg = str(exc.value) + for key in ("cgi", "gencode", "repmasker", "epdnew_coding", "epdnew_noncoding"): + assert key in msg + + +def test_missing_genome_in_cfg(tmp_path): + cgi = _touch(tmp_path / "hg38_CpGIslands.bed") + cfg = _fake_cfg("hg38", {"CpGIslands": str(cgi)}) + with pytest.raises(SystemExit, match="no entry for genome 'GRCh37'"): + g.resolve_annotation_default("cgi", "GRCh37", cfg) + + +def test_missing_yaml_key_for_genome(tmp_path): + # mm39 famously has no repMaskerBed configured — `default: repmasker` + # must fail with a clear error rather than silently emitting no track. + cfg = _fake_cfg("mm39", {"CpGIslands": "/tmp/fake_cgi"}) + with pytest.raises(SystemExit, match="repMaskerBed"): + g.resolve_annotation_default("repmasker", "mm39", cfg) + + +def test_missing_path_on_disk(tmp_path): + cfg = _fake_cfg("hg38", {"CpGIslands": str(tmp_path / "nonexistent.bed")}) + with pytest.raises(SystemExit, match="resolved path missing on disk"): + g.resolve_annotation_default("cgi", "hg38", cfg) + + +# ----- build_annotation_tracks() integration ----- + + +def test_build_annotation_tracks_shortcut(tmp_path): + cgi = _touch(tmp_path / "hg38_CpGIslands.bed") + cfg = _fake_cfg("hg38", {"CpGIslands": str(cgi)}) + spec = {"genome": "hg38", "annotation": [{"default": "cgi"}]} + out = g.build_annotation_tracks(spec, tmp_path, cfg) + assert len(out) == 1 + assert out[0]["name"] == "CpG islands" + assert out[0]["url"] == str(cgi) + assert out[0]["type"] == "annotation" + assert out[0]["color"] == "rgb(0,158,115)" + + +def test_build_annotation_tracks_shortcut_with_overrides(tmp_path): + # The user can override the canned display name + color while still + # using `default:` for path resolution. + cgi = _touch(tmp_path / "hg38_CpGIslands.bed") + cfg = _fake_cfg("hg38", {"CpGIslands": str(cgi)}) + spec = { + "genome": "hg38", + "annotation": [{ + "default": "cgi", + "name": "My CpG view", + "color": "rgb(0,0,0)", + "displayMode": "COLLAPSED", + }], + } + out = g.build_annotation_tracks(spec, tmp_path, cfg) + assert out[0]["name"] == "My CpG view" + assert out[0]["color"] == "rgb(0,0,0)" + assert out[0]["displayMode"] == "COLLAPSED" + # url still resolved by the shortcut + assert out[0]["url"] == str(cgi) + + +def test_build_annotation_tracks_explicit_path_unchanged(tmp_path): + # Backwards-compat: an explicit `url:` entry must not need a cfg and + # must produce the same shape as before this round of changes. + explicit = _touch(tmp_path / "my_custom.bed") + spec = { + "annotation": [{ + "name": "My custom track", + "url": str(explicit), + "format": "bed", + "color": "rgb(1,2,3)", + }], + } + out = g.build_annotation_tracks(spec, tmp_path, {}) + assert out[0] == { + "name": "My custom track", + "url": str(explicit), + "format": "bed", + "type": "annotation", + "displayMode": "EXPANDED", + "color": "rgb(1,2,3)", + } + + +def test_build_annotation_tracks_mixed(tmp_path): + # Explicit + shortcut entries can coexist; order is preserved. + cgi = _touch(tmp_path / "hg38_CpGIslands.bed") + explicit = _touch(tmp_path / "custom.bed") + cfg = _fake_cfg("hg38", {"CpGIslands": str(cgi)}) + spec = { + "genome": "hg38", + "annotation": [ + {"name": "Custom first", "url": str(explicit)}, + {"default": "cgi"}, + ], + } + out = g.build_annotation_tracks(spec, tmp_path, cfg) + assert [t["name"] for t in out] == ["Custom first", "CpG islands"] + + +def test_shortcut_without_top_level_genome(tmp_path): + spec = {"annotation": [{"default": "cgi"}]} # missing `genome:` + with pytest.raises(SystemExit, match="top-level `genome:`"): + g.build_annotation_tracks(spec, tmp_path, {}) diff --git a/igv-reports/tests/unit/test_verify_cohort_png.py b/igv-reports/tests/unit/test_verify_cohort_png.py new file mode 100644 index 0000000..2ac1bc1 --- /dev/null +++ b/igv-reports/tests/unit/test_verify_cohort_png.py @@ -0,0 +1,190 @@ +"""Unit tests for the PNG-side checks in verify_cohort.py. + +Author: Samuel Ahuno +Purpose: + When build_igvreports.py runs with --also-png, verify_cohort.py picks up + the manifest TSV and runs three additional checks. These tests synthesize + a valid manifest + matching PNG files in tmp_path, then mutate one thing + at a time to confirm each check fires on the right defect. + +Run: + pytest tests/unit/test_verify_cohort_png.py -v +""" + +from __future__ import annotations + +import sys +from pathlib import Path + +import pytest + +SCRIPTS = Path(__file__).resolve().parents[2] / "scripts" +sys.path.insert(0, str(SCRIPTS)) + +import verify_cohort as vc # noqa: E402 + + +def _write_sites_bed(path: Path, rows: list[tuple]) -> None: + with path.open("w") as fh: + for r in rows: + fh.write("\t".join(str(x) for x in r) + "\n") + + +def _write_manifest(path: Path, entries: list[dict]) -> None: + """Write a manifest TSV matching the schema build_pngs_with_igver emits.""" + header = ("#bed_row_idx\tuid\tchrom\tstart_orig\tend_orig\t" + "start_flanked\tend_flanked\tregion\tpng_path\thtml_path\thtml_table_row\n") + with path.open("w") as fh: + fh.write(header) + for e in entries: + fh.write( + f"{e['bed_row_idx']}\t{e['uid']}\t{e['chrom']}\t" + f"{e['start_orig']}\t{e['end_orig']}\t" + f"{e['start_flanked']}\t{e['end_flanked']}\t" + f"{e['region']}\t{e['png_path']}\t{e['html_path']}\t" + f"{e['html_table_row']}\n" + ) + + +def _make_png(path: Path, size_bytes: int = 50_000) -> None: + """Create a fake PNG file of the requested size (default 50 KB, above + the 10 KB threshold).""" + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(b"\x89PNG\r\n\x1a\n" + b"\x00" * (size_bytes - 8)) + + +@pytest.fixture +def cohort(tmp_path): + """Two-region cohort with a valid manifest + matching PNGs.""" + bed = tmp_path / "sites.hg38.bed" + _write_sites_bed(bed, [ + ("chr1", 100, 200, "alpha"), + ("chr2", 300, 400, "beta"), + ]) + html = tmp_path / "sample.hg38.html" + html.write_text("<html/>") + + png_dir = tmp_path / "png_sample.hg38" / "png" + png1 = png_dir / "chr1-0-500.alpha.png" + png2 = png_dir / "chr2-0-700.beta.png" + _make_png(png1) + _make_png(png2) + + manifest = tmp_path / "png_sample.hg38" / "manifest.tsv" + _write_manifest(manifest, [ + {"bed_row_idx": 1, "uid": "alpha", "chrom": "chr1", + "start_orig": 100, "end_orig": 200, + "start_flanked": 0, "end_flanked": 500, + "region": "chr1:0-500", "png_path": str(png1.resolve()), + "html_path": str(html.resolve()), "html_table_row": 1}, + {"bed_row_idx": 2, "uid": "beta", "chrom": "chr2", + "start_orig": 300, "end_orig": 400, + "start_flanked": 0, "end_flanked": 700, + "region": "chr2:0-700", "png_path": str(png2.resolve()), + "html_path": str(html.resolve()), "html_table_row": 2}, + ]) + return {"bed": bed, "html": html, "manifest": manifest, "png_dir": png_dir, + "png1": png1, "png2": png2, "tmp": tmp_path} + + +# ----- find_png_manifest ----- + + +def test_find_png_manifest_returns_path_when_present(cohort, tmp_path): + # Manifest lives at <reports_dir>/png_<sample>.<genome>/manifest.tsv + # so we point reports_dir at tmp_path and check `sample` for genome `hg38`. + found = vc.find_png_manifest(tmp_path, "sample", "hg38") + assert found == cohort["manifest"] + + +def test_find_png_manifest_returns_none_when_absent(tmp_path): + assert vc.find_png_manifest(tmp_path, "sample", "hg38") is None + + +# ----- P1: png count matches BED ----- + + +def test_p1_pass(cohort): + c = vc.check_png_count_matches_bed("sample", cohort["manifest"], cohort["bed"]) + assert c.status == "PASS" + assert c.observed == "2" + assert c.expected == "2" + + +def test_p1_fail_when_manifest_short(cohort): + # Truncate the BED so it has 3 rows but manifest only has 2. + _write_sites_bed(cohort["bed"], [ + ("chr1", 100, 200, "alpha"), + ("chr2", 300, 400, "beta"), + ("chr3", 500, 600, "gamma"), + ]) + c = vc.check_png_count_matches_bed("sample", cohort["manifest"], cohort["bed"]) + assert c.status == "FAIL" + assert c.observed == "2" + assert c.expected == "3" + + +# ----- P2: pngs exist and non-empty ----- + + +def test_p2_pass(cohort): + c = vc.check_pngs_exist_and_nonempty("sample", cohort["manifest"]) + assert c.status == "PASS" + + +def test_p2_fail_on_missing_png(cohort): + cohort["png1"].unlink() + c = vc.check_pngs_exist_and_nonempty("sample", cohort["manifest"]) + assert c.status == "FAIL" + assert "missing" in c.details + + +def test_p2_fail_on_tiny_png(cohort): + # Re-write png1 as a 2 KB file — below the 10 KB threshold. + cohort["png1"].write_bytes(b"\x00" * 2048) + c = vc.check_pngs_exist_and_nonempty("sample", cohort["manifest"]) + assert c.status == "FAIL" + assert "below threshold" in c.details + + +def test_p2_threshold_can_be_lowered(cohort): + # The lab's smallest legitimate igver PNG can be ~5 KB on a no-data + # region. Users should be able to opt down without rewriting the check. + cohort["png1"].write_bytes(b"\x00" * 6144) + c = vc.check_pngs_exist_and_nonempty("sample", cohort["manifest"], min_size_kb=5.0) + assert c.status == "PASS" + + +# ----- P3: html-row alignment ----- + + +def test_p3_pass(cohort): + c = vc.check_png_html_row_alignment("sample", cohort["manifest"], cohort["html"]) + assert c.status == "PASS" + + +def test_p3_fail_when_html_path_diverges(cohort, tmp_path): + # Pass a different HTML path than the manifest references — should fail. + other_html = tmp_path / "other.hg38.html" + other_html.write_text("<html/>") + c = vc.check_png_html_row_alignment("sample", cohort["manifest"], other_html) + assert c.status == "FAIL" + assert "different HTML" in c.details + + +def test_p3_fail_when_row_indices_not_contiguous(cohort, tmp_path): + # Rewrite the manifest with non-contiguous html_table_row indices. + png1, png2 = cohort["png1"], cohort["png2"] + _write_manifest(cohort["manifest"], [ + {"bed_row_idx": 1, "uid": "alpha", "chrom": "chr1", + "start_orig": 100, "end_orig": 200, "start_flanked": 0, "end_flanked": 500, + "region": "chr1:0-500", "png_path": str(png1.resolve()), + "html_path": str(cohort["html"].resolve()), "html_table_row": 1}, + {"bed_row_idx": 2, "uid": "beta", "chrom": "chr2", + "start_orig": 300, "end_orig": 400, "start_flanked": 0, "end_flanked": 700, + "region": "chr2:0-700", "png_path": str(png2.resolve()), + "html_path": str(cohort["html"].resolve()), "html_table_row": 5}, # gap + ]) + c = vc.check_png_html_row_alignment("sample", cohort["manifest"], cohort["html"]) + assert c.status == "FAIL" + assert "contiguous" in c.details From 32abf37a152ba415c4c2d4d8eebd81c81cffc18c Mon Sep 17 00:00:00 2001 From: sahuno <ekwame001@gmail.com> Date: Tue, 19 May 2026 00:32:36 -0400 Subject: [PATCH 6/9] igv-reports: --also-png inline check for igver silent exit-0 failure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Empirical 2026-05-18: igver exits 0 even when it fails to render. My build_pngs_with_igver gated on subprocess.returncode != 0 which missed this; a "successful" build would silently ship an empty png/ dir. Fix: after igver returns, walk each expected PNG path (`<chr>-<start>- <end>.<uid>.<ext>` — igver's documented filename convention) and raise SystemExit on any missing or zero-byte file. Error message points at the most common root cause (`pip install igver` egg-link without the IGV Java binary) and the apptainer SIF fix. The cohort verifier (`verify_cohort.py:check_pngs_exist_and_nonempty`) runs the same check at end of build, but the inline check fires for single-sample `--sites` invocations too, so every code path gets the safety net. 3 new tests cover the failure modes: no PNGs (the motivating bug), partial PNGs (mid-batch fail), zero-byte PNGs (truncated write). The previous "happy path" test now patches subprocess.run with a fake igver that writes the expected files instead of using a /usr/bin/true stub. Tests: 112/112. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --- igv-reports/SKILL.md | 10 ++- igv-reports/scripts/build_igvreports.py | 34 ++++++++ igv-reports/tests/unit/test_build_pngs.py | 99 ++++++++++++++++++++++- 3 files changed, 138 insertions(+), 5 deletions(-) diff --git a/igv-reports/SKILL.md b/igv-reports/SKILL.md index 419b01a..d7e6d46 100644 --- a/igv-reports/SKILL.md +++ b/igv-reports/SKILL.md @@ -671,8 +671,14 @@ identical BAMs and the result is content-equivalent. ### Cross-artifact verification -When `--also-png` is set the driver automatically writes the manifest; -`verify_cohort.py` then runs three additional checks per sample: +The driver runs an **inline existence check** right after igver returns: +walks each expected PNG path (`<chr>-<start>-<end>.<uid>.<ext>` derived +from the manifest) and fails the build with an actionable message if +any are missing or zero-byte. This catches igver's documented +silent-exit-0 failure mode (egg-link install without the IGV Java +binary) — `proc.returncode != 0` alone misses it. + +In addition, `verify_cohort.py` then runs three checks per sample: | Check | Catches | |---|---| diff --git a/igv-reports/scripts/build_igvreports.py b/igv-reports/scripts/build_igvreports.py index 6c33e54..d3f5ff7 100755 --- a/igv-reports/scripts/build_igvreports.py +++ b/igv-reports/scripts/build_igvreports.py @@ -481,6 +481,40 @@ def build_pngs_with_igver( ) log.info(f" png manifest: {manifest} ({len(rows)} rows)") + + # Inline existence check — igver exits 0 even when it fails to render + # (silent exit-0 failure documented in the upstream skill's notes). + # We can't trust the exit code, so verify every expected PNG path is + # on disk and non-empty before returning. Without this a "successful" + # build silently ships an empty png/ dir. + missing: list[str] = [] + empty: list[str] = [] + for r in rows: + start_f = max(0, r["start"] - flanking) + end_f = r["end"] + flanking + fname = f"{r['chrom']}-{start_f}-{end_f}.{r['name']}.{ext}" + p = png_dir / fname + if not p.exists(): + missing.append(fname) + elif p.stat().st_size == 0: + empty.append(fname) + if missing or empty: + log.error( + f"igver returned exit 0 but {len(missing)} expected PNG(s) are missing " + f"and {len(empty)} are zero-byte (out of {len(rows)} regions). " + "This is a documented silent-failure mode of igver." + ) + if missing: + log.error(f" missing: {missing[:5]}{'...' if len(missing) > 5 else ''}") + if empty: + log.error(f" empty: {empty[:5]}{'...' if len(empty) > 5 else ''}") + raise SystemExit( + f"ERROR: igver produced {len(rows) - len(missing) - len(empty)} of " + f"{len(rows)} PNGs (silent exit-0 failure). Check the igver install " + "path — `pip install igver` egg-link lacks the IGV Java binary; use " + "an apptainer SIF via --igver-cmd or $IGVER_CMD." + ) + return manifest diff --git a/igv-reports/tests/unit/test_build_pngs.py b/igv-reports/tests/unit/test_build_pngs.py index e63144c..54a913c 100644 --- a/igv-reports/tests/unit/test_build_pngs.py +++ b/igv-reports/tests/unit/test_build_pngs.py @@ -156,8 +156,29 @@ def test_resolve_igver_cmd_raises_when_not_found(monkeypatch): # ----- build_pngs_with_igver — mocked subprocess ----- +def _fake_igver_run(cmd, **kwargs): + """Stand-in for subprocess.run that mimics a successful igver invocation: + parses the regions BED out of `-r`, parses the output dir out of `-o`, + and writes a non-empty fake PNG at each expected filename — same + `<chr>-<start>-<end>.<uid>.<ext>` convention real igver uses.""" + import subprocess + out_dir = Path(cmd[cmd.index("-o") + 1]) + out_dir.mkdir(parents=True, exist_ok=True) + regions_bed = Path(cmd[cmd.index("-r") + 1]) + fmt = cmd[cmd.index("-f") + 1] if "-f" in cmd else "png" + ext = "svg" if fmt in ("svg", "pdf") else fmt + for line in regions_bed.read_text().splitlines(): + if not line or line.startswith("#"): + continue + chrom, start, end, name = line.split("\t")[:4] + (out_dir / f"{chrom}-{start}-{end}.{name}.{ext}").write_bytes(b"PNG\x00" * 4096) + return subprocess.CompletedProcess(args=cmd, returncode=0, stdout="", stderr="") + + def test_build_pngs_with_igver_writes_manifest_and_inputs(tmp_path, monkeypatch): - # Set up a synthetic sites BED + tracks list + mock igver. + # Set up a synthetic sites BED + tracks list + mock igver that actually + # writes the expected output files (the inline existence check rejects + # an igver run that produces zero PNGs). bed = tmp_path / "sites.hg38.bed" _write_bed(bed, [ ("chr1", 100, 200, "alpha"), @@ -169,9 +190,9 @@ def test_build_pngs_with_igver_writes_manifest_and_inputs(tmp_path, monkeypatch) out_dir = tmp_path / "png_sample.hg38" log = logging.getLogger("test") - # Force the resolver to return a stub so the test doesn't need igver. monkeypatch.setenv("IGVER_CMD", "/usr/bin/true") - with patch.object(b.shutil, "which", return_value="/usr/bin/true"): + with patch.object(b.shutil, "which", return_value="/usr/bin/true"), \ + patch.object(b.subprocess, "run", side_effect=_fake_igver_run): manifest = b.build_pngs_with_igver( sites=bed, tracks=tracks, @@ -214,6 +235,78 @@ def test_build_pngs_with_igver_writes_manifest_and_inputs(tmp_path, monkeypatch) assert cols0[10] == "1" # html_table_row matches bed_row_idx +def test_build_pngs_with_igver_detects_silent_exit_0_failure(tmp_path, monkeypatch): + # The motivating bug: igver via `pip install` egg-link prints + # `[ERROR] Failed to generate all PNG files after 2 iterations.` then + # exits 0 with an empty output dir. proc.returncode != 0 misses it. + # Inline check must catch this regardless of exit code. + bed = tmp_path / "sites.hg38.bed" + _write_bed(bed, [("chr1", 100, 200, "alpha"), ("chr2", 300, 400, "beta")]) + html_path = tmp_path / "sample.hg38.html"; html_path.write_text("<html/>") + log = logging.getLogger("test") + + # /usr/bin/true returns 0 but creates no files — the exact failure mode. + monkeypatch.setenv("IGVER_CMD", "/usr/bin/true") + with patch.object(b.shutil, "which", return_value="/usr/bin/true"): + with pytest.raises(SystemExit, match="silent exit-0 failure"): + b.build_pngs_with_igver( + sites=bed, tracks=["/data/sample.bam"], genome="hg38", + flanking=0, out_dir=tmp_path / "out", log=log, html_path=html_path, + ) + + +def test_build_pngs_with_igver_detects_partial_silent_failure(tmp_path, monkeypatch): + # Mid-batch failure: 1 of 2 PNGs produced, 1 missing, exit 0. Inline + # check must fail because the manifest would otherwise reference a + # non-existent PNG. + bed = tmp_path / "sites.hg38.bed" + _write_bed(bed, [("chr1", 100, 200, "alpha"), ("chr2", 300, 400, "beta")]) + html_path = tmp_path / "sample.hg38.html"; html_path.write_text("<html/>") + log = logging.getLogger("test") + + def partial_run(cmd, **kwargs): + # Write only the first region's PNG, skip the second. + import subprocess + out_dir = Path(cmd[cmd.index("-o") + 1]) + out_dir.mkdir(parents=True, exist_ok=True) + (out_dir / "chr1-100-200.alpha.png").write_bytes(b"PNG\x00" * 4096) + return subprocess.CompletedProcess(args=cmd, returncode=0, stdout="", stderr="") + + monkeypatch.setenv("IGVER_CMD", "/usr/bin/true") + with patch.object(b.shutil, "which", return_value="/usr/bin/true"), \ + patch.object(b.subprocess, "run", side_effect=partial_run): + with pytest.raises(SystemExit, match="silent exit-0 failure"): + b.build_pngs_with_igver( + sites=bed, tracks=["/data/sample.bam"], genome="hg38", + flanking=0, out_dir=tmp_path / "out", log=log, html_path=html_path, + ) + + +def test_build_pngs_with_igver_detects_zero_byte_png(tmp_path, monkeypatch): + # Disk-full / truncated-write: PNG exists but is empty. Inline check + # must fail because the file is on disk but unusable. + bed = tmp_path / "sites.hg38.bed" + _write_bed(bed, [("chr1", 100, 200, "alpha")]) + html_path = tmp_path / "sample.hg38.html"; html_path.write_text("<html/>") + log = logging.getLogger("test") + + def zero_byte_run(cmd, **kwargs): + import subprocess + out_dir = Path(cmd[cmd.index("-o") + 1]) + out_dir.mkdir(parents=True, exist_ok=True) + (out_dir / "chr1-100-200.alpha.png").write_bytes(b"") # zero-byte + return subprocess.CompletedProcess(args=cmd, returncode=0, stdout="", stderr="") + + monkeypatch.setenv("IGVER_CMD", "/usr/bin/true") + with patch.object(b.shutil, "which", return_value="/usr/bin/true"), \ + patch.object(b.subprocess, "run", side_effect=zero_byte_run): + with pytest.raises(SystemExit, match="silent exit-0 failure"): + b.build_pngs_with_igver( + sites=bed, tracks=["/data/sample.bam"], genome="hg38", + flanking=0, out_dir=tmp_path / "out", log=log, html_path=html_path, + ) + + def test_build_pngs_with_igver_propagates_igver_failure(tmp_path, monkeypatch): # If igver itself returns non-zero, the driver must SystemExit so the # caller (and verify_cohort) sees the build as failed — silent success From d697b3eb8a3498fb1fde04c996222b6dadd1be43 Mon Sep 17 00:00:00 2001 From: sahuno <ekwame001@gmail.com> Date: Tue, 19 May 2026 00:53:54 -0400 Subject: [PATCH 7/9] verify_anchors: bedGraph CpG-count anchors (methylation-aware content check) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Methylation users care about CpG counts in the bedGraph slice, not BAM read counts — the silent-failure mode for methylation reports is "region rendered, bedGraph slice has 0 CpGs" which the BAM-read-count anchors don't detect. Closes that gap. scripts/verify_anchors.py - New track_type column in the anchor TSV schema (default `bam` when absent, for backwards compat). Two values: `bam` (samtools-view read count, existing behavior) and `bedgraph` (NEW — data row count in the wig/bedGraph slice). - bedgraph_count_source(): count rows overlapping a region. tabix fast path for indexed .gz, gzip stream-decompress for plain .gz, linear scan for plain text. Overlap rule matches IGV ([start, end) half-open). - bedgraph_count_slice(): decode the wig/bedGraph slice from the HTML data: URL (gzip(text) then base64 per igv_reports/datauri.py), count non-header data lines. Falls back to uncompressed for small payloads. - sample_bedgraph_paths(): pull bedGraph/wig entries from samplesheet extra_tracks. Recognizes .bedgraph / .bg / .wig, plain or .gz. - cmd_generate iterates both BAM and bedGraph tracks per row; verify_one_html dispatches on track_type to choose the right count strategy (no samtools needed for bedgraph). - _is_wig_data_line() central helper rejects track/browser/ fixedStep/variableStep/#/empty lines so source and slice counts use identical row-filtering semantics. tests/unit/test_verify_anchors.py (+17 tests, total 129) - Backwards compat: legacy 10-col anchor file → track_type="bam". - bedGraph counting: in-region, half-open boundary, header skipping, plain-gzip input, missing file. - Slice decoding: gzipped, uncompressed fallback, empty (silent-empty- methylation-slice catch). - sample_bedgraph_paths: extras parsing, stem suffix stripping. build_igvreports.py: no changes — run_anchors_generate already shells to verify_anchors.py, the new bedGraph iteration lives inside cmd_generate, samplesheet extra_tracks flows through automatically. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --- igv-reports/SKILL.md | 29 ++- igv-reports/scripts/verify_anchors.py | 228 ++++++++++++++++-- igv-reports/tests/unit/test_verify_anchors.py | 186 +++++++++++++- 3 files changed, 413 insertions(+), 30 deletions(-) diff --git a/igv-reports/SKILL.md b/igv-reports/SKILL.md index d7e6d46..7d69985 100644 --- a/igv-reports/SKILL.md +++ b/igv-reports/SKILL.md @@ -412,16 +412,39 @@ python scripts/build_igvreports.py --samplesheet ... --anchors-mode verify \ Anchors TSV schema (`#`-prefixed header per lab BED convention): ``` -#sample track_name chrom start end expected tolerance min max notes +#sample track_name track_type chrom start end expected tolerance min max notes ``` +`track_type` is one of: +- `bam` — `expected` is the count from `samtools view -c -F 1536` against + the source BAM at generate time, and the same count against the + embedded BAM slice at verify time. Default when the column is absent + (backwards compat — pre-2026-05-19 anchor files keep working). +- `bedgraph` — `expected` is the number of data rows in the source + bedGraph overlapping the region (CpG count for methylation data, + peak count for ChIP coverage). Verify-time count comes from the + wig/bedGraph slice embedded by igv-reports in the HTML — gzip-decoded + in-memory, no samtools needed. + +bedGraph tracks come from the samplesheet's `extra_tracks` column. +Anchors for them are generated automatically alongside BAM anchors when +you run `verify_anchors.py generate` against a samplesheet that includes +bedGraph entries (e.g. `*.5mC.bedgraph`, `*.5hmC.bg`, plain or `.gz`). + `tolerance` is a ratio (default 5%). `min`/`max` are absolute bounds that override tolerance when set — useful for known-positive sites like -"this integration must have ≥20 reads". +"this integration must have ≥20 reads" or "this promoter must have ≥10 CpGs". samtools is resolved in this order: `--samtools-sif PATH` → `$SAMTOOLS_SIF` → `$SAMTOOLS_SIF_DEFAULT` → PATH `samtools`. On HPC, prefer a SIF to avoid -the NFS conda cold-start tax. +the NFS conda cold-start tax. bedGraph anchors don't require samtools. + +**Why this matters for methylation viewers**: the silent-failure mode for +methylation reports is "region rendered, slice has 0 CpGs" — an empty +bedGraph slice because the source had no calls in that window, or +because the slice extraction silently dropped them. Pure structural +verification confirms the bedGraph track is in the HTML but can't tell +whether it's empty. The bedgraph-anchor mode closes this gap. **Why opt-in and not default:** the verify step shells out to samtools per (sample × region) and indexes each slice — ~1 s/anchor. For a 6-sample diff --git a/igv-reports/scripts/verify_anchors.py b/igv-reports/scripts/verify_anchors.py index 0e44ac1..d11efc8 100755 --- a/igv-reports/scripts/verify_anchors.py +++ b/igv-reports/scripts/verify_anchors.py @@ -106,9 +106,13 @@ def _apptainer_bind_args() -> list[str]: EXCLUDE_FLAGS = "1536" DEFAULT_TOLERANCE = 0.05 ANCHOR_HEADER = [ - "sample", "track_name", "chrom", "start", "end", + "sample", "track_name", "track_type", "chrom", "start", "end", "expected", "tolerance", "min", "max", "notes", ] +# Supported track_type values. `bam` = samtools-view read count; +# `bedgraph` = data row count in the wig/bedGraph slice (CpG count for +# methylation, peak count for ChIP coverage, etc.). +VALID_TRACK_TYPES = {"bam", "bedgraph"} @dataclasses.dataclass @@ -119,9 +123,10 @@ class AnchorRow: start: int end: int expected: int - tolerance: str = "" # blank => fall back to --tolerance flag - min_count: str = "" # blank => not used - max_count: str = "" # blank => not used + track_type: str = "bam" # bam | bedgraph; bam keeps backwards compat + tolerance: str = "" # blank => fall back to --tolerance flag + min_count: str = "" # blank => not used + max_count: str = "" # blank => not used notes: str = "" @property @@ -148,9 +153,8 @@ def resolve_samtools(sif: Path | None) -> list[str]: """Return a samtools command prefix (list of argv tokens). Priority: --samtools-sif → $SAMTOOLS_SIF → $SAMTOOLS_SIF_DEFAULT → PATH. - Falling back to PATH is fine for non-HPC use; on HPC, prefer a SIF to - avoid the NFS conda cold-start tax. - """ + Falling back to PATH emits a warning (SIF preferred on shared HPC + storage where conda envs on NFS pay a cold-start cost).""" candidate = sif if candidate is None: env = os.environ.get("SAMTOOLS_SIF") @@ -205,6 +209,100 @@ def samtools_index(samtools_cmd: list[str], bam: Path) -> None: ) +# --------------------------------------------------------------------------- +# bedGraph / wig counting +# --------------------------------------------------------------------------- + +# A line in a wig/bedGraph file is either a header (track/fixedStep/ +# variableStep/browser/#) or a data row. We count data rows only. +_WIG_HEADER_PREFIXES = ("track", "browser", "fixedStep", "variableStep", "#") + + +def _is_wig_data_line(line: str) -> bool: + """True iff `line` is a non-empty wig/bedGraph data row (not header, + not comment, not blank).""" + s = line.strip() + if not s: + return False + if s.startswith(_WIG_HEADER_PREFIXES): + return False + return True + + +def bedgraph_count_source(track_path: Path, chrom: str, start: int, end: int) -> int: + """Count data rows in `track_path` (bedGraph or wig) overlapping the + region [start, end) on `chrom`. + + Handles three input shapes: + - bgzip+tabix indexed (`.bg.gz` / `.bedgraph.gz` + sibling `.tbi`): + delegate to `tabix` for O(log N) lookup. + - Plain gzip: stream-decompress, linear scan filtering on chrom + overlap. + - Plain text: linear scan filtering on chrom + overlap. + + Overlap rule matches IGV/igv-reports: row [r_start, r_end) overlaps + query [q_start, q_end) iff r_start < q_end AND r_end > q_start. + + Raises FileNotFoundError if `track_path` is absent. Returns 0 for a + region with no overlapping rows.""" + import gzip + if not track_path.exists(): + raise FileNotFoundError(f"bedGraph track not found: {track_path}") + + tbi = track_path.with_suffix(track_path.suffix + ".tbi") + if track_path.suffix == ".gz" and tbi.exists() and shutil.which("tabix"): + # Fast path — tabix-indexed bgzip. Tabix already handles overlap and + # comment-line skipping; we count the lines it emits. + proc = subprocess.run( + ["tabix", str(track_path), f"{chrom}:{start}-{end}"], + capture_output=True, text=True, + ) + if proc.returncode != 0: + raise RuntimeError( + f"tabix failed for {track_path} {chrom}:{start}-{end}: {proc.stderr.strip()}" + ) + return sum(1 for ln in proc.stdout.splitlines() if _is_wig_data_line(ln)) + + # Slow path — linear scan. Open with gzip if .gz, else text. Filter on + # chrom first (cheap) before parsing positions. + opener = gzip.open if track_path.suffix == ".gz" else open + count = 0 + with opener(track_path, "rt") as fh: + for line in fh: + if not _is_wig_data_line(line): + continue + cols = line.rstrip("\n").split("\t") + if len(cols) < 3: + continue + if cols[0] != chrom: + continue + try: + r_start = int(cols[1]) + r_end = int(cols[2]) + except ValueError: + continue + if r_start < end and r_end > start: + count += 1 + return count + + +def bedgraph_count_slice(slice_bytes: bytes) -> int: + """Count data rows in a wig/bedGraph slice that was extracted from an + igv-reports HTML via decode_track_slice(). + + igv-reports stores wig slices as `data:application/gzip;base64,<...>` + where the decoded bytes are gzipped wig text (per + igv_reports/datauri.py:get_data_uri). We gunzip in-memory and count + data rows.""" + import gzip + try: + text = gzip.decompress(slice_bytes).decode("utf-8", errors="replace") + except (OSError, gzip.BadGzipFile): + # Some create_report versions write the wig slice uncompressed for + # small payloads. Fall back to raw bytes interpreted as text. + text = slice_bytes.decode("utf-8", errors="replace") + return sum(1 for ln in text.splitlines() if _is_wig_data_line(ln)) + + # --------------------------------------------------------------------------- # anchors.tsv I/O # --------------------------------------------------------------------------- @@ -214,7 +312,8 @@ def write_anchors(anchors: list[AnchorRow], out: Path) -> None: lines = ["#" + "\t".join(ANCHOR_HEADER)] for a in anchors: lines.append("\t".join([ - a.sample, a.track_name, a.chrom, str(a.start), str(a.end), + a.sample, a.track_name, a.track_type, + a.chrom, str(a.start), str(a.end), str(a.expected), a.tolerance, a.min_count, a.max_count, a.notes, ])) out.write_text("\n".join(lines) + "\n") @@ -253,9 +352,17 @@ def load_anchors(path: Path) -> list[AnchorRow]: max_count = (d.get("max", "") or "").strip() if max_count: int(max_count) + # track_type was added 2026-05-19; older anchor files + # without the column default to "bam" so they keep working. + track_type = (d.get("track_type", "") or "bam").strip() or "bam" + if track_type not in VALID_TRACK_TYPES: + raise ValueError( + f"unknown track_type '{track_type}' (valid: {sorted(VALID_TRACK_TYPES)})" + ) rows.append(AnchorRow( sample=d["sample"], track_name=d["track_name"], + track_type=track_type, chrom=d["chrom"], start=int(d["start"]), end=int(d["end"]), @@ -313,6 +420,41 @@ def sample_bam_paths(row: dict) -> list[tuple[str, Path]]: return out +# wig/bedGraph extensions that we count rows for. .wig included because +# igv-reports treats both as "wig" format under the hood (tracks.py:60-61). +_BEDGRAPH_EXTS = (".bedgraph", ".bedgraph.gz", ".bg", ".bg.gz", ".wig", ".wig.gz") + + +def _is_bedgraph(path: str) -> bool: + p = path.lower() + return any(p.endswith(ext) for ext in _BEDGRAPH_EXTS) + + +def sample_bedgraph_paths(row: dict) -> list[tuple[str, Path]]: + """Return [(track_name, bedgraph_path), ...] for the bedGraph/wig + entries in a row's `extra_tracks` (comma-separated, mirrors the + build_igvreports samplesheet schema). track_name = Path.stem after + stripping a trailing `.gz` — matches igv-reports' positional auto- + naming (a `foo.bedgraph.gz` becomes `foo.bedgraph` in the track table, + then the verifier's structural check strips the format suffix; we + keep the format suffix here so the anchor row pairs unambiguously + with the source file).""" + out: list[tuple[str, Path]] = [] + extras = row.get("extra_tracks") or "" + for entry in extras.split(","): + entry = entry.strip() + if not _is_bedgraph(entry): + continue + p = Path(entry) + stem = p.stem + if stem.endswith(".bedgraph") or stem.endswith(".wig") or stem.endswith(".bg"): + # foo.bedgraph.gz -> Path.stem = 'foo.bedgraph'; strip one + # more level so the track_name matches what igv-reports renders. + stem = stem.rsplit(".", 1)[0] + out.append((stem, p)) + return out + + # --------------------------------------------------------------------------- # Slice extraction from embedded session # --------------------------------------------------------------------------- @@ -421,9 +563,11 @@ def cmd_generate(args: argparse.Namespace) -> None: for row in rows: sample = row["sample"] bams = sample_bam_paths(row) - if not bams: - sys.stderr.write(f"[generate] {sample}: no BAM tracks in row — skipping\n") + bgs = sample_bedgraph_paths(row) + if not bams and not bgs: + sys.stderr.write(f"[generate] {sample}: no BAM or bedGraph tracks in row — skipping\n") continue + # BAM anchors (read count via samtools). for track_name, bam in bams: if not bam.exists(): sys.stderr.write(f"[generate] {sample}/{track_name}: BAM missing: {bam}\n") @@ -436,11 +580,28 @@ def cmd_generate(args: argparse.Namespace) -> None: sys.stderr.write(f"[generate] {sample}/{track_name} {region}: {e}\n") continue anchors.append(AnchorRow( - sample=sample, track_name=track_name, + sample=sample, track_name=track_name, track_type="bam", chrom=b["chrom"], start=b["start"], end=b["end"], expected=count, notes=b["name"] or "", )) - sys.stderr.write(f"[generate] {sample}/{track_name} {region}: {count}\n") + sys.stderr.write(f"[generate] {sample}/{track_name} {region}: {count} reads\n") + # bedGraph / wig anchors (data row count = CpG count for methylation). + for track_name, bg in bgs: + if not bg.exists(): + sys.stderr.write(f"[generate] {sample}/{track_name}: bedGraph missing: {bg}\n") + continue + for b in bed_rows: + try: + count = bedgraph_count_source(bg, b["chrom"], b["start"], b["end"]) + except (FileNotFoundError, RuntimeError) as e: + sys.stderr.write(f"[generate] {sample}/{track_name} {b['chrom']}:{b['start']}-{b['end']}: {e}\n") + continue + anchors.append(AnchorRow( + sample=sample, track_name=track_name, track_type="bedgraph", + chrom=b["chrom"], start=b["start"], end=b["end"], + expected=count, notes=b["name"] or "", + )) + sys.stderr.write(f"[generate] {sample}/{track_name} {b['chrom']}:{b['start']}-{b['end']}: {count} rows\n") out = Path(args.out) write_anchors(anchors, out) @@ -504,18 +665,37 @@ def verify_one_html( )) continue url = track.get("url", "") - slice_path = tmp / f"{a.sample}__{a.track_name}__{a.chrom}_{a.start}_{a.end}.bam" - try: - decode_track_slice(url, slice_path) - samtools_index(samtools_cmd, slice_path) - observed = samtools_count(samtools_cmd, slice_path, a.region) - except (ValueError, RuntimeError) as e: - checks.append(AnchorCheck( - a.sample, a.track_name, a.region, "FAIL", - expected=str(a.expected), - details=f"slice decode/count failed: {e}", - )) - continue + if a.track_type == "bedgraph": + # wig/bedGraph slices are gzip(text) base64-encoded by + # igv_reports/datauri.py. Count data rows in the embedded + # slice; no samtools needed. + try: + m = _DATA_URL_RE.match(url) + if not m: + raise ValueError("track url is not a data: base64 URL") + raw = base64.b64decode(m.group(1)) + observed = bedgraph_count_slice(raw) + except (ValueError, RuntimeError) as e: + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, "FAIL", + expected=str(a.expected), + details=f"bedGraph slice decode/count failed: {e}", + )) + continue + else: + # BAM (default). + slice_path = tmp / f"{a.sample}__{a.track_name}__{a.chrom}_{a.start}_{a.end}.bam" + try: + decode_track_slice(url, slice_path) + samtools_index(samtools_cmd, slice_path) + observed = samtools_count(samtools_cmd, slice_path, a.region) + except (ValueError, RuntimeError) as e: + checks.append(AnchorCheck( + a.sample, a.track_name, a.region, "FAIL", + expected=str(a.expected), + details=f"slice decode/count failed: {e}", + )) + continue status, details = decide_status(a, observed, default_tol) checks.append(AnchorCheck( a.sample, a.track_name, a.region, status, diff --git a/igv-reports/tests/unit/test_verify_anchors.py b/igv-reports/tests/unit/test_verify_anchors.py index 40efab9..fa7b514 100644 --- a/igv-reports/tests/unit/test_verify_anchors.py +++ b/igv-reports/tests/unit/test_verify_anchors.py @@ -3,8 +3,8 @@ Author: Samuel Ahuno Purpose: Fast pytest suite covering the pure-Python parsing/decision logic in - verify_anchors.py. No subprocess, no real BAM, no external dependencies. - Runs in ~1 s on any machine with pytest. + verify_anchors.py. No subprocess, no real BAM, no shared-storage + dependency. Runs in ~1 s on any machine with pytest. These tests catch the parser regressions that bit during the original iteration: status-taxonomy conflation between SKIP and FAIL, mis-tabbed @@ -12,7 +12,7 @@ with notes when columns are out of order. Run: - cd <plugin-root>/igv-reports + cd claude/skills/igv-reports pytest tests/unit/ -v """ @@ -352,3 +352,183 @@ def test_write_load_round_trip(tmp_path): assert rows[0].notes == "hi" assert rows[1].min_count == "3" assert rows[1].max_count == "20" + + +# --------------------------------------------------------------------------- +# bedGraph / wig anchors (methylation-aware path added 2026-05-19) +# --------------------------------------------------------------------------- + +def _write_bedgraph(path: Path, rows: list[tuple]) -> Path: + """Write a 4-col bedGraph (chrom/start/end/value), no header.""" + path.write_text("".join(f"{r[0]}\t{r[1]}\t{r[2]}\t{r[3]}\n" for r in rows)) + return path + + +def test_is_wig_data_line(): + assert va._is_wig_data_line("chr1\t100\t101\t0.5") is True + assert va._is_wig_data_line("track name=meth") is False + assert va._is_wig_data_line("browser dense") is False + assert va._is_wig_data_line("fixedStep chrom=chr1 start=1 step=1") is False + assert va._is_wig_data_line("variableStep chrom=chr1") is False + assert va._is_wig_data_line("# comment") is False + assert va._is_wig_data_line("") is False + assert va._is_wig_data_line(" ") is False + + +def test_bedgraph_count_source_plain_text_in_region(tmp_path): + # 3 of 4 rows overlap [100, 200); the 4th is on a different chrom. + bg = _write_bedgraph(tmp_path / "sample.hg38.bedgraph", [ + ("chr1", 100, 101, 0.5), + ("chr1", 150, 151, 0.8), + ("chr1", 199, 200, 0.3), # r_end > q_start? 200 > 100 yes; r_start < q_end? 199 < 200 yes + ("chr2", 100, 101, 0.9), # different chrom + ]) + assert va.bedgraph_count_source(bg, "chr1", 100, 200) == 3 + + +def test_bedgraph_count_source_excludes_out_of_region(tmp_path): + # Rows must overlap [start, end). Boundary cases. + bg = _write_bedgraph(tmp_path / "sample.hg38.bedgraph", [ + ("chr1", 50, 100, 0.1), # r_end == q_start -> doesn't overlap (half-open) + ("chr1", 100, 150, 0.2), # r_start == q_start -> overlaps + ("chr1", 195, 200, 0.3), # r_start < q_end == 200 -> overlaps + ("chr1", 200, 250, 0.4), # r_start == q_end -> doesn't overlap (half-open) + ("chr1", 1000, 1001, 0.5), # way out + ]) + assert va.bedgraph_count_source(bg, "chr1", 100, 200) == 2 + + +def test_bedgraph_count_source_skips_headers_and_comments(tmp_path): + bg = tmp_path / "sample.hg38.bedgraph" + bg.write_text( + "#header comment\n" + "track name=test\n" + "browser dense\n" + "chr1\t100\t101\t0.5\n" + "chr1\t150\t151\t0.6\n" + ) + assert va.bedgraph_count_source(bg, "chr1", 0, 1000) == 2 + + +def test_bedgraph_count_source_handles_gzipped_input(tmp_path): + # Plain-gzip (not bgzip+tabix). Linear-scan path. + import gzip + bg = tmp_path / "sample.hg38.bedgraph.gz" + with gzip.open(bg, "wt") as fh: + fh.write("chr3\t100\t101\t0.5\n") + fh.write("chr3\t150\t151\t0.6\n") + fh.write("chr3\t999\t1000\t0.7\n") + assert va.bedgraph_count_source(bg, "chr3", 100, 200) == 2 + assert va.bedgraph_count_source(bg, "chr3", 0, 10000) == 3 + assert va.bedgraph_count_source(bg, "chr4", 0, 10000) == 0 + + +def test_bedgraph_count_source_missing_file_raises(tmp_path): + with pytest.raises(FileNotFoundError, match="bedGraph track not found"): + va.bedgraph_count_source(tmp_path / "does_not_exist.bg", "chr1", 0, 100) + + +def test_bedgraph_count_slice_decodes_gzipped_payload(): + # Mimics how igv_reports/datauri.py encodes a wig/bedGraph slice: + # gzip(text) base64-encoded. verify_anchors only sees the gzipped + # bytes after base64 decoding, so we test the bytes-in entry point. + text = ( + "track name=meth\n" + "chr1\t100\t101\t0.5\n" + "chr1\t150\t151\t0.6\n" + "chr1\t200\t201\t0.7\n" + ) + assert va.bedgraph_count_slice(gzip.compress(text.encode())) == 3 + + +def test_bedgraph_count_slice_falls_back_to_uncompressed(): + # Some create_report versions write small wig slices uncompressed — + # the fallback path must accept raw text bytes. + text = "chr1\t100\t101\t0.5\nchr1\t200\t201\t0.6\n" + assert va.bedgraph_count_slice(text.encode()) == 2 + + +def test_bedgraph_count_slice_zero_when_empty(): + # No data rows in the slice = silent empty-methylation-slice failure. + # Caller (verify_one_html) compares to expected via decide_status. + assert va.bedgraph_count_slice(gzip.compress(b"track name=meth\n")) == 0 + assert va.bedgraph_count_slice(b"") == 0 + + +# --------------------------------------------------------------------------- +# Anchor schema: track_type column with backwards compat +# --------------------------------------------------------------------------- + +def test_load_anchors_legacy_no_track_type_defaults_to_bam(tmp_path): + # Pre-2026-05-19 anchor files lack the track_type column. Loader must + # accept them and default each row to track_type='bam'. + p = _write_tsv(tmp_path, ( + "#sample\ttrack_name\tchrom\tstart\tend\texpected\ttolerance\tmin\tmax\tnotes\n" + "s1\ttumor\tchr2\t100\t200\t42\t\t\t\t\n" + )) + rows = va.load_anchors(p) + assert rows[0].track_type == "bam" + + +def test_load_anchors_with_track_type_bedgraph(tmp_path): + p = _write_tsv(tmp_path, ( + "#sample\ttrack_name\ttrack_type\tchrom\tstart\tend\texpected\ttolerance\tmin\tmax\tnotes\n" + "s1\tmeth_track\tbedgraph\tchr2\t100\t200\t8\t\t\t\tDNMT3A_CpGs\n" + )) + rows = va.load_anchors(p) + assert rows[0].track_type == "bedgraph" + assert rows[0].expected == 8 + assert rows[0].notes == "DNMT3A_CpGs" + + +def test_load_anchors_rejects_unknown_track_type(tmp_path): + p = _write_tsv(tmp_path, ( + "#sample\ttrack_name\ttrack_type\tchrom\tstart\tend\texpected\ttolerance\tmin\tmax\tnotes\n" + "s1\tt1\tcraaam\tchr1\t0\t100\t5\t\t\t\t\n" + )) + with pytest.raises(SystemExit, match="unknown track_type 'craaam'"): + va.load_anchors(p) + + +def test_write_load_round_trip_preserves_track_type(tmp_path): + anchors_in = [ + va.AnchorRow(sample="s1", track_name="tumor", track_type="bam", + chrom="chr1", start=0, end=100, expected=42), + va.AnchorRow(sample="s1", track_name="tumor.5mC", track_type="bedgraph", + chrom="chr1", start=0, end=100, expected=12), + ] + out = tmp_path / "anchors.tsv" + va.write_anchors(anchors_in, out) + rows = va.load_anchors(out) + assert [r.track_type for r in rows] == ["bam", "bedgraph"] + + +# --------------------------------------------------------------------------- +# sample_bedgraph_paths: samplesheet → (track_name, bedgraph_path) iteration +# --------------------------------------------------------------------------- + +def test_sample_bedgraph_paths_picks_bedgraph_from_extras(): + row = {"sample": "s1", "extra_tracks": "/data/x.5mC.bedgraph,/data/x.5hmC.bg"} + pairs = va.sample_bedgraph_paths(row) + assert pairs == [("x.5mC", Path("/data/x.5mC.bedgraph")), + ("x.5hmC", Path("/data/x.5hmC.bg"))] + + +def test_sample_bedgraph_paths_strips_gz_suffix_from_track_name(): + # Path.stem of foo.bedgraph.gz is "foo.bedgraph"; igv-reports renders + # it as just "foo", so we strip one more level. + row = {"sample": "s1", "extra_tracks": "/data/foo.bedgraph.gz"} + pairs = va.sample_bedgraph_paths(row) + assert pairs[0][0] == "foo" + + +def test_sample_bedgraph_paths_skips_non_bedgraph_extras(): + # bam/vcf in extra_tracks are NOT bedgraphs — sample_bam_paths handles them. + row = {"sample": "s1", "extra_tracks": "/data/x.5mC.bedgraph,/data/y.bam,/data/z.vcf"} + pairs = va.sample_bedgraph_paths(row) + assert pairs == [("x.5mC", Path("/data/x.5mC.bedgraph"))] + + +def test_sample_bedgraph_paths_empty_when_no_extras(): + assert va.sample_bedgraph_paths({"sample": "s1"}) == [] + assert va.sample_bedgraph_paths({"sample": "s1", "extra_tracks": ""}) == [] From 709080325985b43e6e748333f95f1fc027c12765 Mon Sep 17 00:00:00 2001 From: sahuno <ekwame001@gmail.com> Date: Tue, 19 May 2026 01:16:35 -0400 Subject: [PATCH 8/9] igv-reports: end-to-end integration test against committed fixture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds tests/integration/end_to_end/, a ~14 s smoke test using the committed tiny_colo829.hg38.bam fixture (457 KB). Closes the gap between mocked unit tests and real-world failures: the silent-exit-0 bug fixed yesterday wouldn't have been caught by the mocked suite, but is caught instantly by this layer. scenarios.sh exercises eight assertions: - HTML produced + plausible size (≥ 50 KB) - verify_report.py structural PASS - verify_anchors.py generate matches the frozen contract from tests/fixtures/README.md (chr2=5, chr7=9) - verify_anchors.py verify round-trips the embedded slice counts - --also-png produces manifest + non-empty PNGs (SKIPped when igver isn't installed or is the documented broken shim) Synthesizes a minimal N-only FASTA so CI doesn't need an hg38 download. run_all.sh runs end_to_end as the first integration scenario (it's fast + portable, no shared-storage dependency). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --- .../tests/integration/end_to_end/README.md | 62 +++++ .../tests/integration/end_to_end/scenarios.sh | 248 ++++++++++++++++++ igv-reports/tests/run_all.sh | 12 +- 3 files changed, 319 insertions(+), 3 deletions(-) create mode 100644 igv-reports/tests/integration/end_to_end/README.md create mode 100755 igv-reports/tests/integration/end_to_end/scenarios.sh diff --git a/igv-reports/tests/integration/end_to_end/README.md b/igv-reports/tests/integration/end_to_end/README.md new file mode 100644 index 0000000..85fad18 --- /dev/null +++ b/igv-reports/tests/integration/end_to_end/README.md @@ -0,0 +1,62 @@ +# tests/integration/end_to_end + +End-to-end smoke test against the **committed** `tests/fixtures/tiny_colo829.hg38.bam` +fixture (457 KB). Unlike the other integration scenarios (`anchor_verify`, +`cohort_verify`), this one needs no shared-storage access and runs in +~30 s — so it ships in CI. + +## What it exercises (not via mocks) + +1. **`build_igvreports.py --bam ...`** actually invokes `create_report` + against the fixture BAM with a synthesized minimal FASTA. Produces a + real ~2 MB HTML. +2. **`verify_report.py`** parses the HTML's `tableJson` + `sessionDictionary`, + confirms region count + track presence. +3. **`verify_anchors.py generate`** counts reads in the source BAM at the + three sites; asserts the counts match the frozen contract documented in + `tests/fixtures/README.md` (`chr2:25246500-25246501 = 5`, + `chr7:148884000-148884001 = 9`). +4. **`verify_anchors.py verify`** decodes the embedded BAM slices from the + freshly-built HTML and confirms the same counts — closes the loop on the + create_report ↔ source-BAM round trip. +5. **`--also-png` (optional)** runs the same pipeline with the PNG sidecar + path. SKIPs cleanly when `igver` isn't installed or fails (the + documented silent-failure mode in `rules/igv.md`). + +## What it catches that unit tests don't + +- `create_report` flag rename / removal on upstream version bumps +- HTML structural changes from upstream (e.g. session-dict layout drift) +- Driver regressions on the **non-mock** code path +- Off-MSKCC portability bugs — the test runs against the committed fixture + with no `shared-storage` dependency, so CI exercises the same code paths + external users would hit + +## Runtime + +| Step | Duration | +|---|---| +| `create_report` (3 regions × 1 BAM × 300 bp flanking) | ~2 s | +| structural `verify_report.py` | <1 s | +| `verify_anchors.py generate` + `verify` | ~5 s | +| `--also-png` (if igver available) | ~5 s | +| **total** | **~14 s** | + +## Prereqs + +- `create_report` on PATH (`pip install -U 'igv-reports>=1.16.0'`) +- `samtools` on PATH (provided by the smoke layer prereqs) +- `python3` on PATH + +If `create_report` is missing the test exits 77 (skipped) rather than +failing — same convention as the other integration scenarios. + +## Knobs + +- `KEEP_REPORTS=1` — leave the `out/` directory in place after a successful + run for manual inspection. +- `IGV_REPORTS_PY=/path/to/python` — pin the python interpreter (the + default search is conda's snakemake env → `python3` on PATH). +- `IGVER_CMD='apptainer exec /path/to/igver.sif igver'` — provide a working + `igver` invocation so step 8 (`--also-png`) actually exercises the PNG + pipeline rather than SKIPping. diff --git a/igv-reports/tests/integration/end_to_end/scenarios.sh b/igv-reports/tests/integration/end_to_end/scenarios.sh new file mode 100755 index 0000000..ad83100 --- /dev/null +++ b/igv-reports/tests/integration/end_to_end/scenarios.sh @@ -0,0 +1,248 @@ +#!/usr/bin/env bash +# scenarios.sh — end-to-end smoke test using the COMMITTED tiny_colo829 fixture. +# +# Author: Samuel Ahuno +# Purpose: +# The other integration scenarios (anchor_verify, cohort_verify) require +# 167 GB lab BAMs and take 6-8 min. This one uses the 457 KB +# tests/fixtures/tiny_colo829.hg38.bam fixture so the full pipeline runs +# in ~30 s on any machine with `create_report` on PATH. +# +# What it exercises end-to-end (not via mocks): +# 1. build_igvreports.py invokes create_report against the fixture +# 2. The resulting HTML is parseable by verify_report.py (structural) +# 3. verify_anchors.py generate → frozen counts (chr2=5, chr7=9 per +# tests/fixtures/README.md) +# 4. verify_anchors.py verify → PASS on the freshly built HTML +# 5. If `igver` is on PATH: --also-png produces non-empty per-region +# PNGs and the manifest. Otherwise that step is SKIPped (logged). +# +# Catches: create_report flag drift, HTML-format upstream changes, driver +# regressions on the non-mock path, off-MSKCC portability bugs (the +# fixture is committed; no shared-storage required). +# +# Runtime: ~30 s. Disk: ~5 MB under ./out/ (auto-cleaned on success). +set -euo pipefail + +EX_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SKILL_DIR="$(cd "${EX_DIR}/../../.." && pwd)" +BUILD="${SKILL_DIR}/scripts/build_igvreports.py" +ANCHORS="${SKILL_DIR}/scripts/verify_anchors.py" +VR="${SKILL_DIR}/scripts/verify_report.py" +FIXTURE="${SKILL_DIR}/tests/fixtures/tiny_colo829.hg38.bam" + +# Prerequisite: create_report must be on PATH (provided by `pip install igv-reports`). +if ! command -v create_report >/dev/null 2>&1; then + echo "SKIP: end-to-end test needs create_report on PATH." >&2 + echo " Install with: pip install -U 'igv-reports>=1.16.0'" >&2 + exit 77 +fi + +# Prerequisite: the committed fixture must be readable. +if [[ ! -f "${FIXTURE}" ]] || [[ ! -f "${FIXTURE}.bai" ]]; then + echo "ERROR: fixture missing or unindexed: ${FIXTURE}" >&2 + echo " Regenerate with: bash tests/fixtures/build_fixtures.sh" >&2 + exit 1 +fi + +# Pick the python that can import pyyaml + the same scripts/. Tests/run_all.sh +# already does this dance; we mirror it. +PY="${IGV_REPORTS_PY:-}" +if [[ -z "${PY}" ]]; then + if command -v python3 >/dev/null 2>&1; then + PY=$(command -v python3) + else + echo "ERROR: no python3 on PATH" >&2; exit 2 + fi +fi + +OUTDIR="${EX_DIR}/out" +cleanup() { + if [[ -n "${KEEP_REPORTS:-}" ]]; then + echo "(KEEP_REPORTS set — leaving artifacts in ${OUTDIR})" + return + fi + rm -rf "${OUTDIR}" +} +trap 'rc=$?; if [[ $rc -eq 0 ]]; then cleanup; else echo "(scenarios.sh exited $rc — leaving ${OUTDIR} for debug)"; fi' EXIT + +rm -rf "${OUTDIR}" +mkdir -p "${OUTDIR}" + +# --- 1. Inputs -------------------------------------------------------------- +# Three sites, all within the fixture's two slice regions: +# * chr2:25246500-25246501 (DNMT3A R882 SNV, frozen anchor count = 5) +# * chr7:148884000-148884001 (EZH2 Y646 SNV, frozen anchor count = 9) +# * chr2:25247500-25247501 (second DNMT3A locus, count not frozen) +# Frozen counts are the contract per tests/fixtures/README.md. +SITES="${OUTDIR}/sites.hg38.bed" +cat >"${SITES}" <<EOF +#chrom start end name +chr2 25246500 25246501 DNMT3A_R882 +chr7 148884000 148884001 EZH2_Y646 +chr2 25247500 25247501 DNMT3A_2nd +EOF + +# Reference FASTA: in CI we won't have hg38 locally. Skip the --fasta +# resolution and use --no-default-tracks; create_report will then need a +# --fasta path. We supply a synthesized FASTA covering both regions so +# create_report can compute its own slice without internet access. +FASTA="${OUTDIR}/tiny.hg38.fa" +${PY} -c " +# Minimal multi-contig FASTA covering the fixture's coverage windows. +# Only the size matters for create_report's region slicing — bases don't +# need to be biologically real; the BAM's reads carry the actual signal. +contigs = [ + ('chr2', 30_000_000), + ('chr7', 150_000_000), +] +with open('${FASTA}', 'w') as fh: + for name, length in contigs: + fh.write(f'>{name}\n') + n_per_line = 60 + for i in range(0, length, n_per_line): + fh.write('N' * min(n_per_line, length - i) + '\n') +" +samtools faidx "${FASTA}" + +# --- 2. Build HTML (the actual end-to-end step) ----------------------------- +echo "=== build: invoke create_report against fixture BAM ===" +HTML="${OUTDIR}/sample.hg38.html" +${PY} "${BUILD}" \ + --sites "${SITES}" \ + --bam "${FIXTURE}" \ + --genome hg38 \ + --fasta "${FASTA}" \ + --no-default-tracks \ + --flanking 300 \ + --type mutation \ + --info-columns name \ + --output "${HTML}" \ + --no-apptainer \ + --no-verify 2>&1 | tail -8 +echo + +# --- 3. Assertion: HTML exists, plausible size ------------------------------ +if [[ ! -f "${HTML}" ]]; then + echo "FAIL: HTML not produced at ${HTML}"; exit 1 +fi +size=$(stat -c %s "${HTML}") +if [[ "${size}" -lt 50000 ]]; then + echo "FAIL: HTML suspiciously small (${size} bytes) — expected >= 50 KB" + exit 1 +fi +echo " OK HTML: ${HTML} (${size} bytes)" +echo + +# --- 4. Structural verify --------------------------------------------------- +echo "=== verify_report.py: structural check ===" +${PY} "${VR}" \ + --html "${HTML}" \ + --sites "${SITES}" \ + --tracks "${FIXTURE}" \ + --min-size-mb 0.05 \ + --out "${OUTDIR}/verify_report.tsv" \ + --fail-on-fail >/dev/null +echo " OK structural verify PASS" +echo + +# --- 5. Generate frozen anchors --------------------------------------------- +echo "=== verify_anchors.py generate: BAM read counts ===" +SHEET="${OUTDIR}/samplesheet.tsv" +printf 'sample\tbam_tumor\tsites_bed\n' >"${SHEET}" +printf 'sample\t%s\t%s\n' "${FIXTURE}" "${SITES}" >>"${SHEET}" + +ANCHORS_TSV="${OUTDIR}/anchors.hg38.tsv" +${PY} "${ANCHORS}" generate \ + --samplesheet "${SHEET}" \ + --sites "${SITES}" \ + --out "${ANCHORS_TSV}" 2>&1 | tail -6 +echo + +# --- 6. Assertion: frozen anchor counts match contract ---------------------- +# Contract is in tests/fixtures/README.md. Any drift here is the loudest +# signal that the fixture changed, the BAM filter changed, or the test +# environment is using a different samtools. +expected_chr2=5 +expected_chr7=9 +actual_chr2=$(awk -F'\t' '$4=="chr2" && $5==25246500 {print $7}' "${ANCHORS_TSV}") +actual_chr7=$(awk -F'\t' '$4=="chr7" && $5==148884000 {print $7}' "${ANCHORS_TSV}") +if [[ "${actual_chr2}" != "${expected_chr2}" ]]; then + echo "FAIL: chr2:25246500-25246501 expected=${expected_chr2} got=${actual_chr2}" + exit 1 +fi +if [[ "${actual_chr7}" != "${expected_chr7}" ]]; then + echo "FAIL: chr7:148884000-148884001 expected=${expected_chr7} got=${actual_chr7}" + exit 1 +fi +echo " OK anchor contract: chr2=5 chr7=9 (matches tests/fixtures/README.md)" +echo + +# --- 7. verify_anchors against the just-built HTML -------------------------- +echo "=== verify_anchors.py verify: HTML slice round-trip ===" +${PY} "${ANCHORS}" verify \ + --html "${HTML}" \ + --anchors "${ANCHORS_TSV}" \ + --out "${OUTDIR}/verify_anchors.tsv" \ + --fail-on-fail >/dev/null +echo " OK anchor verify PASS (HTML slice counts match source BAM counts)" +echo + +# --- 8. Optional: --also-png exercises the full HTML+PNG pipeline ----------- +# Skip semantics: this step is best-effort and never causes the test to FAIL. +# `igver` may be on PATH as a `pip install igver` egg-link shim WITHOUT the +# underlying IGV Java binary — exits 0 but produces no PNGs (the documented +# silent-failure mode in rules/igv.md). Our --also-png driver catches that +# via the inline existence check and raises SystemExit. Here we treat any +# such failure as SKIP rather than propagate it, since a non-working igver +# install isn't a regression in this skill's code. +if command -v igver >/dev/null 2>&1 || [[ -n "${IGVER_CMD:-}" ]]; then + echo "=== --also-png: HTML + per-region PNGs (igver available) ===" + HTML_PNG="${OUTDIR}/png_sample.hg38.html" + if ${PY} "${BUILD}" \ + --sites "${SITES}" \ + --bam "${FIXTURE}" \ + --genome hg38 \ + --fasta "${FASTA}" \ + --no-default-tracks \ + --flanking 300 \ + --type mutation \ + --info-columns name \ + --output "${HTML_PNG}" \ + --no-apptainer \ + --no-verify \ + --also-png \ + --png-dpi 100 >"${OUTDIR}/also_png.log" 2>&1; then + # --also-png returned 0 — assert the manifest + PNGs are real. + MANIFEST="${OUTDIR}/png_png_sample.hg38/manifest.tsv" + if [[ ! -f "${MANIFEST}" ]]; then + echo "FAIL: --also-png exited 0 but no manifest at ${MANIFEST}" + exit 1 + fi + n_regions=$(awk -F'\t' 'NR>1 && !/^#/' "${MANIFEST}" | wc -l) + if [[ "${n_regions}" -ne 3 ]]; then + echo "FAIL: manifest has ${n_regions} regions, expected 3" + exit 1 + fi + png_one=$(awk -F'\t' 'NR==2 {print $9}' "${MANIFEST}") + if [[ ! -s "${png_one}" ]]; then + echo "FAIL: PNG missing or empty: ${png_one}" + exit 1 + fi + png_size=$(stat -c %s "${png_one}") + echo " OK manifest: ${n_regions} regions; spot-check ${png_one##*/} = ${png_size} bytes" + else + # Driver caught the silent-failure mode; surface the diagnostic but + # don't fail the test — broken igver install is environment-level. + echo " SKIP (igver invocation failed — likely missing IGV Java binary or wrong PATH)" + echo " see ${OUTDIR}/also_png.log for the driver's diagnostic." + if grep -q "silent exit-0 failure\|Failed to generate all PNG files" "${OUTDIR}/also_png.log" 2>/dev/null; then + echo " (confirmed: this is the documented igver silent-failure mode)" + fi + fi +else + echo "=== --also-png: SKIP (igver not on PATH; set \$IGVER_CMD or install via apptainer SIF) ===" +fi +echo + +echo "=== end-to-end PASS — full pipeline (create_report → verify → optional igver) ===" diff --git a/igv-reports/tests/run_all.sh b/igv-reports/tests/run_all.sh index fb68b70..1356656 100755 --- a/igv-reports/tests/run_all.sh +++ b/igv-reports/tests/run_all.sh @@ -9,7 +9,7 @@ # 3. integration — full cohort build + verify-cohort + verify-anchors # end-to-end; bash scenarios.sh under each demo. # Skipped (exit 77) when the IGV_REPORTS_TEST_BAM_* -# env vars are unset +# env vars are unset AND the MSKCC default paths # don't exist. # # Usage: @@ -47,10 +47,13 @@ for arg in "$@"; do esac done -# Pick a Python with pytest. Honor $IGV_REPORTS_PY if set; else PATH python3. +# Pick a Python with pytest. Prefer the snakemake conda env (where all +# project tooling lives); fall back to PATH `python3`. PY="${IGV_REPORTS_PY:-}" if [[ -z "${PY}" ]]; then - if command -v python3 >/dev/null 2>&1; then + if [[ -x /home/ahunos/miniforge3/envs/snakemake/bin/python ]]; then + PY=/home/ahunos/miniforge3/envs/snakemake/bin/python + elif command -v python3 >/dev/null 2>&1; then PY=$(command -v python3) else echo "ERROR: no python3 available. Set IGV_REPORTS_PY=<path-to-python>" >&2 @@ -96,6 +99,9 @@ fi # Each scenarios.sh exits 77 if its required BAMs aren't available; we treat # that as a skip rather than a failure so the suite is portable. if [[ $RUN_INTEGRATION -eq 1 ]]; then + # end_to_end: uses the committed tiny_colo829 fixture (~30 s, runs in CI). + run_layer "integration / end_to_end" "full pipeline against committed fixture" \ + bash "${TESTS_DIR}/integration/end_to_end/scenarios.sh" run_layer "integration / cohort_verify" "cohort structural verifier scenarios" \ bash "${TESTS_DIR}/integration/cohort_verify/scenarios.sh" run_layer "integration / anchor_verify" "anchor content verifier scenarios" \ From f726f518f85c8fae09c2c564beec57f4d987d979 Mon Sep 17 00:00:00 2001 From: sahuno <ekwame001@gmail.com> Date: Tue, 19 May 2026 01:37:35 -0400 Subject: [PATCH 9/9] anchor_verify scenarios: rebase column indexes onto track_type schema MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit verify_anchors.py recently added `track_type` as the 3rd anchor column, shifting downstream columns by +1. The integration scenarios edit the anchor TSV by column index to simulate specific corruption modes, so they were silently writing to wrong fields after the schema change. Fix bumps three awk corruption indexes: scenario A: $6 -> $7 (corrupt `expected`) scenario B: $8 -> $9 (corrupt `min`) scenario D: $3 -> $4 (filter on `chrom`) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> --- igv-reports/tests/integration/anchor_verify/scenarios.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/igv-reports/tests/integration/anchor_verify/scenarios.sh b/igv-reports/tests/integration/anchor_verify/scenarios.sh index 264836d..fcb95b9 100755 --- a/igv-reports/tests/integration/anchor_verify/scenarios.sh +++ b/igv-reports/tests/integration/anchor_verify/scenarios.sh @@ -123,7 +123,7 @@ echo # --- 5. Scenario A: tolerance violation ---------------------------------------- echo "=== scenario A: corrupt expected count outside tolerance — FAIL on diff_ratio ===" -awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} NR==2 {$6=9999; print; next} {print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.corrupted.tsv" +awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} NR==2 {$7=9999; print; next} {print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.corrupted.tsv" python "${ANCHORS}" verify-cohort \ --samplesheet "${SHEET}" \ --reports-dir "${OUTDIR}" \ @@ -136,7 +136,7 @@ echo # --- 6. Scenario B: min/max bound violation ------------------------------------ echo "=== scenario B: anchor min=1000 (real count ~56) — FAIL on min ===" -awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} NR==2 {$8=1000; print; next} {print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.min.tsv" +awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} NR==2 {$9=1000; print; next} {print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.min.tsv" python "${ANCHORS}" verify-cohort \ --samplesheet "${SHEET}" \ --reports-dir "${OUTDIR}" \ @@ -169,7 +169,7 @@ echo # --- 8. Scenario D: anchor missing for a (sample, region) — SKIP not FAIL ------ echo "=== scenario D: drop sample_1's chr2 anchor — that region SKIPs, others PASS ===" -awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} !($1=="sample_1" && $3=="chr2"){print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.subset.tsv" +awk -F'\t' 'BEGIN{OFS="\t"} /^#/{print; next} !($1=="sample_1" && $4=="chr2"){print}' "${ANCHORS_TSV}" > "${EX_DIR}/anchors.subset.tsv" python "${ANCHORS}" verify-cohort \ --samplesheet "${SHEET}" \ --reports-dir "${OUTDIR}" \