diff --git a/.editorconfig b/.editorconfig index dd9ffa53..d3409856 100644 --- a/.editorconfig +++ b/.editorconfig @@ -35,3 +35,9 @@ indent_style = unset # ignore python [*.{py,md}] indent_style = unset + +[/docs/*.xml] +indent_style = unset + +[/docs/images/metro/*.xml] +indent_style = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index bbf83e63..6866f649 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -16,15 +16,11 @@ Contributions to the code are even more welcome ;) If you'd like to write some code for nf-core/phaseimpute, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [nf-core/phaseimpute issues](https://github.com/nf-core/phaseimpute/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this 1. Check that there isn't already an issue about your idea in the [nf-core/phaseimpute issues](https://github.com/nf-core/phaseimpute/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/phaseimpute repository](https://github.com/nf-core/phaseimpute) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged -3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). -5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). @@ -41,7 +37,6 @@ Typically, pull-requests are only fully reviewed when these tests are passing, t There are typically two types of tests that run: -### Lint tests ### Lint tests `nf-core` has a [set of guidelines](https://nf-co.re/developers/guidelines) which all pipelines must adhere to. @@ -49,7 +44,6 @@ To enforce these and ensure that all pipelines stay in sync, we have developed a If any failures or warnings are encountered, please follow the listed URL for more documentation. -### Pipeline tests ### Pipeline tests Each `nf-core` pipeline should be set up with a minimal set of test-data. @@ -59,7 +53,6 @@ These tests are run both with the latest available version of `Nextflow` and als ## Patch -:warning: Only in the unlikely and regretful event of a release happening with a bug. :warning: Only in the unlikely and regretful event of a release happening with a bug. - On your own fork, make a new branch `patch` based on `upstream/master`. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a48df31d..b1e6b755 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,4 @@ -Remember that PRs should be made against the dev branch, unless you're preparing a pipeline release. - -Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/phaseimpute/tree/master/.github/CONTRIBUTING.md) ---> - ## PR checklist -- [ ] This comment contains a description of changes (with reason). - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/phaseimpute/tree/master/.github/CONTRIBUTING.md) diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 2ab2e90f..1619a8f9 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -4,18 +4,13 @@ name: nf-core branch protection on: pull_request_target: branches: [master] - pull_request_target: - branches: [master] jobs: test: - runs-on: ubuntu-latest runs-on: ubuntu-latest steps: - # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches # PRs to the nf-core repo master branch are only ok if coming from the nf-core repo `dev` or any `patch` branches - name: Check PRs - if: github.repository == 'nf-core/phaseimpute' if: github.repository == 'nf-core/phaseimpute' run: | { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/phaseimpute ]] && [[ $GITHUB_HEAD_REF == "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eff088eb..34b310a9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,20 +1,6 @@ name: nf-core CI # This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors -on: - push: - branches: - - dev - pull_request: - release: - types: [published] - -env: - NXF_ANSI_LOG: false -concurrency: - group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}" - cancel-in-progress: true -# This workflow runs the pipeline with the minimal test dataset to check that it completes without any syntax errors on: push: branches: @@ -32,9 +18,6 @@ concurrency: jobs: test: - name: Run pipeline with test data - # Only run on push if this is the nf-core dev branch (merged PRs) - if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/phaseimpute') }}" name: Run pipeline with test data # Only run on push if this is the nf-core dev branch (merged PRs) if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/phaseimpute') }}" @@ -44,9 +27,6 @@ jobs: NXF_VER: - "23.04.0" - "latest-everything" - NXF_VER: - - "23.04.0" - - "latest-everything" steps: - name: Check out pipeline code uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index cdd1c57d..073e1876 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -2,14 +2,10 @@ name: nf-core linting # This workflow is triggered on pushes and PRs to the repository. # It runs the `nf-core lint` and markdown lint tests to ensure # that the code meets the nf-core guidelines. -# It runs the `nf-core lint` and markdown lint tests to ensure -# that the code meets the nf-core guidelines. on: push: branches: - dev - branches: - - dev pull_request: release: types: [published] @@ -51,7 +47,6 @@ jobs: python -m pip install --upgrade pip pip install nf-core - - name: Run nf-core lint env: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} diff --git a/.gitignore b/.gitignore index 32ce547c..57ffc906 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ results/ testing/ testing* *.pyc -*.code-workspace \ No newline at end of file +*.code-workspace +.nf-test* diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index cc78c4fb..c089ec78 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -45,10 +45,8 @@ Questions, concerns, or ideas on what we can include? Contact members of the Saf ## Our Responsibilities Members of the Safety Team (the Safety Officers) are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. -The safety officer is responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behaviour. The Safety Team, in consultation with the nf-core core team, have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this CoC, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. -The safety officer in consultation with the nf-core core team have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. Members of the core team or the Safety Team who violate the CoC will be required to recuse themselves pending investigation. They will not have access to any reports of the violations and will be subject to the same actions as others in violation of the CoC. diff --git a/README.md b/README.md index c7ad0d44..bc0384fb 100644 --- a/README.md +++ b/README.md @@ -19,54 +19,43 @@ ## Introduction -**nf-core/phaseimpute** is a bioinformatics pipeline that ... - - - - - +**nf-core/phaseimpute** is a bioinformatics pipeline to phase and impute genetic data. Different steps are available each corresponding to a dedicated modes. ### Main steps of the pipeline The **phaseimpute** pipeline is constituted of 5 main steps: -| Metro map | Modes | -|-----------|-------------| +| Metro map | Modes | +| ---------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | metromap | - **Pre-processing**: Phasing, QC, variant filtering, variant annotation of the reference panel
- **Phase**: Phasing of the target dataset on the reference panel
- **Simulate**: Simulation of the target dataset from high quality target data
- **Concordance**: Concordance between the target dataset and a truth dataset
- **Post-processing**: Variant filtering based on their imputation quality | + ## 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. - +Each row represents a bam file with its index file. Now, you can run the pipeline using: - - ```bash nextflow run nf-core/phaseimpute \ -profile \ --input samplesheet.csv \ + --genome "GRCh38" \ + --panel \ + --steps "impute" \ + --tools "glimpse1" \ --outdir ``` @@ -81,13 +70,13 @@ For more details and further functionality, please refer to the [usage documenta Here is a short description of the different mode of the pipeline. For more information please refer to the [documentation](https://nf-core.github.io/phaseimpute/usage/). -| Mode | Flow chart | Description | -|-------------------|-----------------------------------------------------------------|----------------------------------------------------------------------------------------| -| **Preprocessing** | phase_metro | The preprocessing mode is responsible to the preparation of the multiple input file that will be used by the phasing process.
The main processes are :
- **Haplotypes phasing** of the reference panel using [**Shapeit5**](https://odelaneau.github.io/shapeit5/).
- **Filter** the reference panel to select only the necessary variants.
- **Chunking the reference panel** in a subset of region for all the chromosomes.
- **Extract** the positions where to perform the imputation.| -| **Phasing** | phase_metro | The phasing mode is the core mode of this pipeline.
It is constituted of 3 main steps:
- **Phasing**: Phasing of the target dataset on the reference panel using either:
  - [**Glimpse1**](https://odelaneau.github.io/GLIMPSE/glimpse1/index.html)
  It's come with the necessety to compute the genotype likelihoods of the target dataset.
  This step is done using [BCFTOOLS_mpileup](https://samtools.github.io/bcftools/bcftools.html#mpileup)
  - [**Glimpse2**](https://odelaneau.github.io/GLIMPSE/glimpse2/index.html) For this step the reference panel is transformed to binary chunks.
  - [**Stitch**](https://github.com/rwdavies/stitch)
  - [**Quilt**](https://github.com/rwdavies/QUILT)
- **Ligation**: all the different chunks are merged together.
- **Sampling** (optional) | -| **Simulate** | simulate_metro | The simulation mode is used to create artificial low informative genetic information from high density data. This allow to compare the imputed result to a *truth* and therefore evaluate the quality of the imputation.
For the moment it is possible to simulate:
- Low-pass data by **downsample** BAM or CRAM using [SAMTOOLS_view -s]() at different depth
- Genotype data by **SNP selecting** the position used by a designated SNP chip.
The simulation mode will also compute the **Genotype likelihoods** of the high density data. | -| **Concordance** | concordance_metro | This mode compare two vcf together to compute a summary of the differences between them.
To do so it use either:
- [**Glimpse1**](https://odelaneau.github.io/GLIMPSE/glimpse1/index.html) concordance process.
- [**Glimpse2**](https://odelaneau.github.io/GLIMPSE/glimpse2/index.html) concordance process
- Or convert the two vcf fill to `.zarr` using [**Scikit allele**](https://scikit-allel.readthedocs.io/en/stable/) and [**anndata**](https://anndata.readthedocs.io/en/latest/) before comparing the SNPs. | -| **Postprocessing**| postprocessing_metro | This final process unable to loop the whole pipeline for increasing the performance of the imputation. To do so it filter out the best imputed position and rerun the analysis using this positions. | +| Mode | Flow chart | Description | +| ------------------ | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Preprocessing** | phase_metro | The preprocessing mode is responsible to the preparation of the multiple input file that will be used by the phasing process.
The main processes are :
- **Haplotypes phasing** of the reference panel using [**Shapeit5**](https://odelaneau.github.io/shapeit5/).
- **Filter** the reference panel to select only the necessary variants.
- **Chunking the reference panel** in a subset of region for all the chromosomes.
- **Extract** the positions where to perform the imputation. | +| **Phasing** | phase_metro | The phasing mode is the core mode of this pipeline.
It is constituted of 3 main steps:
- **Phasing**: Phasing of the target dataset on the reference panel using either:
  - [**Glimpse1**](https://odelaneau.github.io/GLIMPSE/glimpse1/index.html)
  It's come with the necessety to compute the genotype likelihoods of the target dataset.
  This step is done using [BCFTOOLS_mpileup](https://samtools.github.io/bcftools/bcftools.html#mpileup)
  - [**Glimpse2**](https://odelaneau.github.io/GLIMPSE/glimpse2/index.html) For this step the reference panel is transformed to binary chunks.
  - [**Stitch**](https://github.com/rwdavies/stitch)
  - [**Quilt**](https://github.com/rwdavies/QUILT)
- **Ligation**: all the different chunks are merged together.
- **Sampling** (optional) | +| **Simulate** | simulate_metro | The simulation mode is used to create artificial low informative genetic information from high density data. This allow to compare the imputed result to a _truth_ and therefore evaluate the quality of the imputation.
For the moment it is possible to simulate:
- Low-pass data by **downsample** BAM or CRAM using [SAMTOOLS_view -s]() at different depth
- Genotype data by **SNP selecting** the position used by a designated SNP chip.
The simulation mode will also compute the **Genotype likelihoods** of the high density data. | +| **Concordance** | concordance_metro | This mode compare two vcf together to compute a summary of the differences between them.
To do so it use either:
- [**Glimpse1**](https://odelaneau.github.io/GLIMPSE/glimpse1/index.html) concordance process.
- [**Glimpse2**](https://odelaneau.github.io/GLIMPSE/glimpse2/index.html) concordance process
- Or convert the two vcf fill to `.zarr` using [**Scikit allele**](https://scikit-allel.readthedocs.io/en/stable/) and [**anndata**](https://anndata.readthedocs.io/en/latest/) before comparing the SNPs. | +| **Postprocessing** | postprocessing_metro | This final process unable to loop the whole pipeline for increasing the performance of the imputation. To do so it filter out the best imputed position and rerun the analysis using this positions. | ## Pipeline output @@ -97,11 +86,12 @@ For more details about the output files and reports, please refer to the ## Credits -nf-core/phaseimpute was originally written by LouisLeNezet. +nf-core/phaseimpute was originally written by Louis Le Nézet. We thank the following people for their extensive assistance in the development of this pipeline: - +- Anabella Trigilla +- Saul Pierotti ## Contributions and Support @@ -110,7 +100,6 @@ If you would like to contribute to this pipeline, please see the [contributing g For further information or help, don't hesitate to get in touch on the [Slack `#phaseimpute` channel](https://nfcore.slack.com/channels/phaseimpute) (you can join with [this invite](https://nf-co.re/join/slack)). For further information or help, don't hesitate to get in touch on the [Slack `#phaseimpute` channel](https://nfcore.slack.com/channels/phaseimpute) (you can join with [this invite](https://nf-co.re/join/slack)). -## Citations ## Citations diff --git a/assets/chr_rename_add.txt b/assets/chr_rename_add.txt new file mode 100644 index 00000000..c48a2640 --- /dev/null +++ b/assets/chr_rename_add.txt @@ -0,0 +1,39 @@ +1 chr1 +2 chr2 +3 chr3 +4 chr4 +5 chr5 +6 chr6 +7 chr7 +8 chr8 +9 chr9 +10 chr10 +11 chr11 +12 chr12 +13 chr13 +14 chr14 +15 chr15 +16 chr16 +17 chr17 +18 chr18 +19 chr19 +20 chr20 +21 chr21 +22 chr22 +23 chr23 +24 chr24 +25 chr25 +26 chr26 +27 chr27 +28 chr28 +29 chr29 +30 chr30 +31 chr31 +32 chr32 +33 chr33 +34 chr34 +35 chr35 +36 chr36 +37 chr37 +38 chr38 +X chrX diff --git a/assets/chr_rename.txt b/assets/chr_rename_del.txt similarity index 100% rename from assets/chr_rename.txt rename to assets/chr_rename_del.txt diff --git a/assets/panel.csv b/assets/panel.csv new file mode 100644 index 00000000..c99b845c --- /dev/null +++ b/assets/panel.csv @@ -0,0 +1,3 @@ +panel,vcf,index,sites,tsv,legend,phased +1000GP,1000GP.phased.vcf,1000GP.phased.vcf.csi,1000GP.sites,1000GP.tsv,,TRUE +1000GP_RePhase,1000GP.vcf,1000GP.vcf.csi,,,,FALSE diff --git a/assets/samplesheet.csv b/assets/samplesheet.csv index 441a688f..217ef7c3 100644 --- a/assets/samplesheet.csv +++ b/assets/samplesheet.csv @@ -1,3 +1,3 @@ -sample,BAM,BAI +sample,bam,bai 1_BAM_1X,/path/to/.bam,/path/to/.bai 1_BAM_SNP,/path/to/.bam,/path/to/.bai diff --git a/assets/schema_input.json b/assets/schema_input.json index ce442280..aca033f6 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -13,17 +13,17 @@ "errorMessage": "Sample name must be provided and cannot contain spaces", "meta": ["id"] }, - "BAM": { + "bam": { "type": "string", "pattern": "^\\S+\\.bam$", "errorMessage": "BAM file must be provided, cannot contain spaces and must have extension '.bam'" }, - "BAI": { + "bai": { "errorMessage": "BAI file must be provided, cannot contain spaces and must have extension '.bai'", "type": "string", "pattern": "^\\S+\\.bai$" } }, - "required": ["sample", "BAM", "BAI"] + "required": ["sample", "bam", "bai"] } } diff --git a/assets/schema_input_panel.json b/assets/schema_input_panel.json new file mode 100644 index 00000000..49593176 --- /dev/null +++ b/assets/schema_input_panel.json @@ -0,0 +1,48 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "$id": "https://raw.githubusercontent.com/nf-core/phaseimpute/master/assets/schema_input.json", + "title": "nf-core/phaseimpute pipeline - params.input_region schema", + "description": "Schema for the file provided with params.input_region", + "type": "array", + "items": { + "type": "object", + "properties": { + "panel": { + "type": "string", + "pattern": "^\\S+$", + "errorMessage": "Panel name must be provided and cannot contain spaces", + "meta": ["panel"] + }, + "vcf": { + "type": "string", + "pattern": "^\\S+\\.vcf$", + "errorMessage": "Panel vcf file must be provided, cannot contain spaces and must have extension '.vcf'" + }, + "index": { + "type": "string", + "pattern": "^\\S+\\.vcf\\.(tbi|csi)$", + "errorMessage": "Panel vcf index file must be provided, cannot contain spaces and must have extension '.vcf.tbi' or '.vcf.csi'" + }, + "sites": { + "type": "string", + "pattern": "^\\S+\\.sites$", + "errorMessage": "Panel sites file must be provided, cannot contain spaces and must have extension '.sites'" + }, + "tsv": { + "type": "string", + "pattern": "^\\S+\\.tsv$", + "errorMessage": "Panel tsv file must be provided, cannot contain spaces and must have extension '.tsv'" + }, + "legend": { + "type": "string", + "pattern": "^\\S+\\.legend$", + "errorMessage": "Panel legend file must be provided, cannot contain spaces and must have extension '.legend'" + }, + "phased": { + "type": "boolean", + "errorMessage": "Is the vcf given phased? Must be a boolean" + } + }, + "required": ["panel", "vcf", "index", "phased"] + } +} diff --git a/conf/modules.config b/conf/modules.config index f30dbfa6..0d09feb2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -50,7 +50,7 @@ process { // Panel preparation workflow withName: VIEW_VCF_REGION { ext.args = [ - "-Oz", + "--output-type z", "--no-version" ].join(' ') ext.prefix = { "${meta.id}_${meta.region}" } @@ -69,6 +69,7 @@ process { "-m 2", "-M 2", "-v snps", + "--output-type z", "--no-version" ].join(' ') ext.prefix = { "${meta.id}_SPNS" } @@ -87,6 +88,7 @@ process { "-m 2", "-M 2", "-v snps", + "--output-type z", "--no-version" ].join(' ') ext.prefix = { "${meta.id}_SITES" } diff --git a/conf/test.config b/conf/test.config index fbb2e5c5..e81ac0b4 100644 --- a/conf/test.config +++ b/conf/test.config @@ -22,8 +22,14 @@ params { // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets // TODO nf-core: Give any required params for the test so that command line flags are not needed - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv' + input = "${projectDir}/tests/csv/bam.csv" // Genome references - genome = 'R64-1-1' + fasta = "https://raw.githubusercontent.com/nf-core/test-datasets/phaseimpute/data/reference_genome/21_22/hs38DH.chr21_22.fa" + panel = "https://raw.githubusercontent.com/nf-core/test-datasets/phaseimpute/data/panel/21_22/1000GP.chr21_22.s.norel.bcf" + phased = true + + // Impute parameters + step = "impute" + tools = "glimpse1" } diff --git a/conf/test_full.config b/conf/test_full.config index cb2a0fae..2e95f899 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -22,7 +22,7 @@ params { map = "/groups/dog/llenezet/test-datasets/data/genetic_maps.b38/chr21.b38.gmap.gz" genome = "GRCh38" fasta = "/groups/dog/llenezet/script/phaseimpute/data/genome.fa" - + // Resources increase incompatible with Github Action max_cpus = 12 max_memory = '50.GB' diff --git a/conf/test_panelprep.config b/conf/test_panelprep.config index 32a78c5a..2c5fcc0b 100644 --- a/conf/test_panelprep.config +++ b/conf/test_panelprep.config @@ -20,9 +20,8 @@ params { max_time = '6.h' // Input data - input = "tests/csv/panel.csv" - input_region_file = "tests/csv/regionsheet.csv" - outdir = "results/test_panelprep" + input = "${projectDir}/tests/csv/panel.csv" + input_region = "${projectDir}/tests/csv/regionsheet.csv" genome = "GRCh38" map = "/groups/dog/llenezet/test-datasets/data/genetic_maps.b38/chr21.b38.gmap.gz" diff --git a/docs/NfCore_library.xml b/docs/NfCore_library.xml index 21989d75..c7d26934 100644 --- a/docs/NfCore_library.xml +++ b/docs/NfCore_library.xml @@ -1,163 +1,163 @@ -[ - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry y=\"15\" width=\"20\" height=\"45\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry width=\"20\" height=\"20\" relative=\"1\" as=\"geometry\"><mxPoint y=\"-15\" as=\"offset\"/></mxGeometry></mxCell><mxCell id=\"4\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"5\" width=\"20\" height=\"20\" as=\"geometry\"/></mxCell><mxCell id=\"5\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;endArrow=none;endFill=0;\" edge=\"1\" parent=\"2\" source=\"3\" target=\"4\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"6\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeWidth=2;\" edge=\"1\" parent=\"2\" source=\"3\" target=\"4\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"7\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"25\" width=\"20\" height=\"20\" as=\"geometry\"/></mxCell><mxCell id=\"8\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;endArrow=none;endFill=0;\" edge=\"1\" parent=\"2\" source=\"4\" target=\"7\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"9\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;endArrow=none;endFill=0;\" edge=\"1\" parent=\"2\" source=\"4\" target=\"7\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"10\" value=\"\" style=\"rounded=0;whiteSpace=wrap;html=1;strokeColor=#FFFFFF;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" width=\"10\" height=\"30\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 20, - "h": 60, - "aspect": "fixed", - "title": "triple_circle" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry width=\"20\" height=\"40\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry width=\"20\" height=\"20\" as=\"geometry\"/></mxCell><mxCell id=\"4\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"20\" width=\"20\" height=\"20\" as=\"geometry\"/></mxCell><mxCell id=\"5\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;endArrow=none;endFill=0;\" edge=\"1\" parent=\"2\" source=\"3\" target=\"4\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"6\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeWidth=2;\" edge=\"1\" parent=\"2\" source=\"3\" target=\"4\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"7\" value=\"\" style=\"rounded=0;whiteSpace=wrap;html=1;strokeColor=#FFFFFF;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" y=\"15\" width=\"10\" height=\"10\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 20, - "h": 40, - "aspect": "fixed", - "title": "double_circle" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"20\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 20, - "h": 20, - "aspect": "fixed", - "title": "single_circle" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"60\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 20, - "h": 60, - "aspect": "fixed", - "title": "triple_square" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 20, - "h": 40, - "aspect": "fixed", - "title": "double_square" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"20\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 20, - "h": 20, - "aspect": "fixed", - "title": "single_square" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;arcSize=50;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"60\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 20, - "h": 60, - "aspect": "fixed", - "title": "triple_round" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;arcSize=50;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 20, - "h": 40, - "aspect": "fixed", - "title": "double_round" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry width=\"90\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"4\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"40\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 90, - "h": 100, - "aspect": "fixed", - "title": "single_file" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry width=\"95\" height=\"105\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"4\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"40\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell><mxCell id=\"5\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"10\" y=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"6\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" y=\"45\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 95, - "h": 105, - "aspect": "fixed", - "title": "double_file" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry width=\"100\" height=\"110\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"4\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"40\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell><mxCell id=\"5\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"10\" y=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"6\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" y=\"45\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell><mxCell id=\"7\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"15\" y=\"10\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"8\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"10\" y=\"50\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", - "w": 100, - "h": 110, - "aspect": "fixed", - "title": "triple_file" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 0.5714285714285714, - "aspect": "fixed", - "title": "line_0_bk" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;strokeColor=#7EB2DD;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 0.5714285714285714, - "aspect": "fixed", - "title": "line_0_bl" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;strokeColor=#24B064;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 0.5714285714285714, - "aspect": "fixed", - "title": "line_0_gr" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;strokeColor=#FF9914;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 0.5714285714285714, - "aspect": "fixed", - "title": "line_0_or" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" y=\"40\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\"/><mxPoint x=\"40\" y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 40, - "aspect": "fixed", - "title": "line_90_WS" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint y=\"40\" as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\" y=\"40\"/><mxPoint x=\"40\" y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 40, - "aspect": "fixed", - "title": "line_90_WN" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint x=\"40\" y=\"40\" as=\"sourcePoint\"/><mxPoint as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\" y=\"40\"/><mxPoint y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 40, - "aspect": "fixed", - "title": "line_90_EN" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint x=\"40\" as=\"sourcePoint\"/><mxPoint y=\"40\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\"/><mxPoint y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 40, - "aspect": "fixed", - "title": "line_90_ES" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" y=\"20\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 20, - "aspect": "fixed", - "title": "line_45_WS" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint y=\"20\" as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\" y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 20, - "aspect": "fixed", - "title": "line_45_WN" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint x=\"40\" y=\"20\" as=\"sourcePoint\"/><mxPoint as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\" y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 20, - "aspect": "fixed", - "title": "line_45_EN" - }, - { - "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint x=\"40\" as=\"sourcePoint\"/><mxPoint y=\"20\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", - "w": 40, - "h": 20, - "aspect": "fixed", - "title": "line_45_ES" - } -] \ No newline at end of file +[ + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry y=\"15\" width=\"20\" height=\"45\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry width=\"20\" height=\"20\" relative=\"1\" as=\"geometry\"><mxPoint y=\"-15\" as=\"offset\"/></mxGeometry></mxCell><mxCell id=\"4\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"5\" width=\"20\" height=\"20\" as=\"geometry\"/></mxCell><mxCell id=\"5\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;endArrow=none;endFill=0;\" edge=\"1\" parent=\"2\" source=\"3\" target=\"4\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"6\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeWidth=2;\" edge=\"1\" parent=\"2\" source=\"3\" target=\"4\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"7\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"25\" width=\"20\" height=\"20\" as=\"geometry\"/></mxCell><mxCell id=\"8\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;endArrow=none;endFill=0;\" edge=\"1\" parent=\"2\" source=\"4\" target=\"7\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"9\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;endArrow=none;endFill=0;\" edge=\"1\" parent=\"2\" source=\"4\" target=\"7\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"10\" value=\"\" style=\"rounded=0;whiteSpace=wrap;html=1;strokeColor=#FFFFFF;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" width=\"10\" height=\"30\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 20, + "h": 60, + "aspect": "fixed", + "title": "triple_circle" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry width=\"20\" height=\"40\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry width=\"20\" height=\"20\" as=\"geometry\"/></mxCell><mxCell id=\"4\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"20\" width=\"20\" height=\"20\" as=\"geometry\"/></mxCell><mxCell id=\"5\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;strokeWidth=2;endArrow=none;endFill=0;\" edge=\"1\" parent=\"2\" source=\"3\" target=\"4\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"6\" style=\"edgeStyle=orthogonalEdgeStyle;rounded=1;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeWidth=2;\" edge=\"1\" parent=\"2\" source=\"3\" target=\"4\"><mxGeometry relative=\"1\" as=\"geometry\"/></mxCell><mxCell id=\"7\" value=\"\" style=\"rounded=0;whiteSpace=wrap;html=1;strokeColor=#FFFFFF;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" y=\"15\" width=\"10\" height=\"10\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 20, + "h": 40, + "aspect": "fixed", + "title": "double_circle" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"ellipse;whiteSpace=wrap;html=1;aspect=fixed;rounded=1;rotation=0;strokeWidth=2;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"20\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 20, + "h": 20, + "aspect": "fixed", + "title": "single_circle" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"60\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 20, + "h": 60, + "aspect": "fixed", + "title": "triple_square" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 20, + "h": 40, + "aspect": "fixed", + "title": "double_square" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"20\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 20, + "h": 20, + "aspect": "fixed", + "title": "single_square" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;arcSize=50;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"60\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 20, + "h": 60, + "aspect": "fixed", + "title": "triple_round" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;arcSize=50;\" vertex=\"1\" parent=\"1\"><mxGeometry width=\"20\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 20, + "h": 40, + "aspect": "fixed", + "title": "double_round" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry width=\"90\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"4\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"40\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 90, + "h": 100, + "aspect": "fixed", + "title": "single_file" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry width=\"95\" height=\"105\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"4\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"40\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell><mxCell id=\"5\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"10\" y=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"6\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" y=\"45\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 95, + "h": 105, + "aspect": "fixed", + "title": "double_file" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"group\" vertex=\"1\" connectable=\"0\" parent=\"1\"><mxGeometry width=\"100\" height=\"110\" as=\"geometry\"/></mxCell><mxCell id=\"3\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"4\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry y=\"40\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell><mxCell id=\"5\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"10\" y=\"5\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"6\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"5\" y=\"45\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell><mxCell id=\"7\" value=\"\" style=\"shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;rounded=1;size=20;strokeWidth=2;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"15\" y=\"10\" width=\"80\" height=\"100\" as=\"geometry\"/></mxCell><mxCell id=\"8\" value=\"&lt;font data-font-src=&quot;https://fonts.googleapis.com/css?family=Maven+Pro&quot; face=&quot;Maven Pro&quot; color=&quot;#ffffff&quot;&gt;&lt;b&gt;&lt;font style=&quot;font-size: 20px;&quot;&gt;Fastq&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;\" style=\"rounded=1;whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#000000;\" vertex=\"1\" parent=\"2\"><mxGeometry x=\"10\" y=\"50\" width=\"90\" height=\"40\" as=\"geometry\"/></mxCell></root></mxGraphModel>", + "w": 100, + "h": 110, + "aspect": "fixed", + "title": "triple_file" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 0.5714285714285714, + "aspect": "fixed", + "title": "line_0_bk" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;strokeColor=#7EB2DD;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 0.5714285714285714, + "aspect": "fixed", + "title": "line_0_bl" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;strokeColor=#24B064;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 0.5714285714285714, + "aspect": "fixed", + "title": "line_0_gr" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;strokeColor=#FF9914;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 0.5714285714285714, + "aspect": "fixed", + "title": "line_0_or" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" y=\"40\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\"/><mxPoint x=\"40\" y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 40, + "aspect": "fixed", + "title": "line_90_WS" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint y=\"40\" as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\" y=\"40\"/><mxPoint x=\"40\" y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 40, + "aspect": "fixed", + "title": "line_90_WN" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint x=\"40\" y=\"40\" as=\"sourcePoint\"/><mxPoint as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\" y=\"40\"/><mxPoint y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 40, + "aspect": "fixed", + "title": "line_90_EN" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint x=\"40\" as=\"sourcePoint\"/><mxPoint y=\"40\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\"/><mxPoint y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 40, + "aspect": "fixed", + "title": "line_90_ES" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint as=\"sourcePoint\"/><mxPoint x=\"40\" y=\"20\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 20, + "aspect": "fixed", + "title": "line_45_WS" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint y=\"20\" as=\"sourcePoint\"/><mxPoint x=\"40\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\" y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 20, + "aspect": "fixed", + "title": "line_45_WN" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint x=\"40\" y=\"20\" as=\"sourcePoint\"/><mxPoint as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\" y=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 20, + "aspect": "fixed", + "title": "line_45_EN" + }, + { + "xml": "<mxGraphModel><root><mxCell id=\"0\"/><mxCell id=\"1\" parent=\"0\"/><mxCell id=\"2\" value=\"\" style=\"endArrow=none;html=1;rounded=1;strokeWidth=2;\" edge=\"1\" parent=\"1\"><mxGeometry width=\"50\" height=\"50\" relative=\"1\" as=\"geometry\"><mxPoint x=\"40\" as=\"sourcePoint\"/><mxPoint y=\"20\" as=\"targetPoint\"/><Array as=\"points\"><mxPoint x=\"20\"/></Array></mxGeometry></mxCell></root></mxGraphModel>", + "w": 40, + "h": 20, + "aspect": "fixed", + "title": "line_45_ES" + } +] diff --git a/docs/development.md b/docs/development.md index 4a956863..2dcc411d 100644 --- a/docs/development.md +++ b/docs/development.md @@ -14,12 +14,36 @@ conda activate nf-core-phaseimpute-1.0dev nf-core modules install ``` +## Run tests + +```bash +nextflow run main.nf -profile singularity,test --outdir results -resume +``` + +## Problematic + +### Channel management and combination + +If only one specie at a time, then only one fasta file and only one map file (normally ?) +Do we want to be able to compute multiple panel at the same time ? +If so we need to correctly combine the different channel depending on their meta map. + +All channel need to be identified by a meta map as follow: + +- I : individual id +- P : panel id +- R : region used +- M : map used +- T : tool used +- G : reference genome used (is it needed ?) + ## Open questions How to use different schema ? + - Use nf-validation -For the moment use different input / step. -In the futur, if/else logic will be added in the yml nf-core schema. + For the moment use different input / step. + In the futur, if/else logic will be added in the yml nf-core schema. What's the use of dumpcustomsoftware ? Will be deleted diff --git a/docs/images/metro/.$MetroMap.xml.bkp b/docs/images/metro/.$MetroMap.xml.bkp deleted file mode 100644 index 8f6dbcf9..00000000 --- a/docs/images/metro/.$MetroMap.xml.bkp +++ /dev/null @@ -1,4844 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/images/metro/Concordance.png b/docs/images/metro/Concordance.png index 056c787e..ad998658 100644 Binary files a/docs/images/metro/Concordance.png and b/docs/images/metro/Concordance.png differ diff --git a/docs/images/metro/MetroMap.png b/docs/images/metro/MetroMap.png index 8c401e53..92412868 100644 Binary files a/docs/images/metro/MetroMap.png and b/docs/images/metro/MetroMap.png differ diff --git a/docs/images/metro/MetroMap.xml b/docs/images/metro/MetroMap.xml index f3e6e736..bc371e9f 100644 --- a/docs/images/metro/MetroMap.xml +++ b/docs/images/metro/MetroMap.xml @@ -1 +1,2920 @@ -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 \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/images/metro/Phase.png b/docs/images/metro/Phase.png index d920dfbf..3946e578 100644 Binary files a/docs/images/metro/Phase.png and b/docs/images/metro/Phase.png differ diff --git a/docs/images/metro/PreProcessing.png b/docs/images/metro/PreProcessing.png index c0964be4..d1ad65d6 100644 Binary files a/docs/images/metro/PreProcessing.png and b/docs/images/metro/PreProcessing.png differ diff --git a/docs/usage.md b/docs/usage.md index 20f92f3d..ec9617d8 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -3,6 +3,7 @@ ## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/phaseimpute/usage](https://nf-co.re/phaseimpute/usage) > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ + ## :warning: Please read this documentation on the nf-core website: [https://nf-co.re/phaseimpute/usage](https://nf-co.re/phaseimpute/usage) > _Documentation of pipeline parameters is generated automatically from the pipeline schema and can no longer be found in markdown files._ @@ -12,6 +13,7 @@ ## Samplesheet input + ## Samplesheet input @@ -171,8 +173,9 @@ If `-profile` is not specified, the pipeline will run locally and expect all sof - `apptainer` - A generic configuration profile to be used with [Apptainer](https://apptainer.org/) - `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. -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. + 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 @@ -307,5 +310,9 @@ We recommend adding the following line to your environment to limit this (typica ```bash NXF_OPTS='-Xms1g -Xmx4g' ``` + NXF_OPTS='-Xms1g -Xmx4g' + +``` + ``` diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy deleted file mode 100644 index 408951ae..00000000 --- a/lib/NfcoreTemplate.groovy +++ /dev/null @@ -1,336 +0,0 @@ -// -// This file holds several functions used within the nf-core pipeline template. -// - -import org.yaml.snakeyaml.Yaml - -class NfcoreTemplate { - - // - // Check AWS Batch related parameters have been specified correctly - // - public static void awsBatch(workflow, params) { - if (workflow.profile.contains('awsbatch')) { - // Check params.awsqueue and params.awsregion have been set if running on AWSBatch - assert (params.awsqueue && params.awsregion) : "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - // Check outdir paths to be S3 buckets if running on AWSBatch - assert params.outdir.startsWith('s3:') : "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" - } - } - - // - // Warn if a -profile or Nextflow config has not been provided to run the pipeline - // - public static void checkConfigProvided(workflow, log) { - if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { - log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + - "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + - " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + - " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + - " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + - "Please refer to the quick start section and usage docs for the pipeline.\n " - } - } - - // - // Generate version string - // - public static String version(workflow) { - String version_string = "" - - if (workflow.manifest.version) { - def prefix_v = workflow.manifest.version[0] != 'v' ? 'v' : '' - version_string += "${prefix_v}${workflow.manifest.version}" - } - - if (workflow.commitId) { - def git_shortsha = workflow.commitId.substring(0, 7) - version_string += "-g${git_shortsha}" - } - - return version_string - } - - // - // Construct and send completion email - // - public static void email(workflow, params, summary_params, projectDir, log, multiqc_report=[]) { - - // Set up the e-mail variables - def subject = "[$workflow.manifest.name] Successful: $workflow.runName" - if (!workflow.success) { - subject = "[$workflow.manifest.name] FAILED: $workflow.runName" - } - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['Date Started'] = workflow.start - misc_fields['Date Completed'] = workflow.complete - misc_fields['Pipeline script file path'] = workflow.scriptFile - misc_fields['Pipeline script hash ID'] = workflow.scriptId - if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository - if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId - if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision - misc_fields['Nextflow Version'] = workflow.nextflow.version - misc_fields['Nextflow Build'] = workflow.nextflow.build - misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - - def email_fields = [:] - email_fields['version'] = NfcoreTemplate.version(workflow) - email_fields['runName'] = workflow.runName - email_fields['success'] = workflow.success - email_fields['dateComplete'] = workflow.complete - email_fields['duration'] = workflow.duration - email_fields['exitStatus'] = workflow.exitStatus - email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - email_fields['errorReport'] = (workflow.errorReport ?: 'None') - email_fields['commandLine'] = workflow.commandLine - email_fields['projectDir'] = workflow.projectDir - email_fields['summary'] = summary << misc_fields - - // On success try attach the multiqc report - def mqc_report = null - try { - if (workflow.success) { - mqc_report = multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) { - if (mqc_report.size() > 1) { - log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" - } - mqc_report = mqc_report[0] - } - } - } catch (all) { - if (multiqc_report) { - log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" - } - } - - // Check if we are only sending emails on failure - def email_address = params.email - if (!params.email && params.email_on_fail && !workflow.success) { - email_address = params.email_on_fail - } - - // Render the TXT template - def engine = new groovy.text.GStringTemplateEngine() - def tf = new File("$projectDir/assets/email_template.txt") - def txt_template = engine.createTemplate(tf).make(email_fields) - def email_txt = txt_template.toString() - - // Render the HTML template - def hf = new File("$projectDir/assets/email_template.html") - def html_template = engine.createTemplate(hf).make(email_fields) - def email_html = html_template.toString() - - // Render the sendmail template - def max_multiqc_email_size = (params.containsKey('max_multiqc_email_size') ? params.max_multiqc_email_size : 0) as nextflow.util.MemoryUnit - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes() ] - def sf = new File("$projectDir/assets/sendmail_template.txt") - def sendmail_template = engine.createTemplate(sf).make(smail_fields) - def sendmail_html = sendmail_template.toString() - - // Send the HTML e-mail - Map colors = logColours(params.monochrome_logs) - if (email_address) { - try { - if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" - } catch (all) { - // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report.size() <= max_multiqc_email_size.toBytes() ) { - mail_cmd += [ '-A', mqc_report ] - } - mail_cmd.execute() << email_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-" - } - } - - // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") - output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") - output_tf.withWriter { w -> w << email_txt } - } - - // - // Construct and send a notification to a web server as JSON - // e.g. Microsoft Teams and Slack - // - public static void IM_notification(workflow, params, summary_params, projectDir, log) { - def hook_url = params.hook_url - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['start'] = workflow.start - misc_fields['complete'] = workflow.complete - misc_fields['scriptfile'] = workflow.scriptFile - misc_fields['scriptid'] = workflow.scriptId - if (workflow.repository) misc_fields['repository'] = workflow.repository - if (workflow.commitId) misc_fields['commitid'] = workflow.commitId - if (workflow.revision) misc_fields['revision'] = workflow.revision - misc_fields['nxf_version'] = workflow.nextflow.version - misc_fields['nxf_build'] = workflow.nextflow.build - misc_fields['nxf_timestamp'] = workflow.nextflow.timestamp - - def msg_fields = [:] - msg_fields['version'] = NfcoreTemplate.version(workflow) - msg_fields['runName'] = workflow.runName - msg_fields['success'] = workflow.success - msg_fields['dateComplete'] = workflow.complete - msg_fields['duration'] = workflow.duration - msg_fields['exitStatus'] = workflow.exitStatus - msg_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - msg_fields['errorReport'] = (workflow.errorReport ?: 'None') - msg_fields['commandLine'] = workflow.commandLine.replaceFirst(/ +--hook_url +[^ ]+/, "") - msg_fields['projectDir'] = workflow.projectDir - msg_fields['summary'] = summary << misc_fields - - // Render the JSON template - def engine = new groovy.text.GStringTemplateEngine() - // Different JSON depending on the service provider - // Defaults to "Adaptive Cards" (https://adaptivecards.io), except Slack which has its own format - def json_path = hook_url.contains("hooks.slack.com") ? "slackreport.json" : "adaptivecard.json" - def hf = new File("$projectDir/assets/${json_path}") - def json_template = engine.createTemplate(hf).make(msg_fields) - def json_message = json_template.toString() - - // POST - def post = new URL(hook_url).openConnection(); - post.setRequestMethod("POST") - post.setDoOutput(true) - post.setRequestProperty("Content-Type", "application/json") - post.getOutputStream().write(json_message.getBytes("UTF-8")); - def postRC = post.getResponseCode(); - if (! postRC.equals(200)) { - log.warn(post.getErrorStream().getText()); - } - } - - // - // Print pipeline summary on completion - // - public static void summary(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (workflow.success) { - if (workflow.stats.ignoredCount == 0) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.yellow} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" - } - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" - } - } - - // - // ANSII Colours used for terminal logging - // - public static Map logColours(Boolean monochrome_logs) { - Map colorcodes = [:] - - // Reset / Meta - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" - colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" - colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" - colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" - - // Regular Colors - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - - // Bold - colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" - colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" - colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" - colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" - colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" - colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" - colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" - colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" - - // Underline - colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" - colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" - colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" - colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" - colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" - colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" - colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" - colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" - - // High Intensity - colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" - colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" - colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" - colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" - colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" - colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" - colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" - colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" - - // Bold High Intensity - colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" - colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" - colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" - colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" - colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" - colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" - colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" - - return colorcodes - } - - // - // Does what is says on the tin - // - public static String dashedLine(monochrome_logs) { - Map colors = logColours(monochrome_logs) - return "-${colors.dim}----------------------------------------------------${colors.reset}-" - } - - // - // nf-core logo - // - public static String logo(workflow, monochrome_logs) { - Map colors = logColours(monochrome_logs) - String workflow_version = NfcoreTemplate.version(workflow) - String.format( - """\n - ${dashedLine(monochrome_logs)} - ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} - ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} - ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} - ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} - ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} ${workflow_version}${colors.reset} - ${dashedLine(monochrome_logs)} - """.stripIndent() - ) - } -} diff --git a/lib/Utils.groovy b/lib/Utils.groovy deleted file mode 100644 index 8d030f4e..00000000 --- a/lib/Utils.groovy +++ /dev/null @@ -1,47 +0,0 @@ -// -// This file holds several Groovy functions that could be useful for any Nextflow pipeline -// - -import org.yaml.snakeyaml.Yaml - -class Utils { - - // - // When running with -profile conda, warn if channels have not been set-up appropriately - // - public static void checkCondaChannels(log) { - Yaml parser = new Yaml() - def channels = [] - try { - def config = parser.load("conda config --show channels".execute().text) - channels = config.channels - } catch(NullPointerException | IOException e) { - log.warn "Could not verify conda channel configuration." - return - } - - // Check that all channels are present - // This channel list is ordered by required channel priority. - def required_channels_in_order = ['conda-forge', 'bioconda', 'defaults'] - def channels_missing = ((required_channels_in_order as Set) - (channels as Set)) as Boolean - - // Check that they are in the right order - def channel_priority_violation = false - def n = required_channels_in_order.size() - for (int i = 0; i < n - 1; i++) { - channel_priority_violation |= !(channels.indexOf(required_channels_in_order[i]) < channels.indexOf(required_channels_in_order[i+1])) - } - - if (channels_missing | channel_priority_violation) { - log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " There is a problem with your Conda configuration!\n\n" + - " You will need to set-up the conda-forge and bioconda channels correctly.\n" + - " Please refer to https://bioconda.github.io/\n" + - " The observed channel order is \n" + - " ${channels}\n" + - " but the following channel order is required:\n" + - " ${required_channels_in_order}\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - } - } -} diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy deleted file mode 100644 index 8a6e7105..00000000 --- a/lib/WorkflowMain.groovy +++ /dev/null @@ -1,63 +0,0 @@ -// -// This file holds several functions specific to the main.nf workflow in the nf-core/phaseimpute pipeline -// - -import nextflow.Nextflow - -class WorkflowMain { - - // - // Citation string for pipeline - // - public static String citation(workflow) { - return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - // TODO nf-core: Add Zenodo DOI for pipeline after first release - //"* The pipeline\n" + - //" https://doi.org/10.5281/zenodo.XXXXXXX\n\n" + - "* The nf-core framework\n" + - " https://doi.org/10.1038/s41587-020-0439-x\n\n" + - "* Software dependencies\n" + - " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" - } - - - // - // Validate parameters and print summary to screen - // - public static void initialise(workflow, params, log) { - - // Print workflow version and exit on --version - if (params.version) { - String workflow_version = NfcoreTemplate.version(workflow) - log.info "${workflow.manifest.name} ${workflow_version}" - System.exit(0) - } - - // Check that a -profile or Nextflow config has been provided to run the pipeline - NfcoreTemplate.checkConfigProvided(workflow, log) - - // Check that conda channels are set-up correctly - if (workflow.profile.tokenize(',').intersect(['conda', 'mamba']).size() >= 1) { - Utils.checkCondaChannels(log) - } - - // Check AWS batch settings - NfcoreTemplate.awsBatch(workflow, params) - - // Check input has been provided - if (!params.input) { - Nextflow.error("Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'") - } - } - // - // Get attribute from genome config file e.g. fasta - // - public static Object getGenomeAttribute(params, attribute) { - if (params.genomes && params.genome && params.genomes.containsKey(params.genome)) { - if (params.genomes[ params.genome ].containsKey(attribute)) { - return params.genomes[ params.genome ][ attribute ] - } - } - return null - } -} diff --git a/lib/WorkflowPhaseimpute.groovy b/lib/WorkflowPhaseimpute.groovy deleted file mode 100644 index 982c0c86..00000000 --- a/lib/WorkflowPhaseimpute.groovy +++ /dev/null @@ -1,122 +0,0 @@ -// -// This file holds several functions specific to the workflow/phaseimpute.nf in the nf-core/phaseimpute pipeline -// - -import nextflow.Nextflow -import groovy.text.SimpleTemplateEngine - -class WorkflowPhaseimpute { - - // - // Check and validate parameters - // - public static void initialise(params, log) { - - genomeExistsError(params, log) - - - if (!params.fasta) { - Nextflow.error "Genome fasta file not specified with e.g. '--fasta genome.fa' or via a detectable config file." - } - } - - // - // Get workflow summary for MultiQC - // - public static String paramsSummaryMultiqc(workflow, summary) { - String summary_section = '' - for (group in summary.keySet()) { - def group_params = summary.get(group) // This gets the parameters of that particular group - if (group_params) { - summary_section += "

$group

\n" - summary_section += "
\n" - for (param in group_params.keySet()) { - summary_section += "
$param
${group_params.get(param) ?: 'N/A'}
\n" - } - summary_section += "
\n" - } - } - - String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" - yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" - yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" - yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" - yaml_file_text += "plot_type: 'html'\n" - yaml_file_text += "data: |\n" - yaml_file_text += "${summary_section}" - return yaml_file_text - } - - // - // Generate methods description for MultiQC - // - - public static String toolCitationText(params) { - - // TODO Optionally add in-text citation tools to this list. - // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "Tool (Foo et al. 2023)" : "", - // Uncomment function in methodsDescriptionText to render in MultiQC report - def citation_text = [ - "Tools used in the workflow included:", - "FastQC (Andrews 2010),", - "MultiQC (Ewels et al. 2016)", - "." - ].join(' ').trim() - - return citation_text - } - - public static String toolBibliographyText(params) { - - // TODO Optionally add bibliographic entries to this list. - // Can use ternary operators to dynamically construct based conditions, e.g. params["run_xyz"] ? "
  • Author (2023) Pub name, Journal, DOI
  • " : "", - // Uncomment function in methodsDescriptionText to render in MultiQC report - def reference_text = [ - "
  • Andrews S, (2010) FastQC, URL: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/).
  • ", - "
  • Ewels, P., Magnusson, M., Lundin, S., & Käller, M. (2016). MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics , 32(19), 3047–3048. doi: /10.1093/bioinformatics/btw354
  • " - ].join(' ').trim() - - return reference_text - } - - public static String methodsDescriptionText(run_workflow, mqc_methods_yaml, params) { - // Convert to a named map so can be used as with familar NXF ${workflow} variable syntax in the MultiQC YML file - def meta = [:] - meta.workflow = run_workflow.toMap() - meta["manifest_map"] = run_workflow.manifest.toMap() - - // Pipeline DOI - meta["doi_text"] = meta.manifest_map.doi ? "(doi: ${meta.manifest_map.doi})" : "" - meta["nodoi_text"] = meta.manifest_map.doi ? "": "
  • If available, make sure to update the text to include the Zenodo DOI of version of the pipeline used.
  • " - - // Tool references - meta["tool_citations"] = "" - meta["tool_bibliography"] = "" - - // TODO Only uncomment below if logic in toolCitationText/toolBibliographyText has been filled! - //meta["tool_citations"] = toolCitationText(params).replaceAll(", \\.", ".").replaceAll("\\. \\.", ".").replaceAll(", \\.", ".") - //meta["tool_bibliography"] = toolBibliographyText(params) - - - def methods_text = mqc_methods_yaml.text - - def engine = new SimpleTemplateEngine() - def description_html = engine.createTemplate(methods_text).make(meta) - - return description_html - } - - // - // Exit pipeline if incorrect --genome key provided - // - private static void genomeExistsError(params, log) { - if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - def error_string = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + - " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + - " Currently, the available genome keys are:\n" + - " ${params.genomes.keySet().join(", ")}\n" + - "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" - Nextflow.error(error_string) - } - } -} diff --git a/lib/nfcore_external_java_deps.jar b/lib/nfcore_external_java_deps.jar deleted file mode 100644 index 805c8bb5..00000000 Binary files a/lib/nfcore_external_java_deps.jar and /dev/null differ diff --git a/main.nf b/main.nf index 97671036..9bac5ebd 100644 --- a/main.nf +++ b/main.nf @@ -6,13 +6,6 @@ Github : https://github.com/nf-core/phaseimpute Website: https://nf-co.re/phaseimpute Slack : https://nfcore.slack.com/channels/phaseimpute -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - nf-core/phaseimpute -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Github : https://github.com/nf-core/phaseimpute - Website: https://nf-co.re/phaseimpute - Slack : https://nfcore.slack.com/channels/phaseimpute ----------------------------------------------------------------------------------------- */ nextflow.enable.dsl = 2 @@ -23,23 +16,11 @@ nextflow.enable.dsl = 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -include { PHASEIMPUTE } from './workflows/phaseimpute' +include { PHASEIMPUTE } from './workflows/phaseimpute' include { PIPELINE_INITIALISATION } from './subworkflows/local/utils_nfcore_phaseimpute_pipeline' include { PIPELINE_COMPLETION } from './subworkflows/local/utils_nfcore_phaseimpute_pipeline' - include { getGenomeAttribute } from './subworkflows/local/utils_nfcore_phaseimpute_pipeline' -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - GENOME PARAMETER VALUES -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ - -// TODO nf-core: Remove this line if you don't need a FASTA file -// This is an example of how to use getGenomeAttribute() to fetch parameters -// from igenomes.config using `--genome` -params.fasta = getGenomeAttribute('fasta') - /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NAMED WORKFLOWS FOR PIPELINE @@ -52,21 +33,32 @@ params.fasta = getGenomeAttribute('fasta') workflow NFCORE_PHASEIMPUTE { take: - samplesheet // channel: samplesheet read in from --input + ch_input // channel: samplesheet read in from --input + ch_fasta // channel: reference genome FASTA file with index + ch_panel // channel: reference panel variants file + ch_regions // channel: regions to use [meta, region] + ch_map // channel: map file for imputation + ch_versions // channel: versions of software used main: - // // WORKFLOW: Run pipeline // PHASEIMPUTE ( - samplesheet + ch_input, + ch_fasta, + ch_panel, + ch_regions, + ch_map, + ch_versions ) + emit: multiqc_report = PHASEIMPUTE.out.multiqc_report // channel: /path/to/multiqc_report.html } + /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW @@ -76,7 +68,6 @@ workflow NFCORE_PHASEIMPUTE { workflow { main: - // // SUBWORKFLOW: Run initialisation tasks // @@ -94,7 +85,12 @@ workflow { // WORKFLOW: Run main workflow // NFCORE_PHASEIMPUTE ( - PIPELINE_INITIALISATION.out.samplesheet + PIPELINE_INITIALISATION.out.input, + PIPELINE_INITIALISATION.out.fasta, + PIPELINE_INITIALISATION.out.panel, + PIPELINE_INITIALISATION.out.regions, + PIPELINE_INITIALISATION.out.map, + PIPELINE_INITIALISATION.out.versions ) // diff --git a/modules.json b/modules.json index 8e361457..d5d40020 100644 --- a/modules.json +++ b/modules.json @@ -7,82 +7,85 @@ "nf-core": { "bcftools/annotate": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "44096c08ffdbc694f5f92ae174ea0f7ba0f37e09", + "installed_by": ["modules"], + "patch": "modules/nf-core/bcftools/annotate/bcftools-annotate.diff" }, "bcftools/index": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "44096c08ffdbc694f5f92ae174ea0f7ba0f37e09", "installed_by": [ - "multiple_impute_glimpse2", "modules", + "multiple_impute_glimpse2", "vcf_impute_glimpse", "vcf_phase_shapeit5" ] }, + "bcftools/mpileup": { + "branch": "master", + "git_sha": "44096c08ffdbc694f5f92ae174ea0f7ba0f37e09", + "installed_by": ["modules"], + "patch": "modules/nf-core/bcftools/mpileup/bcftools-mpileup.diff" + }, "bcftools/norm": { "branch": "master", - "git_sha": "0435e4eebc94e53721c194b2d5d06f455a79e407", + "git_sha": "44096c08ffdbc694f5f92ae174ea0f7ba0f37e09", "installed_by": ["modules"] }, "bcftools/query": { "branch": "master", - "git_sha": "b5cc8edd887e27c51a48387e34549d4405d9769f", + "git_sha": "44096c08ffdbc694f5f92ae174ea0f7ba0f37e09", "installed_by": ["modules"] }, "bcftools/view": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "1013101da4252623fd7acf19cc581bae91d4f839", + "installed_by": ["modules"], + "patch": "modules/nf-core/bcftools/view/bcftools-view.diff" }, "bedtools/makewindows": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "3b248b84694d1939ac4bb33df84bf6233a34d668", "installed_by": ["vcf_phase_shapeit5"] }, "custom/dumpsoftwareversions": { "branch": "master", - "git_sha": "05c280924b6c768d484c7c443dad5e605c4ff4b4", - "installed_by": ["modules"] - }, - "fastqc": { - "branch": "master", - "git_sha": "9a4517e720bc812e95b56d23d15a1653b6db4f53", + "git_sha": "de45447d060b8c8b98575bc637a4a575fd0638e1", "installed_by": ["modules"] }, "glimpse/chunk": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["vcf_impute_glimpse", "modules"] + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", + "installed_by": ["modules", "vcf_impute_glimpse"] }, "glimpse/ligate": { "branch": "master", - "git_sha": "36cfa4c2a7e538832c50f40cb16d159e84cd3305", + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", "installed_by": ["vcf_impute_glimpse"] }, "glimpse/phase": { "branch": "master", - "git_sha": "36cfa4c2a7e538832c50f40cb16d159e84cd3305", + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", "installed_by": ["vcf_impute_glimpse"] }, "glimpse2/chunk": { "branch": "master", - "git_sha": "36cfa4c2a7e538832c50f40cb16d159e84cd3305", + "git_sha": "14ba46490cae3c78ed8e8f48d2c0f8f3be1e7c03", "installed_by": ["multiple_impute_glimpse2"] }, "glimpse2/ligate": { "branch": "master", - "git_sha": "36cfa4c2a7e538832c50f40cb16d159e84cd3305", + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", "installed_by": ["multiple_impute_glimpse2"] }, "glimpse2/phase": { "branch": "master", - "git_sha": "36cfa4c2a7e538832c50f40cb16d159e84cd3305", + "git_sha": "9c71d32e372650e8bb3e1fb15339017aad5e3f7f", "installed_by": ["multiple_impute_glimpse2"] }, "glimpse2/splitreference": { "branch": "master", - "git_sha": "36cfa4c2a7e538832c50f40cb16d159e84cd3305", + "git_sha": "fa12139827a18b324bd63fce654818586a8e9cc7", "installed_by": ["multiple_impute_glimpse2"] }, "multiqc": { @@ -92,43 +95,44 @@ }, "samtools/coverage": { "branch": "master", - "git_sha": "2fe9363ae3b3ab1c79f43dae9b1a4074694c57d6", - "installed_by": ["modules"] + "git_sha": "38afbe42f7db7f19c7a89607c0a71c68f3be3131", + "installed_by": ["modules"], + "patch": "modules/nf-core/samtools/coverage/samtools-coverage.diff" }, "samtools/faidx": { "branch": "master", - "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", + "git_sha": "aeb02a39d4c463598bfdcb2d964dbb7acbcf1298", "installed_by": ["modules"] }, "samtools/index": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "f4596fe0bdc096cf53ec4497e83defdb3a94ff62", "installed_by": ["modules"] }, "samtools/view": { "branch": "master", - "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", + "git_sha": "0bd7d2333a88483aa0476acea172e9f5f6dd83bb", "installed_by": ["modules"], "patch": "modules/nf-core/samtools/view/samtools-view.diff" }, "shapeit5/ligate": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", "installed_by": ["vcf_phase_shapeit5"] }, "shapeit5/phasecommon": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "3f5420aa22e00bd030a2556dfdffc9e164ec0ec5", "installed_by": ["vcf_phase_shapeit5"] }, "tabix/bgzip": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "09d3c8c29b31a2dfd610305b10550f0e1dbcd4a9", "installed_by": ["modules"] }, "tabix/tabix": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "git_sha": "9502adb23c0b97ed8e616bbbdfa73b4585aec9a1", "installed_by": ["modules"] } } @@ -137,32 +141,32 @@ "nf-core": { "multiple_impute_glimpse2": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", "installed_by": ["subworkflows"] }, - "vcf_impute_glimpse": { + "utils_nextflow_pipeline": { "branch": "master", - "git_sha": "74d79f1853c9ff2961e6061aad3c68d728d5c20d", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["subworkflows"] }, - "vcf_phase_shapeit5": { + "utils_nfcore_pipeline": { "branch": "master", - "git_sha": "dedc0e31087f3306101c38835d051bf49789445a", + "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["subworkflows"] }, - "utils_nextflow_pipeline": { + "utils_nfvalidation_plugin": { "branch": "master", "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", "installed_by": ["subworkflows"] }, - "utils_nfcore_pipeline": { + "vcf_impute_glimpse": { "branch": "master", - "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", + "git_sha": "8dab3bf2aaa912730419080e96d2a7d98911db48", "installed_by": ["subworkflows"] }, - "utils_nfvalidation_plugin": { + "vcf_phase_shapeit5": { "branch": "master", - "git_sha": "5caf7640a9ef1d18d765d55339be751bb0969dfa", + "git_sha": "cfd937a668919d948f6fcbf4218e79de50c2f36f", "installed_by": ["subworkflows"] } } diff --git a/modules/local/faitochr/main.nf b/modules/local/faitochr/main.nf new file mode 100644 index 00000000..9ae36d98 --- /dev/null +++ b/modules/local/faitochr/main.nf @@ -0,0 +1,49 @@ +process FAITOCHR { + tag "$meta.id" + label 'process_single' + + input: + tuple val(meta), path(fai), val(addchr) + + output: + tuple val(meta), path("*.txt"), emit: annot_chr + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + + """ + # Take the fai file and add the chr prefix to the chromosome names + if [ "${addchr}" = true ]; then + col1="" + col2="chr" + else + col1="chr" + col2="" + fi + awk -F'\t' '{print \$1}' ${fai} | \ + sed 's/chr//g' | \ + awk -v col1=\${col1} -v col2=\${col2} 'BEGIN {OFS=" "} {print col1\$1, col2\$1}' > ${prefix}.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + awk: \$(awk --version | grep -o 'GNU Awk [0-9.]*' | cut -d ' ' -f 3) + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + awk: \$(awk --version | grep -o 'GNU Awk [0-9.]*' | cut -d ' ' -f 3) + END_VERSIONS + """ +} diff --git a/modules/local/faitochr/tests/main.nf.test b/modules/local/faitochr/tests/main.nf.test new file mode 100644 index 00000000..1b066c5c --- /dev/null +++ b/modules/local/faitochr/tests/main.nf.test @@ -0,0 +1,57 @@ +nextflow_process { + + name "Test Process FAITOCHR" + script "../main.nf" + process "FAITOCHR" + + tag "modules" + tag "modules_local" + tag "faitochr" + + test("fai add chr") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/genome/genome.fasta.fai", checkIfExists: true), + true + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("fai remove chr") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file("https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/genome/genome.fasta.fai", checkIfExists: true), + false + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/local/faitochr/tests/main.nf.test.snap b/modules/local/faitochr/tests/main.nf.test.snap new file mode 100644 index 00000000..3a5c5379 --- /dev/null +++ b/modules/local/faitochr/tests/main.nf.test.snap @@ -0,0 +1,68 @@ +{ + "fai add chr": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.txt:md5,dc360653d0d1848e6cc01661dbff389c" + ] + ], + "1": [ + "versions.yml:md5,0d85e18b9c36aa2db49ad51930d9a5e6" + ], + "annot_chr": [ + [ + { + "id": "test" + }, + "test.txt:md5,dc360653d0d1848e6cc01661dbff389c" + ] + ], + "versions": [ + "versions.yml:md5,0d85e18b9c36aa2db49ad51930d9a5e6" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-08T17:33:55.801913" + }, + "fai remove chr": { + "content": [ + { + "0": [ + [ + { + "id": "test" + }, + "test.txt:md5,c8aa996df2a03384617fff85d911f401" + ] + ], + "1": [ + "versions.yml:md5,0d85e18b9c36aa2db49ad51930d9a5e6" + ], + "annot_chr": [ + [ + { + "id": "test" + }, + "test.txt:md5,c8aa996df2a03384617fff85d911f401" + ] + ], + "versions": [ + "versions.yml:md5,0d85e18b9c36aa2db49ad51930d9a5e6" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-08T17:34:01.901705" + } +} diff --git a/modules/local/faitochr/tests/tags.yml b/modules/local/faitochr/tests/tags.yml new file mode 100644 index 00000000..5de9b9a1 --- /dev/null +++ b/modules/local/faitochr/tests/tags.yml @@ -0,0 +1,2 @@ +faitochr: + - "modules/local/faitochr/**" diff --git a/modules/nf-core/bcftools/annotate/bcftools-annotate.diff b/modules/nf-core/bcftools/annotate/bcftools-annotate.diff new file mode 100644 index 00000000..79f915db --- /dev/null +++ b/modules/nf-core/bcftools/annotate/bcftools-annotate.diff @@ -0,0 +1,37 @@ +Changes in module 'nf-core/bcftools/annotate' +--- modules/nf-core/bcftools/annotate/main.nf ++++ modules/nf-core/bcftools/annotate/main.nf +@@ -8,7 +8,7 @@ + 'biocontainers/bcftools:1.18--h8b25389_0' }" + + input: +- tuple val(meta), path(input), path(index), path(annotations), path(annotations_index), path(header_lines) ++ tuple val(meta), path(input), path(index), path(annotations), path(annotations_index), path(header_lines), path(rename_chr) + + output: + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf +@@ -18,10 +18,11 @@ + task.ext.when == null || task.ext.when + + script: +- def args = task.ext.args ?: '' ++ def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" +- def header_file = header_lines ? "--header-lines ${header_lines}" : '' +- def annotations_file = annotations ? "--annotations ${annotations}" : '' ++ def header_file = header_lines ? "--header-lines ${header_lines}" : '' ++ def annotations_file = annotations ? "--annotations ${annotations}" : '' ++ def rename_chr_cmd = rename_chr ? "--rename-chrs ${rename_chr}" : '' + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : +@@ -34,6 +35,7 @@ + $args \\ + $annotations_file \\ + $header_file \\ ++ $rename_chr_cmd \\ + --output ${prefix}.${extension} \\ + --threads $task.cpus \\ + $input + +************************************************************ diff --git a/modules/nf-core/bcftools/annotate/environment.yml b/modules/nf-core/bcftools/annotate/environment.yml new file mode 100644 index 00000000..e0abc8d2 --- /dev/null +++ b/modules/nf-core/bcftools/annotate/environment.yml @@ -0,0 +1,7 @@ +name: bcftools_annotate +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bcftools=1.18 diff --git a/modules/nf-core/bcftools/annotate/main.nf b/modules/nf-core/bcftools/annotate/main.nf index 222f07d7..a65855ab 100644 --- a/modules/nf-core/bcftools/annotate/main.nf +++ b/modules/nf-core/bcftools/annotate/main.nf @@ -2,13 +2,13 @@ process BCFTOOLS_ANNOTATE { tag "$meta.id" label 'process_low' - conda "bioconda::bcftools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.17--haef29d1_0': - 'biocontainers/bcftools:1.17--haef29d1_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': + 'biocontainers/bcftools:1.18--h8b25389_0' }" input: - tuple val(meta), path(input), path(index), path(annotations), path(annotations_index), path(header_lines) + tuple val(meta), path(input), path(index), path(annotations), path(annotations_index), path(header_lines), path(rename_chr) output: tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf diff --git a/modules/nf-core/bcftools/annotate/meta.yml b/modules/nf-core/bcftools/annotate/meta.yml index 60f053ea..f3aa463b 100644 --- a/modules/nf-core/bcftools/annotate/meta.yml +++ b/modules/nf-core/bcftools/annotate/meta.yml @@ -13,7 +13,6 @@ tools: documentation: https://samtools.github.io/bcftools/bcftools.html#annotate doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] - input: - meta: type: map @@ -35,7 +34,6 @@ input: - header_lines: type: file description: Contains lines to append to the output VCF header - output: - meta: type: map @@ -50,7 +48,9 @@ output: type: file description: Compressed annotated VCF file pattern: "*{vcf,vcf.gz,bcf,bcf.gz}" - authors: - "@projectoriented" - "@ramprasadn" +maintainers: + - "@projectoriented" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/index/environment.yml b/modules/nf-core/bcftools/index/environment.yml new file mode 100644 index 00000000..bbee37ad --- /dev/null +++ b/modules/nf-core/bcftools/index/environment.yml @@ -0,0 +1,7 @@ +name: bcftools_index +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bcftools=1.18 diff --git a/modules/nf-core/bcftools/index/main.nf b/modules/nf-core/bcftools/index/main.nf index 43360aab..4cd0dcbb 100644 --- a/modules/nf-core/bcftools/index/main.nf +++ b/modules/nf-core/bcftools/index/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda "bioconda::bcftools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.17--haef29d1_0': - 'biocontainers/bcftools:1.17--haef29d1_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': + 'biocontainers/bcftools:1.18--h8b25389_0' }" input: tuple val(meta), path(vcf) @@ -34,4 +34,18 @@ process BCFTOOLS_INDEX { bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') END_VERSIONS """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--tsi") || args.contains("-t") ? "tbi" : + "csi" + """ + touch ${vcf}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ } diff --git a/modules/nf-core/bcftools/index/meta.yml b/modules/nf-core/bcftools/index/meta.yml index b883fa5f..fc340cbc 100644 --- a/modules/nf-core/bcftools/index/meta.yml +++ b/modules/nf-core/bcftools/index/meta.yml @@ -14,7 +14,6 @@ tools: tool_dev_url: https://github.com/samtools/bcftools doi: "10.1093/gigascience/giab008" licence: ["MIT", "GPL-3.0-or-later"] - input: - meta: type: map @@ -25,7 +24,6 @@ input: type: file description: VCF file (optionally GZIPPED) pattern: "*.{vcf,vcf.gz}" - output: - meta: type: map @@ -44,6 +42,7 @@ output: type: file description: Alternative VCF file index file for larger files (activated with -t parameter) pattern: "*.tbi" - authors: - "@jfy133" +maintainers: + - "@jfy133" diff --git a/modules/nf-core/bcftools/mpileup/bcftools-mpileup.diff b/modules/nf-core/bcftools/mpileup/bcftools-mpileup.diff new file mode 100644 index 00000000..a85d9cfd --- /dev/null +++ b/modules/nf-core/bcftools/mpileup/bcftools-mpileup.diff @@ -0,0 +1,38 @@ +Changes in module 'nf-core/bcftools/mpileup' +--- modules/nf-core/bcftools/mpileup/main.nf ++++ modules/nf-core/bcftools/mpileup/main.nf +@@ -8,8 +8,8 @@ + 'biocontainers/bcftools:1.18--h8b25389_0' }" + + input: +- tuple val(meta), path(bam), path(intervals) +- tuple val(meta2), path(fasta) ++ tuple val(meta), path(bam), path(target_m), path(target_c) ++ tuple val(meta2), path(fasta), path(fai) + val save_mpileup + + output: +@@ -29,7 +29,8 @@ + def prefix = task.ext.prefix ?: "${meta.id}" + def mpileup = save_mpileup ? "| tee ${prefix}.mpileup" : "" + def bgzip_mpileup = save_mpileup ? "bgzip ${prefix}.mpileup" : "" +- def intervals = intervals ? "-T ${intervals}" : "" ++ def target_m = target_m ? "-T ${target_m}" : "" ++ def target_c = target_c ? "-T ${target_c}" : "" + """ + echo "${meta.id}" > sample_name.list + +@@ -38,9 +39,9 @@ + --fasta-ref $fasta \\ + $args \\ + $bam \\ +- $intervals \\ ++ $target_m \\ + $mpileup \\ +- | bcftools call --output-type v $args2 \\ ++ | bcftools call --output-type v $args2 $target_c \\ + | bcftools reheader --samples sample_name.list \\ + | bcftools view --output-file ${prefix}.vcf.gz --output-type z $args3 + + +************************************************************ diff --git a/modules/nf-core/bcftools/mpileup/environment.yml b/modules/nf-core/bcftools/mpileup/environment.yml new file mode 100644 index 00000000..114390be --- /dev/null +++ b/modules/nf-core/bcftools/mpileup/environment.yml @@ -0,0 +1,7 @@ +name: bcftools_mpileup +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bcftools=1.18 diff --git a/modules/nf-core/bcftools/mpileup/main.nf b/modules/nf-core/bcftools/mpileup/main.nf new file mode 100644 index 00000000..48a567e5 --- /dev/null +++ b/modules/nf-core/bcftools/mpileup/main.nf @@ -0,0 +1,59 @@ +process BCFTOOLS_MPILEUP { + tag "$meta.id" + label 'process_medium' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': + 'biocontainers/bcftools:1.18--h8b25389_0' }" + + input: + tuple val(meta), path(bam), path(target_m), path(target_c) + tuple val(meta2), path(fasta), path(fai) + val save_mpileup + + output: + tuple val(meta), path("*vcf.gz") , emit: vcf + tuple val(meta), path("*vcf.gz.tbi") , emit: tbi + tuple val(meta), path("*stats.txt") , emit: stats + tuple val(meta), path("*.mpileup.gz"), emit: mpileup, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def args3 = task.ext.args3 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def mpileup = save_mpileup ? "| tee ${prefix}.mpileup" : "" + def bgzip_mpileup = save_mpileup ? "bgzip ${prefix}.mpileup" : "" + def target_m = target_m ? "-T ${target_m}" : "" + def target_c = target_c ? "-T ${target_c}" : "" + """ + echo "${meta.id}" > sample_name.list + + bcftools \\ + mpileup \\ + --fasta-ref $fasta \\ + $args \\ + $bam \\ + $target_m \\ + $mpileup \\ + | bcftools call --output-type v $args2 $target_c \\ + | bcftools reheader --samples sample_name.list \\ + | bcftools view --output-file ${prefix}.vcf.gz --output-type z $args3 + + $bgzip_mpileup + + tabix -p vcf -f ${prefix}.vcf.gz + + bcftools stats ${prefix}.vcf.gz > ${prefix}.bcftools_stats.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bcftools: \$(bcftools --version 2>&1 | head -n1 | sed 's/^.*bcftools //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/bcftools/mpileup/meta.yml b/modules/nf-core/bcftools/mpileup/meta.yml new file mode 100644 index 00000000..65410ddd --- /dev/null +++ b/modules/nf-core/bcftools/mpileup/meta.yml @@ -0,0 +1,70 @@ +name: bcftools_mpileup +description: Compresses VCF files +keywords: + - variant calling + - mpileup + - VCF +tools: + - mpileup: + description: | + Generates genotype likelihoods at each genomic position with coverage. + homepage: http://samtools.github.io/bcftools/bcftools.html + documentation: http://www.htslib.org/doc/bcftools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Input BAM file + pattern: "*.{bam}" + - intervals: + type: file + description: Input intervals file. A file (commonly '.bed') containing regions to subset + - meta: + type: map + description: | + Groovy Map containing information about the genome fasta, e.g. [ id: 'sarscov2' ] + - fasta: + type: file + description: FASTA reference file + pattern: "*.{fasta,fa}" + - save_mpileup: + type: boolean + description: Save mpileup file generated by bcftools mpileup +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - vcf: + type: file + description: VCF gzipped output file + pattern: "*.{vcf.gz}" + - tbi: + type: file + description: tabix index file + pattern: "*.{vcf.gz.tbi}" + - stats: + type: file + description: Text output file containing stats + pattern: "*{stats.txt}" + - mpileup: + type: file + description: mpileup gzipped output for all positions + pattern: "{*.mpileup.gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" +maintainers: + - "@joseespinosa" + - "@drpatelh" diff --git a/modules/nf-core/bcftools/mpileup/tests/main.nf.test b/modules/nf-core/bcftools/mpileup/tests/main.nf.test new file mode 100644 index 00000000..6478bbc2 --- /dev/null +++ b/modules/nf-core/bcftools/mpileup/tests/main.nf.test @@ -0,0 +1,116 @@ +nextflow_process { + + name "Test Process BCFTOOLS_MPILEUP" + script "../main.nf" + process "BCFTOOLS_MPILEUP" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/mpileup" + + config "./nextflow.config" + + test("sarscov2 - [bam, []], fasta, false") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true), + [] + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.tbi, + process.out.stats, + process.out.mpileup, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [bam, []], fasta, true") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true), + [] + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + input[2] = true + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.tbi, + process.out.stats, + process.out.mpileup, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [bam, bed], fasta, false") { + + when { + process { + """ + input[0] = [ + [ id:'test' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_paired_end_sorted_bam'], checkIfExists: true), + file(params.test_data['sarscov2']['genome']['test_bed'], checkIfExists: true) + ] + input[1] = [ + [ id:'sarscov2' ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) + ] + input[2] = false + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.tbi, + process.out.stats, + process.out.mpileup, + process.out.versions + ).match() } + ) + } + + } + +} diff --git a/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap b/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap new file mode 100644 index 00000000..ef80ab1b --- /dev/null +++ b/modules/nf-core/bcftools/mpileup/tests/main.nf.test.snap @@ -0,0 +1,112 @@ +{ + "sarscov2 - [bam, []], fasta, true": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,0f2f2c8488e97e7f13979380d5d3b6b5" + ] + ], + [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,34cb2eeb73f4d2b98218acecebd92704" + ] + ], + [ + [ + { + "id": "test" + }, + "test.bcftools_stats.txt:md5,a988fbcd2ea5d1ce30970dcb60a77ed7" + ] + ], + [ + [ + { + "id": "test" + }, + "test.mpileup.gz:md5,73b4a00398bddab2cd065b40d17ca4dc" + ] + ], + [ + "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + ] + ], + "timestamp": "2023-11-29T14:11:54.549517279" + }, + "sarscov2 - [bam, bed], fasta, false": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,687244dbf71d05b3b973ab08ecf05310" + ] + ], + [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,3785df15f3d7faf35f3ad70d167a50f7" + ] + ], + [ + [ + { + "id": "test" + }, + "test.bcftools_stats.txt:md5,f8c5ab149c4bf0e5f51c518346cb87b5" + ] + ], + [ + + ], + [ + "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + ] + ], + "timestamp": "2023-11-29T14:12:00.865439661" + }, + "sarscov2 - [bam, []], fasta, false": { + "content": [ + [ + [ + { + "id": "test" + }, + "test.vcf.gz:md5,0f2f2c8488e97e7f13979380d5d3b6b5" + ] + ], + [ + [ + { + "id": "test" + }, + "test.vcf.gz.tbi:md5,34cb2eeb73f4d2b98218acecebd92704" + ] + ], + [ + [ + { + "id": "test" + }, + "test.bcftools_stats.txt:md5,a988fbcd2ea5d1ce30970dcb60a77ed7" + ] + ], + [ + + ], + [ + "versions.yml:md5,e09c59d941374bb293aadc36e2f29dbf" + ] + ], + "timestamp": "2023-11-29T14:11:47.814900494" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/mpileup/tests/nextflow.config b/modules/nf-core/bcftools/mpileup/tests/nextflow.config new file mode 100644 index 00000000..a7ba19fe --- /dev/null +++ b/modules/nf-core/bcftools/mpileup/tests/nextflow.config @@ -0,0 +1,4 @@ +process { + ext.args2 = '--no-version --ploidy 1 --multiallelic-caller' + ext.args3 = '--no-version' +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/mpileup/tests/tags.yml b/modules/nf-core/bcftools/mpileup/tests/tags.yml new file mode 100644 index 00000000..07b91f98 --- /dev/null +++ b/modules/nf-core/bcftools/mpileup/tests/tags.yml @@ -0,0 +1,2 @@ +bcftools/mpileup: + - "modules/nf-core/bcftools/mpileup/**" diff --git a/modules/nf-core/fastqc/environment.yml b/modules/nf-core/bcftools/norm/environment.yml similarity index 57% rename from modules/nf-core/fastqc/environment.yml rename to modules/nf-core/bcftools/norm/environment.yml index 1787b38a..fe80e4e7 100644 --- a/modules/nf-core/fastqc/environment.yml +++ b/modules/nf-core/bcftools/norm/environment.yml @@ -1,7 +1,7 @@ -name: fastqc +name: bcftools_norm channels: - conda-forge - bioconda - defaults dependencies: - - bioconda::fastqc=0.12.1 + - bioconda::bcftools=1.18 diff --git a/modules/nf-core/bcftools/norm/main.nf b/modules/nf-core/bcftools/norm/main.nf index 608f20a1..47d3dab1 100644 --- a/modules/nf-core/bcftools/norm/main.nf +++ b/modules/nf-core/bcftools/norm/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_NORM { tag "$meta.id" label 'process_medium' - conda "bioconda::bcftools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.17--haef29d1_0': - 'biocontainers/bcftools:1.17--haef29d1_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': + 'biocontainers/bcftools:1.18--h8b25389_0' }" input: tuple val(meta), path(vcf), path(tbi) diff --git a/modules/nf-core/bcftools/norm/meta.yml b/modules/nf-core/bcftools/norm/meta.yml index 33ebea36..1f3e1b62 100644 --- a/modules/nf-core/bcftools/norm/meta.yml +++ b/modules/nf-core/bcftools/norm/meta.yml @@ -56,3 +56,6 @@ output: authors: - "@abhi18av" - "@ramprasadn" +maintainers: + - "@abhi18av" + - "@ramprasadn" diff --git a/modules/nf-core/bcftools/query/environment.yml b/modules/nf-core/bcftools/query/environment.yml new file mode 100644 index 00000000..4f9661ca --- /dev/null +++ b/modules/nf-core/bcftools/query/environment.yml @@ -0,0 +1,7 @@ +name: bcftools_query +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bcftools=1.18 diff --git a/modules/nf-core/bcftools/query/main.nf b/modules/nf-core/bcftools/query/main.nf index bff3654c..e9e73a6a 100644 --- a/modules/nf-core/bcftools/query/main.nf +++ b/modules/nf-core/bcftools/query/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_QUERY { tag "$meta.id" label 'process_single' - conda "bioconda::bcftools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.17--haef29d1_0': - 'biocontainers/bcftools:1.17--haef29d1_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': + 'biocontainers/bcftools:1.18--h8b25389_0' }" input: tuple val(meta), path(vcf), path(tbi) diff --git a/modules/nf-core/bcftools/query/meta.yml b/modules/nf-core/bcftools/query/meta.yml index 67302ced..303ef610 100644 --- a/modules/nf-core/bcftools/query/meta.yml +++ b/modules/nf-core/bcftools/query/meta.yml @@ -58,3 +58,6 @@ output: authors: - "@abhi18av" - "@drpatelh" +maintainers: + - "@abhi18av" + - "@drpatelh" diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test b/modules/nf-core/bcftools/query/tests/main.nf.test new file mode 100644 index 00000000..e9ea5a9d --- /dev/null +++ b/modules/nf-core/bcftools/query/tests/main.nf.test @@ -0,0 +1,101 @@ +nextflow_process { + + name "Test Process BCFTOOLS_QUERY" + script "../main.nf" + process "BCFTOOLS_QUERY" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/query" + + config "./nextflow.config" + + test("sarscov2 - [vcf, tbi], [], [], []") { + + when { + process { + """ + input[0] = [ + [ id:'out' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.output, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], vcf, tsv, []") { + + when { + process { + """ + input[0] = [ + [ id:'out' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true) + ] + input[1] = file(params.test_data['sarscov2']['illumina']['test3_vcf_gz'], checkIfExists: true) + input[2] = file(params.test_data['sarscov2']['illumina']['test2_vcf_targets_tsv_gz'], checkIfExists: true) + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.output, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - stub") { + + when { + process { + """ + input[0] = [ + [ id:'out' ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.output[0][1]).name, + process.out.versions + ).match() } + ) + } + + } + +} diff --git a/modules/nf-core/bcftools/query/tests/main.nf.test.snap b/modules/nf-core/bcftools/query/tests/main.nf.test.snap new file mode 100644 index 00000000..a19f2053 --- /dev/null +++ b/modules/nf-core/bcftools/query/tests/main.nf.test.snap @@ -0,0 +1,43 @@ +{ + "sarscov2 - [vcf, tbi], vcf, tsv, []": { + "content": [ + [ + [ + { + "id": "out" + }, + "out.txt:md5,75a6bd0084e2e1838cf7baba11b99d19" + ] + ], + [ + "versions.yml:md5,b40206d5437ce4b044d15c47ddd93d8e" + ] + ], + "timestamp": "2023-11-29T14:21:05.191946862" + }, + "sarscov2 - [vcf, tbi], [], [], [] - stub": { + "content": [ + "out.txt", + [ + "versions.yml:md5,b40206d5437ce4b044d15c47ddd93d8e" + ] + ], + "timestamp": "2023-11-29T14:21:11.169603542" + }, + "sarscov2 - [vcf, tbi], [], [], []": { + "content": [ + [ + [ + { + "id": "out" + }, + "out.txt:md5,87a2ab194e1ee3219b44e58429ec3307" + ] + ], + [ + "versions.yml:md5,b40206d5437ce4b044d15c47ddd93d8e" + ] + ], + "timestamp": "2023-11-29T14:20:59.335041418" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/query/tests/nextflow.config b/modules/nf-core/bcftools/query/tests/nextflow.config new file mode 100644 index 00000000..da81c2a0 --- /dev/null +++ b/modules/nf-core/bcftools/query/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = "-f '%CHROM %POS %REF %ALT[%SAMPLE=%GT]'" +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/query/tests/tags.yml b/modules/nf-core/bcftools/query/tests/tags.yml new file mode 100644 index 00000000..fb9455cb --- /dev/null +++ b/modules/nf-core/bcftools/query/tests/tags.yml @@ -0,0 +1,2 @@ +bcftools/query: + - "modules/nf-core/bcftools/query/**" diff --git a/modules/nf-core/bcftools/view/environment.yml b/modules/nf-core/bcftools/view/environment.yml new file mode 100644 index 00000000..8937c6da --- /dev/null +++ b/modules/nf-core/bcftools/view/environment.yml @@ -0,0 +1,7 @@ +name: bcftools_view +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bcftools=1.18 diff --git a/modules/nf-core/bcftools/view/main.nf b/modules/nf-core/bcftools/view/main.nf index 86f807d3..5237adc8 100644 --- a/modules/nf-core/bcftools/view/main.nf +++ b/modules/nf-core/bcftools/view/main.nf @@ -2,10 +2,10 @@ process BCFTOOLS_VIEW { tag "$meta.id" label 'process_medium' - conda "bioconda::bcftools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bcftools:1.17--haef29d1_0': - 'biocontainers/bcftools:1.17--haef29d1_0' }" + 'https://depot.galaxyproject.org/singularity/bcftools:1.18--h8b25389_0': + 'biocontainers/bcftools:1.18--h8b25389_0' }" input: tuple val(meta), path(vcf), path(index) @@ -14,8 +14,8 @@ process BCFTOOLS_VIEW { path(samples) output: - tuple val(meta), path("*.gz") , emit: vcf - path "versions.yml" , emit: versions + tuple val(meta), path("*.{vcf,vcf.gz,bcf,bcf.gz}"), emit: vcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -26,9 +26,14 @@ process BCFTOOLS_VIEW { def regions_file = regions ? "--regions-file ${regions}" : "" def targets_file = targets ? "--targets-file ${targets}" : "" def samples_file = samples ? "--samples-file ${samples}" : "" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" """ bcftools view \\ - --output ${prefix}.vcf.gz \\ + --output ${prefix}.${extension} \\ ${regions_file} \\ ${targets_file} \\ ${samples_file} \\ @@ -43,9 +48,15 @@ process BCFTOOLS_VIEW { """ stub: + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-type b") || args.contains("-Ob") ? "bcf.gz" : + args.contains("--output-type u") || args.contains("-Ou") ? "bcf" : + args.contains("--output-type z") || args.contains("-Oz") ? "vcf.gz" : + args.contains("--output-type v") || args.contains("-Ov") ? "vcf" : + "vcf" """ - touch ${prefix}.vcf.gz + touch ${prefix}.${extension} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/bcftools/view/meta.yml b/modules/nf-core/bcftools/view/meta.yml index 326fd1fa..6baa34a6 100644 --- a/modules/nf-core/bcftools/view/meta.yml +++ b/modules/nf-core/bcftools/view/meta.yml @@ -5,7 +5,6 @@ keywords: - view - bcftools - VCF - tools: - view: description: | @@ -54,10 +53,12 @@ output: - vcf: type: file description: VCF normalized output file - pattern: "*.{vcf.gz}" + pattern: "*.{vcf,vcf.gz,bcf,bcf.gz}" - versions: type: file description: File containing software versions pattern: "versions.yml" authors: - "@abhi18av" +maintainers: + - "@abhi18av" diff --git a/modules/nf-core/bcftools/view/tests/main.nf.test b/modules/nf-core/bcftools/view/tests/main.nf.test new file mode 100644 index 00000000..c285674c --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/main.nf.test @@ -0,0 +1,103 @@ +nextflow_process { + + name "Test Process BCFTOOLS_VIEW" + script "../main.nf" + process "BCFTOOLS_VIEW" + + tag "modules" + tag "modules_nfcore" + tag "bcftools" + tag "bcftools/view" + + config "./nextflow.config" + + test("sarscov2 - [vcf, tbi], [], [], []") { + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], vcf, tsv, []") { + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true) + ] + input[1] = file(params.test_data['sarscov2']['illumina']['test3_vcf_gz'], checkIfExists: true) + input[2] = file(params.test_data['sarscov2']['illumina']['test2_vcf_targets_tsv_gz'], checkIfExists: true) + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.vcf, + process.out.versions + ).match() } + ) + } + + } + + test("sarscov2 - [vcf, tbi], [], [], [] - stub") { + + options "-stub" + + when { + process { + """ + input[0] = [ + [ id:'out', single_end:false ], // meta map + file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true), + file(params.test_data['sarscov2']['illumina']['test_vcf_gz_tbi'], checkIfExists: true) + ] + input[1] = [] + input[2] = [] + input[3] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + file(process.out.vcf[0][1]).name, + process.out.versions + ).match() } + ) + } + + } + +} diff --git a/modules/nf-core/bcftools/view/tests/main.nf.test.snap b/modules/nf-core/bcftools/view/tests/main.nf.test.snap new file mode 100644 index 00000000..b59be932 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/main.nf.test.snap @@ -0,0 +1,45 @@ +{ + "sarscov2 - [vcf, tbi], vcf, tsv, []": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out.vcf:md5,1bcbd0eff25d316ba915d06463aab17b" + ] + ], + [ + "versions.yml:md5,106d119dde844ec7fee1cdd30828bcdc" + ] + ], + "timestamp": "2024-02-05T17:12:20.799849895" + }, + "sarscov2 - [vcf, tbi], [], [], [] - stub": { + "content": [ + "out.vcf", + [ + "versions.yml:md5,106d119dde844ec7fee1cdd30828bcdc" + ] + ], + "timestamp": "2024-02-05T16:53:34.652746985" + }, + "sarscov2 - [vcf, tbi], [], [], []": { + "content": [ + [ + [ + { + "id": "out", + "single_end": false + }, + "out.vcf:md5,8e722884ffb75155212a3fc053918766" + ] + ], + [ + "versions.yml:md5,106d119dde844ec7fee1cdd30828bcdc" + ] + ], + "timestamp": "2024-02-05T17:12:14.247465409" + } +} \ No newline at end of file diff --git a/modules/nf-core/bcftools/view/tests/nextflow.config b/modules/nf-core/bcftools/view/tests/nextflow.config new file mode 100644 index 00000000..932e3ba6 --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/nextflow.config @@ -0,0 +1,3 @@ +process { + ext.args = '--no-version --output-type v' +} diff --git a/modules/nf-core/bcftools/view/tests/tags.yml b/modules/nf-core/bcftools/view/tests/tags.yml new file mode 100644 index 00000000..43b1f0aa --- /dev/null +++ b/modules/nf-core/bcftools/view/tests/tags.yml @@ -0,0 +1,2 @@ +bcftools/view: + - "modules/nf-core/bcftools/view/**" diff --git a/modules/nf-core/bedtools/makewindows/environment.yml b/modules/nf-core/bedtools/makewindows/environment.yml new file mode 100644 index 00000000..0de3c15d --- /dev/null +++ b/modules/nf-core/bedtools/makewindows/environment.yml @@ -0,0 +1,7 @@ +name: bedtools_makewindows +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::bedtools=2.31.1 diff --git a/modules/nf-core/bedtools/makewindows/main.nf b/modules/nf-core/bedtools/makewindows/main.nf index 96dcff15..36d6cac2 100644 --- a/modules/nf-core/bedtools/makewindows/main.nf +++ b/modules/nf-core/bedtools/makewindows/main.nf @@ -2,10 +2,10 @@ process BEDTOOLS_MAKEWINDOWS { tag "$meta.id" label 'process_single' - conda "bioconda::bedtools=2.30.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--h7d7f7ad_1' : - 'biocontainers/bedtools:2.30.0--h7d7f7ad_1' }" + 'https://depot.galaxyproject.org/singularity/bedtools:2.31.1--hf5e1c6e_0' : + 'biocontainers/bedtools:2.31.1--hf5e1c6e_0' }" input: tuple val(meta), path(regions) diff --git a/modules/nf-core/bedtools/makewindows/meta.yml b/modules/nf-core/bedtools/makewindows/meta.yml index f543da69..f89d7175 100644 --- a/modules/nf-core/bedtools/makewindows/meta.yml +++ b/modules/nf-core/bedtools/makewindows/meta.yml @@ -39,3 +39,6 @@ output: authors: - "@kevbrick" - "@nvnieuwk" +maintainers: + - "@kevbrick" + - "@nvnieuwk" diff --git a/modules/nf-core/custom/dumpsoftwareversions/environment.yml b/modules/nf-core/custom/dumpsoftwareversions/environment.yml new file mode 100644 index 00000000..b48ced26 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/environment.yml @@ -0,0 +1,7 @@ +name: custom_dumpsoftwareversions +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::multiqc=1.20 diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index c9d014b1..105f9265 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -2,10 +2,10 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_single' // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container - conda "bioconda::multiqc=1.15" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.15--pyhdfd78af_0' : - 'biocontainers/multiqc:1.15--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.20--pyhdfd78af_0' : + 'biocontainers/multiqc:1.20--pyhdfd78af_0' }" input: path versions diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index c32657de..5f15a5fd 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -1,4 +1,4 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/yaml-schema.json +# yaml-language-server: $schema=https://raw.githubusercontent.com/nf-core/modules/master/modules/meta-schema.json name: custom_dumpsoftwareversions description: Custom module used to dump software versions within the nf-core pipeline template keywords: @@ -16,7 +16,6 @@ input: type: file description: YML file containing software versions pattern: "*.yml" - output: - yml: type: file @@ -30,7 +29,9 @@ output: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@drpatelh" - "@grst" +maintainers: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py index e55b8d43..da033408 100644 --- a/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py +++ b/modules/nf-core/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -4,11 +4,10 @@ """Provide functions to merge multiple versions.yml files.""" +import yaml import platform from textwrap import dedent -import yaml - def _make_versions_html(versions): """Generate a tabular HTML output of all versions for MultiQC.""" diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test new file mode 100644 index 00000000..b1e1630b --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test @@ -0,0 +1,43 @@ +nextflow_process { + + name "Test Process CUSTOM_DUMPSOFTWAREVERSIONS" + script "../main.nf" + process "CUSTOM_DUMPSOFTWAREVERSIONS" + tag "modules" + tag "modules_nfcore" + tag "custom" + tag "dumpsoftwareversions" + tag "custom/dumpsoftwareversions" + + test("Should run without failures") { + when { + process { + """ + def tool1_version = ''' + TOOL1: + tool1: 0.11.9 + '''.stripIndent() + + def tool2_version = ''' + TOOL2: + tool2: 1.9 + '''.stripIndent() + + input[0] = Channel.of(tool1_version, tool2_version).collectFile() + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot( + process.out.versions, + file(process.out.mqc_yml[0]).readLines()[0..10], + file(process.out.yml[0]).readLines()[0..7] + ).match() + } + ) + } + } +} diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap new file mode 100644 index 00000000..5f59a936 --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/main.nf.test.snap @@ -0,0 +1,33 @@ +{ + "Should run without failures": { + "content": [ + [ + "versions.yml:md5,76d454d92244589d32455833f7c1ba6d" + ], + [ + "data: \"\\n\\n \\n \\n \\n \\n \\n \\n \\n\\", + " \\n\\n\\n \\n \\n\\", + " \\ \\n\\n\\n\\n \\n \\", + " \\ \\n \\n\\n\\n\\n\\", + " \\n\\n \\n \\n\\", + " \\ \\n\\n\\n\\n\\n\\n \\n\\", + " \\ \\n \\n\\n\\n\\n\\", + " \\n\\n \\n \\n\\" + ], + [ + "CUSTOM_DUMPSOFTWAREVERSIONS:", + " python: 3.11.7", + " yaml: 5.4.1", + "TOOL1:", + " tool1: 0.11.9", + "TOOL2:", + " tool2: '1.9'", + "Workflow:" + ] + ], + "timestamp": "2024-01-09T23:01:18.710682" + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml new file mode 100644 index 00000000..405aa24a --- /dev/null +++ b/modules/nf-core/custom/dumpsoftwareversions/tests/tags.yml @@ -0,0 +1,2 @@ +custom/dumpsoftwareversions: + - modules/nf-core/custom/dumpsoftwareversions/** diff --git a/modules/nf-core/fastqc/main.nf b/modules/nf-core/fastqc/main.nf deleted file mode 100644 index 9e19a74c..00000000 --- a/modules/nf-core/fastqc/main.nf +++ /dev/null @@ -1,55 +0,0 @@ -process FASTQC { - tag "$meta.id" - label 'process_medium' - - conda "${moduleDir}/environment.yml" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/fastqc:0.12.1--hdfd78af_0' : - 'biocontainers/fastqc:0.12.1--hdfd78af_0' }" - - input: - tuple val(meta), path(reads) - - output: - tuple val(meta), path("*.html"), emit: html - tuple val(meta), path("*.zip") , emit: zip - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - // Make list of old name and new name pairs to use for renaming in the bash while loop - def old_new_pairs = reads instanceof Path || reads.size() == 1 ? [[ reads, "${prefix}.${reads.extension}" ]] : reads.withIndex().collect { entry, index -> [ entry, "${prefix}_${index + 1}.${entry.extension}" ] } - def rename_to = old_new_pairs*.join(' ').join(' ') - def renamed_files = old_new_pairs.collect{ old_name, new_name -> new_name }.join(' ') - """ - printf "%s %s\\n" $rename_to | while read old_name new_name; do - [ -f "\${new_name}" ] || ln -s \$old_name \$new_name - done - - fastqc \\ - $args \\ - --threads $task.cpus \\ - $renamed_files - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}" - """ - touch ${prefix}.html - touch ${prefix}.zip - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - fastqc: \$( fastqc --version | sed '/FastQC v/!d; s/.*v//' ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/fastqc/meta.yml b/modules/nf-core/fastqc/meta.yml deleted file mode 100644 index ee5507e0..00000000 --- a/modules/nf-core/fastqc/meta.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: fastqc -description: Run FastQC on sequenced reads -keywords: - - quality control - - qc - - adapters - - fastq -tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ["GPL-2.0-only"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" -maintainers: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" diff --git a/modules/nf-core/fastqc/tests/main.nf.test b/modules/nf-core/fastqc/tests/main.nf.test deleted file mode 100644 index 70edae4d..00000000 --- a/modules/nf-core/fastqc/tests/main.nf.test +++ /dev/null @@ -1,212 +0,0 @@ -nextflow_process { - - name "Test Process FASTQC" - script "../main.nf" - process "FASTQC" - - tag "modules" - tag "modules_nfcore" - tag "fastqc" - - test("sarscov2 single-end [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [ id: 'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - - // NOTE The report contains the date inside it, which means that the md5sum is stable per day, but not longer than that. So you can't md5sum it. - // looks like this:
    Mon 2 Oct 2023
    test.gz
    - // https://github.com/nf-core/modules/pull/3903#issuecomment-1743620039 - - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_single") } - ) - } - } - - test("sarscov2 paired-end [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("") }, - { assert path(process.out.html[0][1][1]).text.contains("") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_paired") } - ) - } - } - - test("sarscov2 interleaved [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_interleaved") } - ) - } - } - - test("sarscov2 paired-end [bam]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - - { assert process.out.html[0][1] ==~ ".*/test_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/test_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_bam") } - ) - } - } - - test("sarscov2 multiple [fastq]") { - - when { - process { - """ - input[0] = Channel.of([ - [id: 'test', single_end: false], // meta map - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_2.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_1.fastq.gz', checkIfExists: true), - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test2_2.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - - { assert process.out.html[0][1][0] ==~ ".*/test_1_fastqc.html" }, - { assert process.out.html[0][1][1] ==~ ".*/test_2_fastqc.html" }, - { assert process.out.html[0][1][2] ==~ ".*/test_3_fastqc.html" }, - { assert process.out.html[0][1][3] ==~ ".*/test_4_fastqc.html" }, - { assert process.out.zip[0][1][0] ==~ ".*/test_1_fastqc.zip" }, - { assert process.out.zip[0][1][1] ==~ ".*/test_2_fastqc.zip" }, - { assert process.out.zip[0][1][2] ==~ ".*/test_3_fastqc.zip" }, - { assert process.out.zip[0][1][3] ==~ ".*/test_4_fastqc.zip" }, - { assert path(process.out.html[0][1][0]).text.contains("") }, - { assert path(process.out.html[0][1][1]).text.contains("") }, - { assert path(process.out.html[0][1][2]).text.contains("") }, - { assert path(process.out.html[0][1][3]).text.contains("") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_multiple") } - ) - } - } - - test("sarscov2 custom_prefix") { - - when { - process { - """ - input[0] = Channel.of([ - [ id:'mysample', single_end:true ], // meta map - file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - - { assert process.out.html[0][1] ==~ ".*/mysample_fastqc.html" }, - { assert process.out.zip[0][1] ==~ ".*/mysample_fastqc.zip" }, - { assert path(process.out.html[0][1]).text.contains("") }, - - { assert snapshot(process.out.versions).match("fastqc_versions_custom_prefix") } - ) - } - } - - test("sarscov2 single-end [fastq] - stub") { - - options "-stub" - - when { - process { - """ - input[0] = Channel.of([ - [ id: 'test', single_end:true ], - [ file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/fastq/test_1.fastq.gz', checkIfExists: true) ] - ]) - """ - } - } - - then { - assertAll ( - { assert process.success }, - { assert snapshot(process.out.html.collect { file(it[1]).getName() } + - process.out.zip.collect { file(it[1]).getName() } + - process.out.versions ).match("fastqc_stub") } - ) - } - } - -} diff --git a/modules/nf-core/fastqc/tests/main.nf.test.snap b/modules/nf-core/fastqc/tests/main.nf.test.snap deleted file mode 100644 index 86f7c311..00000000 --- a/modules/nf-core/fastqc/tests/main.nf.test.snap +++ /dev/null @@ -1,88 +0,0 @@ -{ - "fastqc_versions_interleaved": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-01-31T17:40:07.293713" - }, - "fastqc_stub": { - "content": [ - [ - "test.html", - "test.zip", - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-01-31T17:31:01.425198" - }, - "fastqc_versions_multiple": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-01-31T17:40:55.797907" - }, - "fastqc_versions_bam": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-01-31T17:40:26.795862" - }, - "fastqc_versions_single": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-01-31T17:39:27.043675" - }, - "fastqc_versions_paired": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-01-31T17:39:47.584191" - }, - "fastqc_versions_custom_prefix": { - "content": [ - [ - "versions.yml:md5,e1cc25ca8af856014824abd842e93978" - ] - ], - "meta": { - "nf-test": "0.8.4", - "nextflow": "23.10.1" - }, - "timestamp": "2024-01-31T17:41:14.576531" - } -} \ No newline at end of file diff --git a/modules/nf-core/fastqc/tests/tags.yml b/modules/nf-core/fastqc/tests/tags.yml deleted file mode 100644 index 7834294b..00000000 --- a/modules/nf-core/fastqc/tests/tags.yml +++ /dev/null @@ -1,2 +0,0 @@ -fastqc: - - modules/nf-core/fastqc/** diff --git a/modules/nf-core/glimpse/chunk/environment.yml b/modules/nf-core/glimpse/chunk/environment.yml new file mode 100644 index 00000000..8d71aa91 --- /dev/null +++ b/modules/nf-core/glimpse/chunk/environment.yml @@ -0,0 +1,7 @@ +name: glimpse_chunk +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::glimpse-bio=1.1.1 diff --git a/modules/nf-core/glimpse/chunk/main.nf b/modules/nf-core/glimpse/chunk/main.nf index f2ffed2f..94779846 100644 --- a/modules/nf-core/glimpse/chunk/main.nf +++ b/modules/nf-core/glimpse/chunk/main.nf @@ -2,7 +2,7 @@ process GLIMPSE_CHUNK { tag "$meta.id" label 'process_medium' - conda "bioconda::glimpse-bio=1.1.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/glimpse-bio:1.1.1--h2ce4488_2': 'biocontainers/glimpse-bio:1.1.1--hce55b13_1' }" @@ -31,7 +31,19 @@ process GLIMPSE_CHUNK { cat <<-END_VERSIONS > versions.yml "${task.process}": - glimpse: "\$(GLIMPSE_phase --help | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]')" + glimpse: "\$(GLIMPSE_chunk --help | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]')" + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: "" + """ + touch ${prefix}.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + glimpse: "\$(GLIMPSE_chunk --help | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]')" END_VERSIONS """ } diff --git a/modules/nf-core/glimpse/chunk/meta.yml b/modules/nf-core/glimpse/chunk/meta.yml index 9ac840a6..65fa6218 100644 --- a/modules/nf-core/glimpse/chunk/meta.yml +++ b/modules/nf-core/glimpse/chunk/meta.yml @@ -12,21 +12,18 @@ tools: tool_dev_url: "https://github.com/odelaneau/GLIMPSE" doi: "10.1038/s41588-020-00756-0" licence: "['MIT']" - input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - input: type: file description: | Target dataset in VCF/BCF format defined at all variable positions. The file could possibly be without GT field (for efficiency reasons a file containing only the positions is recommended). pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - - region: type: string description: | @@ -38,16 +35,15 @@ output: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - versions: type: file description: File containing software versions pattern: "versions.yml" - - txt: type: file description: Tab delimited output txt file containing buffer and imputation regions. pattern: "*.{txt}" - authors: - "@louislenezet" +maintainers: + - "@louislenezet" diff --git a/modules/nf-core/glimpse/chunk/tests/main.nf.test b/modules/nf-core/glimpse/chunk/tests/main.nf.test new file mode 100644 index 00000000..4c278af1 --- /dev/null +++ b/modules/nf-core/glimpse/chunk/tests/main.nf.test @@ -0,0 +1,36 @@ +nextflow_process { + + name "Test Process GLIMPSE_CHUNK" + script "../main.nf" + process "GLIMPSE_CHUNK" + tag "glimpse" + tag "glimpse/chunk" + tag "modules_nfcore" + tag "modules" + + test("Should run without failures") { + config "modules/nf-core/glimpse/chunk/tests/nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'input' ], // meta map + file(params.test_data['homo_sapiens']['genome']['mills_and_1000g_indels_21_vcf_gz'], checkIfExists: true), + file(params.test_data['homo_sapiens']['genome']['mills_and_1000g_indels_21_vcf_gz_tbi'], checkIfExists: true), + "chr21" + ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/glimpse/chunk/tests/main.nf.test.snap b/modules/nf-core/glimpse/chunk/tests/main.nf.test.snap new file mode 100644 index 00000000..0490a8e4 --- /dev/null +++ b/modules/nf-core/glimpse/chunk/tests/main.nf.test.snap @@ -0,0 +1,31 @@ +{ + "Should run without failures": { + "content": [ + { + "0": [ + [ + { + "id": "input" + }, + "input.txt:md5,9e5562b3f94857b8189b59849ce65cfb" + ] + ], + "1": [ + "versions.yml:md5,a523ef8d6391ddeff47bfd30b606d628" + ], + "chunk_chr": [ + [ + { + "id": "input" + }, + "input.txt:md5,9e5562b3f94857b8189b59849ce65cfb" + ] + ], + "versions": [ + "versions.yml:md5,a523ef8d6391ddeff47bfd30b606d628" + ] + } + ], + "timestamp": "2023-10-16T15:55:52.457257547" + } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse/chunk/tests/nextflow.config b/modules/nf-core/glimpse/chunk/tests/nextflow.config new file mode 100644 index 00000000..c945152e --- /dev/null +++ b/modules/nf-core/glimpse/chunk/tests/nextflow.config @@ -0,0 +1,9 @@ +process { + withName: GLIMPSE_CHUNK { + ext.args = [ + "--window-size 2000000", + "--buffer-size 200000" + ].join(' ') + ext.prefix = { "${meta.id}" } + } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse/chunk/tests/tags.yml b/modules/nf-core/glimpse/chunk/tests/tags.yml new file mode 100644 index 00000000..bd846dfd --- /dev/null +++ b/modules/nf-core/glimpse/chunk/tests/tags.yml @@ -0,0 +1,2 @@ +glimpse/chunk: + - modules/nf-core/glimpse/chunk/** diff --git a/modules/nf-core/glimpse/ligate/environment.yml b/modules/nf-core/glimpse/ligate/environment.yml new file mode 100644 index 00000000..0f9e9a33 --- /dev/null +++ b/modules/nf-core/glimpse/ligate/environment.yml @@ -0,0 +1,7 @@ +name: glimpse_ligate +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::glimpse-bio=1.1.1 diff --git a/modules/nf-core/glimpse/ligate/main.nf b/modules/nf-core/glimpse/ligate/main.nf index f9775bbf..65425fd5 100644 --- a/modules/nf-core/glimpse/ligate/main.nf +++ b/modules/nf-core/glimpse/ligate/main.nf @@ -2,7 +2,7 @@ process GLIMPSE_LIGATE { tag "$meta.id" label 'process_low' - conda "bioconda::glimpse-bio=1.1.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/glimpse-bio:1.1.1--hce55b13_1': 'biocontainers/glimpse-bio:1.1.1--hce55b13_1' }" diff --git a/modules/nf-core/glimpse/ligate/meta.yml b/modules/nf-core/glimpse/ligate/meta.yml index 9a2a8daa..da6066ad 100644 --- a/modules/nf-core/glimpse/ligate/meta.yml +++ b/modules/nf-core/glimpse/ligate/meta.yml @@ -13,42 +13,37 @@ tools: tool_dev_url: "https://github.com/odelaneau/GLIMPSE" doi: "10.1038/s41588-020-00756-0" licence: "['MIT']" - input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - input_list: type: file description: VCF/BCF file containing genotype probabilities (GP field). pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - - input_index: type: file description: Index file of the input VCF/BCF file containing genotype likelihoods. pattern: "*.{vcf.gz.csi,bcf.gz.csi}" - output: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - versions: type: file description: File containing software versions pattern: "versions.yml" - - merged_variants: type: file description: | Output VCF/BCF file for the merged regions. Phased information (HS field) is updated accordingly for the full region. pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - authors: - "@louislenezet" +maintainers: + - "@louislenezet" diff --git a/modules/nf-core/glimpse/ligate/tests/main.nf.test b/modules/nf-core/glimpse/ligate/tests/main.nf.test new file mode 100644 index 00000000..e86ff231 --- /dev/null +++ b/modules/nf-core/glimpse/ligate/tests/main.nf.test @@ -0,0 +1,73 @@ +nextflow_process { + + name "Test Process GLIMPSE_LIGATE" + script "../main.nf" + process "GLIMPSE_LIGATE" + tag "glimpse" + tag "glimpse/ligate" + tag "modules_nfcore" + tag "modules" + + test("test_glimpse_ligate") { + setup { + run("GLIMPSE_PHASE") { + script "../../phase/main.nf" + process { + """ + ch_sample = Channel.of('NA12878 2').collectFile(name: 'sampleinfos.txt') + region = Channel.fromList([ + ["chr21:16600000-16750000","chr21:16650000-16700000"], + ["chr21:16650000-16800000","chr21:16700000-16750000"] + ]) + input_vcf = Channel.of([ + [ id:'input'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/NA12878.chr21.s.1x.vcf.gz", checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/NA12878.chr21.s.1x.vcf.gz.csi", checkIfExists: true) + ]) + ref_panel = Channel.of([ + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true) + ]) + ch_map = Channel.of([ + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/chr21.b38.gmap.gz", checkIfExists: true), + ]) + + input[0] = input_vcf + | combine(ch_sample) + | combine(region) + | combine(ref_panel) + | combine(ch_map) + """ + } + } + run("BCFTOOLS_INDEX") { + script "../../../bcftools/index/main.nf" + process { + """ + input[0] = GLIMPSE_PHASE.out.phased_variant + """ + } + } + } + + when { + process { + """ + input[0] = GLIMPSE_PHASE.out.phased_variant + | groupTuple() + | join (BCFTOOLS_INDEX.out.csi.groupTuple()) + """ + } + } + + then { + def lines = path(process.out.merged_variants.get(0).get(1)).linesGzip.last() + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions") }, + { assert snapshot(lines).match("ligate") } + ) + } + + } +} diff --git a/modules/nf-core/glimpse/ligate/tests/main.nf.test.snap b/modules/nf-core/glimpse/ligate/tests/main.nf.test.snap new file mode 100644 index 00000000..8eec1328 --- /dev/null +++ b/modules/nf-core/glimpse/ligate/tests/main.nf.test.snap @@ -0,0 +1,16 @@ +{ + "versions": { + "content": [ + [ + "versions.yml:md5,0cc9dfe9c9c1087666c418aa3379cf85" + ] + ], + "timestamp": "2023-10-17T11:56:25.087453677" + }, + "ligate": { + "content": [ + "chr21\t16799989\t21:16799989:T:C\tT\tC\t.\t.\tRAF=0.000468897;AF=0;INFO=1\tGT:DS:GP:HS\t0/0:0:1,0,0:0" + ], + "timestamp": "2023-10-17T11:56:25.116120487" + } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse/ligate/tests/tags.yml b/modules/nf-core/glimpse/ligate/tests/tags.yml new file mode 100644 index 00000000..f15d8121 --- /dev/null +++ b/modules/nf-core/glimpse/ligate/tests/tags.yml @@ -0,0 +1,2 @@ +glimpse/ligate: + - modules/nf-core/glimpse/ligate/** diff --git a/modules/nf-core/glimpse/phase/environment.yml b/modules/nf-core/glimpse/phase/environment.yml new file mode 100644 index 00000000..fc79765a --- /dev/null +++ b/modules/nf-core/glimpse/phase/environment.yml @@ -0,0 +1,7 @@ +name: glimpse_phase +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::glimpse-bio=1.1.1 diff --git a/modules/nf-core/glimpse/phase/main.nf b/modules/nf-core/glimpse/phase/main.nf index e2c73ea2..a6f39d15 100644 --- a/modules/nf-core/glimpse/phase/main.nf +++ b/modules/nf-core/glimpse/phase/main.nf @@ -2,7 +2,7 @@ process GLIMPSE_PHASE { tag "$meta.id" label 'process_medium' - conda "bioconda::glimpse-bio=1.1.1" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/glimpse-bio:1.1.1--h2ce4488_2': 'biocontainers/glimpse-bio:1.1.1--hce55b13_1' }" diff --git a/modules/nf-core/glimpse/phase/meta.yml b/modules/nf-core/glimpse/phase/meta.yml index 47da4de6..696616d3 100644 --- a/modules/nf-core/glimpse/phase/meta.yml +++ b/modules/nf-core/glimpse/phase/meta.yml @@ -5,7 +5,6 @@ keywords: - imputation - low-coverage - glimpse - tools: - "glimpse": description: "GLIMPSE is a phasing and imputation method for large-scale low-coverage sequencing studies." @@ -14,24 +13,20 @@ tools: tool_dev_url: "https://github.com/odelaneau/GLIMPSE" doi: "10.1038/s41588-020-00756-0" licence: "['MIT']" - input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - input: type: file description: Input VCF/BCF file containing genotype likelihoods. pattern: "*.{vcf.gz,bcf.gz}" - - input_index: type: file description: Index file of the input VCF/BCF file containing genotype likelihoods. pattern: "*.{vcf.gz.csi,bcf.gz.csi}" - - samples_file: type: file description: | @@ -40,44 +35,36 @@ input: Sample names that are not present are assumed to have ploidy 2 (diploids). GLIMPSE does NOT handle the use of sex (M/F) instead of ploidy. pattern: "*.{txt,tsv}" - - input_region: type: string description: Target region used for imputation, including left and right buffers (e.g. chr20:1000000-2000000). pattern: "chrXX:leftBufferPosition-rightBufferPosition" - - output_region: type: string description: Target imputed region, excluding left and right buffers (e.g. chr20:1000000-2000000). pattern: "chrXX:leftBufferPosition-rightBufferPosition" - - reference: type: file description: Reference panel of haplotypes in VCF/BCF format. pattern: "*.{vcf.gz,bcf.gz}" - - reference_index: type: file description: Index file of the Reference panel file. pattern: "*.{vcf.gz.csi,bcf.gz.csi}" - - map: type: file description: File containing the genetic map. pattern: "*.gmap" - output: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - versions: type: file description: File containing software versions pattern: "versions.yml" - - phased_variants: type: file description: | @@ -85,6 +72,7 @@ output: imputed dosages (DS field), best guess genotypes (GT field), sampled haplotypes in the last (max 16) main iterations (HS field) and info-score. pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - authors: - "@louislenezet" +maintainers: + - "@louislenezet" diff --git a/modules/nf-core/glimpse/phase/tests/main.nf.test b/modules/nf-core/glimpse/phase/tests/main.nf.test new file mode 100644 index 00000000..0009387f --- /dev/null +++ b/modules/nf-core/glimpse/phase/tests/main.nf.test @@ -0,0 +1,67 @@ +nextflow_process { + + name "Test Process GLIMPSE_PHASE" + script "../main.nf" + process "GLIMPSE_PHASE" + tag "glimpse" + tag "glimpse/phase" + tag "modules_nfcore" + tag "modules" + + test("test_glimpse_phase") { + + when { + process { + """ + ch_sample = Channel.of([sample:'present']) + | combine(Channel.of('NA12878 2').collectFile(name: 'sampleinfos.txt')) + | concat(Channel.of([[sample: 'absent'], []])) + region = Channel.fromList([ + ["chr21:16600000-16750000","chr21:16650000-16700000"], + ["chr21:16650000-16800000","chr21:16700000-16750000"] + ]) + input_vcf = Channel.of([ + [ id:'input'], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/NA12878.chr21.s.1x.vcf.gz", checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/NA12878.chr21.s.1x.vcf.gz.csi", checkIfExists: true) + ]) + ref_panel = Channel.of([ + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true) + ]) + ch_map = Channel.of([ + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/chr21.b38.gmap.gz", checkIfExists: true), + ]) + + input[0] = input_vcf + | combine(ch_sample) + | combine(region) + | map { meta, vcf, index, metaS, sample, regionI, regionO -> + [[id: meta.id + "_" + metaS.sample, region : regionI], vcf, index, sample, regionI, regionO] + } + | combine(ref_panel) + | combine(ch_map) + """ + } + } + + then { + String targetFileName = "input_present_chr21_16650000-16800000.vcf.gz" + File selectedFile = process.out.phased_variant.stream() + .filter(vector -> vector.size() > 1) + .map(vector -> new File(vector.get(1).toString())) + .filter(file -> file.getName().equals(targetFileName)) + .findFirst() + .orElse(null) + String selectedFilename = selectedFile != null ? selectedFile.getPath() : null + def lines = path(selectedFilename).linesGzip.last() + assertAll( + { assert process.success }, + { assert snapshot(process.out.versions).match("versions") }, + { assert process.out.phased_variant.size() == 4}, + { assert snapshot(lines).match("imputed") } + ) + } + + } +} diff --git a/modules/nf-core/glimpse/phase/tests/main.nf.test.snap b/modules/nf-core/glimpse/phase/tests/main.nf.test.snap new file mode 100644 index 00000000..d61cf86e --- /dev/null +++ b/modules/nf-core/glimpse/phase/tests/main.nf.test.snap @@ -0,0 +1,19 @@ +{ + "versions": { + "content": [ + [ + "versions.yml:md5,b24f49b2f5989a1f7da32c195334e96b", + "versions.yml:md5,b24f49b2f5989a1f7da32c195334e96b", + "versions.yml:md5,b24f49b2f5989a1f7da32c195334e96b", + "versions.yml:md5,b24f49b2f5989a1f7da32c195334e96b" + ] + ], + "timestamp": "2023-10-17T15:27:55.512415434" + }, + "imputed": { + "content": [ + "chr21\t16799989\t21:16799989:T:C\tT\tC\t.\t.\tRAF=0.000468897;AF=0;INFO=1;BUF=1\tGT:DS:GP:HS\t0/0:0:1,0,0:0" + ], + "timestamp": "2023-10-17T15:27:55.99820664" + } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse/phase/tests/tags.yml b/modules/nf-core/glimpse/phase/tests/tags.yml new file mode 100644 index 00000000..61c28281 --- /dev/null +++ b/modules/nf-core/glimpse/phase/tests/tags.yml @@ -0,0 +1,2 @@ +glimpse/phase: + - modules/nf-core/glimpse/phase/** diff --git a/modules/nf-core/glimpse2/chunk/environment.yml b/modules/nf-core/glimpse2/chunk/environment.yml new file mode 100644 index 00000000..8b893af7 --- /dev/null +++ b/modules/nf-core/glimpse2/chunk/environment.yml @@ -0,0 +1,7 @@ +name: glimpse2_chunk +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::glimpse-bio=2.0.0 diff --git a/modules/nf-core/glimpse2/chunk/main.nf b/modules/nf-core/glimpse2/chunk/main.nf index 2e848d8c..4ff4b2a7 100644 --- a/modules/nf-core/glimpse2/chunk/main.nf +++ b/modules/nf-core/glimpse2/chunk/main.nf @@ -11,7 +11,7 @@ process GLIMPSE2_CHUNK { exit 1 fi """ - conda "bioconda::glimpse-bio=2.0.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/glimpse-bio:2.0.0--hf340a29_0': 'biocontainers/glimpse-bio:2.0.0--hf340a29_0' }" diff --git a/modules/nf-core/glimpse2/chunk/meta.yml b/modules/nf-core/glimpse2/chunk/meta.yml index fb8ae97f..759ee024 100644 --- a/modules/nf-core/glimpse2/chunk/meta.yml +++ b/modules/nf-core/glimpse2/chunk/meta.yml @@ -12,41 +12,39 @@ tools: documentation: "https://odelaneau.github.io/GLIMPSE/commands.html" tool_dev_url: "https://github.com/odelaneau/GLIMPSE" doi: "10.1038/s41588-020-00756-0" - licence: "['MIT']" - + licence: ["MIT"] requirements: - AVX2 - input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - input: type: file description: | Target dataset in VCF/BCF format defined at all variable positions. The file could possibly be without GT field (for efficiency reasons a file containing only the positions is recommended). pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - - input_index: type: file description: Index file of the input VCF/BCF file containing genotype likelihoods. pattern: "*.{vcf.gz.csi,bcf.gz.csi}" - - region: type: string description: | Target region, usually a full chromosome (e.g. chr20:1000000-2000000 or chr20). For chrX, please treat PAR and non-PAR regions as different choromosome in order to avoid mixing ploidy. - + - meta2: + type: map + description: | + Groovy Map containing genomic map information + e.g. [ map:'GRCh38' ] - map: type: file description: File containing the genetic map. pattern: "*.gmap" - - model: type: string description: | @@ -55,23 +53,21 @@ input: "sequential": Sequential algorithm (Recommended) "uniform-number-variants": Experimental. Uniform the number of variants in the sequential algorithm pattern: "{recursive,sequential,uniform-number-variants}" - output: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - versions: type: file description: File containing software versions pattern: "versions.yml" - - - txt: + - chunk_chr: type: file description: Tab delimited output txt file containing buffer and imputation regions. pattern: "*.{txt}" - authors: - "@louislenezet" +maintainers: + - "@louislenezet" diff --git a/modules/nf-core/glimpse2/chunk/tests/main.nf.test b/modules/nf-core/glimpse2/chunk/tests/main.nf.test new file mode 100644 index 00000000..0f9e8850 --- /dev/null +++ b/modules/nf-core/glimpse2/chunk/tests/main.nf.test @@ -0,0 +1,65 @@ +nextflow_process { + + name "Test Process GLIMPSE2_CHUNK" + script "../main.nf" + process "GLIMPSE2_CHUNK" + tag "glimpse2" + tag "glimpse2/chunk" + tag "modules_nfcore" + tag "modules" + + test("Should run without map") { + config "modules/nf-core/glimpse2/chunk/tests/nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true), + "chr21" + ] + input[1]= [[ id:'map'],[]] + input[2]= "recursive" + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + + test("Should run with map") { + config "modules/nf-core/glimpse2/chunk/tests/nextflow.config" + + when { + process { + """ + input[0] = [ + [ id:'test', single_end:false ], // meta map + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true), + "chr21" + ] + input[1]= [[ id:'map'],file("https://github.com/nf-core/test-datasets/raw/modules/data/delete_me/glimpse/chr21.b38.gmap.gz", checkIfExists: true)] + input[2]= "recursive" + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/glimpse2/chunk/tests/main.nf.test.snap b/modules/nf-core/glimpse2/chunk/tests/main.nf.test.snap new file mode 100644 index 00000000..f61ebdcc --- /dev/null +++ b/modules/nf-core/glimpse2/chunk/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "Should run without map": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,aae05c3099aff601005282744baf8db8" + ] + ], + "1": [ + "versions.yml:md5,f5aa9b92845efdd03350ca7cab08ff6f" + ], + "chunk_chr": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,aae05c3099aff601005282744baf8db8" + ] + ], + "versions": [ + "versions.yml:md5,f5aa9b92845efdd03350ca7cab08ff6f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:51:29.494098" + }, + "Should run with map": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,1f7a58d7891e82fa5e9669abdbba5690" + ] + ], + "1": [ + "versions.yml:md5,f5aa9b92845efdd03350ca7cab08ff6f" + ], + "chunk_chr": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,1f7a58d7891e82fa5e9669abdbba5690" + ] + ], + "versions": [ + "versions.yml:md5,f5aa9b92845efdd03350ca7cab08ff6f" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-06T14:51:38.545206" + } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse2/chunk/tests/nextflow.config b/modules/nf-core/glimpse2/chunk/tests/nextflow.config new file mode 100644 index 00000000..e5721995 --- /dev/null +++ b/modules/nf-core/glimpse2/chunk/tests/nextflow.config @@ -0,0 +1,6 @@ +process { + withName: GLIMPSE2_CHUNK { + ext.prefix = { "${meta.id}" } + } + publishDir = { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse2/chunk/tests/tags.yml b/modules/nf-core/glimpse2/chunk/tests/tags.yml new file mode 100644 index 00000000..69cc8b67 --- /dev/null +++ b/modules/nf-core/glimpse2/chunk/tests/tags.yml @@ -0,0 +1,2 @@ +glimpse2/chunk: + - modules/nf-core/glimpse2/chunk/** diff --git a/modules/nf-core/glimpse2/ligate/environment.yml b/modules/nf-core/glimpse2/ligate/environment.yml new file mode 100644 index 00000000..67e2c3e6 --- /dev/null +++ b/modules/nf-core/glimpse2/ligate/environment.yml @@ -0,0 +1,7 @@ +name: glimpse2_ligate +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::glimpse-bio=2.0.0 diff --git a/modules/nf-core/glimpse2/ligate/main.nf b/modules/nf-core/glimpse2/ligate/main.nf index 97de22e1..e58b5939 100644 --- a/modules/nf-core/glimpse2/ligate/main.nf +++ b/modules/nf-core/glimpse2/ligate/main.nf @@ -2,7 +2,7 @@ process GLIMPSE2_LIGATE { tag "$meta.id" label 'process_low' - conda "bioconda::glimpse-bio=2.0.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/glimpse-bio:2.0.0--hf340a29_0': 'biocontainers/glimpse-bio:2.0.0--hf340a29_0' }" diff --git a/modules/nf-core/glimpse2/ligate/meta.yml b/modules/nf-core/glimpse2/ligate/meta.yml index 59400719..ffedb344 100644 --- a/modules/nf-core/glimpse2/ligate/meta.yml +++ b/modules/nf-core/glimpse2/ligate/meta.yml @@ -15,40 +15,35 @@ tools: tool_dev_url: "https://github.com/odelaneau/GLIMPSE" doi: "10.1038/s41588-020-00756-0" licence: "['MIT']" - input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - input_list: type: file description: VCF/BCF file containing genotype probabilities (GP field). pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - - input_index: type: file description: Index file of the input VCF/BCF file containing genotype likelihoods. pattern: "*.{csi,tbi}" - output: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - versions: type: file description: File containing software versions pattern: "versions.yml" - - merged_variants: type: file description: Output ligated (phased) file in VCF/BCF format. pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - authors: - "@louislenezet" +maintainers: + - "@louislenezet" diff --git a/modules/nf-core/glimpse2/phase/environment.yml b/modules/nf-core/glimpse2/phase/environment.yml new file mode 100644 index 00000000..b56a1ee6 --- /dev/null +++ b/modules/nf-core/glimpse2/phase/environment.yml @@ -0,0 +1,7 @@ +name: glimpse2_phase +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::glimpse-bio=2.0.0 diff --git a/modules/nf-core/glimpse2/phase/main.nf b/modules/nf-core/glimpse2/phase/main.nf index 8ab9eb9b..f61cf022 100644 --- a/modules/nf-core/glimpse2/phase/main.nf +++ b/modules/nf-core/glimpse2/phase/main.nf @@ -12,7 +12,7 @@ process GLIMPSE2_PHASE { fi """ - conda "bioconda::glimpse-bio=2.0.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/glimpse-bio:2.0.0--hf340a29_0': 'biocontainers/glimpse-bio:2.0.0--hf340a29_0' }" @@ -22,7 +22,7 @@ process GLIMPSE2_PHASE { tuple val(meta2), path(fasta_reference), path(fasta_reference_index) output: - tuple val(meta), path("*.{vcf,bcf,bgen}"), emit: phased_variant + tuple val(meta), path("*.{vcf,bcf,bgen}"), emit: phased_variants tuple val(meta), path("*.txt.gz") , emit: stats_coverage, optional: true path "versions.yml" , emit: versions diff --git a/modules/nf-core/glimpse2/phase/meta.yml b/modules/nf-core/glimpse2/phase/meta.yml index 5e5e88cb..db2595e6 100644 --- a/modules/nf-core/glimpse2/phase/meta.yml +++ b/modules/nf-core/glimpse2/phase/meta.yml @@ -12,27 +12,23 @@ tools: documentation: "https://odelaneau.github.io/GLIMPSE/commands.html" tool_dev_url: "https://github.com/odelaneau/GLIMPSE" doi: "10.1038/s41588-020-00756-0" - licence: "['MIT']" - + licence: ["MIT"] input: - meta: type: map description: | Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - + e.g. `[ id:'test', single_end:false ]` - input: type: file description: | Either multiple BAM/CRAM files containing low-coverage sequencing reads or one VCF/BCF file containing the genotype likelihoods. When using BAM/CRAM the name of the file is used as samples name. pattern: "*.{bam,cram,vcf,vcf.gz,bcf,bcf.gz}" - - input_index: type: file description: Index file of the input BAM/CRAM/VCF/BCF file. pattern: "*.{bam.bai,cram.crai,vcf.gz.csi,bcf.gz.csi}" - - samples_file: type: file description: | @@ -41,74 +37,69 @@ input: Sample names that are not present are assumed to have ploidy 2 (diploids). GLIMPSE does NOT handle the use of sex (M/F) instead of ploidy. pattern: "*.{txt,tsv}" - - input_region: type: string description: | Target region used for imputation, including left and right buffers (e.g. chr20:1000000-2000000). Optional if reference panel is in bin format. pattern: "chrXX:leftBufferPosition-rightBufferPosition" - - output_region: type: string description: | Target imputed region, excluding left and right buffers (e.g. chr20:1000000-2000000). Optional if reference panel is in bin format. pattern: "chrXX:leftBufferPosition-rightBufferPosition" - + - meta2: + type: map + description: | + Groovy Map containing genomic map information + e.g. `[ map:'GRCh38' ]` - reference: type: file description: Reference panel of haplotypes in VCF/BCF format. pattern: "*.{vcf.gz,bcf.gz}" - - reference_index: type: file description: Index file of the Reference panel file. pattern: "*.{vcf.gz.csi,bcf.gz.csi}" - - map: type: file description: | File containing the genetic map. Optional if reference panel is in bin format. pattern: "*.gmap" - - fasta_reference: type: file description: | Faidx-indexed reference sequence file in the appropriate genome build. Necessary for CRAM files. pattern: "*.fasta" - - fasta_reference_index: type: file description: | Faidx index of the reference sequence file in the appropriate genome build. Necessary for CRAM files. pattern: "*.fai" - output: - meta: type: map description: | Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - + e.g. `[ id:'test', single_end:false ]` - versions: type: file description: File containing software versions pattern: "versions.yml" - - phased_variants: type: file description: | Output VCF/BCF file containing genotype probabilities (GP field), imputed dosages (DS field), best guess genotypes (GT field), sampled haplotypes in the last (max 16) main iterations (HS field) and info-score. pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - - stats_coverage: type: file description: Optional coverage statistic file created when BAM/CRAM files are used as inputs. pattern: "*.txt.gz" - authors: - "@LouisLeNezet" +maintainers: + - "@LouisLeNezet" diff --git a/modules/nf-core/glimpse2/phase/tests/main.nf.test b/modules/nf-core/glimpse2/phase/tests/main.nf.test new file mode 100644 index 00000000..95c6d9e1 --- /dev/null +++ b/modules/nf-core/glimpse2/phase/tests/main.nf.test @@ -0,0 +1,144 @@ +nextflow_process { + + name "Test Process GLIMPSE2_PHASE" + script "../main.nf" + + process "GLIMPSE2_PHASE" + + tag "modules_nfcore" + tag "modules" + tag "glimpse2" + tag "glimpse2/phase" + + test("Should run with vcf") { + + when { + process { + """ + input_vcf = Channel.of([ + [ id:'input' ], // meta map + file(params.modules_testdata_base_path + "delete_me/glimpse/NA12878.chr21.s.1x.vcf.gz", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/NA12878.chr21.s.1x.vcf.gz.csi", checkIfExists: true), + [], + "chr21:16600000-16800000", + "chr21:16650000-16750000" + ]) + + ref_panel = Channel.of([ + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true) + ]) + + map_file = Channel.of([ + file(params.modules_testdata_base_path + "delete_me/glimpse/chr21.b38.gmap.gz", checkIfExists: true) + ]) + + // [meta, vcf, index, sample_infos, regionin, regionout,ref, index, map] [meta, fasta, fai] + input[0] = input_vcf + .combine(ref_panel) + .combine(map_file) + input[1] = Channel.of([[],[],[]]) + """ + } + } + + then { + assertAll( + { assert process.success }, + // File has a timestamp in it and is in binary format, so we can only check the name + { assert file(process.out.phased_variants[0][1]).name == "input_chr21_16650000-16750000.bcf" }, + { assert snapshot(process.out.versions).match("VCF")} + ) + } + + } + + test("Should run with bam") { + + when { + process { + """ + input_bam = Channel.of([ + [id:'input'], + file(params.modules_testdata_base_path + "delete_me/glimpse/NA12878.chr21.s.1x.bam", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/NA12878.chr21.s.1x.bam.bai", checkIfExists: true), + [], + "chr21:16600000-16800000", + "chr21:16650000-16750000", + ]) + ref_panel = Channel.of([ + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true) + ]) + + map_file = Channel.of([ + file(params.modules_testdata_base_path + "delete_me/glimpse/chr21.b38.gmap.gz", checkIfExists: true) + ]) + + // [meta, vcf, index, sample_infos, regionin, regionout,ref, index, map] [meta, fasta, fai] + input[0] = input_bam + .combine(ref_panel) + .combine(map_file) + input[1] = Channel.of([[],[],[]]) + """ + } + } + + then { + assertAll( + { assert process.success }, + // File has a timestamp in it and is in binary format, so we can only check the name + { assert file(process.out.phased_variants[0][1]).name == "input_chr21_16650000-16750000.bcf" }, + { assert snapshot(process.out.stats_coverage).match("BAM_coverage")}, + { assert snapshot(process.out.versions).match("BAM")} + ) + } + + } + + test("Should run with cram and reference genome") { + + when { + process { + """ + input_cram = Channel.of([ + [id:'input'], + file(params.modules_testdata_base_path + "delete_me/glimpse/NA12878.chr21.s.1x.cram", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/NA12878.chr21.s.1x.cram.crai", checkIfExists: true), + [], + "chr21:16600000-16800000", + "chr21:16650000-16750000", + ]) + ref_panel = Channel.of([ + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true) + ]) + + map_file = Channel.of([ + file(params.modules_testdata_base_path + "delete_me/glimpse/chr21.b38.gmap.gz", checkIfExists: true) + ]) + reference_genome = Channel.of([ + [id:'refHG38_chr21'], + file(params.modules_testdata_base_path + "delete_me/glimpse/hs38DH.chr21.fa.gz", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/hs38DH.chr21.fa.gz.fai", checkIfExists: true) + ]) + // [meta, vcf, index, sample_infos, regionin, regionout,ref, index, map] [meta, fasta, fai] + input[0] = input_cram + .combine(ref_panel) + .combine(map_file) + input[1] = reference_genome + """ + } + } + + then { + assertAll( + { assert process.success }, + // File has a timestamp in it and is in binary format, so we can only check the name + { assert file(process.out.phased_variants[0][1]).name == "input_chr21_16650000-16750000.bcf" }, + { assert snapshot(process.out.stats_coverage).match("CRAM_coverage")}, + { assert snapshot(process.out.versions).match("CRAM")} + ) + } + } +} diff --git a/modules/nf-core/glimpse2/phase/tests/main.nf.test.snap b/modules/nf-core/glimpse2/phase/tests/main.nf.test.snap new file mode 100644 index 00000000..861f9a70 --- /dev/null +++ b/modules/nf-core/glimpse2/phase/tests/main.nf.test.snap @@ -0,0 +1,72 @@ +{ + "CRAM": { + "content": [ + [ + "versions.yml:md5,c68de03046a6503cdbcf3a1495fc512f" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-13T16:58:34.365910006" + }, + "VCF": { + "content": [ + [ + "versions.yml:md5,c68de03046a6503cdbcf3a1495fc512f" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-13T16:58:05.013609832" + }, + "BAM_coverage": { + "content": [ + [ + [ + { + "id": "input" + }, + "input_chr21_16650000-16750000_stats_coverage.txt.gz:md5,9be7101ef4f599416c22fd6160c3b146" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-13T16:58:13.527360464" + }, + "CRAM_coverage": { + "content": [ + [ + [ + { + "id": "input" + }, + "input_chr21_16650000-16750000_stats_coverage.txt.gz:md5,a2bee17d81568dba62ce4dd430947d29" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-13T16:58:34.264826731" + }, + "BAM": { + "content": [ + [ + "versions.yml:md5,c68de03046a6503cdbcf3a1495fc512f" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-13T16:58:13.58159608" + } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse2/phase/tests/tags.yml b/modules/nf-core/glimpse2/phase/tests/tags.yml new file mode 100644 index 00000000..ab05b49f --- /dev/null +++ b/modules/nf-core/glimpse2/phase/tests/tags.yml @@ -0,0 +1,2 @@ +glimpse2/phase: + - modules/nf-core/glimpse2/phase/** diff --git a/modules/nf-core/glimpse2/splitreference/environment.yml b/modules/nf-core/glimpse2/splitreference/environment.yml new file mode 100644 index 00000000..a4dd839a --- /dev/null +++ b/modules/nf-core/glimpse2/splitreference/environment.yml @@ -0,0 +1,7 @@ +name: glimpse2_splitreference +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::glimpse-bio=2.0.0 diff --git a/modules/nf-core/glimpse2/splitreference/main.nf b/modules/nf-core/glimpse2/splitreference/main.nf index a35d3020..31b758d3 100644 --- a/modules/nf-core/glimpse2/splitreference/main.nf +++ b/modules/nf-core/glimpse2/splitreference/main.nf @@ -12,7 +12,7 @@ process GLIMPSE2_SPLITREFERENCE { fi """ - conda "bioconda::glimpse-bio=2.0.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/glimpse-bio:2.0.0--hf340a29_0': 'biocontainers/glimpse-bio:2.0.0--hf340a29_0' }" diff --git a/modules/nf-core/glimpse2/splitreference/meta.yml b/modules/nf-core/glimpse2/splitreference/meta.yml index 3a36b9ad..c70ec024 100644 --- a/modules/nf-core/glimpse2/splitreference/meta.yml +++ b/modules/nf-core/glimpse2/splitreference/meta.yml @@ -4,6 +4,7 @@ keywords: - split - reference - phasing + - imputation tools: - "glimpse2": description: "GLIMPSE2 is a phasing and imputation method for large-scale low-coverage sequencing studies." @@ -11,7 +12,7 @@ tools: documentation: "https://odelaneau.github.io/GLIMPSE/commands.html" tool_dev_url: "https://github.com/odelaneau/GLIMPSE" doi: "10.1038/s41588-020-00756-0" - licence: "['MIT']" + licence: ["MIT"] requirements: - AVX2 input: @@ -20,32 +21,31 @@ input: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - reference: type: file description: Reference panel of haplotypes in VCF/BCF format. pattern: "*.{vcf.gz,bcf.gz}" - - reference_index: type: file description: Index file of the Reference panel file. pattern: "*.{vcf.gz.csi,bcf.gz.csi}" - - input_region: type: string description: Target region used for imputation, including left and right buffers (e.g. chr20:1000000-2000000). pattern: "chrXX:leftBufferPosition-rightBufferPosition" - - output_region: type: string description: Target imputed region, excluding left and right buffers (e.g. chr20:1000000-2000000). pattern: "chrXX:leftBufferPosition-rightBufferPosition" - + - meta2: + type: map + description: | + Groovy Map containing genomic map information + e.g. `[ map:'GRCh38' ]` - map: type: file description: File containing the genetic map. pattern: "*.gmap" - output: - meta: type: map @@ -60,6 +60,7 @@ output: type: file description: binary reference panel pattern: "*.bin" - authors: - "@LouisLeNezet" +maintainers: + - "@LouisLeNezet" diff --git a/modules/nf-core/glimpse2/splitreference/tests/main.nf.test b/modules/nf-core/glimpse2/splitreference/tests/main.nf.test new file mode 100644 index 00000000..be55b4c7 --- /dev/null +++ b/modules/nf-core/glimpse2/splitreference/tests/main.nf.test @@ -0,0 +1,70 @@ +nextflow_process { + + name "Test Process GLIMPSE2_SPLITREFERENCE" + script "../main.nf" + config "./nextflow.config" + + process "GLIMPSE2_SPLITREFERENCE" + + tag "modules_nfcore" + tag "modules" + tag "glimpse2" + tag "glimpse2/splitreference" + + test("Should run without map") { + + when { + process { + """ + input[0] = [ + [ id:'ref1000GP', single_end:false ], // meta map + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true), + "chr21:16600000-16800000", + "chr21:16600000-16800000" + ] + input[1]= [[ id:'map'],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + // File has a timestamp in it and is in binary format, so we can only check the name + { assert file(process.out.bin_ref[0][1]).name == "ref1000GP_chr21_16600000_16800000.bin" }, + { assert snapshot(process.out.version).match()} + ) + } + + } + + test("Should run with map") { + + when { + process { + """ + input[0] = [ + [ id:'ref1000GP', single_end:false ], // meta map + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf", checkIfExists: true), + file(params.modules_testdata_base_path + "delete_me/glimpse/1000GP.chr21.noNA12878.s.bcf.csi", checkIfExists: true), + "chr21:16600000-16800000", + "chr21:16600000-16800000" + ] + input[1]= [[ id:'map'], file(params.modules_testdata_base_path + "delete_me/glimpse/chr21.b38.gmap.gz", checkIfExists: true)] + """ + } + } + + then { + assertAll( + { assert process.success }, + // File has a timestamp in it and is in binary format, so we can only check the name + { assert file(process.out.bin_ref[0][1]).name == "ref1000GP_chr21_16600000_16800000.bin" }, + { assert snapshot(process.out.version).match()} + ) + } + + } + +} diff --git a/modules/nf-core/glimpse2/splitreference/tests/main.nf.test.snap b/modules/nf-core/glimpse2/splitreference/tests/main.nf.test.snap new file mode 100644 index 00000000..6e6d64ca --- /dev/null +++ b/modules/nf-core/glimpse2/splitreference/tests/main.nf.test.snap @@ -0,0 +1,18 @@ +{ + "Should run without map": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-13T14:52:00.115502" + }, + "Should run with map": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-13T14:52:08.29561" + } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse2/splitreference/tests/nextflow.config b/modules/nf-core/glimpse2/splitreference/tests/nextflow.config new file mode 100644 index 00000000..4d6152a8 --- /dev/null +++ b/modules/nf-core/glimpse2/splitreference/tests/nextflow.config @@ -0,0 +1,9 @@ +process { + withName: GLIMPSE2_SPLITREFERENCE { + ext.args = [ + "--sparse-maf 0.01", + "--keep-monomorphic-ref-sites" + ].join(' ') + ext.prefix = { "${meta.id}" } + } +} \ No newline at end of file diff --git a/modules/nf-core/glimpse2/splitreference/tests/tags.yml b/modules/nf-core/glimpse2/splitreference/tests/tags.yml new file mode 100644 index 00000000..ce5545c5 --- /dev/null +++ b/modules/nf-core/glimpse2/splitreference/tests/tags.yml @@ -0,0 +1,2 @@ +glimpse2/splitreference: + - modules/nf-core/glimpse2/splitreference/** diff --git a/modules/nf-core/samtools/coverage/environment.yml b/modules/nf-core/samtools/coverage/environment.yml new file mode 100644 index 00000000..b5e6b997 --- /dev/null +++ b/modules/nf-core/samtools/coverage/environment.yml @@ -0,0 +1,8 @@ +name: samtools_coverage +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.19.2 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/samtools/coverage/main.nf b/modules/nf-core/samtools/coverage/main.nf index 02046525..da7b3233 100644 --- a/modules/nf-core/samtools/coverage/main.nf +++ b/modules/nf-core/samtools/coverage/main.nf @@ -2,13 +2,15 @@ process SAMTOOLS_COVERAGE { tag "$meta.id" label 'process_single' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: tuple val(meta), path(input), path(input_index), val(region) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) output: tuple val(meta), path("*.txt"), emit: coverage @@ -21,13 +23,13 @@ process SAMTOOLS_COVERAGE { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def region_cmd = region ? "--region ${region}" : '' - """ samtools \\ coverage \\ $args \\ - $region_cmd \\ -o ${prefix}.txt \\ + $region_cmd \\ + --reference ${fasta} \\ $input cat <<-END_VERSIONS > versions.yml diff --git a/modules/nf-core/samtools/coverage/meta.yml b/modules/nf-core/samtools/coverage/meta.yml index 9becd3ea..e74082d9 100644 --- a/modules/nf-core/samtools/coverage/meta.yml +++ b/modules/nf-core/samtools/coverage/meta.yml @@ -14,7 +14,6 @@ tools: documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] - input: - meta: type: map @@ -29,7 +28,19 @@ input: type: file description: BAM/CRAM index file pattern: "*.{bai,crai}" - + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] + - fasta: + type: file + description: Reference genome file + pattern: "*.{fa,fasta}" + - fai: + type: file + description: Reference genome index file + pattern: "*.fai" output: - meta: type: map @@ -44,6 +55,7 @@ output: type: file description: Tabulated text containing the coverage at each position or region or an ASCII-art histogram (with --histogram). pattern: "*.txt" - authors: - "@LouisLeNezet" +maintainers: + - "@LouisLeNezet" diff --git a/modules/nf-core/samtools/coverage/samtools-coverage.diff b/modules/nf-core/samtools/coverage/samtools-coverage.diff new file mode 100644 index 00000000..a37b6818 --- /dev/null +++ b/modules/nf-core/samtools/coverage/samtools-coverage.diff @@ -0,0 +1,32 @@ +Changes in module 'nf-core/samtools/coverage' +--- modules/nf-core/samtools/coverage/main.nf ++++ modules/nf-core/samtools/coverage/main.nf +@@ -8,7 +8,7 @@ + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" + + input: +- tuple val(meta), path(input), path(input_index) ++ tuple val(meta), path(input), path(input_index), val(region) + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) + +@@ -20,13 +20,15 @@ + task.ext.when == null || task.ext.when + + script: +- def args = task.ext.args ?: '' +- def prefix = task.ext.prefix ?: "${meta.id}" ++ def args = task.ext.args ?: '' ++ def prefix = task.ext.prefix ?: "${meta.id}" ++ def region_cmd = region ? "--region ${region}" : '' + """ + samtools \\ + coverage \\ + $args \\ + -o ${prefix}.txt \\ ++ $region_cmd \\ + --reference ${fasta} \\ + $input + + +************************************************************ diff --git a/modules/nf-core/samtools/coverage/tests/main.nf.test b/modules/nf-core/samtools/coverage/tests/main.nf.test new file mode 100644 index 00000000..1e3ad5a4 --- /dev/null +++ b/modules/nf-core/samtools/coverage/tests/main.nf.test @@ -0,0 +1,105 @@ +nextflow_process { + + name "Test Process SAMTOOLS_COVERAGE" + script "../main.nf" + process "SAMTOOLS_COVERAGE" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/coverage" + + test("test_samtools_coverage_bam") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[2] = Channel.of([ + [ id:'fai' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_coverage_cram") { + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + input[2] = Channel.of([ + [ id:'fai' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_coverage_stub") { + + options "-stub" + + when { + process { + """ + input[0] = Channel.of([ + [id: 'test', single_end: false], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'fasta' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta', checkIfExists: true) + ]) + input[2] = Channel.of([ + [ id:'fai' ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/genome/genome.fasta.fai', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + + } + +} diff --git a/modules/nf-core/samtools/coverage/tests/main.nf.test.snap b/modules/nf-core/samtools/coverage/tests/main.nf.test.snap new file mode 100644 index 00000000..cc3ce01c --- /dev/null +++ b/modules/nf-core/samtools/coverage/tests/main.nf.test.snap @@ -0,0 +1,107 @@ +{ + "test_samtools_coverage_stub": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + "versions.yml:md5,56e1239217405837de88af882d9d68f6" + ], + "coverage": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,56e1239217405837de88af882d9d68f6" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-29T11:08:03.724132" + }, + "test_samtools_coverage_bam": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,99a521b3bf53b6acf8055a44a571ea84" + ] + ], + "1": [ + "versions.yml:md5,56e1239217405837de88af882d9d68f6" + ], + "coverage": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,99a521b3bf53b6acf8055a44a571ea84" + ] + ], + "versions": [ + "versions.yml:md5,56e1239217405837de88af882d9d68f6" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-29T11:36:30.272862" + }, + "test_samtools_coverage_cram": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,ce896534bac51cfcc97e5508ae907e99" + ] + ], + "1": [ + "versions.yml:md5,56e1239217405837de88af882d9d68f6" + ], + "coverage": [ + [ + { + "id": "test", + "single_end": false + }, + "test.txt:md5,ce896534bac51cfcc97e5508ae907e99" + ] + ], + "versions": [ + "versions.yml:md5,56e1239217405837de88af882d9d68f6" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-02-29T11:39:08.488488" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/coverage/tests/tags.yml b/modules/nf-core/samtools/coverage/tests/tags.yml new file mode 100644 index 00000000..2b4f53c2 --- /dev/null +++ b/modules/nf-core/samtools/coverage/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/coverage: + - "modules/nf-core/samtools/coverage/**" diff --git a/modules/nf-core/samtools/faidx/environment.yml b/modules/nf-core/samtools/faidx/environment.yml new file mode 100644 index 00000000..9c24eb0a --- /dev/null +++ b/modules/nf-core/samtools/faidx/environment.yml @@ -0,0 +1,10 @@ +name: samtools_faidx + +channels: + - conda-forge + - bioconda + - defaults + +dependencies: + - bioconda::htslib=1.19.1 + - bioconda::samtools=1.19.2 diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index 59ed3088..cfe7ad95 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_FAIDX { tag "$fasta" label 'process_single' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml index 957b25e5..f3c25de2 100644 --- a/modules/nf-core/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -39,6 +39,10 @@ output: description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] + - fa: + type: file + description: FASTA file + pattern: "*.{fa}" - fai: type: file description: FASTA index file @@ -55,3 +59,7 @@ authors: - "@drpatelh" - "@ewels" - "@phue" +maintainers: + - "@drpatelh" + - "@ewels" + - "@phue" diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test b/modules/nf-core/samtools/faidx/tests/main.nf.test new file mode 100644 index 00000000..136b2126 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test @@ -0,0 +1,123 @@ +nextflow_process { + + name "Test Process SAMTOOLS_FAIDX" + script "../main.nf" + process "SAMTOOLS_FAIDX" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/faidx" + + test("test_samtools_faidx") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) ] + + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_bgzip") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta_gz'], checkIfExists: true) ] + + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_fasta") { + + config "./nextflow.config" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) ] + + input[1] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta_fai'], checkIfExists: true) ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_stub_fasta") { + + config "./nextflow2.config" + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) ] + + input[1] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta_fai'], checkIfExists: true) ] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + + test("test_samtools_faidx_stub_fai") { + + when { + process { + """ + input[0] = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['sarscov2']['genome']['genome_fasta'], checkIfExists: true) ] + + input[1] = [[],[]] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(process.out).match() } + ) + } + } + +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/main.nf.test.snap b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap new file mode 100644 index 00000000..3e651ef6 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/main.nf.test.snap @@ -0,0 +1,249 @@ +{ + "test_samtools_faidx": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "versions": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T16:22:39.412601" + }, + "test_samtools_faidx_bgzip": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "3": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.gz.gzi:md5,7dea362b3fac8e00956a4952a3d4f474" + ] + ], + "versions": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T16:23:22.427966" + }, + "test_samtools_faidx_fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ], + "fa": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,6a0774a0ad937ba0bfd2ac7457d90f36" + ] + ], + "fai": [ + + ], + "gzi": [ + + ], + "versions": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T16:24:04.107537" + }, + "test_samtools_faidx_stub_fasta": { + "content": [ + { + "0": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "1": [ + + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ], + "fa": [ + [ + { + "id": "test", + "single_end": false + }, + "extract.fa:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "fai": [ + + ], + "gzi": [ + + ], + "versions": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T16:24:45.868463" + }, + "test_samtools_faidx_stub_fai": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "2": [ + + ], + "3": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ], + "fa": [ + + ], + "fai": [ + [ + { + "id": "test", + "single_end": false + }, + "genome.fasta.fai:md5,9da2a56e2853dc8c0b86a9e7229c9fe5" + ] + ], + "gzi": [ + + ], + "versions": [ + "versions.yml:md5,4870fc0a88c616aa937f8325a2db0c3c" + ] + } + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-18T16:25:27.550554" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/faidx/tests/nextflow.config b/modules/nf-core/samtools/faidx/tests/nextflow.config new file mode 100644 index 00000000..f76a3ba0 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: SAMTOOLS_FAIDX { + ext.args = 'MT192765.1 -o extract.fa' + } + +} diff --git a/modules/nf-core/samtools/faidx/tests/nextflow2.config b/modules/nf-core/samtools/faidx/tests/nextflow2.config new file mode 100644 index 00000000..33ebbd5d --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/nextflow2.config @@ -0,0 +1,6 @@ +process { + + withName: SAMTOOLS_FAIDX { + ext.args = '-o extract.fa' + } +} diff --git a/modules/nf-core/samtools/faidx/tests/tags.yml b/modules/nf-core/samtools/faidx/tests/tags.yml new file mode 100644 index 00000000..e4a83948 --- /dev/null +++ b/modules/nf-core/samtools/faidx/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/faidx: + - modules/nf-core/samtools/faidx/** diff --git a/modules/nf-core/samtools/index/environment.yml b/modules/nf-core/samtools/index/environment.yml new file mode 100644 index 00000000..a5e50649 --- /dev/null +++ b/modules/nf-core/samtools/index/environment.yml @@ -0,0 +1,8 @@ +name: samtools_index +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::samtools=1.19.2 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/samtools/index/main.nf b/modules/nf-core/samtools/index/main.nf index 0b20aa4b..dc14f98d 100644 --- a/modules/nf-core/samtools/index/main.nf +++ b/modules/nf-core/samtools/index/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/samtools/index/meta.yml b/modules/nf-core/samtools/index/meta.yml index 8bd2fa6f..01a4ee03 100644 --- a/modules/nf-core/samtools/index/meta.yml +++ b/modules/nf-core/samtools/index/meta.yml @@ -51,3 +51,7 @@ authors: - "@drpatelh" - "@ewels" - "@maxulysse" +maintainers: + - "@drpatelh" + - "@ewels" + - "@maxulysse" diff --git a/modules/nf-core/samtools/index/tests/csi.nextflow.config b/modules/nf-core/samtools/index/tests/csi.nextflow.config new file mode 100644 index 00000000..0ed260ef --- /dev/null +++ b/modules/nf-core/samtools/index/tests/csi.nextflow.config @@ -0,0 +1,7 @@ +process { + + withName: SAMTOOLS_INDEX { + ext.args = '-c' + } + +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test b/modules/nf-core/samtools/index/tests/main.nf.test new file mode 100644 index 00000000..bb7756d1 --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test @@ -0,0 +1,87 @@ +nextflow_process { + + name "Test Process SAMTOOLS_INDEX" + script "../main.nf" + process "SAMTOOLS_INDEX" + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/index" + + test("bai") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out.bai).match("bai") }, + { assert snapshot(process.out.versions).match("bai_versions") } + ) + } + } + + test("crai") { + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out.crai).match("crai") }, + { assert snapshot(process.out.versions).match("crai_versions") } + ) + } + } + + test("csi") { + + config "./csi.nextflow.config" + + when { + params { + outdir = "$outputDir" + } + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam', checkIfExists: true) + ]) + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert path(process.out.csi.get(0).get(1)).exists() }, + { assert snapshot(process.out.versions).match("csi_versions") } + ) + } + } +} diff --git a/modules/nf-core/samtools/index/tests/main.nf.test.snap b/modules/nf-core/samtools/index/tests/main.nf.test.snap new file mode 100644 index 00000000..3dc8e7de --- /dev/null +++ b/modules/nf-core/samtools/index/tests/main.nf.test.snap @@ -0,0 +1,74 @@ +{ + "crai_versions": { + "content": [ + [ + "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:12:00.324667957" + }, + "csi_versions": { + "content": [ + [ + "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:12:07.885103162" + }, + "crai": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.recalibrated.sorted.cram.crai:md5,14bc3bd5c89cacc8f4541f9062429029" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T18:41:38.446424" + }, + "bai": { + "content": [ + [ + [ + { + "id": "test", + "single_end": false + }, + "test.paired_end.sorted.bam.bai:md5,704c10dd1326482448ca3073fdebc2f4" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T18:40:46.579747" + }, + "bai_versions": { + "content": [ + [ + "versions.yml:md5,cc4370091670b64bba7c7206403ffb3e" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:11:51.641425452" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/index/tests/tags.yml b/modules/nf-core/samtools/index/tests/tags.yml new file mode 100644 index 00000000..e0f58a7a --- /dev/null +++ b/modules/nf-core/samtools/index/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/index: + - modules/nf-core/samtools/index/** diff --git a/modules/nf-core/samtools/view/environment.yml b/modules/nf-core/samtools/view/environment.yml new file mode 100644 index 00000000..b5be8bbb --- /dev/null +++ b/modules/nf-core/samtools/view/environment.yml @@ -0,0 +1,10 @@ +name: samtools_view + +channels: + - conda-forge + - bioconda + - defaults + +dependencies: + - bioconda::htslib=1.19.1 + - bioconda::samtools=1.19.2 diff --git a/modules/nf-core/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf index be5a9676..76ec127f 100644 --- a/modules/nf-core/samtools/view/main.nf +++ b/modules/nf-core/samtools/view/main.nf @@ -2,13 +2,14 @@ process SAMTOOLS_VIEW { tag "$meta.id" label 'process_low' - conda "bioconda::samtools=1.17" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : - 'biocontainers/samtools:1.17--h00cdaf9_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.19.2--h50ea8bc_0' : + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: - tuple val(meta), path(input), path(index), path(fasta), val(region), val(subsample) + tuple val(meta), path(input), path(index), val(region), val(subsample) + tuple val(meta2), path(fasta) path qname output: @@ -24,15 +25,15 @@ process SAMTOOLS_VIEW { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def reference = fasta ? "--reference ${fasta}" : "" def readnames = qname ? "--qname-file ${qname}" : "" def region_cmd = region ? "${region}" : "" def subsample_cmd = subsample ? "--subsample ${subsample}" : "" - def file_type = args.contains("--output-fmt sam") ? "sam" : - args.contains("--output-fmt bam") ? "bam" : + def file_type = args.contains("--output-fmt sam") ? "sam" : + args.contains("--output-fmt bam") ? "bam" : args.contains("--output-fmt cram") ? "cram" : input.getExtension() if ("$input" == "${prefix}.${file_type}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" @@ -49,6 +50,7 @@ process SAMTOOLS_VIEW { $args2 \\ ${region_cmd} + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') @@ -56,10 +58,19 @@ process SAMTOOLS_VIEW { """ stub: + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + def file_type = args.contains("--output-fmt sam") ? "sam" : + args.contains("--output-fmt bam") ? "bam" : + args.contains("--output-fmt cram") ? "cram" : + input.getExtension() + if ("$input" == "${prefix}.${file_type}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + + def index = args.contains("--write-index") ? "touch ${prefix}.csi" : "" + """ - touch ${prefix}.bam - touch ${prefix}.cram + touch ${prefix}.${file_type} + ${index} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/view/meta.yml b/modules/nf-core/samtools/view/meta.yml index 3b05450b..3dadafae 100644 --- a/modules/nf-core/samtools/view/meta.yml +++ b/modules/nf-core/samtools/view/meta.yml @@ -82,3 +82,8 @@ authors: - "@joseespinosa" - "@FriederikeHanssen" - "@priyanka-surana" +maintainers: + - "@drpatelh" + - "@joseespinosa" + - "@FriederikeHanssen" + - "@priyanka-surana" diff --git a/modules/nf-core/samtools/view/samtools-view.diff b/modules/nf-core/samtools/view/samtools-view.diff index 0d94a071..f159cbee 100644 --- a/modules/nf-core/samtools/view/samtools-view.diff +++ b/modules/nf-core/samtools/view/samtools-view.diff @@ -1,42 +1,56 @@ Changes in module 'nf-core/samtools/view' --- modules/nf-core/samtools/view/main.nf +++ modules/nf-core/samtools/view/main.nf -@@ -8,8 +8,7 @@ - 'biocontainers/samtools:1.17--h00cdaf9_0' }" +@@ -8,7 +8,7 @@ + 'biocontainers/samtools:1.19.2--h50ea8bc_0' }" input: - tuple val(meta), path(input), path(index) -- tuple val(meta2), path(fasta) -+ tuple val(meta), path(input), path(index), path(fasta), val(region), val(depth) ++ tuple val(meta), path(input), path(index), val(region), val(subsample) + tuple val(meta2), path(fasta) path qname - output: -@@ -25,11 +24,13 @@ - task.ext.when == null || task.ext.when - - script: -- def args = task.ext.args ?: '' -- def args2 = task.ext.args2 ?: '' -+ def args = task.ext.args ?: '' -+ def args2 = task.ext.args2 ?: '' +@@ -28,8 +28,10 @@ + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' def prefix = task.ext.prefix ?: "${meta.id}" - def reference = fasta ? "--reference ${fasta}" : "" - def readnames = qname ? "--qname-file ${qname}": "" -+ def reference = fasta ? "--reference ${fasta}" : "" -+ def readnames = qname ? "--qname-file ${qname}": "" -+ def region_cmd = region ? "-r ${region}" : "" -+ def depth_cmd = depth ? "-s ${depth}" : "" ++ def reference = fasta ? "--reference ${fasta}" : "" ++ def readnames = qname ? "--qname-file ${qname}" : "" ++ def region_cmd = region ? "${region}" : "" ++ def subsample_cmd = subsample ? "--subsample ${subsample}" : "" def file_type = args.contains("--output-fmt sam") ? "sam" : args.contains("--output-fmt bam") ? "bam" : args.contains("--output-fmt cram") ? "cram" : -@@ -42,6 +43,8 @@ +@@ -42,9 +44,12 @@ ${reference} \\ ${readnames} \\ $args \\ -+ ${region_cmd} \\ -+ ${depth_cmd} \\ ++ ${subsample_cmd} \\ -o ${prefix}.${file_type} \\ $input \\ - $args2 +- $args2 ++ $args2 \\ ++ ${region_cmd} ++ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + +--- modules/nf-core/samtools/view/environment.yml ++++ modules/nf-core/samtools/view/environment.yml +@@ -1,8 +1,10 @@ + name: samtools_view ++ + channels: + - conda-forge + - bioconda + - defaults ++ + dependencies: ++ - bioconda::htslib=1.19.1 + - bioconda::samtools=1.19.2 +- - bioconda::htslib=1.19.1 ************************************************************ diff --git a/modules/nf-core/samtools/view/tests/bam.config b/modules/nf-core/samtools/view/tests/bam.config new file mode 100644 index 00000000..c10d1081 --- /dev/null +++ b/modules/nf-core/samtools/view/tests/bam.config @@ -0,0 +1,3 @@ +process { + ext.args = "--output-fmt bam" +} \ No newline at end of file diff --git a/modules/nf-core/samtools/view/tests/bam_index.config b/modules/nf-core/samtools/view/tests/bam_index.config new file mode 100644 index 00000000..771ae033 --- /dev/null +++ b/modules/nf-core/samtools/view/tests/bam_index.config @@ -0,0 +1,3 @@ +process { + ext.args = "--output-fmt bam --write-index" +} \ No newline at end of file diff --git a/modules/nf-core/samtools/view/tests/main.nf.test b/modules/nf-core/samtools/view/tests/main.nf.test new file mode 100644 index 00000000..45a0defb --- /dev/null +++ b/modules/nf-core/samtools/view/tests/main.nf.test @@ -0,0 +1,212 @@ +nextflow_process { + + name "Test Process SAMTOOLS_VIEW" + script "../main.nf" + process "SAMTOOLS_VIEW" + + tag "modules" + tag "modules_nfcore" + tag "samtools" + tag "samtools/view" + + test("bam") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true), + [] + ]) + input[1] = [[],[]] + input[2] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("bam_bam") }, + { assert snapshot(process.out.bai).match("bam_bai") }, + { assert snapshot(process.out.crai).match("bam_crai") }, + { assert snapshot(process.out.cram).match("bam_cram") }, + { assert snapshot(process.out.csi).match("bam_csi") }, + { assert snapshot(process.out.sam).match("bam_sam") }, + { assert snapshot(process.out.versions).match("bam_versions") } + ) + } + } + + test("cram") { + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai', checkIfExists: true) + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + input[2] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.cram[0][1]).name).match("cram_cram") }, + { assert snapshot(process.out.bai).match("cram_bai") }, + { assert snapshot(process.out.bam).match("cram_bam") }, + { assert snapshot(process.out.crai).match("cram_crai") }, + { assert snapshot(process.out.csi).match("cram_csi") }, + { assert snapshot(process.out.sam).match("cram_sam") }, + { assert snapshot(process.out.versions).match("cram_versions") } + ) + } + } + + test("cram_to_bam") { + + config "./bam.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + [] + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + input[2] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("cram_to_bam_bam") }, + { assert snapshot(process.out.bai).match("cram_to_bam_bai") }, + { assert snapshot(process.out.crai).match("cram_to_bam_crai") }, + { assert snapshot(process.out.cram).match("cram_to_bam_cram") }, + { assert snapshot(process.out.csi).match("cram_to_bam_csi") }, + { assert snapshot(process.out.sam).match("cram_to_bam_sam") }, + { assert snapshot(process.out.versions).match("cram_to_bam_versions") } + ) + } + } + + test("cram_to_bam_index") { + + config "./bam_index.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + [] + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + input[2] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("cram_to_bam_index_bam") }, + { assert snapshot(file(process.out.csi[0][1]).name).match("cram_to_bam_index_csi") }, + { assert snapshot(process.out.bai).match("cram_to_bam_index_bai") }, + { assert snapshot(process.out.crai).match("cram_to_bam_index_crai") }, + { assert snapshot(process.out.cram).match("cram_to_bam_index_cram") }, + { assert snapshot(process.out.sam).match("cram_to_bam_index_sam") }, + { assert snapshot(process.out.versions).match("cram_to_bam_index_versions") } + ) + } + } + + test("cram_to_bam_index_qname") { + + config "./bam_index.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram', checkIfExists: true), + [] + ]) + input[1] = Channel.of([ + [ id:'genome' ], // meta map + file(params.modules_testdata_base_path + 'genomics/homo_sapiens/genome/genome.fasta', checkIfExists: true) + ]) + input[2] = Channel.of("testN:2817", "testN:2814").collectFile(name: "readnames.list", newLine: true) + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("cram_to_bam_index_qname_bam") }, + { assert snapshot(file(process.out.csi[0][1]).name).match("cram_to_bam_index_qname_csi") }, + { assert snapshot(process.out.bai).match("cram_to_bam_index_qname_bai") }, + { assert snapshot(process.out.crai).match("cram_to_bam_index_qname_crai") }, + { assert snapshot(process.out.cram).match("cram_to_bam_index_qname_cram") }, + { assert snapshot(process.out.sam).match("cram_to_bam_index_qname_sam") }, + { assert snapshot(process.out.versions).match("cram_to_bam_index_qname_versions") } + ) + } + } + + test("bam_stub") { + + options "-stub" + config "./bam_index.config" + + when { + process { + """ + input[0] = Channel.of([ + [ id:'test', single_end:false ], // meta map + file(params.modules_testdata_base_path + 'genomics/sarscov2/illumina/bam/test.paired_end.bam', checkIfExists: true), + [] + ]) + input[1] = [[],[]] + input[2] = [] + """ + } + } + + then { + assertAll( + { assert process.success }, + { assert snapshot(file(process.out.bam[0][1]).name).match("bam_stub_bam") }, + { assert snapshot(file(process.out.csi[0][1]).name).match("bam_stub_csi") }, + { assert snapshot(process.out.bai).match("bam_stub_bai") }, + { assert snapshot(process.out.crai).match("bam_stub_crai") }, + { assert snapshot(process.out.cram).match("bam_stub_cram") }, + { assert snapshot(process.out.sam).match("bam_stub_sam") }, + { assert snapshot(process.out.versions).match("bam_stub_versions") } + ) + } + } +} diff --git a/modules/nf-core/samtools/view/tests/main.nf.test.snap b/modules/nf-core/samtools/view/tests/main.nf.test.snap new file mode 100644 index 00000000..f55943a7 --- /dev/null +++ b/modules/nf-core/samtools/view/tests/main.nf.test.snap @@ -0,0 +1,488 @@ +{ + "bam_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:51.256068" + }, + "cram_to_bam_index_csi": { + "content": [ + "test.bam.csi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:12.958617" + }, + "bam_stub_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:32.065301" + }, + "bam_bai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:51.258578" + }, + "bam_stub_bai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:32.071284" + }, + "bam_stub_versions": { + "content": [ + [ + "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:13:09.713353823" + }, + "cram_to_bam_index_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:12.972288" + }, + "cram_to_bam_sam": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:04.999247" + }, + "cram_to_bam_index_sam": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:12.976457" + }, + "cram_crai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:56.497581" + }, + "cram_csi": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:56.50038" + }, + "cram_to_bam_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:04.992239" + }, + "cram_to_bam_index_qname_csi": { + "content": [ + "test.bam.csi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:23.325496" + }, + "bam_stub_sam": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:32.079529" + }, + "cram_cram": { + "content": [ + "test.cram" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:56.490286" + }, + "bam_csi": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:51.262882" + }, + "cram_to_bam_crai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:04.989247" + }, + "cram_to_bam_index_crai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:12.967681" + }, + "cram_to_bam_index_qname_versions": { + "content": [ + [ + "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:13:03.935041046" + }, + "cram_to_bam_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:04.982361" + }, + "cram_to_bam_index_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:12.95456" + }, + "cram_to_bam_index_versions": { + "content": [ + [ + "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:12:55.910685496" + }, + "cram_to_bam_bai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:04.98601" + }, + "cram_to_bam_versions": { + "content": [ + [ + "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:12:47.715221169" + }, + "cram_bam": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:56.495512" + }, + "bam_stub_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:32.076908" + }, + "cram_to_bam_index_qname_bai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:23.328458" + }, + "cram_to_bam_index_qname_crai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:23.330789" + }, + "cram_bai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:56.493129" + }, + "bam_stub_crai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:32.074313" + }, + "cram_to_bam_index_qname_bam": { + "content": [ + "test.bam" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:23.322874" + }, + "bam_versions": { + "content": [ + [ + "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:12:31.692607421" + }, + "cram_to_bam_index_qname_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:23.333248" + }, + "bam_crai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:51.259774" + }, + "bam_cram": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:51.261287" + }, + "cram_to_bam_csi": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:04.995454" + }, + "cram_sam": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:56.502625" + }, + "cram_versions": { + "content": [ + [ + "versions.yml:md5,4ea32c57d546102a1b32d9693ada7cf1" + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "24.01.0" + }, + "timestamp": "2024-02-13T16:12:39.913411036" + }, + "bam_sam": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:37:51.264651" + }, + "cram_to_bam_index_bai": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:12.962863" + }, + "cram_to_bam_index_qname_sam": { + "content": [ + [ + + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:23.337634" + }, + "bam_stub_csi": { + "content": [ + "test.csi" + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.04.3" + }, + "timestamp": "2024-02-12T19:38:32.068596" + } +} \ No newline at end of file diff --git a/modules/nf-core/samtools/view/tests/tags.yml b/modules/nf-core/samtools/view/tests/tags.yml new file mode 100644 index 00000000..4fdf1dd1 --- /dev/null +++ b/modules/nf-core/samtools/view/tests/tags.yml @@ -0,0 +1,2 @@ +samtools/view: + - "modules/nf-core/samtools/view/**" diff --git a/modules/nf-core/shapeit5/ligate/environment.yml b/modules/nf-core/shapeit5/ligate/environment.yml new file mode 100644 index 00000000..d4c71302 --- /dev/null +++ b/modules/nf-core/shapeit5/ligate/environment.yml @@ -0,0 +1,7 @@ +name: shapeit5_ligate +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::shapeit5=1.0.0 diff --git a/modules/nf-core/shapeit5/ligate/main.nf b/modules/nf-core/shapeit5/ligate/main.nf index 79898758..5624d7d9 100644 --- a/modules/nf-core/shapeit5/ligate/main.nf +++ b/modules/nf-core/shapeit5/ligate/main.nf @@ -2,7 +2,7 @@ process SHAPEIT5_LIGATE { tag "$meta.id" label 'process_low' - conda "bioconda::shapeit5=1.0.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/shapeit5:1.0.0--h0c8ee15_0': 'biocontainers/shapeit5:1.0.0--h0c8ee15_0'}" @@ -18,7 +18,7 @@ process SHAPEIT5_LIGATE { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" def suffix = task.ext.suffix ?: "vcf.gz" """ @@ -31,8 +31,21 @@ process SHAPEIT5_LIGATE { --output ${prefix}.${suffix} cat <<-END_VERSIONS > versions.yml - "${task.process}": - shapeit5: "\$(SHAPEIT5_ligate | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]' | head -n 1)" + "${task.process}": + shapeit5: "\$(SHAPEIT5_ligate | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]' | head -n 1)" + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = task.ext.suffix ?: "vcf.gz" + """ + touch ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + shapeit5: "\$(SHAPEIT5_ligate | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]' | head -n 1)" END_VERSIONS """ } diff --git a/modules/nf-core/shapeit5/ligate/meta.yml b/modules/nf-core/shapeit5/ligate/meta.yml index bbc8e57e..ab68274e 100644 --- a/modules/nf-core/shapeit5/ligate/meta.yml +++ b/modules/nf-core/shapeit5/ligate/meta.yml @@ -14,44 +14,39 @@ tools: tool_dev_url: "https://github.com/odelaneau/shapeit5" doi: "10.1101/2022.10.19.512867 " licence: "['MIT']" - input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - input_list: type: file description: | VCF/BCF files containing genotype probabilities (GP field). The files should be ordered by genomic position. pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - - input_list_index: type: file description: VCF/BCF files index. pattern: "*.csi" - output: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - versions: type: file description: File containing software versions pattern: "versions.yml" - - merged_variants: type: file description: | Output VCF/BCF file for the merged regions. Phased information (HS field) is updated accordingly for the full region. pattern: "*.{vcf,bcf,vcf.gz,bcf.gz}" - authors: - "@louislenezet" +maintainers: + - "@louislenezet" diff --git a/modules/nf-core/shapeit5/phasecommon/environment.yml b/modules/nf-core/shapeit5/phasecommon/environment.yml new file mode 100644 index 00000000..8bc91822 --- /dev/null +++ b/modules/nf-core/shapeit5/phasecommon/environment.yml @@ -0,0 +1,7 @@ +name: shapeit5_phasecommon +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::shapeit5=1.0.0 diff --git a/modules/nf-core/shapeit5/phasecommon/main.nf b/modules/nf-core/shapeit5/phasecommon/main.nf index f63ed334..c1fb4e79 100644 --- a/modules/nf-core/shapeit5/phasecommon/main.nf +++ b/modules/nf-core/shapeit5/phasecommon/main.nf @@ -2,7 +2,7 @@ process SHAPEIT5_PHASECOMMON { tag "$meta.id" label 'process_medium' - conda "bioconda::shapeit5=1.0.0" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/shapeit5:1.0.0--h0c8ee15_0': 'biocontainers/shapeit5:1.0.0--h0c8ee15_0'}" @@ -22,9 +22,9 @@ process SHAPEIT5_PHASECOMMON { script: def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" def suffix = task.ext.suffix ?: "vcf.gz" + if ("$input" == "${prefix}.${suffix}") error "Input and output names are the same, set prefix in module configuration to disambiguate!" def map_command = map ? "--map $map" : "" @@ -45,8 +45,21 @@ process SHAPEIT5_PHASECOMMON { --output ${prefix}.${suffix} cat <<-END_VERSIONS > versions.yml - "${task.process}": - shapeit5: "\$(SHAPEIT5_phase_common | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]' | head -1)" + "${task.process}": + shapeit5: "\$(SHAPEIT5_phase_common | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]' | head -1)" + END_VERSIONS + """ + + stub: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def suffix = task.ext.suffix ?: "vcf.gz" + """ + touch ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + shapeit5: "\$(SHAPEIT5_phase_common | sed -nr '/Version/p' | grep -o -E '([0-9]+.){1,2}[0-9]' | head -1)" END_VERSIONS """ } diff --git a/modules/nf-core/shapeit5/phasecommon/meta.yml b/modules/nf-core/shapeit5/phasecommon/meta.yml index 0cb5ab08..5d1381fb 100644 --- a/modules/nf-core/shapeit5/phasecommon/meta.yml +++ b/modules/nf-core/shapeit5/phasecommon/meta.yml @@ -12,7 +12,6 @@ tools: tool_dev_url: "https://github.com/odelaneau/shapeit5" doi: "10.1101/2022.10.19.512867 " licence: "['MIT']" - input: - meta: type: map @@ -76,3 +75,5 @@ output: pattern: "versions.yml" authors: - "@LouisLeNezet" +maintainers: + - "@LouisLeNezet" diff --git a/modules/nf-core/tabix/bgzip/environment.yml b/modules/nf-core/tabix/bgzip/environment.yml new file mode 100644 index 00000000..361c078b --- /dev/null +++ b/modules/nf-core/tabix/bgzip/environment.yml @@ -0,0 +1,8 @@ +name: tabix_bgzip +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::tabix=1.11 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/tabix/bgzip/main.nf b/modules/nf-core/tabix/bgzip/main.nf index 8c47d9e2..3065dab0 100644 --- a/modules/nf-core/tabix/bgzip/main.nf +++ b/modules/nf-core/tabix/bgzip/main.nf @@ -2,10 +2,10 @@ process TABIX_BGZIP { tag "$meta.id" label 'process_single' - conda "bioconda::tabix=1.11" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : - 'biocontainers/tabix:1.11--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/htslib:1.19.1--h81da01d_1' : + 'biocontainers/htslib:1.19.1--h81da01d_1' }" input: tuple val(meta), path(input) @@ -44,7 +44,8 @@ process TABIX_BGZIP { output = in_bgzip ? input.getBaseName() : "${prefix}.${input.getExtension()}.gz" """ - touch ${output} + echo "" | gzip > ${output} + touch ${output}.gzi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/tabix/bgzip/meta.yml b/modules/nf-core/tabix/bgzip/meta.yml index c3ea2107..621d49ea 100644 --- a/modules/nf-core/tabix/bgzip/meta.yml +++ b/modules/nf-core/tabix/bgzip/meta.yml @@ -45,3 +45,8 @@ authors: - "@drpatelh" - "@maxulysse" - "@nvnieuwk" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@maxulysse" + - "@nvnieuwk" diff --git a/modules/nf-core/tabix/bgzip/tests/bgzip_compress.config b/modules/nf-core/tabix/bgzip/tests/bgzip_compress.config new file mode 100644 index 00000000..6b6ff55f --- /dev/null +++ b/modules/nf-core/tabix/bgzip/tests/bgzip_compress.config @@ -0,0 +1,5 @@ +process { + withName: TABIX_BGZIP { + ext.args = ' -i' + } +} diff --git a/modules/nf-core/tabix/bgzip/tests/main.nf.test b/modules/nf-core/tabix/bgzip/tests/main.nf.test new file mode 100644 index 00000000..95fd4c50 --- /dev/null +++ b/modules/nf-core/tabix/bgzip/tests/main.nf.test @@ -0,0 +1,111 @@ +nextflow_process { + + name "Test Process TABIX_BGZIP" + script "modules/nf-core/tabix/bgzip/main.nf" + process "TABIX_BGZIP" + + tag "modules" + tag "modules_nfcore" + tag "tabix" + tag "tabix/bgzip" + + test("sarscov2_vcf_bgzip_compress") { + when { + process { + """ + input[0] = [ + [ id:'bgzip_test' ], + [ file(params.test_data['sarscov2']['illumina']['test_vcf'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.output[0][1]).name + ).match("bgzip_test") + } + ) + } + } + + test("homo_genome_bedgz_compress") { + when { + process { + """ + input[0] = [ + [ id:'bedgz_test' ], + [ file(params.test_data['homo_sapiens']['genome']['genome_bed_gz'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.output[0][1]).name + ).match("bedgz_test") + } + ) + } + } + + test("sarscov2_vcf_bgzip_compress_stub") { + options '-stub' + config "./bgzip_compress.config" + + when { + process { + """ + input[0] = [ + [ id:"test_stub" ], + [ file(params.test_data['sarscov2']['illumina']['test_vcf'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.output[0][1]).name + ).match("test_stub") + } + ) + } + } + + test("sarscov2_vcf_bgzip_compress_gzi") { + config "./bgzip_compress.config" + when { + process { + """ + input[0] = [ + [ id:"gzi_compress_test" ], + [ file(params.test_data['sarscov2']['illumina']['test_vcf'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.gzi[0][1]).name + ).match("gzi_compress_test") + } + ) + } + } +} diff --git a/modules/nf-core/tabix/bgzip/tests/main.nf.test.snap b/modules/nf-core/tabix/bgzip/tests/main.nf.test.snap new file mode 100644 index 00000000..53d59932 --- /dev/null +++ b/modules/nf-core/tabix/bgzip/tests/main.nf.test.snap @@ -0,0 +1,186 @@ +{ + "gzi_compress_test": { + "content": [ + "gzi_compress_test.vcf.gz.gzi" + ], + "timestamp": "2024-02-19T14:52:29.328146" + }, + "homo_genome_bedgz_compress": { + "content": [ + { + "0": [ + [ + { + "id": "bedgz_test" + }, + "bedgz_test.bed:md5,87a15eb9c2ff20ccd5cd8735a28708f7" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,e023292de6ee109a44fc67475d658174" + ], + "gzi": [ + + ], + "output": [ + [ + { + "id": "bedgz_test" + }, + "bedgz_test.bed:md5,87a15eb9c2ff20ccd5cd8735a28708f7" + ] + ], + "versions": [ + "versions.yml:md5,e023292de6ee109a44fc67475d658174" + ] + } + ], + "timestamp": "2024-02-19T14:52:12.422209" + }, + "test_stub": { + "content": [ + "test_stub.vcf.gz" + ], + "timestamp": "2024-02-19T14:52:20.811489" + }, + "sarscov2_vcf_bgzip_compress": { + "content": [ + { + "0": [ + [ + { + "id": "bgzip_test" + }, + "bgzip_test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,e023292de6ee109a44fc67475d658174" + ], + "gzi": [ + + ], + "output": [ + [ + { + "id": "bgzip_test" + }, + "bgzip_test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "versions": [ + "versions.yml:md5,e023292de6ee109a44fc67475d658174" + ] + } + ], + "timestamp": "2024-02-19T14:52:03.706028" + }, + "sarscov2_vcf_bgzip_compress_gzi": { + "content": [ + { + "0": [ + [ + { + "id": "gzi_compress_test" + }, + "gzi_compress_test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "1": [ + [ + { + "id": "gzi_compress_test" + }, + "gzi_compress_test.vcf.gz.gzi:md5,26fd00d4e26141cd11561f6e7d4a2ad0" + ] + ], + "2": [ + "versions.yml:md5,e023292de6ee109a44fc67475d658174" + ], + "gzi": [ + [ + { + "id": "gzi_compress_test" + }, + "gzi_compress_test.vcf.gz.gzi:md5,26fd00d4e26141cd11561f6e7d4a2ad0" + ] + ], + "output": [ + [ + { + "id": "gzi_compress_test" + }, + "gzi_compress_test.vcf.gz:md5,8e722884ffb75155212a3fc053918766" + ] + ], + "versions": [ + "versions.yml:md5,e023292de6ee109a44fc67475d658174" + ] + } + ], + "timestamp": "2024-02-19T14:52:29.271494" + }, + "bgzip_test": { + "content": [ + "bgzip_test.vcf.gz" + ], + "timestamp": "2024-02-19T14:52:03.768295" + }, + "bedgz_test": { + "content": [ + "bedgz_test.bed" + ], + "timestamp": "2024-02-19T14:52:12.453855" + }, + "sarscov2_vcf_bgzip_compress_stub": { + "content": [ + { + "0": [ + [ + { + "id": "test_stub" + }, + "test_stub.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "1": [ + [ + { + "id": "test_stub" + }, + "test_stub.vcf.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,e023292de6ee109a44fc67475d658174" + ], + "gzi": [ + [ + { + "id": "test_stub" + }, + "test_stub.vcf.gz.gzi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "output": [ + [ + { + "id": "test_stub" + }, + "test_stub.vcf.gz:md5,68b329da9893e34099c7d8ad5cb9c940" + ] + ], + "versions": [ + "versions.yml:md5,e023292de6ee109a44fc67475d658174" + ] + } + ], + "timestamp": "2024-02-19T14:52:20.769619" + } +} \ No newline at end of file diff --git a/modules/nf-core/tabix/bgzip/tests/tags.yml b/modules/nf-core/tabix/bgzip/tests/tags.yml new file mode 100644 index 00000000..de0eec86 --- /dev/null +++ b/modules/nf-core/tabix/bgzip/tests/tags.yml @@ -0,0 +1,2 @@ +tabix/bgzip: + - "modules/nf-core/tabix/bgzip/**" diff --git a/modules/nf-core/tabix/bgzip/tests/vcf_none.config b/modules/nf-core/tabix/bgzip/tests/vcf_none.config new file mode 100644 index 00000000..f3a3c467 --- /dev/null +++ b/modules/nf-core/tabix/bgzip/tests/vcf_none.config @@ -0,0 +1,5 @@ +process { + withName: TABIX_BGZIP { + ext.args = '' + } +} diff --git a/modules/nf-core/tabix/tabix/environment.yml b/modules/nf-core/tabix/tabix/environment.yml new file mode 100644 index 00000000..76b45e16 --- /dev/null +++ b/modules/nf-core/tabix/tabix/environment.yml @@ -0,0 +1,8 @@ +name: tabix_tabix +channels: + - conda-forge + - bioconda + - defaults +dependencies: + - bioconda::tabix=1.11 + - bioconda::htslib=1.19.1 diff --git a/modules/nf-core/tabix/tabix/main.nf b/modules/nf-core/tabix/tabix/main.nf index 5bf332ef..1737141d 100644 --- a/modules/nf-core/tabix/tabix/main.nf +++ b/modules/nf-core/tabix/tabix/main.nf @@ -2,10 +2,10 @@ process TABIX_TABIX { tag "$meta.id" label 'process_single' - conda "bioconda::tabix=1.11" + conda "${moduleDir}/environment.yml" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : - 'biocontainers/tabix:1.11--hdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/htslib:1.19.1--h81da01d_1' : + 'biocontainers/htslib:1.19.1--h81da01d_1' }" input: tuple val(meta), path(tab) @@ -30,9 +30,9 @@ process TABIX_TABIX { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${tab}.tbi + touch ${tab}.csi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/tabix/tabix/meta.yml b/modules/nf-core/tabix/tabix/meta.yml index fcc6e524..ae5b4f43 100644 --- a/modules/nf-core/tabix/tabix/meta.yml +++ b/modules/nf-core/tabix/tabix/meta.yml @@ -43,3 +43,7 @@ authors: - "@joseespinosa" - "@drpatelh" - "@maxulysse" +maintainers: + - "@joseespinosa" + - "@drpatelh" + - "@maxulysse" diff --git a/modules/nf-core/tabix/tabix/tests/main.nf.test b/modules/nf-core/tabix/tabix/tests/main.nf.test new file mode 100644 index 00000000..3a150c70 --- /dev/null +++ b/modules/nf-core/tabix/tabix/tests/main.nf.test @@ -0,0 +1,142 @@ +nextflow_process { + + name "Test Process TABIX_TABIX" + script "modules/nf-core/tabix/tabix/main.nf" + process "TABIX_TABIX" + + tag "modules" + tag "modules_nfcore" + tag "tabix" + tag "tabix/tabix" + + test("sarscov2_bedgz_tbi") { + config "./tabix_bed.config" + when { + process { + """ + input[0] = [ + [ id:'tbi_bed' ], + [ file(params.test_data['sarscov2']['genome']['test_bed_gz'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.tbi[0][1]).name + ).match("tbi_bed") + } + ) + } + } + + test("sarscov2_gff_tbi") { + config "./tabix_gff.config" + when { + process { + """ + input[0] = [ + [ id:'tbi_gff' ], + [ file(params.test_data['sarscov2']['genome']['genome_gff3_gz'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.tbi[0][1]).name + ).match("tbi_gff") + } + ) + } + + } + + test("sarscov2_vcf_tbi") { + config "./tabix_vcf_tbi.config" + when { + process { + """ + input[0] = [ + [ id:'tbi_vcf' ], + [ file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.tbi[0][1]).name + ).match("tbi_vcf") + } + ) + } + + } + + test("sarscov2_vcf_csi") { + config "./tabix_vcf_csi.config" + when { + process { + """ + input[0] = [ + [ id:'vcf_csi' ], + [ file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.csi[0][1]).name + ).match("vcf_csi") + } + ) + } + + } + + test("sarscov2_vcf_csi_stub") { + config "./tabix_vcf_csi.config" + options "-stub" + when { + process { + """ + input[0] = [ + [ id:'vcf_csi_stub' ], + [ file(params.test_data['sarscov2']['illumina']['test_vcf_gz'], checkIfExists: true) ] + ] + """ + } + } + + then { + assertAll ( + { assert process.success }, + { assert snapshot(process.out).match() }, + { assert snapshot( + file(process.out.csi[0][1]).name + ).match("vcf_csi_stub") + } + ) + } + + } + +} diff --git a/modules/nf-core/tabix/tabix/tests/main.nf.test.snap b/modules/nf-core/tabix/tabix/tests/main.nf.test.snap new file mode 100644 index 00000000..034e38b6 --- /dev/null +++ b/modules/nf-core/tabix/tabix/tests/main.nf.test.snap @@ -0,0 +1,217 @@ +{ + "vcf_csi_stub": { + "content": [ + "test.vcf.gz.csi" + ], + "timestamp": "2024-03-04T14:51:59.788002" + }, + "tbi_gff": { + "content": [ + "genome.gff3.gz.tbi" + ], + "timestamp": "2024-02-19T14:53:37.420216" + }, + "sarscov2_gff_tbi": { + "content": [ + { + "0": [ + [ + { + "id": "tbi_gff" + }, + "genome.gff3.gz.tbi:md5,53fc683fd217aae47ef10d23c52a9178" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,f4feeda7fdd4b567102f7f8e5d7037a3" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "tbi_gff" + }, + "genome.gff3.gz.tbi:md5,53fc683fd217aae47ef10d23c52a9178" + ] + ], + "versions": [ + "versions.yml:md5,f4feeda7fdd4b567102f7f8e5d7037a3" + ] + } + ], + "timestamp": "2024-02-19T14:53:37.388157" + }, + "sarscov2_bedgz_tbi": { + "content": [ + { + "0": [ + [ + { + "id": "tbi_bed" + }, + "test.bed.gz.tbi:md5,0f17d85e7f0a042b2aa367b70df224f8" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,f4feeda7fdd4b567102f7f8e5d7037a3" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "tbi_bed" + }, + "test.bed.gz.tbi:md5,0f17d85e7f0a042b2aa367b70df224f8" + ] + ], + "versions": [ + "versions.yml:md5,f4feeda7fdd4b567102f7f8e5d7037a3" + ] + } + ], + "timestamp": "2024-02-19T14:53:28.879408" + }, + "tbi_vcf": { + "content": [ + "test.vcf.gz.tbi" + ], + "timestamp": "2024-02-19T14:53:46.402522" + }, + "vcf_csi": { + "content": [ + "test.vcf.gz.csi" + ], + "timestamp": "2024-02-19T14:53:54.921189" + }, + "sarscov2_vcf_tbi": { + "content": [ + { + "0": [ + [ + { + "id": "tbi_vcf" + }, + "test.vcf.gz.tbi:md5,897f3f378a811b90e6dee56ce08d2bcf" + ] + ], + "1": [ + + ], + "2": [ + "versions.yml:md5,f4feeda7fdd4b567102f7f8e5d7037a3" + ], + "csi": [ + + ], + "tbi": [ + [ + { + "id": "tbi_vcf" + }, + "test.vcf.gz.tbi:md5,897f3f378a811b90e6dee56ce08d2bcf" + ] + ], + "versions": [ + "versions.yml:md5,f4feeda7fdd4b567102f7f8e5d7037a3" + ] + } + ], + "timestamp": "2024-02-19T14:53:46.370358" + }, + "sarscov2_vcf_csi_stub": { + "content": [ + { + "0": [ + [ + { + "id": "vcf_csi_stub" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "1": [ + [ + { + "id": "vcf_csi_stub" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "2": [ + "versions.yml:md5,3d45df6d80883bad358631069a2940fd" + ], + "csi": [ + [ + { + "id": "vcf_csi_stub" + }, + "test.vcf.gz.csi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "tbi": [ + [ + { + "id": "vcf_csi_stub" + }, + "test.vcf.gz.tbi:md5,d41d8cd98f00b204e9800998ecf8427e" + ] + ], + "versions": [ + "versions.yml:md5,3d45df6d80883bad358631069a2940fd" + ] + } + ], + "timestamp": "2024-03-04T14:51:59.766184" + }, + "sarscov2_vcf_csi": { + "content": [ + { + "0": [ + + ], + "1": [ + [ + { + "id": "vcf_csi" + }, + "test.vcf.gz.csi:md5,0731ad6f40104d2bbb1a2cc478ef8f03" + ] + ], + "2": [ + "versions.yml:md5,f4feeda7fdd4b567102f7f8e5d7037a3" + ], + "csi": [ + [ + { + "id": "vcf_csi" + }, + "test.vcf.gz.csi:md5,0731ad6f40104d2bbb1a2cc478ef8f03" + ] + ], + "tbi": [ + + ], + "versions": [ + "versions.yml:md5,f4feeda7fdd4b567102f7f8e5d7037a3" + ] + } + ], + "timestamp": "2024-02-19T14:53:54.886876" + }, + "tbi_bed": { + "content": [ + "test.bed.gz.tbi" + ], + "timestamp": "2024-02-19T14:53:28.947628" + } +} \ No newline at end of file diff --git a/modules/nf-core/tabix/tabix/tests/tabix_bed.config b/modules/nf-core/tabix/tabix/tests/tabix_bed.config new file mode 100644 index 00000000..7ff05905 --- /dev/null +++ b/modules/nf-core/tabix/tabix/tests/tabix_bed.config @@ -0,0 +1,5 @@ +process { + withName: TABIX_TABIX { + ext.args = '-p bed' + } +} \ No newline at end of file diff --git a/modules/nf-core/tabix/tabix/tests/tabix_gff.config b/modules/nf-core/tabix/tabix/tests/tabix_gff.config new file mode 100644 index 00000000..20c0a1e3 --- /dev/null +++ b/modules/nf-core/tabix/tabix/tests/tabix_gff.config @@ -0,0 +1,5 @@ +process { + withName: TABIX_TABIX { + ext.args = '-p gff' + } +} \ No newline at end of file diff --git a/modules/nf-core/tabix/tabix/tests/tabix_vcf_csi.config b/modules/nf-core/tabix/tabix/tests/tabix_vcf_csi.config new file mode 100644 index 00000000..eb4f2d7e --- /dev/null +++ b/modules/nf-core/tabix/tabix/tests/tabix_vcf_csi.config @@ -0,0 +1,5 @@ +process { + withName: TABIX_TABIX { + ext.args = '-p vcf --csi' + } +} diff --git a/modules/nf-core/tabix/tabix/tests/tabix_vcf_tbi.config b/modules/nf-core/tabix/tabix/tests/tabix_vcf_tbi.config new file mode 100644 index 00000000..2774c8a9 --- /dev/null +++ b/modules/nf-core/tabix/tabix/tests/tabix_vcf_tbi.config @@ -0,0 +1,5 @@ +process { + withName: TABIX_TABIX { + ext.args = '-p vcf' + } +} \ No newline at end of file diff --git a/modules/nf-core/tabix/tabix/tests/tags.yml b/modules/nf-core/tabix/tabix/tests/tags.yml new file mode 100644 index 00000000..6eda0653 --- /dev/null +++ b/modules/nf-core/tabix/tabix/tests/tags.yml @@ -0,0 +1,2 @@ +tabix/tabix: + - "modules/nf-core/tabix/tabix/**" diff --git a/nextflow.config b/nextflow.config index e72be4a1..80adc22f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -8,54 +8,64 @@ // Global default params, used in configs params { - + // step - step = 'all' - input_region_string = null - input_region_file = "assets/regionsheet.csv" + step = null // Input options - input = null + input = null + input_region = "all" + map = null + tools = null + + // Panel preparation + panel = null + panel_index = null + phased = null + panel_chr_rename = null + // References - genome = null - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false - fasta = null + genome = null + igenomes_base = 's3://ngi-igenomes/igenomes/' + igenomes_ignore = false + fasta = null + fasta_fai = null + // MultiQC options - multiqc_config = null - multiqc_title = null - multiqc_logo = null - max_multiqc_email_size = '25.MB' + multiqc_config = null + multiqc_title = null + multiqc_logo = null + max_multiqc_email_size = '25.MB' multiqc_methods_description = null // Simulate - depth = [1, 2] - genotype = null + depth = 1 + genotype = null // Boilerplate options - outdir = null - publish_dir_mode = 'copy' - email = null - email_on_fail = null - plaintext_email = false - monochrome_logs = false - hook_url = null - help = false - version = false + outdir = null + publish_dir_mode = 'copy' + email = null + email_on_fail = null + plaintext_email = false + monochrome_logs = false + hook_url = null + help = false + version = false // Config options - config_profile_name = null - config_profile_description = null - custom_config_version = 'master' - custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - config_profile_contact = null - config_profile_url = null + config_profile_name = null + config_profile_description = null + custom_config_version = 'master' + custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" + config_profile_contact = null + config_profile_url = null // Max resource options // Defaults only, expecting to be overwritten - max_memory = '128.GB' - max_cpus = 16 - max_time = '240.h' + max_memory = '128.GB' + max_cpus = 16 + max_time = '240.h' // Schema validation default options validationFailUnrecognisedParams = false @@ -75,7 +85,6 @@ includeConfig 'conf/igenomes.config' // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" - includeConfig "${params.custom_config_base}/nfcore_custom.config" } catch (Exception e) { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } @@ -88,14 +97,6 @@ try { // System.err.println("WARNING: Could not load nf-core/config/phaseimpute profiles: ${params.custom_config_base}/pipeline/phaseimpute.config") // } - -// Load nf-core/phaseimpute custom profiles from different institutions. -// Warning: Uncomment only if a pipeline-specific institutional config already exists on nf-core/configs! -// try { -// includeConfig "${params.custom_config_base}/pipeline/phaseimpute.config" -// } catch (Exception e) { -// System.err.println("WARNING: Could not load nf-core/config/phaseimpute profiles: ${params.custom_config_base}/pipeline/phaseimpute.config") -// } profiles { debug { dumpHashes = true diff --git a/nextflow_schema.json b/nextflow_schema.json index c3dec469..7124fefd 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -12,12 +12,14 @@ "default": "", "properties": { "depth": { - "type": "array", - "default": [0.2, 0.5, 1], + "type": "integer", + "description": "Depth of coverage for the simulated data", + "default": 1, "fa_icon": "fas fa-list-ol" }, "genotype": { "type": "string", + "description": "Genotype position to use to simulate the data", "pattern": "^\\S+\\.(csv|tsv|txt)$", "format": "file-path", "mimetype": "text/csv" @@ -32,13 +34,38 @@ "properties": { "panel": { "type": "string", + "description": "Path to the reference panel or csv file with the list of panels", + "fa_icon": "far fa-file-code", + "format": "file-path", + "anyOf": [ + { + "pattern": "^\\S+\\.(vcf|bcf)(\\.gz)?$" + }, + { + "pattern": "^\\S+\\.(csv|tsv|txt)$", + "mimetype": "text/csv", + "schema": "assets/schema_input_panel.json" + } + ] + }, + "panel_index": { + "type": "string", + "description": "Path to the reference panel index file", "fa_icon": "far fa-file-code", - "pattern": "^\\S+\\.(vcf|bcf)(\\.gz)?$", - "format": "file-path" + "format": "file-path", + "pattern": "^\\S+\\.(vcf|bcf)(\\.gz)?\\.(csi|tbi)$" }, - "to_phase": { + "phased": { + "description": "Is the reference panel phased", "type": "boolean", "pattern": "true|false" + }, + "panel_chr_rename": { + "type": "string", + "description": "Rename the chromosome of the panel", + "pattern": "^\\S+\\.(csv|tsv|txt)$", + "format": "file-path", + "mimetype": "text/csv" } } }, @@ -60,6 +87,26 @@ "help_text": "You will need to create a design file with information about the samples in your experiment before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row. See [usage docs](https://nf-co.re/phaseimpute/usage#samplesheet-input).", "fa_icon": "fas fa-file-csv" }, + "input_region": { + "type": "string", + "description": "Region of the genome to use, can be the entire genome (i.e. 'all') or a specific chromosome or region (e.g. 'chr1', 'chr1:1000-2000'). You can also specify a file containing a list of regions to process, one per line. The file should be a comma-separated file with 3 columns, and a header row.", + "anyOf": [ + { + "pattern": "all" + }, + { + "pattern": "^(chr)?[0-9XYM]+$" + }, + { + "pattern": "^(chr)?[0-9XYM]+:[0-9]+-[0-9]+$" + }, + { + "format": "file-path", + "pattern": "^\\S+\\.csv$", + "schema": "assets/schema_input_region.json" + } + ] + }, "outdir": { "type": "string", "format": "directory-path", @@ -82,7 +129,13 @@ "type": "string", "description": "Step to run.", "fa_icon": "fas fa-step-forward", - "enum": ["simulate", "panelprep", "impute", "validate"] + "enum": ["all", "simulate", "panelprep", "impute", "validate"] + }, + "tools": { + "type": "string", + "description": "Step to run.", + "fa_icon": "fas fa-step-forward", + "enum": ["glimpse1", "glimpse2", "quilt"] } } }, @@ -105,7 +158,27 @@ "mimetype": "text/plain", "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?$", "description": "Path to FASTA genome file.", - "help_text": "This parameter is *mandatory* if `--genome` is not specified. If you don't have a BWA index available this will be generated for you automatically. Combine with `--save_reference` to save BWA index for future runs.", + "help_text": "This parameter is *mandatory* if `--genome` is not specified.", + "fa_icon": "far fa-file-code" + }, + "fasta_fai": { + "type": "string", + "format": "file-path", + "exists": true, + "mimetype": "text/plain", + "pattern": "^\\S+\\.fn?a(sta)?(\\.gz)?\\.fai$", + "description": "Path to FASTA index genome file.", + "help_text": "This parameter is *optional* even if `--genome` is not specified.", + "fa_icon": "far fa-file-code" + }, + "map": { + "type": "string", + "format": "file-path", + "exists": true, + "mimetype": "text/plain", + "pattern": "^\\S+\\.gmap(sta)?(\\.gz)?$", + "description": "Path to gmap genome file.", + "help_text": "This parameter is *optional*. This is used to refine the imputation process to match the recombination event rate in your specie.", "fa_icon": "far fa-file-code" }, "igenomes_ignore": { @@ -316,6 +389,9 @@ { "$ref": "#/definitions/simulate" }, + { + "$ref": "#/definitions/panelprep" + }, { "$ref": "#/definitions/input_output_options" }, diff --git a/nf-core-phaseimpute_logo_light.png b/nf-core-phaseimpute_logo_light.png new file mode 100644 index 00000000..767e1d57 Binary files /dev/null and b/nf-core-phaseimpute_logo_light.png differ diff --git a/nf-test.config b/nf-test.config new file mode 100644 index 00000000..b466a958 --- /dev/null +++ b/nf-test.config @@ -0,0 +1,13 @@ +config { + // location for all nf-tests + testsDir "." + + // nf-test directory including temporary files for each test + workDir System.getenv("NXF_TEST_DIR") ?: ".nf-test" + + // location of an optional nextflow.config file specific for executing tests + configFile "tests/config/nf-test.config" + + // run all test with the defined docker profile from the main nextflow.config + profile "" +} diff --git a/subworkflows/local/bam_downsample.nf b/subworkflows/local/bam_downsample/main.nf similarity index 83% rename from subworkflows/local/bam_downsample.nf rename to subworkflows/local/bam_downsample/main.nf index bcc95a87..4c9a5c72 100644 --- a/subworkflows/local/bam_downsample.nf +++ b/subworkflows/local/bam_downsample/main.nf @@ -1,16 +1,16 @@ -include { SAMTOOLS_COVERAGE } from '../../modules/nf-core/samtools/coverage/main.nf' -include { SAMTOOLS_INDEX as INDEX } from '../../modules/nf-core/samtools/index/main.nf' -include { SAMTOOLS_VIEW as VIEW_REGION } from '../../modules/nf-core/samtools/view/main.nf' -include { SAMTOOLS_VIEW as VIEW_DEPTH } from '../../modules/nf-core/samtools/view/main.nf' +include { SAMTOOLS_COVERAGE } from '../../../modules/nf-core/samtools/coverage/main.nf' +include { SAMTOOLS_INDEX as INDEX } from '../../../modules/nf-core/samtools/index/main.nf' +include { SAMTOOLS_VIEW as VIEW_REGION } from '../../../modules/nf-core/samtools/view/main.nf' +include { SAMTOOLS_VIEW as VIEW_DEPTH } from '../../../modules/nf-core/samtools/view/main.nf' -workflow BAM_DOWNSAMPLELE { +workflow BAM_DOWNSAMPLE { take: ch_bam // channel: [ [id, ref], bam, bai ] ch_depth // channel: [ val(depth) ] ch_fasta // channel: [ fasta ] - main: + main: ch_versions = Channel.empty() // Add fasta and region to bam channel @@ -41,7 +41,7 @@ workflow BAM_DOWNSAMPLELE { ch_versions = ch_versions.mix(SAMTOOLS_COVERAGE.out.versions.first()) // Compute mean depth of the region - ch_mean_depth = SAMTOOLS_COVERAGE.out.coverage.view() + ch_mean_depth = SAMTOOLS_COVERAGE.out.coverage .splitCsv(header: true, sep:'\t') .map{ metaIR, row -> [ metaIR,"${row.meandepth}" as Float ] diff --git a/subworkflows/local/bam_region.nf b/subworkflows/local/bam_region/main.nf similarity index 84% rename from subworkflows/local/bam_region.nf rename to subworkflows/local/bam_region/main.nf index 52940088..9cfa1787 100644 --- a/subworkflows/local/bam_region.nf +++ b/subworkflows/local/bam_region/main.nf @@ -1,5 +1,5 @@ -include { SAMTOOLS_INDEX as INDEX1 } from '../../modules/nf-core/samtools/index/main.nf' -include { SAMTOOLS_VIEW as VIEW_REGION } from '../../modules/nf-core/samtools/view/main.nf' +include { SAMTOOLS_INDEX as INDEX1 } from '../../../modules/nf-core/samtools/index/main.nf' +include { SAMTOOLS_VIEW as VIEW_REGION } from '../../../modules/nf-core/samtools/view/main.nf' workflow BAM_REGION { @@ -34,4 +34,4 @@ workflow BAM_REGION { emit: bam_region = ch_bam_region // channel: [ metaIR, bam, index ] versions = ch_versions // channel: [ versions.yml ] -} \ No newline at end of file +} diff --git a/subworkflows/local/compute_gl.nf b/subworkflows/local/compute_gl.nf deleted file mode 100644 index 81ca597d..00000000 --- a/subworkflows/local/compute_gl.nf +++ /dev/null @@ -1,38 +0,0 @@ -include { BCFTOOLS_MPILEUP } from '../../modules/nf-core/bcftools/mpileup/main.nf' -include { BCFTOOLS_INDEX } from '../../modules/nf-core/bcftools/index/main.nf' - - -workflow COMPUTE_GL { - - take: - ch_input // channel: [ [id, ref], bam, bai ] - ch_region // channel: [ [ref, region], fasta, val(region)] - ch_sites // channel: [ [id, region], sites, index] - ch_tsv // channel: [ [id, region], tsv, index] - - main: - - ch_versions = Channel.empty() - - ch_panel = ch_sites - .combine(ch_tsv, by:0) - ch_mpileup = ch_input - .map{ meta, bam, index -> [meta.subMap(["ref","region"]), meta, bam, index]} - .combine(ch_region, by:0) - .combine(ch_panel.map{metaIpRR,sites,tsv -> - [metaIpRR.subMap(["ref","region"]), metaIpRR, sites, tsv]}, - by:0) - .map{metaRR, metaIRR, bam, bindex, fasta, region, metaIpRR, sites, tsv -> - [metaIRR + ["panel": metaIpRR.panel], bam, fasta, sites, tsv]} - - BCFTOOLS_MPILEUP(ch_mpileup,[]) - ch_versions = ch_versions.mix(BCFTOOLS_MPILEUP.out.versions.first()) - - ch_output = BCFTOOLS_MPILEUP.out.vcf - combine(BCFTOOLS_MPILEUP.out.tbi, by:0) - - emit: - vcf = ch_output - stats = BCFTOOLS_MPILEUP.out.stats - versions = ch_versions // channel: [ versions.yml ] -} \ No newline at end of file diff --git a/subworkflows/local/compute_gl/main.nf b/subworkflows/local/compute_gl/main.nf new file mode 100644 index 00000000..277933d1 --- /dev/null +++ b/subworkflows/local/compute_gl/main.nf @@ -0,0 +1,38 @@ +include { BCFTOOLS_MPILEUP } from '../../../modules/nf-core/bcftools/mpileup/main.nf' +include { BCFTOOLS_INDEX } from '../../../modules/nf-core/bcftools/index/main.nf' + + +workflow COMPUTE_GL { + + take: + ch_input // channel: [ [id, ref], bam, bai ] + ch_target // channel: [ [panel], sites, tsv] + ch_fasta // channel: [ [ref], fasta, fai] + + main: + + ch_versions = Channel.empty() + ch_multiqc_files = Channel.empty() + + ch_mpileup = ch_input + .combine(ch_target) + .map{metaI, bam, bai, metaP, sites, tsv -> + [metaI + metaP, bam, sites, tsv]} + + BCFTOOLS_MPILEUP( + ch_mpileup, + ch_fasta, + false + ) + ch_versions = ch_versions.mix(BCFTOOLS_MPILEUP.out.versions.first()) + + ch_output = BCFTOOLS_MPILEUP.out.vcf + .combine(BCFTOOLS_MPILEUP.out.tbi, by:0) + + ch_multiqc_files = ch_multiqc_files.mix(BCFTOOLS_MPILEUP.out.stats.map{ it[1] }) + + emit: + vcf = ch_output // channel: [ [id, panel], vcf, tbi ] + versions = ch_versions // channel: [ versions.yml ] + multiqc_files = ch_multiqc_files +} diff --git a/subworkflows/local/get_panel.nf b/subworkflows/local/get_panel.nf deleted file mode 100644 index 06068a49..00000000 --- a/subworkflows/local/get_panel.nf +++ /dev/null @@ -1,94 +0,0 @@ -include { BCFTOOLS_VIEW as VIEW_VCF_SNPS } from '../../modules/nf-core/bcftools/view/main.nf' -include { BCFTOOLS_VIEW as VIEW_VCF_SITES } from '../../modules/nf-core/bcftools/view/main.nf' -include { BCFTOOLS_INDEX as VCF_INDEX1 } from '../../modules/nf-core/bcftools/index/main.nf' -include { BCFTOOLS_INDEX as VCF_INDEX3 } from '../../modules/nf-core/bcftools/index/main.nf' -include { BCFTOOLS_INDEX as VCF_INDEX4 } from '../../modules/nf-core/bcftools/index/main.nf' -include { BCFTOOLS_INDEX as VCF_INDEX5 } from '../../modules/nf-core/bcftools/index/main.nf' -include { BCFTOOLS_NORM } from '../../modules/nf-core/bcftools/norm/main.nf' -include { BCFTOOLS_QUERY } from '../../modules/nf-core/bcftools/query/main.nf' -include { TABIX_BGZIP } from '../../modules/nf-core/tabix/bgzip/main' -include { TABIX_TABIX } from '../../modules/nf-core/tabix/tabix/main' -include { VCF_PHASE_SHAPEIT5 } from '../../subworkflows/nf-core/vcf_phase_shapeit5/main' - - -workflow GET_PANEL { - take: - ch_vcf // channel: [ [id, ref], vcf, index ] - ch_region // channel: [ [ref, region], val(region) ] - ch_fasta // channel: [ fasta ] - file_chr_rename // file rename - - main: - - ch_versions = Channel.empty() - - // Normalise the panel - ch_norm = ch_vcf - .combine(ch_fasta) - - BCFTOOLS_NORM(ch_norm) - ch_versions = ch_versions.mix(BCFTOOLS_NORM.out.versions.first()) - - // Extract only the SNP - VIEW_VCF_SNPS(BCFTOOLS_NORM.out.vcf - .combine(Channel.of([[],[]])), [], [], []) - ch_versions = ch_versions.mix(VIEW_VCF_SNPS.out.versions.first()) - - VCF_INDEX3(VIEW_VCF_SNPS.out.vcf) - ch_versions = ch_versions.mix(VCF_INDEX3.out.versions.first()) - - ch_panel_norm = VIEW_VCF_SNPS.out.vcf - .combine(VCF_INDEX3, by:0) - - // Extract sites positions - vcf_region = VIEW_VCF_SNPS.out.vcf - .combine(VCF_INDEX3.out.csi, by:0) - VIEW_VCF_SITES( vcf_region - .combine(Channel.of([[]])), - [], [], []) - ch_versions = ch_versions.mix(VIEW_VCF_SITES.out.versions.first()) - - VCF_INDEX4(VIEW_VCF_SITES.out.vcf) - ch_versions = ch_versions.mix(VCF_INDEX4.out.versions.first()) - - ch_panel_sites = VIEW_VCF_SITES.out.vcf - .combine(VCF_INDEX4, by:0) - - // Convert to TSV - BCFTOOLS_QUERY(VIEW_VCF_SITES.out.vcf - .combine(VCF_INDEX4.out.csi, by:0), - [], [], []) - ch_versions = ch_versions.mix(BCFTOOLS_QUERY.out.versions.first()) - - TABIX_BGZIP(BCFTOOLS_QUERY.out.txt) - ch_versions = ch_versions.mix(TABIX_BGZIP.out.versions.first()) - - TABIX_TABIX(TABIX_BGZIP.out.output) - ch_versions = ch_versions.mix(TABIX_TABIX.out.versions.first()) - - ch_panel_tsv = TABIX_BGZIP.out.output - .combine(TABIX_TABIX.out.tbi, by: 0) - - // Phase panel - if (params.phase_panel == true) { - VCF_PHASE_SHAPEIT5(vcf_region - .map { meta, vcf, csi -> [meta, vcf, csi, [], meta.region] }, - Channel.of([[],[],[]]).collect(), - Channel.of([[],[],[]]).collect(), - Channel.of([[],[]]).collect()) - ch_versions = ch_versions.mix(VCF_PHASE_SHAPEIT5.out.versions.first()) - ch_panel_phased = VCF_PHASE_SHAPEIT5.out.variants_phased - .combine(VCF_PHASE_SHAPEIT5.out.variants_index, by: 0) - } else { - ch_panel_phased = VIEW_VCF_SNPS.out.vcf - .combine(VCF_INDEX3.out.csi, by: 0) - } - - emit: - panel_norm = ch_panel_norm // channel: [ meta, vcf, index ] - panel_sites = ch_panel_sites // channel: [ meta, bcf, index ] - panel_tsv = ch_panel_tsv // channel: [ meta, tsv, index ] - panel_phased = ch_panel_phased // channel: [ meta, vcf, index ] - - versions = ch_versions // channel: [ versions.yml ] -} diff --git a/subworkflows/local/get_panel/main.nf b/subworkflows/local/get_panel/main.nf new file mode 100644 index 00000000..4539647b --- /dev/null +++ b/subworkflows/local/get_panel/main.nf @@ -0,0 +1,90 @@ +include { BCFTOOLS_VIEW as VIEW_VCF_SNPS } from '../../../modules/nf-core/bcftools/view/main.nf' +include { BCFTOOLS_VIEW as VIEW_VCF_SITES } from '../../../modules/nf-core/bcftools/view/main.nf' +include { BCFTOOLS_INDEX as VCF_INDEX1 } from '../../../modules/nf-core/bcftools/index/main.nf' +include { BCFTOOLS_INDEX as VCF_INDEX3 } from '../../../modules/nf-core/bcftools/index/main.nf' +include { BCFTOOLS_INDEX as VCF_INDEX4 } from '../../../modules/nf-core/bcftools/index/main.nf' +include { BCFTOOLS_INDEX as VCF_INDEX5 } from '../../../modules/nf-core/bcftools/index/main.nf' +include { BCFTOOLS_NORM } from '../../../modules/nf-core/bcftools/norm/main.nf' +include { BCFTOOLS_QUERY } from '../../../modules/nf-core/bcftools/query/main.nf' +include { TABIX_BGZIP } from '../../../modules/nf-core/tabix/bgzip/main' +include { TABIX_TABIX } from '../../../modules/nf-core/tabix/tabix/main' +include { VCF_PHASE_SHAPEIT5 } from '../../../subworkflows/nf-core/vcf_phase_shapeit5/main' + + +workflow GET_PANEL { + take: + ch_vcf // channel: [ [id], vcf, index ] + ch_fasta // channel: [ [genome], fasta, fai ] + + main: + + ch_versions = Channel.empty() + + BCFTOOLS_NORM(ch_vcf, ch_fasta.map{ genome, fasta, fai -> [genome, fasta] }) + ch_versions = ch_versions.mix(BCFTOOLS_NORM.out.versions.first()) + + // Extract only the SNP + VIEW_VCF_SNPS(BCFTOOLS_NORM.out.vcf // [ meta, vcf ] + .combine(Channel.of([[]])), [], [], []) + ch_versions = ch_versions.mix(VIEW_VCF_SNPS.out.versions.first()) + + VCF_INDEX3(VIEW_VCF_SNPS.out.vcf) + ch_versions = ch_versions.mix(VCF_INDEX3.out.versions.first()) + + ch_panel_norm = VIEW_VCF_SNPS.out.vcf + .combine(VCF_INDEX3.out.csi, by:0) + + // Extract sites positions + vcf_region = VIEW_VCF_SNPS.out.vcf + .combine(VCF_INDEX3.out.csi, by:0) + VIEW_VCF_SITES( ch_panel_norm, + [], [], []) + ch_versions = ch_versions.mix(VIEW_VCF_SITES.out.versions.first()) + + VCF_INDEX4(VIEW_VCF_SITES.out.vcf) + ch_versions = ch_versions.mix(VCF_INDEX4.out.versions.first()) + + ch_panel_sites = VIEW_VCF_SITES.out.vcf + .combine(VCF_INDEX4.out.csi, by:0) + + // Convert to TSV + BCFTOOLS_QUERY(ch_panel_sites, + [], [], []) + ch_versions = ch_versions.mix(BCFTOOLS_QUERY.out.versions.first()) + + TABIX_BGZIP(BCFTOOLS_QUERY.out.output) + ch_versions = ch_versions.mix(TABIX_BGZIP.out.versions.first()) + + TABIX_TABIX(TABIX_BGZIP.out.output) + ch_versions = ch_versions.mix(TABIX_TABIX.out.versions.first()) + + ch_panel_tsv = TABIX_BGZIP.out.output + .combine(TABIX_TABIX.out.tbi, by: 0) + + // Phase panel + if (params.phased == false) { + VCF_PHASE_SHAPEIT5(vcf_region + .map { meta, vcf, csi -> [meta, vcf, csi, [], meta.region] }, + Channel.of([[],[],[]]).collect(), + Channel.of([[],[],[]]).collect(), + Channel.of([[],[]]).collect()) + ch_versions = ch_versions.mix(VCF_PHASE_SHAPEIT5.out.versions.first()) + ch_panel_phased = VCF_PHASE_SHAPEIT5.out.variants_phased + .combine(VCF_PHASE_SHAPEIT5.out.variants_index, by: 0) + } else { + ch_panel_phased = VIEW_VCF_SNPS.out.vcf + .combine(VCF_INDEX3.out.csi, by: 0) + } + + ch_panel = ch_panel_norm + .combine(ch_panel_sites, by: 0) + .combine(ch_panel_tsv, by: 0) + .combine(ch_panel_phased, by: 0) + .map{ metaI, norm, n_index, sites, s_index, tsv, t_index, phased, p_index + -> [[panel:metaI.id], norm, n_index, sites, s_index, tsv, t_index, phased, p_index] + } + + emit: + panel = ch_panel // channel: [ [panel], norm, n_index, sites, s_index, tsv, t_index, phased, p_index] + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/local/get_region/main.nf b/subworkflows/local/get_region/main.nf new file mode 100644 index 00000000..58f84e10 --- /dev/null +++ b/subworkflows/local/get_region/main.nf @@ -0,0 +1,33 @@ +include { SAMTOOLS_FAIDX } from '../../../modules/nf-core/samtools/faidx/main' + +workflow GET_REGION { + take: + input_region // Region string to use ["all", "chr1", "chr1:0-1000"] + ch_fasta // [[meta], fasta, fai] + + main: + ch_versions = Channel.empty() + + // Gather regions to use and create the meta map + if (input_region ==~ '^(chr)?[0-9XYM]+$' || input_region == "all") { + ch_regions = ch_fasta.map{it -> it[2]} + .splitCsv(header: ["chr", "size", "offset", "lidebase", "linewidth", "qualoffset"], sep: "\t") + .map{it -> [chr:it.chr, region:"0-"+it.size]} + if (input_region != "all") { + ch_regions = ch_regions.filter{it.chr == input_region} + } + ch_regions = ch_regions + .map{ [[chr: it.chr, region: it.chr + ":" + it.region], it.chr + ":" + it.region]} + } else { + if (input_region ==~ '^chr[0-9XYM]+:[0-9]+-[0-9]+$') { + ch_regions = Channel.from([input_region]) + .map{ [[chr: it.split(":")[0], "region": it], it]} + } else { + error "Invalid input_region: ${input_region}" + } + } + + emit: + regions = ch_regions // channel: [ meta, region ] + versions = ch_versions // channel: [ versions.yml ] +} diff --git a/subworkflows/local/get_region/tests/main.workflow.nf.test b/subworkflows/local/get_region/tests/main.workflow.nf.test new file mode 100644 index 00000000..9561b781 --- /dev/null +++ b/subworkflows/local/get_region/tests/main.workflow.nf.test @@ -0,0 +1,74 @@ +nextflow_workflow { + + name "Test Workflow GET_REGION" + script "../main.nf" + workflow "GET_REGION" + tag 'subworkflows' + tag 'get_region' + tag 'subworkflows/get_region' + + test("Should run with 'all'") { + + when { + workflow { + """ + input[0] = "all" + input[1] = Channel.of([ + [genome:"GRCh37"], + file("https://raw.githubusercontent.com/LouisLeNezet/test-datasets/phaseimpute/data/reference_genome/21_22/hs38DH.chr21_22.s.fa", checkIfExists: true), + file("https://raw.githubusercontent.com/LouisLeNezet/test-datasets/phaseimpute/data/reference_genome/21_22/hs38DH.chr21_22.s.fa.fai", checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out.regions).match() } + ) + } + } + + test("Should run with specified chr") { + + when { + workflow { + """ + input[0] = "chr22" + input[1] = Channel.of([ + [genome:"GRCh37"], + file("https://raw.githubusercontent.com/LouisLeNezet/test-datasets/phaseimpute/data/reference_genome/21_22/hs38DH.chr21_22.s.fa", checkIfExists: true), + file("https://raw.githubusercontent.com/LouisLeNezet/test-datasets/phaseimpute/data/reference_genome/21_22/hs38DH.chr21_22.s.fa.fai", checkIfExists: true) + ]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out.regions).match() } + ) + } + } + + test("Should run with specified region without fasta") { + + when { + workflow { + """ + input[0] = "chr22:0-4000" + input[1] = Channel.of([[],[],[]]) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out.regions).match() } + ) + } + } +} diff --git a/subworkflows/local/get_region/tests/main.workflow.nf.test.snap b/subworkflows/local/get_region/tests/main.workflow.nf.test.snap new file mode 100644 index 00000000..563a6f5d --- /dev/null +++ b/subworkflows/local/get_region/tests/main.workflow.nf.test.snap @@ -0,0 +1,63 @@ +{ + "Should run with specified region without fasta": { + "content": [ + [ + [ + { + "chr": "chr22", + "region": "chr22:0-4000" + }, + "chr22:0-4000" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-17T15:20:16.458964814" + }, + "Should run with specified chr": { + "content": [ + [ + [ + { + "chr": "chr22", + "region": "chr22:16570000-16610000" + }, + "chr22:16570000-16610000" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-17T15:20:11.51328291" + }, + "Should run with 'all'": { + "content": [ + [ + [ + { + "chr": "chr21", + "region": "chr21:16570000-16610000" + }, + "chr21:16570000-16610000" + ], + [ + { + "chr": "chr22", + "region": "chr22:16570000-16610000" + }, + "chr22:16570000-16610000" + ] + ] + ], + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-17T15:20:06.490072121" + } +} diff --git a/subworkflows/local/get_region/tests/tags.yml b/subworkflows/local/get_region/tests/tags.yml new file mode 100644 index 00000000..d1ff83bf --- /dev/null +++ b/subworkflows/local/get_region/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/get_region: + - subworkflows/local/get_region/** diff --git a/subworkflows/local/utils_nfcore_phaseimpute_pipeline/main.nf b/subworkflows/local/utils_nfcore_phaseimpute_pipeline/main.nf index 41e1bb25..a443a2a5 100644 --- a/subworkflows/local/utils_nfcore_phaseimpute_pipeline/main.nf +++ b/subworkflows/local/utils_nfcore_phaseimpute_pipeline/main.nf @@ -19,6 +19,8 @@ include { nfCoreLogo } from '../../nf-core/utils_nfcore_pipeline' include { imNotification } 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 { GET_REGION } from '../get_region' +include { SAMTOOLS_FAIDX } from '../../../modules/nf-core/samtools/faidx' /* ======================================================================================== @@ -39,7 +41,7 @@ workflow PIPELINE_INITIALISATION { main: - ch_versions = Channel.empty() + ch_versions = Channel.empty() // // Print version and exit if required and dump pipeline parameters to JSON file @@ -77,32 +79,93 @@ workflow PIPELINE_INITIALISATION { // validateInputParameters() + // + // Create fasta channel + // + genome = params.genome ? params.genome : file(params.fasta, checkIfExists:true).getBaseName() + if (params.genome) { + genome = params.genome + ch_fasta = Channel.of([[genome:genome], getGenomeAttribute('fasta')]) + fai = getGenomeAttribute('fai') + if (fai == null) { + SAMTOOLS_FAIDX(ch_fasta, Channel.of([[], []])) + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions.first()) + fai = SAMTOOLS_FAIDX.out.fai.map{ it[1] } + } + } else if (params.fasta) { + genome = file(params.fasta, checkIfExists:true).getBaseName() + ch_fasta = Channel.of([[genome:genome], file(params.fasta, checkIfExists:true)]) + if (params.fasta_fai) { + fai = file(params.fasta_fai, checkIfExists:true) + } else { + SAMTOOLS_FAIDX(ch_fasta, Channel.of([[], []])) + ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions.first()) + fai = SAMTOOLS_FAIDX.out.fai.map{ it[1] } + } + } + ch_ref_gen = ch_fasta.combine(fai) + + // + // Create map channel + // + ch_map = params.map ? + Channel.of([["map": params.map], params.map]) : + Channel.of([[],[]]) + // // Create channel from input file provided through params.input // - Channel + ch_input = Channel .fromSamplesheet("input") .map { - meta, fastq_1, fastq_2 -> - if (!fastq_2) { - return [ meta.id, meta + [ single_end:true ], [ fastq_1 ] ] - } else { - return [ meta.id, meta + [ single_end:false ], [ fastq_1, fastq_2 ] ] - } + meta, bam, bai -> + [ meta, bam, bai ] } - .groupTuple() - .map { - validateInputSamplesheet(it) + + // + // Create channel for panel + // + if (params.panel) { + if (params.panel.endsWith("csv|tsv|txt")) { + print("Panel file provided as input is a samplesheet") + ch_panel = Channel.fromSamplesheet("panel") + } else { + print("Panel file provided as input is a variant file") + ch_panel = Channel.of([ + [id: file(params.panel, checkIfExists:true).getBaseName()], + file(params.panel, checkIfExists:true), + params.panel_index ? file(params.panel_index, checkIfExists:true) : file(params.panel + ".csi", checkIfExists:true) + ]) } - .map { - meta, fastqs -> - return [ meta, fastqs.flatten() ] + } + + // + // Create channel from region input + // + if (params.input_region) { + if (params.input_region.endsWith(".csv")) { + println "Region file provided as input is a csv file" + ch_regions = Channel.fromSamplesheet("input_region") + .map{ chr, start, end -> [["chr": chr], chr + ":" + start + "-" + end]} + .map{ metaC, region -> [metaC + ["region": region], region]} + } else { + println "Region file provided is a single region" + GET_REGION ( + params.input_region, + ch_ref_gen + ) + ch_versions = ch_versions.mix(GET_REGION.out.versions.first()) + ch_regions = GET_REGION.out.regions } - .set { ch_samplesheet } + } emit: - samplesheet = ch_samplesheet - versions = ch_versions + input = ch_input // [ [meta], bam, bai ] + fasta = ch_ref_gen // [ [genome], fasta, fai ] + panel = ch_panel // [ [panel], panel ] + regions = ch_regions // [ [chr, region], region ] + map = ch_map // [ [map], map ] + versions = ch_versions } /* @@ -152,21 +215,24 @@ workflow PIPELINE_COMPLETION { // def validateInputParameters() { genomeExistsError() + // Check that only genome or fasta is provided + assert params.genome == null || params.fasta == null, "Either --genome or --fasta must be provided" + assert !(params.genome == null && params.fasta == null), "Only one of --genome or --fasta must be provided" + + // Check that a step is provided + assert params.step, "A step must be provided" + + // Check that at least one tool is provided + assert params.tools, "No tools provided" } // // Validate channels from input samplesheet // def validateInputSamplesheet(input) { - def (metas, fastqs) = input[1..2] - - // Check that multiple runs of the same sample are of the same datatype i.e. single-end / paired-end - def endedness_ok = metas.collect{ it.single_end }.unique().size == 1 - if (!endedness_ok) { - error("Please check input samplesheet -> Multiple runs of a sample must be of the same datatype i.e. single-end or paired-end: ${metas[0].id}") - } - - return [ metas[0], fastqs ] + def (meta, bam, bai) = input + // Check that individual IDs are unique + // no validation for the moment } // // Get attribute from genome config file e.g. fasta diff --git a/subworkflows/local/vcf_chr_rename.nf b/subworkflows/local/vcf_chr_rename/main.nf similarity index 66% rename from subworkflows/local/vcf_chr_rename.nf rename to subworkflows/local/vcf_chr_rename/main.nf index 806deedd..352f2bd1 100644 --- a/subworkflows/local/vcf_chr_rename.nf +++ b/subworkflows/local/vcf_chr_rename/main.nf @@ -1,5 +1,5 @@ -include { BCFTOOLS_ANNOTATE } from '../../modules/nf-core/bcftools/annotate/main.nf' -include { BCFTOOLS_INDEX as VCF_INDEX } from '../../modules/nf-core/bcftools/index/main.nf' +include { BCFTOOLS_ANNOTATE } from '../../../modules/nf-core/bcftools/annotate/main.nf' +include { BCFTOOLS_INDEX as VCF_INDEX } from '../../../modules/nf-core/bcftools/index/main.nf' workflow VCF_CHR_RENAME { take: @@ -12,9 +12,10 @@ workflow VCF_CHR_RENAME { // Rename the chromosome without prefix BCFTOOLS_ANNOTATE(ch_vcf - .combine(Channel.of([[],[], []])), - file_chr_rename) - + .combine(Channel.of([[], [], []])) + .combine(Channel.of(file_chr_rename)) + ) + VCF_INDEX(BCFTOOLS_ANNOTATE.out.vcf) ch_versions = ch_versions.mix(VCF_INDEX.out.versions.first()) @@ -24,4 +25,4 @@ workflow VCF_CHR_RENAME { emit: vcf_rename = ch_vcf_rename // [ meta, vcf, csi ] versions = ch_versions // channel: [ versions.yml ] -} \ No newline at end of file +} diff --git a/subworkflows/local/vcf_chr_rename/tests/main.nf.test b/subworkflows/local/vcf_chr_rename/tests/main.nf.test new file mode 100644 index 00000000..d045d36a --- /dev/null +++ b/subworkflows/local/vcf_chr_rename/tests/main.nf.test @@ -0,0 +1,40 @@ +nextflow_workflow { + + name "Test Subworkflow VCF_CHR_RENAME" + script "../main.nf" + config "./nextflow.config" + + workflow "VCF_CHR_RENAME" + + tag "subworkflows" + tag "subworkflows_local" + tag "subworkflows/vcf_chr_rename" + tag "vcf_chr_rename" + + tag "bcftools" + tag "bcftools/annotate" + tag "bcftools/index" + + test("Should run without error") { + + when { + workflow { + """ + input[0] = Channel.of([ + [id: "input", genome:"GRCh37"], + "https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz", + "https://raw.githubusercontent.com/nf-core/test-datasets/modules/data/genomics/homo_sapiens/illumina/vcf/NA24385_sv.vcf.gz.tbi" + ]) + input[1] = file("../../../assets/chr_rename_add.txt", exist: true) + """ + } + } + + then { + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out.ch_region).match() } + ) + } + } +} diff --git a/subworkflows/local/vcf_chr_rename/tests/main.nf.test.snap b/subworkflows/local/vcf_chr_rename/tests/main.nf.test.snap new file mode 100644 index 00000000..3aee8a9e --- /dev/null +++ b/subworkflows/local/vcf_chr_rename/tests/main.nf.test.snap @@ -0,0 +1,10 @@ +{ + "Should run without error": { + "content": null, + "meta": { + "nf-test": "0.8.4", + "nextflow": "23.10.1" + }, + "timestamp": "2024-03-13T12:47:49.775995" + } +} diff --git a/subworkflows/local/vcf_chr_rename/tests/nextflow.config b/subworkflows/local/vcf_chr_rename/tests/nextflow.config new file mode 100644 index 00000000..227aed3d --- /dev/null +++ b/subworkflows/local/vcf_chr_rename/tests/nextflow.config @@ -0,0 +1,3 @@ +params { + max_memory = '7.GB' +} diff --git a/subworkflows/local/vcf_chr_rename/tests/tags.yml b/subworkflows/local/vcf_chr_rename/tests/tags.yml new file mode 100644 index 00000000..f75be2bf --- /dev/null +++ b/subworkflows/local/vcf_chr_rename/tests/tags.yml @@ -0,0 +1,2 @@ +subworkflows/vcf_chr_rename: + - subworkflows/local/vcf_chr_rename/** diff --git a/subworkflows/local/vcf_region.nf b/subworkflows/local/vcf_region/main.nf similarity index 82% rename from subworkflows/local/vcf_region.nf rename to subworkflows/local/vcf_region/main.nf index 7a9c10a6..d4337793 100644 --- a/subworkflows/local/vcf_region.nf +++ b/subworkflows/local/vcf_region/main.nf @@ -1,5 +1,5 @@ -include { BCFTOOLS_VIEW as VIEW_VCF_REGION } from '../../modules/nf-core/bcftools/view/main.nf' -include { BCFTOOLS_INDEX as VCF_INDEX } from '../../modules/nf-core/bcftools/index/main.nf' +include { BCFTOOLS_VIEW as VIEW_VCF_REGION } from '../../../modules/nf-core/bcftools/view/main.nf' +include { BCFTOOLS_INDEX as VCF_INDEX } from '../../../modules/nf-core/bcftools/index/main.nf' workflow VCF_REGION { @@ -32,4 +32,4 @@ workflow VCF_REGION { vcf_region = ch_vcf_region // channel: [ metaIR, vcf, index ] versions = ch_versions // channel: [ versions.yml ] -} \ No newline at end of file +} diff --git a/subworkflows/nf-core/multiple_impute_glimpse2/meta.yml b/subworkflows/nf-core/multiple_impute_glimpse2/meta.yml index 46a418bc..6fea6251 100644 --- a/subworkflows/nf-core/multiple_impute_glimpse2/meta.yml +++ b/subworkflows/nf-core/multiple_impute_glimpse2/meta.yml @@ -6,14 +6,12 @@ keywords: - phase - ligate - split_reference - components: - glimpse2/chunk - glimpse2/phase - glimpse2/ligate - glimpse2/splitreference - bcftools/index - input: - ch_input: type: file @@ -22,7 +20,6 @@ input: Index file of the input file. File with sample names and ploidy information. Structure: [ meta, file, index, txt ] - - ch_ref: type: file description: | @@ -31,42 +28,37 @@ input: Target region, usually a full chromosome (e.g. chr20:1000000-2000000 or chr20). The file could possibly be without GT field (for efficiency reasons a file containing only the positions is recommended). Structure: [ meta, vcf, csi, region ] - - ch_map: type: file description: | File containing the genetic map. Structure: [ meta, gmap ] - - ch_fasta: type: file description: | Reference genome in fasta format. Reference genome index in fai format Structure: [ meta, fasta, fai ] - output: - chunk_chr: type: file description: | Tab delimited output txt file containing buffer and imputation regions. Structure: [meta, txt] - - merged_variants: type: file description: | Output VCF/BCF file for the merged regions. Phased information (HS field) is updated accordingly for the full region. Structure: [ val(meta), bcf ] - - merged_variants_index: type: file description: Index file of the ligated phased variants files. - - versions: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@LouisLeNezet" +maintainers: + - "@LouisLeNezet" diff --git a/subworkflows/nf-core/vcf_impute_glimpse/meta.yml b/subworkflows/nf-core/vcf_impute_glimpse/meta.yml index 598b6888..6c9fe223 100644 --- a/subworkflows/nf-core/vcf_impute_glimpse/meta.yml +++ b/subworkflows/nf-core/vcf_impute_glimpse/meta.yml @@ -6,13 +6,11 @@ keywords: - chunk - phase - ligate - components: - glimpse/chunk - glimpse/phase - glimpse/ligate - bcftools/index - input: - ch_input: type: file @@ -26,14 +24,12 @@ input: File containing the genetic map. The file could possibly be without GT field (for efficiency reasons a file containing only the positions is recommended). Structure: [ meta, vcf, csi, txt, region, ref_vcf, ref_csi, gmap ] - output: - chunk_chr: type: file description: | Tab delimited output txt file containing buffer and imputation regions. Structure: [meta, txt] - - phased_variants: type: file description: | @@ -41,18 +37,17 @@ output: imputed dosages (DS field), best guess genotypes (GT field), sampled haplotypes in the last (max 16) main iterations (HS field) and info-score. Structure: [ val(meta), bcf ] - - merged_variants: type: file description: | Output VCF/BCF file for the merged regions. Phased information (HS field) is updated accordingly for the full region. Structure: [ val(meta), bcf ] - - versions: type: file description: File containing software versions pattern: "versions.yml" - authors: - "@LouisLeNezet" +maintainers: + - "@LouisLeNezet" diff --git a/subworkflows/nf-core/vcf_impute_glimpse/tests/main.nf.test b/subworkflows/nf-core/vcf_impute_glimpse/tests/main.nf.test new file mode 100644 index 00000000..7931f706 --- /dev/null +++ b/subworkflows/nf-core/vcf_impute_glimpse/tests/main.nf.test @@ -0,0 +1,110 @@ +nextflow_workflow { + + name "Test Workflow VCF_IMPUTE_GLIMPSE" + script "../main.nf" + workflow "VCF_IMPUTE_GLIMPSE" + tag "glimpse" + tag "glimpse/chunk" + tag "glimpse/phase" + tag "glimpse/ligate" + tag "subworkflows" + tag "subworkflows_nfcore" + tag "vcf_impute_glimpse" + + test("Should run without failures") { + config "./nextflow.config" + + when { + params { + outdir = "tests/results" + } + workflow { + """ + samples_infos = Channel.of('NA12878 2').collectFile(name: 'sampleinfos.txt') + + ch_panel = Channel.fromList([ + [[ ref:'ref_panel'], + file("https://github.com/nf-core/test-datasets/raw/imputation/data/panel/both/1000GP.chr21_22.noNA12878.s.bcf", + checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/imputation/data/panel/both/1000GP.chr21_22.noNA12878.s.bcf.csi", + checkIfExists: true)], + [[ ref:'ref_panel2'], + file("https://github.com/nf-core/test-datasets/raw/imputation/data/panel/both/1000GP.chr21_22.noNA12878.s.bcf", + checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/imputation/data/panel/both/1000GP.chr21_22.noNA12878.s.bcf.csi", + checkIfExists: true)] + ]) + region = Channel.fromList([ + [[chr: "chr21", region: "chr21:16600000-16800000"], "chr21:16600000-16800000"], + [[chr: "chr22", region: "chr22:16600000-16800000"], "chr22:16600000-16800000"] + ]) + + input_vcf = Channel.fromList([ + [[ id:'input'], // meta map + file("https://github.com/nf-core/test-datasets/raw/imputation/data/NA12878/both/NA12878.chr21_22.s.1x.vcf.gz", checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/imputation/data/NA12878/both/NA12878.chr21_22.s.1x.vcf.gz.csi", checkIfExists: true), + ], + [[ id:'input2'], // meta map + file("https://github.com/nf-core/test-datasets/raw/imputation/data/NA12878/both/NA12878.chr21_22.s.1x.vcf.gz", checkIfExists: true), + file("https://github.com/nf-core/test-datasets/raw/imputation/data/NA12878/both/NA12878.chr21_22.s.1x.vcf.gz.csi", checkIfExists: true), + ] + ]) + input_vcf_multiple = input_vcf + .combine( samples_infos ) + .combine( region ) + .map{ metaI, vcf, index, sample, metaCR, region -> + [metaI + metaCR, vcf, index, sample, region ] + } + + ch_map = Channel.fromList([ + [[ chr: "chr21"], + file("https://github.com/nf-core/test-datasets/raw/imputation/data/genetic_maps.b38/chr21.b38.gmap.gz", checkIfExists: true) + ], + [[ chr: "chr22"], + file("https://github.com/nf-core/test-datasets/raw/imputation/data/genetic_maps.b38/chr22.b38.gmap.gz", checkIfExists: true) + ] + ]) + + // Combine input and map depending on chromosome name + ch_input_map = input_vcf_multiple + .map{ metaIRC, vcf, index, sample, region -> + [metaIRC.subMap(["chr"]), metaIRC, vcf, index, sample, region] + } + .combine(ch_map, by: 0) + .map{ metaC, metaIRC, vcf, index, sample, region, map -> + [metaIRC, vcf, index, sample, region, map] } + + // Combine input and map to reference panel could also be done by chromosome + input[0] = ch_input_map + .combine(ch_panel) + .map{ metaIRC, vcf, index, sample, region, map, metaP, ref, ref_index -> + [ metaIRC + metaP, vcf, index, sample, region, ref, ref_index, map ] + } + """ + } + } + + then { + println(workflow.out.merged_variants) + String targetFileName = "input_chr21_ref_panel2_ligate.vcf.gz" + File selectedFile = workflow.out.merged_variants.stream() + .filter(vector -> vector.size() > 1) + .map(vector -> new File(vector.get(1).toString())) + .filter(file -> file.getName().equals(targetFileName)) + .findFirst() + .orElse(null) + String selectedFilename = selectedFile != null ? selectedFile.getPath() : null + def lines = path(selectedFilename).linesGzip.last() + print(lines) + assertAll( + { assert workflow.success }, + { assert snapshot(workflow.out.versions).match("versions") }, + { assert snapshot(workflow.out.chunk_chr).match("chunk_chr") }, + { assert workflow.out.merged_variants.size() == 8}, + { assert snapshot(lines).match("merged") } + ) + } + + } + +} diff --git a/subworkflows/nf-core/vcf_impute_glimpse/tests/main.nf.test.snap b/subworkflows/nf-core/vcf_impute_glimpse/tests/main.nf.test.snap new file mode 100644 index 00000000..9265c429 --- /dev/null +++ b/subworkflows/nf-core/vcf_impute_glimpse/tests/main.nf.test.snap @@ -0,0 +1,158 @@ +{ + "chunk_chr": { + "content": [ + [ + [ + { + "id": "input", + "chr": "chr21", + "region": "chr21:16600000-16800000", + "ref": "ref_panel2" + }, + "input_chr21:16600000-16800000_chunk.txt:md5,426f0f75efed96818656876116f73b06" + ], + [ + { + "id": "input", + "chr": "chr21", + "region": "chr21:16600000-16800000", + "ref": "ref_panel" + }, + "input_chr21:16600000-16800000_chunk.txt:md5,426f0f75efed96818656876116f73b06" + ], + [ + { + "id": "input", + "chr": "chr22", + "region": "chr22:16600000-16800000", + "ref": "ref_panel2" + }, + "input_chr22:16600000-16800000_chunk.txt:md5,4f48d33fd9c1e235ccfd25827a92ddd1" + ], + [ + { + "id": "input", + "chr": "chr22", + "region": "chr22:16600000-16800000", + "ref": "ref_panel" + }, + "input_chr22:16600000-16800000_chunk.txt:md5,4f48d33fd9c1e235ccfd25827a92ddd1" + ], + [ + { + "id": "input2", + "chr": "chr21", + "region": "chr21:16600000-16800000", + "ref": "ref_panel2" + }, + "input2_chr21:16600000-16800000_chunk.txt:md5,426f0f75efed96818656876116f73b06" + ], + [ + { + "id": "input2", + "chr": "chr21", + "region": "chr21:16600000-16800000", + "ref": "ref_panel" + }, + "input2_chr21:16600000-16800000_chunk.txt:md5,426f0f75efed96818656876116f73b06" + ], + [ + { + "id": "input2", + "chr": "chr22", + "region": "chr22:16600000-16800000", + "ref": "ref_panel2" + }, + "input2_chr22:16600000-16800000_chunk.txt:md5,4f48d33fd9c1e235ccfd25827a92ddd1" + ], + [ + { + "id": "input2", + "chr": "chr22", + "region": "chr22:16600000-16800000", + "ref": "ref_panel" + }, + "input2_chr22:16600000-16800000_chunk.txt:md5,4f48d33fd9c1e235ccfd25827a92ddd1" + ] + ] + ], + "timestamp": "2023-10-17T18:20:13.045340135" + }, + "versions": { + "content": [ + [ + "versions.yml:md5,227d8e960e4382d8a615e040b874fc27", + "versions.yml:md5,227d8e960e4382d8a615e040b874fc27", + "versions.yml:md5,227d8e960e4382d8a615e040b874fc27", + "versions.yml:md5,227d8e960e4382d8a615e040b874fc27", + "versions.yml:md5,227d8e960e4382d8a615e040b874fc27", + "versions.yml:md5,227d8e960e4382d8a615e040b874fc27", + "versions.yml:md5,227d8e960e4382d8a615e040b874fc27", + "versions.yml:md5,227d8e960e4382d8a615e040b874fc27", + "versions.yml:md5,73621eae1bfd89c2ceb009524fe680d4", + "versions.yml:md5,73621eae1bfd89c2ceb009524fe680d4", + "versions.yml:md5,73621eae1bfd89c2ceb009524fe680d4", + "versions.yml:md5,73621eae1bfd89c2ceb009524fe680d4", + "versions.yml:md5,73621eae1bfd89c2ceb009524fe680d4", + "versions.yml:md5,73621eae1bfd89c2ceb009524fe680d4", + "versions.yml:md5,73621eae1bfd89c2ceb009524fe680d4", + "versions.yml:md5,73621eae1bfd89c2ceb009524fe680d4", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,7ae4d2b0252f9382dd08d783b7a234d2", + "versions.yml:md5,86d1ec939ded96a4ed3fb73ff83c240b", + "versions.yml:md5,86d1ec939ded96a4ed3fb73ff83c240b", + "versions.yml:md5,86d1ec939ded96a4ed3fb73ff83c240b", + "versions.yml:md5,86d1ec939ded96a4ed3fb73ff83c240b", + "versions.yml:md5,86d1ec939ded96a4ed3fb73ff83c240b", + "versions.yml:md5,86d1ec939ded96a4ed3fb73ff83c240b", + "versions.yml:md5,86d1ec939ded96a4ed3fb73ff83c240b", + "versions.yml:md5,86d1ec939ded96a4ed3fb73ff83c240b", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae", + "versions.yml:md5,a17a10f6eb5e140e388b92d5f19680ae" + ] + ], + "timestamp": "2023-10-17T18:20:06.846882518" + }, + "merged": { + "content": [ + "chr21\t16799989\t21:16799989:T:C\tT\tC\t.\t.\tRAF=0.000468897;AF=0;INFO=1\tGT:DS:GP:HS\t0/0:0:1,0,0:0" + ], + "timestamp": "2023-10-17T18:20:19.789038503" + } +} \ No newline at end of file diff --git a/subworkflows/nf-core/vcf_impute_glimpse/tests/nextflow.config b/subworkflows/nf-core/vcf_impute_glimpse/tests/nextflow.config new file mode 100644 index 00000000..09ab6858 --- /dev/null +++ b/subworkflows/nf-core/vcf_impute_glimpse/tests/nextflow.config @@ -0,0 +1,12 @@ +process { + withName: GLIMPSE_CHUNK { + ext.prefix = { "${meta.id}_${meta.region}_chunk" } + ext.args = "--window-size 50000 --buffer-size 1000" + } + withName: GLIMPSE_PHASE { + ext.prefix = { "${meta.id}_${meta.region}_${meta.ref}_phase_${input_region.replace(":","_")}" } + } + withName: GLIMPSE_LIGATE { + ext.prefix = { "${meta.id}_${meta.chr}_${meta.ref}_ligate" } + } +} diff --git a/subworkflows/nf-core/vcf_impute_glimpse/tests/tags.yml b/subworkflows/nf-core/vcf_impute_glimpse/tests/tags.yml new file mode 100644 index 00000000..34d27725 --- /dev/null +++ b/subworkflows/nf-core/vcf_impute_glimpse/tests/tags.yml @@ -0,0 +1,2 @@ +vcf_impute_glimpse: + - subworkflows/nf-core/vcf_impute_glimpse/** diff --git a/subworkflows/nf-core/vcf_phase_shapeit5/meta.yml b/subworkflows/nf-core/vcf_phase_shapeit5/meta.yml index 686f2d92..54c8cd01 100644 --- a/subworkflows/nf-core/vcf_phase_shapeit5/meta.yml +++ b/subworkflows/nf-core/vcf_phase_shapeit5/meta.yml @@ -7,13 +7,11 @@ keywords: - ligate - index - vcf - components: - bedtools/makewindows - shapeit5/phasecommon - shapeit5/ligate - bcftools/index - input: - meta: type: map @@ -45,7 +43,6 @@ input: type: file description: File containing the genetic map. Structure: [val(meta), path(map)] - output: - meta: type: map @@ -70,3 +67,5 @@ output: pattern: "versions.yml" authors: - "@LouisLeNezet" +maintainers: + - "@LouisLeNezet" diff --git a/tests/config/env_nf.yml b/tests/config/env_nf.yml new file mode 100644 index 00000000..e3b11408 --- /dev/null +++ b/tests/config/env_nf.yml @@ -0,0 +1,13 @@ +name: env_nf +channels: + - conda-forge + - bioconda + - anaconda + - defaults +dependencies: + - openjdk>=17.0 + - nextflow>=23.10 + - singularity>=3.8 + - nf-core>=2.13.0 + - prettier>=3.0 + - nf-test>=0.8 diff --git a/tests/config/nf-test.config b/tests/config/nf-test.config new file mode 100644 index 00000000..775c5ad7 --- /dev/null +++ b/tests/config/nf-test.config @@ -0,0 +1,50 @@ +params { + publish_dir_mode = "copy" + singularity_pull_docker_container = false + test_data_base = 'https://raw.githubusercontent.com/nf-core/test-datasets/modules' +} + +process { + cpus = 2 + memory = 3.GB + time = 2.h +} + +profiles { + singularity { + singularity.enabled = true + singularity.autoMounts = true + } + conda { + conda.enabled = true + } + mamba { + conda.enabled = true + conda.useMamba = true + } + podman { + podman.enabled = true + podman.userEmulation = true + podman.runOptions = "--runtime crun --platform linux/x86_64 --systemd=always" + } + docker { + docker.enabled = true + docker.userEmulation = false + docker.fixOwnership = true + docker.runOptions = '--platform=linux/amd64 -u $(id -u):$(id -g)' + } +} + +docker.registry = 'quay.io' +podman.registry = 'quay.io' +singularity.registry = 'quay.io' + +// Increase time available to build Conda environment +conda { createTimeout = "120 min" } + +// Load test_data.config containing paths to test data +includeConfig 'test_data.config' + +manifest { + nextflowVersion = '!>=23.04.0' +} diff --git a/tests/config/test_data.config b/tests/config/test_data.config new file mode 100644 index 00000000..d514c9c9 --- /dev/null +++ b/tests/config/test_data.config @@ -0,0 +1,729 @@ +// README: +// https://github.com/nf-core/test-datasets/blob/modules/README.md + +params { + // Base directory for test data + test_data_base = "https://raw.githubusercontent.com/nf-core/test-datasets/modules" + + test_data { + 'sarscov2' { + 'genome' { + genome_fasta = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.fasta" + genome_fasta_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.fasta.gz" + genome_fasta_fai = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.fasta.fai" + genome_fasta_txt_zst = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.fasta.txt.zst" + genome_dict = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.dict" + genome_gff3 = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.gff3" + genome_gff3_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.gff3.gz" + genome_gtf = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.gtf" + genome_paf = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.paf" + genome_sizes = "${params.test_data_base}/data/genomics/sarscov2/genome/genome.sizes" + transcriptome_fasta = "${params.test_data_base}/data/genomics/sarscov2/genome/transcriptome.fasta" + proteome_fasta = "${params.test_data_base}/data/genomics/sarscov2/genome/proteome.fasta" + transcriptome_paf = "${params.test_data_base}/data/genomics/sarscov2/genome/transcriptome.paf" + + test_bed = "${params.test_data_base}/data/genomics/sarscov2/genome/bed/test.bed" + test_bed_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/bed/test.bed.gz" + test2_bed = "${params.test_data_base}/data/genomics/sarscov2/genome/bed/test2.bed" + test_bed12 = "${params.test_data_base}/data/genomics/sarscov2/genome/bed/test.bed12" + baits_bed = "${params.test_data_base}/data/genomics/sarscov2/genome/bed/baits.bed" + bed_autosql = "${params.test_data_base}/data/genomics/sarscov2/genome/bed/bed6alt.as" + + reference_cnn = "${params.test_data_base}/data/genomics/sarscov2/genome/cnn/reference.cnn" + + kraken2 = "${params.test_data_base}/data/genomics/sarscov2/genome/db/kraken2" + kraken2_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/db/kraken2.tar.gz" + + kraken2_bracken = "${params.test_data_base}/data/genomics/sarscov2/genome/db/kraken2_bracken" + kraken2_bracken_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/db/kraken2_bracken.tar.gz" + + kaiju = "${params.test_data_base}/data/genomics/sarscov2/genome/db/kaiju" + kaiju_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/db/kaiju.tar.gz" + + kofamscan_profiles_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/db/kofamscan/profiles.tar.gz" + kofamscan_ko_list_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/db/kofamscan/ko_list.gz" + + ncbi_taxmap_zip = "${params.test_data_base}/data/genomics/sarscov2/genome/db/maltextract/ncbi_taxmap.zip" + taxon_list_txt = "${params.test_data_base}/data/genomics/sarscov2/genome/db/maltextract/taxon_list.txt" + + mmseqs_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/db/mmseqs.tar.gz" + + all_sites_fas = "${params.test_data_base}/data/genomics/sarscov2/genome/alignment/all_sites.fas" + informative_sites_fas = "${params.test_data_base}/data/genomics/sarscov2/genome/alignment/informative_sites.fas" + + contigs_genome_maf_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/alignment/last/contigs.genome.maf.gz" + contigs_genome_par = "${params.test_data_base}/data/genomics/sarscov2/genome/alignment/last/contigs.genome.par" + lastdb_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/genome/alignment/last/lastdb.tar.gz" + + baits_interval_list = "${params.test_data_base}/data/genomics/sarscov2/genome/picard/baits.interval_list" + targets_interval_list = "${params.test_data_base}/data/genomics/sarscov2/genome/picard/targets.interval_list" + regions_txt = "${params.test_data_base}/data/genomics/sarscov2/genome/graphtyper/regions.txt" + } + 'illumina' { + test_single_end_bam = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.single_end.bam" + test_single_end_sorted_bam = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.single_end.sorted.bam" + test_single_end_sorted_bam_bai = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.single_end.sorted.bam.bai" + test_paired_end_bam = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.paired_end.bam" + test_paired_end_sorted_bam = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam" + test_paired_end_sorted_bam_bai = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.paired_end.sorted.bam.bai" + test_paired_end_methylated_bam = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.paired_end.methylated.bam" + test_paired_end_methylated_sorted_bam = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.paired_end.methylated.sorted.bam" + test_paired_end_methylated_sorted_bam_bai = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.paired_end.methylated.sorted.bam.bai" + test_unaligned_bam = "${params.test_data_base}/data/genomics/sarscov2/illumina/bam/test.unaligned.bam" + + test_1_fastq_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/fastq/test_1.fastq.gz" + test_2_fastq_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/fastq/test_2.fastq.gz" + test_interleaved_fastq_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/fastq/test_interleaved.fastq.gz" + test_1_fastq_txt_zst = "${params.test_data_base}/data/genomics/sarscov2/illumina/fastq/test_1.fastq.txt.zst" + test2_1_fastq_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/fastq/test2_1.fastq.gz" + test2_2_fastq_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/fastq/test2_2.fastq.gz" + test_methylated_1_fastq_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/fastq/test.methylated_1.fastq.gz" + test_methylated_2_fastq_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/fastq/test.methylated_2.fastq.gz" + + test_bedgraph = "${params.test_data_base}/data/genomics/sarscov2/illumina/bedgraph/test.bedgraph" + + test_bigwig = "${params.test_data_base}/data/genomics/sarscov2/illumina/bigwig/test.bigwig" + + test_wig_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/wig/test.wig.gz" + + test_baserecalibrator_table = "${params.test_data_base}/data/genomics/sarscov2/illumina/gatk/test.baserecalibrator.table" + + test_computematrix_mat_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/deeptools/test.computeMatrix.mat.gz" + + test_bcf = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test.bcf" + + test_vcf = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test.vcf" + test_vcf_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test.vcf.gz" + test_vcf_gz_tbi = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test.vcf.gz.tbi" + test2_vcf = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test2.vcf" + test2_vcf_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test2.vcf.gz" + test2_vcf_gz_tbi = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test2.vcf.gz.tbi" + test2_vcf_targets_tsv_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test2.targets.tsv.gz" + test3_vcf = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test3.vcf" + test3_vcf_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test3.vcf.gz" + test3_vcf_gz_tbi = "${params.test_data_base}/data/genomics/sarscov2/illumina/vcf/test3.vcf.gz.tbi" + + contigs_fasta = "${params.test_data_base}/data/genomics/sarscov2/illumina/fasta/contigs.fasta" + scaffolds_fasta = "${params.test_data_base}/data/genomics/sarscov2/illumina/fasta/scaffolds.fasta" + + assembly_gfa = "${params.test_data_base}/data/genomics/sarscov2/illumina/gfa/assembly.gfa" + assembly_gfa_bgz = "${params.test_data_base}/data/genomics/sarscov2/illumina/gfa/assembly.gfa.bgz" + assembly_gfa_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/gfa/assembly.gfa.gz" + assembly_gfa_zst = "${params.test_data_base}/data/genomics/sarscov2/illumina/gfa/assembly.gfa.zst" + + test_single_end_bam_readlist_txt = "${params.test_data_base}/data/genomics/sarscov2/illumina/picard/test.single_end.bam.readlist.txt" + + SRR13255544_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR13255544.tar.gz" + SRR11140744_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/illumina/sra/SRR11140744.tar.gz" + } + 'nanopore' { + test_sorted_bam = "${params.test_data_base}/data/genomics/sarscov2/nanopore/bam/test.sorted.bam" + test_sorted_bam_bai = "${params.test_data_base}/data/genomics/sarscov2/nanopore/bam/test.sorted.bam.bai" + + fast5_tar_gz = "${params.test_data_base}/data/genomics/sarscov2/nanopore/fast5/fast5.tar.gz" + + test_fastq_gz = "${params.test_data_base}/data/genomics/sarscov2/nanopore/fastq/test.fastq.gz" + + test_sequencing_summary = "${params.test_data_base}/data/genomics/sarscov2/nanopore/sequencing_summary/test.sequencing_summary.txt" + } + 'metagenome' { + classified_reads_assignment = "${params.test_data_base}/data/genomics/sarscov2/metagenome/test_1.kraken2.reads.txt" + kraken_report = "${params.test_data_base}/data/genomics/sarscov2/metagenome/test_1.kraken2.report.txt" + krona_taxonomy = "${params.test_data_base}/data/genomics/sarscov2/metagenome/krona_taxonomy.tab" + seqid2taxid_map = "${params.test_data_base}/data/genomics/sarscov2/metagenome/seqid2taxid.map" + nodes_dmp = "${params.test_data_base}/data/genomics/sarscov2/metagenome/nodes.dmp" + names_dmp = "${params.test_data_base}/data/genomics/sarscov2/metagenome/names.dmp" + } + } + 'mus_musculus' { + 'genome' { + rnaseq_samplesheet = "${params.test_data_base}/data/genomics/mus_musculus/rnaseq_expression/SRP254919.samplesheet.csv" + rnaseq_genemeta = "${params.test_data_base}/data/genomics/mus_musculus/rnaseq_expression/SRP254919.gene_meta.tsv" + rnaseq_contrasts = "${params.test_data_base}/data/genomics/mus_musculus/rnaseq_expression/SRP254919.contrasts.csv" + rnaseq_matrix = "${params.test_data_base}/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.gene_counts.top1000cov.tsv" + deseq_results = "${params.test_data_base}/data/genomics/mus_musculus/rnaseq_expression/SRP254919.salmon.merged.deseq2.results.tsv" + } + 'illumina' { + test_1_fastq_gz = "${params.test_data_base}/data/genomics/mus_musculus/mageck/ERR376998.small.fastq.gz" + test_2_fastq_gz = "${params.test_data_base}/data/genomics/mus_musculus/mageck/ERR376999.small.fastq.gz" + } + 'csv' { + count_table = "${params.test_data_base}/data/genomics/mus_musculus/mageck/count_table.csv" + library = "${params.test_data_base}/data/genomics/mus_musculus/mageck/yusa_library.csv" + } + 'txt' { + design_matrix = "${params.test_data_base}/data/genomics/mus_musculus/mageck/design_matrix.txt" + } + } + 'homo_sapiens' { + '10xgenomics' { + cellranger { + test_10x_10k_pbmc_5fb_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/5gex/5fb/subsampled_sc5p_v2_hs_PBMC_10k_5fb_S1_L001_R1_001.fastq.gz" + test_10x_10k_pbmc_5fb_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/5gex/5fb/subsampled_sc5p_v2_hs_PBMC_10k_5fb_S1_L001_R2_001.fastq.gz" + test_10x_10k_pbmc_5gex_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/5gex/5gex/subsampled_sc5p_v2_hs_PBMC_10k_5gex_S1_L001_R1_001.fastq.gz" + test_10x_10k_pbmc_5gex_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/5gex/5gex/subsampled_sc5p_v2_hs_PBMC_10k_5gex_S1_L001_R2_001.fastq.gz" + test_10x_10k_pbmc_b_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/bcell/subsampled_sc5p_v2_hs_PBMC_10k_b_S1_L001_R1_001.fastq.gz" + test_10x_10k_pbmc_b_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/bcell/subsampled_sc5p_v2_hs_PBMC_10k_b_S1_L001_R2_001.fastq.gz" + test_10x_10k_pbmc_t_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/tcell/subsampled_sc5p_v2_hs_PBMC_10k_t_S1_L001_R1_001.fastq.gz" + test_10x_10k_pbmc_t_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/fastqs/tcell/subsampled_sc5p_v2_hs_PBMC_10k_t_S1_L001_R2_001.fastq.gz" + test_10x_10k_pbmc_feature_ref_csv = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc/sc5p_v2_hs_PBMC_10k_multi_5gex_5fb_b_t_feature_ref.csv" + + test_10x_10k_pbmc_cmo_cmo_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/cmo/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_multiplexing_capture_S1_L001_R1_001.fastq.gz" + test_10x_10k_pbmc_cmo_cmo_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/cmo/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_multiplexing_capture_S1_L001_R2_001.fastq.gz" + test_10x_10k_pbmc_cmo_gex1_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/gex_1/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_gex_S2_L001_R1_001.fastq.gz" + test_10x_10k_pbmc_cmo_gex1_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/gex_1/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_1_gex_S2_L001_R2_001.fastq.gz" + test_10x_10k_pbmc_cmo_gex2_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/gex_2/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_2_gex_S1_L001_R1_001.fastq.gz" + test_10x_10k_pbmc_cmo_gex2_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/fastqs/gex_2/subsampled_SC3_v3_NextGem_DI_CellPlex_Human_PBMC_10K_2_gex_S1_L001_R2_001.fastq.gz" + test_10x_10k_pbmc_cmo_feature_ref_csv = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/10k_pbmc_cmo/10k_pbmc_cmo_count_feature_reference.csv" + + test_10x_5k_cmvpos_tcells_ab_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/ab/subsampled_5k_human_antiCMV_T_TBNK_connect_AB_S2_L004_R1_001.fastq.gz" + test_10x_5k_cmvpos_tcells_ab_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/ab/subsampled_5k_human_antiCMV_T_TBNK_connect_AB_S2_L004_R2_001.fastq.gz" + test_10x_5k_cmvpos_tcells_gex1_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/gex_1/subsampled_5k_human_antiCMV_T_TBNK_connect_GEX_1_S1_L001_R1_001.fastq.gz" + test_10x_5k_cmvpos_tcells_gex1_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/gex_1/subsampled_5k_human_antiCMV_T_TBNK_connect_GEX_1_S1_L001_R2_001.fastq.gz" + test_10x_5k_cmvpos_tcells_vdj_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/vdj/subsampled_5k_human_antiCMV_T_TBNK_connect_VDJ_S1_L001_R1_001.fastq.gz" + test_10x_5k_cmvpos_tcells_vdj_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/fastqs/vdj/subsampled_5k_human_antiCMV_T_TBNK_connect_VDJ_S1_L001_R2_001.fastq.gz" + test_10x_5k_cmvpos_tcells_feature_ref_csv = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/5k_cmvpos_tcells/5k_human_antiCMV_T_TBNK_connect_Multiplex_count_feature_reference.csv" + + test_10x_vdj_ref_json = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/references/vdj/refdata-cellranger-vdj-GRCh38-alts-ensembl-5.0.0/reference.json" + test_10x_vdj_ref_fasta = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/references/vdj/refdata-cellranger-vdj-GRCh38-alts-ensembl-5.0.0/fasta/regions.fa" + test_10x_vdj_ref_suppfasta = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger/references/vdj/refdata-cellranger-vdj-GRCh38-alts-ensembl-5.0.0/fasta/supp_regions.fa" + + test_scATAC_1_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R1_001.fastq.gz" + test_scATAC_2_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R2_001.fastq.gz" + test_scATAC_3_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_R3_001.fastq.gz" + test_scATAC_I_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/cellranger-atac/test_scATAC_S1_L001_I1_001.fastq.gz" + } + spaceranger { + test_10x_ffpe_cytassist_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/spaceranger/human-brain-cancer-11-mm-capture-area-ffpe-2-standard_v2_ffpe_cytassist/CytAssist_11mm_FFPE_Human_Glioblastoma_2_S1_L001_R1_001.fastq.gz" + test_10x_ffpe_cytassist_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/spaceranger/human-brain-cancer-11-mm-capture-area-ffpe-2-standard_v2_ffpe_cytassist/CytAssist_11mm_FFPE_Human_Glioblastoma_2_S1_L001_R2_001.fastq.gz" + test_10x_ffpe_cytassist_image = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/spaceranger/human-brain-cancer-11-mm-capture-area-ffpe-2-standard_v2_ffpe_cytassist/CytAssist_11mm_FFPE_Human_Glioblastoma_image.tif" + test_10x_ffpe_cytassist_probeset = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/spaceranger/human-brain-cancer-11-mm-capture-area-ffpe-2-standard_v2_ffpe_cytassist/CytAssist_11mm_FFPE_Human_Glioblastoma_probe_set.csv" + + test_10x_ffpe_v1_fastq_1_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/spaceranger/human-ovarian-cancer-1-standard_v1_ffpe/Visium_FFPE_Human_Ovarian_Cancer_S1_L001_R1_001.fastq.gz" + test_10x_ffpe_v1_fastq_2_gz = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/spaceranger/human-ovarian-cancer-1-standard_v1_ffpe/Visium_FFPE_Human_Ovarian_Cancer_S1_L001_R2_001.fastq.gz" + test_10x_ffpe_v1_image = "${params.test_data_base}/data/genomics/homo_sapiens/10xgenomics/spaceranger/human-ovarian-cancer-1-standard_v1_ffpe/Visium_FFPE_Human_Ovarian_Cancer_image.jpg" + } + } + 'genome' { + genome_elfasta = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.elfasta" + genome_fasta = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.fasta" + genome_fasta_fai = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.fasta.fai" + genome_fasta_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.fasta.gz" + genome_fasta_gz_fai = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.fasta.gz.fai" + genome_fasta_gz_gzi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.fasta.gz.gzi" + genome_strtablefile = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome_strtablefile.zip" + genome_dict = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.dict" + genome_gff3 = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.gff3" + genome_gtf = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.gtf" + genome_interval_list = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.interval_list" + genome_multi_interval_bed = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.multi_intervals.bed" + genome_blacklist_interval_bed = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.blacklist_intervals.bed" + genome_sizes = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.sizes" + genome_bed = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.bed" + genome_header = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.header" + genome_bed_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.bed.gz" + genome_bed_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.bed.gz.tbi" + genome_elsites = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.elsites" + transcriptome_fasta = "${params.test_data_base}/data/genomics/homo_sapiens/genome/transcriptome.fasta" + genome2_fasta = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome2.fasta" + genome_chain_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.chain.gz" + genome_annotated_interval_tsv = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.annotated_intervals.tsv" + genome_mt_gb = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.NC_012920_1.gb" + genome_preprocessed_count_tsv = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.preprocessed_intervals.counts.tsv" + genome_preprocessed_interval_list = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.preprocessed_intervals.interval_list" + genome_ploidy_model = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.ploidy_model.tar.gz" + genome_ploidy_calls = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.ploidy_calls.tar.gz" + genome_germline_cnv_model = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.germline_cnv_model.tar.gz" + genome_germline_cnv_calls = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome.germline_cnv_calls.tar.gz" + genome_motifs = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome_motifs.txt" + genome_config = "${params.test_data_base}/data/genomics/homo_sapiens/genome/genome_config.json" + + genome_1_fasta = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr1/genome.fasta.gz" + genome_1_gtf = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr1/genome.gtf" + + genome_21_sdf = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/genome_sdf.tar.gz" + genome_21_fasta = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta" + genome_21_fasta_fai = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/genome.fasta.fai" + genome_21_gencode_gtf = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/chr21_gencode.gtf" + genome_21_dict = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/genome.dict" + genome_21_sizes = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/genome.sizes" + genome_21_interval_list = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/genome.interval_list" + genome_21_annotated_bed = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/annotated.bed" + genome_21_multi_interval_bed = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed" + genome_21_multi_interval_antitarget_bed = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.antitarget.bed" + genome_21_multi_interval_bed_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed.gz" + genome_21_multi_interval_bed_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/multi_intervals.bed.gz.tbi" + genome_21_chromosomes_dir = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/chromosomes.tar.gz" + genome_21_reference_cnn = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/reference_chr21.cnn" + genome_21_eigenstrat_snp = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/chr_21.snp" + genome_21_stitch_posfile = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/sequence/dbsnp_138.hg38.first_10_biallelic_sites.tsv" + + dbsnp_146_hg38_elsites = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/dbsnp_146.hg38.elsites" + dbsnp_146_hg38_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/dbsnp_146.hg38.vcf.gz" + dbsnp_146_hg38_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/dbsnp_146.hg38.vcf.gz.tbi" + gnomad_r2_1_1_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/gnomAD.r2.1.1.vcf.gz" + gnomad_r2_1_1_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/gnomAD.r2.1.1.vcf.gz.tbi" + mills_and_1000g_indels_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/mills_and_1000G.indels.vcf.gz" + mills_and_1000g_indels_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/mills_and_1000G.indels.vcf.gz.tbi" + syntheticvcf_short_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/syntheticvcf_short.vcf.gz" + syntheticvcf_short_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/syntheticvcf_short.vcf.gz.tbi" + syntheticvcf_short_score = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/syntheticvcf_short.score" + gnomad_r2_1_1_sv_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/gnomAD.r2.1.1-sv.vcf.gz" + gnomad2_r2_1_1_sv_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/gnomAD2.r2.1.1-sv.vcf.gz" + + hapmap_3_3_hg38_21_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/hapmap_3.3.hg38.vcf.gz" + hapmap_3_3_hg38_21_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/hapmap_3.3.hg38.vcf.gz.tbi" + res_1000g_omni2_5_hg38_21_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/1000G_omni2.5.hg38.vcf.gz" + res_1000g_omni2_5_hg38_21_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/1000G_omni2.5.hg38.vcf.gz.tbi" + res_1000g_phase1_snps_hg38_21_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/1000G_phase1.snps.hg38.vcf.gz" + res_1000g_phase1_snps_hg38_21_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/1000G_phase1.snps.hg38.vcf.gz.tbi" + dbsnp_138_hg38_21_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz" + dbsnp_138_hg38_21_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/dbsnp_138.hg38.vcf.gz.tbi" + gnomad_r2_1_1_21_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz" + gnomad_r2_1_1_21_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/gnomAD.r2.1.1.vcf.gz.tbi" + mills_and_1000g_indels_21_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/mills_and_1000G.indels.hg38.vcf.gz" + mills_and_1000g_indels_21_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/mills_and_1000G.indels.hg38.vcf.gz.tbi" + haplotype_map = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/haplotype_map.txt" + dbNSFP_4_1a_21_hg38_txt_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/dbNSFP4.1a.21.txt.gz" + dbNSFP_4_1a_21_hg38_txt_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/chr21/germlineresources/dbNSFP4.1a.21.txt.gz.tbi" + + index_salmon = "${params.test_data_base}/data/genomics/homo_sapiens/genome/index/salmon" + repeat_expansions = "${params.test_data_base}/data/genomics/homo_sapiens/genome/loci/repeat_expansions.json" + justhusky_ped = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/ped/justhusky.ped" + justhusky_minimal_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/ped/justhusky_minimal.vcf.gz" + justhusky_minimal_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/ped/justhusky_minimal.vcf.gz.tbi" + + vcfanno_tar_gz = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/vcfanno/vcfanno_grch38_module_test.tar.gz" + vcfanno_toml = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vcf/vcfanno/vcfanno.toml" + updsites_bed = "${params.test_data_base}/data/genomics/homo_sapiens/genome/updsites.bed" + + prg_input = "${params.test_data_base}/data/genomics/homo_sapiens/genome/PRG_test.zip" + crispr_functional_counts = "${params.test_data_base}/data/genomics/homo_sapiens/genome/tsv/functional_genomics_counts.tsv" + crispr_functional_library = "${params.test_data_base}/data/genomics/homo_sapiens/genome/tsv/library_functional_genomics.tsv" + + vep_cache = "${params.test_data_base}/data/genomics/homo_sapiens/genome/vep.tar.gz" + affy_array_samplesheet = "${params.test_data_base}/data/genomics/homo_sapiens/array_expression/GSE38751.csv" + affy_array_celfiles_tar = "${params.test_data_base}/data/genomics/homo_sapiens/array_expression/GSE38751_RAW.tar" + + } + 'pangenome' { + pangenome_fa = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.fa" + pangenome_fa_bgzip = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.fa.gz" + pangenome_fa_bgzip_fai = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.fa.gz.fai" + pangenome_fa_bgzip_gzi = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.fa.gz.gzi" + pangenome_paf = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.paf" + pangenome_paf_gz = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.paf.gz" + pangenome_seqwish_gfa = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.seqwish.gfa" + pangenome_smoothxg_gfa = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.smoothxg.gfa" + pangenome_gfaffix_gfa = "${params.test_data_base}/data/pangenomics/homo_sapiens/pangenome.gfaffix.gfa" + 'odgi' { + pangenome_og = "${params.test_data_base}/data/pangenomics/homo_sapiens/odgi/pangenome.og" + pangenome_lay = "${params.test_data_base}/data/pangenomics/homo_sapiens/odgi/pangenome.lay" + } + } + 'illumina' { + test_paired_end_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam" + test_paired_end_sorted_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.paired_end.sorted.bam.bai" + test_paired_end_name_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.paired_end.name.sorted.bam" + test_paired_end_markduplicates_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.bam" + test_paired_end_markduplicates_sorted_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.bam.bai" + test_paired_end_markduplicates_sorted_referencesn_txt = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.paired_end.markduplicates.sorted.referencesn.txt" + test_paired_end_recalibrated_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam" + test_paired_end_recalibrated_sorted_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.paired_end.recalibrated.sorted.bam.bai" + test_paired_end_umi_consensus_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.umi_consensus.bam" + test_paired_end_umi_converted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.umi_converted.bam" + test_paired_end_umi_grouped_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.umi_grouped.bam" + test_paired_end_umi_histogram_txt = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.umi_histogram.txt" + test_paired_end_umi_unsorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.umi_unsorted.bam" + test_paired_end_umi_unsorted_tagged_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.unsorted_tagged.bam" + test_paired_end_hla = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/example_hla_pe.bam" + test_paired_end_hla_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/example_hla_pe.sorted.bam" + test_paired_end_hla_sorted_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/example_hla_pe.sorted.bam.bai" + test_rna_paired_end_sorted_chr6_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.rna.paired_end.sorted.chr6.bam" + test_rna_paired_end_sorted_chr6_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test.rna.paired_end.sorted.chr6.bam.bai" + + test2_paired_end_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam" + test2_paired_end_sorted_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test2.paired_end.sorted.bam.bai" + test2_paired_end_name_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test2.paired_end.name.sorted.bam" + test2_paired_end_markduplicates_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test2.paired_end.markduplicates.sorted.bam" + test2_paired_end_markduplicates_sorted_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test2.paired_end.markduplicates.sorted.bam.bai" + test2_paired_end_recalibrated_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam" + test2_paired_end_recalibrated_sorted_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test2.paired_end.recalibrated.sorted.bam.bai" + test2_paired_end_umi_consensus_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test2.paired_end.umi_consensus.bam" + test2_paired_end_umi_converted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test2.paired_end.umi_converted.bam" + test2_paired_end_umi_grouped_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test2.paired_end.umi_grouped.bam" + test2_paired_end_umi_histogram_txt = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test2.paired_end.umi_histogram.txt" + test2_paired_end_umi_unsorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test2.paired_end.umi_unsorted.bam" + test2_paired_end_umi_unsorted_tagged_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test2.paired_end.unsorted_tagged.bam" + test_paired_end_duplex_umi_unmapped_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.duplex_umi_unmapped.bam" + test_paired_end_duplex_umi_mapped_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.duplex_umi_mapped.bam" + test_paired_end_duplex_umi_mapped_tagged_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.duplex_umi_mapped_tagged.bam" + test_paired_end_duplex_umi_grouped_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.duplex_umi_grouped.bam" + test_paired_end_duplex_umi_duplex_consensus_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/umi/test.paired_end.duplex_umi_duplex_consensus.bam" + + mitochon_standin_recalibrated_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/mitochon_standin.recalibrated.sorted.bam" + mitochon_standin_recalibrated_sorted_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/mitochon_standin.recalibrated.sorted.bam.bai" + test_illumina_mt_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test_illumina_mt.bam" + test_illumina_mt_bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test_illumina_mt.bam.bai" + + test3_single_end_markduplicates_sorted_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/test3.single_end.markduplicates.sorted.bam" + + read_group_settings_txt = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bam/read_group_settings.txt" + + test_paired_end_sorted_cram = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram" + test_paired_end_sorted_cram_crai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test.paired_end.sorted.cram.crai" + test_paired_end_markduplicates_sorted_cram = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test.paired_end.markduplicates.sorted.cram" + test_paired_end_markduplicates_sorted_cram_crai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test.paired_end.markduplicates.sorted.cram.crai" + test_paired_end_recalibrated_sorted_cram = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram" + test_paired_end_recalibrated_sorted_cram_crai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test.paired_end.recalibrated.sorted.cram.crai" + + test2_paired_end_sorted_cram = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test2.paired_end.sorted.cram" + test2_paired_end_sorted_cram_crai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test2.paired_end.sorted.cram.crai" + test2_paired_end_markduplicates_sorted_cram = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test2.paired_end.markduplicates.sorted.cram" + test2_paired_end_markduplicates_sorted_cram_crai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test2.paired_end.markduplicates.sorted.cram.crai" + test2_paired_end_recalibrated_sorted_cram = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test2.paired_end.recalibrated.sorted.cram" + test2_paired_end_recalibrated_sorted_cram_crai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test2.paired_end.recalibrated.sorted.cram.crai" + test3_paired_end_recalibrated_sorted_cram = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test3.paired_end.recalibrated.sorted.cram" + test3_paired_end_recalibrated_sorted_cram_crai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/cram/test3.paired_end.recalibrated.sorted.cram.crai" + + test_1_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test_1.fastq.gz" + test_2_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test_2.fastq.gz" + test_umi_1_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test.umi_1.fastq.gz" + test_umi_2_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test.umi_2.fastq.gz" + test2_1_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test2_1.fastq.gz" + test2_2_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test2_2.fastq.gz" + test2_umi_1_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test2.umi_1.fastq.gz" + test2_umi_2_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test2.umi_2.fastq.gz" + test_rnaseq_1_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test_rnaseq_1.fastq.gz" + test_rnaseq_2_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test_rnaseq_2.fastq.gz" + test_paired_end_duplex_umi_1_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test_duplex_umi_1.fastq.gz" + test_paired_end_duplex_umi_2_fastq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/fastq/test_duplex_umi_2.fastq.gz" + + test_baserecalibrator_table = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test.baserecalibrator.table" + test2_baserecalibrator_table = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test2.baserecalibrator.table" + test_pileups_table = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test.pileups.table" + test2_pileups_table = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test2.pileups.table" + + test_paired_end_sorted_dragstrmodel = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test_paired_end_sorted_dragstrmodel.txt" + + test_genomicsdb_tar_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test_genomicsdb.tar.gz" + test_pon_genomicsdb_tar_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test_pon_genomicsdb.tar.gz" + + test2_haplotc_ann_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz" + test2_haplotc_ann_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.ann.vcf.gz.tbi" + test_haplotc_cnn_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz" + test_haplotc_cnn_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test_haplotcaller.cnn.vcf.gz.tbi" + + test2_haplotc_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.vcf.gz" + test2_haplotc_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/haplotypecaller_calls/test2_haplotc.vcf.gz.tbi" + + test2_recal = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.recal" + test2_recal_idx = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.recal.idx" + test2_tranches = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2.tranches" + test2_allele_specific_recal = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2_allele_specific.recal" + test2_allele_specific_recal_idx = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2_allele_specific.recal.idx" + test2_allele_specific_tranches = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/variantrecalibrator/test2_allele_specific.tranches" + + test_test2_paired_mutect2_calls_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz" + test_test2_paired_mutect2_calls_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.tbi" + test_test2_paired_mutect2_calls_vcf_gz_stats = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.vcf.gz.stats" + test_test2_paired_mutect2_calls_f1r2_tar_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/paired_mutect2_calls/test_test2_paired_mutect2_calls.f1r2.tar.gz" + test_test2_paired_mutect2_calls_artifact_prior_tar_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test_test2_paired_mutect2_calls.artifact-prior.tar.gz" + test_test2_paired_segmentation_table = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test_test2_paired.segmentation.table" + test_test2_paired_contamination_table = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/test_test2_paired.contamination.table" + + test_genome_vcf = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gvcf/test.genome.vcf" + test_genome_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz" + test_genome_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.gz.tbi" + test_genome_vcf_idx = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gvcf/test.genome.vcf.idx" + + test_genome_vcf_ud = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/svd/test.genome.vcf.UD" + test_genome_vcf_mu = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/svd/test.genome.vcf.mu" + test_genome_vcf_bed = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/svd/test.genome.vcf.bed" + + test2_genome_vcf = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf" + test2_genome_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz" + test2_genome_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.gz.tbi" + test2_genome_vcf_idx = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gvcf/test2.genome.vcf.idx" + + test_genome21_indels_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/test.genome_21.somatic_sv.vcf.gz" + test_genome21_indels_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/test.genome_21.somatic_sv.vcf.gz.tbi" + + test_mpileup = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/mpileup/test.mpileup.gz" + test2_mpileup = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/mpileup/test2.mpileup.gz" + + test_broadpeak = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/broadpeak/test.broadPeak" + test2_broadpeak = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/broadpeak/test2.broadPeak" + + test_narrowpeak = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/narrowpeak/test.narrowPeak" + test2_narrowpeak = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/narrowpeak/test2.narrowPeak" + + test_yak = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/yak/test.yak" + test2_yak = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/yak/test2.yak" + + cutandrun_bedgraph_test_1 = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bedgraph/cutandtag_h3k27me3_test_1.bedGraph" + cutandrun_bedgraph_test_2 = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bedgraph/cutandtag_igg_test_1.bedGraph" + + empty_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/empty.vcf.gz" + empty_vcf_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/empty.vcf.gz.tbi" + + simulated_sv = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/chr21/simulated_sv.vcf.gz" + simulated_sv_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/chr21/simulated_sv.vcf.gz.tbi" + simulated_sv2 = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/chr21/simulated_sv2.vcf.gz" + simulated_sv2_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/chr21/simulated_sv2.vcf.gz.tbi" + + test_rnaseq_vcf = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/test.rnaseq.vcf" + test_sv_vcf = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/sv_query.vcf.gz" + test_sv_vcf_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/sv_query.vcf.gz.tbi" + genmod_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/genmod.vcf.gz" + genmod_annotate_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/test_annotate.vcf.gz" + genmod_models_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/test_models.vcf.gz" + genmod_score_vcf_gz = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/test_score.vcf.gz" + + test_mito_vcf = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/vcf/NA12878_chrM.vcf.gz" + + test_pytor = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/pytor/test.pytor" + rank_model = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/genmod/svrank_model_-v1.8-.ini" + + test_flowcell = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bcl/flowcell.tar.gz" + test_flowcell_samplesheet = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/bcl/flowcell_samplesheet.csv" + + varlociraptor_scenario = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/varlociraptor/scenario.yml" + + contig_ploidy_priors_table = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/gatk/contig_ploidy_priors_table.tsv" + + purecn_ex1_bam = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/purecn/purecn_ex1.bam" + purecn_ex1_bai = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/purecn/purecn_ex1.bam.bai" + purecn_ex1_interval = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/purecn/purecn_ex1_intervals.txt" + purecn_ex1_normal = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/purecn/purecn_ex1_normal.txt.gz" + purecn_ex2_normal = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/purecn/purecn_ex2_normal.txt.gz" + purecn_normalpanel_vcf = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/purecn/purecn_normalpanel.vcf.gz" + purecn_normalpanel_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/illumina/purecn/purecn_normalpanel.vcf.gz.tbi" + } + 'pacbio' { + primers = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/fasta/primers.fasta" + alz = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.bam" + alzpbi = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.bam.pbi" + ccs = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.ccs.bam" + ccs_fa = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/fasta/alz.ccs.fasta" + ccs_fa_gz = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/fasta/alz.ccs.fasta.gz" + ccs_fq = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/fastq/alz.ccs.fastq" + ccs_fq_gz = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/fastq/alz.ccs.fastq.gz" + ccs_xml = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/xml/alz.ccs.consensusreadset.xml" + hifi = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/fastq/test_hifi.fastq.gz" + lima = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.bam" + refine = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.flnc.bam" + cluster = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.flnc.clustered.bam" + singletons = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.flnc.clustered.singletons.bam" + aligned = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.flnc.clustered.singletons.merged.aligned.bam" + alignedbai = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bam/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.flnc.clustered.singletons.merged.aligned.bam.bai" + genemodel1 = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bed/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.flnc.clustered.singletons.merged.aligned_tc.bed" + genemodel2 = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/bed/alz.ccs.fl.NEB_5p--NEB_Clontech_3p.flnc.clustered.singletons.merged.aligned_tc.2.bed" + filelist = "${params.test_data_base}/data/genomics/homo_sapiens/pacbio/txt/filelist.txt" + } + 'scramble' { + fasta = "${params.test_data_base}/data/genomics/homo_sapiens/scramble/test.fa" + fasta_fai = "${params.test_data_base}/data/genomics/homo_sapiens/scramble/test.fa.fai" + bam = "${params.test_data_base}/data/genomics/homo_sapiens/scramble/test.bam" + bam_bai = "${params.test_data_base}/data/genomics/homo_sapiens/scramble/test.bam.bai" + cram = "${params.test_data_base}/data/genomics/homo_sapiens/scramble/test.cram" + cram_crai = "${params.test_data_base}/data/genomics/homo_sapiens/scramble/test.cram.crai" + bed = "${params.test_data_base}/data/genomics/homo_sapiens/scramble/test.bed" + } + 'gene_set_analysis' { + gct = "${params.test_data_base}/data/genomics/homo_sapiens/gene_set_analysis/P53_6samples_collapsed_symbols.gct" + cls = "${params.test_data_base}/data/genomics/homo_sapiens/gene_set_analysis/P53_6samples.cls" + gmx = "${params.test_data_base}/data/genomics/homo_sapiens/gene_set_analysis/c1.symbols.reduced.gmx" + } + 'cnvkit' { + amplicon_cnr = "https://raw.githubusercontent.com/etal/cnvkit/v0.9.9/test/formats/amplicon.cnr" + amplicon_cns = "https://raw.githubusercontent.com/etal/cnvkit/v0.9.9/test/formats/amplicon.cns" + } + } + 'bacteroides_fragilis' { + 'genome' { + genome_fna_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/genome/genome.fna.gz" + genome_gbff_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/genome/genome.gbff.gz" + genome_paf = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/genome/genome.paf" + genome_gff_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/genome/genome.gff.gz" + + } + 'hamronization' { + genome_abricate_tsv = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/hamronization/genome.abricate.tsv" + genome_mapping_potential_arg = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/hamronization/genome.mapping.potential.ARG" + } + 'illumina' { + test1_contigs_fa_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/fasta/test1.contigs.fa.gz" + test1_1_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/fastq/test1_1.fastq.gz" + test1_2_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/fastq/test1_2.fastq.gz" + test2_1_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/fastq/test2_1.fastq.gz" + test2_2_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/fastq/test2_2.fastq.gz" + test1_paired_end_bam = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/bam/test1.bam" + test1_paired_end_sorted_bam = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/bam/test1.sorted.bam" + test1_paired_end_sorted_bam_bai = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/bam/test1.sorted.bam.bai" + test2_paired_end_bam = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/bam/test2.bam" + test2_paired_end_sorted_bam = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/bam/test2.sorted.bam" + test2_paired_end_sorted_bam_bai = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/illumina/bam/test2.sorted.bam.bai" + } + 'nanopore' { + test_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/nanopore/fastq/test.fastq.gz" + overlap_paf = "${params.test_data_base}/data/genomics/prokaryotes/bacteroides_fragilis/nanopore/overlap.paf" + } + } + 'candidatus_portiera_aleyrodidarum' { + 'genome' { + genome_fasta = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/genome/genome.fasta" + genome_sizes = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/genome/genome.sizes" + genome_aln_gz = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/genome/genome.aln.gz" + genome_aln_nwk = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/genome/genome.aln.nwk" + proteome_fasta = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/genome/proteome.fasta" + test1_gff = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/genome/gff/test1.gff" + test2_gff = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/genome/gff/test2.gff" + test3_gff = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/genome/gff/test3.gff" + } + 'illumina' { + test_1_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/illumina/fastq/test_1.fastq.gz" + test_2_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/illumina/fastq/test_2.fastq.gz" + test_se_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/illumina/fastq/test_se.fastq.gz" + } + 'nanopore' { + test_fastq_gz = "${params.test_data_base}/data/genomics/prokaryotes/candidatus_portiera_aleyrodidarum/nanopore/fastq/test.fastq.gz" + } + } + 'haemophilus_influenzae' { + 'genome' { + genome_fna_gz = "${params.test_data_base}/data/genomics/prokaryotes/haemophilus_influenzae/genome/genome.fna.gz" + genome_aln_gz = "${params.test_data_base}/data/genomics/prokaryotes/haemophilus_influenzae/genome/genome.aln.gz" + genome_aln_nwk = "${params.test_data_base}/data/genomics/prokaryotes/haemophilus_influenzae/genome/genome.aln.nwk" + } + } + 'generic' { + 'csv' { + test_csv = "${params.test_data_base}/data/generic/csv/test.csv" + } + 'notebooks' { + rmarkdown = "${params.test_data_base}/data/generic/notebooks/rmarkdown/rmarkdown_notebook.Rmd" + ipython_md = "${params.test_data_base}/data/generic/notebooks/jupyter/ipython_notebook.md" + ipython_ipynb = "${params.test_data_base}/data/generic/notebooks/jupyter/ipython_notebook.ipynb" + } + 'tar' { + tar_gz = "${params.test_data_base}/data/generic/tar/hello.tar.gz" + } + 'tsv' { + test_tsv = "${params.test_data_base}/data/generic/tsv/test.tsv" + } + 'txt' { + hello = "${params.test_data_base}/data/generic/txt/hello.txt" + } + 'cooler'{ + test_pairix_pair_gz = "${params.test_data_base}/data/genomics/homo_sapiens/cooler/cload/hg19/hg19.GM12878-MboI.pairs.subsample.blksrt.txt.gz" + test_pairix_pair_gz_px2 = "${params.test_data_base}/data/genomics/homo_sapiens/cooler/cload/hg19/hg19.GM12878-MboI.pairs.subsample.blksrt.txt.gz.px2" + test_pairs_pair = "${params.test_data_base}/data/genomics/homo_sapiens/cooler/cload/hg19/hg19.sample1.pairs" + test_tabix_pair_gz = "${params.test_data_base}/data/genomics/homo_sapiens/cooler/cload/hg19/hg19.GM12878-MboI.pairs.subsample.sorted.possrt.txt.gz" + test_tabix_pair_gz_tbi = "${params.test_data_base}/data/genomics/homo_sapiens/cooler/cload/hg19/hg19.GM12878-MboI.pairs.subsample.sorted.possrt.txt.gz.tbi" + hg19_chrom_sizes = "${params.test_data_base}/data/genomics/homo_sapiens/cooler/cload/hg19/hg19.chrom.sizes" + test_merge_cool = "${params.test_data_base}/data/genomics/homo_sapiens/cooler/merge/toy/toy.symm.upper.2.cool" + test_merge_cool_cp2 = "${params.test_data_base}/data/genomics/homo_sapiens/cooler/merge/toy/toy.symm.upper.2.cp2.cool" + + } + 'pairtools' { + mock_4dedup_pairsam = "${params.test_data_base}/data/genomics/homo_sapiens/pairtools/mock.4dedup.pairsam" + mock_4flip_pairs = "${params.test_data_base}/data/genomics/homo_sapiens/pairtools/mock.4flip.pairs" + mock_chrom_sizes = "${params.test_data_base}/data/genomics/homo_sapiens/pairtools/mock.chrom.sizes" + mock_pairsam = "${params.test_data_base}/data/genomics/homo_sapiens/pairtools/mock.pairsam" + mock_sam = "${params.test_data_base}/data/genomics/homo_sapiens/pairtools/mock.sam" + frag_bed = "${params.test_data_base}/data/genomics/homo_sapiens/pairtools/frag.bed" + } + 'config' { + ncbi_user_settings = "${params.test_data_base}/data/generic/config/ncbi_user_settings.mkfg" + } + 'unsorted_data' { + 'unsorted_text' { + genome_file = "${params.test_data_base}/data/generic/unsorted_data/unsorted_text/test.genome" + intervals = "${params.test_data_base}/data/generic/unsorted_data/unsorted_text/test.bed" + numbers_csv = "${params.test_data_base}/data/generic/unsorted_data/unsorted_text/test.csv" + } + } + } + 'proteomics' { + 'msspectra' { + ups_file1 = "${params.test_data_base}/data/proteomics/msspectra/OVEMB150205_12.raw" + ups_file2 = "${params.test_data_base}/data/proteomics/msspectra/OVEMB150205_14.raw" + } + 'database' { + yeast_ups = "${params.test_data_base}/data/proteomics/database/yeast_UPS.fasta" + } + 'maxquant' { + mq_contrasts = "${params.test_data_base}/data/proteomics/maxquant/MaxQuant_contrasts.csv" + mq_proteingroups = "${params.test_data_base}/data/proteomics/maxquant/MaxQuant_proteinGroups.txt" + mq_samplesheet = "${params.test_data_base}/data/proteomics/maxquant/MaxQuant_samplesheet.tsv" + mq_proteus_mat = "${params.test_data_base}/data/proteomics/maxquant/proteus.raw_MaxQuant_proteingroups_tab.tsv" + } + 'parameter' { + maxquant = "${params.test_data_base}/data/proteomics/parameter/mqpar.xml" + } + 'idfile' { + openms_idxml = "${params.test_data_base}/data/proteomics/openms_idxml/BSA_QC_file.idXML" + } + } + 'galaxea_fascicularis' { + hic { + pretext = "${params.test_data_base}/data/genomics/eukaryotes/galaxea_fascicularis/hic/jaGalFasc40_2.pretext" + } + } + 'deilephila_porcellus' { + 'mito' { + ref_fa = "${params.test_data_base}/data/genomics/eukaryotes/deilephila_porcellus/mito/MW539688.1.fasta" + ref_gb = "${params.test_data_base}/data/genomics/eukaryotes/deilephila_porcellus/mito/MW539688.1.gb" + hifi_reads = "${params.test_data_base}/data/genomics/eukaryotes/deilephila_porcellus/mito/ilDeiPorc1.HiFi.reads.fa" + contigs = "${params.test_data_base}/data/genomics/eukaryotes/deilephila_porcellus/mito/ilDeiPorc1.contigs.fa" + } + } + 'imaging' { + 'h5' { + plant_wga = "${params.test_data_base}/data/imaging/h5/plant_wga.h5" + plant_wga_prob = "${params.test_data_base}/data/imaging/h5/plant_wga_probabilities.h5" + } + 'ilp' { + plant_wga_multicut = "${params.test_data_base}/data/imaging/ilp/plant_wga.multicut.ilp" + plant_wga_pixel_class = "${params.test_data_base}/data/imaging/ilp/plant_wga.pixel_prob.ilp" + } + 'tiff' { + mouse_heart_wga = "${params.test_data_base}/data/imaging/tiff/mindagap.mouse_heart.wga.tiff" + } + 'ome-tiff' { + cycif_tonsil_channels = "${params.test_data_base}/data/imaging/ome-tiff/cycif-tonsil-channels.csv" + cycif_tonsil_cycle1 = "${params.test_data_base}/data/imaging/ome-tiff/cycif-tonsil-cycle1.ome.tif" + cycif_tonsil_cycle2 = "${params.test_data_base}/data/imaging/ome-tiff/cycif-tonsil-cycle2.ome.tif" + cycif_tonsil_cycle3 = "${params.test_data_base}/data/imaging/ome-tiff/cycif-tonsil-cycle3.ome.tif" + cycif_tonsil_dfp = "${params.test_data_base}/data/imaging/ome-tiff/cycif-tonsil-dfp.ome.tif" + cycif_tonsil_ffp = "${params.test_data_base}/data/imaging/ome-tiff/cycif-tonsil-ffp.ome.tif" + } + 'registration' { + markers = "${params.test_data_base}/data/imaging/registration/markers.csv" + cycle1 = "${params.test_data_base}/data/imaging/ome-tiff/cycif-tonsil-cycle1.ome.tif" + cycle2 = "${params.test_data_base}/data/imaging/ome-tiff/cycif-tonsil-cycle2.ome.tif" + } + 'segmentation' { + markers = "${params.test_data_base}/data/imaging/segmentation/markers.csv" + image = "${params.test_data_base}/data/imaging/segmentation/cycif_tonsil_registered.ome.tif" + } + 'quantification' { + markers = "${params.test_data_base}/data/imaging/quantification/markers.csv" + image = "${params.test_data_base}/data/imaging/quantification/cycif_tonsil_registered.ome.tif" + mask = "${params.test_data_base}/data/imaging/quantification/cell.ome.tif" + } + 'downstream' { + markers = "${params.test_data_base}/data/imaging/downstream/markers.csv" + cell_feature_array = "${params.test_data_base}/data/imaging/downstream/cycif_tonsil_cell.csv" + } + 'background_subtraction' { + markers = "${params.test_data_base}/data/imaging/background_subtraction/markers.csv" + image = "${params.test_data_base}/data/imaging/background_subtraction/cycif_tonsil_registered.ome.tif" + } + 'core_detection' { + image = "${params.test_data_base}/data/imaging/core_detection/single_core_dapi.tif" + } + } + } +} diff --git a/tests/csv/bam.csv b/tests/csv/bam.csv new file mode 100644 index 00000000..78269414 --- /dev/null +++ b/tests/csv/bam.csv @@ -0,0 +1,4 @@ +sample,bam,bai +NA12878,https://raw.githubusercontent.com/nf-core/test-datasets/phaseimpute/data/individuals/NA12878/NA12878.s.1x.bam,https://raw.githubusercontent.com/nf-core/test-datasets/phaseimpute/data/individuals/NA12878/NA12878.s.1x.bam.bai +NA19401,https://raw.githubusercontent.com/nf-core/test-datasets/phaseimpute/data/individuals/NA19401/NA19401.s.1x.bam,https://raw.githubusercontent.com/nf-core/test-datasets/phaseimpute/data/individuals/NA19401/NA19401.s.1x.bam.bai +NA20359,https://raw.githubusercontent.com/nf-core/test-datasets/phaseimpute/data/individuals/NA20359/NA20359.s.1x.bam,https://raw.githubusercontent.com/nf-core/test-datasets/phaseimpute/data/individuals/NA20359/NA20359.s.1x.bam.bai diff --git a/tests/csv/panel.csv b/tests/csv/panel.csv index 763ed1e8..b7b37f1a 100644 --- a/tests/csv/panel.csv +++ b/tests/csv/panel.csv @@ -1,3 +1,2 @@ -panel,vcf,index,legend,to_phase -1000GP,"/groups/dog/llenezet/test-datasets/data/panel/21/panel_2020-08-05_chr21.phased.vcf.gz","/groups/dog/llenezet/test-datasets/data/panel/21/panel_2020-08-05_chr21.phased.vcf.gz.tbi",,FALSE -1000GP_RePhase,"/groups/dog/llenezet/test-datasets/data/panel/21/panel_2020-08-05_chr21.phased.vcf.gz","/groups/dog/llenezet/test-datasets/data/panel/21/panel_2020-08-05_chr21.phased.vcf.gz.tbi",,TRUE \ No newline at end of file +panel,vcf,index,sites,tsv,legend,phased +1000GP.s.norel,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/panel/21_22/1000GP.chr21_22.s.norel.bcf,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/panel/21_22/1000GP.chr21_22.s.norel.bcf.csi,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/panel/21_22/1000GP.chr21_22.s.norel.sites.bcf,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/panel/21_22/1000GP.chr21_22.s.norel.tsv.gz,,TRUE diff --git a/tests/csv/regionsheet.csv b/tests/csv/regionsheet.csv index 543b24f1..7ef04608 100644 --- a/tests/csv/regionsheet.csv +++ b/tests/csv/regionsheet.csv @@ -1,2 +1,3 @@ chr,start,end -chr1,0,1 \ No newline at end of file +chr21,16570000,16610000 +chr22,16570000,16610000 diff --git a/tests/csv/sample_bam.csv b/tests/csv/sample_bam.csv new file mode 100644 index 00000000..b128cac0 --- /dev/null +++ b/tests/csv/sample_bam.csv @@ -0,0 +1,4 @@ +sample,bam,bai +NA12878,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA12878/NA12878.s.1x.bam,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA12878/NA12878.s.1x.bam.bai +NA19401,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA19401/NA19401.s.1x.bam,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA19401/NA19401.s.1x.bam.bai +NA20359,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA20359/NA20359.s.1x.bam,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA20359/NA20359.s.1x.bam.bai diff --git a/tests/csv/sample_sim.csv b/tests/csv/sample_sim.csv deleted file mode 100644 index 718e1383..00000000 --- a/tests/csv/sample_sim.csv +++ /dev/null @@ -1,2 +0,0 @@ -sample,BAM,BAI -NA12878,/groups/dog/llenezet/test-datasets/data/NA12878/21/NA12878.chr21.s.bam,/groups/dog/llenezet/test-datasets/data/NA12878/21/NA12878.chr21.s.bam.bai \ No newline at end of file diff --git a/tests/csv/sample_vcf.csv b/tests/csv/sample_vcf.csv new file mode 100644 index 00000000..01b504e5 --- /dev/null +++ b/tests/csv/sample_vcf.csv @@ -0,0 +1,4 @@ +sample,vcf,csi +NA12878,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA12878/NA12878.s.1x.bcf,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA12878/NA12878.s.1x.bcf.csi +NA19401,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA19401/NA19401.s.1x.bcf,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA19401/NA19401.s.1x.bcf.csi +NA20359,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA20359/NA20359.s.1x.bcf,https://raw.githubusercontent.com/louislenezet/test-datasets/imputation/data/individuals/NA20359/NA20359.s.1x.bcf.csi diff --git a/workflows/phaseimpute.nf b/workflows/phaseimpute/main.nf similarity index 51% rename from workflows/phaseimpute.nf rename to workflows/phaseimpute/main.nf index c7835ac0..5a336ae1 100644 --- a/workflows/phaseimpute.nf +++ b/workflows/phaseimpute/main.nf @@ -7,33 +7,24 @@ // // MODULE: Installed directly from nf-core/modules // -include { MULTIQC } from '../modules/nf-core/multiqc/main' -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 { methodsDescriptionText } from '../subworkflows/local/utils_nfcore_phaseimpute_pipeline' -include { SAMTOOLS_FAIDX } from '../modules/nf-core/samtools/faidx/main' -include { BAM_REGION } from '../subworkflows/local/bam_region' +include { MULTIQC } from '../../modules/nf-core/multiqc/main' +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 { methodsDescriptionText } from '../../subworkflows/local/utils_nfcore_phaseimpute_pipeline' -// -// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules -// - -include { BAM_DOWNSAMPLE } from '../subworkflows/local/bam_downsample.nf' -include { COMPUTE_GL as GL_TRUTH } from '../subworkflows/local/compute_gl.nf' -include { COMPUTE_GL as GL_INPUT } from '../subworkflows/local/compute_gl.nf' +include { BAM_REGION } from '../../subworkflows/local/bam_region' - -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - INITIALIZE PARAMETERS -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -*/ // -// Initialize file channels based on params, defined in the params.genomes[params.genome] scope +// SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -map = params.map ? Channel.fromPath(params.map).collect() : Channel.empty() +include { BAM_DOWNSAMPLE } from '../../subworkflows/local/bam_downsample' +include { COMPUTE_GL as GL_TRUTH } from '../../subworkflows/local/compute_gl' +include { COMPUTE_GL as GL_INPUT } from '../../subworkflows/local/compute_gl' +include { VCF_IMPUTE_GLIMPSE } from '../../subworkflows/nf-core/vcf_impute_glimpse' +include { VCF_CHR_RENAME } from '../../subworkflows/local/vcf_chr_rename' +include { GET_PANEL } from '../../subworkflows/local/get_panel' /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -44,39 +35,17 @@ map = params.map ? Channel.fromPath(params.map).collect() : Channe workflow PHASEIMPUTE { take: - ch_samplesheet // channel: samplesheet read in from --input + ch_input // channel: samplesheet read in from --input + ch_fasta // channel: fasta file [ [genome], fasta, fai ] + ch_panel // channel: panel file [ [id], vcf, index ] + ch_region // channel: region to use [meta, region] + ch_map // channel: genetic map + ch_versions // channel: versions of software used main: - ch_versions = Channel.empty() ch_multiqc_files = Channel.empty() - /// Create single fasta channel - ch_fasta = Channel.of([[genome: params.genome]]) - .combine(Channel.fromPath(params.fasta).collect()) - - // Gather regions to use and create the meta map - if (params.input_region_string == "all") { - SAMTOOLS_FAIDX(ch_fasta, [[],[]]) - ch_multiqc_files = ch_multiqc_files.mix(SAMTOOLS_FAIDX.out.zip.collect{it[1]}) - ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions.first()) - ch_region = SAMTOOLS_FAIDX.out.fai - .splitCsv(header: ["chr", "size", "offset", "lidebase", "linewidth", "qualoffset"], sep: "\t") - .map{ meta, row -> [meta + ["chr": row.chr], row.chr + ":0-" + row.size]} - .map{ metaC, region -> [metaC + ["region": region], region]} - } else { - ch_region = Channel.fromSamplesheet("input_region_file") - .map{ chr, start, end -> [["chr": chr], chr + ":" + start + "-" + end]} - .map{ metaC, region -> [metaC + ["region": region], region]} - } - - // Create map channel - if (params.map) { - ch_map = Channel.of([["map": params.map], params.map]).collect() - } else { - ch_map = Channel.of([[],[]]) - } - // // Simulate data if asked // @@ -117,53 +86,80 @@ workflow PHASEIMPUTE { // // Prepare panel // - if (params.step == 'panelprep') { - ch_panel = Channel.fromSamplesheet("input") - + if (params.step == 'impute' || params.step == 'panel_prep') { // Remove if necessary "chr" - if (params.panel_rename = true) { - ch_panel = VCF_CHR_RENAME(ch_panel, "./assets/chr_rename.txt") + if (params.panel_chr_rename != null) { + print("Need to rename the chromosome prefix of the panel") + VCF_CHR_RENAME(ch_panel, params.panel_chr_rename) + ch_panel = VCF_CHR_RENAME.out.vcf_rename } - GET_PANEL(ch_panel) - ch_versions = ch_versions.mix(GET_PANEL.out.versions.first()) - - // Register all panel preparation to csv - } + GET_PANEL(ch_panel, ch_fasta) - if (params.step.contains("impute")) { - // Read from panel preparation csv + ch_versions = ch_versions.mix(GET_PANEL.out.versions.first()) // Output channel of input process ch_impute_output = Channel.empty() - if (params.tools.contains("glimpse1")){ - print("Impute with Glimpse1") - // Glimpse1 subworkflow - GL_INPUT( - ch_sim_output, - REGION_CHECK.out.region, - GET_PANEL.out.panel_sites, - GET_PANEL.out.panel_tsv - ) - impute_input = GL_EMUL.out.vcf - | combine(Channel.of([[]])) - | map{meta, vcf, index, sample -> [meta, vcf, index, sample, meta.region]} - - VCF_IMPUTE_GLIMPSE(impute_input, - GET_PANEL.out.panel_phased, - ch_map) - - ch_impute_output = ch_impute_output.mix(VCF_IMPUTE_GLIMPSE.out.) - } - if (params.tools.contains("glimpse2")){ - print("Impute with Glimpse2") - // Glimpse2 subworkflow - } - if (params.tools.contains("quilt")){ - print("Impute with quilt") - // Quilt subworkflow + if (params.step == 'impute') { + if (params.tools.contains("glimpse1")) { + println "Impute with Glimpse1" + ch_panel_sites_tsv = GET_PANEL.out.panel + .map{ metaP, norm, n_index, sites, s_index, tsv, t_index, phased, p_index + -> [metaP, sites, tsv] + } + ch_panel_phased = GET_PANEL.out.panel + .map{ metaP, norm, n_index, sites, s_index, tsv, t_index, phased, p_index + -> [metaP, phased, p_index] + } + + // Glimpse1 subworkflow + GL_INPUT( // Compute GL for input data once per panel + ch_input, + ch_panel_sites_tsv, + ch_fasta + ) + ch_multiqc_files = ch_multiqc_files.mix(GL_INPUT.out.multiqc_files) + + impute_input = GL_INPUT.out.vcf // [metaIP, vcf, index] + .map {metaIP, vcf, index -> [metaIP.subMap("panel"), metaIP, vcf, index] } + .combine(ch_panel_phased, by: 0) + .combine(Channel.of([[]])) + .combine(ch_region) + .combine(ch_map) + .map{ + metaP, metaIP, vcf, index, panel, p_index, sample, metaR, region, metaM, map + -> [metaIP+metaR, vcf, index, sample, region, panel, p_index, map] + } //[ metaIPR, vcf, csi, sample, region, ref, ref_index, map ] + + VCF_IMPUTE_GLIMPSE(impute_input) + output_glimpse1 = VCF_IMPUTE_GLIMPSE.out.merged_variants + .map{ metaIPR, vcf -> [metaIPR + [tool: "Glimpse1"], vcf] } + ch_impute_output = ch_impute_output.mix(output_glimpse1) + } + if (params.tools.contains("glimpse2")) { + print("Impute with Glimpse2") + error "Glimpse2 not yet implemented" + // Glimpse2 subworkflow + } + if (params.tools.contains("quilt")) { + print("Impute with quilt") + error "Quilt not yet implemented" + // Quilt subworkflow + } + } + + } + + if (params.step == 'validate') { + print("Validate imputed data") + error "validate step not yet implemented" + } + + if (params.step == 'refine') { + print("Refine imputed data") + error "refine step not yet implemented" } //
    Process Name \\", + " \\ Software Version
    CUSTOM_DUMPSOFTWAREVERSIONSpython3.11.7
    yaml5.4.1
    TOOL1tool10.11.9
    TOOL2tool21.9
    WorkflowNextflow
    File typeConventional base calls
    File typeConventional base calls
    File typeConventional base calls
    File typeConventional base calls
    File typeConventional base calls
    File typeConventional base calls
    File typeConventional base calls
    File typeConventional base calls
    File typeConventional base calls
    File typeConventional base calls