From 0089851423e004407acc11bca834bc3009510171 Mon Sep 17 00:00:00 2001 From: "Jin Seok (Andy) Lee" Date: Wed, 13 May 2026 10:23:38 -0400 Subject: [PATCH] update docs --- .gitignore | 2 - docs/.gitignore | 2 - .../mutant-proteoform-prediction.qmd | 221 ++++++++++++++++++ .../variation-graph-construction.qmd | 54 +++++ 4 files changed, 275 insertions(+), 4 deletions(-) delete mode 100644 docs/.gitignore create mode 100644 docs/pipelines/mutant-proteoform-prediction.qmd create mode 100644 docs/pipelines/variation-graph-construction.qmd diff --git a/.gitignore b/.gitignore index 9c29af0..65ac36f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,9 +14,7 @@ target/ docs/_site docs/.quarto/ docs/cli/* -docs/pipelines/* !docs/cli/index.qmd -!docs/pipelines/index.qmd Cargo.lock .nojekyll *.nextflow.log* diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index ad29309..0000000 --- a/docs/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/.quarto/ -**/*.quarto_ipynb diff --git a/docs/pipelines/mutant-proteoform-prediction.qmd b/docs/pipelines/mutant-proteoform-prediction.qmd new file mode 100644 index 0000000..38d819d --- /dev/null +++ b/docs/pipelines/mutant-proteoform-prediction.qmd @@ -0,0 +1,221 @@ +--- +title: "Mutant Proteoform Prediction" +description: "Call somatic/germline DNA and RNA variants, integrate them, and translate transcripts to mutant proteoforms using long-read DNA + RNA sequencing data." +--- + +This pipeline is Exacto's primary use case: identify germline and +somatic DNA variants as well as RNA variants from a case sample +(e.g. a tumor), integrate the DNA and RNA variants, and translate the mutant peptide sequences they encode. + +External tools you'll need alongside exacto: + +- [`Minimap2`](https://github.com/lh3/minimap2) — long-read DNA/RNA alignment +- [`Samtools`](https://www.htslib.org/) — BAM manipulation and indexing +- [`RNA-Bloom2`](https://github.com/bcgsc/RNA-Bloom) — long-read transcriptome assembly + +## Workflow + +```{mermaid} +%%{init: {'securityLevel': 'loose', 'flowchart': {'rankSpacing': 20, 'nodeSpacing': 40, 'subGraphTitleMargin': {'top': 5, 'bottom': 20}}}}%% +flowchart TD + subgraph DNA["DNA variant calling"] + direction LR + DNAIN[/"Tumor + normal BAMs"/] --> CALLDNA(call-somatic-dna-vars) + CALLDNA --> ANN(annotate-vars) + ANN --> ANNOUT[/"Annotated DNA variants TSV"/] + end + + subgraph RNA["RNA variant calling"] + direction LR + RNAIN[/"Assembled transcriptome BAM"/] --> RM(remove-unspliced-rnas) + RM --> CALLRNA(call-rna-vars) + CALLRNA --> RNAOUT[/"RNA variants TSV"/] + CALLRNA --> TS[/"Transcript structures TSV"/] + end + + ANNOUT --> INT(integrate-vars) + RNAOUT --> INT + INT --> INTOUT[/"Integrated DNA + RNA variants TSV"/] + + TS --> TR(translate-structs) + RNAOUT --> TR + INTOUT --> TR + TR --> PRIMTSV[/"Primary structures TSV"/] + TR --> PRIMFA[/"Primary structures FASTA"/] + + PRIMTSV --> CPV(call-peptide-vars) + CPV --> PEPS[/"Peptide variants TSV"/] + + style DNA fill:#ffffff,stroke:#bbbbbb + style RNA fill:#ffffff,stroke:#bbbbbb + + click CALLDNA href "../cli/call-somatic-dna-vars.html" "View call-somatic-dna-vars docs" _self + click ANN href "../cli/annotate-vars.html" "View annotate-vars docs" _self + click RM href "../cli/remove-unspliced-rnas.html" "View remove-unspliced-rnas docs" _self + click CALLRNA href "../cli/call-rna-vars.html" "View call-rna-vars docs" _self + click INT href "../cli/integrate-vars.html" "View integrate-vars docs" _self + click TR href "../cli/translate-structs.html" "View translate-structs docs" _self + click CPV href "../cli/call-peptide-vars.html" "View call-peptide-vars docs" _self + + classDef linked text-decoration:underline; + class CALLDNA,ANN,RM,CALLRNA,INT,TR,CPV linked +``` + +## Step 1. Align long reads + +Align tumor and normal long-read DNA to the reference genome with Minimap2, then sort and index with samtools. +Please make sure `--cs` is specified for Minimap2 as Exacto relies on the `CS` tag to identify variants: + +```bash +# Tumor +minimap2 -ax map-hifi --cs --eqx -Y -L --secondary=no \ + reference.fasta tumor_dna.fastq.gz \ + | samtools sort -o tumor_dna.sorted.bam +samtools index tumor_dna.sorted.bam + +# Normal — repeat with normal_dna.fastq.gz → normal_dna.sorted.bam +``` + +## Step 2. Identify somatic DNA variants + +Identify case-specific (somatic) variants in tumor against matched normal: + +```bash +exacto call-somatic-dna-vars \ + --bam-file tumor_dna.sorted.bam \ + --bam-bai-file tumor_dna.sorted.bam.bai \ + --fasta-file reference.fasta \ + --control-bam-files normal_dna.sorted.bam \ + --control-bam-bai-files normal_dna.sorted.bam.bai \ + --output-tsv-file tumor_specific_dna_variants.tsv +``` + +## Step 3. Annotate the somatic DNA variants + +Add gene/isoform level contexts using a GENCODE GTF: + +```bash +exacto annotate-vars \ + --tsv-file tumor_specific_dna_variants.tsv \ + --reference-gene-annotation-file gencode.gtf.gz \ + --reference-gene-annotation-source gencode \ + --reference-gene-annotation-assembly hg38 \ + --reference-gene-annotation-version v45 \ + --output-tsv-file tumor_specific_dna_variants.annotated.tsv +``` + +## Step 4. Assemble and align the tumor transcriptome + +Assemble long-read RNA with [RNA-Bloom2](https://github.com/BirolLab/RNA-Bloom), then align the assembled +contigs back to the reference genome with minimap2 and sort/index with samtools. Transcriptome assembly is necessary +because polyA-capture long-read RNA-seq commonly yields 5'-truncated reads; the assembler stitches them into full-length +transcripts. + +Assemble tumor transcripts using RNA-bloom2: +```bash +java -jar RNA-Bloom.jar \ + -long tumor_rna.fastq.gz \ + --outdir rnabloom2_outputs/ \ + -chimera [-lrpb] +``` + +Filter RNA-bloom2 transcripts using [Nexus](https://pirl-unc.github.io/nexus/utilities/filter_rnabloom2_transcripts.html): +```bash +nexus_filter_rnabloom2_transcripts \ + --assembly4-pol-fasta-file rnabloom2_outputs/rnabloom.longreads.assembly4.pol.fa \ + --assembly3-map-paf-file rnabloom2_outputs/rnabloom.longreads.assembly3.map.paf.gz \ + --output-reads-tsv-file rnabloom2_outputs/rnalboom_longreads_filtered_reads.tsv \ + --output-transcripts-tsv-file rnabloom2_outputs/rnalboom_longreads_filtered_transcripts.tsv \ + --output-fasta-file rnabloom2_outputs/rnalboom_longreads_filtered_transcripts.fasta +``` + +Align the assembled tumor transcriptome. Please make sure `--cs` is specified for Minimap2 as Exacto relies on the `CS` tag to identify variants: +```bash +minimap2 -ax splice:hq -uf --cs --eqx -Y -L --secondary=no \ + reference.fasta rnabloom2_outputs/rnalboom_longreads_filtered_transcripts.fasta \ + | samtools sort -o tumor_rna_assembly.sorted.bam +samtools index tumor_rna_assembly.sorted.bam +``` + +## Step 5. Filter unspliced RNAs + +Drop assembled transcripts that are likely unspliced RNAs. Note that `remove-unspliced-rnas` keeps transcripts +overlapping 1-exon reference transcripts: + +```bash +exacto remove-unspliced-rnas \ + --bam-file tumor_rna_assembly.sorted.bam \ + --bam-bai-file tumor_rna_assembly.sorted.bam.bai \ + --fasta-file reference.fasta \ + --reference-gene-annotation-file gencode.gtf.gz \ + --reference-gene-annotation-source gencode \ + --reference-gene-annotation-assembly hg38 \ + --reference-gene-annotation-version v44 \ + --output-bam-file tumor_rna_assembly.sorted.filtered.bam \ + --output-bam-bai-file tumor_rna_assembly.sorted.filtered.bam.bai \ + --output-fasta-file tumor_rna_assembly.sorted.filtered.fasta +``` + +## Step 6. Identify tumor RNA variants + +```bash +exacto call-rna-vars \ + --bam-file tumor_rna_assembly.sorted.filtered.bam \ + --bam-bai-file tumor_rna_assembly.sorted.filtered.bam.bai \ + --reference-genome-fasta-file hg38.fasta \ + --reference-gene-annotation-file gencode.gtf.gz \ + --reference-gene-annotation-source gencode \ + --reference-gene-annotation-assembly hg38 \ + --reference-gene-annotation-version v45 \ + --output-dir rna_variants_outputs/ \ + --output-prefix tumor +``` + +## Step 7. Integrate DNA and RNA variants + +```bash +exacto integrate-vars \ + --annotated-dna-vars-tsv-file tumor_specific_dna_variants.annotated.tsv \ + --rna-vars-tsv-file rna_variants_outputs/tumor_exacto_rna_variant_calls.tsv \ + --reference-gene-annotation-file gencode.gtf.gz \ + --reference-gene-annotation-source gencode \ + --reference-gene-annotation-assembly hg38 \ + --reference-gene-annotation-version v44 \ + --output-tsv-file tumor_dna_rna_variants_integrated.tsv +``` + +## Step 8. Translate transcripts to primary structures + +```bash +exacto translate-structs \ + --transcript-structures-tsv-file rna_variants_outputs/tumor_exacto_transcript_structures.tsv \ + --rna-variant-calls-tsv-file rna_variants_outputs/tumor_exacto_rna_variant_calls.tsv \ + --integrated-variants-tsv-file tumor_dna_rna_variants_integrated.tsv \ + --strategy longest_orf \ + --output-tsv-file tumor_primary_structures.tsv \ + --output-fasta-file tumor_primary_structures.fasta +``` + +## Step 9. Identify peptide variants + +```bash +exacto call-peptide-vars \ + --primary-structures-tsv-file tumor_primary_structures.tsv \ + --reference-fasta-file reference_proteome.fasta \ + --output-tsv-file tumor_peptide_variants.tsv \ + --output-fasta-file tumor_peptide_variants.fasta +``` + +## Outputs + +| File | Produced by | Description | +|:-----|:------------|:------------| +| `tumor_specific_dna_variants.tsv` | `call-somatic-dna-vars` | Somatic DNA variants | +| `tumor_specific_dna_variants.annotated.tsv` | `annotate-vars` | Annotated DNA variants | +| `tumor_exacto_rna_variant_calls.tsv` | `call-rna-vars` | RNA variants | +| `tumor_exacto_transcript_structures.tsv` | `call-rna-vars` | Per-transcript structural records | +| `tumor_dna_rna_variants_integrated.tsv` | `integrate-vars` | DNA + RNA variants merged | +| `tumor_primary_structures.fasta` | `translate-structs` | Mutant proteoform sequences (FASTA) | +| `tumor_peptide_variants.tsv` | `call-peptide-vars` | Mutant peptide variants | + +: {.striped .hover} diff --git a/docs/pipelines/variation-graph-construction.qmd b/docs/pipelines/variation-graph-construction.qmd new file mode 100644 index 0000000..767c18a --- /dev/null +++ b/docs/pipelines/variation-graph-construction.qmd @@ -0,0 +1,54 @@ +--- +title: "Variation Graph Construction" +description: "Build individualized genome and transcriptome variation graphs from Exacto variant calls." +--- + +This pipeline produces individualized genome and transcriptome variation graphs that encode an individual's variants +alongside the reference sequence. These graphs are useful for downstream variant-aware analyses that benefit from a +graph reference instead of a linear one. + +## Workflow + +```{mermaid} +%%{init: {'securityLevel': 'loose'}}%% +flowchart LR + INTV[/"DNA variants TSV"/] --> BGV(build‑genome‑var‑graph) + REFG[("Reference genome FASTA")] --> BGV + BGV --> GG[/"Genome variation graph"/] + + PRIMS[/"Transcript structures TSV"/] --> BTV(build‑transcriptome‑var‑graph) + REFT[("Reference transcriptome FASTA")] --> BTV + BTV --> TG[/"Transcriptome variation graph"/] + + click BGV href "../cli/build-genome-var-graph.html" "View build-genome-var-graph docs" _self + click BTV href "../cli/build-transcriptome-var-graph.html" "View build-transcriptome-var-graph docs" _self + + classDef linked text-decoration:underline; + class BGV,BTV linked +``` + +DNA variants TSV can be obtained by running [`call-germline-dna-vars`](../cli/call-germline-dna-vars.qmd) or [`call-somatic-dna-vars`](../cli/call-somatic-dna-vars.qmd). + +Transcript structures TSV can be obtained by running [`call-rna-vars`](../cli/call-rna-vars.qmd). + +## Genome variation graph + +Add germline and/or somatic DNA variants to a reference genome to produce a individualized genome graph: + +```bash +exacto build-genome-var-graph \ + --variants-tsv-file dna_variants.tsv \ + --fasta-file reference_genome.fasta \ + --output-dir genome_var_graph_outputs/ +``` + +## Transcriptome variation graph + +Add RNA variants to a reference transcriptome to produce a individualized transcriptome graph: + +```bash +exacto build-transcriptome-var-graph \ + --transcript-structures-tsv-file transcript_structures.tsv \ + --fasta-file reference_transcriptome.fasta \ + --output-fasta-file transcriptome_var_graph.fasta +```