-
Notifications
You must be signed in to change notification settings - Fork 48
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
little code cleaning (pep8 and pylint disagreeing). adding wiki freeze. help test update
- Loading branch information
Showing
22 changed files
with
2,148 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
# Citing Truvari | ||
|
||
English, A.C., Menon, V.K., Gibbs, R.A. et al. Truvari: refined structural variant comparison preserves allelic diversity. Genome Biol 23, 271 (2022). https://doi.org/10.1186/s13059-022-02840-6 | ||
|
||
# Citations | ||
|
||
List of publications using Truvari. Most of these are just pulled from a [Google Scholar Search](https://scholar.google.com/scholar?q=truvari). Please post in the [show-and-tell](https://github.com/spiralgenetics/truvari/discussions/categories/show-and-tell) to have your publication added to the list. | ||
* [A robust benchmark for detection of germline large deletions and insertions](https://www.nature.com/articles/s41587-020-0538-8) | ||
* [Leveraging a WGS compression and indexing format with dynamic graph references to call structural variants](https://www.biorxiv.org/content/10.1101/2020.04.24.060202v1.abstract) | ||
* [Duphold: scalable, depth-based annotation and curation of high-confidence structural variant calls](https://academic.oup.com/gigascience/article/8/4/giz040/5477467?login=true) | ||
* [Parliament2: Accurate structural variant calling at scale](https://academic.oup.com/gigascience/article/9/12/giaa145/6042728) | ||
* [Learning What a Good Structural Variant Looks Like](https://www.biorxiv.org/content/10.1101/2020.05.22.111260v1.full) | ||
* [Long-read trio sequencing of individuals with unsolved intellectual disability](https://www.nature.com/articles/s41431-020-00770-0) | ||
* [lra: A long read aligner for sequences and contigs](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1009078) | ||
* [Samplot: a platform for structural variant visual validation and automated filtering](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-021-02380-5) | ||
* [AsmMix: A pipeline for high quality diploid de novo assembly](https://www.biorxiv.org/content/10.1101/2021.01.15.426893v1.abstract) | ||
* [Accurate chromosome-scale haplotype-resolved assembly of human genomes](https://www.nature.com/articles/s41587-020-0711-0) | ||
* [Accurate circular consensus long-read sequencing improves variant detection and assembly of a human genome](https://www.nature.com/articles/s41587-019-0217-9) | ||
* [NPSV: A simulation-driven approach to genotyping structural variants in whole-genome sequencing data](https://academic.oup.com/bioinformatics/article-abstract/37/11/1497/5466452) | ||
* [SVIM-asm: structural variant detection from haploid and diploid genome assemblies](https://academic.oup.com/bioinformatics/article/36/22-23/5519/6042701?login=true) | ||
* [Readfish enables targeted nanopore sequencing of gigabase-sized genomes](https://www.nature.com/articles/s41587-020-00746-x) | ||
* [stLFRsv: A Germline Structural Variant Analysis Pipeline Using Co-barcoded Reads](https://internal-journal.frontiersin.org/articles/10.3389/fgene.2021.636239/full) | ||
* [Long-read-based human genomic structural variation detection with cuteSV](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-020-02107-y) | ||
* [An international virtual hackathon to build tools for the analysis of structural variants within species ranging from coronaviruses to vertebrates](https://f1000research.com/articles/10-246) | ||
* [Paragraph: a graph-based structural variant genotyper for short-read sequence data](https://link.springer.com/article/10.1186/s13059-019-1909-7) | ||
* [Genome-wide investigation identifies a rare copy-number variant burden associated with human spina bifida](https://www.nature.com/articles/s41436-021-01126-9) | ||
* [TT-Mars: Structural Variants Assessment Based on Haplotype-resolved Assemblies](https://www.biorxiv.org/content/10.1101/2021.09.27.462044v1.abstract) | ||
* [An ensemble deep learning framework to refine large deletions in linked-reads](https://www.biorxiv.org/content/10.1101/2021.09.27.462057v1.abstract) | ||
* [MAMnet: detecting and genotyping deletions and insertions based on long reads and a deep learning approach](https://academic.oup.com/bib/advance-article-abstract/doi/10.1093/bib/bbac195/6587170)](https://academic.oup.com/bib/advance-article-abstract/doi/10.1093/bib/bbac195/6587170) | ||
* [Automated filtering of genome-wide large deletions through an ensemble deep learning framework](https://www.sciencedirect.com/science/article/pii/S1046202322001712#b0110) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
A frequent application of comparing SVs is to perform a 'bakeoff' of performance | ||
between two SV programs against a single set of base calls. | ||
|
||
Beyond looking at the Truvari results/report, you may like to investigate what calls | ||
are different between the programs. | ||
|
||
Below is a set of scripts that may help you generate those results. For our examples, | ||
we'll be comparing arbitrary programs Asvs and Bsvs aginst base calls Gsvs. | ||
|
||
*_Note_* - This assumes that each record in Gsvs has a unique ID in the vcf. | ||
|
||
Generate the Truvari report for Asvs and Bsvs | ||
============================================= | ||
|
||
```bash | ||
truvari bench -b Gsvs.vcf.gz -c Asvs.vcf.gz -o cmp_A/ ... | ||
truvari bench -b Gsvs.vcf.gz -c Bsvs.vcf.gz -o cmp_B/ ... | ||
``` | ||
Consistency | ||
=========== | ||
The simplest way to compare the programs is to get the intersection of TPbase calls from the two reports. | ||
```bash | ||
truvari consistency cmp_A/tp-base.vcf cmp_B/tp-base.vcf | ||
``` | ||
See [[consistency wiki|consistency]] for details on the report created. | ||
|
||
Below are older notes to manually create a similar report to what one can make using `truvari consistency` | ||
|
||
Combine the TPs within each report | ||
================================== | ||
|
||
```bash | ||
cd cmp_A/ | ||
paste <(grep -v "#" tp-base.vcf) <(grep -v "#" tp-comp.vcf) > combined_tps.txt | ||
cd ../cmp_B/ | ||
paste <(grep -v "#" tp-base.vcf) <(grep -v "#" tp-comp.vcf) > combined_tps.txt | ||
``` | ||
|
||
Grab the FNs missed by only one program | ||
======================================= | ||
|
||
```bash | ||
(grep -v "#" cmp_A/fn.vcf && grep -v "#" cmp_B/fn.vcf) | cut -f3 | sort | uniq -c | grep "^ *1 " | cut -f2- -d1 > missed_names.txt | ||
``` | ||
|
||
Pull the TP sets' difference | ||
============================ | ||
|
||
```bash | ||
cat missed_names.txt | xargs -I {} grep -w {} cmp_A/combined_tps.txt > missed_by_B.txt | ||
cat missed_names.txt | xargs -I {} grep -w {} cmp_B/combined_tps.txt > missed_by_A.txt | ||
``` | ||
|
||
To look at the base-calls that Bsvs found, but Asvs didn't, run `cut -f1-12 missed_by_A.txt`. | ||
|
||
To look at the Asvs that Bsvs didn't find, run `cut -f13- missed_by_B.txt`. | ||
|
||
Shared FPs between the programs | ||
=============================== | ||
|
||
All of the work above has been about how to analyze the TruePositives. If you'd like to see which calls are shared between Asvs and Bsvs that aren't in Gsvs, simply run Truvari again. | ||
|
||
```bash | ||
bgzip cmp_A/fp.vcf && tabix -p vcf cmp_A/fp.vcf.gz | ||
bgzip cmp_B/fp.vcf && tabix -p vcf cmp_B/fp.vcf.gz | ||
truvari bench -b cmp_A/fp.vcf.gz -c cmp_B/fp.vcf.gz -o shared_fps ... | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
# Truvari API | ||
Many of the helper methods/objects are documented such that developers can reuse truvari in their own code. To see developer documentation, visit [readthedocs](https://truvari.readthedocs.io/en/latest/). | ||
|
||
Documentation can also be seen using | ||
```python | ||
import truvari | ||
help(truvari) | ||
``` | ||
|
||
# docker | ||
|
||
A Dockerfile exists to build an image of Truvari. To make a Docker image, clone the repository and run | ||
```bash | ||
docker build -t truvari . | ||
``` | ||
|
||
You can then run Truvari through docker using | ||
```bash | ||
docker run -v `pwd`:/data -it truvari | ||
``` | ||
Where `pwd` can be whatever directory you'd like to mount in the docker to the path `/data/`, which is the working directory for the Truvari run. You can provide parameters directly to the entry point. | ||
```bash | ||
docker run -v `pwd`:/data -it truvari anno svinfo -i example.vcf.gz | ||
``` | ||
|
||
If you'd like to interact within the docker container for things like running the CI/CD scripts | ||
```bash | ||
docker run -v `pwd`:/data --entrypoint /bin/bash -it truvari | ||
``` | ||
You'll now be inside the container and can run FuncTests or run Truvari directly | ||
```bash | ||
bash repo_utils/truvari_ssshtests.sh | ||
truvari anno svinfo -i example.vcf.gz | ||
``` | ||
|
||
# CI/CD | ||
|
||
Scripts that help ensure the tool's quality. Extra dependencies need to be installed in order to run Truvari's CI/CD scripts. | ||
|
||
```bash | ||
pip install pylint anybadge coverage | ||
``` | ||
|
||
Check code formatting with | ||
```bash | ||
python repo_utils/pylint_maker.py | ||
``` | ||
We use [autopep8](https://pypi.org/project/autopep8/) (via [vim-autopep8](https://github.com/tell-k/vim-autopep8)) for formatting. | ||
|
||
Test the code and generate a coverage report with | ||
```bash | ||
bash repo_utils/truvari_ssshtests.sh | ||
``` | ||
|
||
Truvari leverages github actions to perform these checks when new code is pushed to the repository. We've noticed that the actions sometimes hangs through no fault of the code. If this happens, cancel and resubmit the job. Once FuncTests are successful, it uploads an artifact of the `coverage html` report which you can download to see a line-by-line accounting of test coverage. | ||
|
||
# git flow | ||
|
||
To organize the commits for the repository, we use [git-flow](https://danielkummer.github.io/git-flow-cheatsheet/). Therefore, `develop` is the default branch, the latest tagged release is on `master`, and new, in-development features are within `feature/<name>` | ||
|
||
When contributing to the code, be sure you're working off of develop and have run `git flow init`. | ||
|
||
# versioning | ||
|
||
Truvari uses [Semantic Versioning](https://semver.org/) and tries to stay compliant to [PEP440](https://peps.python.org/pep-0440/). As of v3.0.0, a single version is kept in the code under `truvari/__init__.__version__`. We try to keep the suffix `-dev` on the version in the develop branch. When cutting a new release, we may replace the suffix with `-rc` if we've built a release candidate that may need more testing/development. Once we've committed to a full release that will be pushed to PyPi, no suffix is placed on the version. If you install Truvari from the develop branch, the git repo hash is appended to the installed version as well as '.uc' if there are un-staged commits in the repo. | ||
|
||
# docs | ||
|
||
The github wiki serves the documentation most relevant to the `develop/` branch. When cutting a new release, we freeze and version the wiki's documentation with the helper utility `docs/freeze_wiki.sh`. | ||
|
||
# Creating a release | ||
Follow these steps to create a release | ||
|
||
0) Bump release version | ||
1) Run tests locally | ||
2) Update API Docs | ||
3) Change Updates Wiki | ||
4) Freeze the Wiki | ||
5) Ensure all code is checked in | ||
6) Do a [git-flow release](https://danielkummer.github.io/git-flow-cheatsheet/) | ||
7) Use github action to make a testpypi release | ||
8) Check test release | ||
```bash | ||
python3 -m venv test_truvari | ||
python3 -m pip install --index-url https://test.pypi.org/simple --extra-index-url https://pypi.org/simple/ truvari | ||
``` | ||
9) Use GitHub action to make a pypi release | ||
10) Download release-tarball.zip from step #9’s action | ||
11) Create release (include #9) from the tag | ||
12) Checkout develop and Bump to dev version and README ‘commits since’ badge |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
By default, Truvari uses [edlib](https://github.com/Martinsos/edlib) to calculate the edit distance between two SV calls. Optionally, the [Levenshtein edit distance ratio](https://en.wikipedia.org/wiki/Levenshtein_distance) can be used to compute the `--pctsim` between two variants. These measures are different than the sequence similarity calculated by [Smith-Waterman alignment](https://en.wikipedia.org/wiki/Smith%E2%80%93Waterman_algorithm). | ||
|
||
To show this difference, consider the following two sequences.: | ||
|
||
``` | ||
AGATACAGGAGTACGAACAGTACAGTACGA | ||
|||||||||||||||*|||||||||||||| | ||
ATCACAGATACAGGAGTACGTACAGTACAGTACGA | ||
30bp Aligned | ||
1bp Mismatched (96% similarity) | ||
5bp Left-Trimmed (~14% of the bottom sequence) | ||
``` | ||
|
||
The code below runs swalign, Levenshtein, and edlib to compute the `--pctsim` between the two sequences. | ||
|
||
|
||
```python | ||
import swalign | ||
import Levenshtein | ||
import edlib | ||
|
||
seq1 = "AGATACAGGAGTACGAACAGTACAGTACGA" | ||
seq2 = "ATCACAGATACAGGAGTACGTACAGTACAGTACGA" | ||
|
||
scoring = swalign.NucleotideScoringMatrix(2, -1) | ||
alner = swalign.LocalAlignment(scoring, gap_penalty=-2, gap_extension_decay=0.5) | ||
aln = alner.align(seq1, seq2) | ||
mat_tot = aln.matches | ||
mis_tot = aln.mismatches | ||
denom = float(mis_tot + mat_tot) | ||
if denom == 0: | ||
ident = 0 | ||
else: | ||
ident = mat_tot / denom | ||
scr = edlib.align(seq1, seq2) | ||
totlen = len(seq1) + len(seq2) | ||
|
||
print('swalign', ident) | ||
# swalign 0.966666666667 | ||
print('levedit', Levenshtein.ratio(seq1, seq2)) | ||
# levedit 0.892307692308 | ||
print('edlib', (totlen - scr["editDistance"]) / totlen) | ||
# edlib 0.9076923076923077 | ||
``` | ||
|
||
Because the swalign procedure only considers the number of matches and mismatches, the `--pctsim` is higher than the edlib and Levenshtein ratio. | ||
|
||
If we were to account for the 5 'trimmed' bases from the Smith-Waterman alignment when calculating the `--pctsim` by counting each trimmed base as a mismatch, we would see the similarity drop to ~83%. | ||
|
||
[This post](https://stackoverflow.com/questions/14260126/how-python-levenshtein-ratio-is-computed) has a nice response describing exactly how the Levenshtein ratio is computed. | ||
|
||
The Smith-Waterman alignment is much more expensive to compute compared to the Levenshtein ratio, and does not account for 'trimmed' sequence difference. | ||
|
||
However, edlib is the fastest comparison method and is used by default. Levenshtein can be specified with `--use-lev` in `bench` and `collapse`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
The wiki holds documentation most relevant for develop. For information on a specific version of Truvari, see [`docs/`](https://github.com/spiralgenetics/truvari/tree/develop/docs) | ||
|
||
Citation: | ||
English, A.C., Menon, V.K., Gibbs, R.A. et al. Truvari: refined structural variant comparison preserves allelic diversity. Genome Biol 23, 271 (2022). https://doi.org/10.1186/s13059-022-02840-6 | ||
|
||
# Before you start | ||
VCFs aren't always created with a strong adherence to the format's specification. | ||
|
||
Truvari expects input VCFs to be valid so that it will only output valid VCFs. | ||
|
||
We've developed a separate tool that runs multiple validation programs and standard VCF parsing libraries in order to validate a VCF. | ||
|
||
Run [this program](https://github.com/acenglish/usable_vcf) over any VCFs that are giving Truvari trouble. | ||
|
||
Furthermore, Truvari expects 'resolved' SVs (e.g. DEL/INS) and will not interpret BND signals across SVTYPEs (e.g. combining two BND lines to match a DEL call). A brief description of Truvari bench methodology is linked below. | ||
|
||
Finally, Truvari does not handle multi-allelic VCF entries and as of v4.0 will throw an error if multi-allelics are encountered. Please use `bcftools norm` to split multi-allelic entries. | ||
|
||
# Index | ||
|
||
- [[Updates|Updates]] | ||
- [[Installation|Installation]] | ||
- Truvari Commands: | ||
- [[anno|anno]] | ||
- [[bench|bench]] | ||
- [[collapse|collapse]] | ||
- [[consistency|consistency]] | ||
- [[divide|divide]] | ||
- [[phab|phab]] | ||
- [[refine|refine]] | ||
- [[segment|segment]] | ||
- [[stratify|stratify]] | ||
- [[vcf2df|vcf2df]] | ||
- [[Development|Development]] | ||
- [[Citations|Citations]] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
Recommended | ||
=========== | ||
For stable versions of Truvari, use pip | ||
``` | ||
python3 -m pip install truvari | ||
``` | ||
Specific versions can be installed via | ||
``` | ||
python3 -m pip install truvari==3.2.0 | ||
``` | ||
See [pypi](https://pypi.org/project/Truvari/#history) for a history of all distributed releases. | ||
|
||
Manual Installation | ||
=================== | ||
To build Truvari directly, clone the repository and switch to a specific tag. | ||
``` | ||
git clone https://github.com/spiralgenetics/truvari.git | ||
git checkout tags/v3.0.0 | ||
python3 -m pip install . | ||
``` | ||
|
||
To see a list of all available tags, run: | ||
``` | ||
git tag -l | ||
``` | ||
|
||
If you have an older clone of the repository and don't see the version you're looking for in tags, make sure to pull the latest changes: | ||
``` | ||
git pull | ||
git fetch --all --tags | ||
``` | ||
|
||
Mamba / Conda | ||
============= | ||
NOTE!! There is a very old version of Truvari on bioconda that - for unknown reasons - supersedes the newer, supported versions. Users may need to specify to conda which release to build. See [this ticket](https://github.com/ACEnglish/truvari/issues/130#issuecomment-1196607866) for details. | ||
|
||
Truvari releases are automatically deployed to bioconda. | ||
Users can follow instructions here (https://mamba.readthedocs.io/en/latest/installation.html) to install mamba. (A faster alternative conda compatible package manager.) | ||
|
||
Creating an environment with Truvari and its dependencies. | ||
``` | ||
mamba create -c conda-forge -c bioconda -n truvari truvari | ||
``` | ||
|
||
Alternatively, see the [conda page](https://anaconda.org/bioconda/truvari) for details | ||
``` | ||
conda install -c bioconda truvari | ||
``` | ||
|
||
Building from develop | ||
===================== | ||
The default branch is `develop`, which holds in-development changes. This is for developers or those wishing to try experimental features and is not recommended for production. Development is versioned higher than the most recent stable release with an added suffix (e.g. Current stable release is `3.0.0`, develop holds `3.1.0-dev`). If you'd like to install develop, repeat the steps above but without `git checkout tags/v3.0.0`. See [wiki](https://github.com/spiralgenetics/truvari/wiki/Development#git-flow) for details on how branching is handled. | ||
|
||
Docker | ||
====== | ||
See [Development](https://github.com/spiralgenetics/truvari/wiki/Development#docker) for details on building a docker container. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
MatchIds are used to tie base/comparison calls together in post-processing for debugging or other exploring. MatchIds are in `bench` and `collapse` outputs. In the `collapse` main output, the field is named 'CollapseId'. | ||
|
||
MatchIds have a structure of `{chunkid}.{baseid}.{compid}`. | ||
|
||
Where: | ||
- chunkid - Unique id per-chunk of calls. All calls sharing chunkid were within `--chunksize` distance and were | ||
compared. | ||
- baseid - The number of the base call from this chunk | ||
- compid - The number of the comp call from this chunk | ||
|
||
Doing basic pairing with MatchIds when results didn't use `--pick multi` is straight forward. For example, to tie tp-base.vcf and tp-comp.vcf calls together, they will have identical MatchIds. | ||
|
||
MatchIds with `_` for the baseid or compid are calls that were in a chunk without a counterpart (e.g. `5._.0` is the | ||
first comparison call from the fifth chunk, which had no base calls.) | ||
|
||
When using `--pick multi` there can be instances such as: | ||
``` | ||
VCF MatchId | ||
tp-base 3.0.0 | ||
tp-comp 3.0.0 | ||
tp-comp 3.0.1 | ||
``` | ||
Here, the 0th base/comp call match to one another. Additionally, the 1st comp call `3.0.1` also matches to the 0th base call `tp-base 3.0.0`. | ||
|
||
This makes tieing false positives/negatives to their closest matching counter part a little tricker. | ||
For example, if we have a false negative with MatchId `3.1.0`, we'll need to look in both the `fp.vcf` and `tp-comp.vcf` for | ||
`3.*.0`. This search will find the 0th comp call in the third chunk which may have matched to a different baseid than 1. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
Truvari only compares the first alternate allele in VCFs. If a VCF contains multi-allelic sites such as: | ||
|
||
``` | ||
chr2 1948201 . T TACAACACGTACGATCAGTAGAC,TCAACACACAACACGTACGATCAGTAGAC .... | ||
``` | ||
|
||
Then pre-process the VCFs with bcftools: | ||
|
||
```bash | ||
bcftools norm -m-any base_calls.vcf.gz | bgzip > base_calls_split.vcf.gz | ||
``` |
Oops, something went wrong.