From 4a2a0f48bbaf6e3b7415581b67ff9f99bbdad40c Mon Sep 17 00:00:00 2001 From: DamienGnst Date: Fri, 30 Aug 2024 11:31:30 -0400 Subject: [PATCH] feat: CLIN-2947 Add optional exomiser process and tools parameter This commit introduces the exomiser tool in the pipeline. Additionally, it introduces a new parameter called `tools`, which allows users to specify whether VEP, Exomiser, or both should be executed. Other changes: - Group vep output files (i.e. vcf + .tbi files) in subfolder `vep`. - Improve documentation (README, OUTPUT, USAGE, REFERENCE_DATA). - Refactor postprocessing workflow to use `def` for local variables and standardize variable names. - Update GitHub CI nf-test command: remove local tag constraint and activate CI mode. - Replace workflow diagram in README. --- .github/PULL_REQUEST_TEMPLATE.md | 1 + .github/workflows/ci-nf-test.yml | 4 +- .nf-core.yml | 4 + CHANGELOG.md | 2 + README.md | 110 +- assets/PostProcessingImage.png | Bin 47886 -> 0 bytes assets/TestSampleSheet.csv | 7 +- .../default_exomiser_WES_analysis.yml | 64 + .../default_exomiser_WGS_analysis.yml | 55 + assets/exomiser/pheno/family1.yml | 30 + assets/exomiser/pheno/family2.yml | 26 + assets/exomiser/test_exomiser_analysis.yml | 32 + assets/schema_input.json | 8 + conf/modules.config | 21 +- conf/test.config | 14 + docs/README.md | 2 + docs/images/ferlab_workflow.png | Bin 0 -> 115541 bytes docs/images/ferlab_workflow.svg | 1967 +++++++++++++++++ docs/output.md | 9 +- docs/reference_data.md | 110 + docs/usage.md | 209 +- main.nf | 3 - modules/local/exomiser/main.nf | 86 + modules/local/exomiser/meta.yml | 104 + modules/local/exomiser/tests/main.nf.test | 70 + .../local/exomiser/tests/main.nf.test.snap | 14 + modules/local/vep.nf | 4 - nextflow.config | 13 +- nextflow_schema.json | 180 +- .../main.nf | 6 + ...ls.function.isExomiserToolIncluded.nf.test | 80 + .../utils.function.isToolIncluded.nf.test | 105 + .../utils.function.isVepToolIncluded.nf.test | 80 + .../utils.nf | 11 + workflows/postprocessing.nf | 103 +- 35 files changed, 3287 insertions(+), 247 deletions(-) delete mode 100644 assets/PostProcessingImage.png create mode 100644 assets/exomiser/default_exomiser_WES_analysis.yml create mode 100644 assets/exomiser/default_exomiser_WGS_analysis.yml create mode 100644 assets/exomiser/pheno/family1.yml create mode 100644 assets/exomiser/pheno/family2.yml create mode 100644 assets/exomiser/test_exomiser_analysis.yml create mode 100644 docs/images/ferlab_workflow.png create mode 100644 docs/images/ferlab_workflow.svg create mode 100644 docs/reference_data.md create mode 100644 modules/local/exomiser/main.nf create mode 100644 modules/local/exomiser/meta.yml create mode 100644 modules/local/exomiser/tests/main.nf.test create mode 100644 modules/local/exomiser/tests/main.nf.test.snap create mode 100644 subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isExomiserToolIncluded.nf.test create mode 100644 subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isToolIncluded.nf.test create mode 100644 subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isVepToolIncluded.nf.test create mode 100644 subworkflows/local/utils_nfcore_postprocessing_pipeline/utils.nf diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 03cc340..d6d687d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -20,5 +20,6 @@ These are the most common things requested on pull requests (PRs). - [ ] Check for unexpected warnings in debug mode (`nextflow run . -profile debug,test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. +- [ ] Reference Data Documentation in `docs/reference_data.md` is updated. - [ ] `CHANGELOG.md` is updated. - [ ] `README.md` is updated (including new tool citations and authors/contributors). diff --git a/.github/workflows/ci-nf-test.yml b/.github/workflows/ci-nf-test.yml index b7bef8d..5b6625a 100644 --- a/.github/workflows/ci-nf-test.yml +++ b/.github/workflows/ci-nf-test.yml @@ -38,12 +38,10 @@ jobs: - name: Run nf-test run: | nf-test test \ - --tag=local \ + --ci \ --changed-since="HEAD^1" \ --tap=test.tap \ --verbose # Notes: - # - The --tag option must appear before the --changed-since option to be applied - # correctly. # - The --verbose option is required for some nf-core tests to pass. It's not # needed now as we only run local tests, but we mention for future use. \ No newline at end of file diff --git a/.nf-core.yml b/.nf-core.yml index d5431a4..96aee83 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -24,6 +24,7 @@ lint: - assets/nf-core-postprocessing_logo_light.png - docs/images/nf-core-postprocessing_logo_light.png - docs/images/nf-core-postprocessing_logo_dark.png + - docs/README.md - .github/ISSUE_TEMPLATE/bug_report.yml - .github/CONTRIBUTING.md - .github/PULL_REQUEST_TEMPLATE.md @@ -34,6 +35,9 @@ lint: nextflow_config: - manifest.name - manifest.homePage + - config_defaults: + - params.exomiser_analysis_wes + - params.exomiser_analysis_wgs nf_core_version: 2.14.1 repository_type: pipeline template: diff --git a/CHANGELOG.md b/CHANGELOG.md index c418305..8056764 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## v2.0.0dev - [date] ### `Added` +- [#25](https://github.com/Ferlab-Ste-Justine/Post-processing-Pipeline/pull/25) Added exomiser module and introduced `tools` parameter to control the execution of VEP and Exomiser. +- [#25](https://github.com/Ferlab-Ste-Justine/Post-processing-Pipeline/pull/25) Group vep output files in subfolder `vep`. - [#26](https://github.com/Ferlab-Ste-Justine/Post-processing-Pipeline/pull/26) Add version file in exomiser docker image ### `Known issues` diff --git a/README.md b/README.md index 4aab30a..88f0c37 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,18 @@ [![nf-test](https://img.shields.io/badge/unit_tests-nf--test-337ab7.svg)](https://www.nf-test.com) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A523.10.1-23aa62.svg)](https://www.nextflow.io/) -[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) -[![Launch on Seqera Platform](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Seqera%20Platform-%234256e7)](https://cloud.seqera.io/launch?pipeline=https://github.com/ferlab/postprocessing) + + ## Introduction -**ferlab/postprocessing** is a bioinformatics pipeline that takes GVCFs from several samples to combine, perform joint genotyping, tag low quality variant and annotate a final vcf version. +**Ferlab-Ste-Justine/Post-processing-Pipeline** is a bioinformatics pipeline designed for family-based analysis of GVCFs from multiple samples. +It performs joint genotyping, tags low-quality variants, and optionally annotates the final vcf data using vep and/or prioritize variant using exomiser. - ### Summary: 1. Remove MNPs using bcftools 2. Normalize .gvcf @@ -19,104 +21,62 @@ 5. Tag false positive variants with either: - For whole genome sequencing data: [Variant quality score recalibration (VQSR)](https://gatk.broadinstitute.org/hc/en-us/articles/360036510892-VariantRecalibrator) - For whole exome sequencing data: [Hard-Filtering](https://gatk.broadinstitute.org/hc/en-us/articles/360036733451-VariantFiltration) -6. Annotate variants with [Variant effect predictor (VEP)](https://useast.ensembl.org/info/docs/tools/vep/index.html) +6. Optionnally annotate variants with [Variant effect predictor (VEP)](https://useast.ensembl.org/info/docs/tools/vep/index.html) +7. Optionnally integrate phenotype data to annotate, filter and prioritise variants likely to be disease-causing with [exomiser](https://www.sanger.ac.uk/tool/exomiser/) -![PostProcessingDiagram](assets/PostProcessingImage.png?raw=true) -## Usage -> [!NOTE] -> If you are new to Nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up Nextflow. Make sure to [test your setup](https://nf-co.re/docs/usage/introduction#how-to-run-a-pipeline) with `-profile test` before running the workflow on actual data. - -### Samples -The workflow will accept sample data separated by commas (CSV format). The path to the sample file must be specified with the "**input**" parameter. The column names are : familyId,sample,sequencingType,file. The sequencing type must be either WES (Whole Exome Sequencing) or WGS (Whole Genome Sequencing). - -**sample.csv** -```csv -**familyId**,**sample**,**sequencingType**,**file** -CONGE-XXX,01,WES,CONGE-XXX-01.hard-filtered.gvcf.gz -CONGE-XXX,02,WES,CONGE-XXX-02.hard-filtered.gvcf.gz -CONGE-XXX,03,WES,CONGE-XXX-03.hard-filtered.gvcf.gz -CONGE-YYY,01,WGS,CONGE-YYY-01.hard-filtered.gvcf.gz -CONGE-YYY,02,WGS,CONGE-YYY-02.hard-filtered.gvcf.gz -CONGE-YYY,03,WGS,CONGE-YYY-03.hard-filtered.gvcf.gz -``` +### Workflow subway schema +The full Ferlab workflow is shown in the image below, including the steps applicable prior to this pipeline. The steps relevant to the Ferlab-Ste-Justine/Post-processing-Pipeline correspond to the post-processing block. +![PostProcessingDiagram](docs/images/ferlab_workflow.png) -> [!NOTE] -> The sequencing type also determines the type of variant filtering the pipeline will use. -> -> In the case of Whole Genome Sequencing, VQSR (Variant Quality Score Recalibration) is used (preferred method). -> -> In the case of Whole Exome Sequencing, Hard-filtering needs to be used. +This schema was done using [inkscape](https://inkscape.org/) with the good pratices recommended by the nf-core community. See [nf-core Graphic Design](https://nf-co.re/docs/guidelines/graphic_design). -Now, you can run the pipeline using: +## Usage - +Here is an example nextflow command to run the pipeline: ```bash -nextflow run ferlab/postprocessing \ - -profile \ +nextflow run -c cluster.config Ferlab-Ste-Justine/Post-processing-Pipeline -r "v2.0.0" \ + -params-file params.json \ --input samplesheet.csv \ - --outdir + --outdir results/dir \ + --tools vep,exomiser ``` +> [!NOTE] +> If you are new to nextflow and nf-core, please refer to [this page](https://nf-co.re/docs/usage/installation) on how to set-up nextflow. + > [!WARNING] -> Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those provided by the `-c` Nextflow option can be used to provide any configuration _**except for parameters**_; +> Please provide pipeline parameters via the CLI or nextflow `-params-file` option. Custom config files including those provided by the `-c` nextflow option can be used to provide any configuration _**except for parameters**_; > see [docs](https://nf-co.re/usage/configuration#custom-configuration-files). -### References -Reference files are necessary at multiple steps of the workflow, notably for joint-genotyping,the variant effect predictor (VEP) and VQSR. -Using igenome, we can retrieve the relevant files for the desired version of the human genome. -Specifically, we specifiy the igenome version with the **genome** parameter. Most likely this value will be *'GRCh38'* - -Next, we also need broader references, which are contained in a path defined by the **broad** parameter. +For more details, see [docs/usage.md](docs/usage.md) and [docs/reference_data.md](docs/reference_data.md). -The broad directory must contain the following files: -- The interval list which determines the genomic interval(s) over which we operate: filename of this list must be defined with the **intervalsFile** parameter -- Highly validated variance ressources currently required by VQSR. ***These are currently hard coded in the pipeline!*** - - HapMap file : hapmap_3.3.hg38.vcf.gz - - 1000G omni2.5 file : 1000G_omni2.5.hg38.vcf.gz - - 1000G reference file : 1000G_phase1.snps.high_confidence.hg38.vcf.gz - - SNP database : Homo_sapiens_assembly38.dbsnp138.vcf.gz +### Stub mode and quick tests - -Finally, the vep cache directory must be specified with **vepCache**, which is usually created by vep itself on first installation. -Generally, we only need the human files obtainable from https://ftp.ensembl.org/pub/release-112/variation/vep/homo_sapiens_vep_112_GRCh38.tar.gz +The `-stub` (or `-stub-run`) option can be added to run the "stub" block of processes instead of the "script" block. This can be helpful for testing. -### Stub run -The -stub-run option can be added to run the "stub" block of processes instead of the "script" block. This can be helpful for testing. -🚧 - -Parameters summary ------ +To test your setup in stub mode, simply run `nextflow run Ferlab-Ste-Justine/Post-processing-Pipeline -profile test,docker -stub`. -| Parameter name | Required? | Accepted input | -| --- | --- | --- | -| `input` | _Required_ | file | -| `outdir` | _Required_ | path | -| `genome` | _Required_ | igenome version, ie 'GRCh38'| -| `broad` | _Required_ | path | -| `intervalsFile` | _Required_ | list of genome intervals | -| `vepCache` | _Required_ | path | +For tests with real data, see documentation in the [test configuration profile](conf/test.config) Pipeline Output ----- -Path to output directory must be specified in **outdir** parameter. -🚧 +Path to output directory must be specified via the `outdir` parameter. +See [docs/output.md](docs/output.md) for more details about pipeline outputs. -## Credits -ferlab/postprocessing was originally written by Damien Geneste, David Morais, Felix-Antoine Le Sieur, Jeremy Costanza, Lysiane Bouchard. +## Credits -We thank the following people for their extensive assistance in the development of this pipeline: +Ferlab-Ste-Justine/Post-processing-Pipeline was originally written by Damien Geneste, David Morais, Felix-Antoine Le Sieur, Jeremy Costanza, Lysiane Bouchard. - ## Contributions and Support @@ -136,15 +96,15 @@ The documentation of the various tools used in this workflow are available here: - [CombineGVCFs](https://gatk.broadinstitute.org/hc/en-us/articles/360037593911-CombineGVCFs) - [GenotypeGVCFs](https://gatk.broadinstitute.org/hc/en-us/articles/360037057852-GenotypeGVCFs) - [VariantRecalibrator](https://gatk.broadinstitute.org/hc/en-us/articles/360035531612-Variant-Quality-Score-Recalibration-VQSR) -- [VariantFiltration](https://gatk.broadinstitute.org/hc/enus/articles/360041850471-VariantFiltration)) +- [VariantFiltration](https://gatk.broadinstitute.org/hc/enus/articles/360041850471-VariantFiltration) +- [HardFiltering](https://gatk.broadinstitute.org/hc/en-us/articles/360035531112--How-to-Filter-variants-either-with-VQSR-or-by-hard-filtering) [VEP](https://useast.ensembl.org/info/docs/tools/vep/script/vep_options.html) -## Citations +[EXOMISER](https://exomiser.readthedocs.io/en/latest/) - -An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. +## Citations This pipeline uses code and infrastructure developed and maintained by the [nf-core](https://nf-co.re) community, reused here under the [MIT license](https://github.com/nf-core/tools/blob/master/LICENSE). diff --git a/assets/PostProcessingImage.png b/assets/PostProcessingImage.png deleted file mode 100644 index 4a0870275899457f4f364d58b0e90d4085ec8ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47886 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 diff --git a/assets/TestSampleSheet.csv b/assets/TestSampleSheet.csv index 5ce400a..911c172 100644 --- a/assets/TestSampleSheet.csv +++ b/assets/TestSampleSheet.csv @@ -1,3 +1,4 @@ -familyId,sample,sequencingType,gvcf -Family1,Test1,WES,https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz -Family1,Test2,WGS,https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz \ No newline at end of file +familyId,sample,sequencingType,gvcf,familyPheno +amily1,Test1,WES,https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz,assets/exomiser/pheno/family1.yml +Family1,Test2,WES,https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz,assets/exomiser/pheno/family1.yml +Family2,Test1,WGS,https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz,assets/exomiser/pheno/family2.yml \ No newline at end of file diff --git a/assets/exomiser/default_exomiser_WES_analysis.yml b/assets/exomiser/default_exomiser_WES_analysis.yml new file mode 100644 index 0000000..3e178ba --- /dev/null +++ b/assets/exomiser/default_exomiser_WES_analysis.yml @@ -0,0 +1,64 @@ +## Exomiser Analysis Template. +# These are all the possible options for running exomiser. Use this as a template for +# your own set-up. +--- +analysisMode: PASS_ONLY +inheritanceModes: { + AUTOSOMAL_DOMINANT: 0.1, + AUTOSOMAL_RECESSIVE_HOM_ALT: 0.1, + AUTOSOMAL_RECESSIVE_COMP_HET: 2.0, + X_DOMINANT: 0.1, + X_RECESSIVE_HOM_ALT: 0.1, + X_RECESSIVE_COMP_HET: 2.0, + MITOCHONDRIAL: 0.2 +} +frequencySources: [ + UK10K, + + GNOMAD_E_AFR, + GNOMAD_E_AMR, + # GNOMAD_E_ASJ, + GNOMAD_E_EAS, + # GNOMAD_E_FIN, + GNOMAD_E_NFE, + # GNOMAD_E_OTH, + GNOMAD_E_SAS, + + GNOMAD_G_AFR, + GNOMAD_G_AMR, + # GNOMAD_G_ASJ, + GNOMAD_G_EAS, + # GNOMAD_G_FIN, + GNOMAD_G_NFE, + # GNOMAD_G_OTH, + GNOMAD_G_SAS +] +# Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM, SPLICE_AI, ALPHA_MISSENSE +# REMM is trained on non-coding regulatory regions +# *WARNING* if you enable CADD or REMM ensure that you have downloaded and installed the CADD/REMM tabix files +# and updated their location in the application.properties. Exomiser will not run without this. +pathogenicitySources: [ REVEL, MVP ] +#this is the standard exomiser order. +steps: [ + failedVariantFilter: { }, + variantEffectFilter: { + remove: [ + FIVE_PRIME_UTR_EXON_VARIANT, + FIVE_PRIME_UTR_INTRON_VARIANT, + THREE_PRIME_UTR_EXON_VARIANT, + THREE_PRIME_UTR_INTRON_VARIANT, + NON_CODING_TRANSCRIPT_EXON_VARIANT, + NON_CODING_TRANSCRIPT_INTRON_VARIANT, + CODING_TRANSCRIPT_INTRON_VARIANT, + UPSTREAM_GENE_VARIANT, + DOWNSTREAM_GENE_VARIANT, + INTERGENIC_VARIANT, + REGULATORY_REGION_VARIANT + ] + }, + frequencyFilter: { maxFrequency: 2.0 }, + pathogenicityFilter: { keepNonPathogenic: true }, + inheritanceFilter: { }, + omimPrioritiser: { }, + hiPhivePrioritiser: { } +] \ No newline at end of file diff --git a/assets/exomiser/default_exomiser_WGS_analysis.yml b/assets/exomiser/default_exomiser_WGS_analysis.yml new file mode 100644 index 0000000..b169110 --- /dev/null +++ b/assets/exomiser/default_exomiser_WGS_analysis.yml @@ -0,0 +1,55 @@ +## Exomiser genome analysis template. +# These are all the possible options for running exomiser. Use this as a template for +# your own set-up. +--- +analysisMode: PASS_ONLY +inheritanceModes: { + AUTOSOMAL_DOMINANT: 0.1, + AUTOSOMAL_RECESSIVE_HOM_ALT: 0.1, + AUTOSOMAL_RECESSIVE_COMP_HET: 2.0, + X_DOMINANT: 0.1, + X_RECESSIVE_HOM_ALT: 0.1, + X_RECESSIVE_COMP_HET: 2.0, + MITOCHONDRIAL: 0.2 +} +frequencySources: [ + UK10K, + + GNOMAD_E_AFR, + GNOMAD_E_AMR, + # GNOMAD_E_ASJ, + GNOMAD_E_EAS, + # GNOMAD_E_FIN, + GNOMAD_E_NFE, + # GNOMAD_E_OTH, + GNOMAD_E_SAS, + + GNOMAD_G_AFR, + GNOMAD_G_AMR, + # GNOMAD_G_ASJ, + GNOMAD_G_EAS, + # GNOMAD_G_FIN, + GNOMAD_G_NFE, + # GNOMAD_G_OTH, + GNOMAD_G_SAS +] +# Possible pathogenicitySources: (POLYPHEN, MUTATION_TASTER, SIFT), (REVEL, MVP), CADD, REMM, SPLICE_AI, ALPHA_MISSENSE +# REMM is trained on non-coding regulatory regions +# *WARNING* if you enable CADD or REMM ensure that you have downloaded and installed the CADD/REMM tabix files +# and updated their location in the application.properties. Exomiser will not run without this. +pathogenicitySources: [ REVEL, MVP ] +# this is the recommended order for a genome-sized analysis. +steps: [ + hiPhivePrioritiser: { }, + # running the prioritiser followed by a priorityScoreFilter will remove genes + # which are least likely to contribute to the phenotype defined in hpoIds, this will + # dramatically reduce the time and memory required to analyse a genome. + # 0.501 is a good compromise to select good phenotype matches and the best protein-protein interactions hits from hiPhive + priorityScoreFilter: { priorityType: HIPHIVE_PRIORITY, minPriorityScore: 0.501 }, + failedVariantFilter: { }, + regulatoryFeatureFilter: { }, + frequencyFilter: { maxFrequency: 2.0 }, + pathogenicityFilter: { keepNonPathogenic: true }, + inheritanceFilter: { }, + omimPrioritiser: { } +] \ No newline at end of file diff --git a/assets/exomiser/pheno/family1.yml b/assets/exomiser/pheno/family1.yml new file mode 100644 index 0000000..a2acc1a --- /dev/null +++ b/assets/exomiser/pheno/family1.yml @@ -0,0 +1,30 @@ +--- +id: family1 +proband: + subject: + id: testN + sex: FEMALE + phenotypicFeatures: + - type: + id: HP:0001159 + label: Syndactyly + +pedigree: + persons: + - individualId: testN + paternalId: testT + sex: FEMALE + affectedStatus: AFFECTED + - individualId: testT + sex: MALE + affectedStatus: UNAFFECTED + +metaData: + resources: + - id: hp + name: human phenotype ontology + url: http://purl.obolibrary.org/obo/hp.owl + version: hp/releases/2019-11-08 + namespacePrefix: HP + iriPrefix: 'http://purl.obolibrary.org/obo/HP_' + phenopacketSchemaVersion: 2.0 \ No newline at end of file diff --git a/assets/exomiser/pheno/family2.yml b/assets/exomiser/pheno/family2.yml new file mode 100644 index 0000000..074e367 --- /dev/null +++ b/assets/exomiser/pheno/family2.yml @@ -0,0 +1,26 @@ +--- +id: family2 +proband: + subject: + id: testN + sex: FEMALE + phenotypicFeatures: + - type: + id: HP:0001159 + label: Syndactyly + +pedigree: + persons: + - individualId: testN + sex: FEMALE + affectedStatus: AFFECTED + +metaData: + resources: + - id: hp + name: human phenotype ontology + url: http://purl.obolibrary.org/obo/hp.owl + version: hp/releases/2019-11-08 + namespacePrefix: HP + iriPrefix: 'http://purl.obolibrary.org/obo/HP_' + phenopacketSchemaVersion: 2.0 \ No newline at end of file diff --git a/assets/exomiser/test_exomiser_analysis.yml b/assets/exomiser/test_exomiser_analysis.yml new file mode 100644 index 0000000..5b0ed3e --- /dev/null +++ b/assets/exomiser/test_exomiser_analysis.yml @@ -0,0 +1,32 @@ +# This exomiser analysis file is used for quick testing with a minimal amount of reference data +# Uses a single frequency source and a limited set of pathogenicity sources. +--- +analysisMode: PASS_ONLY +inheritanceModes: { + AUTOSOMAL_DOMINANT: 0.1, + AUTOSOMAL_RECESSIVE_HOM_ALT: 0.1, + AUTOSOMAL_RECESSIVE_COMP_HET: 2.0, + X_DOMINANT: 0.1, + X_RECESSIVE_HOM_ALT: 0.1, + X_RECESSIVE_COMP_HET: 2.0, + MITOCHONDRIAL: 0.2 +} +frequencySources: [ + UK10K +] +pathogenicitySources: [ REVEL, REMM, CADD] +# this is the recommended order for a genome-sized analysis. +steps: [ + hiPhivePrioritiser: { }, + # running the prioritiser followed by a priorityScoreFilter will remove genes + # which are least likely to contribute to the phenotype defined in hpoIds, this will + # dramatically reduce the time and memory required to analyse a genome. + # 0.501 is a good compromise to select good phenotype matches and the best protein-protein interactions hits from hiPhive + priorityScoreFilter: { priorityType: HIPHIVE_PRIORITY, minPriorityScore: 0.501 }, + failedVariantFilter: { }, + regulatoryFeatureFilter: { }, + frequencyFilter: { maxFrequency: 2.0 }, + pathogenicityFilter: { keepNonPathogenic: true }, + inheritanceFilter: { }, + omimPrioritiser: { } +] \ No newline at end of file diff --git a/assets/schema_input.json b/assets/schema_input.json index c79f04f..98e1b7b 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -32,6 +32,14 @@ "pattern": "^\\S+\\.g(enome)?(\\.)?vcf(\\.gz)?$", "format": "file-path", "exists": true + }, + "familyPheno": { + "errorMessage": "Filename of the pedigree file, mandatory for exomiser", + "meta": ["familypheno"], + "format": "file-path", + "pattern": "^\\S+\\.(yml|yaml|json){1}$", + "exists": true + } }, "required": ["familyId", "sample", "sequencingType","gvcf"] diff --git a/conf/modules.config b/conf/modules.config index 41aafbe..427cf7f 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -38,4 +38,23 @@ process { container = 'broadinstitute/gatk:4.5.0.0' ext.prefix = {meta.id + ".genotyped"} } -} \ No newline at end of file + + withName: EXOMISER { + container = 'ferlabcrsj/exomiser:2.0.0' + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: params.publish_dir_mode, + pattern: "results/*{vcf.gz,vcf.gz.tbi,tsv,json,html}", + ] + } + + // Currently, tabix is used only for vep output in the post-processing pipeline. + // Consider creating a vep subworkflow to group vep and tabix steps, making the process name more specific. + withName: 'FERLAB_POSTPROCESSING:POSTPROCESSING:tabix' { + publishDir = [ + path: { "${params.outdir}/vep" }, + mode: params.publish_dir_mode, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} diff --git a/conf/test.config b/conf/test.config index 636e18d..824b261 100644 --- a/conf/test.config +++ b/conf/test.config @@ -46,4 +46,18 @@ params { [name: 'MQ40', expression: 'MQ < 40.0'], [name: 'MQRankSum-12.5', expression: 'MQRankSum < -12.5'], [name: 'ReadPosRankSum-8', expression: 'ReadPosRankSum < -8.0']] + + tools = "vep,exomiser" + + // Exomiser parameters + exomiser_data_dir = "data-test/reference/exomiser" + exomiser_data_version = "2402" + exomiser_genome = "hg38" + exomiser_cadd_version = "1.7" + exomiser_cadd_indel_filename = "gnomad.genomes.r4.0.indel.tsv.gz" + exomiser_cadd_snv_filename = "whole_genome_SNVs.tsv.gz" + exomiser_remm_version = "0.3.1.post1" + exomiser_remm_filename = "ReMM.v0.3.1.post1.hg38.tsv.gz" + exomiser_analysis_wes = "${projectDir}/assets/exomiser/test_exomiser_analysis.yml" + exomiser_analysis_wgs = "${projectDir}/assets/exomiser/test_exomiser_analysis.yml" } diff --git a/docs/README.md b/docs/README.md index c713dc0..cad06d0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,5 +4,7 @@ The ferlab/postprocessing documentation is split into the following pages: - [Usage](usage.md) - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. +- [Reference Data](reference_data.md) + - Detailed information on the required reference data files, their structure, and how to prepare them for use with the pipeline. - [Output](output.md) - An overview of the different results produced by the pipeline and how to interpret them. diff --git a/docs/images/ferlab_workflow.png b/docs/images/ferlab_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..2fcc3a56bfa6af40c05756856995c530122a480f GIT binary patch literal 115541 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%0AN& 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 literal 0 HcmV?d00001 diff --git a/docs/images/ferlab_workflow.svg b/docs/images/ferlab_workflow.svg new file mode 100644 index 0000000..ede93e0 --- /dev/null +++ b/docs/images/ferlab_workflow.svg @@ -0,0 +1,1967 @@ + + + +image/svg+xmlmappingvcfvcfvcffastqcfastpfasfastqmosdepth, samtoolsbcftools, vcftoolsbcftools normconcatenatemosdepth, samtoolsgenotypeGVCFhardfilteringVEPexomiserVQSRWGSWESbam/crambam/crambam/cramgvcfmarkduplicatesbam/crampre-processingpost-processingvariant callingnf-core/sarek core workflow +Ferlab post-processing workflowprepare recalibrationapplybqsrhaplotypecallerconvertubamOptionalMandatory diff --git a/docs/output.md b/docs/output.md index e050e71..492ae77 100644 --- a/docs/output.md +++ b/docs/output.md @@ -3,9 +3,8 @@ ## Introduction This document describes the output produced by the pipeline. -The directories listed below will be created in the results directory after the pipeline has finished. All paths are relative to the top-level results directory. +The directories listed below will be created in the output directory after the pipeline has finished. All paths are relative to the top-level output directory. - ## Pipeline overview @@ -20,7 +19,11 @@ The directories listed below will be created in the results directory after the - A copy of the nextflow log file: `nextflow.log`. Note that it will miss logs written after the workflow.onComplete handler is run. - Copies of the configuration files used: `config/*.config`. This includes the default `nextflow.config` file as well as any additional configuration files passed as parameters. - Other metadata relevant for reproducibility: `metadata.txt` . It contains information such as the original command line, the name of the branch and revision used, the username of the person who submitted the job, a list of configuration files passed, the nextflow work directory, etc. - +- `splitmultiallelics/`: pipeline output before running the tools specified via the `tools` parameter. +- `vep/`: vep output +- `exomiser/results`: exomiser output + +You might see other folders named after different pipeline processes. These are considered intermediate pipeline outputs. diff --git a/docs/reference_data.md b/docs/reference_data.md new file mode 100644 index 0000000..5791851 --- /dev/null +++ b/docs/reference_data.md @@ -0,0 +1,110 @@ +# Ferlab-Ste-Justine/Post-processing-Pipeline: Reference Data + +Reference files are essential at various steps of the pipeline, including joint-genotyping, VQSR, the Variant Effect Predictor (VEP), and exomiser. + +These files must be correctly downloaded and specified through pipeline parameters. This document provides a comprehensive list of the required reference files and explains how to set the pipeline parameters appropriately. + +## Reference Genome +The `referenceGenome` parameter specifies the directory containing the reference genome files. + +This directory should contain the following files: +- The reference genome FASTA file (e.g., `Homo_sapiens_assembly38.fasta`). This filename must be specified with the `referenceGenomeFasta` parameter. +- The reference genome FASTA file index (e.g., `Homo_sapiens_assembly38.fasta.fai`). Its location will be automatically derived by appending `.fai` to the `referenceGenomeFasta` parameter. +- The reference genome dictionary file (e.g., `Homo_sapiens_assembly38.dict`). Its location will be automatically derived by replacing the `.fasta` file extension of the `referenceGenomeFasta` parameter with `.dict`. + +## Broad reference data (VQSR) +The `broad` parameter specifies the directory containing the reference data files for VQSR. We chose the name `broad` because +this data is from the [Broad Institute](https://www.broadinstitute.org/), a collaborative research institution known for its contributions to genomics and biomedical research. + +Files can be downloaded using this link: [GATK Ressource Bundle](https://console.cloud.google.com/storage/browser/genomics-public-data/resources/broad/hg38/v0?pageState=(%22StorageObjectListTable%22:(%22f%22:%22%255B%255D%22))&prefix=&forceOnObjectsSortingFiltering=true) + +The broad directory must contain the following files: +- *Intervals Files*: The genomic interval(s) over which we operate (WES, WGS or targeted sequencing). The filename of this list must be defined with the intervalsFile parameter (e.g., `wgs_calling_regions.hg38.interval_list`). For more details, see [Gatk documentation](https://gatk.broadinstitute.org/hc/en-us/articles/360035531852-Intervals-and-interval-lists). +- Highly validated variance ressources currently required by VQSR. ***These are currently hard coded in the pipeline***: + - HapMap file : hapmap_3.3.hg38.vcf.gz + - 1000G omni2.5 file : 1000G_omni2.5.hg38.vcf.gz + - 1000G reference file : 1000G_phase1.snps.high_confidence.hg38.vcf.gz + - SNP database : Homo_sapiens_assembly38.dbsnp138.vcf.gz + + +Extra settings (ex: resource prior probabilities, tranches, etc.) required to run the different VQSR steps are injected through pipeline parameters or hard coded in the vqsr modules. The values chosen for these settings are based on NIH [Biowulf](https://hpc.nih.gov/training/gatk_tutorial/vqsr.html) + +## VEP Cache Directory +The `vepCache` parameter specifies the directory for the vep cache. It is only required if `vep` is specified via the +`tools` parameter. + +The vep cache is not automatically populated by the pipeline. It must be pre-downloaded. You can obtain a copy of the +data by following the [vep installation procedure](https://github.com/Ensembl/ensembl-vep). Generally, we only need the human files obtainable from [Ensembl](https://ftp.ensembl.org/pub/release-112/variation/vep/homo_sapiens_vep_112_GRCh38.tar.gz). + +## Exomiser reference data +The exomiser reference data is only required if `exomiser` is specified via the `tools` parameter. + +The `exomiser_data_dir` parameter specifies the path to the directory containing the exomiser reference files. +This directory will be passed to the exomiser tool via the exomiser option `--exomiser.data-directory`. + +It's content should look like this: +``` +2402_hg19/ +2402_hg38/ +2402_phenotype/ +remm/ + ReMM.v0.3.1.post1.hg38.tsv.gz + ReMM.v0.3.1.post1.hg38.tsv.gz.tbi +cadd/1.7/ + gnomad.genomes.r4.0.indel.tsv.gz + gnomad.genomes.r4.0.indel.tsv.gz.tbi + whole_genome_SNVs.tsv.gz + whole_genome_SNVs.tsv.gz.tbi +``` + +- *2402_hg19/* and *2402_hg38/*: These folders contain data associated with the `hg19` and `hg38` genome assemblies, respectively. The number `2402` corresponds to the exomiser data version. +- *remm/*: This folder is required only if REMM is used as a pathogenicity source in the exomiser analysis. In this case, additional parameters must be provided to specify the REMM data version (here `0.3.1.post1`) and the name of the .tsv.gz file to be used within this folder. See below. +- *cadd/*: This folder is required only if CADD is used as a pathogenicity source in the exomiser analysis. Here `1.7` is the CADD data version. As for REMM, additionnal parameters must be provided. See below. + +To prepare the exomiser data directory, follow the instructions in the [exomiser installation documentation](https://exomiser.readthedocs.io/en/latest/installation.html#linux-install) + +Together with the `exomiser_data_dir` parameter, these parameters must be provided to exomiser and should match the reference data available +- `exomiser_genome`: The genome assembly version to be used by exomiser. Accepted values are `hg38` or `hg19`. +- `exomiser_data_version`: The exomiser data version. Example: `2402`. +- `exomiser_cadd_version`: The version of the CADD data to be used by exomiser (optional). Example: `1.7`. +- `exomiser_cadd_indel_filename`: The filename of the exomiser CADD indel data file (optional). Example: `gnomad.genomes.r4.0.indel.tsv.gz` +- `exomiser_cadd_snv_filename`: The filename of the exomiser CADD snv data file (optional). Example: `whole_genome_SNVs.tsv.gz` +- `exomiser_remm_version`: The version of the REMM data to be used by exomiser (optional). Example:`0.3.1.post1` +- `exomiser_remm_filename`: The filename of the exomiser REMM data file (optional). Example: `ReMM.v0.3.1.post1.hg38.tsv.gz` + +## Exomiser analysis files +In addition to the reference data, exomiser requires an analysis file (.yml/.json) that contains, among others +things, the variant frequency sources for prioritization of rare variants, variant pathogenicity sources to consider, the list of filters and prioretizers to apply, etc. + +Typically, different analysis settings are used for whole exome sequencing (WES) and whole genome sequencing (WGS) data. +Defaults analysis files are provided for each sequencing type in the assets folder: +- assets/exomiser/default_exomiser_WES_analysis.yml +- assets/exomiser/default_exomiser_WGS_analysis.yml + +You can override these defaults and provide your own analysis file(s) via parameters `exomiser_analyis_wes` and `exomiser_analysis_wgs`. +Note that the default analysis files do not include REMM or CADD pathogenicity sources. + +The exomiser analysis file format follows the `phenopacket` standard and is described in detail [here](https://exomiser.readthedocs.io/en/latest/advanced_analysis.html#analysis). +There are typically multiple sections in the analysis file. To be compatible with the way we run the exomiser command, your +analysis file should contain only the `analysis` section. + +## Reference data parameters summary + +| Parameter name | Required? | Description | +| --- | --- | --- | +| `referenceGenome` | _Required_ | Path to the directory containing the reference genome data | +| `referenceGenomeFasta` | _Required_ | Filename of the reference genome .fasta file, within the specified `referenceGenome` directory | +| `broad` | _Required_ | Path to the directory containing Broad reference data | +| `intervalsFile` | _Required_ | Filename of the genome intervals list, within the specified `broad` directory | +| `vepCache` | _Optional_ | Path to the vep cache data directory | +| `exomiser_data_dir` | _Optional_ | Path to the exomiser reference data directory | +| `exomiser_genome` | _Optional_ | Genome assembly version to be used by exomiser(`hg19` or `hg38`) | +| `exomiser_data_version` | _Optional_ | Exomiser data version (e.g., `2402`) | +| `exomiser_cadd_version` | _Optional_ | Version of the CADD data to be used by exomiser (e.g., `1.7`) | +| `exomiser_cadd_indel_filename`| _Optional_ | Filename of the exomiser CADD indel data file (e.g., `gnomad.genomes.r4.0.indel.tsv.gz`) | +| `exomiser_cadd_snv_filename`| _Optional_ | Filename of the exomiser CADD snv data file (e.g., `whole_genome_SNVs.tsv.gz`) | +| `exomiser_remm_version` | _Optional_ | Version of the REMM data to be used by exomiser (e.g., `0.3.1.post1`)| +| `exomiser_remm_filename` | _Optional_ | Filename of the exomiser REMM data file (e.g., `ReMM.v0.3.1.post1.hg38.tsv.gz`) | +| `exomiser_analysis_wes` | _Optional_ | Path to the exomiser analysis file for WES data, if different from the default | +| `exomiser_analysis_wgs` | _Optional_ | Path to the exomiser analysis file for WGS data, if different from the default | + diff --git a/docs/usage.md b/docs/usage.md index 7f650d5..34ce4ae 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,28 +1,66 @@ -# ferlab/postprocessing: Usage +# Ferlab-Ste-Justine/Post-processing-Pipeline: Usage -> _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ +> _Parameters documentation is available in the [pipeline schema](../nextflow_schema.json)._ +> _You can use the command `nf-core schema docs` to output parameters documentation._ +> _To avoid duplication of information, we minimize parameters details in markdown files._ +> _Currently, we only add context for the reference data parameters and provide parameter summaries for convenience._ ## Introduction - +The Ferlab-Ste-Justine/Post-processing-Pipeline is a bioinformatics pipeline designed for family-based analysis of GVCFs from multiple samples. It performs joint genotyping, tags low-quality variants, and optionally annotates the final VCF using VEP and/or Exomiser. This document provides instructions on how to prepare input files, run the pipeline, and understand the output. + ## Samplesheet input -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use the --input parameter to specify its location. The samplesheet has to be a tab-separated file (.tsv) with the first column being the family ID and the second being the sequencing type (either Whole Genome Sequencing (WGS) or Whole Exome Sequencing (WES)). Use the following columns to supply the paths to the gvcfs files for the same familyId. +You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use the `--input` parameter to specify its location. The samplesheet has to be a comma separated file (.csv). -```bash ---input '[path to samplesheet file]' +The samplesheet must contains the following columns at the minimum: +- *familyId*: The identifier used for the sample family +- *sample*: The identifier used for the sample +- *sequencingType*: Must be either WES (Whole Exome Sequencing) or WGS (Whole Genome Sequencing) +- *gvcf*: Path to the sample .gvcf file + +Additionnally, there is an optional *phenoFamily* column that can contain a .yml/.json file providing phenotype +information on the family in phenopacket format. This column is only necessary if using the exomiser tool. + + +**sample.csv** +```csv +**familyId**,**sample**,**sequencingType**,**gvcf**,**phenoFamily** +CONGE-XXX,01,WES,CONGE-XXX-01.hard-filtered.gvcf.gz,CONGE-XXX.pheno.yml +CONGE-XXX,02,WES,CONGE-XXX-02.hard-filtered.gvcf.gz,CONGE-XXX.pheno.yml +CONGE-XXX,03,WES,CONGE-XXX-03.hard-filtered.gvcf.gz,CONGE-XXX.pheno.yml +CONGE-YYY,01,WGS,CONGE-YYY-01.hard-filtered.gvcf.gz,CONGE-YYY.pheno.yml +CONGE-YYY,02,WGS,CONGE-YYY-02.hard-filtered.gvcf.gz,CONGE-YYY.pheno.yml +CONGE-YYY,03,WGS,CONGE-YYY-03.hard-filtered.gvcf.gz,CONGE-YYY.pheno.yml ``` +> [!NOTE] +> The sequencing type (WES or WGS) will determine the variant filtering approach used by the pipeline. +> In the case of Whole Genome Sequencing, VQSR (Variant Quality Score Recalibration) is used. +> In the case of Whole Exome Sequencing, VQSR is replaced by a hard filtering approach as VQSR cannot be applied in this case. +> Additionally, a different analysis file will be used when running the exomiser tool based on the sequencing type. + +## Reference Data + +Reference files are essential at various stages of the workflow, including joint-genotyping, VQSR, the Variant Effect Predictor (VEP), and exomiser. + +These files must be correctly downloaded and specified through pipeline parameters. For more details about how to this, see +[reference_data.md](reference_data.md). + + ## Running the pipeline The typical command for running the pipeline is as follows: ```bash -nextflow run ferlab/postprocessing --input ./samplesheet.tsv --outdir ./results --genome GRCh37 -profile docker +nextflow run -c cluster.config Ferlab-Ste-Justine/Post-processing-Pipeline -r "v2.0.0" \ + -params-file params.json \ + --input samplesheet.csv \ + --outdir results/dir \ + --tools vep,exomiser ``` -This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. Note that the pipeline will create the following files in your working directory: @@ -33,30 +71,35 @@ work # Directory containing the nextflow working files # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` -If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file. - -Pipeline settings can be provided in a `yaml` or `json` file via `-params-file `. +If you wish to repeatedly use the same parameters for multiple runs, rather than specifying each flag in the command, you can specify these in a params file (json or yaml). :::warning Do not use `-c ` to specify parameters as this will result in errors. Custom config files specified with `-c` must only be used for [tuning process resource specifications](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources), other infrastructural tweaks (such as output directories), or module arguments (args). ::: -The above pipeline run specified with a params file in yaml format: -```bash -nextflow run ferlab/postprocessing -profile docker -params-file params.yaml -``` +### Tools -with `params.yaml` containing: +You can include additional analysis in your pipeline via the `tools` parameter. Currently, the pipeline supports +two tools: `vep` (Variant Effect Predictor) and `exomizer`. -```yaml -input: './samplesheet.csv' -outdir: './results/' -genome: 'GRCh37' -<...> -``` +VEP is a widely used tool for annotating genetic variants with information such as gene names, +variant consequences, and population frequencies. It provides valuable insights into the functional impact +of genetic variants. + +Exomiser, on the other hand, is a tool specifically designed for the analysis of rare genetic diseases. It +integrates phenotype data with variant information to prioritize variants that are likely to be disease-causing. +This can greatly assist in the identification of potential disease-causing variants in exome sequencing data. + + +### Stub mode and quick tests + +The `-stub` (or `-stub-run`) option can be added to run the "stub" block of processes instead of the "script" block. This can be helpful for testing. + + +To test your setup in stub mode, simply run `nextflow run Ferlab-Ste-Justine/Post-processing-Pipeline -profile test,docker -stub`. -You can also generate such `YAML`/`JSON` files via [nf-core/launch](https://nf-co.re/launch). +For tests with real data, see documentation in the [test configuration profile](conf/test.config) ### Updating the pipeline @@ -80,96 +123,16 @@ To further assist in reproducbility, you can use share and re-use [parameter fil If you wish to share such profile (such as upload as supplementary material for academic publications), make sure to NOT include cluster specific paths to files, nor institutional specific profiles. ::: -## Core Nextflow arguments -:::note -These options are part of Nextflow and use a _single_ hyphen (pipeline parameters use a double-hyphen). -::: - -### `-profile` - -Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. - -Several generic profiles are bundled with the pipeline which instruct the pipeline to use software packaged using different methods (Docker, Singularity, Podman, Shifter, Charliecloud, Apptainer, Conda) - see below. - -:::info -We highly recommend the use of Docker or Singularity containers for full pipeline reproducibility, however when this is not possible, Conda is also supported. -::: +### Core Nextflow arguments +- Use the `-profile` parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments (e.g., docker, singularity, conda). Multiple profiles can be loaded in sequence, e.g., `-profile test,docker`. +- Use the `-resume` parameter to restart a pipeline from where it left off. This can save time by using cached results from previous runs. +- You can specify a custom configuration file using the `-c` parameter. This is useful to set configuration specific to your execution environment and change requested resources for a process. -The pipeline also dynamically loads configurations from [https://github.com/nf-core/configs](https://github.com/nf-core/configs) when it runs, making multiple config profiles for various institutional clusters available at run time. For more information and to see if your system is available in these configs please see the [nf-core/configs documentation](https://github.com/nf-core/configs#documentation). +For more detailed information, please refer to the [official Nextflow documentation](https://www.nextflow.io/docs/latest/index.html). -Note that multiple profiles can be loaded, for example: `-profile test,docker` - the order of arguments is important! -They are loaded in sequence, so later profiles can overwrite earlier profiles. -If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended, since it can lead to different results on different machines dependent on the computer enviroment. - -- `test` - - A profile with a complete configuration for automated testing - - Includes links to test data so needs no other parameters -- `docker` - - A generic configuration profile to be used with [Docker](https://docker.com/) -- `singularity` - - A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) -- `podman` - - A generic configuration profile to be used with [Podman](https://podman.io/) -- `shifter` - - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) -- `charliecloud` - - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) -- `apptainer` - - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) -- `wave` - - A generic configuration profile to enable [Wave](https://seqera.io/wave/) containers. Use together with one of the above (requires Nextflow ` 24.03.0-edge` or later). -- `conda` - - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter, Charliecloud, or Apptainer. - -### `-resume` - -Specify this when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). - -You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. - -### `-c` - -Specify the path to a specific config file (this is a core Nextflow command). See the [nf-core website documentation](https://nf-co.re/usage/configuration) for more information. - -## Custom configuration - -### Resource requests - -Whilst the default requirements set within the pipeline will hopefully work for most people and with most input data, you may find that you want to customise the compute resources that the pipeline requests. Each step in the pipeline has a default set of requirements for number of CPUs, memory and time. For most of the steps in the pipeline, if the job exits with any of the error codes specified [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L18) it will automatically be resubmitted with higher requests (2 x original, then 3 x original). If it still fails after the third attempt then the pipeline execution is stopped. - -To change the resource requests, please see the [max resources](https://nf-co.re/docs/usage/configuration#max-resources) and [tuning workflow resources](https://nf-co.re/docs/usage/configuration#tuning-workflow-resources) section of the nf-core website. - -### Custom Containers - -In some cases you may wish to change which container or conda environment a step of the pipeline uses for a particular tool. By default nf-core pipelines use containers and software from the [biocontainers](https://biocontainers.pro/) or [bioconda](https://bioconda.github.io/) projects. However in some cases the pipeline specified version maybe out of date. - -To use a different container from the default container or conda environment specified in a pipeline, please see the [updating tool versions](https://nf-co.re/docs/usage/configuration#updating-tool-versions) section of the nf-core website. - -### Custom Tool Arguments - -A pipeline might not always support every possible argument or option of a particular tool used in pipeline. Fortunately, nf-core pipelines provide some freedom to users to insert additional parameters that the pipeline does not include by default. - -To learn how to provide additional arguments to a particular tool of the pipeline, please see the [customising tool arguments](https://nf-co.re/docs/usage/configuration#customising-tool-arguments) section of the nf-core website. - -### nf-core/configs - -In most cases, you will only need to create a custom config as a one-off but if you and others within your organisation are likely to be running nf-core pipelines regularly and need to use the same settings regularly it may be a good idea to request that your custom config file is uploaded to the `nf-core/configs` git repository. Before you do this please can you test that the config file works with your pipeline of choice using the `-c` parameter. You can then create a pull request to the `nf-core/configs` repository with the addition of your config file, associated documentation file (see examples in [`nf-core/configs/docs`](https://github.com/nf-core/configs/tree/master/docs)), and amending [`nfcore_custom.config`](https://github.com/nf-core/configs/blob/master/nfcore_custom.config) to include your custom profile. - -See the main [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for more information about creating your own configuration files. - -If you have any questions or issues please send us a message on [Slack](https://nf-co.re/join/slack) on the [`#configs` channel](https://nfcore.slack.com/channels/configs). - -## Azure Resource Requests - -To be used with the `azurebatch` profile by specifying the `-profile azurebatch`. -We recommend providing a compute `params.vm_type` of `Standard_D16_v3` VMs by default but these options can be changed if required. - -Note that the choice of VM size depends on your quota and the overall workload during the analysis. -For a thorough list, please refer the [Azure Sizes for virtual machines in Azure](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes). - -## Running in the background +### Running in the background Nextflow handles job submissions and supervises the running jobs. The Nextflow process must run until the pipeline is finished. @@ -178,11 +141,35 @@ The Nextflow `-bg` flag launches Nextflow in the background, detached from your Alternatively, you can use `screen` / `tmux` or similar tool to create a detached session which you can log back into at a later time. Some HPC setups also allow you to run nextflow within a cluster job submitted your job scheduler (from where it submits more jobs). -## Nextflow memory requirements +### Nextflow memory requirements In some cases, the Nextflow Java virtual machines can start to request a large amount of memory. -We recommend adding the following line to your environment to limit this (typically in `~/.bashrc` or `~./bash_profile`): +To limit this, you can use the `NXF_OPTS` environment variable: ```bash NXF_OPTS='-Xms1g -Xmx4g' ``` + +Parameters summary +----- + +| Parameter name | Required? | Description | +| --- | --- | --- | +| `input` | _Required_ | Path to the input file | +| `outdir` | _Required_ | Path to the output directoy | +| `referenceGenome` | _Required_ | Path to the directory containing the reference genome data | +| `referenceGenomeFasta` | _Required_ | Filename of the reference genome .fasta file, within the specified `referenceGenome` directory | +| `broad` | _Required_ | Path to the directory containing Broad reference data | +| `intervalsFile` | _Required_ | Filename of the genome intervals list, within the specified `broad` directory | +| `tools` | _Optional_ | Additional tools to run separated by commas. Supported tools are `vep` and `exomiser` | +| `vepCache` | _Optional_ | Path to the vep cache data directory | +| `exomiser_data_dir` | _Optional_ | Path to the exomiser reference data directory | +| `exomiser_genome` | _Optional_ | Genome assembly version to be used by exomiser(`hg19` or `hg38`) | +| `exomiser_data_version` | _Optional_ | Exomiser data version (e.g., `2402`)| +| `exomiser_cadd_version` | _Optional_ | Version of the CADD data to be used by exomiser (e.g., `1.7`) | +| `exomiser_cadd_indel_filename`| _Optional_ | Filename of the exomiser CADD indel data file (e.g., `gnomad.genomes.r4.0.indel.tsv.gz`) | +| `exomiser_cadd_snv_filename`| _Optional_ | Filename of the exomiser CADD snv data file (e.g., `whole_genome_SNVs.tsv.gz`) | +| `exomiser_remm_version` | _Optional_ | Version of the REMM data to be used by exomiser (e.g., `0.3.1.post1`)| +| `exomiser_remm_filename` | _Optional_ | Filename of the exomiser REMM data file (e.g., `ReMM.v0.3.1.post1.hg38.tsv.gz`) | +| `exomiser_analysis_wes` | _Optional_ | Path to the exomiser analysis file for WES data, if different from the default | +| `exomiser_analysis_wgs` | _Optional_ | Path to the exomiser analysis file for WGS data, if different from the default | diff --git a/main.nf b/main.nf index f44d2ac..5abad0c 100644 --- a/main.nf +++ b/main.nf @@ -47,9 +47,6 @@ workflow FERLAB_POSTPROCESSING { POSTPROCESSING ( samplesheet ) - - emit: - POSTPROCESSING.out } /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/modules/local/exomiser/main.nf b/modules/local/exomiser/main.nf new file mode 100644 index 0000000..3480575 --- /dev/null +++ b/modules/local/exomiser/main.nf @@ -0,0 +1,86 @@ +process EXOMISER { + + label 'process_low' + + input: + tuple val(meta), path(vcfFile), path(phenoFile), path(analysisFile) + path datadir + val exomiserGenome + val exomiserDataVersion + + // If remm/cadd version is specified, remm/cadd reference file(s) path(s) will be inferred from the given filename(s) + // and passed to the exomiser cli. Each remm/cadd reference file should have a corresponding .tbi index file. + // Note that, if nextflow adds support for optional paths, one might prefer to pass the full paths explicitly. + tuple val(remmVersion), val(remmFileName) + tuple val(caddVersion), val(caddSnvFileName),val(caddIndelFileName) + + output: + tuple val(meta), path("results/*vcf.gz") , optional:true, emit: vcf + tuple val(meta), path("results/*vcf.gz.tbi") , optional:true, emit: tbi + tuple val(meta), path("results/*html") , optional:true, emit: html + tuple val(meta), path("results/*json") , optional:true, emit: json + tuple val(meta), path("results/*genes.tsv") , optional:true, emit: genetsv + tuple val(meta), path("results/*variants.tsv") , optional:true, emit: variantstsv + path("versions.yml") , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def exactVcfFile = vcfFile.find { it.name.endsWith("vcf.gz") } + + def remmArgs = "" + if (remmVersion) { + log.info("Using REMM version {}", remmVersion) + remmArgs += "--exomiser.remm.version=\"${remmVersion}\"" + remmArgs += " --exomiser.${exomiserGenome}.remm-path=/`pwd`/${datadir}/remm/${remmFileName}" + } + + def caddArgs = "" + if (caddVersion) { + log.info("Using CADD version {}", caddVersion) + caddArgs += "--cadd.version=\"${caddVersion}\"" + caddArgs += " --exomiser.${exomiserGenome}.cadd-snv-path=/`pwd`/${datadir}/cadd/${caddVersion}/${caddSnvFileName}" + caddArgs += " --exomiser.${exomiserGenome}.cadd-indel-path=/`pwd`/${datadir}/cadd/${caddVersion}/${caddIndelFileName}" + } + """ + #!/bin/bash -eo pipefail + + java -cp \$( cat /app/jib-classpath-file ) \$( cat /app/jib-main-class-file ) \\ + --vcf ${exactVcfFile} \\ + --assembly "${params.exomiser_genome}" \\ + --analysis "${analysisFile}" \\ + --sample ${phenoFile} \\ + --output-format=HTML,JSON,TSV_GENE,TSV_VARIANT,VCF \\ + --exomiser.data-directory=/`pwd`/${datadir} \\ + ${remmArgs} \\ + ${caddArgs} \\ + --exomiser.${exomiserGenome}.data-version="${exomiserDataVersion}" \\ + --exomiser.phenotype.data-version="${exomiserDataVersion}" \\ + ${args} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + "exomiser": "\$(cat /EXOMISER_VERSION.txt)" + END_VERSIONS + """ + + stub: + def familyId = meta.familyId + """ + #!/bin/bash -eo pipefail + mkdir results + touch results/${familyId}.splitted-exomiser.genes.tsv + touch results/${familyId}.splitted-exomiser.html + touch results/${familyId}.splitted-exomiser.json + touch results/${familyId}.splitted-exomiser.variants.tsv + touch results/${familyId}.splitted-exomiser.vcf.gz + touch results/${familyId}.splitted-exomiser.vcf.gz.tbi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + "exomiser": "\$(cat /EXOMISER_VERSION.txt)" + END_VERSIONS + """ +} diff --git a/modules/local/exomiser/meta.yml b/modules/local/exomiser/meta.yml new file mode 100644 index 0000000..9ab0e54 --- /dev/null +++ b/modules/local/exomiser/meta.yml @@ -0,0 +1,104 @@ +name: "exomiser" +description: Exomiser annotates, filters and prioritises likely causative variants +keywords: + - variant prioritization + - disease phenotype + - genomics +tools: + - "exomiser": + description: "Exomiser - A Tool to Annotate and Prioritize Exome Variants" + homepage: "https://bioconda.github.io/recipes/exomiser-rest-prioritiser/README.html" + documentation: "https://exomiser.readthedocs.io/en/latest/" + tool_dev_url: "https://github.com/exomiser/Exomiser" + doi: "https://doi.org/10.1038%2Fnprot.2015.124" + licence: "['AGPL v3']" + +input: + - meta: + type: map + description: | + Groovy Map containing family information + e.g. [ id:'family1', sequencing_type:'WES' ] + + - vcfFile: + type: file + description: combined vcf file containing all samples in the family + pattern: "*.{vcf.gz,vcf}" + + - phenoFile: + type: file + description: Phenopacket file containing phenotypic information about the family + pattern: "*.{yaml,yml,json}" + + - analysisFile: + type: file + description: File containing the exomiser analysis configuration + pattern: "*.{yaml,yml}" + + - dataDir: + type: directory + description: Path to the directory containing the exomiser data + + - exomiserGenome: + type: string + description: The genome assembly to use with exomiser + + - exomiserDataVersion: + type: string + description: The version of the exomiser data to use + + - remmVersion: + type: string + description: The version of the REMM pathogenicity data source to use + + - caddVersion: + type: string + description: The version of the CADD pathongenicity data source to use + + +output: + #Only when we have meta + - meta: + type: map + description: | + Groovy Map containing family information + e.g. [ id:'family1', sequencing_type:'WES' ] + + - vcf: + type: file + description: exomiser output vcf file + pattern: "*.{vcf.gz}" + + - tbi: + type: file + description: index of exomiser output vcf file + pattern: "*.{vcf.gz.tbi}" + + - html: + type: file + description: exomiser output html file + pattern: "*.{html}" + + - json: + type: file + description: exomiser output json file + pattern: "*.{json}" + + - genetsv: + type: file + description: exomiser output genes.tsv file + pattern: "*.{genes.tsv}" + + - variantstsv: + type: file + description: exomiser output variants.tsv file + pattern: "*.{variants.tsv}" + + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + + +authors: + - "@ferlab" diff --git a/modules/local/exomiser/tests/main.nf.test b/modules/local/exomiser/tests/main.nf.test new file mode 100644 index 0000000..ef049ed --- /dev/null +++ b/modules/local/exomiser/tests/main.nf.test @@ -0,0 +1,70 @@ +nextflow_process { + + name "Test Process EXOMISER" + script "modules/local/exomiser/main.nf" + process "EXOMISER" + + // Using stub mode until we can download a test dataset and write a more elaborated test + options "-stub" + + tag "local" + tag "modules" + tag "exomiser" + + test("Test Process EXOMISER") { + + when { + process { + """ + input[0] = [ [familyId: "family1"], + file("https://github.com/nf-core/test-datasets/raw/modules/data/genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz"), + file("assets/exomiser/pheno/family1.yml"), + file("assets/exomiser/default_exomiser_WGS_analysis.yml")] + input[1] = file("data-test/reference/exomiser") + input[2] = "hg38" + input[3] = "2402" + input[4] = "1.7" + input[5] = "1.3.1" + """ + } + } + then{ + + def expected_meta = [familyId: "family1"] + with(process.out) { + // vcf channel + assert vcf.size() == 1 + assert vcf.get(0)[0] == expected_meta + assert file(vcf.get(0)[1]).name == "family1.splitted-exomiser.vcf.gz" + + // tbi channel + assert tbi.size() == 1 + assert tbi.get(0)[0] == expected_meta + assert file(tbi.get(0)[1]).name == "family1.splitted-exomiser.vcf.gz.tbi" + + // html channel + assert html.size() == 1 + assert html.get(0)[0] == expected_meta + assert file(html.get(0)[1]).name == "family1.splitted-exomiser.html" + + // json channel + assert json.size() == 1 + assert json.get(0)[0] == expected_meta + assert file(json.get(0)[1]).name == "family1.splitted-exomiser.json" + + // genetsv channel + assert genetsv.size() == 1 + assert genetsv.get(0)[0] == expected_meta + assert file(genetsv.get(0)[1]).name == "family1.splitted-exomiser.genes.tsv" + + // variantstsv channel + assert variantstsv.size() == 1 + assert variantstsv.get(0)[0] == expected_meta + assert file(variantstsv.get(0)[1]).name == "family1.splitted-exomiser.variants.tsv" + + // versions channel + assert snapshot(versions).match() + } + } + } +} \ No newline at end of file diff --git a/modules/local/exomiser/tests/main.nf.test.snap b/modules/local/exomiser/tests/main.nf.test.snap new file mode 100644 index 0000000..dc05cae --- /dev/null +++ b/modules/local/exomiser/tests/main.nf.test.snap @@ -0,0 +1,14 @@ +{ + "Test Process EXOMISER": { + "content": [ + [ + "versions.yml:md5,30273ee35fb4cdba2d84b2740861902b" + ] + ], + "meta": { + "nf-test": "0.9.0", + "nextflow": "23.10.1" + }, + "timestamp": "2024-09-23T15:44:00.728501" + } +} \ No newline at end of file diff --git a/modules/local/vep.nf b/modules/local/vep.nf index ba0b3a0..51836f3 100644 --- a/modules/local/vep.nf +++ b/modules/local/vep.nf @@ -32,8 +32,6 @@ process splitMultiAllelics{ process vep { label 'vep' - publishDir "${params.outdir}", mode: 'copy' - input: tuple val(meta), path(vcfFile) path referenceGenome @@ -81,8 +79,6 @@ process vep { process tabix { label 'tiny' - publishDir "${params.outdir}", mode: 'copy' - input: tuple val(meta), path(vcfFile) diff --git a/nextflow.config b/nextflow.config index 5cde7bf..407b876 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,8 +19,19 @@ params { referenceGenome = null referenceGenomeFasta = null broad = null - vepCache = null intervalsFile = null + tools = "" + vepCache = null + exomiser_genome = null + exomiser_data_dir = null + exomiser_data_version = null + exomiser_cadd_version = null + exomiser_cadd_indel_filename = null + exomiser_cadd_snv_filename = null + exomiser_remm_version = null + exomiser_remm_filename = null + exomiser_analysis_wes = "${projectDir}/assets/exomiser/default_exomiser_WES_analysis.yml" + exomiser_analysis_wgs = "${projectDir}/assets/exomiser/default_exomiser_WGS_analysis.yml" //Process-specific parameters diff --git a/nextflow_schema.json b/nextflow_schema.json index 278e76b..14e0e41 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -41,7 +41,8 @@ "type": "string", "description": "Name of iGenomes reference.", "fa_icon": "fas fa-book", - "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details." + "help_text": "If using a reference genome configured in the pipeline using iGenomes, use this parameter to give the ID for the reference. This is then used to build the full paths for all required reference genome files e.g. `--genome GRCh38`. \n\nSee the [nf-core website docs](https://nf-co.re/usage/reference_genomes) for more details.", + "enum": ["hg19", "hg38"] }, "igenomes_ignore": { "type": "boolean", @@ -56,6 +57,12 @@ "help_text": "Path to the directory containing 5 important files: \\n1. The intervalsFile whose name is defined in the intervalsFile parameter\\n2. The Hapmap file for vqsr training\\n3. The omni2.5 file for vqsr training\\n4. The 1000G SNP reference file for vqsr training\\n5. The dbsnp database for vqsr training", "format": "directory-path" }, + "intervalsFile": { + "type": "string", + "description": "Namefile of the genome interval we want to use", + "help_text": "Namefile of the genome interval. Used during the CombineGVCFs step to indicate the regions of interest", + "format": "file-path" + }, "referenceGenome": { "type": "string", "description": "Directory containing the referenceGenomeFasta", @@ -67,26 +74,13 @@ "description": "Name of the fasta file for the genome", "help_text": "Name of the fasta file for the genome we usually apply \"Homo_sapiens_assembly38.fasta\"", "format": "file-path" - }, - "vepCache": { - "type": "string", - "help_text": "Path to the vepCache directory, which is usually installed by vep by default. It should contain at least the homo_sapien/111_GRCh38/ directory. ", - "description": "Directory of the Vep Cache", - "format": "directory-path" - }, - "intervalsFile": { - "type": "string", - "description": "Namefile of the genome interval we want to use", - "help_text": "Namefile of the genome interval. Used during the CombineGVCFs step to indicate the regions of interest", - "format": "file-path" } }, "required": [ "broad", "intervalsFile", "referenceGenome", - "referenceGenomeFasta", - "vepCache" + "referenceGenomeFasta" ] }, "institutional_config_options": { @@ -158,10 +152,6 @@ "hidden": true, "help_text": "Use to set an upper-limit for the time requirement for each process. Should be a string in the format integer-unit e.g. `--max_time '2.h'`" }, - "vepCpu": { - "type": "integer", - "default": 4 - }, "max_disk": { "type": "string", "default": "80 GB" @@ -260,8 +250,151 @@ "type": "array", "description": "Parameters for Hard-Filtering", "help_text": "Parameters for Hard-Filtering. Must be an array containing each desired filter. Each filter must be formatted with the desired name and expression, for example\\n[[name: 'QD1', expression: 'QD < 1.0'],[name: 'QD2', expression: 'QD < 2.0]]" + }, + "tools": { + "type": "string", + "pattern": "^(vep|exomiser)?(,(vep|exomiser))*$", + "description": "List of tools to use separate with comma. Available tools: [vep, exomiser]" } } + }, + "vep": { + "title": "vep", + "type": "object", + "description": "vep parameters", + "default": "", + "properties": { + "vepCpu": { + "type": "integer", + "default": 4 + }, + "vepCache": { + "type": "string", + "help_text": "Path to the vepCache directory, which is usually installed by vep by default. It should contain at least the homo_sapien/111_GRCh38/ directory. ", + "description": "Directory of the Vep Cache", + "format": "directory-path" + } + }, + "if": { + "properties": { + "tools": { + "pattern": "vep" + } + }, + "required": ["tools"] + }, + "then": { + "required": ["vepCache"] + } + }, + "exomiser_option": { + "title": "Exomiser option", + "type": "object", + "description": "", + "default": "", + "properties": { + "exomiser_analysis_wes": { + "type": "string", + "format": "file-path", + "description": "Path to the exomiser analysis file (.yml) to use for whole exome sequencing input", + "default": "${projectDir}/assets/exomiser/default_exomiser_WES_analysis.yml", + "pattern": "^\\S+\\.(yml|yaml|json){1}$", + "exists": true + }, + "exomiser_analysis_wgs": { + "type": "string", + "format": "file-path", + "default": "${projectDir}/assets/exomiser/default_exomiser_WGS_analysis.yml", + "pattern": "^\\S+\\.(yml|yaml|json){1}$", + "description": "Path to the exomiser analysis file (.yml) to use for whole genome sequencing input", + "exists": true + }, + "exomiser_data_dir": { + "type": "string", + "format": "directory-path", + "description": "Path to the exomiser data directory" + }, + "exomiser_data_version": { + "type": "string", + "description": "Exomiser data version" + }, + "exomiser_genome": { + "type": "string", + "enum": ["hg38", "hg19"], + "description": "Genome assembly version to be used by exomiser (e.g., hg38 or hg19)" + }, + "exomiser_cadd_version": { + "type": "string", + "description": "Version of cadd data" + }, + "exomiser_cadd_indel_filename": { + "type": "string", + "format": "file-path", + "description": "The filename of the exomiser CADD indel data file (e.g., gnomad.genomes.r4.0.indel.tsv.gz)", + "pattern": "^\\S+\\.tsv.gz$" + }, + "exomiser_cadd_snv_filename": { + "type": "string", + "description": "The filename of the exomiser CADD snv data file (e.g., whole_genome_SNVs.tsv.gz)", + "format": "file-path", + "pattern": "^\\S+\\.tsv.gz$" + }, + "exomiser_remm_version": { + "type": "string", + "description": "Version of remm data" + }, + "exomiser_remm_filename": { + "type": "string", + "description": "The filename of the exomiser REMM data file (e.g., ReMM.v0.3.1.post1.hg38.tsv.gz)", + "format": "file-path", + "pattern": "^\\S+\\.tsv.gz$" + } + }, + "allOf": [ + { + "if": { + "properties": { + "tools": { + "pattern": "exomiser" + } + }, + "required": ["exomiser_remm_version", "tools"] + }, + "then": { + "required": ["exomiser_remm_filename"] + } + }, + { + "if": { + "properties": { + "tools": { + "pattern": "exomiser" + } + }, + "required": ["exomiser_cadd_version", "tools"] + }, + "then": { + "required": ["exomiser_cadd_indel_filename", "exomiser_cadd_snv_filename"] + } + }, + { + "if": { + "properties": { + "tools": { + "pattern": "exomiser" + } + }, + "required": ["tools"] + }, + "then": { + "required": [ + "exomiser_genome", + "exomiser_data_dir", + "exomiser_data_version" + ] + } + } + ] } }, "allOf": [ @@ -279,7 +412,12 @@ }, { "$ref": "#/definitions/generic_options" + }, + { + "$ref": "#/definitions/vep" + }, + { + "$ref": "#/definitions/exomiser_option" } - ], - "properties": {} + ] } diff --git a/subworkflows/local/utils_nfcore_postprocessing_pipeline/main.nf b/subworkflows/local/utils_nfcore_postprocessing_pipeline/main.nf index 7549769..e82f56c 100644 --- a/subworkflows/local/utils_nfcore_postprocessing_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_postprocessing_pipeline/main.nf @@ -17,6 +17,7 @@ include { dashedLine } from '../../nf-core/utils_nfcore_pipeline' include { nfCoreLogo } from '../../nf-core/utils_nfcore_pipeline' include { UTILS_NFCORE_PIPELINE } from '../../nf-core/utils_nfcore_pipeline' include { workflowCitation } from '../../nf-core/utils_nfcore_pipeline' +include { isExomiserToolIncluded } from './utils' /* ======================================================================================== @@ -83,6 +84,11 @@ workflow PIPELINE_INITIALISATION { .fromSamplesheet("input") .map { meta, file -> + if (isExomiserToolIncluded()) { + if (!meta.familypheno) { + error("Samplesheet must contains familyPheno file for each sample when using exomiser tool") + } + } [meta.familyId, [meta, file]] } .tap{ch_sample_simple} //Save this channel to join later diff --git a/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isExomiserToolIncluded.nf.test b/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isExomiserToolIncluded.nf.test new file mode 100644 index 0000000..1a5c720 --- /dev/null +++ b/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isExomiserToolIncluded.nf.test @@ -0,0 +1,80 @@ +nextflow_function { + + name "Test Subworkflow UTILS_NFCORE_POSTPROCESSING_PIPELINE isExomiserToolIncluded function" + script "subworkflows/local/utils_nfcore_postprocessing_pipeline/utils.nf" + tag "local" + + function "isExomiserToolIncluded" + + test("Test Function isExomiserToolIncluded - both vep and exomiser") { + when { + params { + tools = "vep,exomiser" + } + function { + """ + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == true } + ) + } + } + } + + test("Test Function isExomiserToolIncluded - only exomiser") { + when { + params { + tools = "exomiser" + } + function { + """ + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == true } + ) + } + } + } + + test("Test Function isExomiserToolIncluded - only vep") { + when { + params { + tools = "vep" + } + function { + """ + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == false } + ) + } + } + } + + test("Test Function isExomiserToolIncluded - no tools") { + when { + params { + tools = null + } + function { + """ + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == false } + ) + } + } + } +} \ No newline at end of file diff --git a/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isToolIncluded.nf.test b/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isToolIncluded.nf.test new file mode 100644 index 0000000..0d54f84 --- /dev/null +++ b/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isToolIncluded.nf.test @@ -0,0 +1,105 @@ +nextflow_function { + + name "Test Subworkflow UTILS_NFCORE_POSTPROCESSING_PIPELINE isToolIncluded function" + script "subworkflows/local/utils_nfcore_postprocessing_pipeline/utils.nf" + tag "local" + + function "isToolIncluded" + + test("Test Function isToolIncluded - with multiple tools specified - tool present") { + when { + params { + tools = "toolA,toolB" + } + function { + """ + input[0] = "toolB" + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == true } + ) + } + } + } + + test("Test Function isToolIncluded - with multiple tools specified - tool absent") { + when { + params { + tools = "toolA,toolB" + } + function { + """ + input[0] = "toolC" + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == false } + ) + } + } + } + + test("Test Function isToolIncluded - with single tool - tool absent") { + when { + params { + tools = "toolA" + } + function { + """ + input[0] = "toolC" + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == false } + ) + } + } + } + + test("Test Function isToolIncluded - empty tools") { + when { + params { + tools = "" + } + + function { + """ + input[0] = "toolA" + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == false } + ) + } + } + } + + test("Test Function isToolIncluded - null tools") { + when { + params { + tools = null + } + function { + """ + input[0] = "toolA" + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == false } + ) + } + } + } + +} \ No newline at end of file diff --git a/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isVepToolIncluded.nf.test b/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isVepToolIncluded.nf.test new file mode 100644 index 0000000..da598b3 --- /dev/null +++ b/subworkflows/local/utils_nfcore_postprocessing_pipeline/tests/utils.function.isVepToolIncluded.nf.test @@ -0,0 +1,80 @@ +nextflow_function { + + name "Test Subworkflow UTILS_NFCORE_POSTPROCESSING_PIPELINE isVepToolIncluded function" + script "subworkflows/local/utils_nfcore_postprocessing_pipeline/utils.nf" + tag "local" + + function "isVepToolIncluded" + + test("Test Function isVepToolIncluded - both vep and exomiser") { + when { + params { + tools = "vep,exomiser" + } + function { + """ + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == true } + ) + } + } + } + + test("Test Function isVepToolIncluded - only vep") { + when { + params { + tools = "vep" + } + function { + """ + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == true } + ) + } + } + } + + test("Test Function isVepToolIncluded - only exomiser") { + when { + params { + tools = "exomiser" + } + function { + """ + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == false } + ) + } + } + } + + test("Test Function isVepToolIncluded - no tools") { + when { + params { + tools = null + } + function { + """ + """ + } + then { + assertAll( + { assert function.success }, + { assert function.result == false } + ) + } + } + } +} \ No newline at end of file diff --git a/subworkflows/local/utils_nfcore_postprocessing_pipeline/utils.nf b/subworkflows/local/utils_nfcore_postprocessing_pipeline/utils.nf new file mode 100644 index 0000000..1bd667b --- /dev/null +++ b/subworkflows/local/utils_nfcore_postprocessing_pipeline/utils.nf @@ -0,0 +1,11 @@ +def isVepToolIncluded() { + return isToolIncluded("vep") +} + +def isExomiserToolIncluded() { + return isToolIncluded("exomiser") +} + +def isToolIncluded(tool) { + return params.tools && params.tools.split(",").contains(tool) +} \ No newline at end of file diff --git a/workflows/postprocessing.nf b/workflows/postprocessing.nf index 67cf151..05fbe60 100644 --- a/workflows/postprocessing.nf +++ b/workflows/postprocessing.nf @@ -4,11 +4,13 @@ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +//modules and subworkflows include { paramsSummaryMap } from 'plugin/nf-validation' include { paramsSummaryMultiqc } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { softwareVersionsToYAML } from '../subworkflows/nf-core/utils_nfcore_pipeline' include { EXCLUDE_MNPS } from "../subworkflows/local/exclude_mnps" include { VQSR } from "../subworkflows/local/vqsr" +include { EXOMISER } from '../modules/local/exomiser' include { hardFiltering } from '../modules/local/hardFilter' include { splitMultiAllelics } from '../modules/local/vep' include { vep } from '../modules/local/vep' @@ -16,6 +18,10 @@ include { tabix } from '../modules/local/vep' include { COMBINEGVCFS } from '../modules/local/combine_gvcfs' include { GATK4_GENOTYPEGVCFS } from '../modules/nf-core/gatk4/genotypegvcfs' +//functions +include { isExomiserToolIncluded } from '../subworkflows/local/utils_nfcore_postprocessing_pipeline/utils' +include { isVepToolIncluded } from '../subworkflows/local/utils_nfcore_postprocessing_pipeline/utils' + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -37,6 +43,41 @@ def tagArtifacts(inputChannel, hardFilters) { return wgs_filtered.concat(wes_filtered) } +def exomiser(inputChannel, + exomiser_genome, + exomiser_data_version, + exomiser_data_dir, + analysis_wes_path, + analysis_wgs_path, + remm_version, + remm_filename, + cadd_version, + cadd_snv_filename, + cadd_indel_filename + ) { + def ch_input_for_exomiser = inputChannel.map{meta, files -> [ + meta, + files, + meta.familypheno, + meta.sequencingType == "WES"? file(analysis_wes_path) : file(analysis_wgs_path) + ]} + def remm_input = ["", ""] + if (remm_version) { + remm_input = [remm_version, remm_filename] + } + def cadd_input = ["", "", ""] + if (cadd_version) { + cadd_input = [cadd_version, cadd_snv_filename, cadd_indel_filename] + } + EXOMISER(ch_input_for_exomiser, + file(exomiser_data_dir), + exomiser_genome, + exomiser_data_version, + remm_input, + cadd_input + ) +} + process writemeta{ publishDir "${params.outdir}/pipeline_info/", mode: 'copy', overwrite: 'true' @@ -57,15 +98,14 @@ process writemeta{ """ } -workflow POSTPROCESSING { -//Local Temp Params +workflow POSTPROCESSING { + //Local Temp Params def referenceGenome = file(params.referenceGenome) def pathReferenceGenomeFasta = file(params.referenceGenome + "/" + params.referenceGenomeFasta) def pathReferenceGenomeFai = file(pathReferenceGenomeFasta + ".fai") def broad = file(params.broad) def pathIntervalFile = file(params.broad + "/" + params.intervalsFile) - def vepCache = file(params.vepCache) def pathReferenceDict = file(params.referenceGenome + "/" + params.referenceGenomeFasta.substring(0,params.referenceGenomeFasta.indexOf(".")) + ".dict") file(params.outdir).mkdirs() @@ -81,7 +121,7 @@ workflow POSTPROCESSING { .collectFile(storeDir: "${params.outdir}/pipeline_info/configs",cache: false) writemeta() - filtered = EXCLUDE_MNPS(ch_samplesheet).ch_output_excludemnps + def ch_output_from_excludemnps = EXCLUDE_MNPS(ch_samplesheet).ch_output_excludemnps //Create groupkey for the grouptuple and separate the vcf (file[0]) and the index (files[1]) .map{meta, files -> tuple(groupKey(meta.familyId, meta.sampleSize),meta,files[0],files[1])} .groupTuple() @@ -91,18 +131,19 @@ workflow POSTPROCESSING { updated_meta["id"] = updated_meta.familyId [updated_meta, vcf.flatten(), tbi.flatten()]} - filtered_one = filtered.filter{it[0].sampleSize == 1} - filtered_mult = filtered.filter{it[0].sampleSize > 1} + + //Combine per-sample gVCF files into a multi-sample gVCF file - - ch_combined_gvcf = COMBINEGVCFS(filtered_mult, pathReferenceGenomeFasta,pathReferenceGenomeFai,pathReferenceDict,pathIntervalFile) - .combined_gvcf.join(COMBINEGVCFS.out.tbi) - .concat(filtered_one) - geno_input_files = ch_combined_gvcf.map{meta,vcf,tbi -> [meta, vcf, tbi, [], []]} - - //Perform joint genotyping on one or more samples - genotypegvcf_output = GATK4_GENOTYPEGVCFS( - geno_input_files, + def filtered_one = ch_output_from_excludemnps.filter{it[0].sampleSize == 1} + def ch_input_for_combinegvcf = ch_output_from_excludemnps.filter{it[0].sampleSize > 1} + def ch_output_from_combinegvcf = COMBINEGVCFS(ch_input_for_combinegvcf , pathReferenceGenomeFasta,pathReferenceGenomeFai,pathReferenceDict,pathIntervalFile).combined_gvcf + .join(COMBINEGVCFS.out.tbi) + .concat(filtered_one) + + //Perform joint genotyping on one or more samples + def ch_input_for_genotypegvcf = ch_output_from_combinegvcf.map{meta,vcf,tbi -> [meta,vcf,tbi, [], []]} + def ch_output_from_genotypegvcf = GATK4_GENOTYPEGVCFS( + ch_input_for_genotypegvcf, [[:], pathReferenceGenomeFasta], [[:], pathReferenceGenomeFai], [[:], pathReferenceDict], @@ -113,17 +154,35 @@ workflow POSTPROCESSING { .map{ meta, vcf, tbi -> [meta, [vcf,tbi]]} //tag variants that are probable artifacts - vcfWithTags = tagArtifacts(genotypegvcf_output, params.hardFilters) + def ch_output_from_tagArtifacts = tagArtifacts(ch_output_from_genotypegvcf, params.hardFilters) //tag frequent mutations in the population - s = splitMultiAllelics(vcfWithTags, referenceGenome) + def ch_output_from_splitMultiAllelics = splitMultiAllelics(ch_output_from_tagArtifacts, referenceGenome) //Annotating mutations - vep(s, referenceGenome, vepCache) - tabix(vep.out) - - emit: - tabix.out + if (isVepToolIncluded()) { + def vepCache = file(params.vepCache) + + vep(ch_output_from_splitMultiAllelics, referenceGenome, vepCache) + tabix(vep.out) + } + + if (isExomiserToolIncluded()) { + exomiser(ch_output_from_splitMultiAllelics, + params.exomiser_genome, + params.exomiser_data_version, + params.exomiser_data_dir, + params.exomiser_analysis_wes, + params.exomiser_analysis_wgs, + params.exomiser_remm_version, + params.exomiser_remm_filename, + params.exomiser_cadd_version, + params.exomiser_cadd_snv_filename, + params.exomiser_cadd_indel_filename + ) + } + emit: + versions = ch_versions } /*