From dab10622ee90c084aacd734d7541c6908504419d Mon Sep 17 00:00:00 2001 From: Zachary Nolen Date: Tue, 11 Feb 2025 17:16:12 +0100 Subject: [PATCH 1/3] Add documentation on extending PopGLen Adds a small example case of how to replace a tool in PopGLen with another, which also is how one can extend and add rules to continue the workflow. --- docs/extending-workflows.md | 117 ++++++++++++++++++++++++++++++++++++ docs/images/pca-docov.png | Bin 0 -> 65457 bytes docs/index.md | 7 ++- mkdocs.yml | 1 + 4 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 docs/extending-workflows.md create mode 100644 docs/images/pca-docov.png diff --git a/docs/extending-workflows.md b/docs/extending-workflows.md new file mode 100644 index 0000000..567a799 --- /dev/null +++ b/docs/extending-workflows.md @@ -0,0 +1,117 @@ +# Extending or modifying analyses in PopGLen + +Using PopGLen as a Snakemake module makes it easy to incorporate extensions to +it in the Snakefile, enabling cusomization of the workflow. This means that you +can extend upon the workflow with your own rules that use PopGLen outputs as +their input, keeping the project as one contained workflow that can be easily +reproduced. This functionality could also allow for replacement of some of +PopGLen's analyses with alternative options, such as estimating the covariance +matrix for PCA with single read sampling in ANGSD rather than the likelihood +based approach of PCAngsd. Most of this is covered in Snakemake's documentation +on [modularization](https://snakemake.readthedocs.io/en/stable/snakefiles/modularization.html), +and all methods described there should be compatible with PopGLen. + +As an example, we will replace the PCA produced using PCAngsd in PopGLen +with one produced using a covariance matrix from single read sampling using +ANGSD. This should only really add one step, estimating the covariance matrix +in ANGSD instead of PCAngsd. We start with a bare bones Snakefile that imports +PopGLen as a module: + +```py title="workflow/Snakefile" linenums="1"from snakemake.utils import min_version + + +min_version("6.10.0") + + +configfile: "config/config.yaml" + + +# declare https://github.com/zjnolen/PopGLen as a module +module popglen: + snakefile: + github("zjnolen/PopGLen", path="workflow/Snakefile", tag="v0.4.1") + config: + config + + +# use all rules from https://github.com/zjnolen/PopGLen +use rule * from popglen +``` + +As is, it will run PopGLen as described in the documentation. To utilize a +covariance matrix estimated by something other than PCAngsd when generating the +PCA, we need to do two things: (1) add a rule to generate the covariance matrix +with the other tool and (2) overwrite the input for the rule that runs the +principal component analysis with this new covariance matrix. + +We will do this by adding the code block below to the end of the Snakefile. It +first defines a rule, `angsd_doCov`, which generates the covariance matrix. This +is very similar to the `angsd_doIBS` rule already in PopGLen, so much of that +rule can be repurposed into this one. After we add the rule, we then simply +tell Snakemake that when it imports the rule `plot_pca` from PopGLen, it +should use this covariance matrix made by `angsd_doCov` instead of the one from +PCAngsd defined by default. + +```py title="workflow/Snakefile linenums="21" +# Add a rule which estimates the covariance matrix, but from single read +# sampling in ANGSD rather than genotype likelihoods in PCAngsd + + +rule angsd_doCov: + """ + Estimates covariance matrix for all individuals. + """ + input: + bamlist="results/datasets/{dataset}/bamlists/{dataset}.{ref}_{population}{dp}.bamlist", + bams=popglen.get_bamlist_bams, + bais=popglen.get_bamlist_bais, + sites="results/datasets/{dataset}/filters/snps/{dataset}.{ref}_{population}{dp}_{sites}-filts_snps.sites", + idx="results/datasets/{dataset}/filters/snps/{dataset}.{ref}_{population}{dp}_{sites}-filts_snps.sites.idx", + output: + ibs=temp("results/datasets/{dataset}/analyses/covar/{dataset}.{ref}_{population}{dp}_{sites}-filts.ibs.gz"), + covmat="results/datasets/{dataset}/analyses/covar/{dataset}.{ref}_{population}{dp}_{sites}-filts.covMat", + arg="results/datasets/{dataset}/analyses/covar/{dataset}.{ref}_{population}{dp}_{sites}-filts.arg", + container: + popglen.angsd_container + params: + mapQ=config["mapQ"], + baseQ=config["baseQ"], + trans=popglen.get_trans, + out=lambda w, output: os.path.splitext(output.arg)[0], + threads: 2 + resources: + runtime="1d", + shell: + """ + angsd -doIBS 1 -doCov 1 -bam {input.bamlist} -nThreads {threads} \ + -doCounts 1 -minMapQ {params.mapQ} -minQ {params.baseQ} \ + -sites {input.sites} -rmTrans {params.trans} -doMajorMinor 3 \ + -out {params.out} + """ + + +# Update plot_pca rule to use the covariance matrix from angsd_doCov rather than +# from PCAngsd + + +use rule plot_pca from popglen as plot_pca with: + input: + "results/datasets/{dataset}/analyses/covar/{dataset}.{ref}_{population}{dp}_{sites}-filts.covMat", + "results/datasets/{dataset}/poplists/{dataset}_{population}{dp}.indiv.list", + +``` + +For a substitution like this, this is the only changes we need to make. +You can try running this Snakefile using the [tutorial](tutorial.md) data to see +it in action. These two methods actually produce quite similar results with the +tutorial dataset: + +| PCAngsd covariance matrix | ANGSD doCov covariance matrix | +|---------------------------|-------------------------------| +|![pcangsd pca](images/pca-norel.png)|![docov pca](images/pca-docov.png)| + +Extending workflows like this allows you to use PopGLen as a base for your +project, adding additional analyses as you need them. If you have an analysis +(or alternative tool for an analysis) that you feel suits PopGLen (i.e. is +suited for low-coverage population genomics), but is not yet implemented, please +feel free to open an issue and request its addition. diff --git a/docs/images/pca-docov.png b/docs/images/pca-docov.png new file mode 100644 index 0000000000000000000000000000000000000000..5f6cff2188ae3e61df4b1bc2d826f7f3045b5e20 GIT binary patch literal 65457 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 LWQ4N>wLJe1mZPk| literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index c60cfb5..6cfec5f 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,7 +24,8 @@ detailed [configuration](config.md) summary, a [tutorial](tutorial.md) to walk users through running all analyses in the pipeline, as well as more specialized documentation describing how to [configure the pipeline to run on a HPC cluster](cluster-execution.md), how to -[modify the requested resources for jobs](resources.md), and the +[modify the requested resources for jobs](resources.md), how to +[extend the workflow with additional rules](extending-workflow.md), and the [file paths for all major output files](outfile-summ.md) for reference. ??? question "Questions? Feature requests? Just ask!" @@ -174,7 +175,7 @@ low-depth sequencing data. Molecular Ecology, 28(1), 35–48. ANGSD: Korneliussen, T. S., Albrechtsen, A., & Nielsen, R. (2014). ANGSD: Analysis of Next Generation Sequencing Data. BMC Bioinformatics, 15(1), Article -1. (Depth calculation, genotype +\1. (Depth calculation, genotype likelihood estimation, SNP calling, allele frequencies, SFS, diverity and neutrality statistics, heterozygosity, $F_{ST}$) @@ -201,4 +202,4 @@ per-base mappability scores) BEDTools: Quinlan, A. R. & Hall, I. M. (2010). BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics, 26(6), 841-842. (Transforming and intersecting -filter files) \ No newline at end of file +filter files) diff --git a/mkdocs.yml b/mkdocs.yml index 497b6d8..7446077 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -7,6 +7,7 @@ nav: - Tutorial: tutorial.md - Cluster execution: cluster-execution.md - Setting job resources: resources.md + - Extending PopGLen: extending-workflows.md - Output file path overview: outfile-summ.md theme: name: material From 25a02b060794e91a18bb484051b6f3cbde30d1bf Mon Sep 17 00:00:00 2001 From: Zachary Nolen Date: Tue, 11 Feb 2025 17:25:51 +0100 Subject: [PATCH 2/3] Doc formatting fixes --- docs/extending-workflows.md | 10 ++++++---- docs/index.md | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/extending-workflows.md b/docs/extending-workflows.md index 567a799..ef5b413 100644 --- a/docs/extending-workflows.md +++ b/docs/extending-workflows.md @@ -17,7 +17,8 @@ ANGSD. This should only really add one step, estimating the covariance matrix in ANGSD instead of PCAngsd. We start with a bare bones Snakefile that imports PopGLen as a module: -```py title="workflow/Snakefile" linenums="1"from snakemake.utils import min_version +```py title="workflow/Snakefile" linenums="1" +from snakemake.utils import min_version min_version("6.10.0") @@ -101,13 +102,14 @@ use rule plot_pca from popglen as plot_pca with: ``` -For a substitution like this, this is the only changes we need to make. +For a substitution like this, these are the only changes we need to make. You can try running this Snakefile using the [tutorial](tutorial.md) data to see it in action. These two methods actually produce quite similar results with the -tutorial dataset: +tutorial dataset (though the axis of PC2 is inverted, as its direction is +arbitrary): | PCAngsd covariance matrix | ANGSD doCov covariance matrix | -|---------------------------|-------------------------------| +|------------------------------------|------------------------------------| |![pcangsd pca](images/pca-norel.png)|![docov pca](images/pca-docov.png)| Extending workflows like this allows you to use PopGLen as a base for your diff --git a/docs/index.md b/docs/index.md index 6cfec5f..bd47741 100644 --- a/docs/index.md +++ b/docs/index.md @@ -25,7 +25,7 @@ users through running all analyses in the pipeline, as well as more specialized documentation describing how to [configure the pipeline to run on a HPC cluster](cluster-execution.md), how to [modify the requested resources for jobs](resources.md), how to -[extend the workflow with additional rules](extending-workflow.md), and the +[extend the workflow with additional rules](extending-workflows.md), and the [file paths for all major output files](outfile-summ.md) for reference. ??? question "Questions? Feature requests? Just ask!" From e41118edadce5c0e894b6b36047a341b6da0858c Mon Sep 17 00:00:00 2001 From: Zachary Nolen Date: Tue, 11 Feb 2025 17:29:34 +0100 Subject: [PATCH 3/3] Try to fix docs table width --- docs/extending-workflows.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/extending-workflows.md b/docs/extending-workflows.md index ef5b413..66d7ec3 100644 --- a/docs/extending-workflows.md +++ b/docs/extending-workflows.md @@ -108,8 +108,8 @@ it in action. These two methods actually produce quite similar results with the tutorial dataset (though the axis of PC2 is inverted, as its direction is arbitrary): -| PCAngsd covariance matrix | ANGSD doCov covariance matrix | -|------------------------------------|------------------------------------| +| PCAngsd covariance matrix | ANGSD -doCov covar matrix | +|---------------------------|---------------------------| |![pcangsd pca](images/pca-norel.png)|![docov pca](images/pca-docov.png)| Extending workflows like this allows you to use PopGLen as a base for your