From 38a7d690a0987ecbc06b6be554f8e779b10c36c3 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 26 Jun 2023 13:10:15 +0100 Subject: [PATCH 01/85] Fix for links in documentation --- docs/output.md | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/docs/output.md b/docs/output.md index 75100bc3..70074ab1 100755 --- a/docs/output.md +++ b/docs/output.md @@ -10,20 +10,20 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following workflows: -- [YAML_INPUT](#yamlinput) - Reads the input yaml and generates parameters used by other workflows. -- [GENERATE_GENOME](#generategenome) - Builds genome description file of the reference genome. -- [LONGREAD_COVERAGE](#longreadcoverage) - Produces read coverage based on pacbio long read fasta file. -- [GAP_FINDER](#gapfinder) - Identifies contig gaps in the input genome. -- [REPEAT_DENSITY](#repeatdensity) - Reports the intensity of regional repeats within an input assembly. -- [HIC_MAPPING](#hicmapping) - Aligns illumina HiC short reads to the input genome, generates mapping file in three format for visualisation: .pretext, .hic and .mcool -- [TELO_FINDER](#telofinder) - . -- [GENE_ALIGNMENT](#genealignment) - Aligns the peptide and nuclear data from assemblies of related species to the input genome. -- [INSILICO_DIGEST](#insilicodigest) - Generates a map of enzymatic digests using 3 Bionano enzymes. -- [SELFCOMP](#selfcomp) - Identifies regions of self-complementary sequence. -- [SYNTENY](#synteny) - Generates syntenic alignments between other high quality genomes. -- [BUSCO_ANALYSIS](#buscoanalysis) - Uses BUSCO to identify ancestral elements. Also use to identify ancestral Lepidopteran genes (merian units). - -- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +- [YAML_INPUT](#YAML_INPUT) - Reads the input yaml and generates parameters used by other workflows. +- [GENERATE_GENOME](#GENERATE_GENOME) - Builds genome description file of the reference genome. +- [LONGREAD_COVERAGE](#LONGREAD_COVERAGE) - Produces read coverage based on pacbio long read fasta file. +- [GAP_FINDER](#GAP_FINDER) - Identifies contig gaps in the input genome. +- [REPEAT_DENSITY](#REPEAT_DENSITY) - Reports the intensity of regional repeats within an input assembly. +- [HIC_MAPPING](#HIC_MAPPING) - Aligns illumina HiC short reads to the input genome, generates mapping file in three format for visualisation: .pretext, .hic and .mcool +- [TELO_FINDER](#TELO_FINDER) - Identifies regions of a user given telomeric sequence. +- [GENE_ALIGNMENT](#GENE_ALIGNMENT) - Aligns the peptide and nuclear data from assemblies of related species to the input genome. +- [INSILICO_DIGEST](#INSILICO_DIGEST) - Generates a map of enzymatic digests using 3 Bionano enzymes. +- [SELFCOMP](#SELFCOMP) - Identifies regions of self-complementary sequence. +- [SYNTENY](#SYNTENY) - Generates syntenic alignments between other high quality genomes. +- [BUSCO_ANALYSIS](#BUSCO_ANALYSIS) - Uses BUSCO to identify ancestral elements. Also use to identify ancestral Lepidopteran genes (merian units). + +- [Pipeline information](#Pipeline-information) - Report metrics generated during the workflow execution ### YAML_INPUT @@ -59,6 +59,8 @@ This workflow generates a .genome file which describes the base pair length of e +Longread Coverage uses Pacbio HiC reads to generage a coverage bigWig as well as a trio of depth.bigbed files + ### GAP_FINDER
@@ -140,7 +142,7 @@ The TELO_FINDER subworkflow uses a supplied (by the .yaml) telomeric sequence to
-The BUSCO_ANNOTATION subworkflow takes an assembly genome as input and extracts a list of [BUSCO](https://gitlab.com/ezlab/busco) genes based on the BUSCO results obtained from BUSCO. Additionally, it provides an overlap BUSCO gene set based on a list of lepidoptera ancestral genes((Wright et al., 2023), which has been investigated by Charlotte Wright from Mark Blaxter's lab at the Sanger Institute. +The BUSCO_ANNOTATION subworkflow takes an assembly genome as input and extracts a list of [BUSCO](https://gitlab.com/ezlab/busco) genes based on the BUSCO results obtained from BUSCO. Additionally, it provides an overlap BUSCO gene set based on a list of lepidoptera ancestral genes (Wright et al., 2023), which has been investigated by Charlotte Wright from Mark Blaxter's lab at the Sanger Institute. ![Busco analysis workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_busco_analysis.jpeg) @@ -177,9 +179,9 @@ PUNCHLIST: Punchlists contain information on genes found to be duplicated (fully - NUC_ALIGNMENT:PUNCHLIST takes the merged.bam produced after the [SAMTOOLS_MERGE](https://nf-co.re/modules/samtools_merge) step. This is then converted into a .paf file with [PAFTOOLS_SAM2PAF](https://github.com/nf-core/modules/tree/master/modules/nf-core/paftools/sam2paf) and finally into bed with [PAF2BED](../modules/local/paf_to_bed.nf). - PEP_ALIGNMENT:PUNCHLIST takes the merged.gff produced by [CAT_CAT](https://nf-co.re/modules/cat_cat) and converts it into .bed with [GFF_TO_BED](../modules/local/gff_to_bed.nf) -![Gene alignment workflow](images/treeval_1_0_gene_alignment.jpeg) +![Gene alignment workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_gene_alignment.jpeg) -![Workflow Legend](images/treeval_1_0_legend.jpeg) +![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) ### INSILICO_DIGEST From 0dd98724e46d6cf1608876bace1c438013097a27 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 26 Jun 2023 13:15:07 +0100 Subject: [PATCH 02/85] Re-adding in the sort params --- modules/local/generate_genome_file.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/generate_genome_file.nf b/modules/local/generate_genome_file.nf index 74a0a962..2d9cea97 100644 --- a/modules/local/generate_genome_file.nf +++ b/modules/local/generate_genome_file.nf @@ -17,7 +17,7 @@ process GENERATE_GENOME_FILE { script: def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ - awk -F"\t" '{print \$1"\t"\$2}' $fai |sort > my.genome + awk -F"\t" '{print \$1"\t"\$2}' $fai |sort -k2,2 > my.genome cat <<-END_VERSIONS > versions.yml "${task.process}": From 1d0d1be642c9a161527418f9b4448f7a350b77e9 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 26 Jun 2023 13:15:17 +0100 Subject: [PATCH 03/85] Docs --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 70074ab1..b09f78cf 100755 --- a/docs/output.md +++ b/docs/output.md @@ -59,7 +59,7 @@ This workflow generates a .genome file which describes the base pair length of e -Longread Coverage uses Pacbio HiC reads to generage a coverage bigWig as well as a trio of depth.bigbed files +Longread Coverage uses Pacbio HiC reads to generage a coverage bigWig as well as a trio of depth.bigbed files. ### GAP_FINDER From b094c3204f3d7843cc04cbba4e9d01d1bb7ac63e Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 26 Jun 2023 15:53:33 +0100 Subject: [PATCH 04/85] Update to generate_genome --- modules/local/generate_genome_file.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/generate_genome_file.nf b/modules/local/generate_genome_file.nf index 2d9cea97..7de972bd 100644 --- a/modules/local/generate_genome_file.nf +++ b/modules/local/generate_genome_file.nf @@ -17,7 +17,7 @@ process GENERATE_GENOME_FILE { script: def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ - awk -F"\t" '{print \$1"\t"\$2}' $fai |sort -k2,2 > my.genome + awk -F"\t" '{print \$1"\t"\$2}' $fai |sort -k2,2 -nr > my.genome cat <<-END_VERSIONS > versions.yml "${task.process}": From 4fdf5af1c2e4b59513dd0aff3576a6cda3a10c20 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 27 Jun 2023 16:44:29 +0100 Subject: [PATCH 05/85] Updating modules to latest versions --- CHANGELOG.md | 57 +++++- README.md | 64 +----- modules.json | 188 ++++++++++++------ modules/nf-core/bedtools/bamtobed/main.nf | 17 +- modules/nf-core/bedtools/bamtobed/meta.yml | 3 + modules/nf-core/bedtools/genomecov/main.nf | 17 +- modules/nf-core/bedtools/genomecov/meta.yml | 4 +- modules/nf-core/bedtools/intersect/main.nf | 4 +- modules/nf-core/bedtools/intersect/meta.yml | 3 +- modules/nf-core/bedtools/makewindows/main.nf | 2 +- modules/nf-core/bedtools/makewindows/meta.yml | 4 +- modules/nf-core/bedtools/map/main.nf | 2 +- modules/nf-core/bedtools/merge/main.nf | 17 +- modules/nf-core/bedtools/merge/meta.yml | 2 + modules/nf-core/bedtools/sort/main.nf | 18 +- modules/nf-core/bedtools/sort/meta.yml | 2 + modules/nf-core/cat/cat/main.nf | 2 +- modules/nf-core/cat/cat/meta.yml | 4 +- modules/nf-core/cooler/cload/main.nf | 17 +- modules/nf-core/cooler/cload/meta.yml | 7 +- modules/nf-core/cooler/zoomify/main.nf | 17 +- modules/nf-core/cooler/zoomify/meta.yml | 2 + modules/nf-core/gnu/sort/main.nf | 10 +- modules/nf-core/gnu/sort/meta.yml | 3 +- modules/nf-core/minimap2/align/main.nf | 2 +- modules/nf-core/minimap2/index/main.nf | 2 +- modules/nf-core/miniprot/align/main.nf | 14 +- modules/nf-core/miniprot/index/main.nf | 13 +- modules/nf-core/mummer/main.nf | 14 +- modules/nf-core/mummer/meta.yml | 2 +- modules/nf-core/paftools/sam2paf/main.nf | 2 +- modules/nf-core/pretextmap/main.nf | 14 +- modules/nf-core/samtools/faidx/main.nf | 22 +- modules/nf-core/samtools/faidx/meta.yml | 14 +- modules/nf-core/samtools/markdup/main.nf | 16 ++ modules/nf-core/samtools/markdup/meta.yml | 5 +- modules/nf-core/samtools/merge/main.nf | 10 +- modules/nf-core/samtools/merge/meta.yml | 21 +- modules/nf-core/samtools/sort/main.nf | 14 +- modules/nf-core/samtools/view/main.nf | 8 +- modules/nf-core/samtools/view/meta.yml | 15 +- modules/nf-core/seqtk/cutn/main.nf | 2 +- modules/nf-core/tabix/bgziptabix/main.nf | 2 +- modules/nf-core/ucsc/bedgraphtobigwig/main.nf | 14 +- .../nf-core/ucsc/bedgraphtobigwig/meta.yml | 3 + modules/nf-core/ucsc/bedtobigbed/main.nf | 14 +- modules/nf-core/ucsc/bedtobigbed/meta.yml | 9 +- .../nf-core/windowmasker/mk_counts/main.nf | 2 +- modules/nf-core/windowmasker/ustat/main.nf | 2 +- subworkflows/local/generate_genome.nf | 2 +- subworkflows/local/hic_mapping.nf | 13 +- subworkflows/local/longread_coverage.nf | 10 +- subworkflows/local/nuc_alignments.nf | 14 +- 53 files changed, 495 insertions(+), 246 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a2de11b5..143d56bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,16 +3,57 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.0.0] - Ancient Atlantis - [2023-06-12] +## [1.0.0] - Ancient Atlantis - [2023-06-27] Initial release of sanger-tol/treeval, created with the [nf-core](https://nf-co.re/) template. The essential pathways of the gEVAL pipeline have now been converted to Nextflow DSL2 from vr-runner, snakemake and wr. Of the original pipeline there is only Bionano left to implement. -### `Added` - -### `Fixed` - -### `Dependencies` - -### `Deprecated` +### Enhancements & Fixes +- Updated to nf-core/tools template v2.8.0. +- Subworkflow to generate channels from input yaml. +- Subworkflow to generate genome summary file using samtools +- Subworkflow to generate busco gene tracks and ancestral busco mapping. +- Subworkflow to generate HiC maps with cooler, juicebox and pretext. +- Subworkflow to generate gene alignments using miniprot and minimap2. +- Subworkflow to generate insilico digest tracks. +- Subworkflow to generate longread coverage tracks from pacbio data. +- Subworkflow to generate punchlists detailing regions of interest in the genome. +- Subworkflow to generate repeat density tracks. +- Subworkflow to generate tracks detailing self complementary regions. +- Subworkflow to generate syntenic alignments to high quality genomes. +- Subworkflow to generate tracks containing telomeric sites. + +### Parameters +| Old Parameter | New Parameter | +|---|---| +| - | --input | + +### Software dependencies + +Note, since the pipeline is using Nextflow DSL2, each process will be run with its own Biocontainer. This means that on occasion it is entirely possible for the pipeline to be using different versions of the same tool. However, the overall software dependency changes compared to the last release have been listed below for reference. + +| Module | Old Version | New Versions | +|---|---|---| +| bedtools | - | 2.31.0 | +| busco | - | 5.4.3 | +| bwa-mem2 | - | 2.2.1 | +| cat | - | 2.3.4 | +| cooler | - | 0.9.2 | +| gnu-sort | - | 8.25 | +| minimap2 + samtools | - | 2.24 + 1.14 | +| miniprot | - | 0.5 | +| mummer | - | 3.23 | +| paftools (minimap2 + samtools) | - | 2.24 + 1.14 | +| pretextmap + samtools| - | 0.1.9=h9f5acd7_1 + 1.16.1 | +| samtools | - | 1.17 | +| seqtk | - | 1.3 | +| tabix | - | 1.11 | +| ucsc | - | 377 | +| windowmasker (blast) | - | 2.13.0 | + +### Fixed + +### Dependencies + +### Deprecated diff --git a/README.md b/README.md index 020c8849..2a8582b2 100644 --- a/README.md +++ b/README.md @@ -11,60 +11,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! -## Pipeline summary - -The version 1 pipeline will be made up of the following steps, (r) = Steps run in Rapid: - -- INPUT_READ (r) - - > The reading of the input yaml and conversion into channels for the sub-workflows. - -- GENERATE_GENOME (r) - - > Generate .genome for the input genome using SAMTOOLS FAIDX. - -- GENERATE_ALIGNMENT - - > Peptides will run pep_alignment.nf with Miniprot. - - > CDNA, RNA and CDS will run through nuc_alignment.nf with Minimap2. - -- INSILICO DIGEST - - > Generates a map of enzymatic digests using 3 Bionano enzymes. - -- SELFCOMP - - > Identifies regions of self-complementary sequencs using Mummer. - -- SYNTENY - - > Generates syntenic alignments between other high quality genomes via Minimap2. - -- BUSCO_ANNOTATION - - > Lepidopteran Element Analysis. Using BUSCO and custom python scripts to parse ancestral Lepidoptera gene. This will eventually have a number of clade specific sub-workflows. - > BUSCO genes extraction based on BUSCO full_table.tsv. - -- LONGREAD_COVERAGE (r) - - > Calculating the coverage of reads across the genome. - -- FIND_GAPS (r) - - > Identifying gaps in the input genome using seqtk cutn. - -- FIND_TELOMERE (r) - - > Identify sites of a given telomeric sequence. - -- REPEAT_DENSITY (r) - - > Generate a graph showing the relative amount of repeat in a given chunk. - -- HIC_MAPPING (r) - > Generation of HiC maps for the curation of a genome, these include: pretext_hires, pretext_lowres and cooler maps. - ## Usage > **Note** @@ -72,15 +18,17 @@ The version 1 pipeline will be made up of the following steps, (r) = Steps run i > 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. +Currently, it is advised to run the pipleline with docker or singularity as a couple of major modules do not currently have a conda env associated with them. + Now, you can run the pipeline using: ```bash nextflow run main.nf -profile singularity --input treeval.yaml -entry {FULL|RAPID} --outdir {OUTDIR} ``` -## Documentation +An example treeval.yaml can be found [here](assets/local_testing/nxOscDF5033.yaml). -The sanger-tol/treeval pipeline comes with documentation about the pipeline [usage](https://nf-co.re/treeval/usage), [parameters](https://nf-co.re/treeval/parameters) and [output](https://nf-co.re/treeval/output). +Further documentation about the pipeline can be found in the following files: [usage](https://nf-co.re/treeval/usage), [parameters](https://nf-co.re/treeval/parameters) and [output](https://nf-co.re/treeval/output). > **Warning:** > Please provide pipeline parameters via the CLI or Nextflow `-params-file` option. Custom config files including those @@ -94,11 +42,11 @@ sanger-tol/treeval has been written by Damon-Lee Pointon (@DLBPointon), Yumi Sim We thank the following people for their extensive assistance in the development of this pipeline:
    -
  • @muffato - For code reviews and code support
  • @gq1 - For building the infrastructure around TreeVal
  • @ksenia-krasheninnikova - For help with C code implementation and YAML parsing
  • -
  • @priyanka-surana - For help with the majority of code reviews and code support
  • @mcshane - For guidance on algorithms
  • +
  • @muffato - For code reviews and code support
  • +
  • @priyanka-surana - For help with the majority of code reviews and code support
## Contributions and Support diff --git a/modules.json b/modules.json index 615bf148..8901f989 100644 --- a/modules.json +++ b/modules.json @@ -7,164 +7,228 @@ "nf-core": { "bedtools/bamtobed": { "branch": "master", - "git_sha": "1d48427957205cb6acf1ffe330bd35b6bb8baa90", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", - "git_sha": "da46ad4dfd38229e1514a81d3128ec7c30206f5c", - "installed_by": ["modules"] + "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", - "git_sha": "007c99a9726dfd89198e788162db594cd29d426f", - "installed_by": ["modules"] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", - "git_sha": "d3c433828498c6881adcc2ea3a93260fff1fe942", - "installed_by": ["modules"] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", - "git_sha": "f1f473b21811b958d1317c4a97c56e16d3ee40f9", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", - "git_sha": "5427d51ca9aaf0b4c5919df6fa6c7a2f718ae2a8", - "installed_by": ["modules"] + "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", - "git_sha": "2d34b7ffd1e672521d5480f368028ddd1fa5ea21", - "installed_by": ["modules"] + "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", - "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", - "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", - "installed_by": ["modules"] + "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", - "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", - "installed_by": ["modules"] + "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", - "git_sha": "fc2e38dcf6b3cdbe858a83a9457c1b1e018a33b5", - "installed_by": ["modules"] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", - "git_sha": "01b3b2509d76625b6d6cd613b349fb4777712a15", - "installed_by": ["modules"], + "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", - "git_sha": "0f8a77ff00e65eaeebc509b8156eaa983192474b", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", - "git_sha": "c8e35eb2055c099720a75538d1b8adb3fb5a464c", - "installed_by": ["modules"] + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", - "git_sha": "d33e1ba8b6806fa096071eb515622da753a4b8e5", - "installed_by": ["modules"] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", - "git_sha": "d33e1ba8b6806fa096071eb515622da753a4b8e5", - "installed_by": ["modules"] + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] } } }, @@ -173,4 +237,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/bedtools/bamtobed/main.nf b/modules/nf-core/bedtools/bamtobed/main.nf index e9673571..ab8a6ffb 100644 --- a/modules/nf-core/bedtools/bamtobed/main.nf +++ b/modules/nf-core/bedtools/bamtobed/main.nf @@ -2,10 +2,10 @@ process BEDTOOLS_BAMTOBED { tag "$meta.id" label 'process_medium' - conda "bioconda::bedtools=2.30.0" + conda "bioconda::bedtools=2.31.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0' : - 'quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0' }" + 'https://depot.galaxyproject.org/singularity/bedtools:2.31.0--hf5e1c6e_2' : + 'biocontainers/bedtools:2.31.0--hf5e1c6e_2' }" input: tuple val(meta), path(bam) @@ -32,4 +32,15 @@ process BEDTOOLS_BAMTOBED { bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bed + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ } diff --git a/modules/nf-core/bedtools/bamtobed/meta.yml b/modules/nf-core/bedtools/bamtobed/meta.yml index 5a4ff73a..49cc83d9 100644 --- a/modules/nf-core/bedtools/bamtobed/meta.yml +++ b/modules/nf-core/bedtools/bamtobed/meta.yml @@ -3,6 +3,9 @@ description: Converts a bam file to a bed12 file. keywords: - bam - bed + - bedtools + - bamtobed + - converter tools: - bedtools: description: | diff --git a/modules/nf-core/bedtools/genomecov/main.nf b/modules/nf-core/bedtools/genomecov/main.nf index 17e38a8b..d2a2f206 100644 --- a/modules/nf-core/bedtools/genomecov/main.nf +++ b/modules/nf-core/bedtools/genomecov/main.nf @@ -2,10 +2,10 @@ process BEDTOOLS_GENOMECOV { tag "$meta.id" label 'process_single' - conda "bioconda::bedtools=2.30.0" + conda "bioconda::bedtools=2.31.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0' : - 'quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0' }" + 'https://depot.galaxyproject.org/singularity/bedtools:2.31.0--hf5e1c6e_2' : + 'biocontainers/bedtools:2.31.0--hf5e1c6e_2' }" input: tuple val(meta), path(intervals), val(scale) @@ -56,4 +56,15 @@ process BEDTOOLS_GENOMECOV { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ } diff --git a/modules/nf-core/bedtools/genomecov/meta.yml b/modules/nf-core/bedtools/genomecov/meta.yml index 83bfab98..efd6e129 100644 --- a/modules/nf-core/bedtools/genomecov/meta.yml +++ b/modules/nf-core/bedtools/genomecov/meta.yml @@ -4,6 +4,8 @@ keywords: - bed - bam - genomecov + - bedtools + - histogram tools: - bedtools: description: | @@ -21,7 +23,7 @@ input: description: BAM/BED/GFF/VCF pattern: "*.{bam|bed|gff|vcf}" - scale: - type: value + type: integer description: Number containing the scale factor for the output. Set to 1 to disable. Setting to a value other than 1 will also get the -bg bedgraph output format as this is required for this command switch - sizes: type: file diff --git a/modules/nf-core/bedtools/intersect/main.nf b/modules/nf-core/bedtools/intersect/main.nf index f966baff..6805582e 100644 --- a/modules/nf-core/bedtools/intersect/main.nf +++ b/modules/nf-core/bedtools/intersect/main.nf @@ -5,7 +5,7 @@ process BEDTOOLS_INTERSECT { conda "bioconda::bedtools=2.30.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0' : - 'quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0' }" + 'biocontainers/bedtools:2.30.0--hc088bd4_0' }" input: tuple val(meta), path(intervals1), path(intervals2) @@ -22,7 +22,7 @@ process BEDTOOLS_INTERSECT { def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" //Extension of the output file. It is set by the user via "ext.suffix" in the config. Corresponds to the file format which depends on arguments (e. g., ".bed", ".bam", ".txt", etc.). - extension = task.ext.suffix ?: "bed" + extension = task.ext.suffix ?: "${intervals1.extension}" def sizes = chrom_sizes ? "-g ${chrom_sizes}" : '' if ("$intervals1" == "${prefix}.${extension}" || "$intervals2" == "${prefix}.${extension}") diff --git a/modules/nf-core/bedtools/intersect/meta.yml b/modules/nf-core/bedtools/intersect/meta.yml index c796f7d5..f2848967 100644 --- a/modules/nf-core/bedtools/intersect/meta.yml +++ b/modules/nf-core/bedtools/intersect/meta.yml @@ -3,6 +3,7 @@ description: Allows one to screen for overlaps between two sets of genomic featu keywords: - bed - intersect + - overlap tools: - bedtools: description: | @@ -29,7 +30,7 @@ input: Groovy Map containing reference chromosome sizes e.g. [ id:'test' ] - chrom_sizes: - type: optional file + type: file description: Chromosome sizes file pattern: "*{.sizes,.txt}" output: diff --git a/modules/nf-core/bedtools/makewindows/main.nf b/modules/nf-core/bedtools/makewindows/main.nf index 4c1246a0..96dcff15 100644 --- a/modules/nf-core/bedtools/makewindows/main.nf +++ b/modules/nf-core/bedtools/makewindows/main.nf @@ -5,7 +5,7 @@ process BEDTOOLS_MAKEWINDOWS { conda "bioconda::bedtools=2.30.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--h7d7f7ad_1' : - 'quay.io/biocontainers/bedtools:2.30.0--h7d7f7ad_1' }" + 'biocontainers/bedtools:2.30.0--h7d7f7ad_1' }" 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 307f4cd2..f543da69 100644 --- a/modules/nf-core/bedtools/makewindows/meta.yml +++ b/modules/nf-core/bedtools/makewindows/meta.yml @@ -32,10 +32,10 @@ output: type: file description: File containing software versions pattern: "versions.yml" - - tab: + - bed: type: file description: BED file containing the windows - pattern: "*.tab" + pattern: "*.bed" authors: - "@kevbrick" - "@nvnieuwk" diff --git a/modules/nf-core/bedtools/map/main.nf b/modules/nf-core/bedtools/map/main.nf index c7dceb5c..1af31977 100644 --- a/modules/nf-core/bedtools/map/main.nf +++ b/modules/nf-core/bedtools/map/main.nf @@ -5,7 +5,7 @@ process BEDTOOLS_MAP { conda "bioconda::bedtools=2.30.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0' : - 'quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0' }" + 'biocontainers/bedtools:2.30.0--hc088bd4_0' }" input: tuple val(meta), path(intervals1), path(intervals2) diff --git a/modules/nf-core/bedtools/merge/main.nf b/modules/nf-core/bedtools/merge/main.nf index 21b2e645..6868d39f 100644 --- a/modules/nf-core/bedtools/merge/main.nf +++ b/modules/nf-core/bedtools/merge/main.nf @@ -2,10 +2,10 @@ process BEDTOOLS_MERGE { tag "$meta.id" label 'process_single' - conda "bioconda::bedtools=2.30.0" + conda "bioconda::bedtools=2.31.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0' : - 'quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0' }" + 'https://depot.galaxyproject.org/singularity/bedtools:2.31.0--hf5e1c6e_2' : + 'biocontainers/bedtools:2.31.0--hf5e1c6e_2' }" input: tuple val(meta), path(bed) @@ -33,4 +33,15 @@ process BEDTOOLS_MERGE { bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bed + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ } diff --git a/modules/nf-core/bedtools/merge/meta.yml b/modules/nf-core/bedtools/merge/meta.yml index 76743679..82248afe 100644 --- a/modules/nf-core/bedtools/merge/meta.yml +++ b/modules/nf-core/bedtools/merge/meta.yml @@ -3,6 +3,8 @@ description: combines overlapping or “book-ended” features in an interval fi keywords: - bed - merge + - bedtools + - overlapped bed tools: - bedtools: description: | diff --git a/modules/nf-core/bedtools/sort/main.nf b/modules/nf-core/bedtools/sort/main.nf index a0ddddd1..df372bc5 100644 --- a/modules/nf-core/bedtools/sort/main.nf +++ b/modules/nf-core/bedtools/sort/main.nf @@ -2,10 +2,10 @@ process BEDTOOLS_SORT { tag "$meta.id" label 'process_single' - conda "bioconda::bedtools=2.30.0" + conda "bioconda::bedtools=2.31.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0' : - 'quay.io/biocontainers/bedtools:2.30.0--hc088bd4_0' }" + 'https://depot.galaxyproject.org/singularity/bedtools:2.31.0--hf5e1c6e_2' : + 'biocontainers/bedtools:2.31.0--hf5e1c6e_2' }" input: tuple val(meta), path(intervals) @@ -39,4 +39,16 @@ process BEDTOOLS_SORT { bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + extension = task.ext.suffix ?: intervals.extension + """ + touch ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") + END_VERSIONS + """ } diff --git a/modules/nf-core/bedtools/sort/meta.yml b/modules/nf-core/bedtools/sort/meta.yml index 1b6ebbcb..3a3b4e4d 100644 --- a/modules/nf-core/bedtools/sort/meta.yml +++ b/modules/nf-core/bedtools/sort/meta.yml @@ -3,6 +3,8 @@ description: Sorts a feature file by chromosome and other criteria. keywords: - bed - sort + - bedtools + - chromosome tools: - bedtools: description: | diff --git a/modules/nf-core/cat/cat/main.nf b/modules/nf-core/cat/cat/main.nf index 840af4b9..9f062219 100644 --- a/modules/nf-core/cat/cat/main.nf +++ b/modules/nf-core/cat/cat/main.nf @@ -5,7 +5,7 @@ process CAT_CAT { conda "conda-forge::pigz=2.3.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/pigz:2.3.4' : - 'quay.io/biocontainers/pigz:2.3.4' }" + 'biocontainers/pigz:2.3.4' }" input: tuple val(meta), path(files_in) diff --git a/modules/nf-core/cat/cat/meta.yml b/modules/nf-core/cat/cat/meta.yml index 5eeff5a6..8acc0bfa 100644 --- a/modules/nf-core/cat/cat/meta.yml +++ b/modules/nf-core/cat/cat/meta.yml @@ -7,9 +7,9 @@ keywords: tools: - cat: description: Just concatenation - homepage: None + documentation: https://man7.org/linux/man-pages/man1/cat.1.html - tool_dev_url: None + licence: ["GPL-3.0-or-later"] input: - meta: diff --git a/modules/nf-core/cooler/cload/main.nf b/modules/nf-core/cooler/cload/main.nf index 80109d48..4863cc63 100644 --- a/modules/nf-core/cooler/cload/main.nf +++ b/modules/nf-core/cooler/cload/main.nf @@ -2,10 +2,10 @@ process COOLER_CLOAD { tag "$meta.id" label 'process_high' - conda "bioconda::cooler=0.8.11" + conda "bioconda::cooler=0.9.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cooler:0.8.11--pyh3252c3a_0' : - 'biocontainers/cooler:0.8.11--pyh3252c3a_0' }" + 'https://depot.galaxyproject.org/singularity/cooler:0.9.2--pyh7cba7a3_0' : + 'biocontainers/cooler:0.9.2--pyh7cba7a3_0' }" input: tuple val(meta), path(pairs), path(index), val(cool_bin) @@ -36,4 +36,15 @@ process COOLER_CLOAD { cooler: \$(cooler --version 2>&1 | sed 's/cooler, version //') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.cool + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cooler: \$(cooler --version 2>&1 | sed 's/cooler, version //') + END_VERSIONS + """ } diff --git a/modules/nf-core/cooler/cload/meta.yml b/modules/nf-core/cooler/cload/meta.yml index 8513aaec..953c8337 100644 --- a/modules/nf-core/cooler/cload/meta.yml +++ b/modules/nf-core/cooler/cload/meta.yml @@ -2,6 +2,9 @@ name: cooler_cload description: Create a cooler from genomic pairs and bins keywords: - cool + - cooler + - cload + - hic tools: - cooler: description: Sparse binary format for genomic interaction matrices @@ -24,7 +27,7 @@ input: type: file description: Path to index file of the contacts. - cool_bin: - type: value + type: integer description: Bins size in bp - chromsizes: type: file @@ -45,7 +48,7 @@ output: description: Output COOL file path pattern: "*.cool" - cool_bin: - type: value + type: integer description: Bins size in bp authors: diff --git a/modules/nf-core/cooler/zoomify/main.nf b/modules/nf-core/cooler/zoomify/main.nf index 95e7daff..cd210cf7 100644 --- a/modules/nf-core/cooler/zoomify/main.nf +++ b/modules/nf-core/cooler/zoomify/main.nf @@ -2,10 +2,10 @@ process COOLER_ZOOMIFY { tag "$meta.id" label 'process_high' - conda "bioconda::cooler=0.8.11" + conda "bioconda::cooler=0.9.2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/cooler:0.8.11--pyh3252c3a_0' : - 'biocontainers/cooler:0.8.11--pyh3252c3a_0' }" + 'https://depot.galaxyproject.org/singularity/cooler:0.9.2--pyh7cba7a3_0' : + 'biocontainers/cooler:0.9.2--pyh7cba7a3_0' }" input: tuple val(meta), path(cool) @@ -32,4 +32,15 @@ process COOLER_ZOOMIFY { cooler: \$(cooler --version 2>&1 | sed 's/cooler, version //') END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.mcool + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cooler: \$(cooler --version 2>&1 | sed 's/cooler, version //') + END_VERSIONS + """ } diff --git a/modules/nf-core/cooler/zoomify/meta.yml b/modules/nf-core/cooler/zoomify/meta.yml index 57f55486..27dfe46a 100644 --- a/modules/nf-core/cooler/zoomify/meta.yml +++ b/modules/nf-core/cooler/zoomify/meta.yml @@ -2,6 +2,8 @@ name: cooler_zoomify description: Generate a multi-resolution cooler file by coarsening keywords: - mcool + - cool + - cooler tools: - cooler: description: Sparse binary format for genomic interaction matrices diff --git a/modules/nf-core/gnu/sort/main.nf b/modules/nf-core/gnu/sort/main.nf index e2b0bc9e..b0a57fbb 100644 --- a/modules/nf-core/gnu/sort/main.nf +++ b/modules/nf-core/gnu/sort/main.nf @@ -2,10 +2,10 @@ process GNU_SORT { tag "${meta.id}" label "process_low" - conda "conda-forge::coreutils=9.1" + conda "bioconda::coreutils=8.25" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'ubuntu:20.04' }" + 'https://depot.galaxyproject.org/singularity/coreutils:8.25--1' : + 'biocontainers/coreutils:8.25--1' }" input: tuple val(meta), path(input) @@ -23,7 +23,7 @@ process GNU_SORT { suffix = task.ext.suffix ?: "${input.extension}" output_file = "${prefix}.${suffix}" def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - + if ("$input" == "$output_file") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ sort ${args} ${input} > ${output_file} @@ -39,6 +39,8 @@ process GNU_SORT { suffix = task.ext.suffix ?: "${input.extension}" output_file = "${prefix}.${suffix}" def VERSION = "9.1" + + if ("$input" == "$output_file") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ sort ${args} ${input} > ${output_file} diff --git a/modules/nf-core/gnu/sort/meta.yml b/modules/nf-core/gnu/sort/meta.yml index d53317a6..e7fb0284 100644 --- a/modules/nf-core/gnu/sort/meta.yml +++ b/modules/nf-core/gnu/sort/meta.yml @@ -4,9 +4,10 @@ description: | keywords: - GNU - sort + - merge compare tools: - sort: - description: "Writes a sorted consatenation of file/s" + description: "Writes a sorted concatenation of file/s" homepage: "https://github.com/vgl-hub/gfastats" documentation: "https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html" licence: ["GPL"] diff --git a/modules/nf-core/minimap2/align/main.nf b/modules/nf-core/minimap2/align/main.nf index 430dbab9..4da47c18 100644 --- a/modules/nf-core/minimap2/align/main.nf +++ b/modules/nf-core/minimap2/align/main.nf @@ -6,7 +6,7 @@ process MINIMAP2_ALIGN { conda "bioconda::minimap2=2.24 bioconda::samtools=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:1679e915ddb9d6b4abda91880c4b48857d471bd8-0' : - 'quay.io/biocontainers/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:1679e915ddb9d6b4abda91880c4b48857d471bd8-0' }" + 'biocontainers/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:1679e915ddb9d6b4abda91880c4b48857d471bd8-0' }" input: tuple val(meta), path(reads) diff --git a/modules/nf-core/minimap2/index/main.nf b/modules/nf-core/minimap2/index/main.nf index 73dd4eef..7a1bb227 100644 --- a/modules/nf-core/minimap2/index/main.nf +++ b/modules/nf-core/minimap2/index/main.nf @@ -5,7 +5,7 @@ process MINIMAP2_INDEX { conda "bioconda::minimap2=2.24" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/minimap2:2.24--h7132678_1' : - 'quay.io/biocontainers/minimap2:2.24--h7132678_1' }" + 'biocontainers/minimap2:2.24--h7132678_1' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/miniprot/align/main.nf b/modules/nf-core/miniprot/align/main.nf index 027dadf6..20c05bc1 100644 --- a/modules/nf-core/miniprot/align/main.nf +++ b/modules/nf-core/miniprot/align/main.nf @@ -5,7 +5,7 @@ process MINIPROT_ALIGN { conda "bioconda::miniprot=0.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/miniprot:0.5--h7132678_0': - 'quay.io/biocontainers/miniprot:0.5--h7132678_0' }" + 'biocontainers/miniprot:0.5--h7132678_0' }" input: tuple val(meta), path(pep) @@ -36,4 +36,16 @@ process MINIPROT_ALIGN { miniprot: \$(miniprot --version 2>&1) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--gff") ? "gff" : "paf" + """ + touch ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + miniprot: \$(miniprot --version 2>&1) + END_VERSIONS + """ } diff --git a/modules/nf-core/miniprot/index/main.nf b/modules/nf-core/miniprot/index/main.nf index 1c342abf..19c4fd66 100644 --- a/modules/nf-core/miniprot/index/main.nf +++ b/modules/nf-core/miniprot/index/main.nf @@ -5,7 +5,7 @@ process MINIPROT_INDEX { conda "bioconda::miniprot=0.5" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/miniprot:0.5--h7132678_0': - 'quay.io/biocontainers/miniprot:0.5--h7132678_0' }" + 'biocontainers/miniprot:0.5--h7132678_0' }" input: tuple val(meta), path(fasta) @@ -19,7 +19,6 @@ process MINIPROT_INDEX { script: def args = task.ext.args ?: '' - """ miniprot \\ -t $task.cpus \\ @@ -32,4 +31,14 @@ process MINIPROT_INDEX { miniprot: \$(miniprot --version 2>&1) END_VERSIONS """ + + stub: + """ + touch ${fasta.baseName}.mpi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + miniprot: \$(miniprot --version 2>&1) + END_VERSIONS + """ } diff --git a/modules/nf-core/mummer/main.nf b/modules/nf-core/mummer/main.nf index 9229f9d5..16387d1d 100644 --- a/modules/nf-core/mummer/main.nf +++ b/modules/nf-core/mummer/main.nf @@ -6,7 +6,7 @@ process MUMMER { conda "bioconda::mummer=3.23" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mummer:3.23--pl5262h1b792b2_12' : - 'quay.io/biocontainers/mummer:3.23--pl5262h1b792b2_12' }" + 'biocontainers/mummer:3.23--pl5262h1b792b2_12' }" input: tuple val(meta), path(ref), path(query) @@ -45,4 +45,16 @@ process MUMMER { mummer: $VERSION END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '3.23' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + touch ${prefx}.coords + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + mummer: $VERSION + END_VERSIONS + """ } diff --git a/modules/nf-core/mummer/meta.yml b/modules/nf-core/mummer/meta.yml index ec4f0c86..f03d483c 100644 --- a/modules/nf-core/mummer/meta.yml +++ b/modules/nf-core/mummer/meta.yml @@ -10,7 +10,7 @@ tools: homepage: http://mummer.sourceforge.net/ documentation: http://mummer.sourceforge.net/ tool_dev_url: http://mummer.sourceforge.net/ - doi: https://doi.org/10.1186/gb-2004-5-2-r12 + doi: 10.1186/gb-2004-5-2-r12 licence: ["The Artistic License"] input: diff --git a/modules/nf-core/paftools/sam2paf/main.nf b/modules/nf-core/paftools/sam2paf/main.nf index e881d771..ae9c0ff1 100644 --- a/modules/nf-core/paftools/sam2paf/main.nf +++ b/modules/nf-core/paftools/sam2paf/main.nf @@ -6,7 +6,7 @@ process PAFTOOLS_SAM2PAF { conda "bioconda::minimap2=2.24 bioconda::samtools=1.14" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:1679e915ddb9d6b4abda91880c4b48857d471bd8-0' : - 'quay.io/biocontainers/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:1679e915ddb9d6b4abda91880c4b48857d471bd8-0' }" + 'biocontainers/mulled-v2-66534bcbb7031a148b13e2ad42583020b9cd25c4:1679e915ddb9d6b4abda91880c4b48857d471bd8-0' }" input: tuple val(meta), path(bam) diff --git a/modules/nf-core/pretextmap/main.nf b/modules/nf-core/pretextmap/main.nf index a4171ab8..95bbe7e9 100644 --- a/modules/nf-core/pretextmap/main.nf +++ b/modules/nf-core/pretextmap/main.nf @@ -3,7 +3,7 @@ process PRETEXTMAP { tag "$meta.id" label 'process_single' - conda "bioconda::pretextmap=0.1.9 bioconda::samtools=1.16.1" + conda "bioconda::pretextmap=0.1.9=h9f5acd7_1 bioconda::samtools=1.16.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/mulled-v2-f3591ce8609c7b3b33e5715333200aa5c163aa61:c6242a6c1a522137de7a9e9ff90779ede11cf5c5-0': 'biocontainers/mulled-v2-f3591ce8609c7b3b33e5715333200aa5c163aa61:c6242a6c1a522137de7a9e9ff90779ede11cf5c5-0' }" @@ -45,4 +45,16 @@ process PRETEXTMAP { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' )) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.pretext + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pretextmap: \$(PretextMap | grep "Version" | sed 's/PretextMap Version //g') + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' )) + END_VERSIONS + """ } diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf index ce6580d2..59ed3088 100644 --- a/modules/nf-core/samtools/faidx/main.nf +++ b/modules/nf-core/samtools/faidx/main.nf @@ -2,18 +2,20 @@ process SAMTOOLS_FAIDX { tag "$fasta" label 'process_single' - conda "bioconda::samtools=1.16.1" + conda "bioconda::samtools=1.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : - 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : + 'biocontainers/samtools:1.17--h00cdaf9_0' }" input: tuple val(meta), path(fasta) + tuple val(meta2), path(fai) output: - tuple val(meta), path ("*.fai"), emit: fai - tuple val(meta), path ("*.gzi"), emit: gzi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path ("*.{fa,fasta}") , emit: fa , optional: true + tuple val(meta), path ("*.fai") , emit: fai, optional: true + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when @@ -23,8 +25,8 @@ process SAMTOOLS_FAIDX { """ samtools \\ faidx \\ - $args \\ - $fasta + $fasta \\ + $args cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -33,8 +35,12 @@ process SAMTOOLS_FAIDX { """ stub: + def match = (task.ext.args =~ /-o(?:utput)?\s(.*)\s?/).findAll() + def fastacmd = match[0] ? "touch ${match[0][1]}" : '' """ + ${fastacmd} touch ${fasta}.fai + cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml index fe2fe9a1..957b25e5 100644 --- a/modules/nf-core/samtools/faidx/meta.yml +++ b/modules/nf-core/samtools/faidx/meta.yml @@ -3,6 +3,7 @@ description: Index FASTA file keywords: - index - fasta + - faidx tools: - samtools: description: | @@ -17,12 +18,21 @@ input: - meta: type: map description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] + Groovy Map containing reference information + e.g. [ id:'test' ] - fasta: type: file description: FASTA file pattern: "*.{fa,fasta}" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" output: - meta: type: map diff --git a/modules/nf-core/samtools/markdup/main.nf b/modules/nf-core/samtools/markdup/main.nf index f459163b..218cf97b 100644 --- a/modules/nf-core/samtools/markdup/main.nf +++ b/modules/nf-core/samtools/markdup/main.nf @@ -44,4 +44,20 @@ process SAMTOOLS_MARKDUP { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' )) END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--output-fmt sam") ? "sam" : + args.contains("--output-fmt bam") ? "bam" : + args.contains("--output-fmt cram") ? "cram" : + "bam" + if ("$input" == "${prefix}.${extension}") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" + """ + touch ${prefix}.${extension} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' )) + END_VERSIONS + """ } diff --git a/modules/nf-core/samtools/markdup/meta.yml b/modules/nf-core/samtools/markdup/meta.yml index 9ced7a0f..4207c93a 100644 --- a/modules/nf-core/samtools/markdup/meta.yml +++ b/modules/nf-core/samtools/markdup/meta.yml @@ -1,7 +1,10 @@ name: "samtools_markdup" description: mark duplicate alignments in a coordinate sorted file keywords: - - markdup + - bam + - duplicates + - markduplicates + - samtools tools: - "samtools": description: "Tools for dealing with SAM, BAM and CRAM files" diff --git a/modules/nf-core/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf index a80ff3a2..b73b7cb2 100644 --- a/modules/nf-core/samtools/merge/main.nf +++ b/modules/nf-core/samtools/merge/main.nf @@ -2,15 +2,15 @@ process SAMTOOLS_MERGE { tag "$meta.id" label 'process_low' - conda "bioconda::samtools=1.16.1" + conda "bioconda::samtools=1.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : - 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : + 'biocontainers/samtools:1.17--h00cdaf9_0' }" input: tuple val(meta), path(input_files, stageAs: "?/*") - path fasta - path fai + tuple val(meta2), path(fasta) + tuple val(meta3), path(fai) output: tuple val(meta), path("${prefix}.bam") , optional:true, emit: bam diff --git a/modules/nf-core/samtools/merge/meta.yml b/modules/nf-core/samtools/merge/meta.yml index 5bd84bc5..3a815f74 100644 --- a/modules/nf-core/samtools/merge/meta.yml +++ b/modules/nf-core/samtools/merge/meta.yml @@ -12,7 +12,7 @@ tools: short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. These files are generated as output by short read aligners like BWA. homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html + documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 licence: ["MIT"] input: @@ -25,13 +25,23 @@ input: type: file description: BAM/CRAM file pattern: "*.{bam,cram,sam}" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] - fasta: - type: optional file - description: Reference file the CRAM was created with + type: file + description: Reference file the CRAM was created with (optional) pattern: "*.{fasta,fa}" + - meta3: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'genome' ] - fai: - type: optional file - description: Index of the reference file the CRAM was created with + type: file + description: Index of the reference file the CRAM was created with (optional) pattern: "*.fai" output: - meta: @@ -60,3 +70,4 @@ authors: - "@yuukiiwa " - "@maxulysse" - "@FriederikeHanssen" + - "@ramprasadn" diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf index 84c167cd..2b7753fd 100644 --- a/modules/nf-core/samtools/sort/main.nf +++ b/modules/nf-core/samtools/sort/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - conda "bioconda::samtools=1.16.1" + conda "bioconda::samtools=1.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : - 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : + 'biocontainers/samtools:1.17--h00cdaf9_0' }" input: tuple val(meta), path(bam) @@ -23,7 +23,13 @@ process SAMTOOLS_SORT { def prefix = task.ext.prefix ?: "${meta.id}" if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ - samtools sort $args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + samtools sort \\ + $args \\ + -@ $task.cpus \\ + -o ${prefix}.bam \\ + -T $prefix \\ + $bam + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/modules/nf-core/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf index 729c85e5..cb91facf 100644 --- a/modules/nf-core/samtools/view/main.nf +++ b/modules/nf-core/samtools/view/main.nf @@ -2,14 +2,14 @@ process SAMTOOLS_VIEW { tag "$meta.id" label 'process_low' - conda "bioconda::samtools=1.16.1" + conda "bioconda::samtools=1.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : - 'quay.io/biocontainers/samtools:1.16.1--h6899075_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.17--h00cdaf9_0' : + 'biocontainers/samtools:1.17--h00cdaf9_0' }" input: tuple val(meta), path(input), path(index) - path fasta + tuple val(meta2), path(fasta) path qname output: diff --git a/modules/nf-core/samtools/view/meta.yml b/modules/nf-core/samtools/view/meta.yml index 2e597d34..3b05450b 100644 --- a/modules/nf-core/samtools/view/meta.yml +++ b/modules/nf-core/samtools/view/meta.yml @@ -26,12 +26,17 @@ input: description: BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" - index: - type: optional file - description: BAM.BAI/CRAM.CRAI file - pattern: "*.{.bai,.crai}" + type: file + description: BAM.BAI/BAM.CSI/CRAM.CRAI file (optional) + pattern: "*.{.bai,.csi,.crai}" + - meta2: + type: map + description: | + Groovy Map containing reference information + e.g. [ id:'test' ] - fasta: - type: optional file - description: Reference file the CRAM was created with + type: file + description: Reference file the CRAM was created with (optional) pattern: "*.{fasta,fa}" - qname: type: file diff --git a/modules/nf-core/seqtk/cutn/main.nf b/modules/nf-core/seqtk/cutn/main.nf index c991c8b3..7e3ffb55 100644 --- a/modules/nf-core/seqtk/cutn/main.nf +++ b/modules/nf-core/seqtk/cutn/main.nf @@ -5,7 +5,7 @@ process SEQTK_CUTN { conda "bioconda::seqtk=1.3" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/seqtk:1.3--h5bf99c6_3' : - 'quay.io/biocontainers/seqtk:1.3--h5bf99c6_3' }" + 'biocontainers/seqtk:1.3--h5bf99c6_3' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/tabix/bgziptabix/main.nf b/modules/nf-core/tabix/bgziptabix/main.nf index 76267f79..b73ee0c9 100644 --- a/modules/nf-core/tabix/bgziptabix/main.nf +++ b/modules/nf-core/tabix/bgziptabix/main.nf @@ -5,7 +5,7 @@ process TABIX_BGZIPTABIX { conda "bioconda::tabix=1.11" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : - 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" + 'biocontainers/tabix:1.11--hdfd78af_0' }" input: tuple val(meta), path(input) diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/main.nf b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf index defda3ef..b4719dee 100644 --- a/modules/nf-core/ucsc/bedgraphtobigwig/main.nf +++ b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf @@ -6,7 +6,7 @@ process UCSC_BEDGRAPHTOBIGWIG { conda "bioconda::ucsc-bedgraphtobigwig=377" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1' : - 'quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1' }" + 'biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1' }" input: tuple val(meta), path(bedgraph) @@ -34,4 +34,16 @@ process UCSC_BEDGRAPHTOBIGWIG { ucsc: $VERSION END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '377' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + touch ${prefix}.bigWig + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ucsc: $VERSION + END_VERSIONS + """ } diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml b/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml index ba8915be..416c91e0 100755 --- a/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml +++ b/modules/nf-core/ucsc/bedgraphtobigwig/meta.yml @@ -3,6 +3,9 @@ description: Convert a bedGraph file to bigWig format. keywords: - bedgraph - bigwig + - ucsc + - bedgraphtobigwig + - converter tools: - ucsc: description: Convert a bedGraph file to bigWig format. diff --git a/modules/nf-core/ucsc/bedtobigbed/main.nf b/modules/nf-core/ucsc/bedtobigbed/main.nf index efa62f9a..1e40375d 100644 --- a/modules/nf-core/ucsc/bedtobigbed/main.nf +++ b/modules/nf-core/ucsc/bedtobigbed/main.nf @@ -6,7 +6,7 @@ process UCSC_BEDTOBIGBED { conda "bioconda::ucsc-bedtobigbed=377" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/ucsc-bedtobigbed:377--ha8a8165_3' : - 'quay.io/biocontainers/ucsc-bedtobigbed:377--ha8a8165_3' }" + 'biocontainers/ucsc-bedtobigbed:377--ha8a8165_3' }" input: tuple val(meta), path(bed) @@ -38,4 +38,16 @@ process UCSC_BEDTOBIGBED { ucsc: $VERSION END_VERSIONS """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = '377' // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + touch ${prefix}.bigBed + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + ucsc: $VERSION + END_VERSIONS + """ } diff --git a/modules/nf-core/ucsc/bedtobigbed/meta.yml b/modules/nf-core/ucsc/bedtobigbed/meta.yml index e8e08fa7..8e9e5291 100755 --- a/modules/nf-core/ucsc/bedtobigbed/meta.yml +++ b/modules/nf-core/ucsc/bedtobigbed/meta.yml @@ -3,13 +3,14 @@ description: Convert file from bed to bigBed format keywords: - bed - bigbed + - ucsc + - bedtobigbed + - converter tools: - ucsc: description: Convert file from bed to bigBed format - homepage: None - documentation: None - tool_dev_url: None - doi: "" + homepage: http://hgdownload.cse.ucsc.edu/admin/exe/ + documentation: https://genome.ucsc.edu/goldenPath/help/bigBed.html licence: ["varies; see http://genome.ucsc.edu/license"] input: diff --git a/modules/nf-core/windowmasker/mk_counts/main.nf b/modules/nf-core/windowmasker/mk_counts/main.nf index c3516bc0..cdd0158a 100644 --- a/modules/nf-core/windowmasker/mk_counts/main.nf +++ b/modules/nf-core/windowmasker/mk_counts/main.nf @@ -5,7 +5,7 @@ process WINDOWMASKER_MKCOUNTS { conda "bioconda::blast=2.13.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/blast:2.13.0--hf3cf87c_0': - 'quay.io/biocontainers/blast:2.13.0--hf3cf87c_0' }" + 'biocontainers/blast:2.13.0--hf3cf87c_0' }" input: tuple val(meta), path(ref) diff --git a/modules/nf-core/windowmasker/ustat/main.nf b/modules/nf-core/windowmasker/ustat/main.nf index b288ad7b..e4947775 100644 --- a/modules/nf-core/windowmasker/ustat/main.nf +++ b/modules/nf-core/windowmasker/ustat/main.nf @@ -5,7 +5,7 @@ process WINDOWMASKER_USTAT { conda "bioconda::blast=2.13.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'https://depot.galaxyproject.org/singularity/blast:2.13.0--hf3cf87c_0': - 'quay.io/biocontainers/blast:2.13.0--hf3cf87c_0' }" + 'biocontainers/blast:2.13.0--hf3cf87c_0' }" input: tuple val(meta) , path(counts) diff --git a/subworkflows/local/generate_genome.nf b/subworkflows/local/generate_genome.nf index 61eb922a..0f46eaac 100755 --- a/subworkflows/local/generate_genome.nf +++ b/subworkflows/local/generate_genome.nf @@ -30,7 +30,7 @@ workflow GENERATE_GENOME { // MODULE: GENERATE INDEX OF REFERENCE // EMITS REFERENCE INDEX FILE // - SAMTOOLS_FAIDX ( to_samtools ) + SAMTOOLS_FAIDX ( to_samtools, [[],[]] ) ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) // diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index bf8df5bf..fdbc8a0a 100644 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -101,21 +101,10 @@ workflow HIC_MAPPING { } .set { collected_files_for_merge } - // - // LOGIC: PREPARING MERGE INPUT - // - reference_tuple - .combine( reference_index ) - .multiMap { ref_meta, ref_fa, ref_idx_meta, ref_idx -> - reference: ref_fa - ref_idx: ref_idx - } - .set { ref_files } - // // MODULE: MERGE POSITION SORTED BAM FILES AND MARK DUPLICATES // - SAMTOOLS_MERGE ( collected_files_for_merge, ref_files.reference, ref_files.ref_idx ) + SAMTOOLS_MERGE ( collected_files_for_merge, reference_tuple, reference_index ) ch_versions = ch_versions.mix ( SAMTOOLS_MERGE.out.versions.first() ) // diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index 7af0214c..d7f21448 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -138,8 +138,8 @@ workflow LONGREAD_COVERAGE { // EMITS A MERGED BAM SAMTOOLS_MERGE( collected_files_for_merge, - reference_tuple.map { it[1] }, - MINIMAP2_INDEX.out.index.map { it[1] } + reference_tuple, + MINIMAP2_INDEX.out.index ) ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) ch_merged_bam = SAMTOOLS_MERGE.out.bam @@ -151,15 +151,15 @@ workflow LONGREAD_COVERAGE { .combine( reference_tuple ) .combine( ch_ref_index ) .map { meta, file, ref_meta, ref, ref_index_meta, ref_index -> - tuple([ id: meta.id, single_end: true], file, ref, ref_index) } + tuple([ id: meta.id, single_end: true], file, ref_meta, ref, ref_index) } .set { view_input } // // MODULE: EXTRACT READS FOR PRIMARY ASSEMBLY // SAMTOOLS_VIEW( - view_input.map { [it[0], it[1], it[3]] }, - view_input.map { it[2] }, + view_input.map { [it[0], it[1], it[4]] }, + view_input.map { [it[2], it[3]] }, [] ) ch_versions = ch_versions.mix(SAMTOOLS_VIEW.out.versions) diff --git a/subworkflows/local/nuc_alignments.nf b/subworkflows/local/nuc_alignments.nf index c774e464..5bc40a5c 100644 --- a/subworkflows/local/nuc_alignments.nf +++ b/subworkflows/local/nuc_alignments.nf @@ -70,28 +70,20 @@ workflow NUC_ALIGNMENTS { // // LOGIC: CONVERTS THE MINIMAP OUTPUT TUPLE INTO A GROUPED TUPLE PER INPUT QUERY ORGANISM // AND DATA TYPE (RNA, CDS, DNA). - // EMITS THREE CHANNELS FOR THE GROUPED QUERY DATA REFERENCE AND REFERENCE INDEX // MINIMAP2_ALIGN.out.bam .map { meta, file -> tuple([id: meta.org, type: meta.type], file) } .groupTuple( by: [0] ) - .combine( reference_tuple ) - .combine( reference_index ) - .multiMap { it -> - nuc_grouped: tuple( it[0], it[1] ) - reference: it[-3] - ref_index: it[-1] - } .set { merge_input } // // MODULE: MERGES THE BAM FILES FOUND IN THE GROUPED TUPLE IN REGARDS TO THE REFERENCE // EMITS A MERGED BAM SAMTOOLS_MERGE ( - merge_input.nuc_grouped, - merge_input.reference, - merge_input.ref_index + merge_input, + reference_tuple, + reference_index ) ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) From a003ddc445c75f56feb401e02dfa2c5f135f8c1c Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 28 Jun 2023 10:24:19 +0100 Subject: [PATCH 06/85] Prettier linting for docs --- CHANGELOG.md | 42 +++++++++-------- modules.json | 130 +++++++++++++-------------------------------------- 2 files changed, 55 insertions(+), 117 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 143d56bf..02f39a21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Initial release of sanger-tol/treeval, created with the [nf-core](https://nf-co. The essential pathways of the gEVAL pipeline have now been converted to Nextflow DSL2 from vr-runner, snakemake and wr. Of the original pipeline there is only Bionano left to implement. ### Enhancements & Fixes + - Updated to nf-core/tools template v2.8.0. - Subworkflow to generate channels from input yaml. - Subworkflow to generate genome summary file using samtools @@ -25,32 +26,33 @@ The essential pathways of the gEVAL pipeline have now been converted to Nextflow - Subworkflow to generate tracks containing telomeric sites. ### Parameters + | Old Parameter | New Parameter | -|---|---| -| - | --input | +| ------------- | ------------- | +| - | --input | ### Software dependencies Note, since the pipeline is using Nextflow DSL2, each process will be run with its own Biocontainer. This means that on occasion it is entirely possible for the pipeline to be using different versions of the same tool. However, the overall software dependency changes compared to the last release have been listed below for reference. -| Module | Old Version | New Versions | -|---|---|---| -| bedtools | - | 2.31.0 | -| busco | - | 5.4.3 | -| bwa-mem2 | - | 2.2.1 | -| cat | - | 2.3.4 | -| cooler | - | 0.9.2 | -| gnu-sort | - | 8.25 | -| minimap2 + samtools | - | 2.24 + 1.14 | -| miniprot | - | 0.5 | -| mummer | - | 3.23 | -| paftools (minimap2 + samtools) | - | 2.24 + 1.14 | -| pretextmap + samtools| - | 0.1.9=h9f5acd7_1 + 1.16.1 | -| samtools | - | 1.17 | -| seqtk | - | 1.3 | -| tabix | - | 1.11 | -| ucsc | - | 377 | -| windowmasker (blast) | - | 2.13.0 | +| Module | Old Version | New Versions | +| ------------------------------ | ----------- | ------------------------- | +| bedtools | - | 2.31.0 | +| busco | - | 5.4.3 | +| bwa-mem2 | - | 2.2.1 | +| cat | - | 2.3.4 | +| cooler | - | 0.9.2 | +| gnu-sort | - | 8.25 | +| minimap2 + samtools | - | 2.24 + 1.14 | +| miniprot | - | 0.5 | +| mummer | - | 3.23 | +| paftools (minimap2 + samtools) | - | 2.24 + 1.14 | +| pretextmap + samtools | - | 0.1.9=h9f5acd7_1 + 1.16.1 | +| samtools | - | 1.17 | +| seqtk | - | 1.3 | +| tabix | - | 1.11 | +| ucsc | - | 377 | +| windowmasker (blast) | - | 2.13.0 | ### Fixed diff --git a/modules.json b/modules.json index 8901f989..02376ad2 100644 --- a/modules.json +++ b/modules.json @@ -8,227 +8,163 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -237,4 +173,4 @@ } } } -} \ No newline at end of file +} From a6ced2e5313a633b2f7d25fdea3066734a2e75b9 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 28 Jun 2023 14:42:08 +0100 Subject: [PATCH 07/85] Updating pretext --- modules/nf-core/pretextmap/main.nf | 8 ++++---- nextflow_schema.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/nf-core/pretextmap/main.nf b/modules/nf-core/pretextmap/main.nf index 95bbe7e9..f7a5313d 100644 --- a/modules/nf-core/pretextmap/main.nf +++ b/modules/nf-core/pretextmap/main.nf @@ -3,10 +3,10 @@ process PRETEXTMAP { tag "$meta.id" label 'process_single' - conda "bioconda::pretextmap=0.1.9=h9f5acd7_1 bioconda::samtools=1.16.1" + conda "bioconda::pretextmap=0.1.9 bioconda::samtools=1.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/mulled-v2-f3591ce8609c7b3b33e5715333200aa5c163aa61:c6242a6c1a522137de7a9e9ff90779ede11cf5c5-0': - 'biocontainers/mulled-v2-f3591ce8609c7b3b33e5715333200aa5c163aa61:c6242a6c1a522137de7a9e9ff90779ede11cf5c5-0' }" + 'https://depot.galaxyproject.org/singularity/mulled-v2-f3591ce8609c7b3b33e5715333200aa5c163aa61%3A44321ab4d64f0b6d0c93abbd1406369d1b3da684-0': + 'biocontainers/mulled-v2-f3591ce8609c7b3b33e5715333200aa5c163aa61:44321ab4d64f0b6d0c93abbd1406369d1b3da684-0' }" input: tuple val(meta), path(input) @@ -42,7 +42,7 @@ process PRETEXTMAP { cat <<-END_VERSIONS > versions.yml "${task.process}": pretextmap: \$(PretextMap | grep "Version" | sed 's/PretextMap Version //g') - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' )) + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//' ) END_VERSIONS """ diff --git a/nextflow_schema.json b/nextflow_schema.json index 308ccc0d..686460a1 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -2,7 +2,7 @@ "$schema": "http://json-schema.org/draft-07/schema", "$id": "https://raw.githubusercontent.com/sanger-tol/treeval/master/nextflow_schema.json", "title": "sanger-tol/treeval pipeline parameters", - "description": "A pipeline to generate supplimental data for genome curation", + "description": "A pipeline to generate supplemental data for genome curation", "type": "object", "definitions": { "input_output_options": { From f66f93d537c42eeea4edb1873ddb018dcc4e505b Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 29 Jun 2023 10:04:21 +0100 Subject: [PATCH 08/85] Updates to yet more modules and prettier fix --- modules.json | 143 +++++++++++++----- modules/nf-core/bedtools/map/main.nf | 6 +- modules/nf-core/bedtools/map/meta.yml | 3 + modules/nf-core/busco/meta.yml | 2 +- modules/nf-core/seqtk/cutn/main.nf | 6 +- modules/nf-core/seqtk/cutn/meta.yml | 1 + modules/nf-core/tabix/bgziptabix/main.nf | 6 +- .../tabix/bgziptabix/tabix-bgziptabix.diff | 18 --- .../nf-core/windowmasker/mk_counts/main.nf | 6 +- .../nf-core/windowmasker/mk_counts/meta.yml | 1 + modules/nf-core/windowmasker/ustat/main.nf | 6 +- modules/nf-core/windowmasker/ustat/meta.yml | 1 + 12 files changed, 125 insertions(+), 74 deletions(-) delete mode 100644 modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff diff --git a/modules.json b/modules.json index 02376ad2..cf540f63 100644 --- a/modules.json +++ b/modules.json @@ -8,163 +8,226 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"], - "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" + "installed_by": [ + "modules" + ] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] } } }, @@ -173,4 +236,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/bedtools/map/main.nf b/modules/nf-core/bedtools/map/main.nf index 1af31977..846d5ba2 100644 --- a/modules/nf-core/bedtools/map/main.nf +++ b/modules/nf-core/bedtools/map/main.nf @@ -2,10 +2,10 @@ process BEDTOOLS_MAP { tag "$meta.id" label 'process_single' - conda "bioconda::bedtools=2.30.0" + conda "bioconda::bedtools=2.31.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/bedtools:2.30.0--hc088bd4_0' : - 'biocontainers/bedtools:2.30.0--hc088bd4_0' }" + 'https://depot.galaxyproject.org/singularity/bedtools:2.31.0--hf5e1c6e_2' : + 'biocontainers/bedtools:2.31.0--hf5e1c6e_2' }" input: tuple val(meta), path(intervals1), path(intervals2) diff --git a/modules/nf-core/bedtools/map/meta.yml b/modules/nf-core/bedtools/map/meta.yml index 71fe42e8..b0ce79d2 100644 --- a/modules/nf-core/bedtools/map/meta.yml +++ b/modules/nf-core/bedtools/map/meta.yml @@ -2,7 +2,10 @@ name: bedtools_map description: Allows one to screen for overlaps between two sets of genomic features. keywords: - bed + - vcf + - gff - map + - bedtools tools: - bedtools: description: | diff --git a/modules/nf-core/busco/meta.yml b/modules/nf-core/busco/meta.yml index ef8c5245..cdc9dd46 100644 --- a/modules/nf-core/busco/meta.yml +++ b/modules/nf-core/busco/meta.yml @@ -25,7 +25,7 @@ input: description: Nucleic or amino acid sequence file in FASTA format. pattern: "*.{fasta,fna,fa,fasta.gz,fna.gz,fa.gz}" - lineage: - type: value + type: string description: The BUSCO lineage to use, or "auto" to automatically select lineage - busco_lineages_path: type: directory diff --git a/modules/nf-core/seqtk/cutn/main.nf b/modules/nf-core/seqtk/cutn/main.nf index 7e3ffb55..e2b90cf1 100644 --- a/modules/nf-core/seqtk/cutn/main.nf +++ b/modules/nf-core/seqtk/cutn/main.nf @@ -2,10 +2,10 @@ process SEQTK_CUTN { tag "$meta.id" label 'process_low' - conda "bioconda::seqtk=1.3" + conda "bioconda::seqtk=1.4" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/seqtk:1.3--h5bf99c6_3' : - 'biocontainers/seqtk:1.3--h5bf99c6_3' }" + 'https://depot.galaxyproject.org/singularity/seqtk:1.4--he4a0461_1' : + 'biocontainers/seqtk:1.4--he4a0461_1' }" input: tuple val(meta), path(fasta) diff --git a/modules/nf-core/seqtk/cutn/meta.yml b/modules/nf-core/seqtk/cutn/meta.yml index 314e2d0f..4850df9d 100644 --- a/modules/nf-core/seqtk/cutn/meta.yml +++ b/modules/nf-core/seqtk/cutn/meta.yml @@ -3,6 +3,7 @@ description: Generates a BED file containing genomic locations of lengths of N. keywords: - cut - fasta + - seqtk tools: - seqtk: description: Seqtk is a fast and lightweight tool for processing sequences in the FASTA or FASTQ format. Seqtk mergepe command merges pair-end reads into one interleaved file. diff --git a/modules/nf-core/tabix/bgziptabix/main.nf b/modules/nf-core/tabix/bgziptabix/main.nf index b73ee0c9..d6c5a760 100644 --- a/modules/nf-core/tabix/bgziptabix/main.nf +++ b/modules/nf-core/tabix/bgziptabix/main.nf @@ -19,9 +19,9 @@ process TABIX_BGZIPTABIX { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def args2 = meta.max_scaff == 'csi' ? "--csi" : '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ bgzip --threads ${task.cpus} -c $args $input > ${prefix}.${input.getExtension()}.gz tabix $args2 ${prefix}.${input.getExtension()}.gz diff --git a/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff b/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff deleted file mode 100644 index 55016165..00000000 --- a/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff +++ /dev/null @@ -1,18 +0,0 @@ -Changes in module 'nf-core/tabix/bgziptabix' ---- modules/nf-core/tabix/bgziptabix/main.nf -+++ modules/nf-core/tabix/bgziptabix/main.nf -@@ -19,9 +19,9 @@ - task.ext.when == null || task.ext.when - - script: -- def args = task.ext.args ?: '' -- def args2 = task.ext.args2 ?: '' -- def prefix = task.ext.prefix ?: "${meta.id}" -+ def args = task.ext.args ?: '' -+ def args2 = meta.max_scaff == 'csi' ? "--csi" : '' -+ def prefix = task.ext.prefix ?: "${meta.id}" - """ - bgzip --threads ${task.cpus} -c $args $input > ${prefix}.${input.getExtension()}.gz - tabix $args2 ${prefix}.${input.getExtension()}.gz - -************************************************************ diff --git a/modules/nf-core/windowmasker/mk_counts/main.nf b/modules/nf-core/windowmasker/mk_counts/main.nf index cdd0158a..bfa66f35 100644 --- a/modules/nf-core/windowmasker/mk_counts/main.nf +++ b/modules/nf-core/windowmasker/mk_counts/main.nf @@ -2,10 +2,10 @@ process WINDOWMASKER_MKCOUNTS { tag "$meta.id" label 'process_low' - conda "bioconda::blast=2.13.0" + conda "bioconda::blast=2.14.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/blast:2.13.0--hf3cf87c_0': - 'biocontainers/blast:2.13.0--hf3cf87c_0' }" + 'https://depot.galaxyproject.org/singularity/blast:2.14.0--h7d5a4b4_1': + 'biocontainers/blast:2.14.0--h7d5a4b4_1' }" input: tuple val(meta), path(ref) diff --git a/modules/nf-core/windowmasker/mk_counts/meta.yml b/modules/nf-core/windowmasker/mk_counts/meta.yml index e4140a73..788dc96c 100644 --- a/modules/nf-core/windowmasker/mk_counts/meta.yml +++ b/modules/nf-core/windowmasker/mk_counts/meta.yml @@ -3,6 +3,7 @@ description: A program to generate frequency counts of repetitive units. keywords: - fasta - interval + - windowmasker tools: - windowmasker: description: | diff --git a/modules/nf-core/windowmasker/ustat/main.nf b/modules/nf-core/windowmasker/ustat/main.nf index e4947775..72a19dbf 100644 --- a/modules/nf-core/windowmasker/ustat/main.nf +++ b/modules/nf-core/windowmasker/ustat/main.nf @@ -2,10 +2,10 @@ process WINDOWMASKER_USTAT { tag "$meta.id" label 'process_low' - conda "bioconda::blast=2.13.0" + conda "bioconda::blast=2.14.0" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/blast:2.13.0--hf3cf87c_0': - 'biocontainers/blast:2.13.0--hf3cf87c_0' }" + 'https://depot.galaxyproject.org/singularity/blast:2.14.0--h7d5a4b4_1': + 'biocontainers/blast:2.14.0--h7d5a4b4_1' }" input: tuple val(meta) , path(counts) diff --git a/modules/nf-core/windowmasker/ustat/meta.yml b/modules/nf-core/windowmasker/ustat/meta.yml index fe0d8000..6acf2e50 100644 --- a/modules/nf-core/windowmasker/ustat/meta.yml +++ b/modules/nf-core/windowmasker/ustat/meta.yml @@ -3,6 +3,7 @@ description: A program to take a counts file and creates a file of genomic co-or keywords: - fasta - interval + - windowmasker tools: - windowmasker: description: | From d668c5e43ee0705ee452eb441772a7513c0ee7a0 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 29 Jun 2023 10:04:58 +0100 Subject: [PATCH 09/85] Updates to yet more modules and prettier fix --- modules.json | 130 +++++++++++++-------------------------------------- 1 file changed, 33 insertions(+), 97 deletions(-) diff --git a/modules.json b/modules.json index cf540f63..e50a6814 100644 --- a/modules.json +++ b/modules.json @@ -8,226 +8,162 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -236,4 +172,4 @@ } } } -} \ No newline at end of file +} From d9e5c0ac84ffb900d2cd468889e0f0df93f6c8ae Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 29 Jun 2023 11:03:57 +0100 Subject: [PATCH 10/85] Updates to miniprot more modules and prettier fix --- modules.json | 134 ++++++++++++++++++------- modules/nf-core/miniprot/align/main.nf | 6 +- modules/nf-core/miniprot/index/main.nf | 6 +- 3 files changed, 105 insertions(+), 41 deletions(-) diff --git a/modules.json b/modules.json index e50a6814..15b66174 100644 --- a/modules.json +++ b/modules.json @@ -8,162 +8,226 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -172,4 +236,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/miniprot/align/main.nf b/modules/nf-core/miniprot/align/main.nf index 20c05bc1..9a1f1184 100644 --- a/modules/nf-core/miniprot/align/main.nf +++ b/modules/nf-core/miniprot/align/main.nf @@ -2,10 +2,10 @@ process MINIPROT_ALIGN { tag "$meta.id" label 'process_medium' - conda "bioconda::miniprot=0.5" + conda "bioconda::miniprot=0.11=he4a0461_2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/miniprot:0.5--h7132678_0': - 'biocontainers/miniprot:0.5--h7132678_0' }" + 'https://depot.galaxyproject.org/singularity/miniprot:0.11--he4a0461_2': + 'biocontainers/miniprot:0.11--he4a0461_2' }" input: tuple val(meta), path(pep) diff --git a/modules/nf-core/miniprot/index/main.nf b/modules/nf-core/miniprot/index/main.nf index 19c4fd66..ee3757b6 100644 --- a/modules/nf-core/miniprot/index/main.nf +++ b/modules/nf-core/miniprot/index/main.nf @@ -2,10 +2,10 @@ process MINIPROT_INDEX { tag "$meta.id" label 'process_medium' - conda "bioconda::miniprot=0.5" + conda "bioconda::miniprot=0.11=he4a0461_2" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/miniprot:0.5--h7132678_0': - 'biocontainers/miniprot:0.5--h7132678_0' }" + 'https://depot.galaxyproject.org/singularity/miniprot:0.11--he4a0461_2': + 'biocontainers/miniprot:0.11--he4a0461_2' }" input: tuple val(meta), path(fasta) From 8fb47a0c0af1fc9f3a7554dbde516b8750b9dc58 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 29 Jun 2023 11:32:11 +0100 Subject: [PATCH 11/85] Prettier linting --- modules.json | 130 +++++++++++++-------------------------------------- 1 file changed, 33 insertions(+), 97 deletions(-) diff --git a/modules.json b/modules.json index 15b66174..77e61553 100644 --- a/modules.json +++ b/modules.json @@ -8,226 +8,162 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -236,4 +172,4 @@ } } } -} \ No newline at end of file +} From 6e8bb942a6323360774099aff7ad1708cfe2f61d Mon Sep 17 00:00:00 2001 From: YSims Date: Thu, 29 Jun 2023 21:32:58 +0100 Subject: [PATCH 12/85] Update selfcomp alignment block setting in base.config --- conf/base.config | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/conf/base.config b/conf/base.config index c14bf74c..5defffae 100644 --- a/conf/base.config +++ b/conf/base.config @@ -23,12 +23,19 @@ process { } // RESOURCES: MEMORY INTENSIVE STEPS, SOFTWARE TO BE UPDATED TO COMBAT THIS - withName: '.*:.*:SELFCOMP:(SELFCOMP_ALIGNMENTBLOCKS|SELFCOMP_MAPIDS|SELFCOMP_MUMMER2BED|SELFCOMP_SPLITFASTA|BEDTOOLS_MERGE)' { + withName: '.*:.*:SELFCOMP:(SELFCOMP_MAPIDS|SELFCOMP_MUMMER2BED|SELFCOMP_SPLITFASTA|BEDTOOLS_MERGE)' { cpus = { check_max( 10 * task.attempt, 'cpus' ) } memory = { check_max( 120.GB * task.attempt, 'memory' ) } time = { check_max( 12.h * task.attempt, 'time' ) } } + withName: SELFCOMP_ALIGNMENTBLOCKS { + cpus = { check_max( 20 * task.attempt, 'cpus' ) } + memory = { check_max( 120.GB * task.attempt, 'memory' ) } + time = { check_max( 18.h * task.attempt, 'time' ) } + } + + // RESOURCES: CHANGES TO FREQUENT FAILURES BELOW THIS MEM POINT withName: '(MINIPROT_ALIGN|MINIMAP2_ALIGN)' { memory = { check_max( 100.GB * Math.ceil( task.attempt * 1.5 ) , 'memory' ) } From e71d8be608cbc5c3d758dfe9482dafd00a47fb13 Mon Sep 17 00:00:00 2001 From: YSims Date: Mon, 3 Jul 2023 13:10:25 +0100 Subject: [PATCH 13/85] Update gap_length.nf --- modules/local/gap_length.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/gap_length.nf b/modules/local/gap_length.nf index 32737202..d439829c 100644 --- a/modules/local/gap_length.nf +++ b/modules/local/gap_length.nf @@ -19,7 +19,7 @@ process GAP_LENGTH { def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. $/ cat "${file}" \ - | awk '{print $0"\t"sqrt(($3-$2)*($3-$2))}' > pretext_${prefix}_gap.bedgraph + | awk '{print $0"\t"sqrt(($3-$2)*($3-$2))}' > ${prefix}_gap.bedgraph cat <<-END_VERSIONS > versions.yml "${task.process}": From 9773b8c38bf5c02aa087816892a6a6a57e6c8230 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 6 Jul 2023 12:04:59 +0100 Subject: [PATCH 14/85] adding snapshot --- modules/nf-core/pretextsnapshot/main.nf | 35 ++++++++++++++++++ modules/nf-core/pretextsnapshot/meta.yml | 45 ++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 modules/nf-core/pretextsnapshot/main.nf create mode 100644 modules/nf-core/pretextsnapshot/meta.yml diff --git a/modules/nf-core/pretextsnapshot/main.nf b/modules/nf-core/pretextsnapshot/main.nf new file mode 100644 index 00000000..10425446 --- /dev/null +++ b/modules/nf-core/pretextsnapshot/main.nf @@ -0,0 +1,35 @@ +process PRETEXTSNAPSHOT { + tag "$meta.id" + label 'process_single' + + conda "bioconda::pretextsnapshot=0.0.4" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pretextsnapshot:0.0.4--h7d875b9_0': + 'biocontainers/pretextsnapshot:0.0.4--h7d875b9_0' }" + + input: + tuple val(meta), path(pretext_map) + + output: + tuple val(meta), path('*.{jpeg,png,bmp}'), emit: image + 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}" + """ + PretextSnapshot \\ + $args \\ + --map $pretext_map \\ + --prefix $prefix \\ + --folder . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + pretextsnapshot: \$(echo \$(PretextSnapshot --version 2>&1) | sed 's/^.*PretextSnapshot Version //' ) + END_VERSIONS + """ +} diff --git a/modules/nf-core/pretextsnapshot/meta.yml b/modules/nf-core/pretextsnapshot/meta.yml new file mode 100644 index 00000000..fe9cb17a --- /dev/null +++ b/modules/nf-core/pretextsnapshot/meta.yml @@ -0,0 +1,45 @@ +name: "pretextsnapshot" +description: a module to generate images from Pretext contact maps. +keywords: + - pretext + - image + - hic + - png + - jpg + - bmp + - contact maps +tools: + - "pretextsnapshot": + description: "Commandline image generator for Pretext Hi-C genome contact maps." + homepage: "https://github.com/wtsi-hpag/PretextSnapshot" + tool_dev_url: "https://github.com/wtsi-hpag/PretextSnapshot" + licence: "['https://github.com/wtsi-hpag/PretextSnapshot/blob/master/LICENSE']" + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - pretext_map: + type: file + description: pretext hic map + pattern: "*.pretext" + +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" + - image: + type: file + description: image of a hic contact map + pattern: "*.{png,jpg,bmp}" + +authors: + - "@epaule" From bdce9832a3fec6646d0db81eb908072f0ba338e9 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 6 Jul 2023 12:05:13 +0100 Subject: [PATCH 15/85] Adding snapshot --- conf/base.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/base.config b/conf/base.config index 5defffae..d6fffac4 100644 --- a/conf/base.config +++ b/conf/base.config @@ -84,12 +84,12 @@ process { // add a cpus 16 if bam.size() >= 50GB withName: '(SAMTOOLS_MARKDUP|BAMTOBED_SORT)' { - cpus = { check_max( 16 * 1, 'cpus' ) } - memory = { check_max( 75.GB * task.attempt, 'memory' ) } + cpus = { check_max( 12 * 1, 'cpus' ) } + memory = { check_max( 100.GB * task.attempt, 'memory' ) } } withName: COOLER_CLOAD { - cpus = { check_max( 16 * 1, 'cpus' ) } + cpus = { check_max( 16 * 1, 'cpus' ) } memory = { check_max( 100.GB * task.attempt, 'memory' ) } } From b336c39409636cc453445bcfdbaf7fec640ee1a9 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 6 Jul 2023 12:05:48 +0100 Subject: [PATCH 16/85] Fixing gap_length stub --- modules/local/gap_length.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/gap_length.nf b/modules/local/gap_length.nf index d439829c..c8f6ce7d 100644 --- a/modules/local/gap_length.nf +++ b/modules/local/gap_length.nf @@ -31,7 +31,7 @@ process GAP_LENGTH { def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = "9.1" """ - touch ${prefix}_gap.bed + touch ${prefix}_gap.bedgraph cat <<-END_VERSIONS > versions.yml "${task.process}": From 31678913b15f8fc8d621491a0540c693489594a2 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 6 Jul 2023 12:09:38 +0100 Subject: [PATCH 17/85] Updating resource allocation --- modules/local/bamtobed_sort.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/local/bamtobed_sort.nf b/modules/local/bamtobed_sort.nf index 22c330a3..19b0bcfb 100644 --- a/modules/local/bamtobed_sort.nf +++ b/modules/local/bamtobed_sort.nf @@ -16,8 +16,11 @@ process BAMTOBED_SORT { script: def prefix = args.ext.prefix ?: "${meta.id}" def st_cores = task.cpus > 4 ? 4 : "${task.cpus}" + + // NOTE: the below is required else the buffer takes all the mem rather than the actual process + def buff_mem = { task.memory > 50 ? 0 : task.memory / 3 } """ - samtools view -@${st_cores} -u -F0x400 ${bam} | bamToBed | sort -k4 --parallel=${task.cpus} -S ${task.memory.toGiga()}G > ${prefix}_merged_sorted.bed + samtools view -@${st_cores} -u -F0x400 ${bam} | bamToBed | sort -k4 --parallel=${task.cpus} -S ${buff_mem}G > ${prefix}_merged_sorted.bed cat <<-END_VERSIONS > versions.yml "${task.process}": From 5fc252a0c7b7593287e0da17d73f6ddb5c607b86 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 6 Jul 2023 13:49:04 +0100 Subject: [PATCH 18/85] adding resource tracing --- nextflow.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index b62b481e..ae6f1e48 100644 --- a/nextflow.config +++ b/nextflow.config @@ -187,7 +187,8 @@ report { } trace { enabled = true - file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt" + file = "${params.tracedir}/resource_trace_${trace_timestamp}.txt" + fields = 'process,name,status,module,cpus,memory,attempt,realtime,%cpus,%memory,peak_rss' } dag { enabled = true From 7218d4b0c91a9908246d2bfbbf6f6cb949ec539a Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 6 Jul 2023 13:49:24 +0100 Subject: [PATCH 19/85] Adding pretextsnapshot --- modules.json | 137 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 104 insertions(+), 33 deletions(-) diff --git a/modules.json b/modules.json index 77e61553..0aad853f 100644 --- a/modules.json +++ b/modules.json @@ -8,162 +8,233 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] + }, + "pretextsnapshot": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -172,4 +243,4 @@ } } } -} +} \ No newline at end of file From 23d5c3e6a63a8a438df9b5243ba570f9071910c1 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 6 Jul 2023 13:50:01 +0100 Subject: [PATCH 20/85] Adding pretextsnapshot --- subworkflows/local/hic_mapping.nf | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index fdbc8a0a..0cf42c2b 100644 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -13,6 +13,7 @@ include { COOLER_CLOAD } from '../../modules/nf-cor include { COOLER_ZOOMIFY } from '../../modules/nf-core/cooler/zoomify/main' include { PRETEXTMAP as PRETEXTMAP_STANDRD } from '../../modules/nf-core/pretextmap/main' include { PRETEXTMAP as PRETEXTMAP_HIGHRES } from '../../modules/nf-core/pretextmap/main' +include { PRETEXTSNAPSHOT } from '../../modules/nf-core/pretextsnapshot/main' include { SAMTOOLS_MARKDUP } from '../../modules/nf-core/samtools/markdup/main' include { SAMTOOLS_MERGE } from '../../modules/nf-core/samtools/merge/main' include { BAMTOBED_SORT } from '../../modules/local/bamtobed_sort.nf' @@ -130,6 +131,12 @@ workflow HIC_MAPPING { PRETEXTMAP_HIGHRES ( pretext_input.input_bam, pretext_input.reference ) ch_versions = ch_versions.mix(PRETEXTMAP_HIGHRES.out.versions) + // + // MODULE: GENERATE A PNG FROM THE PRETEXT + // + PRETEXTSNAPSHOT ( PRETEXTMAP_STANDRD.out.pretext ) + ch_versions = ch_versions.mix(PRETEXTSNAPSHOT.out.versions) + // // MODULE: MERGE POSITION SORTED BAM FILES AND MARK DUPLICATES // From 5e99c625fc2e0e715e7ef292bc637bf11b678061 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 6 Jul 2023 13:50:46 +0100 Subject: [PATCH 21/85] Updating resource for bamtobed --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index 548ea8f0..e5aff5b0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -42,7 +42,7 @@ process { // Files to be used for pretext, likely to be deleted once the hic workflow is complete. // .bed, .hr.pretext, .lr.pretext, needs centromere} - withName: 'GAP_LENGTH|PRETEXTMAP_HIGHRES|PRETEXTMAP_STANDRD|COOLER_ZOOMIFY|.*:.*:REPEAT_DENSITY:UCSC_BEDGRAPHTOBIGWIG|EXTRACT_TELO|JUICER_TOOLS_PRE' { + withName: 'GAP_LENGTH|PRETEXTMAP_HIGHRES|PRETEXTMAP_STANDRD|COOLER_ZOOMIFY|.*:.*:REPEAT_DENSITY:UCSC_BEDGRAPHTOBIGWIG|EXTRACT_TELO|JUICER_TOOLS_PRE|PRETEXTSNAPSHOT' { publishDir = [ path: { "${params.outdir}/hic_files" }, mode: params.publish_dir_mode, From 4dfe6b0d0ce08fd32a778301e50a106c3ee86fc1 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Fri, 7 Jul 2023 10:01:25 +0100 Subject: [PATCH 22/85] hardcoding buffer for sort as temp patch, should be a arg --- modules/local/bamtobed_sort.nf | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/local/bamtobed_sort.nf b/modules/local/bamtobed_sort.nf index 19b0bcfb..fe46b62b 100644 --- a/modules/local/bamtobed_sort.nf +++ b/modules/local/bamtobed_sort.nf @@ -16,11 +16,8 @@ process BAMTOBED_SORT { script: def prefix = args.ext.prefix ?: "${meta.id}" def st_cores = task.cpus > 4 ? 4 : "${task.cpus}" - - // NOTE: the below is required else the buffer takes all the mem rather than the actual process - def buff_mem = { task.memory > 50 ? 0 : task.memory / 3 } """ - samtools view -@${st_cores} -u -F0x400 ${bam} | bamToBed | sort -k4 --parallel=${task.cpus} -S ${buff_mem}G > ${prefix}_merged_sorted.bed + samtools view -@${st_cores} -u -F0x400 ${bam} | bamToBed | sort -k4 --parallel=${task.cpus} -S 50G > ${prefix}_merged_sorted.bed cat <<-END_VERSIONS > versions.yml "${task.process}": From 10180b07a0aca1547651ebe5baa5eeab0db885d4 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Fri, 7 Jul 2023 10:02:07 +0100 Subject: [PATCH 23/85] Adding a note to add samtools sort --- subworkflows/local/longread_coverage.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index d7f21448..5e246198 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -144,6 +144,9 @@ workflow LONGREAD_COVERAGE { ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) ch_merged_bam = SAMTOOLS_MERGE.out.bam + // samtools sort -@ 8 merged.bam > sort.bam + // SAMTOOLS_SORT ( view_input ) + // // LOGIC: PREPARING MERGE INPUT WITH REFERENCE GENOME AND REFERENCE INDEX // From 2371af56d9d4dc78074e08235c8c9f6e12219d70 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Fri, 7 Jul 2023 10:03:07 +0100 Subject: [PATCH 24/85] Adding resource trace file --- nextflow.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index ae6f1e48..3479067e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -188,7 +188,7 @@ report { trace { enabled = true file = "${params.tracedir}/resource_trace_${trace_timestamp}.txt" - fields = 'process,name,status,module,cpus,memory,attempt,realtime,%cpus,%memory,peak_rss' + fields = 'name,status,module,cpus,memory,attempt,realtime,%cpu,%mem,peak_rss' } dag { enabled = true From 4b90cb276e0c28b45db40f6347df3678c5cf3de5 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Fri, 7 Jul 2023 10:30:01 +0100 Subject: [PATCH 25/85] Linting fixes --- nextflow.config | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/nextflow.config b/nextflow.config index 3479067e..69458360 100644 --- a/nextflow.config +++ b/nextflow.config @@ -11,9 +11,6 @@ params { // Boilerplate options input = null - genome = null - igenomes_base = null - igenomes_ignore = null outdir = "./results" tracedir = "${params.outdir}/treeval_info" publish_dir_mode = 'copy' @@ -26,7 +23,7 @@ params { version = false validate_params = true show_hidden_params = false - schema_ignore_params = 'genomes,genome,igenomes_base,igenomes_ignore' + schema_ignore_params = '' // Config options From bbd6734ef5cbe9a5160f021e632ca0e41f0c89a5 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Fri, 7 Jul 2023 10:30:26 +0100 Subject: [PATCH 26/85] Linting fixes --- modules.json | 134 +++++++++++++-------------------------------------- 1 file changed, 34 insertions(+), 100 deletions(-) diff --git a/modules.json b/modules.json index 0aad853f..c58880f0 100644 --- a/modules.json +++ b/modules.json @@ -8,233 +8,167 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -243,4 +177,4 @@ } } } -} \ No newline at end of file +} From 14c1c5f702070b3c6c50ccd78336e02db0363a85 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 10 Jul 2023 16:03:50 +0100 Subject: [PATCH 27/85] Adding Snapshot and adding config --- conf/modules.config | 4 ++++ subworkflows/local/hic_mapping.nf | 15 +++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e5aff5b0..22b10e73 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -222,6 +222,10 @@ process { ext.prefix = { "${meta.id}_hr" } } + withName: 'SNAPSHOT_SRES|SNAPSHOT_HRES' { + ext.args = "--sequences '=full'" + } + withName: JUICER_TOOLS_PRE { ext.juicer_tools_jar = 'juicer_tools.1.8.9_jcuda.0.8.jar' ext.juicer_jvm_params = '-Xms36g -Xmx36g' diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index 0cf42c2b..0c41009d 100644 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -13,7 +13,8 @@ include { COOLER_CLOAD } from '../../modules/nf-cor include { COOLER_ZOOMIFY } from '../../modules/nf-core/cooler/zoomify/main' include { PRETEXTMAP as PRETEXTMAP_STANDRD } from '../../modules/nf-core/pretextmap/main' include { PRETEXTMAP as PRETEXTMAP_HIGHRES } from '../../modules/nf-core/pretextmap/main' -include { PRETEXTSNAPSHOT } from '../../modules/nf-core/pretextsnapshot/main' +include { PRETEXTSNAPSHOT as SNAPSHOT_SRES } from '../../modules/nf-core/pretextsnapshot/main' +include { PRETEXTSNAPSHOT as SNAPSHOT_HRES } from '../../modules/nf-core/pretextsnapshot/main' include { SAMTOOLS_MARKDUP } from '../../modules/nf-core/samtools/markdup/main' include { SAMTOOLS_MERGE } from '../../modules/nf-core/samtools/merge/main' include { BAMTOBED_SORT } from '../../modules/local/bamtobed_sort.nf' @@ -132,10 +133,14 @@ workflow HIC_MAPPING { ch_versions = ch_versions.mix(PRETEXTMAP_HIGHRES.out.versions) // - // MODULE: GENERATE A PNG FROM THE PRETEXT + // MODULE: GENERATE PNG FROM STANDARD PRETEXT // - PRETEXTSNAPSHOT ( PRETEXTMAP_STANDRD.out.pretext ) - ch_versions = ch_versions.mix(PRETEXTSNAPSHOT.out.versions) + SNAPSHOT_HRES ( PRETEXTMAP_STANDRD.out.pretext ) + + // + // MODULE: GENERATE PNG FROM STANDARD PRETEXT + // + SNAPSHOT_HRES ( PRETEXTMAP_HIGHRES.out.pretext ) // // MODULE: MERGE POSITION SORTED BAM FILES AND MARK DUPLICATES @@ -214,7 +219,9 @@ workflow HIC_MAPPING { emit: standrd_pretext = PRETEXTMAP_STANDRD.out.pretext + standrd_snpshot = SNAPSHOT_SRES.out.image highres_pretext = PRETEXTMAP_HIGHRES.out.pretext + highres_snpshot = SNAPSHOT_HRES.out.image mcool = COOLER_ZOOMIFY.out.mcool hic = JUICER_TOOLS_PRE.out.hic versions = ch_versions.ifEmpty(null) From cd33274a82029dc8b772f9ccaa717b77a1341577 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 12 Jul 2023 15:12:22 +0100 Subject: [PATCH 28/85] Updates for file output --- conf/base.config | 5 +++++ conf/modules.config | 12 +++++++++--- subworkflows/local/hic_mapping.nf | 7 ++++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/conf/base.config b/conf/base.config index d6fffac4..094ecf47 100644 --- a/conf/base.config +++ b/conf/base.config @@ -73,6 +73,11 @@ process { memory = { check_max( 16.GB * task.attempt, 'memory' ) } } + withName: SNAPSHOT_HRES { + cpus = { check_max( 1 * task.attempt, 'cpus' ) } + memory = { check_max( 50.GB * task.attempt, 'memory' ) } + } + withName: JUICER_TOOLS_PRE { cpus = { check_max( 20 * task.attempt, 'cpus' ) } memory = { check_max( 100.GB * task.attempt, 'memory' ) } diff --git a/conf/modules.config b/conf/modules.config index 22b10e73..1e1eef76 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -42,7 +42,7 @@ process { // Files to be used for pretext, likely to be deleted once the hic workflow is complete. // .bed, .hr.pretext, .lr.pretext, needs centromere} - withName: 'GAP_LENGTH|PRETEXTMAP_HIGHRES|PRETEXTMAP_STANDRD|COOLER_ZOOMIFY|.*:.*:REPEAT_DENSITY:UCSC_BEDGRAPHTOBIGWIG|EXTRACT_TELO|JUICER_TOOLS_PRE|PRETEXTSNAPSHOT' { + withName: 'GAP_LENGTH|PRETEXTMAP_HIGHRES|PRETEXTMAP_STANDRD|COOLER_ZOOMIFY|.*:.*:REPEAT_DENSITY:UCSC_BEDGRAPHTOBIGWIG|EXTRACT_TELO|JUICER_TOOLS_PRE|SNAPSHOT_SRES|SNAPSHOT_HRES|GET_PAIRED_CONTACT_BED' { publishDir = [ path: { "${params.outdir}/hic_files" }, mode: params.publish_dir_mode, @@ -222,8 +222,14 @@ process { ext.prefix = { "${meta.id}_hr" } } - withName: 'SNAPSHOT_SRES|SNAPSHOT_HRES' { - ext.args = "--sequences '=full'" + withName: 'SNAPSHOT_SRES' { + ext.args = "--sequences '=full' --resolution 1440" + ext.prefix = { "${meta.id}_normal" } + } + + withName: 'SNAPSHOT_HRES' { + ext.args = "--sequences '=full' --resolution 1440" + ext.prefix = { "${meta.id}_hr" } } withName: JUICER_TOOLS_PRE { diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index 0c41009d..6f3b8dd0 100644 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -135,12 +135,13 @@ workflow HIC_MAPPING { // // MODULE: GENERATE PNG FROM STANDARD PRETEXT // - SNAPSHOT_HRES ( PRETEXTMAP_STANDRD.out.pretext ) + SNAPSHOT_SRES ( PRETEXTMAP_STANDRD.out.pretext ) + // NOTE: CURRENTLY UNDER INVESTIGATION // - // MODULE: GENERATE PNG FROM STANDARD PRETEXT + // MODULE: GENERATE PNG FROM HIGHRES PRETEXT // - SNAPSHOT_HRES ( PRETEXTMAP_HIGHRES.out.pretext ) + // SNAPSHOT_HRES ( PRETEXTMAP_HIGHRES.out.pretext ) // // MODULE: MERGE POSITION SORTED BAM FILES AND MARK DUPLICATES From c8c0cf80ba24386f8445fa61f912409cbbb36bcd Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 10:05:17 +0100 Subject: [PATCH 29/85] Updates to README to include the curationpretext pipeline and linting fix --- README.md | 4 ++-- workflows/treeval.nf | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 2a8582b2..3f257457 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ## Introduction -**sanger-tol/treeval** is a bioinformatics best-practice analysis pipeline for the generation of data supplemental to the curation of reference quality genomes. This pipeline has been written to generate flat files compatable with [JBrowse2](https://jbrowse.org/jb2/). +**sanger-tol/treeval** is a bioinformatics best-practice analysis pipeline for the generation of data supplemental to the curation of reference quality genomes. This pipeline has been written to generate flat files compatible with [JBrowse2](https://jbrowse.org/jb2/). The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! @@ -18,7 +18,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool > 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. -Currently, it is advised to run the pipleline with docker or singularity as a couple of major modules do not currently have a conda env associated with them. +Currently, it is advised to run the pipeline with docker or singularity as a couple of major modules do not currently have a conda env associated with them. Now, you can run the pipeline using: diff --git a/workflows/treeval.nf b/workflows/treeval.nf index 6a707e8f..199f5015 100644 --- a/workflows/treeval.nf +++ b/workflows/treeval.nf @@ -65,12 +65,12 @@ workflow TREEVAL { Channel .fromPath( "${projectDir}/assets/gene_alignment/assm_*.as", checkIfExists: true) - .map { it -> + .map { it -> tuple ([ type : it.toString().split('/')[-1].split('_')[-1].split('.as')[0] ], file(it) )} .set { gene_alignment_asfiles } - + Channel .fromPath( "${projectDir}/assets/digest/digest.as", checkIfExists: true ) .set { digest_asfile } @@ -94,7 +94,7 @@ workflow TREEVAL { // // SUBWORKFLOW: Takes input fasta file and sample ID to generate a my.genome file - // + // GENERATE_GENOME ( YAML_INPUT.out.assembly_id, YAML_INPUT.out.reference ) @@ -125,7 +125,7 @@ workflow TREEVAL { // BOTH WOULD REQUIRE A POST SUBWORKFLOW MERGE STEP TO MERGE TOGETHER THE SCAFFOLD // BASED ALIGNMENTS/SELFCOMPS INTO A GENOME REPRESENTATIVE ONE. // FOR GENE ALIGNMENT WOULD THIS REQUIRE A .GENOME FILE AND INDEX PER SCAFFOLD? - + // // SUBWORKFLOW: Takes input fasta to generate BB files containing alignment data // @@ -168,19 +168,19 @@ workflow TREEVAL { YAML_INPUT.out.motif_len, selfcomp_asfile ) ch_versions = ch_versions.mix(SELFCOMP.out.versions) - + // // SUBWORKFLOW: Takes reference, the directory of syntenic genomes and order/clade of sequence // and generated a file of syntenic blocks. // - SYNTENY ( GENERATE_GENOME.out.reference_tuple, - YAML_INPUT.out.synteny_path, + SYNTENY ( GENERATE_GENOME.out.reference_tuple, + YAML_INPUT.out.synteny_path, YAML_INPUT.out.assembly_classT ) ch_versions = ch_versions.mix(SYNTENY.out.versions) // - // SUBWORKFLOW: Takes reference, pacbio reads + // SUBWORKFLOW: Takes reference, pacbio reads // LONGREAD_COVERAGE ( GENERATE_GENOME.out.reference_tuple, GENERATE_GENOME.out.dot_genome, @@ -213,7 +213,7 @@ workflow TREEVAL { BUSCO_ANNOTATION ( GENERATE_GENOME.out.dot_genome, GENERATE_GENOME.out.reference_tuple, YAML_INPUT.out.assembly_classT, - YAML_INPUT.out.lineageinfo, + YAML_INPUT.out.lineageinfo, YAML_INPUT.out.lineagespath, buscogene_asfile, ancestral_table From b67358ad365e6a3a202b011fd5eda9fa04a4b604 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 10:13:22 +0100 Subject: [PATCH 30/85] Linting fix --- .nf-core.yml | 3 +-- nextflow.config | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index 5f4a4733..d83235e7 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,6 +5,7 @@ lint: - docs/images/nf-core-treeval_logo_light.png - docs/images/nf-core-treeval_logo_dark.png files_unchanged: + - .github/CONTRIBUTING.md - LICENSE - .github/ISSUE_TEMPLATE/bug_report.yml - assets/sendmail_template.txt @@ -13,5 +14,3 @@ lint: nextflow_config: - manifest.name - manifest.homePage - multiqc_config: - - report_comment diff --git a/nextflow.config b/nextflow.config index 69458360..41e12cbc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,8 +23,6 @@ params { version = false validate_params = true show_hidden_params = false - schema_ignore_params = '' - // Config options custom_config_version = 'master' From d0648da8b0427b86deb5875c630dbf156f8eccef Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 10:13:34 +0100 Subject: [PATCH 31/85] Linting fix --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3f257457..a460da24 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! +The treeval pipeline has a sister pipeline currently named [curationpretext](https://github.com/sanger-tol/curationpretext) which acts to regenerate the pretext maps and accessory files during genomic curation in order to confirm interventions. This pipeline is sufficiently different to the treeval implementation that it is written as it's own pipeline. ## Usage > **Note** From e239df48692864c75f2e39def094affbee29cd51 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 10:18:07 +0100 Subject: [PATCH 32/85] Linting fix --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a460da24..ffa569f0 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! The treeval pipeline has a sister pipeline currently named [curationpretext](https://github.com/sanger-tol/curationpretext) which acts to regenerate the pretext maps and accessory files during genomic curation in order to confirm interventions. This pipeline is sufficiently different to the treeval implementation that it is written as it's own pipeline. + ## Usage > **Note** From 5f97b80f9a9c7584d813e4da5ff949b1ed8997bf Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 10:34:32 +0100 Subject: [PATCH 33/85] Correcting non-alphanumeric process labels --- modules/local/assign_ancestral.nf | 2 +- modules/local/chunkfasta.nf | 2 +- modules/local/extract_ancestral.nf | 2 +- modules/local/extract_buscogene.nf | 2 +- modules/local/extract_telo.nf | 2 +- modules/local/find_telomere_regions.nf | 2 +- modules/local/find_telomere_windows.nf | 2 +- modules/local/generate_cram_csv.nf | 2 +- modules/local/generate_genome_file.nf | 2 +- modules/local/gff_to_bed.nf | 2 +- modules/local/paf_to_bed.nf | 2 +- modules/local/reformat_intersect.nf | 2 +- modules/local/rename_ids.nf | 2 +- modules/local/replace_dots.nf | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/modules/local/assign_ancestral.nf b/modules/local/assign_ancestral.nf index a7e7d3b5..43758c92 100644 --- a/modules/local/assign_ancestral.nf +++ b/modules/local/assign_ancestral.nf @@ -1,6 +1,6 @@ process ASSIGN_ANCESTRAL { tag "$meta.id" - label "process_low" + label 'process_low' conda "conda-forge::python=3.9" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/chunkfasta.nf b/modules/local/chunkfasta.nf index 2e9d785f..266f19be 100755 --- a/modules/local/chunkfasta.nf +++ b/modules/local/chunkfasta.nf @@ -1,6 +1,6 @@ process CHUNKFASTA { tag "${meta.id}" - label "process_low" + label 'process_low' conda "conda-forge::pyfasta=0.5.2-1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/extract_ancestral.nf b/modules/local/extract_ancestral.nf index 4f29462a..8c5c509c 100644 --- a/modules/local/extract_ancestral.nf +++ b/modules/local/extract_ancestral.nf @@ -1,6 +1,6 @@ process EXTRACT_ANCESTRAL { tag "$meta.id" - label "process_low" + label 'process_low' conda "conda-forge::python=3.9" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/extract_buscogene.nf b/modules/local/extract_buscogene.nf index 7ddc0d9b..42d6fb18 100644 --- a/modules/local/extract_buscogene.nf +++ b/modules/local/extract_buscogene.nf @@ -1,6 +1,6 @@ process EXTRACT_BUSCOGENE { tag "$meta.id" - label "process_low" + label 'process_low' conda "conda-forge::coreutils=9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/extract_telo.nf b/modules/local/extract_telo.nf index 8cd784d2..f78e0a36 100644 --- a/modules/local/extract_telo.nf +++ b/modules/local/extract_telo.nf @@ -1,6 +1,6 @@ process EXTRACT_TELO { tag "${meta.id}" - label "process_low" + label 'process_low' conda "conda-forge::coreutils=9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/find_telomere_regions.nf b/modules/local/find_telomere_regions.nf index f0d7c669..6f0d56c7 100644 --- a/modules/local/find_telomere_regions.nf +++ b/modules/local/find_telomere_regions.nf @@ -1,6 +1,6 @@ process FIND_TELOMERE_REGIONS { tag "${meta.id}" - label "process_low" + label 'process_low' container 'docker.io/library/gcc:7.1.0' diff --git a/modules/local/find_telomere_windows.nf b/modules/local/find_telomere_windows.nf index da99258c..ac9584e2 100644 --- a/modules/local/find_telomere_windows.nf +++ b/modules/local/find_telomere_windows.nf @@ -1,6 +1,6 @@ process FIND_TELOMERE_WINDOWS { tag "${meta.id}" - label "process_low" + label 'process_low' conda "bioconda::java-jdk=8.0.112" container "${ workflow.containerEngine == 'singularity' && diff --git a/modules/local/generate_cram_csv.nf b/modules/local/generate_cram_csv.nf index 72f90a33..6b6fe62c 100755 --- a/modules/local/generate_cram_csv.nf +++ b/modules/local/generate_cram_csv.nf @@ -1,6 +1,6 @@ process GENERATE_CRAM_CSV { tag "${meta.id}" - label "process_low" + label 'process_low' conda "bioconda::samtools=1.17" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/generate_genome_file.nf b/modules/local/generate_genome_file.nf index 7de972bd..dc5629ae 100644 --- a/modules/local/generate_genome_file.nf +++ b/modules/local/generate_genome_file.nf @@ -1,6 +1,6 @@ process GENERATE_GENOME_FILE { tag "${meta.id}" - label "process_low" + label 'process_low' conda "conda-forge::coreutils=9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/gff_to_bed.nf b/modules/local/gff_to_bed.nf index 687a4429..6a2ad9c9 100644 --- a/modules/local/gff_to_bed.nf +++ b/modules/local/gff_to_bed.nf @@ -1,6 +1,6 @@ process GFF_TO_BED { tag "${meta.id}" - label "process_low" + label 'process_low' conda "conda-forge::coreutils=9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/paf_to_bed.nf b/modules/local/paf_to_bed.nf index 3e2e9db3..a980c2fd 100644 --- a/modules/local/paf_to_bed.nf +++ b/modules/local/paf_to_bed.nf @@ -1,6 +1,6 @@ process PAF2BED { tag "${meta.id}" - label "process_low" + label 'process_low' conda "conda-forge::coreutils=9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/reformat_intersect.nf b/modules/local/reformat_intersect.nf index fdd96954..0842faef 100644 --- a/modules/local/reformat_intersect.nf +++ b/modules/local/reformat_intersect.nf @@ -1,6 +1,6 @@ process REFORMAT_INTERSECT { tag "${meta.id}" - label "process_low" + label 'process_low' conda "conda-forge::coreutils=9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/rename_ids.nf b/modules/local/rename_ids.nf index 9e64f324..545d0c4a 100644 --- a/modules/local/rename_ids.nf +++ b/modules/local/rename_ids.nf @@ -1,6 +1,6 @@ process RENAME_IDS { tag "${meta.id}" - label "process_low" + label 'process_low' conda "conda-forge::coreutils=9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? diff --git a/modules/local/replace_dots.nf b/modules/local/replace_dots.nf index fb0d48e8..0f266ca2 100644 --- a/modules/local/replace_dots.nf +++ b/modules/local/replace_dots.nf @@ -1,6 +1,6 @@ process REPLACE_DOTS { tag "${meta.id}" - label "process_low" + label 'process_low' conda "conda-forge::coreutils=9.1" container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? From 7ecbc86f3b8a051b3612744af731e90b1ce5e239 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 10:57:02 +0100 Subject: [PATCH 34/85] Correcting nf-core version --- .github/workflows/linting.yml | 2 +- modules.json | 134 +++++++++++++++++++++++++--------- 2 files changed, 101 insertions(+), 35 deletions(-) diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 888cb4bc..3f27dab4 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -84,7 +84,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install nf-core + pip install nf-core==2.8.0 - name: Run nf-core lint env: diff --git a/modules.json b/modules.json index c58880f0..0aad853f 100644 --- a/modules.json +++ b/modules.json @@ -8,167 +8,233 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -177,4 +243,4 @@ } } } -} +} \ No newline at end of file From 5948327c438f44aed0ffffa691c77d39f73293b5 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 11:03:27 +0100 Subject: [PATCH 35/85] More linting fixes --- .nf-core.yml | 3 ++ modules.json | 134 ++++++++++++------------------------------------ nextflow.config | 1 + 3 files changed, 38 insertions(+), 100 deletions(-) diff --git a/.nf-core.yml b/.nf-core.yml index d83235e7..7442cda9 100644 --- a/.nf-core.yml +++ b/.nf-core.yml @@ -5,6 +5,7 @@ lint: - docs/images/nf-core-treeval_logo_light.png - docs/images/nf-core-treeval_logo_dark.png files_unchanged: + - .github/workflows/linting.yml - .github/CONTRIBUTING.md - LICENSE - .github/ISSUE_TEMPLATE/bug_report.yml @@ -14,3 +15,5 @@ lint: nextflow_config: - manifest.name - manifest.homePage + multiqc_config: + - report_comment diff --git a/modules.json b/modules.json index 0aad853f..c58880f0 100644 --- a/modules.json +++ b/modules.json @@ -8,233 +8,167 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -243,4 +177,4 @@ } } } -} \ No newline at end of file +} diff --git a/nextflow.config b/nextflow.config index 41e12cbc..fcbcb820 100644 --- a/nextflow.config +++ b/nextflow.config @@ -23,6 +23,7 @@ params { version = false validate_params = true show_hidden_params = false + schema_ignore_params = 'genomes' // Config options custom_config_version = 'master' From ede9fe4d726b8fcd90d35440439202a9c4bb2f30 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 11:35:23 +0100 Subject: [PATCH 36/85] re-patching tabix-bgziptabix module to allow for choosing tbi or csi output --- conf/base.config | 3 + modules.json | 135 +++++++++++++----- modules/nf-core/tabix/bgziptabix/main.nf | 6 +- .../tabix/bgziptabix/tabix-bgziptabix.diff | 18 +++ 4 files changed, 125 insertions(+), 37 deletions(-) create mode 100644 modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff diff --git a/conf/base.config b/conf/base.config index 094ecf47..c8ed916d 100644 --- a/conf/base.config +++ b/conf/base.config @@ -98,6 +98,9 @@ process { memory = { check_max( 100.GB * task.attempt, 'memory' ) } } + // To act as process.tiny + withName: + // Process-specific resource requirements // NOTE - Please try and re-use the labels below as much as possible. // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. diff --git a/modules.json b/modules.json index c58880f0..2ae9f54a 100644 --- a/modules.json +++ b/modules.json @@ -8,167 +8,234 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ], + "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -177,4 +244,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/tabix/bgziptabix/main.nf b/modules/nf-core/tabix/bgziptabix/main.nf index d6c5a760..b73ee0c9 100644 --- a/modules/nf-core/tabix/bgziptabix/main.nf +++ b/modules/nf-core/tabix/bgziptabix/main.nf @@ -19,9 +19,9 @@ process TABIX_BGZIPTABIX { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def args2 = task.ext.args2 ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def args2 = meta.max_scaff == 'csi' ? "--csi" : '' + def prefix = task.ext.prefix ?: "${meta.id}" """ bgzip --threads ${task.cpus} -c $args $input > ${prefix}.${input.getExtension()}.gz tabix $args2 ${prefix}.${input.getExtension()}.gz diff --git a/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff b/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff new file mode 100644 index 00000000..55016165 --- /dev/null +++ b/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff @@ -0,0 +1,18 @@ +Changes in module 'nf-core/tabix/bgziptabix' +--- modules/nf-core/tabix/bgziptabix/main.nf ++++ modules/nf-core/tabix/bgziptabix/main.nf +@@ -19,9 +19,9 @@ + task.ext.when == null || task.ext.when + + script: +- def args = task.ext.args ?: '' +- def args2 = task.ext.args2 ?: '' +- def prefix = task.ext.prefix ?: "${meta.id}" ++ def args = task.ext.args ?: '' ++ def args2 = meta.max_scaff == 'csi' ? "--csi" : '' ++ def prefix = task.ext.prefix ?: "${meta.id}" + """ + bgzip --threads ${task.cpus} -c $args $input > ${prefix}.${input.getExtension()}.gz + tabix $args2 ${prefix}.${input.getExtension()}.gz + +************************************************************ From 69306244b9223b3b61ba89698d92039369dd7606 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 11:36:59 +0100 Subject: [PATCH 37/85] re-patching tabix-bgziptabix module to allow for choosing tbi or csi output --- modules.json | 134 +++++++++++++-------------------------------------- 1 file changed, 34 insertions(+), 100 deletions(-) diff --git a/modules.json b/modules.json index 2ae9f54a..f68c3305 100644 --- a/modules.json +++ b/modules.json @@ -8,234 +8,168 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -244,4 +178,4 @@ } } } -} \ No newline at end of file +} From e4c71585fc0392fb37ffeabea173ab9c9c84b82e Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 12:11:48 +0100 Subject: [PATCH 38/85] changed some module calling and outputting --- conf/modules.config | 12 ++++++++++++ modules/local/gap_length.nf | 6 +++--- modules/local/get_paired_contact_bed.nf | 2 +- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 1e1eef76..391c7148 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -134,6 +134,9 @@ process { ext.args = "-n -b -c -L -l 400" } + // + // LONGREAD BLOCK + // withName: '.*:.*:LONGREAD_COVERAGE:MINIMAP2_ALIGN' { ext.args = "--MD -t 8" ext.prefix = { "${meta.id}_alignment_${reference.getName().tokenize('.')[0]}" } @@ -177,6 +180,9 @@ process { ext.prefix = 'coverage' } + // + // TELOMERE BLOCK + // withName: 'FIND_TELOMERE_REGIONS' { ext.find_telomere = 'find_telomere' } @@ -190,6 +196,9 @@ process { ext.prefix = { "telo_${meta.id}" } } + // + // BUSCO BLOCK + // withName: '.*:.*:BUSCO_ANNOTATION:UCSC_BEDTOBIGBED' { ext.args = { "-type=bed3+4 -extraIndex=name,OrthoDBurl" } ext.prefix = { "${meta.id}_buscogene" } @@ -212,6 +221,9 @@ process { ext.args = "--mode genome" } + // + // HIC MAPPING BLOCK + // withName: PRETEXTMAP_STANDRD { ext.args = "--sortby length --mapq 0" ext.prefix = { "${meta.id}_normal" } diff --git a/modules/local/gap_length.nf b/modules/local/gap_length.nf index c8f6ce7d..cf80bc43 100644 --- a/modules/local/gap_length.nf +++ b/modules/local/gap_length.nf @@ -11,7 +11,7 @@ process GAP_LENGTH { tuple val( meta ), path( file ) output: - tuple val( meta ), file( "*bedgraph" ) , emit: bed + tuple val( meta ), file( "*bed" ) , emit: bed path "versions.yml" , emit: versions shell: @@ -19,7 +19,7 @@ process GAP_LENGTH { def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. $/ cat "${file}" \ - | awk '{print $0"\t"sqrt(($3-$2)*($3-$2))}' > ${prefix}_gap.bedgraph + | awk '{print $0"\t"sqrt(($3-$2)*($3-$2))}' > ${prefix}_gap.bed cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -31,7 +31,7 @@ process GAP_LENGTH { def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = "9.1" """ - touch ${prefix}_gap.bedgraph + touch ${prefix}_gap.bed cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/get_paired_contact_bed.nf b/modules/local/get_paired_contact_bed.nf index 8882e857..308ea84a 100755 --- a/modules/local/get_paired_contact_bed.nf +++ b/modules/local/get_paired_contact_bed.nf @@ -17,7 +17,7 @@ process GET_PAIRED_CONTACT_BED { script: def pulled = '-T sort_tmp' """ - bed_to_contacts.sh $file > ${meta.id}_paired.bed + bed_to_contacts.sh $file > pre.bed cat <<-END_VERSIONS > versions.yml "${task.process}": From 542ea4e69b3af9ddf7f9a3544e7484683af658d4 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 13 Jul 2023 15:45:31 +0100 Subject: [PATCH 39/85] Updating emits --- subworkflows/local/hic_mapping.nf | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index 6f3b8dd0..f05c2880 100644 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -66,9 +66,9 @@ workflow HIC_MAPPING { .combine (reference_tuple) .combine (BWAMEM2_INDEX.out.index) .map{ cram_id, cram_info, ref_id, ref_dir, bwa_id, bwa_path -> - tuple([ + tuple([ id: cram_id.id - ], + ], file(cram_info[0]), cram_info[1], cram_info[2], @@ -76,7 +76,7 @@ workflow HIC_MAPPING { cram_info[4], cram_info[5], cram_info[6], - bwa_path.toString() + '/' + ref_dir.toString().split('/')[-1]) + bwa_path.toString() + '/' + ref_dir.toString().split('/')[-1]) } // @@ -101,7 +101,7 @@ workflow HIC_MAPPING { file ) } - .set { collected_files_for_merge } + .set { collected_files_for_merge } // // MODULE: MERGE POSITION SORTED BAM FILES AND MARK DUPLICATES @@ -163,7 +163,7 @@ workflow HIC_MAPPING { // // LOGIC: PREPARE JUICER TOOLS INPUT - // + // GET_PAIRED_CONTACT_BED.out.bed .combine( dot_genome ) .map { meta, paired_contacts, meta_my_genome, my_genome -> @@ -175,14 +175,14 @@ workflow HIC_MAPPING { // JUICER_TOOLS_PRE( ch_juicer_input.map { [it[0], it[1]] }, - ch_juicer_input.map { it[2] }, + ch_juicer_input.map { it[2] }, ch_juicer_input.map { it[3] } ) ch_versions = ch_versions.mix(JUICER_TOOLS_PRE.out.versions) // // LOGIC: BIN CONTACT PAIRS - // + // GET_PAIRED_CONTACT_BED.out.bed .join(BAMTOBED_SORT.out.sorted_bed) .combine(ch_cool_bin) @@ -190,7 +190,7 @@ workflow HIC_MAPPING { // // LOGIC: PREPARE COOLER INPUT - // + // ch_binned_pairs .combine(dot_genome) .map{ meta, pairs, bed, cool_bin, meta_my_genome, my_genome -> [meta, pairs, bed, cool_bin, my_genome]} @@ -198,23 +198,23 @@ workflow HIC_MAPPING { // // MODULE: GENERATE A MULTI-RESOLUTION COOLER FILE BY COARSENING - // + // COOLER_CLOAD( ch_cooler_input.map { [it[0], it[1], it[2], it[3]] }, ch_cooler_input.map { it[4] } ) ch_versions = ch_versions.mix(COOLER_CLOAD.out.versions) - + // // LOGIC: REFACTOR CHANNEL FOR ZOOMIFY - // + // COOLER_CLOAD.out.cool .map{ meta, cools, cool_bin -> [meta, cools]} .set{ch_cool} // // MODULE: ZOOM COOL TO MCOOL - // + // COOLER_ZOOMIFY(ch_cool) ch_versions = ch_versions.mix(COOLER_ZOOMIFY.out.versions) @@ -222,7 +222,7 @@ workflow HIC_MAPPING { standrd_pretext = PRETEXTMAP_STANDRD.out.pretext standrd_snpshot = SNAPSHOT_SRES.out.image highres_pretext = PRETEXTMAP_HIGHRES.out.pretext - highres_snpshot = SNAPSHOT_HRES.out.image + //highres_snpshot = SNAPSHOT_HRES.out.image mcool = COOLER_ZOOMIFY.out.mcool hic = JUICER_TOOLS_PRE.out.hic versions = ch_versions.ifEmpty(null) From dd57f126a7827c6a573397663d42948bd0bce7b2 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 19 Jul 2023 15:14:08 +0100 Subject: [PATCH 40/85] Updated to naming --- assets/local_testing/nxOscDF5033.yaml | 3 +-- assets/local_testing/nxOscSUBSET.yaml | 3 +-- conf/base.config | 7 ++++--- subworkflows/local/yaml_input.nf | 20 +++++++++++++------- workflows/treeval.nf | 2 ++ workflows/treeval_rapid.nf | 12 +++++++----- 6 files changed, 28 insertions(+), 19 deletions(-) diff --git a/assets/local_testing/nxOscDF5033.yaml b/assets/local_testing/nxOscDF5033.yaml index 388fdf34..69d61dc7 100644 --- a/assets/local_testing/nxOscDF5033.yaml +++ b/assets/local_testing/nxOscDF5033.yaml @@ -4,8 +4,7 @@ assembly: sample_id: Oscheius_DF5033 latin_name: to_provide_taxonomic_rank classT: nematode - asmVersion: Oscheius_DF5033_1 - dbVersion: "1" + asmVersion: 1 gevalType: DTOL reference_file: /lustre/scratch123/tol/resources/treeval/nextflow_test_data/Oscheius_DF5033/assembly/draft/DF5033.hifiasm.noTelos.20211120/DF5033.noTelos.hifiasm.purged.noCont.noMito.fasta #/lustre/scratch123/tol/resources/treeval/nextflow_test_data/Oscheius_DF5033/assembly/draft/DF5033.hifiasm.noTelos.20211120/DF5033.noTelos.hifiasm.purged.noCont.noMito.fasta diff --git a/assets/local_testing/nxOscSUBSET.yaml b/assets/local_testing/nxOscSUBSET.yaml index d313a189..64082b6e 100644 --- a/assets/local_testing/nxOscSUBSET.yaml +++ b/assets/local_testing/nxOscSUBSET.yaml @@ -4,8 +4,7 @@ assembly: sample_id: OscheiusSUBSET latin_name: to_provide_taxonomic_rank classT: nematode - asmVersion: OscheiusSUBSET_1 - dbVersion: "1" + asmVersion: 1 gevalType: DTOL reference_file: /lustre/scratch123/tol/resources/treeval/nextflow_test_data/Oscheius_SUBSET/assembly/draft/SUBSET_genome/Oscheius_SUBSET.fasta #/lustre/scratch123/tol/resources/treeval/nextflow_test_data/Oscheius_DF5033/assembly/draft/DF5033.hifiasm.noTelos.20211120/DF5033.noTelos.hifiasm.purged.noCont.noMito.fasta diff --git a/conf/base.config b/conf/base.config index c8ed916d..abc147cb 100644 --- a/conf/base.config +++ b/conf/base.config @@ -38,13 +38,14 @@ process { // RESOURCES: CHANGES TO FREQUENT FAILURES BELOW THIS MEM POINT withName: '(MINIPROT_ALIGN|MINIMAP2_ALIGN)' { - memory = { check_max( 100.GB * Math.ceil( task.attempt * 1.5 ) , 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } + memory = { check_max( 120.GB * Math.ceil( task.attempt * 1.5 ) , 'memory' ) } + time = { check_max( 20.h * task.attempt, 'time' ) } } withName: '.*:.*:LONGREAD_COVERAGE:(MINIMAP2_ALIGN|MINIMAP2_ALIGN_SPLIT)' { - cpus = { check_max( 16 * 1, 'cpus' ) } + cpus = { check_max( 16 * 1, 'cpus' ) } memory = { check_max( 100.GB * task.attempt, 'memory' ) } + time = { check_max( 12.h * task.attempt, 'time' ) } } // 25GB * (task attempt * 2) = 50GB, 100GB, 150GB diff --git a/subworkflows/local/yaml_input.nf b/subworkflows/local/yaml_input.nf index 84f66c95..016faefd 100644 --- a/subworkflows/local/yaml_input.nf +++ b/subworkflows/local/yaml_input.nf @@ -13,12 +13,12 @@ workflow YAML_INPUT { .map { file -> readYAML(file) } .set { yamlfile } - // + // // LOGIC: PARSES THE TOP LEVEL OF YAML VALUES - // + // yamlfile .flatten() - .multiMap { data -> + .multiMap { data -> assembly: ( data.assembly ) assembly_reads: ( data.assem_reads ) reference: ( file(data.reference_file) ) @@ -49,7 +49,7 @@ workflow YAML_INPUT { group .assembly_reads - .multiMap { data -> + .multiMap { data -> pacbio: data.pacbio hic: data.hic supplement: data.supplementary @@ -59,7 +59,7 @@ workflow YAML_INPUT { group .alignment .multiMap { data -> - data_dir: data.data_dir + data_dir: data.data_dir common_name: data.common_name geneset: data.geneset } @@ -75,7 +75,7 @@ workflow YAML_INPUT { group .synteny - .multiMap { data -> + .multiMap { data -> synteny_genome: data.synteny_genome_path } .set{ synteny_data } @@ -102,8 +102,14 @@ workflow YAML_INPUT { } .set { busco_lineage } + assembly_data.sample_id + .combine( assembly_data.asmVersion ) + .map { it1, it2 -> + ("${it1}_${it2}")} + .set { tolid_version} + emit: - assembly_id = assembly_data.sample_id + assembly_id = tolid_version assembly_sizeClass = assembly_data.size_c assembly_classT = assembly_data.classT assembly_level = assembly_data.level diff --git a/workflows/treeval.nf b/workflows/treeval.nf index 199f5015..482a16e3 100644 --- a/workflows/treeval.nf +++ b/workflows/treeval.nf @@ -246,6 +246,8 @@ workflow.onComplete { if (params.hook_url) { NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) } + // TreeValProject.summary(workflow, reference_tuple, summary_params, projectDir) + } /* diff --git a/workflows/treeval_rapid.nf b/workflows/treeval_rapid.nf index dfea9bea..36c27fc1 100644 --- a/workflows/treeval_rapid.nf +++ b/workflows/treeval_rapid.nf @@ -48,7 +48,7 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoft */ workflow TREEVAL_RAPID { - + main: ch_versions = Channel.empty() @@ -60,7 +60,7 @@ workflow TREEVAL_RAPID { // // SUBWORKFLOW: Takes input fasta file and sample ID to generate a my.genome file - // + // GENERATE_GENOME ( YAML_INPUT.out.assembly_id, YAML_INPUT.out.reference ) @@ -89,7 +89,7 @@ workflow TREEVAL_RAPID { GENERATE_GENOME.out.reference_tuple, YAML_INPUT.out.teloseq ) - ch_versions = ch_versions.mix(TELO_FINDER.out.versions) + ch_versions = ch_versions.mix(TELO_FINDER.out.versions) // // SUBWORKFLOW: GENERATE HIC MAPPING TO GENERATE PRETEXT FILES AND JUICEBOX @@ -101,7 +101,7 @@ workflow TREEVAL_RAPID { ch_versions = ch_versions.mix(HIC_MAPPING.out.versions) // - // SUBWORKFLOW: Takes reference, pacbio reads + // SUBWORKFLOW: Takes reference, pacbio reads // LONGREAD_COVERAGE ( GENERATE_GENOME.out.reference_tuple, GENERATE_GENOME.out.dot_genome, @@ -109,7 +109,7 @@ workflow TREEVAL_RAPID { YAML_INPUT.out.assembly_sizeClass ) ch_versions = ch_versions.mix(LONGREAD_COVERAGE.out.versions) - + // // SUBWORKFLOW: Collates version data from prior subworflows // @@ -133,6 +133,8 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) } NfcoreTemplate.summary(workflow, params, log) + // TreeValProject.summary(workflow, reference_tuple, summary_params, projectDir) + } /* From 6f97bf3f7bf3006d8e800d9fe5feca454c7cc384 Mon Sep 17 00:00:00 2001 From: YSims Date: Mon, 24 Jul 2023 11:55:07 +0100 Subject: [PATCH 41/85] Update gap_length.nf --- modules/local/gap_length.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/gap_length.nf b/modules/local/gap_length.nf index cf80bc43..8ad256a2 100644 --- a/modules/local/gap_length.nf +++ b/modules/local/gap_length.nf @@ -19,7 +19,7 @@ process GAP_LENGTH { def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. $/ cat "${file}" \ - | awk '{print $0"\t"sqrt(($3-$2)*($3-$2))}' > ${prefix}_gap.bed + | awk '{print $0"\t"sqrt(($3-$2)*($3-$2))}' > ${prefix}_gap.bedgraph cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -31,7 +31,7 @@ process GAP_LENGTH { def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = "9.1" """ - touch ${prefix}_gap.bed + touch ${prefix}_gap.bedgraph cat <<-END_VERSIONS > versions.yml "${task.process}": From d7653b46e29790c85c8cecc293e115ccb6077a1a Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 24 Jul 2023 16:30:24 +0100 Subject: [PATCH 42/85] Updates to map functions, replaced with multiMap and removed inline maps where sensible --- conf/base.config | 112 ++++++------ subworkflows/local/ancestral_gene.nf | 21 ++- subworkflows/local/busco_annotation.nf | 65 ++++--- subworkflows/local/gene_alignment.nf | 18 +- subworkflows/local/generate_genome.nf | 23 ++- subworkflows/local/hic_mapping.nf | 139 +++++++++------ subworkflows/local/insilico_digest.nf | 120 ++++++++----- subworkflows/local/longread_coverage.nf | 215 +++++++++++++++--------- subworkflows/local/nuc_alignments.nf | 58 ++++--- subworkflows/local/pep_alignments.nf | 57 ++++--- subworkflows/local/punchlist.nf | 12 +- subworkflows/local/repeat_density.nf | 72 +++++--- subworkflows/local/selfcomp.nf | 100 +++++++---- subworkflows/local/synteny.nf | 44 ++--- subworkflows/local/telo_finder.nf | 16 +- workflows/treeval.nf | 133 ++++++++------- workflows/treeval_rapid.nf | 60 ++++--- 17 files changed, 757 insertions(+), 508 deletions(-) diff --git a/conf/base.config b/conf/base.config index abc147cb..916ca618 100644 --- a/conf/base.config +++ b/conf/base.config @@ -17,6 +17,61 @@ process { maxRetries = 1 maxErrors = '-1' + // Process-specific resource requirements + // NOTE - Please try and re-use the labels below as much as possible. + // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. + // If possible, it would be nice to keep the same label naming convention when + // adding in your local modules too. + // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + + withLabel:process_single { + cpus = { check_max( 1 , 'cpus' ) } + memory = { check_max( 6.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + } + + withLabel:process_low { + cpus = { check_max( 2 * task.attempt, 'cpus' ) } + memory = { check_max( 12.GB * task.attempt, 'memory' ) } + time = { check_max( 4.h * task.attempt, 'time' ) } + } + + withLabel:process_medium { + cpus = { check_max( 6 * task.attempt, 'cpus' ) } + memory = { check_max( 36.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } + } + + withLabel:process_high { + cpus = { check_max( 12 * task.attempt, 'cpus' ) } + memory = { check_max( 72.GB * task.attempt, 'memory' ) } + time = { check_max( 16.h * task.attempt, 'time' ) } + } + + withLabel:process_long { + time = { check_max( 20.h * task.attempt, 'time' ) } + } + + withLabel:process_high_memory { + memory = { check_max( 200.GB * task.attempt, 'memory' ) } + } + + withLabel:error_ignore { + errorStrategy = 'ignore' + } + + withLabel:error_retry { + errorStrategy = 'retry' + maxRetries = 2 + } + + // CUSTOM CONFIGS + // TODO: add process.tiny + + withName:CUSTOM_DUMPSOFTWAREVERSIONS { + cache = false + } + withName:SAMTOOLS_MERGE { cpus = { check_max( 16 * 1, 'cpus' ) } memory = { check_max( 50.GB * task.attempt, 'memory') } @@ -45,7 +100,7 @@ process { withName: '.*:.*:LONGREAD_COVERAGE:(MINIMAP2_ALIGN|MINIMAP2_ALIGN_SPLIT)' { cpus = { check_max( 16 * 1, 'cpus' ) } memory = { check_max( 100.GB * task.attempt, 'memory' ) } - time = { check_max( 12.h * task.attempt, 'time' ) } + time = { check_max( 24.h * task.attempt, 'time' ) } } // 25GB * (task attempt * 2) = 50GB, 100GB, 150GB @@ -98,59 +153,4 @@ process { cpus = { check_max( 16 * 1, 'cpus' ) } memory = { check_max( 100.GB * task.attempt, 'memory' ) } } - - // To act as process.tiny - withName: - - // Process-specific resource requirements - // NOTE - Please try and re-use the labels below as much as possible. - // These labels are used and recognised by default in DSL2 files hosted on nf-core/modules. - // If possible, it would be nice to keep the same label naming convention when - // adding in your local modules too. - // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors - - withLabel:process_single { - cpus = { check_max( 1 , 'cpus' ) } - memory = { check_max( 6.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } - } - - withLabel:process_low { - cpus = { check_max( 2 * task.attempt, 'cpus' ) } - memory = { check_max( 12.GB * task.attempt, 'memory' ) } - time = { check_max( 4.h * task.attempt, 'time' ) } - } - - withLabel:process_medium { - cpus = { check_max( 6 * task.attempt, 'cpus' ) } - memory = { check_max( 36.GB * task.attempt, 'memory' ) } - time = { check_max( 8.h * task.attempt, 'time' ) } - } - - withLabel:process_high { - cpus = { check_max( 12 * task.attempt, 'cpus' ) } - memory = { check_max( 72.GB * task.attempt, 'memory' ) } - time = { check_max( 16.h * task.attempt, 'time' ) } - } - - withLabel:process_long { - time = { check_max( 20.h * task.attempt, 'time' ) } - } - - withLabel:process_high_memory { - memory = { check_max( 200.GB * task.attempt, 'memory' ) } - } - - withLabel:error_ignore { - errorStrategy = 'ignore' - } - - withLabel:error_retry { - errorStrategy = 'retry' - maxRetries = 2 - } - - withName:CUSTOM_DUMPSOFTWAREVERSIONS { - cache = false - } } diff --git a/subworkflows/local/ancestral_gene.nf b/subworkflows/local/ancestral_gene.nf index 625173cc..2bb6dd5d 100755 --- a/subworkflows/local/ancestral_gene.nf +++ b/subworkflows/local/ancestral_gene.nf @@ -23,7 +23,10 @@ workflow ANCESTRAL_GENE { // // MODULE: EXTRACTS ANCESTRALLY LINKED BUSCO GENES FROM FULL TABLE // - EXTRACT_ANCESTRAL(ch_grab, ancestral_table) + EXTRACT_ANCESTRAL( + ch_grab, + ancestral_table + ) ch_versions = ch_versions.mix(EXTRACT_ANCESTRAL.out.versions) // @@ -38,19 +41,29 @@ workflow ANCESTRAL_GENE { // // MODULE: ASSIGN EXTRACTED GENES TO ANCESTRAL GROUPS // - ASSIGN_ANCESTRAL(EXTRACT_ANCESTRAL.out.comp_location, assignanc_input ) + ASSIGN_ANCESTRAL( + EXTRACT_ANCESTRAL.out.comp_location, + assignanc_input + ) ch_versions = ch_versions.mix(EXTRACT_ANCESTRAL.out.versions) // // MODULES: SORT THE BED FILE // - BEDTOOLS_SORT(ASSIGN_ANCESTRAL.out.assigned_bed, []) + BEDTOOLS_SORT( + ASSIGN_ANCESTRAL.out.assigned_bed, + [] + ) ch_versions = ch_versions.mix(BEDTOOLS_SORT.out.versions) // // MODULES: CONVERT BED TO INDEXED BIGBED // - UCSC_BEDTOBIGBED(BEDTOOLS_SORT.out.sorted, dot_genome.map{it[1]}, buscogene_as) + UCSC_BEDTOBIGBED( + BEDTOOLS_SORT.out.sorted, + dot_genome.map{ it[1] }, // Pull file from tuple(meta, file) + buscogene_as + ) ch_versions = ch_versions.mix(UCSC_BEDTOBIGBED.out.versions) emit: diff --git a/subworkflows/local/busco_annotation.nf b/subworkflows/local/busco_annotation.nf index 88306060..e527f741 100644 --- a/subworkflows/local/busco_annotation.nf +++ b/subworkflows/local/busco_annotation.nf @@ -32,39 +32,50 @@ workflow BUSCO_ANNOTATION { main: ch_versions = Channel.empty() - // + // // MODULE: RUN BUSCO TO OBTAIN FULL_TABLE.CSV // EMITS FULL_TABLE.CSV // - BUSCO ( reference_tuple, - lineageinfo, - lineagespath, - [] ) - ch_versions = ch_versions.mix(BUSCO.out.versions.first()) + BUSCO ( + reference_tuple, + lineageinfo, + lineagespath, + [] + ) + ch_versions = ch_versions.mix( BUSCO.out.versions.first() ) - ch_grab = GrabFiles(BUSCO.out.busco_dir) + ch_grab = GrabFiles( BUSCO.out.busco_dir ) // // MODULE: EXTRACT THE BUSCO GENES FOUND IN REFERENCE // - EXTRACT_BUSCOGENE (ch_grab) - ch_versions = ch_versions.mix(EXTRACT_BUSCOGENE.out.versions) + EXTRACT_BUSCOGENE ( + ch_grab + ) + ch_versions = ch_versions.mix( EXTRACT_BUSCOGENE.out.versions ) // // MODULE: SORT THE EXTRACTED BUSCO GENE // - BEDTOOLS_SORT(EXTRACT_BUSCOGENE.out.genefile, []) - ch_versions = ch_versions.mix(BEDTOOLS_SORT.out.versions) + BEDTOOLS_SORT( + EXTRACT_BUSCOGENE.out.genefile, + [] + ) + ch_versions = ch_versions.mix( BEDTOOLS_SORT.out.versions ) // // MODULE: CONVERT THE BED TO BIGBED // - UCSC_BEDTOBIGBED(BEDTOOLS_SORT.out.sorted, dot_genome.map{it[1]}, buscogene_as) - ch_versions = ch_versions.mix(UCSC_BEDTOBIGBED.out.versions) + UCSC_BEDTOBIGBED( + BEDTOOLS_SORT.out.sorted, + dot_genome.map{it[1]}, // Gets file from tuple (meta, file) + buscogene_as + ) + ch_versions = ch_versions.mix( UCSC_BEDTOBIGBED.out.versions ) // // LOGIC: AGGREGATE DATA AND SORT BRANCH ON CLASS - // + // lineageinfo .combine( BUSCO.out.busco_dir ) .combine( ancestral_table ) @@ -72,27 +83,29 @@ workflow BUSCO_ANNOTATION { lep: it[0].split('_')[0] == "lepidoptera" general: it[0].split('_')[0] != "lepidoptera" } - .set{ch_busco_data} + .set{ ch_busco_data } // // LOGIC: BUILD NEW INPUT CHANNEL FOR ANCESTRAL ID - // + // ch_busco_data .lep - .multiMap { data -> - busco_dir: tuple(data[1], data[2]) - atable: data[3] + .multiMap { lineage, meta, busco_dir, ancestral_table -> + busco_dir: tuple( meta, busco_dir ) + atable: ancestral_table } - .set{ch_busco_lep_data} + .set{ ch_busco_lep_data } // // SUBWORKFLOW: RUN ANCESTRAL BUSCO ID (ONLY AVAILABLE FOR LEPIDOPTERA) - // - ANCESTRAL_GENE (ch_busco_lep_data.busco_dir, - dot_genome, - buscogene_as, - ch_busco_lep_data.atable) - ch_versions = ch_versions.mix(ANCESTRAL_GENE.out.versions) + // + ANCESTRAL_GENE ( + ch_busco_lep_data.busco_dir, + dot_genome, + buscogene_as, + ch_busco_lep_data.atable + ) + ch_versions = ch_versions.mix( ANCESTRAL_GENE.out.versions ) emit: ch_buscogene_bigbed = UCSC_BEDTOBIGBED.out.bigbed diff --git a/subworkflows/local/gene_alignment.nf b/subworkflows/local/gene_alignment.nf index 95d1d64c..cec8f2b9 100644 --- a/subworkflows/local/gene_alignment.nf +++ b/subworkflows/local/gene_alignment.nf @@ -37,17 +37,19 @@ workflow GENE_ALIGNMENT { .splitCsv() .flatten() - ch_data - .combine( alignment_datadir ) - .combine( assembly_classT ) // - // LOGIC: CONVERTS THE ABOVE VALUES INTO A PATH AND DOWNLOADS IT, THEN TURNS IT TO A TUPLE OF + // LOGIC: COMBINE CH_DATA WITH ALIGNMENT_DIR AND ASSEMBLY_CLASS + // CONVERTS THESE VALUES INTO A PATH AND DOWNLOADS IT, THEN TURNS IT TO A TUPLE OF // [ [ META.ID, META.TYPE, META.ORG ], GENE_ALIGNMENT_FILE ] // DATA IS THEN BRANCHED BASED ON META.TYPE TO THE APPROPRIATE // SUBWORKFLOW // + ch_data + .combine( alignment_datadir ) + .combine( assembly_classT ) .map { - ch_org, data_dir, classT -> file("${data_dir}${classT}/csv_data/${ch_org}-data.csv") + ch_org, data_dir, classT -> + file("${data_dir}${classT}/csv_data/${ch_org}-data.csv") } .splitCsv( header: true, sep:',') .map( row -> @@ -79,7 +81,7 @@ workflow GENE_ALIGNMENT { ) ch_versions = ch_versions.mix(PEP_ALIGNMENTS.out.versions) - + // // SUBWORKFLOW: GENERATES GENE ALIGNMENTS FOR RNA, NUCLEAR AND COMPLEMENT_DNA DATA, EMITS BIGBED // @@ -90,7 +92,7 @@ workflow GENE_ALIGNMENT { intron_size ) ch_versions = ch_versions.mix(GEN_ALIGNMENTS.out.versions) - + CDS_ALIGNMENTS ( reference_tuple, reference_index, cds_files, @@ -98,7 +100,7 @@ workflow GENE_ALIGNMENT { intron_size ) ch_versions = ch_versions.mix(CDS_ALIGNMENTS.out.versions) - + RNA_ALIGNMENTS ( reference_tuple, reference_index, rna_files, diff --git a/subworkflows/local/generate_genome.nf b/subworkflows/local/generate_genome.nf index 0f46eaac..79d9868f 100755 --- a/subworkflows/local/generate_genome.nf +++ b/subworkflows/local/generate_genome.nf @@ -20,9 +20,9 @@ workflow GENERATE_GENOME { // reference_file .combine( assembly_id ) - .map { it -> - tuple ([id: it[1]], - it[0]) + .map { file, sample_id -> + tuple ([id: sample_id], + file) } .set { to_samtools } @@ -30,22 +30,29 @@ workflow GENERATE_GENOME { // MODULE: GENERATE INDEX OF REFERENCE // EMITS REFERENCE INDEX FILE // - SAMTOOLS_FAIDX ( to_samtools, [[],[]] ) - ch_versions = ch_versions.mix(SAMTOOLS_FAIDX.out.versions) + SAMTOOLS_FAIDX ( + to_samtools, + [[],[]] + ) + ch_versions = ch_versions.mix( SAMTOOLS_FAIDX.out.versions ) // // MODULE: TRIMS INDEX INTO A GENOME DESCRIPTION FILE // EMITS REFERENCE GEOME FILE AND REFERENCE INDEX FILE - GENERATE_GENOME_FILE ( SAMTOOLS_FAIDX.out.fai ) + GENERATE_GENOME_FILE ( + SAMTOOLS_FAIDX.out.fai + ) ch_versions = ch_versions.mix( GENERATE_GENOME_FILE.out.versions ) // // MODULE: Cut out the largest scaffold size and use as comparator against 512MB // This is the cut off for TABIX using tbi indexes // - GET_LARGEST_SCAFF ( GENERATE_GENOME_FILE.out.dotgenome ) + GET_LARGEST_SCAFF ( + GENERATE_GENOME_FILE.out.dotgenome + ) ch_versions = ch_versions.mix( GET_LARGEST_SCAFF.out.versions ) - + emit: max_scaff_size = GET_LARGEST_SCAFF.out.scaff_size.toInteger() dot_genome = GENERATE_GENOME_FILE.out.dotgenome diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index f05c2880..6b407d9c 100644 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -35,13 +35,15 @@ workflow HIC_MAPPING { ch_versions = Channel.empty() // COMMENT: 1000bp BIN SIZE INTERVALS FOR CLOAD - ch_cool_bin = Channel.of(1000) + ch_cool_bin = Channel.of( 1000 ) // // MODULE: Indexing on reference output the folder of indexing files // - BWAMEM2_INDEX (reference_tuple) - ch_versions = ch_versions.mix(BWAMEM2_INDEX.out.versions) + BWAMEM2_INDEX ( + reference_tuple + ) + ch_versions = ch_versions.mix( BWAMEM2_INDEX.out.versions ) // // LOGIC: make channel of hic reads as input for GENERATE_CRAM_CSV @@ -49,41 +51,51 @@ workflow HIC_MAPPING { reference_tuple .combine( hic_reads_path ) .map { meta, ref, hic_reads_path -> - tuple([ id: meta.id, single_end: true], hic_reads_path) } + tuple( + [ id: meta.id, single_end: true], + hic_reads_path + ) + } .set { get_reads_input } // // MODULE: generate a cram csv file containing the required parametres for CRAM_FILTER_ALIGN_BWAMEM2_FIXMATE_SORT // - GENERATE_CRAM_CSV ( get_reads_input ) - ch_versions = ch_versions.mix(GENERATE_CRAM_CSV.out.versions) + GENERATE_CRAM_CSV ( + get_reads_input + ) + ch_versions = ch_versions.mix( GENERATE_CRAM_CSV.out.versions ) // // LOGIC: organise all parametres into a channel for CRAM_FILTER_ALIGN_BWAMEM2_FIXMATE_SORT // - ch_filtering_input = GENERATE_CRAM_CSV.out.csv - .splitCsv() - .combine (reference_tuple) - .combine (BWAMEM2_INDEX.out.index) - .map{ cram_id, cram_info, ref_id, ref_dir, bwa_id, bwa_path -> - tuple([ - id: cram_id.id - ], - file(cram_info[0]), - cram_info[1], - cram_info[2], - cram_info[3], - cram_info[4], - cram_info[5], - cram_info[6], - bwa_path.toString() + '/' + ref_dir.toString().split('/')[-1]) - } + GENERATE_CRAM_CSV.out.csv + .splitCsv() + .combine (reference_tuple) + .combine (BWAMEM2_INDEX.out.index) + .map{ cram_id, cram_info, ref_id, ref_dir, bwa_id, bwa_path -> + tuple([ + id: cram_id.id + ], + file(cram_info[0]), + cram_info[1], + cram_info[2], + cram_info[3], + cram_info[4], + cram_info[5], + cram_info[6], + bwa_path.toString() + '/' + ref_dir.toString().split('/')[-1] + ) + } + .set { ch_filtering_input } // // MODULE: parallel proccessing bwa-mem2 alignment by given interval of containers from cram files // - CRAM_FILTER_ALIGN_BWAMEM2_FIXMATE_SORT ( ch_filtering_input ) - ch_versions = ch_versions.mix(CRAM_FILTER_ALIGN_BWAMEM2_FIXMATE_SORT.out.versions) + CRAM_FILTER_ALIGN_BWAMEM2_FIXMATE_SORT ( + ch_filtering_input + ) + ch_versions = ch_versions.mix( CRAM_FILTER_ALIGN_BWAMEM2_FIXMATE_SORT.out.versions ) // // LOGIC: PREPARING BAMS FOR MERGE @@ -106,7 +118,11 @@ workflow HIC_MAPPING { // // MODULE: MERGE POSITION SORTED BAM FILES AND MARK DUPLICATES // - SAMTOOLS_MERGE ( collected_files_for_merge, reference_tuple, reference_index ) + SAMTOOLS_MERGE ( + collected_files_for_merge, + reference_tuple, + reference_index + ) ch_versions = ch_versions.mix ( SAMTOOLS_MERGE.out.versions.first() ) // @@ -123,69 +139,87 @@ workflow HIC_MAPPING { // // MODULE: GENERATE PRETEXT MAP FROM MAPPED BAM FOR LOW RES // - PRETEXTMAP_STANDRD ( pretext_input.input_bam, pretext_input.reference ) - ch_versions = ch_versions.mix(PRETEXTMAP_STANDRD.out.versions) + PRETEXTMAP_STANDRD ( + pretext_input.input_bam, + pretext_input.reference + ) + ch_versions = ch_versions.mix( PRETEXTMAP_STANDRD.out.versions ) // // MODULE: GENERATE PRETEXT MAP FROM MAPPED BAM FOR HIGH RES // - PRETEXTMAP_HIGHRES ( pretext_input.input_bam, pretext_input.reference ) - ch_versions = ch_versions.mix(PRETEXTMAP_HIGHRES.out.versions) + PRETEXTMAP_HIGHRES ( + pretext_input.input_bam, + pretext_input.reference + ) + ch_versions = ch_versions.mix( PRETEXTMAP_HIGHRES.out.versions ) // // MODULE: GENERATE PNG FROM STANDARD PRETEXT // - SNAPSHOT_SRES ( PRETEXTMAP_STANDRD.out.pretext ) + SNAPSHOT_SRES ( + PRETEXTMAP_STANDRD.out.pretext + ) + ch_versions = ch_versions.mix ( SNAPSHOT_SRES.out.versions ) // NOTE: CURRENTLY UNDER INVESTIGATION // // MODULE: GENERATE PNG FROM HIGHRES PRETEXT // // SNAPSHOT_HRES ( PRETEXTMAP_HIGHRES.out.pretext ) + // ch_versions = ch_versions.mix ( SNAPSHOT_HRES.out.versions ) // // MODULE: MERGE POSITION SORTED BAM FILES AND MARK DUPLICATES // - SAMTOOLS_MARKDUP ( pretext_input.input_bam, pretext_input.reference ) - ch_versions = ch_versions.mix ( SAMTOOLS_MARKDUP.out.versions.first() ) + SAMTOOLS_MARKDUP ( + pretext_input.input_bam, + pretext_input.reference + ) + ch_versions = ch_versions.mix ( SAMTOOLS_MARKDUP.out.versions ) // // MODULE: SAMTOOLS FILTER OUT DUPLICATE READS | BAMTOBED | SORT BED FILE // - BAMTOBED_SORT( SAMTOOLS_MARKDUP.out.bam ) - ch_versions = ch_versions.mix(BAMTOBED_SORT.out.versions) + BAMTOBED_SORT( + SAMTOOLS_MARKDUP.out.bam + ) + ch_versions = ch_versions.mix( BAMTOBED_SORT.out.versions ) // // MODULE: GENERATE CONTACT PAIRS // - GET_PAIRED_CONTACT_BED(BAMTOBED_SORT.out.sorted_bed) - ch_versions = ch_versions.mix(GET_PAIRED_CONTACT_BED.out.versions) + GET_PAIRED_CONTACT_BED( BAMTOBED_SORT.out.sorted_bed ) + ch_versions = ch_versions.mix( GET_PAIRED_CONTACT_BED.out.versions ) // // LOGIC: PREPARE JUICER TOOLS INPUT // GET_PAIRED_CONTACT_BED.out.bed .combine( dot_genome ) - .map { meta, paired_contacts, meta_my_genome, my_genome -> - tuple([ id: meta.id, single_end: true], paired_contacts, my_genome, meta.id) } + .multiMap { meta, paired_contacts, meta_my_genome, my_genome -> + paired : tuple([ id: meta.id, single_end: true], paired_contacts ) + genome : my_genome + id : meta.id + } .set { ch_juicer_input } // // MODULE: GENERATE HIC MAP // JUICER_TOOLS_PRE( - ch_juicer_input.map { [it[0], it[1]] }, - ch_juicer_input.map { it[2] }, - ch_juicer_input.map { it[3] } + ch_juicer_input.paired, + ch_juicer_input.genome, + ch_juicer_input.id ) - ch_versions = ch_versions.mix(JUICER_TOOLS_PRE.out.versions) + ch_versions = ch_versions.mix( JUICER_TOOLS_PRE.out.versions ) // // LOGIC: BIN CONTACT PAIRS // GET_PAIRED_CONTACT_BED.out.bed - .join(BAMTOBED_SORT.out.sorted_bed) - .combine(ch_cool_bin) + .join( BAMTOBED_SORT.out.sorted_bed ) + .combine( ch_cool_bin ) .set { ch_binned_pairs } // @@ -193,15 +227,18 @@ workflow HIC_MAPPING { // ch_binned_pairs .combine(dot_genome) - .map{ meta, pairs, bed, cool_bin, meta_my_genome, my_genome -> [meta, pairs, bed, cool_bin, my_genome]} - .set { ch_cooler_input } + .multiMap { meta, pairs, bed, cool_bin, meta_my_genome, my_genome -> + cooler_in : tuple ( meta, pairs, bed, cool_bin ) + genome_file : my_genome + } + .set { ch_cooler } // // MODULE: GENERATE A MULTI-RESOLUTION COOLER FILE BY COARSENING // COOLER_CLOAD( - ch_cooler_input.map { [it[0], it[1], it[2], it[3]] }, - ch_cooler_input.map { it[4] } + ch_cooler.cooler_in, + ch_cooler.genome_file ) ch_versions = ch_versions.mix(COOLER_CLOAD.out.versions) @@ -209,7 +246,9 @@ workflow HIC_MAPPING { // LOGIC: REFACTOR CHANNEL FOR ZOOMIFY // COOLER_CLOAD.out.cool - .map{ meta, cools, cool_bin -> [meta, cools]} + .map{ meta, cools, cool_bin -> + [meta, cools] + } .set{ch_cool} // diff --git a/subworkflows/local/insilico_digest.nf b/subworkflows/local/insilico_digest.nf index 8233c8fa..2e2989dc 100755 --- a/subworkflows/local/insilico_digest.nf +++ b/subworkflows/local/insilico_digest.nf @@ -27,83 +27,113 @@ workflow INSILICO_DIGEST { // LOGIC: COMBINES REFERENCE TUPLE WITH ENZYME CHANNEL // MULTIMAP INTO TWO CHANNELS SO THERE IS REFERENCE * ENZYME CHANNELS // - input_fasta = sample.map { data -> - tuple([ - id : data[0].id, - single_end : false - ], - file(data[1]) - )} + sample + .map { meta, data -> + tuple( + [ id : meta.id, + single_end : false ], + file( data ) + ) + } + .set { input_fasta } input_fasta .combine(ch_enzyme) - .multiMap { data -> - fasta: tuple( data[0], - data[1] + .multiMap { meta, reference, enzyme_id -> + fasta : tuple( meta, + reference ) - enzyme: data[2] + enzyme : enzyme_id } - .set { fa2c_input } + .set { fa2c_input } // // MODULE: CONVERTS FASTA INTO A COLOUR-AWARE BIONANO CMAP FORMAT // EMITS FILES CONTAINING INDEX_IDs AND ORIGINAL_GENOMIC_LOCATIONS // - MAKECMAP_FA2CMAPMULTICOLOR ( fa2c_input.fasta, fa2c_input.enzyme ) - - ch_cmap = MAKECMAP_FA2CMAPMULTICOLOR.out.cmap - ch_cmapkey = MAKECMAP_FA2CMAPMULTICOLOR.out.cmapkey + MAKECMAP_FA2CMAPMULTICOLOR ( + fa2c_input.fasta, + fa2c_input.enzyme + ) ch_versions = ch_versions.mix(MAKECMAP_FA2CMAPMULTICOLOR.out.versions) // // LOGIC: CREATES A TUPLE CONTAINING THE CMAP AND ORIGINAL GENOMIC LOCATIONS // - ch_cmap_new = ch_cmap - .map{ meta, cfile -> tuple([ - id : cfile.toString().split('_')[-3] - ], cfile)} - - ch_cmapkey_new = ch_cmapkey - .map{ kfile -> tuple([ - id : kfile.toString().split('_')[-4] - ], kfile)} - - - ch_join = ch_cmap_new.join(ch_cmapkey_new) - .map { meta, cfile, kfile -> tuple ([ - meta, - cfile - ] , - kfile)} - + MAKECMAP_FA2CMAPMULTICOLOR.out.cmap + .map{ meta, cfile -> + tuple( + [ id : cfile.toString().split('_')[-3] ], + cfile + ) + } + .set { ch_cmap_new } + + MAKECMAP_FA2CMAPMULTICOLOR.out.cmapkey + .map{ kfile -> + tuple( + [ id : kfile.toString().split('_')[-4] ], + kfile + ) + } + .set { ch_cmapkey_new } + + + ch_cmap_new + .join(ch_cmapkey_new) + .multiMap { meta, cfile, kfile -> + cmap : tuple( meta, cfile) + key_file : kfile + } + + .set { ch_join } + // // MODULE: RENAME CMAP IDs FROM BIONANO IDX TO ORIGINAL GENOMIC LOCATIONS // EMITS RENAMED CMAP // - MAKECMAP_RENAMECMAPIDS ( ch_join.map { it[0] }, ch_join.map { it[1] } ) + MAKECMAP_RENAMECMAPIDS ( + ch_join.cmap, + ch_join.key_file + ) ch_versions = ch_versions.mix(MAKECMAP_RENAMECMAPIDS.out.versions) - ch_renamedcmap = MAKECMAP_RENAMECMAPIDS.out.renamedcmap + MAKECMAP_RENAMECMAPIDS.out.renamedcmap + .multiMap { meta, file -> + full : tuple ( meta, file ) + sample : meta.id + } + .set { ch_renamedcmap } // // MODULE: CONVERT CMAP FILE INTO BED FILE // EMITS BED FILE // - MAKECMAP_CMAP2BED ( ch_renamedcmap, ch_renamedcmap.map { it[0].id } ) + MAKECMAP_CMAP2BED ( + ch_renamedcmap.full, + ch_renamedcmap.sample + ) ch_versions = ch_versions.mix(MAKECMAP_CMAP2BED.out.versions) - ch_bedfile = MAKECMAP_CMAP2BED.out.bedfile - combined_ch = ch_bedfile - .combine(sizefile) - .combine(dot_as) - + MAKECMAP_CMAP2BED.out.bedfile + .combine(sizefile) + .combine(dot_as) + .multiMap { meta, bed, meta_2, dot_genome, as_file -> + bed_tuple : tuple( meta, bed ) + genome_file : dot_genome + autosql : as_file + } + .set { combined_ch } + // // MODULE: CONVERT ABOVE BED INTO BIGBED WITH ADDITIONAL AS FILE // EMITS BIGBED FILE // - UCSC_BEDTOBIGBED ( combined_ch.map { [it[0], it[1]] }, - combined_ch.map { it[3] }, - combined_ch.map { it[4] }) + UCSC_BEDTOBIGBED ( + combined_ch.bed_tuple, + combined_ch.genome_file, + combined_ch.autosql + ) ch_versions = ch_versions.mix(UCSC_BEDTOBIGBED.out.versions) emit: diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index 5e246198..d38c26d8 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -27,7 +27,6 @@ workflow LONGREAD_COVERAGE { reference_tuple // Channel: [ val(meta), path(reference_file) ] dot_genome // Channel: [ val(meta), [ path(datafile) ] ] reads_path // Channel: [ val(meta), val( str ) ] - size_class // Channel: val( str ) main: ch_versions = Channel.empty() @@ -35,62 +34,95 @@ workflow LONGREAD_COVERAGE { // // MODULE: CREATES INDEX OF REFERENCE FILE // - MINIMAP2_INDEX(reference_tuple) - ch_versions = ch_versions.mix(MINIMAP2_INDEX.out.versions) - ch_ref_index = MINIMAP2_INDEX.out.index + MINIMAP2_INDEX( + reference_tuple + ) + ch_versions = ch_versions.mix( MINIMAP2_INDEX.out.versions ) // - // LOGIC: PREPARE GET_READS_FROM_DIRECTORY INPUT + // LOGIC: PREPARE GET_READS_FROM_DIRECTORY INPUT // reference_tuple .combine( reads_path ) .map { meta, ref, reads_path -> - tuple([ id: meta.id, single_end: true], reads_path) } + tuple( + [ id : meta.id, + single_end : true ], + reads_path + ) + } .set { get_reads_input } // // MODULE: GETS PACBIO READ PATHS FROM READS_PATH // - ch_grabbed_read_paths = GrabFiles(get_reads_input) + ch_grabbed_read_paths = GrabFiles( get_reads_input ) // // LOGIC: PACBIO READS FILES TO CHANNEL // ch_grabbed_read_paths - .map { meta, files -> - tuple(files) - } + .map { meta, files -> + tuple( files ) + } .flatten() .set { ch_read_paths } // // LOGIC: COMBINE PACBIO READ PATHS WITH MINIMAP2_INDEX OUTPUT // - ch_ref_index - .combine(ch_read_paths) - .combine(size_class) - .map { meta, ref_mmi, read_path, size_class -> - tuple([ id: meta.id, - single_end: true, + MINIMAP2_INDEX.out.index + .combine( ch_read_paths ) + .combine( reference_tuple ) + .map { meta, ref_mmi, read_path, ref_meta, reference -> + tuple( + [ id : meta.id, + single_end : true, split_prefix: read_path.toString().split('/')[-1].split('.fasta.gz')[0] ], - read_path, ref_mmi, true, false, false, size_class) - } + read_path, + ref_mmi, + true, + false, + false, + file( reference ).size() + ) + } .branch { - large: it[6] == 'L' - small: it[6] == 'S' + large : it[6] > 3000000000 + small : it[6] < 3000000000 } .set { mma_input } + mma_input.large + .multiMap { meta, read_path, ref_mmi, bam_output, cigar_paf, cigar_bam, file_size -> + read_tuple : tuple( meta, read_path) + mmi_index : ref_mmi + bool_bam_ouput : bam_output + bool_cigar_paf : cigar_paf + bool_cigar_bam : cigar_bam + } + .set { large } + + mma_input.small + .multiMap { meta, read_path, ref_mmi, bam_output, cigar_paf, cigar_bam, file_size -> + read_tuple : tuple( meta, read_path) + mmi_index : ref_mmi + bool_bam_ouput : bam_output + bool_cigar_paf : cigar_paf + bool_cigar_bam : cigar_bam + } + .set { small } + // // MODULE: ALIGN READS TO REFERENCE WHEN REFERENCE <5GB PER SCAFFOLD - // + // MINIMAP2_ALIGN ( - mma_input.small.map { [it[0], it[1]] }, - mma_input.small.map { it[2] }, - mma_input.small.map { it[3] }, - mma_input.small.map { it[4] }, - mma_input.small.map { it[5] } + small.read_tuple, + small.mmi_index, + small.bool_bam_ouput, + small.bool_cigar_paf, + small.bool_cigar_bam ) ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) ch_align_bams = MINIMAP2_ALIGN.out.bam @@ -99,20 +131,19 @@ workflow LONGREAD_COVERAGE { // MODULE: ALIGN READS TO REFERENCE WHEN REFERENCE >5GB PER SCAFFOLD // MINIMAP2_ALIGN_SPLIT ( - mma_input.large.map { [it[0], it[1]] }, - mma_input.large.map { it[2] }, - mma_input.large.map { it[3] }, - mma_input.large.map { it[4] }, - mma_input.large.map { it[5] } + large.read_tuple, + large.mmi_index, + large.bool_bam_ouput, + large.bool_cigar_paf, + large.bool_cigar_bam ) ch_versions = ch_versions.mix(MINIMAP2_ALIGN_SPLIT.out.versions) - ch_split_bams = MINIMAP2_ALIGN_SPLIT.out.bam // // LOGIC: COLLECT OUTPUTTED BAM FILES FROM BOTH PROCESSES - // + // ch_align_bams - .mix(ch_split_bams) + .mix( MINIMAP2_ALIGN_SPLIT.out.bam ) .set { ch_bams } // @@ -125,44 +156,52 @@ workflow LONGREAD_COVERAGE { .collect() .map { file -> tuple ( - [ - id: file[0].toString().split('/')[-1].split('_')[0] // Change to sample_id - ], + [ id : file[0].toString().split('/')[-1].split('_')[0] ], // Change sample ID file ) } - .set { collected_files_for_merge } + .set { collected_files_for_merge } // // MODULE: MERGES THE BAM FILES IN REGARDS TO THE REFERENCE // EMITS A MERGED BAM SAMTOOLS_MERGE( collected_files_for_merge, - reference_tuple, + reference_tuple, MINIMAP2_INDEX.out.index ) ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) - ch_merged_bam = SAMTOOLS_MERGE.out.bam + // TODO: ADD THIS // samtools sort -@ 8 merged.bam > sort.bam // SAMTOOLS_SORT ( view_input ) // // LOGIC: PREPARING MERGE INPUT WITH REFERENCE GENOME AND REFERENCE INDEX // - ch_merged_bam + SAMTOOLS_MERGE.out.bam .combine( reference_tuple ) - .combine( ch_ref_index ) - .map { meta, file, ref_meta, ref, ref_index_meta, ref_index -> - tuple([ id: meta.id, single_end: true], file, ref_meta, ref, ref_index) } + .combine( MINIMAP2_INDEX.out.index ) + .multiMap { meta, file, ref_meta, ref, ref_index_meta, ref_index -> + bam_input : tuple( + [ id : meta.id, + single_end : true ], + file, + ref_index + ) + ref_input : tuple( + ref_meta, + ref + ) + } .set { view_input } // // MODULE: EXTRACT READS FOR PRIMARY ASSEMBLY // SAMTOOLS_VIEW( - view_input.map { [it[0], it[1], it[4]] }, - view_input.map { [it[2], it[3]] }, + view_input.bam_input, + view_input.ref_input, [] ) ch_versions = ch_versions.mix(SAMTOOLS_VIEW.out.versions) @@ -170,42 +209,51 @@ workflow LONGREAD_COVERAGE { // // MODULE: BAM TO PRIMARY BED // - BEDTOOLS_BAMTOBED(SAMTOOLS_VIEW.out.bam) + BEDTOOLS_BAMTOBED( + SAMTOOLS_VIEW.out.bam + ) ch_versions = ch_versions.mix(BEDTOOLS_BAMTOBED.out.versions) // // LOGIC: PREPARING Genome2Cov INPUT // BEDTOOLS_BAMTOBED.out.bed - .combine(dot_genome) - .map { meta, file, my_genome_meta, my_genome -> - tuple([ id: meta.id, single_end: true], file, 1, my_genome, 'bed') + .combine( dot_genome ) + .multiMap { meta, file, my_genome_meta, my_genome -> + input_tuple : tuple ( + [ id : meta.id, + single_end : true ], + file, + 1 + ) + dot_genome : my_genome + file_suffix : 'bed' } .set { genomecov_input } // // MODULE: Genome2Cov - // + // BEDTOOLS_GENOMECOV( - genomecov_input.map { [it[0], it[1], it[2]] }, - genomecov_input.map { it[3] }, - genomecov_input.map { it[4] } + genomecov_input.input_tuple, + genomecov_input.dot_genome, + genomecov_input.file_suffix ) ch_versions = ch_versions.mix(BEDTOOLS_GENOMECOV.out.versions) - ch_coverage_unsorted_bed = BEDTOOLS_GENOMECOV.out.genomecov // // MODULE: SORT THE PRIMARY BED FILE // - GNU_SORT(ch_coverage_unsorted_bed) + GNU_SORT( + BEDTOOLS_GENOMECOV.out.genomecov + ) ch_versions = ch_versions.mix(GNU_SORT.out.versions) - ch_coverage_bed = GNU_SORT.out.sorted // // MODULE: get_minmax_punches // GETMINMAXPUNCHES( - ch_coverage_bed + GNU_SORT.out.sorted ) ch_versions = ch_versions.mix(GETMINMAXPUNCHES.out.versions) @@ -216,7 +264,6 @@ workflow LONGREAD_COVERAGE { GETMINMAXPUNCHES.out.max ) ch_versions = ch_versions.mix(BEDTOOLS_MERGE_MAX.out.versions) - ch_maxbed = BEDTOOLS_MERGE_MAX.out.bed // // MODULE: get_minmax_punches @@ -225,13 +272,12 @@ workflow LONGREAD_COVERAGE { GETMINMAXPUNCHES.out.min ) ch_versions = ch_versions.mix(BEDTOOLS_MERGE_MIN.out.versions) - ch_minbed = BEDTOOLS_MERGE_MIN.out.bed // // MODULE: GENERATE DEPTHGRAPH // GRAPHOVERALLCOVERAGE( - ch_coverage_bed + GNU_SORT.out.sorted ) ch_versions = ch_versions.mix(GRAPHOVERALLCOVERAGE.out.versions) ch_depthgraph = GRAPHOVERALLCOVERAGE.out.part @@ -239,32 +285,34 @@ workflow LONGREAD_COVERAGE { // // LOGIC: PREPARING FINDHALFCOVERAGE INPUT // - ch_coverage_bed - .combine( ch_depthgraph ) + GNU_SORT.out.sorted + .combine( GRAPHOVERALLCOVERAGE.out.part ) .combine( dot_genome ) - .map { meta, file, meta_depthgraph, depthgraph, meta_my_genome, my_genome -> - tuple([ id: meta.id, single_end: true], file, my_genome, depthgraph) + .multiMap { meta, file, meta_depthgraph, depthgraph, meta_my_genome, my_genome -> + halfcov_bed : tuple( [ id : meta.id, single_end : true ], file ) + genome_file : my_genome + depthgraph_file : depthgraph } - .set { findhalfcov_input } + .set { halfcov_input } // - // MODULE: findHalfcoverage + // MODULE: FIND REGIONS OF HALF COVERAGE // FINDHALFCOVERAGE( - findhalfcov_input.map { [it[0], it[1]] }, - findhalfcov_input.map { it[2] }, - findhalfcov_input.map { it[3] } + halfcov_input.halfcov_bed, + halfcov_input.genome_file, + halfcov_input.depthgraph_file ) ch_versions = ch_versions.mix(FINDHALFCOVERAGE.out.versions) - ch_halfbed = FINDHALFCOVERAGE.out.bed // - // LOGIC: PREPARING FINDHALFCOVERAGE INPUT + // LOGIC: PREPARING COVERAGE INPUT // - ch_coverage_bed + GNU_SORT.out.sorted .combine( dot_genome ) - .map { meta, file, meta_my_genome, my_genome -> - tuple([ id: meta.id, single_end: true], file, my_genome) + .multiMap { meta, file, meta_my_genome, my_genome -> + ch_coverage_bed : tuple ([ id: meta.id, single_end: true], file) + genome_file : my_genome } .set { bed2bw_input } @@ -272,18 +320,17 @@ workflow LONGREAD_COVERAGE { // MODULE: CONVERT BEDGRAPH TO BIGWIG // UCSC_BEDGRAPHTOBIGWIG( - bed2bw_input.map { [it[0], it[1]] }, - bed2bw_input.map { it[2] } + bed2bw_input.ch_coverage_bed, + bed2bw_input.genome_file ) ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions) - ch_bigwig = UCSC_BEDGRAPHTOBIGWIG.out.bigwig emit: - ch_minbed - ch_halfbed - ch_maxbed - ch_bigwig - versions = ch_versions + ch_minbed = BEDTOOLS_MERGE_MIN.out.bed + ch_halfbed = FINDHALFCOVERAGE.out.bed + ch_maxbed = BEDTOOLS_MERGE_MAX.out.bed + ch_bigwig = UCSC_BEDGRAPHTOBIGWIG.out.bigwig + versions = ch_versions } process GrabFiles { @@ -297,4 +344,4 @@ process GrabFiles { tuple val(meta), path("in/*.fasta.gz") "true" -} \ No newline at end of file +} diff --git a/subworkflows/local/nuc_alignments.nf b/subworkflows/local/nuc_alignments.nf index 5bc40a5c..0629b0eb 100644 --- a/subworkflows/local/nuc_alignments.nf +++ b/subworkflows/local/nuc_alignments.nf @@ -37,21 +37,28 @@ workflow NUC_ALIGNMENTS { .buffer( size: 2 ) .combine ( reference_tuple ) .combine( intron_size ) - .map ( it -> - tuple( [id: it[0].id, - type: it[0].type, - org: it[0].org, - intron_size: it[4], - split_prefix: it[1].toString().split('/')[-1].split('.fasta')[0], - single_end: true + .map { meta, nuc_file, ref_meta, ref, intron -> + tuple( [id: meta.id, + type: meta.type, + org: meta.org, + intron_size: intron, + split_prefix: nuc_file.toString().split('/')[-1].split('.fasta')[0], + single_end: true ], - it[1], - it[3], + nuc_file, + ref, true, false, false ) - ) + } + .multiMap { meta, nuc_file, reference, bool_1, bool_2, bool_3 -> + nuc : tuple( meta, nuc_file) + ref : reference + bool_bam_output : bool_1 + bool_cigar_paf : bool_2 + bool_cigar_bam : bool_3 + } .set { formatted_input } // @@ -59,21 +66,24 @@ workflow NUC_ALIGNMENTS { // EMITS ALIGNED BAM FILE // MINIMAP2_ALIGN ( - formatted_input.map { [it[0], it[1]] }, - formatted_input.map { it[2] }, - formatted_input.map { it[3] }, - formatted_input.map { it[4] }, - formatted_input.map { it[5] } + formatted_input.nuc, + formatted_input.ref, + formatted_input.bool_bam_output, + formatted_input.bool_cigar_paf, + formatted_input.bool_cigar_bam ) ch_versions = ch_versions.mix(MINIMAP2_ALIGN.out.versions) // - // LOGIC: CONVERTS THE MINIMAP OUTPUT TUPLE INTO A GROUPED TUPLE PER INPUT QUERY ORGANISM + // LOGIC: CONVERTS THE MINIMAP OUTPUT TUPLE INTO A GROUPED TUPLE PER INPUT QUERY ORGANISM // AND DATA TYPE (RNA, CDS, DNA). // MINIMAP2_ALIGN.out.bam .map { meta, file -> - tuple([id: meta.org, type: meta.type], file) } + tuple( + [ id: meta.org, + type: meta.type ], + file) } .groupTuple( by: [0] ) .set { merge_input } @@ -82,7 +92,7 @@ workflow NUC_ALIGNMENTS { // EMITS A MERGED BAM SAMTOOLS_MERGE ( merge_input, - reference_tuple, + reference_tuple, reference_index ) ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) @@ -124,14 +134,14 @@ workflow NUC_ALIGNMENTS { file_size: file.size() ], file ) } - .filter { it[0].file_size >= 141 } + .filter { it[0].file_size >= 141 } // Take the first item in input (meta) and check if size is more than a symlink .combine( dot_genome ) - .multiMap { it -> - bed_file: tuple( [ id: it[0].id, - type: it[0].type, + .multiMap { meta, ref, genome_meta, genome -> + bed_file: tuple( [ id: meta.id, + type: meta.type, ], - it[1] ) - dot_genome: it[3] + ref ) + dot_genome: genome } .set { ucsc_input } diff --git a/subworkflows/local/pep_alignments.nf b/subworkflows/local/pep_alignments.nf index db31b354..3dd99ae7 100644 --- a/subworkflows/local/pep_alignments.nf +++ b/subworkflows/local/pep_alignments.nf @@ -34,15 +34,15 @@ workflow PEP_ALIGNMENTS { .flatten() .buffer( size: 2 ) .combine ( MINIPROT_INDEX.out.index ) - .multiMap { data -> - pep_tuple : tuple( [ id: data[0].id, - type: data[0].type, - org: data[0].org + .multiMap { pep_meta, pep_file, miniprot_meta, miniprot_index -> + pep_tuple : tuple( [ id: pep_meta.id, + type: pep_meta.type, + org: pep_meta.org ], - data[1] ) + pep_file ) index_file : tuple( [ id: "Reference", ], - data[3] ) + miniprot_index ) } .set { formatted_input } @@ -50,7 +50,7 @@ workflow PEP_ALIGNMENTS { // MODULE: ALIGNS PEP DATA WITH REFERENCE INDEX // EMITS GFF FILE // - MINIPROT_ALIGN ( + MINIPROT_ALIGN ( formatted_input.pep_tuple, formatted_input.index_file ) @@ -60,11 +60,12 @@ workflow PEP_ALIGNMENTS { // LOGIC: GROUPS OUTPUT GFFS BASED ON QUERY ORGANISMS AND DATA TYPE (PEP) // MINIPROT_ALIGN.out.gff - .map { it -> - tuple([ id: it[0].org + '_pep', - type: it[0].type - ], - it[1] ) + .map { meta, file -> + tuple( + [ id : meta.org + '_pep', + type : meta.type ], + file + ) } .groupTuple( by: [0] ) .set { grouped_tuple } @@ -72,37 +73,47 @@ workflow PEP_ALIGNMENTS { // // MODULE: AS ABOVE OUTPUT IS BED FORMAT, IT IS MERGED PER ORGANISM + TYPE // - CAT_CAT ( grouped_tuple ) + CAT_CAT ( + grouped_tuple + ) ch_versions = ch_versions.mix( CAT_CAT.out.versions ) // // MODULE: SORTS ABOVE OUTPUT AND RETAINS GFF SUFFIX // EMITS A MERGED GFF FILE // - BEDTOOLS_SORT ( CAT_CAT.out.file_out , [] ) + BEDTOOLS_SORT ( + CAT_CAT.out.file_out , + [] + ) ch_versions = ch_versions.mix( BEDTOOLS_SORT.out.versions ) // // MODULE: CUTS GFF INTO PUNCHLIST // - GFF_TO_BED ( CAT_CAT.out.file_out ) + GFF_TO_BED ( + CAT_CAT.out.file_out + ) ch_versions = ch_versions.mix( GFF_TO_BED.out.versions ) BEDTOOLS_SORT.out.sorted - .combine(max_scaff_size) - .map {meta, row, scaff -> - tuple([ id : meta.id, - max_scaff : scaff >= 500000000 ? 'csi': '' - ], - file(row) - )} + .combine( max_scaff_size ) + .map {meta, row, scaff -> + tuple( + [ id : meta.id, + max_scaff : scaff >= 500000000 ? 'csi': '' ], + file( row ) + ) + } .set { modified_bed_ch } // // MODULE: COMPRESS AND INDEX MERGED.GFF // EMITS A TBI FILE // - TABIX_BGZIPTABIX ( modified_bed_ch ) + TABIX_BGZIPTABIX ( + modified_bed_ch + ) ch_versions = ch_versions.mix( TABIX_BGZIPTABIX.out.versions ) emit: diff --git a/subworkflows/local/punchlist.nf b/subworkflows/local/punchlist.nf index 8750a73a..1db01a6e 100644 --- a/subworkflows/local/punchlist.nf +++ b/subworkflows/local/punchlist.nf @@ -17,14 +17,18 @@ workflow PUNCHLIST { // // MODULE: CONVERTS BAM INTO PAF FOR THE PUNCHLIST GENERATION // - PAFTOOLS_SAM2PAF ( merged_bam ) - ch_versions = ch_versions.mix(PAFTOOLS_SAM2PAF.out.versions) + PAFTOOLS_SAM2PAF ( + merged_bam + ) + ch_versions = ch_versions.mix( PAFTOOLS_SAM2PAF.out.versions ) // // MODULE: GENERATES PUNCHLIST FROM PAF FILE // - PAF2BED ( PAFTOOLS_SAM2PAF.out.paf ) - ch_versions = ch_versions.mix(PAF2BED.out.versions) + PAF2BED ( + PAFTOOLS_SAM2PAF.out.paf + ) + ch_versions = ch_versions.mix( PAF2BED.out.versions ) emit: punchlist = PAF2BED.out.punchlist diff --git a/subworkflows/local/repeat_density.nf b/subworkflows/local/repeat_density.nf index 94e82fdd..2445c89a 100644 --- a/subworkflows/local/repeat_density.nf +++ b/subworkflows/local/repeat_density.nf @@ -6,9 +6,9 @@ include { WINDOWMASKER_USTAT } from '../../modules/nf-core/windowmasker/ustat/main' include { WINDOWMASKER_MKCOUNTS } from '../../modules/nf-core/windowmasker/mk_counts/main' include { EXTRACT_REPEAT } from '../../modules/local/extract_repeat' -include { BEDTOOLS_INTERSECT } from '../../modules/nf-core/bedtools/intersect/main' -include { BEDTOOLS_MAKEWINDOWS } from '../../modules/nf-core/bedtools/makewindows/main' -include { BEDTOOLS_MAP } from '../../modules/nf-core/bedtools/map/main' +include { BEDTOOLS_INTERSECT } from '../../modules/nf-core/bedtools/intersect/main' +include { BEDTOOLS_MAKEWINDOWS } from '../../modules/nf-core/bedtools/makewindows/main' +include { BEDTOOLS_MAP } from '../../modules/nf-core/bedtools/map/main' include { RENAME_IDS } from '../../modules/local/rename_ids' include { UCSC_BEDGRAPHTOBIGWIG } from '../../modules/nf-core/ucsc/bedgraphtobigwig/main' include { GNU_SORT as GNU_SORT_A } from '../../modules/nf-core/gnu/sort/main' @@ -27,26 +27,34 @@ workflow REPEAT_DENSITY { // // MODULE: MARK UP THE REPEAT REGIONS OF THE REFERENCE GENOME // - WINDOWMASKER_MKCOUNTS ( reference_tuple ) + WINDOWMASKER_MKCOUNTS ( + reference_tuple + ) ch_versions = ch_versions.mix( WINDOWMASKER_MKCOUNTS.out.versions ) // // MODULE: CALCULATE THE STATISTICS OF THE MARKED UP REGIONS // - WINDOWMASKER_USTAT( WINDOWMASKER_MKCOUNTS.out.counts, - reference_tuple ) + WINDOWMASKER_USTAT( + WINDOWMASKER_MKCOUNTS.out.counts, + reference_tuple + ) ch_versions = ch_versions.mix( WINDOWMASKER_USTAT.out.versions ) // // MODULE: USE USTAT OUTPUT TO EXTRACT REPEATS FROM FASTA // - EXTRACT_REPEAT( WINDOWMASKER_USTAT.out.intervals ) + EXTRACT_REPEAT( + WINDOWMASKER_USTAT.out.intervals + ) ch_versions = ch_versions.mix( EXTRACT_REPEAT.out.versions ) // // MODULE: CREATE WINDOWS FROM .GENOME FILE // - BEDTOOLS_MAKEWINDOWS( dot_genome ) + BEDTOOLS_MAKEWINDOWS( + dot_genome + ) ch_versions = ch_versions.mix( BEDTOOLS_MAKEWINDOWS.out.versions ) // @@ -54,10 +62,11 @@ workflow REPEAT_DENSITY { // BEDTOOLS_MAKEWINDOWS.out.bed .combine( EXTRACT_REPEAT.out.bed ) - .map{ data -> - tuple ( data[0], - data[1], - data[3] + .map{ meta, windows_file, repeat_meta, repeat_file -> + tuple ( + meta, + windows_file, + repeat_file ) } .set { intervals } @@ -65,7 +74,7 @@ workflow REPEAT_DENSITY { // // MODULE: GENERATES THE REPEAT FILE FROM THE WINDOW FILE AND GENOME FILE // - BEDTOOLS_INTERSECT( + BEDTOOLS_INTERSECT( intervals, dot_genome ) @@ -74,37 +83,48 @@ workflow REPEAT_DENSITY { // // MODULE: FIXES IDS FOR REPEATS // - RENAME_IDS( BEDTOOLS_INTERSECT.out.intersect ) + RENAME_IDS( + BEDTOOLS_INTERSECT.out.intersect + ) ch_versions = ch_versions.mix( RENAME_IDS.out.versions ) // // MODULE: SORTS THE ABOVE BED FILES // - GNU_SORT_A ( RENAME_IDS.out.bed ) // Intersect file + GNU_SORT_A ( + RENAME_IDS.out.bed // Intersect file + ) ch_versions = ch_versions.mix( GNU_SORT_A.out.versions ) - GNU_SORT_B ( dot_genome ) // genome file + GNU_SORT_B ( + dot_genome // Genome file - Will not run unless genome file is sorted to + ) ch_versions = ch_versions.mix( GNU_SORT_B.out.versions ) - GNU_SORT_C ( BEDTOOLS_MAKEWINDOWS.out.bed ) // windows file + GNU_SORT_C ( + BEDTOOLS_MAKEWINDOWS.out.bed // Windows file + ) ch_versions = ch_versions.mix( GNU_SORT_C.out.versions ) // // MODULE: ADDS 4TH COLUMN TO BED FILE USED IN THE REPEAT DENSITY GRAPH // - REFORMAT_INTERSECT ( GNU_SORT_A.out.sorted ) - ch_versions = ch_versions.mix( GNU_SORT_C.out.versions ) + REFORMAT_INTERSECT ( + GNU_SORT_A.out.sorted + ) + ch_versions = ch_versions.mix( GNU_SORT_C.out.versions ) // - // LOGIC: COMBINES THE REFORMATTED INTERSECT FILE AND WINDOWS FILE CHANNELS AND SORTS INTO + // LOGIC: COMBINES THE REFORMATTED INTERSECT FILE AND WINDOWS FILE CHANNELS AND SORTS INTO // tuple(intersect_meta, windows file, intersect file) // REFORMAT_INTERSECT.out.bed .combine( GNU_SORT_C.out.sorted ) - .map{ data -> - tuple ( data[0], - data[3], - data[1] + .map{ intersect_meta, bed, sorted_meta, windows_file -> + tuple ( + intersect_meta, + windows_file, + bed ) } .set { for_mapping } @@ -112,7 +132,7 @@ workflow REPEAT_DENSITY { // // MODULE: MAPS THE REPEATS AGAINST THE REFERENCE GENOME // - BEDTOOLS_MAP( + BEDTOOLS_MAP( for_mapping, GNU_SORT_B.out.sorted ) @@ -131,7 +151,7 @@ workflow REPEAT_DENSITY { // UCSC_BEDGRAPHTOBIGWIG( REPLACE_DOTS.out.bed, - GNU_SORT_B.out.sorted.map { it[1] } + GNU_SORT_B.out.sorted.map { it[1] } // Pulls file from tuple of meta and file ) ch_versions = ch_versions.mix( UCSC_BEDGRAPHTOBIGWIG.out.versions ) diff --git a/subworkflows/local/selfcomp.nf b/subworkflows/local/selfcomp.nf index 08be8731..985d9c6c 100755 --- a/subworkflows/local/selfcomp.nf +++ b/subworkflows/local/selfcomp.nf @@ -26,107 +26,133 @@ workflow SELFCOMP { main: ch_versions = Channel.empty() - - // + + // // MODULE: SPLITS INPUT FASTA INTO 500KB CHUNKS // EMITS CHUNKED FASTA // - SELFCOMP_SPLITFASTA(reference_tuple) - ch_versions = ch_versions.mix(SELFCOMP_SPLITFASTA.out.versions) + SELFCOMP_SPLITFASTA( + reference_tuple + ) + ch_versions = ch_versions.mix( SELFCOMP_SPLITFASTA.out.versions ) // // MODULE: SPLIT INPUT FASTA INTO 1GB CHUNKS // EMITS CHUNKED FASTA // - CHUNKFASTA(SELFCOMP_SPLITFASTA.out.fa, mummer_chunk) - ch_versions = ch_versions.mix(CHUNKFASTA.out.versions) + CHUNKFASTA( + SELFCOMP_SPLITFASTA.out.fa, + mummer_chunk + ) + ch_versions = ch_versions.mix( CHUNKFASTA.out.versions ) // // LOGIC: CONVERTS ABOVE OUTPUTS INTO A SINGLE TUPLE // ch_query_tup = CHUNKFASTA.out.fas - .map{ meta, query -> - [query] + .map{ meta, query -> + [query] } .flatten() ch_ref = SELFCOMP_SPLITFASTA.out.fa - .map{ meta, ref -> - ref + .map{ meta, ref -> + ref } ch_mummer_input = ch_query_tup .combine(ch_ref) - .map{ query, ref -> - tuple([id: query.toString().split('/')[-1] ], - ref, - query - ) + .map{ query, ref -> + tuple([ id: query.toString().split('/')[-1] ], + ref, + query + ) } // // MODULE: ALIGNS 1GB CHUNKS TO 500KB CHUNKS // EMITS MUMMER ALIGNMENT FILE // - MUMMER( ch_mummer_input ) - ch_versions = ch_versions.mix(MUMMER.out.versions) + MUMMER( + ch_mummer_input + ) + ch_versions = ch_versions.mix( MUMMER.out.versions ) // // LOGIC: GROUPS OUTPUT INTO SINGLE TUPLE BASED ON REFERENCE META // MUMMER.out.coords - .combine(reference_tuple) - .map { coords_meta, coords, ref_meta, ref -> - tuple( ref_meta, - coords - ) + .combine( reference_tuple ) + .map { coords_meta, coords, ref_meta, ref -> + tuple( ref_meta, + coords + ) } - .groupTuple(by:[0]) + .groupTuple( by:[0] ) .set{ ch_mummer_files } // // MODULE: MERGES MUMMER ALIGNMENT FILES // - CONCATMUMMER(ch_mummer_files) - ch_versions = ch_versions.mix(CONCATMUMMER.out.versions) + CONCATMUMMER( + ch_mummer_files + ) + ch_versions = ch_versions.mix( CONCATMUMMER.out.versions ) // // MODULE: CONVERT THE MUMMER ALIGNMENTS INTO BED FORMAT // - SELFCOMP_MUMMER2BED(CONCATMUMMER.out.mummer, motif_len) - ch_versions = ch_versions.mix(SELFCOMP_MUMMER2BED.out.versions) + SELFCOMP_MUMMER2BED( + CONCATMUMMER.out.mummer, + motif_len + ) + ch_versions = ch_versions.mix( SELFCOMP_MUMMER2BED.out.versions ) // // MODULE: GENERATE A LIST OF IDs AND GENOMIC POSITIONS OF SELFCOMPLEMENTARY REGIONS // EMITS BED FILE // - SELFCOMP_MAPIDS(SELFCOMP_MUMMER2BED.out.bedfile, SELFCOMP_SPLITFASTA.out.agp) - ch_versions = ch_versions.mix(SELFCOMP_MAPIDS.out.versions) + SELFCOMP_MAPIDS( + SELFCOMP_MUMMER2BED.out.bedfile, + SELFCOMP_SPLITFASTA.out.agp + ) + ch_versions = ch_versions.mix( SELFCOMP_MAPIDS.out.versions ) // // MODULE: SORTS ABOVE OUTPUT BED FILE AND RETAINS BED SUFFIX // - BEDTOOLS_SORT(SELFCOMP_MAPIDS.out.bedfile, []) - ch_versions = ch_versions.mix(BEDTOOLS_SORT.out.versions) + BEDTOOLS_SORT( + SELFCOMP_MAPIDS.out.bedfile, + [] + ) + ch_versions = ch_versions.mix( BEDTOOLS_SORT.out.versions ) // // MODULE: BUILD ALIGNMENT BLOCKS // - SELFCOMP_ALIGNMENTBLOCKS(BEDTOOLS_SORT.out.sorted) - ch_versions = ch_versions.mix(SELFCOMP_ALIGNMENTBLOCKS.out.versions) + SELFCOMP_ALIGNMENTBLOCKS( + BEDTOOLS_SORT.out.sorted + ) + ch_versions = ch_versions.mix( SELFCOMP_ALIGNMENTBLOCKS.out.versions ) // // MODULE: SORT BLOCKS FILES AND FILTER BY MOTIF LENGTH // - CONCATBLOCKS(SELFCOMP_ALIGNMENTBLOCKS.out.blockfile) - ch_versions = ch_versions.mix(CONCATBLOCKS.out.versions) + CONCATBLOCKS( + SELFCOMP_ALIGNMENTBLOCKS.out.blockfile + ) + ch_versions = ch_versions.mix( CONCATBLOCKS.out.versions ) // // MODULE: CONVERTS ABOVE OUTPUT INTO BIGBED FORMAT // - UCSC_BEDTOBIGBED(CONCATBLOCKS.out.chainfile, dot_genome.map{it[1]}, selfcomp_as) - ch_versions = ch_versions.mix(UCSC_BEDTOBIGBED.out.versions) + UCSC_BEDTOBIGBED( + CONCATBLOCKS.out.chainfile, + dot_genome.map{it[1]}, // Pulls file from tuple ( meta and file ) + selfcomp_as + ) + ch_versions = ch_versions.mix( UCSC_BEDTOBIGBED.out.versions ) emit: ch_bigbed = UCSC_BEDTOBIGBED.out.bigbed diff --git a/subworkflows/local/synteny.nf b/subworkflows/local/synteny.nf index 04b021a6..3c631887 100755 --- a/subworkflows/local/synteny.nf +++ b/subworkflows/local/synteny.nf @@ -13,23 +13,26 @@ workflow SYNTENY { assembly_classT // Channel val(meta) main: - ch_versions = Channel.empty() + ch_versions = Channel.empty() // // MODULE: SEARCHES PREDETERMINED PATH FOR SYNTENIC GENOME FILES BASED ON CLASS // EMITS PATH LIST // - GET_SYNTENY_GENOMES(synteny_path, assembly_classT) - ch_versions = ch_versions.mix( GET_SYNTENY_GENOMES.out.versions ) + GET_SYNTENY_GENOMES( + synteny_path, + assembly_classT + ) + ch_versions = ch_versions.mix( GET_SYNTENY_GENOMES.out.versions ) // // LOGIC: GENERATES LIST OF GENOMES IN PATH AND BRANCHES ON WHETHER THERE IS DATA // GET_SYNTENY_GENOMES.out.genome_path .flatten() - .branch { data -> - run: !data.toString().contains("empty") - skip: data.toString().contains("empty") + .branch { data -> + run : !data.toString().contains("empty") + skip : data.toString().contains("empty") } .set { mm_intermediary } @@ -37,26 +40,29 @@ workflow SYNTENY { // LOGIC: COMBINE WITH ABOVE .RUN CHANNEL ADD BOOLEANS FOR MINIMAP // reference_tuple - .combine(mm_intermediary.run) - .map { meta, fa, ref -> - tuple([ id: meta.id, - single_end: true], - fa, ref, false, true, false) - } - .set { mm_input } + .combine( mm_intermediary.run ) + .multiMap { meta, syntenic_ref, ref -> + syntenic_tuple : tuple( meta, syntenic_ref ) + reference_fa : ref + bool_bam_output : false + bool_cigar_paf : true + bool_cigar_bam : false + } + .set { mm_input } // // MODULE: ALIGNS THE SUNTENIC GENOMES TO THE REFERENCE GENOME // EMITS ALIGNED PAF FILE // - MINIMAP2_ALIGN( mm_input.map { [it[0], it[1]] }, - mm_input.map { it[2] }, - mm_input.map { it[3] }, - mm_input.map { it[4] }, - mm_input.map { it[5] } + MINIMAP2_ALIGN( + mm_input.syntenic_tuple, + mm_input.reference_fa, + mm_input.bool_bam_output, + mm_input.bool_cigar_paf, + mm_input.bool_cigar_bam ) ch_versions = ch_versions.mix( MINIMAP2_ALIGN.out.versions ) - + emit: ch_paf = MINIMAP2_ALIGN.out.paf versions = ch_versions.ifEmpty(null) diff --git a/subworkflows/local/telo_finder.nf b/subworkflows/local/telo_finder.nf index 56e95e76..3ecd3048 100644 --- a/subworkflows/local/telo_finder.nf +++ b/subworkflows/local/telo_finder.nf @@ -45,15 +45,16 @@ workflow TELO_FINDER { // // LOGIC: Adding the largest scaffold size to the meta data so it can be used in the modules.config - // + // EXTRACT_TELO.out.bed .combine(max_scaff_size) - .map {meta, row, scaff -> - tuple([ id : meta.id, - max_scaff : scaff >= 500000000 ? 'csi': '' - ], - file(row) - )} + .map {meta, row, scaff -> + tuple( + [ id : meta.id, + max_scaff : scaff >= 500000000 ? 'csi': '' ], + file( row ) + ) + } .set { modified_bed_ch } // @@ -62,6 +63,7 @@ workflow TELO_FINDER { TABIX_BGZIPTABIX ( modified_bed_ch ) + ch_versions = ch_versions.mix( TABIX_BGZIPTABIX.out.versions ) emit: bedgraph_file = EXTRACT_TELO.out.bed diff --git a/workflows/treeval.nf b/workflows/treeval.nf index 482a16e3..15644c42 100644 --- a/workflows/treeval.nf +++ b/workflows/treeval.nf @@ -59,9 +59,9 @@ workflow TREEVAL { // // PRE-PIPELINE CHANNEL SETTING - channel setting for required files // - ch_versions = Channel.empty() + ch_versions = Channel.empty() - input_ch = Channel.fromPath(params.input, checkIfExists: true) + input_ch = Channel.fromPath(params.input, checkIfExists: true) Channel .fromPath( "${projectDir}/assets/gene_alignment/assm_*.as", checkIfExists: true) @@ -90,31 +90,35 @@ workflow TREEVAL { // // SUBWORKFLOW: reads the yaml and pushing out into a channel per yaml field // - YAML_INPUT ( input_ch ) + YAML_INPUT ( + input_ch + ) // // SUBWORKFLOW: Takes input fasta file and sample ID to generate a my.genome file // - GENERATE_GENOME ( YAML_INPUT.out.assembly_id, - YAML_INPUT.out.reference + GENERATE_GENOME ( + YAML_INPUT.out.assembly_id, + YAML_INPUT.out.reference ) - ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) + ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) // // SUBWORKFLOW: Takes reference, channel of enzymes, my.genome, assembly_id and as file to generate // file with enzymatic digest sites. // - ch_enzyme = Channel.of( "bspq1","bsss1","DLE1" ) + ch_enzyme = Channel.of( "bspq1","bsss1","DLE1" ) - INSILICO_DIGEST ( YAML_INPUT.out.assembly_id, - GENERATE_GENOME.out.dot_genome, - GENERATE_GENOME.out.reference_tuple, - ch_enzyme, - digest_asfile + INSILICO_DIGEST ( + YAML_INPUT.out.assembly_id, + GENERATE_GENOME.out.dot_genome, + GENERATE_GENOME.out.reference_tuple, + ch_enzyme, + digest_asfile ) - ch_versions = ch_versions.mix(INSILICO_DIGEST.out.versions) + ch_versions = ch_versions.mix(INSILICO_DIGEST.out.versions) // // SUBWORKFLOW: FOR SPLITTING THE REF GENOME INTO SCAFFOLD CHUNKS AND RUNNING SOME SUBWORKFLOWS @@ -129,74 +133,82 @@ workflow TREEVAL { // // SUBWORKFLOW: Takes input fasta to generate BB files containing alignment data // - GENE_ALIGNMENT ( GENERATE_GENOME.out.dot_genome, - GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.ref_index, - GENERATE_GENOME.out.max_scaff_size, - YAML_INPUT.out.assembly_classT, - YAML_INPUT.out.align_data_dir, - YAML_INPUT.out.align_geneset, - YAML_INPUT.out.align_common, - YAML_INPUT.out.intron_size, - gene_alignment_asfiles + GENE_ALIGNMENT ( + GENERATE_GENOME.out.dot_genome, + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.ref_index, + GENERATE_GENOME.out.max_scaff_size, + YAML_INPUT.out.assembly_classT, + YAML_INPUT.out.align_data_dir, + YAML_INPUT.out.align_geneset, + YAML_INPUT.out.align_common, + YAML_INPUT.out.intron_size, + gene_alignment_asfiles ) - ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) + ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) // // SUBWORKFLOW: GENERATES A BIGWIG FOR A REPEAT DENSITY TRACK // - REPEAT_DENSITY ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.dot_genome + REPEAT_DENSITY ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.dot_genome ) - ch_versions = ch_versions.mix(REPEAT_DENSITY.out.versions) + ch_versions = ch_versions.mix(REPEAT_DENSITY.out.versions) // // SUBWORKFLOW: GENERATES A GAP.BED FILE TO ID THE LOCATIONS OF GAPS // - GAP_FINDER ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.max_scaff_size + GAP_FINDER ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.max_scaff_size ) - ch_versions = ch_versions.mix(GAP_FINDER.out.versions) + ch_versions = ch_versions.mix(GAP_FINDER.out.versions) // // SUBWORKFLOW: Takes reference file, .genome file, mummer variables, motif length variable and as // file to generate a file containing sites of self-complementary sequnce. // - SELFCOMP ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.dot_genome, - YAML_INPUT.out.mummer_chunk, - YAML_INPUT.out.motif_len, - selfcomp_asfile ) - ch_versions = ch_versions.mix(SELFCOMP.out.versions) + SELFCOMP ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.dot_genome, + YAML_INPUT.out.mummer_chunk, + YAML_INPUT.out.motif_len, + selfcomp_asfile + ) + ch_versions = ch_versions.mix(SELFCOMP.out.versions) // // SUBWORKFLOW: Takes reference, the directory of syntenic genomes and order/clade of sequence // and generated a file of syntenic blocks. // - SYNTENY ( GENERATE_GENOME.out.reference_tuple, - YAML_INPUT.out.synteny_path, - YAML_INPUT.out.assembly_classT + SYNTENY ( + GENERATE_GENOME.out.reference_tuple, + YAML_INPUT.out.synteny_path, + YAML_INPUT.out.assembly_classT ) - ch_versions = ch_versions.mix(SYNTENY.out.versions) + ch_versions = ch_versions.mix(SYNTENY.out.versions) // // SUBWORKFLOW: Takes reference, pacbio reads // - LONGREAD_COVERAGE ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.dot_genome, - YAML_INPUT.out.pacbio_reads, - YAML_INPUT.out.assembly_sizeClass + LONGREAD_COVERAGE ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.dot_genome, + YAML_INPUT.out.pacbio_reads ) - ch_versions = ch_versions.mix(LONGREAD_COVERAGE.out.versions) + ch_versions = ch_versions.mix(LONGREAD_COVERAGE.out.versions) // // SUBWORKFLOW: GENERATE HIC MAPPING TO GENERATE PRETEXT FILES AND JUICEBOX // - HIC_MAPPING ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.ref_index, - GENERATE_GENOME.out.dot_genome, - YAML_INPUT.out.hic_reads) - ch_versions = ch_versions.mix(HIC_MAPPING.out.versions) + HIC_MAPPING ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.ref_index, + GENERATE_GENOME.out.dot_genome, + YAML_INPUT.out.hic_reads + ) + ch_versions = ch_versions.mix(HIC_MAPPING.out.versions) // // SUBWORKFLOW: GENERATE TELOMERE WINDOW FILES WITH PACBIO READS AND REFERENCE @@ -205,18 +217,19 @@ workflow TREEVAL { GENERATE_GENOME.out.reference_tuple, YAML_INPUT.out.teloseq ) - ch_versions = ch_versions.mix(TELO_FINDER.out.versions) + ch_versions = ch_versions.mix(TELO_FINDER.out.versions) // // SUBWORKFLOW: GENERATE BUSCO ANNOTATION FOR ANCESTRAL UNITS // - BUSCO_ANNOTATION ( GENERATE_GENOME.out.dot_genome, - GENERATE_GENOME.out.reference_tuple, - YAML_INPUT.out.assembly_classT, - YAML_INPUT.out.lineageinfo, - YAML_INPUT.out.lineagespath, - buscogene_asfile, - ancestral_table + BUSCO_ANNOTATION ( + GENERATE_GENOME.out.dot_genome, + GENERATE_GENOME.out.reference_tuple, + YAML_INPUT.out.assembly_classT, + YAML_INPUT.out.lineageinfo, + YAML_INPUT.out.lineagespath, + buscogene_asfile, + ancestral_table ) ch_versions = ch_versions.mix(BUSCO_ANNOTATION.out.versions) @@ -228,8 +241,8 @@ workflow TREEVAL { ) emit: - software_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.yml - versions_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.versions + software_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.yml + versions_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.versions } /* diff --git a/workflows/treeval_rapid.nf b/workflows/treeval_rapid.nf index 36c27fc1..b74f3925 100644 --- a/workflows/treeval_rapid.nf +++ b/workflows/treeval_rapid.nf @@ -50,9 +50,9 @@ include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoft workflow TREEVAL_RAPID { main: - ch_versions = Channel.empty() + ch_versions = Channel.empty() - input_ch = Channel.fromPath(params.input, checkIfExists: true) + input_ch = Channel.fromPath(params.input, checkIfExists: true) // // SUBWORKFLOW: reads the yaml and pushing out into a channel per yaml field // @@ -61,54 +61,60 @@ workflow TREEVAL_RAPID { // // SUBWORKFLOW: Takes input fasta file and sample ID to generate a my.genome file // - GENERATE_GENOME ( YAML_INPUT.out.assembly_id, - YAML_INPUT.out.reference + GENERATE_GENOME ( + YAML_INPUT.out.assembly_id, + YAML_INPUT.out.reference ) - ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) + ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) // // SUBWORKFLOW: GENERATES A BIGWIG FOR A REPEAT DENSITY TRACK // - REPEAT_DENSITY ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.dot_genome + REPEAT_DENSITY ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.dot_genome ) - ch_versions = ch_versions.mix(REPEAT_DENSITY.out.versions) + ch_versions = ch_versions.mix(REPEAT_DENSITY.out.versions) // // SUBWORKFLOW: GENERATES A GAP.BED FILE TO ID THE LOCATIONS OF GAPS // - GAP_FINDER ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.max_scaff_size + GAP_FINDER ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.max_scaff_size ) - ch_versions = ch_versions.mix(GAP_FINDER.out.versions) + ch_versions = ch_versions.mix(GAP_FINDER.out.versions) // // SUBWORKFLOW: GENERATE TELOMERE WINDOW FILES WITH PACBIO READS AND REFERENCE // - TELO_FINDER ( GENERATE_GENOME.out.max_scaff_size, - GENERATE_GENOME.out.reference_tuple, - YAML_INPUT.out.teloseq + TELO_FINDER ( + GENERATE_GENOME.out.max_scaff_size, + GENERATE_GENOME.out.reference_tuple, + YAML_INPUT.out.teloseq ) - ch_versions = ch_versions.mix(TELO_FINDER.out.versions) + ch_versions = ch_versions.mix(TELO_FINDER.out.versions) // // SUBWORKFLOW: GENERATE HIC MAPPING TO GENERATE PRETEXT FILES AND JUICEBOX // - HIC_MAPPING ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.ref_index, - GENERATE_GENOME.out.dot_genome, - YAML_INPUT.out.hic_reads) - ch_versions = ch_versions.mix(HIC_MAPPING.out.versions) + HIC_MAPPING ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.ref_index, + GENERATE_GENOME.out.dot_genome, + YAML_INPUT.out.hic_reads + ) + ch_versions = ch_versions.mix(HIC_MAPPING.out.versions) // // SUBWORKFLOW: Takes reference, pacbio reads // - LONGREAD_COVERAGE ( GENERATE_GENOME.out.reference_tuple, - GENERATE_GENOME.out.dot_genome, - YAML_INPUT.out.pacbio_reads, - YAML_INPUT.out.assembly_sizeClass + LONGREAD_COVERAGE ( + GENERATE_GENOME.out.reference_tuple, + GENERATE_GENOME.out.dot_genome, + YAML_INPUT.out.pacbio_reads ) - ch_versions = ch_versions.mix(LONGREAD_COVERAGE.out.versions) + ch_versions = ch_versions.mix(LONGREAD_COVERAGE.out.versions) // // SUBWORKFLOW: Collates version data from prior subworflows @@ -118,8 +124,8 @@ workflow TREEVAL_RAPID { ) emit: - software_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.yml - versions_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.versions + software_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.yml + versions_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.versions } /* From 8731a277ed9b1b2e127aa6251f8a59a03cbf26da Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 24 Jul 2023 16:50:54 +0100 Subject: [PATCH 43/85] completing fixes for gap.bedgraph --- modules/local/gap_length.nf | 2 +- subworkflows/local/gap_finder.nf | 10 +++++----- subworkflows/local/nuc_alignments.nf | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/local/gap_length.nf b/modules/local/gap_length.nf index 8ad256a2..10625610 100644 --- a/modules/local/gap_length.nf +++ b/modules/local/gap_length.nf @@ -11,7 +11,7 @@ process GAP_LENGTH { tuple val( meta ), path( file ) output: - tuple val( meta ), file( "*bed" ) , emit: bed + tuple val( meta ), file( "*bed" ) , emit: bedgraph path "versions.yml" , emit: versions shell: diff --git a/subworkflows/local/gap_finder.nf b/subworkflows/local/gap_finder.nf index 89c59d01..f03f7fab 100644 --- a/subworkflows/local/gap_finder.nf +++ b/subworkflows/local/gap_finder.nf @@ -27,17 +27,17 @@ workflow GAP_FINDER { // MODULE: ADD THE LENGTH OF GAP TO BED FILE - INPUT FOR PRETEXT MODULE // GAP_LENGTH ( - SEQTK_CUTN.out.bed + SEQTK_CUTN.out.bedgraph ) ch_versions = ch_versions.mix( GAP_LENGTH.out.versions ) // // LOGIC: Adding the largest scaffold size to the meta data so it can be used in the modules.config - // + // SEQTK_CUTN.out.bed .combine(max_scaff_size) - .map {meta, row, scaff -> - tuple([ id : meta.id, + .map {meta, row, scaff -> + tuple([ id : meta.id, max_scaff : scaff >= 500000000 ? 'csi': '' ], file(row) @@ -53,7 +53,7 @@ workflow GAP_FINDER { ch_versions = ch_versions.mix( TABIX_BGZIPTABIX.out.versions ) emit: - gap_file = GAP_LENGTH.out.bed + gap_file = GAP_LENGTH.out.bedgraph gap_tabix = TABIX_BGZIPTABIX.out.gz_csi versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/nuc_alignments.nf b/subworkflows/local/nuc_alignments.nf index 0629b0eb..8d13b8f1 100644 --- a/subworkflows/local/nuc_alignments.nf +++ b/subworkflows/local/nuc_alignments.nf @@ -84,7 +84,7 @@ workflow NUC_ALIGNMENTS { [ id: meta.org, type: meta.type ], file) } - .groupTuple( by: [0] ) + .groupTuple( by: [0] ) // group by meta list .set { merge_input } // From 931557f418edc4db78c08c2a19390ea52115911a Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 25 Jul 2023 12:53:23 +0100 Subject: [PATCH 44/85] Changing buffer size to a sum of task.memory.toGiga() / 2 this makes it dynamic and more inline with nf-core --- modules/local/bamtobed_sort.nf | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/local/bamtobed_sort.nf b/modules/local/bamtobed_sort.nf index fe46b62b..3af4fbc4 100644 --- a/modules/local/bamtobed_sort.nf +++ b/modules/local/bamtobed_sort.nf @@ -14,10 +14,11 @@ process BAMTOBED_SORT { path "versions.yml" , emit: versions script: - def prefix = args.ext.prefix ?: "${meta.id}" - def st_cores = task.cpus > 4 ? 4 : "${task.cpus}" + def prefix = args.ext.prefix ?: "${meta.id}" + def st_cores = task.cpus > 4 ? 4 : "${task.cpus}" + def buffer_mem = task.memory.toGiga() / 2 """ - samtools view -@${st_cores} -u -F0x400 ${bam} | bamToBed | sort -k4 --parallel=${task.cpus} -S 50G > ${prefix}_merged_sorted.bed + samtools view -@${st_cores} -u -F0x400 ${bam} | bamToBed | sort -k4 --parallel=${task.cpus} -S ${buffer_mem}G > ${prefix}_merged_sorted.bed cat <<-END_VERSIONS > versions.yml "${task.process}": From 1727a9d2f736964116fa1bde4ba3bf1026572e6b Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 25 Jul 2023 12:54:20 +0100 Subject: [PATCH 45/85] Fixing issues with incorrect index usage with samtool_merge and other issues --- README.md | 14 +++ conf/base.config | 4 + conf/modules.config | 4 + modules.json | 141 ++++++++++++++++++------ modules/local/gap_length.nf | 2 +- modules/local/generate_genome_file.nf | 6 +- subworkflows/local/gap_finder.nf | 2 +- subworkflows/local/generate_genome.nf | 28 ++--- subworkflows/local/longread_coverage.nf | 25 +++-- subworkflows/local/yaml_input.nf | 2 - 10 files changed, 159 insertions(+), 69 deletions(-) diff --git a/README.md b/README.md index ffa569f0..164e0287 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,20 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool The treeval pipeline has a sister pipeline currently named [curationpretext](https://github.com/sanger-tol/curationpretext) which acts to regenerate the pretext maps and accessory files during genomic curation in order to confirm interventions. This pipeline is sufficiently different to the treeval implementation that it is written as it's own pipeline. +1. Parse input yaml (YAML_INPUT) +2. Generate my.genome file (GENERATE_GENOME) +3. Generate insilico digests of the input assembly (INSILICO_DIGEST) +4. Generate gene alignments with high quality data against the input assembly (GENE_ALIGNMENT) +5. Generate a repeat density graph (REPEAT_DENSITY) +6. Generate a gap track (GAP_FINDER) +7. Generate a map of self complementary sequence (SELFCOMP) +8. Generate syntenic alignments with a closely related high quality assembly (SYNTENY) +9. Generate a coverage track using PacBio data (LONGREAD_COVERAGE) +10. Generate HiC maps, pretext and higlass using HiC cram files (HIC_MAPPING) +11. Generate a telomere track based on input motif (TELO_FINDER) +12. Run Busco and convert results into bed format (BUSCO_ANNOTATION) +13. Ancestral Busco linkage if available for clade (BUSCO_ANNOTATION:ANCESTRAL_GENE) + ## Usage > **Note** diff --git a/conf/base.config b/conf/base.config index 916ca618..1cc88bfa 100644 --- a/conf/base.config +++ b/conf/base.config @@ -103,6 +103,10 @@ process { time = { check_max( 24.h * task.attempt, 'time' ) } } + withName: '.*:.*:LONGREAD_COVERAGE:SAMTOOLS_SORT' { + cpus = { check_max( 8 * 1, 'cpus' ) } + } + // 25GB * (task attempt * 2) = 50GB, 100GB, 150GB withName:MUMMER { cpus = { check_max( 12 * task.attempt, 'cpus' ) } diff --git a/conf/modules.config b/conf/modules.config index 391c7148..bd041e52 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -151,6 +151,10 @@ process { ext.prefix = { "${meta.id}_merge" } } + withName: '.*:.*:LONGREAD_COVERAGE:SAMTOOLS_SORT' { + ext.prefix = { "${meta.id}_sorted" } + } + withName: '.*:.*:LONGREAD_COVERAGE:SAMTOOLS_VIEW' { ext.args = "-b -hF 256" ext.prefix = { "${meta.id}_view" } diff --git a/modules.json b/modules.json index f68c3305..cf5ba17e 100644 --- a/modules.json +++ b/modules.json @@ -8,168 +8,241 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] + }, + "custom/getchromsizes": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -178,4 +251,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/local/gap_length.nf b/modules/local/gap_length.nf index 10625610..9240de0e 100644 --- a/modules/local/gap_length.nf +++ b/modules/local/gap_length.nf @@ -11,7 +11,7 @@ process GAP_LENGTH { tuple val( meta ), path( file ) output: - tuple val( meta ), file( "*bed" ) , emit: bedgraph + tuple val( meta ), file( "*bedgraph" ) , emit: bedgraph path "versions.yml" , emit: versions shell: diff --git a/modules/local/generate_genome_file.nf b/modules/local/generate_genome_file.nf index dc5629ae..44e238e2 100644 --- a/modules/local/generate_genome_file.nf +++ b/modules/local/generate_genome_file.nf @@ -11,13 +11,15 @@ process GENERATE_GENOME_FILE { tuple val( meta ), path( fai ) output: - tuple val( meta ), file( "my.genome" ) , emit: dotgenome + tuple val( meta ), file( "*.genome" ) , emit: dotgenome path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "my" def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ - awk -F"\t" '{print \$1"\t"\$2}' $fai |sort -k2,2 -nr > my.genome + awk -F"\t" '{print \$1"\t"\$2}' $fai |sort ${args} > ${prefix}.genome cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/gap_finder.nf b/subworkflows/local/gap_finder.nf index f03f7fab..3c51e530 100644 --- a/subworkflows/local/gap_finder.nf +++ b/subworkflows/local/gap_finder.nf @@ -27,7 +27,7 @@ workflow GAP_FINDER { // MODULE: ADD THE LENGTH OF GAP TO BED FILE - INPUT FOR PRETEXT MODULE // GAP_LENGTH ( - SEQTK_CUTN.out.bedgraph + SEQTK_CUTN.out.bed ) ch_versions = ch_versions.mix( GAP_LENGTH.out.versions ) diff --git a/subworkflows/local/generate_genome.nf b/subworkflows/local/generate_genome.nf index 79d9868f..d7a37e03 100755 --- a/subworkflows/local/generate_genome.nf +++ b/subworkflows/local/generate_genome.nf @@ -4,7 +4,7 @@ // MODULE IMPORT BLOCK // include { SAMTOOLS_FAIDX } from '../../modules/nf-core/samtools/faidx/main' -include { GENERATE_GENOME_FILE } from '../../modules/local/generate_genome_file' +include { CUSTOM_GETCHROMSIZES } from '../../modules/nf-core/custom/getchromsizes/main' include { GET_LARGEST_SCAFF } from '../../modules/local/get_largest_scaff' workflow GENERATE_GENOME { @@ -24,39 +24,31 @@ workflow GENERATE_GENOME { tuple ([id: sample_id], file) } - .set { to_samtools } + .set { to_chromsize } // // MODULE: GENERATE INDEX OF REFERENCE - // EMITS REFERENCE INDEX FILE + // EMITS REFERENCE INDEX FILE MODIFIED FOR SCAFF SIZES // - SAMTOOLS_FAIDX ( - to_samtools, - [[],[]] + CUSTOM_GETCHROMSIZES ( + to_chromsize ) - ch_versions = ch_versions.mix( SAMTOOLS_FAIDX.out.versions ) + ch_versions = ch_versions.mix( CUSTOM_GETCHROMSIZES.out.versions ) - // - // MODULE: TRIMS INDEX INTO A GENOME DESCRIPTION FILE - // EMITS REFERENCE GEOME FILE AND REFERENCE INDEX FILE - GENERATE_GENOME_FILE ( - SAMTOOLS_FAIDX.out.fai - ) - ch_versions = ch_versions.mix( GENERATE_GENOME_FILE.out.versions ) // // MODULE: Cut out the largest scaffold size and use as comparator against 512MB // This is the cut off for TABIX using tbi indexes // GET_LARGEST_SCAFF ( - GENERATE_GENOME_FILE.out.dotgenome + CUSTOM_GETCHROMSIZES.out.sizes ) ch_versions = ch_versions.mix( GET_LARGEST_SCAFF.out.versions ) emit: max_scaff_size = GET_LARGEST_SCAFF.out.scaff_size.toInteger() - dot_genome = GENERATE_GENOME_FILE.out.dotgenome - ref_index = SAMTOOLS_FAIDX.out.fai - reference_tuple = to_samtools + dot_genome = CUSTOM_GETCHROMSIZES.out.sizes + ref_index = CUSTOM_GETCHROMSIZES.out.fai + reference_tuple = to_chromsize versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index d38c26d8..c0eb72a3 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -24,9 +24,9 @@ include { FINDHALFCOVERAGE } from '../../modules/local/ workflow LONGREAD_COVERAGE { take: - reference_tuple // Channel: [ val(meta), path(reference_file) ] - dot_genome // Channel: [ val(meta), [ path(datafile) ] ] - reads_path // Channel: [ val(meta), val( str ) ] + reference_tuple // Channel: [ val(meta), file( reference_file ) ] + dot_genome // Channel: [ val(meta), [ file( datafile ) ] ] + reads_path // Channel: [ val(meta), val( str ) ] main: ch_versions = Channel.empty() @@ -168,26 +168,29 @@ workflow LONGREAD_COVERAGE { SAMTOOLS_MERGE( collected_files_for_merge, reference_tuple, - MINIMAP2_INDEX.out.index + [[],[]] ) ch_versions = ch_versions.mix(SAMTOOLS_MERGE.out.versions) - // TODO: ADD THIS - // samtools sort -@ 8 merged.bam > sort.bam - // SAMTOOLS_SORT ( view_input ) + // + // MODULE: SORT THE MERGED BAM BEFORE CONVERSION + // + SAMTOOLS_SORT ( + SAMTOOLS_MERGE.out.bam + ) + ch_versions = ch_versions.mix( SAMTOOLS_MERGE.out.versions ) // // LOGIC: PREPARING MERGE INPUT WITH REFERENCE GENOME AND REFERENCE INDEX // - SAMTOOLS_MERGE.out.bam + SAMTOOLS_SORT.out.bam .combine( reference_tuple ) - .combine( MINIMAP2_INDEX.out.index ) - .multiMap { meta, file, ref_meta, ref, ref_index_meta, ref_index -> + .multiMap { meta, file, ref_meta, ref -> bam_input : tuple( [ id : meta.id, single_end : true ], file, - ref_index + [] // As we aren't using an index file here ) ref_input : tuple( ref_meta, diff --git a/subworkflows/local/yaml_input.nf b/subworkflows/local/yaml_input.nf index 016faefd..b7ee3095 100644 --- a/subworkflows/local/yaml_input.nf +++ b/subworkflows/local/yaml_input.nf @@ -38,7 +38,6 @@ workflow YAML_INPUT { .assembly .multiMap { data -> level: data.level - size_c: data.sizeClass sample_id: data.sample_id classT: data.classT asmVersion: data.asmVersion @@ -110,7 +109,6 @@ workflow YAML_INPUT { emit: assembly_id = tolid_version - assembly_sizeClass = assembly_data.size_c assembly_classT = assembly_data.classT assembly_level = assembly_data.level assembly_asmVer = assembly_data.asmVersion From 315e0b61fd31ba47993c8bdcc5927f721a22a3a6 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 25 Jul 2023 12:55:14 +0100 Subject: [PATCH 46/85] Replacing generate_genome_file and samtools with CUSTOM_GETCHROMSIZES --- modules/nf-core/custom/getchromsizes/main.nf | 44 +++++++++++++++ modules/nf-core/custom/getchromsizes/meta.yml | 53 +++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100644 modules/nf-core/custom/getchromsizes/main.nf create mode 100644 modules/nf-core/custom/getchromsizes/meta.yml diff --git a/modules/nf-core/custom/getchromsizes/main.nf b/modules/nf-core/custom/getchromsizes/main.nf new file mode 100644 index 00000000..060a2e88 --- /dev/null +++ b/modules/nf-core/custom/getchromsizes/main.nf @@ -0,0 +1,44 @@ +process CUSTOM_GETCHROMSIZES { + tag "$fasta" + label 'process_single' + + conda "bioconda::samtools=1.16.1" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.16.1--h6899075_1' : + 'biocontainers/samtools:1.16.1--h6899075_1' }" + + input: + tuple val(meta), path(fasta) + + output: + tuple val(meta), path ("*.sizes"), emit: sizes + tuple val(meta), path ("*.fai") , emit: fai + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + samtools faidx $fasta + cut -f 1,2 ${fasta}.fai > ${fasta}.sizes + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + getchromsizes: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + """ + touch ${fasta}.fai + touch ${fasta}.sizes + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + getchromsizes: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/custom/getchromsizes/meta.yml b/modules/nf-core/custom/getchromsizes/meta.yml new file mode 100644 index 00000000..219ca1d8 --- /dev/null +++ b/modules/nf-core/custom/getchromsizes/meta.yml @@ -0,0 +1,53 @@ +name: custom_getchromsizes +description: Generates a FASTA file of chromosome sizes and a fasta index file +keywords: + - fasta + - chromosome + - indexing +tools: + - samtools: + description: Tools for dealing with SAM, BAM and CRAM files + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + tool_dev_url: https://github.com/samtools/samtools + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: FASTA file + pattern: "*.{fa,fasta,fna,fas}" + +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - sizes: + type: file + description: File containing chromosome lengths + pattern: "*.{sizes}" + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" + - gzi: + type: file + description: Optional gzip index file for compressed inputs + pattern: "*.gzi" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@tamara-hodgetts" + - "@chris-cheshire" + - "@muffato" From bf60d970fb75372227ef17bd4c65df997f12ae07 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 25 Jul 2023 12:55:52 +0100 Subject: [PATCH 47/85] Replacing generate_genome_file and samtools with CUSTOM_GETCHROMSIZES --- modules/local/generate_genome_file.nf | 40 --------------------------- 1 file changed, 40 deletions(-) delete mode 100644 modules/local/generate_genome_file.nf diff --git a/modules/local/generate_genome_file.nf b/modules/local/generate_genome_file.nf deleted file mode 100644 index 44e238e2..00000000 --- a/modules/local/generate_genome_file.nf +++ /dev/null @@ -1,40 +0,0 @@ -process GENERATE_GENOME_FILE { - tag "${meta.id}" - label 'process_low' - - conda "conda-forge::coreutils=9.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'ubuntu:20.04' }" - - input: - tuple val( meta ), path( fai ) - - output: - tuple val( meta ), file( "*.genome" ) , emit: dotgenome - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "my" - def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - """ - awk -F"\t" '{print \$1"\t"\$2}' $fai |sort ${args} > ${prefix}.genome - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - coreutils: $VERSION - END_VERSIONS - """ - - stub: - def VERSION = "9.1" - """ - touch my.genome - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - coreutils: $VERSION - END_VERSIONS - """ -} From 363811a8773bfca411d10b1c1397eac5b6099c93 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 25 Jul 2023 14:34:38 +0100 Subject: [PATCH 48/85] Experimental groovy for providing context to resource usage --- lib/TreeValProject.groovy | 64 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 lib/TreeValProject.groovy diff --git a/lib/TreeValProject.groovy b/lib/TreeValProject.groovy new file mode 100644 index 00000000..4feec655 --- /dev/null +++ b/lib/TreeValProject.groovy @@ -0,0 +1,64 @@ +class TreeValProject { + + // + // Generate a summary file of input file data (size of files) + // Still in testing + // + + public static void summary(workflow, rf_data, pb_data, cm_data, summary_params, projectDir, params) { + + def input_data = [:] + input_data['version'] = NfcoreTemplate.version( workflow ) + input_data['runName'] = workflow.runName + input_data['session_id'] = workflow.sessionId + input_data['duration'] = workflow.duration + input_data['Date Started'] = workflow.start + input_data['Date Completed'] = workflow.complete + + input_data['sample_id'] = rf_data.map{ it[0].id } + input_data['taxonomic_class'] = rf_data.map{ it[0].ln } + input_data['ticket_type'] = rf_data.map{ it[0].tk } + input_data['input_asm'] = rf_data + input_data['input_pacbio'] = ( pb_data ?: 'None' ) + input_data['input_cram'] = ( cm_data ?: 'None' ) + + if (workflow.success) { + def time = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') + + def output_directory = new File("${params.outdir}/pipeline_info/") + if (!output_directory.exists()) { + output_directory.mkdirs() + } + + def output_hf = new File(output_directory, "input_data_${time}.txt") + output_hf.withWriter { w -> w << input_data } + + new File( output_directory, "TreeVal_run_context_${time}.txt" ).withWriter { w -> + ["---INPUT_DATA---\n", + "${params.outdir}/pipeline_info/pipeline_execution_${time}.txt", + "---RESOURCE_STATS---\n", + "${params.outdir}/pipeline_info/input_data_${time}.txt"] + .each { f -> + new File( f ).withReader { r -> + w << r << '\n' + } + } + } + } + } + + // Should generate a file looking like: + // // // // // // // + // ---INPUT_DATA--- + // Version: {workflow.version} + // runName: {workflow.unName} + // duration: {workflow.duration} + // input_asm: [ [id, sz] file] + // pacbio_bam: [ [id, sz] file] + // cram_bam: [ [id, sz] file] + // ---RESOURCE_STATS--- + // process cpu cpu_usage mem mem_usage peak_usage + // MINIMAP2_ALIGN 16 1590% 60GB 50% 30GB + // .... + +} From c956bca150075c400f8bce3daa4695c073a7a038 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 25 Jul 2023 15:29:22 +0100 Subject: [PATCH 49/85] Fixes for misspelling, formatting and such --- nextflow.config | 2 +- subworkflows/local/hic_mapping.nf | 6 ++++- subworkflows/local/longread_coverage.nf | 9 +++++--- subworkflows/local/yaml_input.nf | 2 +- workflows/treeval.nf | 29 ++++++++++++++++++++++--- 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/nextflow.config b/nextflow.config index fcbcb820..9ae6f19e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -183,7 +183,7 @@ report { } trace { enabled = true - file = "${params.tracedir}/resource_trace_${trace_timestamp}.txt" + file = "${params.tracedir}/pipeline_execution_${trace_timestamp}.txt" fields = 'name,status,module,cpus,memory,attempt,realtime,%cpu,%mem,peak_rss' } dag { diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index 6b407d9c..dbf3e984 100644 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -131,7 +131,10 @@ workflow HIC_MAPPING { SAMTOOLS_MERGE.out.bam .combine( reference_tuple ) .multiMap { bam_meta, bam, ref_meta, ref_fa -> - input_bam: tuple(bam_meta, bam) + input_bam: tuple( [ id: bam_meta.id, + sz: file( bam ).size() ], + bam + ) reference: ref_fa } .set { pretext_input } @@ -264,5 +267,6 @@ workflow HIC_MAPPING { //highres_snpshot = SNAPSHOT_HRES.out.image mcool = COOLER_ZOOMIFY.out.mcool hic = JUICER_TOOLS_PRE.out.hic + ch_reporting = pretext_input.input_bam versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index c0eb72a3..b20746b3 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -183,13 +183,15 @@ workflow LONGREAD_COVERAGE { // // LOGIC: PREPARING MERGE INPUT WITH REFERENCE GENOME AND REFERENCE INDEX // + SAMTOOLS_SORT.out.bam.view() SAMTOOLS_SORT.out.bam .combine( reference_tuple ) - .multiMap { meta, file, ref_meta, ref -> + .multiMap { meta, bam, ref_meta, ref -> bam_input : tuple( [ id : meta.id, + sz : bam.size(), single_end : true ], - file, + bam, [] // As we aren't using an index file here ) ref_input : tuple( @@ -198,7 +200,7 @@ workflow LONGREAD_COVERAGE { ) } .set { view_input } - + view_input.bam_input.view() // // MODULE: EXTRACT READS FOR PRIMARY ASSEMBLY // @@ -333,6 +335,7 @@ workflow LONGREAD_COVERAGE { ch_halfbed = FINDHALFCOVERAGE.out.bed ch_maxbed = BEDTOOLS_MERGE_MAX.out.bed ch_bigwig = UCSC_BEDGRAPHTOBIGWIG.out.bigwig + ch_reporting = view_input.bam_input versions = ch_versions } diff --git a/subworkflows/local/yaml_input.nf b/subworkflows/local/yaml_input.nf index b7ee3095..ffe02e71 100644 --- a/subworkflows/local/yaml_input.nf +++ b/subworkflows/local/yaml_input.nf @@ -113,7 +113,7 @@ workflow YAML_INPUT { assembly_level = assembly_data.level assembly_asmVer = assembly_data.asmVersion assembly_dbVer = assembly_data.dbVersion - assembly_gtype = assembly_data.gevalType + assembly_ttype = assembly_data.gevalType pacbio_reads = assem_reads.pacbio hic_reads = assem_reads.hic diff --git a/workflows/treeval.nf b/workflows/treeval.nf index 15644c42..33fc979f 100644 --- a/workflows/treeval.nf +++ b/workflows/treeval.nf @@ -102,7 +102,7 @@ workflow TREEVAL { YAML_INPUT.out.reference ) - ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) + ch_versions = ch_versions.mix( GENERATE_GENOME.out.versions ) // // SUBWORKFLOW: Takes reference, channel of enzymes, my.genome, assembly_id and as file to generate @@ -118,7 +118,7 @@ workflow TREEVAL { ch_enzyme, digest_asfile ) - ch_versions = ch_versions.mix(INSILICO_DIGEST.out.versions) + ch_versions = ch_versions.mix( INSILICO_DIGEST.out.versions ) // // SUBWORKFLOW: FOR SPLITTING THE REF GENOME INTO SCAFFOLD CHUNKS AND RUNNING SOME SUBWORKFLOWS @@ -240,6 +240,28 @@ workflow TREEVAL { ch_versions.unique().collectFile(name: 'collated_versions.yml') ) + // + // LOGIC: GENERATE SOME CHANNELS FOR REPORTING + // + GENERATE_GENOME.out.reference_tuple + .combine( YAML_INPUT.out.assembly_classT ) + .combine( YAML_INPUT.out.assembly_ttype ) + .map { meta, reference, lineage, ticket -> + tuple( [id: meta.id, + sz: file(reference).size(), + ln: lineage, + tk: ticket ], + reference + ) + } + .set { rf_data } + + pb_data = LONGREAD_COVERAGE.out.ch_reporting // merged pacbio.bam data tuple( [ id, size ], file ) + cm_data = HIC_MAPPING.out.ch_reporting // merged cram.bam data tuple ( [ id, size ], file ) | Should really be a collected list of the raw cram + rf_data.view() + pb_data.view() + cm_data.view() + emit: software_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.yml versions_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.versions @@ -259,7 +281,8 @@ workflow.onComplete { if (params.hook_url) { NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) } - // TreeValProject.summary(workflow, reference_tuple, summary_params, projectDir) + + TreeValProject.summary(workflow, rf_data, pb_data, cm_data, summary_params, projectDir, params) } From bd2ef78eeee75b3ffee47c7d3dc2176fc4b6e691 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 25 Jul 2023 15:34:46 +0100 Subject: [PATCH 50/85] Prettier Formatting --- modules.json | 138 +++++++++++++-------------------------------------- 1 file changed, 35 insertions(+), 103 deletions(-) diff --git a/modules.json b/modules.json index cf5ba17e..9c5592d5 100644 --- a/modules.json +++ b/modules.json @@ -8,241 +8,173 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -251,4 +183,4 @@ } } } -} \ No newline at end of file +} From da4a37c05656f699fc957555f6985e4ca50bb602 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 26 Jul 2023 16:49:16 +0100 Subject: [PATCH 51/85] Finished the reporting script --- lib/TreeValProject.groovy | 53 +++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 24 deletions(-) mode change 100644 => 100755 lib/TreeValProject.groovy diff --git a/lib/TreeValProject.groovy b/lib/TreeValProject.groovy old mode 100644 new mode 100755 index 4feec655..7dbc05c5 --- a/lib/TreeValProject.groovy +++ b/lib/TreeValProject.groovy @@ -5,45 +5,49 @@ class TreeValProject { // Still in testing // - public static void summary(workflow, rf_data, pb_data, cm_data, summary_params, projectDir, params) { + public static void summary(workflow, params) { def input_data = [:] input_data['version'] = NfcoreTemplate.version( workflow ) input_data['runName'] = workflow.runName input_data['session_id'] = workflow.sessionId input_data['duration'] = workflow.duration - input_data['Date Started'] = workflow.start - input_data['Date Completed'] = workflow.complete + input_data['DateStarted'] = workflow.start + input_data['DateCompleted'] = workflow.complete - input_data['sample_id'] = rf_data.map{ it[0].id } - input_data['taxonomic_class'] = rf_data.map{ it[0].ln } - input_data['ticket_type'] = rf_data.map{ it[0].tk } - input_data['input_asm'] = rf_data - input_data['input_pacbio'] = ( pb_data ?: 'None' ) - input_data['input_cram'] = ( cm_data ?: 'None' ) + input_data['rf_data'] = params.rf_data.value + input_data['pb_data'] = 'None' + input_data['cm_data'] = 'None' if (workflow.success) { def time = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') - def output_directory = new File("${params.outdir}/pipeline_info/") + def output_directory = new File("${params.tracedir}/") if (!output_directory.exists()) { output_directory.mkdirs() } - def output_hf = new File(output_directory, "input_data_${time}.txt") - output_hf.withWriter { w -> w << input_data } + def output_hf = new File(output_directory, "input_data_${params.trace_timestamp}.txt") + output_hf.write """\ + ---RUN_DATA--- + Pipeline_version: ${input_data.version} + Pipeline_runname: ${input_data.runName} + Pipeline_session: ${input_data.session_id} + Pipeline_duration: ${input_data.duration} + Pipeline_datastrt: ${input_data.DateStarted} + Pipeline_datecomp: ${input_data.DateCompleted} + ---INPUT_DATA--- + InputAssemblyData: ${input_data.rf_data} + Input_PacBio>Bam: ${input_data.pb_data} + Input_HiCCram>Bam: ${input_data.cm_data} + ---RESOURCES--- + """.stripIndent() + + def full_file = new File( output_directory, "TreeVal_run_context_${time}.txt" ) + def file_locs = ["${params.tracedir}/input_data_${time}.txt", + "${params.tracedir}/pipeline_execution_${params.trace_timestamp}.txt"] + file_locs.each{ full_file.append( new File( it ).getText() ) } - new File( output_directory, "TreeVal_run_context_${time}.txt" ).withWriter { w -> - ["---INPUT_DATA---\n", - "${params.outdir}/pipeline_info/pipeline_execution_${time}.txt", - "---RESOURCE_STATS---\n", - "${params.outdir}/pipeline_info/input_data_${time}.txt"] - .each { f -> - new File( f ).withReader { r -> - w << r << '\n' - } - } - } } } @@ -53,6 +57,7 @@ class TreeValProject { // Version: {workflow.version} // runName: {workflow.unName} // duration: {workflow.duration} + // ---INPUT_DATA--- // input_asm: [ [id, sz] file] // pacbio_bam: [ [id, sz] file] // cram_bam: [ [id, sz] file] @@ -60,5 +65,5 @@ class TreeValProject { // process cpu cpu_usage mem mem_usage peak_usage // MINIMAP2_ALIGN 16 1590% 60GB 50% 30GB // .... - + // // // // // // // } From 165a0ca613957007bc2c86231569d737f5c59b78 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 26 Jul 2023 16:54:31 +0100 Subject: [PATCH 52/85] Added a param so allow for propogation of trace_timestamp for catching pipeline_execution file --- nextflow.config | 1 + 1 file changed, 1 insertion(+) mode change 100644 => 100755 nextflow.config diff --git a/nextflow.config b/nextflow.config old mode 100644 new mode 100755 index 9ae6f19e..008981d4 --- a/nextflow.config +++ b/nextflow.config @@ -173,6 +173,7 @@ env { process.shell = ['/bin/bash', '-euo', 'pipefail'] def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') +params.trace_timestamp = trace_timestamp timeline { enabled = true file = "${params.tracedir}/execution_timeline_${trace_timestamp}.html" From c0b72fdc2704a0189030229818bed53a965cdeeb Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 26 Jul 2023 17:00:17 +0100 Subject: [PATCH 53/85] Updated project for TreeValProject summary reporting --- CHANGELOG.md | 0 CITATIONS.md | 0 CODE_OF_CONDUCT.md | 0 LICENSE | 0 README.md | 0 assets/adaptivecard.json | 0 assets/digest/digest.as | 0 assets/email_template.html | 0 assets/email_template.txt | 0 assets/full_s3_treeval_test.yaml | 0 assets/gene_alignment/assm_cdna.as | 0 assets/gene_alignment/assm_cds.as | 0 assets/gene_alignment/assm_pep.as | 0 assets/gene_alignment/assm_rna.as | 0 .../local_testing/nxOsc-2023-05-02.dp.TEST.md | 0 assets/local_testing/nxOscDF5033.yaml | 0 assets/local_testing/nxOscSUBSET.yaml | 0 assets/methods_description_template.yml | 0 assets/multiqc_config.yml | 0 .../csv_data/s3_Gae_Host.Gae-data.csv | 0 assets/nf-core-treeval_logo_light.png | Bin assets/s3_treeval_test.yaml | 0 assets/schema_input.json | 0 assets/self_comp/selfcomp.as | 0 assets/sendmail_template.txt | 0 assets/slackreport.json | 0 assets/treeval_test.yaml | 0 conf/base.config | 0 conf/digest.config | 0 conf/full_s3_test.config | 0 conf/igenomes.config | 0 conf/modules.config | 0 conf/s3_test.config | 0 conf/selfcomp.config | 0 conf/test.config | 0 conf/test_full.config | 0 docs/README.md | 0 docs/images/nf-core-treeval_logo_dark.png | Bin docs/images/nf-core-treeval_logo_light.png | Bin docs/images/treeval_1_0_gap_finder.jpeg | Bin docs/images/treeval_1_0_gene_alignment.jpeg | Bin docs/images/treeval_1_0_hic_mapping.jpeg | Bin docs/images/treeval_1_0_legend.jpeg | Bin .../images/treeval_1_0_longread_coverage.jpeg | Bin docs/images/treeval_1_0_repeat_density.jpeg | Bin docs/images/treeval_1_0_synteny.jpeg | Bin docs/images/treeval_1_0_telo_finder.jpeg | Bin .../treeval_genealignment_workflow.jpeg | Bin .../treeval_generategenome_workflow.jpeg | Bin .../treeval_insilicodigest_workflow.jpeg | Bin docs/images/treeval_selfcomp_workflow.jpeg | Bin docs/images/treeval_synteny_workflow.jpeg | Bin docs/usage.md | 0 lib/TreeValProject.groovy | 3 ++- lib/nfcore_external_java_deps.jar | Bin main.nf | 0 modules.json | 0 modules/local/assign_ancestral.nf | 0 modules/local/bamtobed_sort.nf | 0 .../cram_filter_align_bwamem2_fixmate_sort.nf | 0 modules/local/extract_ancestral.nf | 0 modules/local/extract_buscogene.nf | 0 modules/local/extract_repeat.nf | 0 modules/local/extract_telo.nf | 0 modules/local/find_telomere_regions.nf | 0 modules/local/find_telomere_windows.nf | 0 modules/local/gap_length.nf | 0 modules/local/get_largest_scaff.nf | 0 modules/local/get_synteny_genomes.nf | 0 modules/local/gff_to_bed.nf | 0 modules/local/makecmap_cmap2bed.nf | 0 modules/local/makecmap_fa2cmapmulticolor.nf | 0 modules/local/makecmap_renamecmapids.nf | 0 modules/local/paf_to_bed.nf | 0 modules/local/reformat_intersect.nf | 0 modules/local/rename_ids.nf | 0 modules/local/replace_dots.nf | 0 modules/local/selfcomp_alignmentblocks.nf | 0 modules/local/selfcomp_mapids.nf | 0 modules/local/selfcomp_mummer2bed.nf | 0 modules/local/selfcomp_splitfasta.nf | 0 modules/nf-core/bedtools/bamtobed/main.nf | 0 modules/nf-core/bedtools/bamtobed/meta.yml | 0 modules/nf-core/bedtools/genomecov/main.nf | 0 modules/nf-core/bedtools/genomecov/meta.yml | 0 modules/nf-core/bedtools/intersect/main.nf | 0 modules/nf-core/bedtools/intersect/meta.yml | 0 modules/nf-core/bedtools/makewindows/main.nf | 0 modules/nf-core/bedtools/makewindows/meta.yml | 0 modules/nf-core/bedtools/map/main.nf | 0 modules/nf-core/bedtools/map/meta.yml | 0 modules/nf-core/bedtools/merge/main.nf | 0 modules/nf-core/bedtools/merge/meta.yml | 0 modules/nf-core/bedtools/sort/main.nf | 0 modules/nf-core/bedtools/sort/meta.yml | 0 modules/nf-core/busco/main.nf | 0 modules/nf-core/busco/meta.yml | 0 modules/nf-core/bwamem2/index/main.nf | 0 modules/nf-core/bwamem2/index/meta.yml | 0 modules/nf-core/cat/cat/main.nf | 0 modules/nf-core/cat/cat/meta.yml | 0 modules/nf-core/cooler/cload/main.nf | 0 modules/nf-core/cooler/cload/meta.yml | 0 modules/nf-core/cooler/zoomify/main.nf | 0 modules/nf-core/cooler/zoomify/meta.yml | 0 .../custom/dumpsoftwareversions/main.nf | 0 .../custom/dumpsoftwareversions/meta.yml | 0 modules/nf-core/custom/getchromsizes/main.nf | 0 modules/nf-core/custom/getchromsizes/meta.yml | 0 modules/nf-core/gnu/sort/main.nf | 0 modules/nf-core/gnu/sort/meta.yml | 0 modules/nf-core/minimap2/align/main.nf | 0 modules/nf-core/minimap2/align/meta.yml | 0 modules/nf-core/minimap2/index/main.nf | 0 modules/nf-core/minimap2/index/meta.yml | 0 modules/nf-core/miniprot/align/main.nf | 0 modules/nf-core/miniprot/align/meta.yml | 0 modules/nf-core/miniprot/index/main.nf | 0 modules/nf-core/miniprot/index/meta.yml | 0 modules/nf-core/mummer/main.nf | 0 modules/nf-core/mummer/meta.yml | 0 modules/nf-core/paftools/sam2paf/main.nf | 0 modules/nf-core/paftools/sam2paf/meta.yml | 0 modules/nf-core/pretextmap/main.nf | 0 modules/nf-core/pretextmap/meta.yml | 0 modules/nf-core/pretextsnapshot/main.nf | 0 modules/nf-core/pretextsnapshot/meta.yml | 0 modules/nf-core/samtools/faidx/main.nf | 0 modules/nf-core/samtools/faidx/meta.yml | 0 modules/nf-core/samtools/markdup/main.nf | 0 modules/nf-core/samtools/markdup/meta.yml | 0 modules/nf-core/samtools/merge/main.nf | 0 modules/nf-core/samtools/merge/meta.yml | 0 modules/nf-core/samtools/sort/main.nf | 0 modules/nf-core/samtools/sort/meta.yml | 0 modules/nf-core/samtools/view/main.nf | 0 modules/nf-core/samtools/view/meta.yml | 0 modules/nf-core/seqtk/cutn/main.nf | 0 modules/nf-core/seqtk/cutn/meta.yml | 0 modules/nf-core/tabix/bgziptabix/main.nf | 0 modules/nf-core/tabix/bgziptabix/meta.yml | 0 .../tabix/bgziptabix/tabix-bgziptabix.diff | 0 modules/nf-core/ucsc/bedgraphtobigwig/main.nf | 0 modules/nf-core/ucsc/bedtobigbed/main.nf | 0 .../nf-core/windowmasker/mk_counts/main.nf | 0 .../nf-core/windowmasker/mk_counts/meta.yml | 0 modules/nf-core/windowmasker/ustat/main.nf | 0 modules/nf-core/windowmasker/ustat/meta.yml | 0 nextflow_schema.json | 0 pipeline_template.yml | 0 pyproject.toml | 0 subworkflows/local/busco_annotation.nf | 0 subworkflows/local/gap_finder.nf | 0 subworkflows/local/gene_alignment.nf | 0 subworkflows/local/hic_mapping.nf | 0 subworkflows/local/longread_coverage.nf | 2 -- subworkflows/local/nuc_alignments.nf | 0 subworkflows/local/pep_alignments.nf | 0 subworkflows/local/punchlist.nf | 0 subworkflows/local/repeat_density.nf | 0 subworkflows/local/telo_finder.nf | 0 subworkflows/local/yaml_input.nf | 0 tower.yml | 0 workflows/treeval.nf | 21 +++++++++--------- workflows/treeval_rapid.nf | 0 165 files changed, 13 insertions(+), 13 deletions(-) mode change 100644 => 100755 CHANGELOG.md mode change 100644 => 100755 CITATIONS.md mode change 100644 => 100755 CODE_OF_CONDUCT.md mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 assets/adaptivecard.json mode change 100644 => 100755 assets/digest/digest.as mode change 100644 => 100755 assets/email_template.html mode change 100644 => 100755 assets/email_template.txt mode change 100644 => 100755 assets/full_s3_treeval_test.yaml mode change 100644 => 100755 assets/gene_alignment/assm_cdna.as mode change 100644 => 100755 assets/gene_alignment/assm_cds.as mode change 100644 => 100755 assets/gene_alignment/assm_pep.as mode change 100644 => 100755 assets/gene_alignment/assm_rna.as mode change 100644 => 100755 assets/local_testing/nxOsc-2023-05-02.dp.TEST.md mode change 100644 => 100755 assets/local_testing/nxOscDF5033.yaml mode change 100644 => 100755 assets/local_testing/nxOscSUBSET.yaml mode change 100644 => 100755 assets/methods_description_template.yml mode change 100644 => 100755 assets/multiqc_config.yml mode change 100644 => 100755 assets/nematode/csv_data/s3_Gae_Host.Gae-data.csv mode change 100644 => 100755 assets/nf-core-treeval_logo_light.png mode change 100644 => 100755 assets/s3_treeval_test.yaml mode change 100644 => 100755 assets/schema_input.json mode change 100644 => 100755 assets/self_comp/selfcomp.as mode change 100644 => 100755 assets/sendmail_template.txt mode change 100644 => 100755 assets/slackreport.json mode change 100644 => 100755 assets/treeval_test.yaml mode change 100644 => 100755 conf/base.config mode change 100644 => 100755 conf/digest.config mode change 100644 => 100755 conf/full_s3_test.config mode change 100644 => 100755 conf/igenomes.config mode change 100644 => 100755 conf/modules.config mode change 100644 => 100755 conf/s3_test.config mode change 100644 => 100755 conf/selfcomp.config mode change 100644 => 100755 conf/test.config mode change 100644 => 100755 conf/test_full.config mode change 100644 => 100755 docs/README.md mode change 100644 => 100755 docs/images/nf-core-treeval_logo_dark.png mode change 100644 => 100755 docs/images/nf-core-treeval_logo_light.png mode change 100644 => 100755 docs/images/treeval_1_0_gap_finder.jpeg mode change 100644 => 100755 docs/images/treeval_1_0_gene_alignment.jpeg mode change 100644 => 100755 docs/images/treeval_1_0_hic_mapping.jpeg mode change 100644 => 100755 docs/images/treeval_1_0_legend.jpeg mode change 100644 => 100755 docs/images/treeval_1_0_longread_coverage.jpeg mode change 100644 => 100755 docs/images/treeval_1_0_repeat_density.jpeg mode change 100644 => 100755 docs/images/treeval_1_0_synteny.jpeg mode change 100644 => 100755 docs/images/treeval_1_0_telo_finder.jpeg mode change 100644 => 100755 docs/images/treeval_genealignment_workflow.jpeg mode change 100644 => 100755 docs/images/treeval_generategenome_workflow.jpeg mode change 100644 => 100755 docs/images/treeval_insilicodigest_workflow.jpeg mode change 100644 => 100755 docs/images/treeval_selfcomp_workflow.jpeg mode change 100644 => 100755 docs/images/treeval_synteny_workflow.jpeg mode change 100644 => 100755 docs/usage.md mode change 100644 => 100755 lib/nfcore_external_java_deps.jar mode change 100644 => 100755 main.nf mode change 100644 => 100755 modules.json mode change 100644 => 100755 modules/local/assign_ancestral.nf mode change 100644 => 100755 modules/local/bamtobed_sort.nf mode change 100644 => 100755 modules/local/cram_filter_align_bwamem2_fixmate_sort.nf mode change 100644 => 100755 modules/local/extract_ancestral.nf mode change 100644 => 100755 modules/local/extract_buscogene.nf mode change 100644 => 100755 modules/local/extract_repeat.nf mode change 100644 => 100755 modules/local/extract_telo.nf mode change 100644 => 100755 modules/local/find_telomere_regions.nf mode change 100644 => 100755 modules/local/find_telomere_windows.nf mode change 100644 => 100755 modules/local/gap_length.nf mode change 100644 => 100755 modules/local/get_largest_scaff.nf mode change 100644 => 100755 modules/local/get_synteny_genomes.nf mode change 100644 => 100755 modules/local/gff_to_bed.nf mode change 100644 => 100755 modules/local/makecmap_cmap2bed.nf mode change 100644 => 100755 modules/local/makecmap_fa2cmapmulticolor.nf mode change 100644 => 100755 modules/local/makecmap_renamecmapids.nf mode change 100644 => 100755 modules/local/paf_to_bed.nf mode change 100644 => 100755 modules/local/reformat_intersect.nf mode change 100644 => 100755 modules/local/rename_ids.nf mode change 100644 => 100755 modules/local/replace_dots.nf mode change 100644 => 100755 modules/local/selfcomp_alignmentblocks.nf mode change 100644 => 100755 modules/local/selfcomp_mapids.nf mode change 100644 => 100755 modules/local/selfcomp_mummer2bed.nf mode change 100644 => 100755 modules/local/selfcomp_splitfasta.nf mode change 100644 => 100755 modules/nf-core/bedtools/bamtobed/main.nf mode change 100644 => 100755 modules/nf-core/bedtools/bamtobed/meta.yml mode change 100644 => 100755 modules/nf-core/bedtools/genomecov/main.nf mode change 100644 => 100755 modules/nf-core/bedtools/genomecov/meta.yml mode change 100644 => 100755 modules/nf-core/bedtools/intersect/main.nf mode change 100644 => 100755 modules/nf-core/bedtools/intersect/meta.yml mode change 100644 => 100755 modules/nf-core/bedtools/makewindows/main.nf mode change 100644 => 100755 modules/nf-core/bedtools/makewindows/meta.yml mode change 100644 => 100755 modules/nf-core/bedtools/map/main.nf mode change 100644 => 100755 modules/nf-core/bedtools/map/meta.yml mode change 100644 => 100755 modules/nf-core/bedtools/merge/main.nf mode change 100644 => 100755 modules/nf-core/bedtools/merge/meta.yml mode change 100644 => 100755 modules/nf-core/bedtools/sort/main.nf mode change 100644 => 100755 modules/nf-core/bedtools/sort/meta.yml mode change 100644 => 100755 modules/nf-core/busco/main.nf mode change 100644 => 100755 modules/nf-core/busco/meta.yml mode change 100644 => 100755 modules/nf-core/bwamem2/index/main.nf mode change 100644 => 100755 modules/nf-core/bwamem2/index/meta.yml mode change 100644 => 100755 modules/nf-core/cat/cat/main.nf mode change 100644 => 100755 modules/nf-core/cat/cat/meta.yml mode change 100644 => 100755 modules/nf-core/cooler/cload/main.nf mode change 100644 => 100755 modules/nf-core/cooler/cload/meta.yml mode change 100644 => 100755 modules/nf-core/cooler/zoomify/main.nf mode change 100644 => 100755 modules/nf-core/cooler/zoomify/meta.yml mode change 100644 => 100755 modules/nf-core/custom/dumpsoftwareversions/main.nf mode change 100644 => 100755 modules/nf-core/custom/dumpsoftwareversions/meta.yml mode change 100644 => 100755 modules/nf-core/custom/getchromsizes/main.nf mode change 100644 => 100755 modules/nf-core/custom/getchromsizes/meta.yml mode change 100644 => 100755 modules/nf-core/gnu/sort/main.nf mode change 100644 => 100755 modules/nf-core/gnu/sort/meta.yml mode change 100644 => 100755 modules/nf-core/minimap2/align/main.nf mode change 100644 => 100755 modules/nf-core/minimap2/align/meta.yml mode change 100644 => 100755 modules/nf-core/minimap2/index/main.nf mode change 100644 => 100755 modules/nf-core/minimap2/index/meta.yml mode change 100644 => 100755 modules/nf-core/miniprot/align/main.nf mode change 100644 => 100755 modules/nf-core/miniprot/align/meta.yml mode change 100644 => 100755 modules/nf-core/miniprot/index/main.nf mode change 100644 => 100755 modules/nf-core/miniprot/index/meta.yml mode change 100644 => 100755 modules/nf-core/mummer/main.nf mode change 100644 => 100755 modules/nf-core/mummer/meta.yml mode change 100644 => 100755 modules/nf-core/paftools/sam2paf/main.nf mode change 100644 => 100755 modules/nf-core/paftools/sam2paf/meta.yml mode change 100644 => 100755 modules/nf-core/pretextmap/main.nf mode change 100644 => 100755 modules/nf-core/pretextmap/meta.yml mode change 100644 => 100755 modules/nf-core/pretextsnapshot/main.nf mode change 100644 => 100755 modules/nf-core/pretextsnapshot/meta.yml mode change 100644 => 100755 modules/nf-core/samtools/faidx/main.nf mode change 100644 => 100755 modules/nf-core/samtools/faidx/meta.yml mode change 100644 => 100755 modules/nf-core/samtools/markdup/main.nf mode change 100644 => 100755 modules/nf-core/samtools/markdup/meta.yml mode change 100644 => 100755 modules/nf-core/samtools/merge/main.nf mode change 100644 => 100755 modules/nf-core/samtools/merge/meta.yml mode change 100644 => 100755 modules/nf-core/samtools/sort/main.nf mode change 100644 => 100755 modules/nf-core/samtools/sort/meta.yml mode change 100644 => 100755 modules/nf-core/samtools/view/main.nf mode change 100644 => 100755 modules/nf-core/samtools/view/meta.yml mode change 100644 => 100755 modules/nf-core/seqtk/cutn/main.nf mode change 100644 => 100755 modules/nf-core/seqtk/cutn/meta.yml mode change 100644 => 100755 modules/nf-core/tabix/bgziptabix/main.nf mode change 100644 => 100755 modules/nf-core/tabix/bgziptabix/meta.yml mode change 100644 => 100755 modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff mode change 100644 => 100755 modules/nf-core/ucsc/bedgraphtobigwig/main.nf mode change 100644 => 100755 modules/nf-core/ucsc/bedtobigbed/main.nf mode change 100644 => 100755 modules/nf-core/windowmasker/mk_counts/main.nf mode change 100644 => 100755 modules/nf-core/windowmasker/mk_counts/meta.yml mode change 100644 => 100755 modules/nf-core/windowmasker/ustat/main.nf mode change 100644 => 100755 modules/nf-core/windowmasker/ustat/meta.yml mode change 100644 => 100755 nextflow_schema.json mode change 100644 => 100755 pipeline_template.yml mode change 100644 => 100755 pyproject.toml mode change 100644 => 100755 subworkflows/local/busco_annotation.nf mode change 100644 => 100755 subworkflows/local/gap_finder.nf mode change 100644 => 100755 subworkflows/local/gene_alignment.nf mode change 100644 => 100755 subworkflows/local/hic_mapping.nf mode change 100644 => 100755 subworkflows/local/nuc_alignments.nf mode change 100644 => 100755 subworkflows/local/pep_alignments.nf mode change 100644 => 100755 subworkflows/local/punchlist.nf mode change 100644 => 100755 subworkflows/local/repeat_density.nf mode change 100644 => 100755 subworkflows/local/telo_finder.nf mode change 100644 => 100755 subworkflows/local/yaml_input.nf mode change 100644 => 100755 tower.yml mode change 100644 => 100755 workflows/treeval.nf mode change 100644 => 100755 workflows/treeval_rapid.nf diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/CITATIONS.md b/CITATIONS.md old mode 100644 new mode 100755 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json old mode 100644 new mode 100755 diff --git a/assets/digest/digest.as b/assets/digest/digest.as old mode 100644 new mode 100755 diff --git a/assets/email_template.html b/assets/email_template.html old mode 100644 new mode 100755 diff --git a/assets/email_template.txt b/assets/email_template.txt old mode 100644 new mode 100755 diff --git a/assets/full_s3_treeval_test.yaml b/assets/full_s3_treeval_test.yaml old mode 100644 new mode 100755 diff --git a/assets/gene_alignment/assm_cdna.as b/assets/gene_alignment/assm_cdna.as old mode 100644 new mode 100755 diff --git a/assets/gene_alignment/assm_cds.as b/assets/gene_alignment/assm_cds.as old mode 100644 new mode 100755 diff --git a/assets/gene_alignment/assm_pep.as b/assets/gene_alignment/assm_pep.as old mode 100644 new mode 100755 diff --git a/assets/gene_alignment/assm_rna.as b/assets/gene_alignment/assm_rna.as old mode 100644 new mode 100755 diff --git a/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md b/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md old mode 100644 new mode 100755 diff --git a/assets/local_testing/nxOscDF5033.yaml b/assets/local_testing/nxOscDF5033.yaml old mode 100644 new mode 100755 diff --git a/assets/local_testing/nxOscSUBSET.yaml b/assets/local_testing/nxOscSUBSET.yaml old mode 100644 new mode 100755 diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml old mode 100644 new mode 100755 diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml old mode 100644 new mode 100755 diff --git a/assets/nematode/csv_data/s3_Gae_Host.Gae-data.csv b/assets/nematode/csv_data/s3_Gae_Host.Gae-data.csv old mode 100644 new mode 100755 diff --git a/assets/nf-core-treeval_logo_light.png b/assets/nf-core-treeval_logo_light.png old mode 100644 new mode 100755 diff --git a/assets/s3_treeval_test.yaml b/assets/s3_treeval_test.yaml old mode 100644 new mode 100755 diff --git a/assets/schema_input.json b/assets/schema_input.json old mode 100644 new mode 100755 diff --git a/assets/self_comp/selfcomp.as b/assets/self_comp/selfcomp.as old mode 100644 new mode 100755 diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt old mode 100644 new mode 100755 diff --git a/assets/slackreport.json b/assets/slackreport.json old mode 100644 new mode 100755 diff --git a/assets/treeval_test.yaml b/assets/treeval_test.yaml old mode 100644 new mode 100755 diff --git a/conf/base.config b/conf/base.config old mode 100644 new mode 100755 diff --git a/conf/digest.config b/conf/digest.config old mode 100644 new mode 100755 diff --git a/conf/full_s3_test.config b/conf/full_s3_test.config old mode 100644 new mode 100755 diff --git a/conf/igenomes.config b/conf/igenomes.config old mode 100644 new mode 100755 diff --git a/conf/modules.config b/conf/modules.config old mode 100644 new mode 100755 diff --git a/conf/s3_test.config b/conf/s3_test.config old mode 100644 new mode 100755 diff --git a/conf/selfcomp.config b/conf/selfcomp.config old mode 100644 new mode 100755 diff --git a/conf/test.config b/conf/test.config old mode 100644 new mode 100755 diff --git a/conf/test_full.config b/conf/test_full.config old mode 100644 new mode 100755 diff --git a/docs/README.md b/docs/README.md old mode 100644 new mode 100755 diff --git a/docs/images/nf-core-treeval_logo_dark.png b/docs/images/nf-core-treeval_logo_dark.png old mode 100644 new mode 100755 diff --git a/docs/images/nf-core-treeval_logo_light.png b/docs/images/nf-core-treeval_logo_light.png old mode 100644 new mode 100755 diff --git a/docs/images/treeval_1_0_gap_finder.jpeg b/docs/images/treeval_1_0_gap_finder.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_1_0_gene_alignment.jpeg b/docs/images/treeval_1_0_gene_alignment.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_1_0_hic_mapping.jpeg b/docs/images/treeval_1_0_hic_mapping.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_1_0_legend.jpeg b/docs/images/treeval_1_0_legend.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_1_0_longread_coverage.jpeg b/docs/images/treeval_1_0_longread_coverage.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_1_0_repeat_density.jpeg b/docs/images/treeval_1_0_repeat_density.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_1_0_synteny.jpeg b/docs/images/treeval_1_0_synteny.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_1_0_telo_finder.jpeg b/docs/images/treeval_1_0_telo_finder.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_genealignment_workflow.jpeg b/docs/images/treeval_genealignment_workflow.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_generategenome_workflow.jpeg b/docs/images/treeval_generategenome_workflow.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_insilicodigest_workflow.jpeg b/docs/images/treeval_insilicodigest_workflow.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_selfcomp_workflow.jpeg b/docs/images/treeval_selfcomp_workflow.jpeg old mode 100644 new mode 100755 diff --git a/docs/images/treeval_synteny_workflow.jpeg b/docs/images/treeval_synteny_workflow.jpeg old mode 100644 new mode 100755 diff --git a/docs/usage.md b/docs/usage.md old mode 100644 new mode 100755 diff --git a/lib/TreeValProject.groovy b/lib/TreeValProject.groovy index 7dbc05c5..f728bb4e 100755 --- a/lib/TreeValProject.groovy +++ b/lib/TreeValProject.groovy @@ -15,6 +15,7 @@ class TreeValProject { input_data['DateStarted'] = workflow.start input_data['DateCompleted'] = workflow.complete + input_data['sample_name'] = params.sample_id.value input_data['rf_data'] = params.rf_data.value input_data['pb_data'] = 'None' input_data['cm_data'] = 'None' @@ -43,7 +44,7 @@ class TreeValProject { ---RESOURCES--- """.stripIndent() - def full_file = new File( output_directory, "TreeVal_run_context_${time}.txt" ) + def full_file = new File( output_directory, "TreeVal_run_${params.sample_id.value}_${time}.txt" ) def file_locs = ["${params.tracedir}/input_data_${time}.txt", "${params.tracedir}/pipeline_execution_${params.trace_timestamp}.txt"] file_locs.each{ full_file.append( new File( it ).getText() ) } diff --git a/lib/nfcore_external_java_deps.jar b/lib/nfcore_external_java_deps.jar old mode 100644 new mode 100755 diff --git a/main.nf b/main.nf old mode 100644 new mode 100755 diff --git a/modules.json b/modules.json old mode 100644 new mode 100755 diff --git a/modules/local/assign_ancestral.nf b/modules/local/assign_ancestral.nf old mode 100644 new mode 100755 diff --git a/modules/local/bamtobed_sort.nf b/modules/local/bamtobed_sort.nf old mode 100644 new mode 100755 diff --git a/modules/local/cram_filter_align_bwamem2_fixmate_sort.nf b/modules/local/cram_filter_align_bwamem2_fixmate_sort.nf old mode 100644 new mode 100755 diff --git a/modules/local/extract_ancestral.nf b/modules/local/extract_ancestral.nf old mode 100644 new mode 100755 diff --git a/modules/local/extract_buscogene.nf b/modules/local/extract_buscogene.nf old mode 100644 new mode 100755 diff --git a/modules/local/extract_repeat.nf b/modules/local/extract_repeat.nf old mode 100644 new mode 100755 diff --git a/modules/local/extract_telo.nf b/modules/local/extract_telo.nf old mode 100644 new mode 100755 diff --git a/modules/local/find_telomere_regions.nf b/modules/local/find_telomere_regions.nf old mode 100644 new mode 100755 diff --git a/modules/local/find_telomere_windows.nf b/modules/local/find_telomere_windows.nf old mode 100644 new mode 100755 diff --git a/modules/local/gap_length.nf b/modules/local/gap_length.nf old mode 100644 new mode 100755 diff --git a/modules/local/get_largest_scaff.nf b/modules/local/get_largest_scaff.nf old mode 100644 new mode 100755 diff --git a/modules/local/get_synteny_genomes.nf b/modules/local/get_synteny_genomes.nf old mode 100644 new mode 100755 diff --git a/modules/local/gff_to_bed.nf b/modules/local/gff_to_bed.nf old mode 100644 new mode 100755 diff --git a/modules/local/makecmap_cmap2bed.nf b/modules/local/makecmap_cmap2bed.nf old mode 100644 new mode 100755 diff --git a/modules/local/makecmap_fa2cmapmulticolor.nf b/modules/local/makecmap_fa2cmapmulticolor.nf old mode 100644 new mode 100755 diff --git a/modules/local/makecmap_renamecmapids.nf b/modules/local/makecmap_renamecmapids.nf old mode 100644 new mode 100755 diff --git a/modules/local/paf_to_bed.nf b/modules/local/paf_to_bed.nf old mode 100644 new mode 100755 diff --git a/modules/local/reformat_intersect.nf b/modules/local/reformat_intersect.nf old mode 100644 new mode 100755 diff --git a/modules/local/rename_ids.nf b/modules/local/rename_ids.nf old mode 100644 new mode 100755 diff --git a/modules/local/replace_dots.nf b/modules/local/replace_dots.nf old mode 100644 new mode 100755 diff --git a/modules/local/selfcomp_alignmentblocks.nf b/modules/local/selfcomp_alignmentblocks.nf old mode 100644 new mode 100755 diff --git a/modules/local/selfcomp_mapids.nf b/modules/local/selfcomp_mapids.nf old mode 100644 new mode 100755 diff --git a/modules/local/selfcomp_mummer2bed.nf b/modules/local/selfcomp_mummer2bed.nf old mode 100644 new mode 100755 diff --git a/modules/local/selfcomp_splitfasta.nf b/modules/local/selfcomp_splitfasta.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/bamtobed/main.nf b/modules/nf-core/bedtools/bamtobed/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/bamtobed/meta.yml b/modules/nf-core/bedtools/bamtobed/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/genomecov/main.nf b/modules/nf-core/bedtools/genomecov/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/genomecov/meta.yml b/modules/nf-core/bedtools/genomecov/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/intersect/main.nf b/modules/nf-core/bedtools/intersect/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/intersect/meta.yml b/modules/nf-core/bedtools/intersect/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/makewindows/main.nf b/modules/nf-core/bedtools/makewindows/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/makewindows/meta.yml b/modules/nf-core/bedtools/makewindows/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/map/main.nf b/modules/nf-core/bedtools/map/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/map/meta.yml b/modules/nf-core/bedtools/map/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/merge/main.nf b/modules/nf-core/bedtools/merge/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/merge/meta.yml b/modules/nf-core/bedtools/merge/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/sort/main.nf b/modules/nf-core/bedtools/sort/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bedtools/sort/meta.yml b/modules/nf-core/bedtools/sort/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/busco/main.nf b/modules/nf-core/busco/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/busco/meta.yml b/modules/nf-core/busco/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/bwamem2/index/meta.yml b/modules/nf-core/bwamem2/index/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/cat/cat/main.nf b/modules/nf-core/cat/cat/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/cat/cat/meta.yml b/modules/nf-core/cat/cat/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/cooler/cload/main.nf b/modules/nf-core/cooler/cload/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/cooler/cload/meta.yml b/modules/nf-core/cooler/cload/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/cooler/zoomify/main.nf b/modules/nf-core/cooler/zoomify/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/cooler/zoomify/meta.yml b/modules/nf-core/cooler/zoomify/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/custom/getchromsizes/main.nf b/modules/nf-core/custom/getchromsizes/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/custom/getchromsizes/meta.yml b/modules/nf-core/custom/getchromsizes/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/gnu/sort/main.nf b/modules/nf-core/gnu/sort/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/gnu/sort/meta.yml b/modules/nf-core/gnu/sort/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/minimap2/align/main.nf b/modules/nf-core/minimap2/align/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/minimap2/align/meta.yml b/modules/nf-core/minimap2/align/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/minimap2/index/main.nf b/modules/nf-core/minimap2/index/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/minimap2/index/meta.yml b/modules/nf-core/minimap2/index/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/miniprot/align/main.nf b/modules/nf-core/miniprot/align/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/miniprot/align/meta.yml b/modules/nf-core/miniprot/align/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/miniprot/index/main.nf b/modules/nf-core/miniprot/index/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/miniprot/index/meta.yml b/modules/nf-core/miniprot/index/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/mummer/main.nf b/modules/nf-core/mummer/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/mummer/meta.yml b/modules/nf-core/mummer/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/paftools/sam2paf/main.nf b/modules/nf-core/paftools/sam2paf/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/paftools/sam2paf/meta.yml b/modules/nf-core/paftools/sam2paf/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/pretextmap/main.nf b/modules/nf-core/pretextmap/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/pretextmap/meta.yml b/modules/nf-core/pretextmap/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/pretextsnapshot/main.nf b/modules/nf-core/pretextsnapshot/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/pretextsnapshot/meta.yml b/modules/nf-core/pretextsnapshot/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/faidx/main.nf b/modules/nf-core/samtools/faidx/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/faidx/meta.yml b/modules/nf-core/samtools/faidx/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/markdup/main.nf b/modules/nf-core/samtools/markdup/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/markdup/meta.yml b/modules/nf-core/samtools/markdup/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/merge/main.nf b/modules/nf-core/samtools/merge/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/merge/meta.yml b/modules/nf-core/samtools/merge/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/sort/main.nf b/modules/nf-core/samtools/sort/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/view/main.nf b/modules/nf-core/samtools/view/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/samtools/view/meta.yml b/modules/nf-core/samtools/view/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/seqtk/cutn/main.nf b/modules/nf-core/seqtk/cutn/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/seqtk/cutn/meta.yml b/modules/nf-core/seqtk/cutn/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/tabix/bgziptabix/main.nf b/modules/nf-core/tabix/bgziptabix/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/tabix/bgziptabix/meta.yml b/modules/nf-core/tabix/bgziptabix/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff b/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff old mode 100644 new mode 100755 diff --git a/modules/nf-core/ucsc/bedgraphtobigwig/main.nf b/modules/nf-core/ucsc/bedgraphtobigwig/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/ucsc/bedtobigbed/main.nf b/modules/nf-core/ucsc/bedtobigbed/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/windowmasker/mk_counts/main.nf b/modules/nf-core/windowmasker/mk_counts/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/windowmasker/mk_counts/meta.yml b/modules/nf-core/windowmasker/mk_counts/meta.yml old mode 100644 new mode 100755 diff --git a/modules/nf-core/windowmasker/ustat/main.nf b/modules/nf-core/windowmasker/ustat/main.nf old mode 100644 new mode 100755 diff --git a/modules/nf-core/windowmasker/ustat/meta.yml b/modules/nf-core/windowmasker/ustat/meta.yml old mode 100644 new mode 100755 diff --git a/nextflow_schema.json b/nextflow_schema.json old mode 100644 new mode 100755 diff --git a/pipeline_template.yml b/pipeline_template.yml old mode 100644 new mode 100755 diff --git a/pyproject.toml b/pyproject.toml old mode 100644 new mode 100755 diff --git a/subworkflows/local/busco_annotation.nf b/subworkflows/local/busco_annotation.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/gap_finder.nf b/subworkflows/local/gap_finder.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/gene_alignment.nf b/subworkflows/local/gene_alignment.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index b20746b3..4220e7ad 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -183,7 +183,6 @@ workflow LONGREAD_COVERAGE { // // LOGIC: PREPARING MERGE INPUT WITH REFERENCE GENOME AND REFERENCE INDEX // - SAMTOOLS_SORT.out.bam.view() SAMTOOLS_SORT.out.bam .combine( reference_tuple ) .multiMap { meta, bam, ref_meta, ref -> @@ -200,7 +199,6 @@ workflow LONGREAD_COVERAGE { ) } .set { view_input } - view_input.bam_input.view() // // MODULE: EXTRACT READS FOR PRIMARY ASSEMBLY // diff --git a/subworkflows/local/nuc_alignments.nf b/subworkflows/local/nuc_alignments.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/pep_alignments.nf b/subworkflows/local/pep_alignments.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/punchlist.nf b/subworkflows/local/punchlist.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/repeat_density.nf b/subworkflows/local/repeat_density.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/telo_finder.nf b/subworkflows/local/telo_finder.nf old mode 100644 new mode 100755 diff --git a/subworkflows/local/yaml_input.nf b/subworkflows/local/yaml_input.nf old mode 100644 new mode 100755 diff --git a/tower.yml b/tower.yml old mode 100644 new mode 100755 diff --git a/workflows/treeval.nf b/workflows/treeval.nf old mode 100644 new mode 100755 index 33fc979f..f4a8c481 --- a/workflows/treeval.nf +++ b/workflows/treeval.nf @@ -10,7 +10,7 @@ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) WorkflowTreeval.initialise(params, log) // Check input path parameters to see if they exist -// param.fasta removed from here +// params.input is the treeval yaml def checkPathParamList = [ params.input ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } @@ -247,20 +247,20 @@ workflow TREEVAL { .combine( YAML_INPUT.out.assembly_classT ) .combine( YAML_INPUT.out.assembly_ttype ) .map { meta, reference, lineage, ticket -> - tuple( [id: meta.id, + tuple( + [ id: meta.id, sz: file(reference).size(), ln: lineage, - tk: ticket ], - reference + tk: ticket ], + reference ) } .set { rf_data } - pb_data = LONGREAD_COVERAGE.out.ch_reporting // merged pacbio.bam data tuple( [ id, size ], file ) - cm_data = HIC_MAPPING.out.ch_reporting // merged cram.bam data tuple ( [ id, size ], file ) | Should really be a collected list of the raw cram - rf_data.view() - pb_data.view() - cm_data.view() + params.sample_id = YAML_INPUT.out.assembly_id.collect() + params.rf_data = rf_data.collect() // reference data tuple( [ id, size, lineage, ticket ], file) + params.pb_data = LONGREAD_COVERAGE.out.ch_reporting.collect() // merged pacbio.bam data tuple( [ id, size ], file ) | Should really be a collected list of the raw fasta + params.cm_data = HIC_MAPPING.out.ch_reporting.collect() // merged cram.bam data tuple( [ id, size ], file ) | Should really be a collected list of the raw cram emit: software_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.yml @@ -277,12 +277,13 @@ workflow.onComplete { if (params.email || params.email_on_fail) { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) } + NfcoreTemplate.summary(workflow, params, log) if (params.hook_url) { NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log) } - TreeValProject.summary(workflow, rf_data, pb_data, cm_data, summary_params, projectDir, params) + TreeValProject.summary(workflow, params) } diff --git a/workflows/treeval_rapid.nf b/workflows/treeval_rapid.nf old mode 100644 new mode 100755 From 19e0188ed0929936485f285299953bd71522aed7 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 26 Jul 2023 17:03:01 +0100 Subject: [PATCH 54/85] Updated project for TreeValProject summary reporting --- lib/TreeValProject.groovy | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/TreeValProject.groovy b/lib/TreeValProject.groovy index f728bb4e..0b8e25cc 100755 --- a/lib/TreeValProject.groovy +++ b/lib/TreeValProject.groovy @@ -17,11 +17,10 @@ class TreeValProject { input_data['sample_name'] = params.sample_id.value input_data['rf_data'] = params.rf_data.value - input_data['pb_data'] = 'None' - input_data['cm_data'] = 'None' + input_data['pb_data'] = params.pb_data.value + input_data['cm_data'] = params.cm_data.value if (workflow.success) { - def time = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss') def output_directory = new File("${params.tracedir}/") if (!output_directory.exists()) { @@ -44,7 +43,7 @@ class TreeValProject { ---RESOURCES--- """.stripIndent() - def full_file = new File( output_directory, "TreeVal_run_${params.sample_id.value}_${time}.txt" ) + def full_file = new File( output_directory, "TreeVal_run_${params.sample_id.value}_${params.trace_timestamp}.txt" ) def file_locs = ["${params.tracedir}/input_data_${time}.txt", "${params.tracedir}/pipeline_execution_${params.trace_timestamp}.txt"] file_locs.each{ full_file.append( new File( it ).getText() ) } From df80a5b56b60bd88573692c33647231407d52616 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 26 Jul 2023 17:06:12 +0100 Subject: [PATCH 55/85] Minor bug fix --- lib/TreeValProject.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/TreeValProject.groovy b/lib/TreeValProject.groovy index 0b8e25cc..ed934294 100755 --- a/lib/TreeValProject.groovy +++ b/lib/TreeValProject.groovy @@ -44,7 +44,7 @@ class TreeValProject { """.stripIndent() def full_file = new File( output_directory, "TreeVal_run_${params.sample_id.value}_${params.trace_timestamp}.txt" ) - def file_locs = ["${params.tracedir}/input_data_${time}.txt", + def file_locs = ["${params.tracedir}/input_data_${params.trace_timestamp}.txt", "${params.tracedir}/pipeline_execution_${params.trace_timestamp}.txt"] file_locs.each{ full_file.append( new File( it ).getText() ) } From 3980f4af298be55916fa88abe15258b4f3979bce Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 26 Jul 2023 17:40:11 +0100 Subject: [PATCH 56/85] Additional small changes --- lib/TreeValProject.groovy | 24 +++++------------------- subworkflows/local/hic_mapping.nf | 13 ++++++++++++- subworkflows/local/longread_coverage.nf | 16 +++++++++++++++- 3 files changed, 32 insertions(+), 21 deletions(-) diff --git a/lib/TreeValProject.groovy b/lib/TreeValProject.groovy index ed934294..d3749a6e 100755 --- a/lib/TreeValProject.groovy +++ b/lib/TreeValProject.groovy @@ -1,8 +1,8 @@ class TreeValProject { - // - // Generate a summary file of input file data (size of files) - // Still in testing + // Generates a small summary containing context for the input files + // Creates a new file containing this context + pipeline_execution data + // Will be used for graph generation. // public static void summary(workflow, params) { @@ -15,6 +15,7 @@ class TreeValProject { input_data['DateStarted'] = workflow.start input_data['DateCompleted'] = workflow.complete + input_data['input_yaml'] = params.input input_data['sample_name'] = params.sample_id.value input_data['rf_data'] = params.rf_data.value input_data['pb_data'] = params.pb_data.value @@ -37,6 +38,7 @@ class TreeValProject { Pipeline_datastrt: ${input_data.DateStarted} Pipeline_datecomp: ${input_data.DateCompleted} ---INPUT_DATA--- + InputYamlFile: ${input_data.input_yaml} InputAssemblyData: ${input_data.rf_data} Input_PacBio>Bam: ${input_data.pb_data} Input_HiCCram>Bam: ${input_data.cm_data} @@ -50,20 +52,4 @@ class TreeValProject { } } - - // Should generate a file looking like: - // // // // // // // - // ---INPUT_DATA--- - // Version: {workflow.version} - // runName: {workflow.unName} - // duration: {workflow.duration} - // ---INPUT_DATA--- - // input_asm: [ [id, sz] file] - // pacbio_bam: [ [id, sz] file] - // cram_bam: [ [id, sz] file] - // ---RESOURCE_STATS--- - // process cpu cpu_usage mem mem_usage peak_usage - // MINIMAP2_ALIGN 16 1590% 60GB 50% 30GB - // .... - // // // // // // // } diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index dbf3e984..9be4bb12 100755 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -260,6 +260,17 @@ workflow HIC_MAPPING { COOLER_ZOOMIFY(ch_cool) ch_versions = ch_versions.mix(COOLER_ZOOMIFY.out.versions) + // + // LOGIC: FOR REPORTING + // + ch_filtering_input + .map{ meta, cramfile, cramindex, from, to, base, chunkid, rg, bwaprefix -> + tuple([ id : meta.id, + size: file(cramfile).size() ], + cramfile ) + } + .set { ch_reporting_cram } + emit: standrd_pretext = PRETEXTMAP_STANDRD.out.pretext standrd_snpshot = SNAPSHOT_SRES.out.image @@ -267,6 +278,6 @@ workflow HIC_MAPPING { //highres_snpshot = SNAPSHOT_HRES.out.image mcool = COOLER_ZOOMIFY.out.mcool hic = JUICER_TOOLS_PRE.out.hic - ch_reporting = pretext_input.input_bam + ch_reporting = ch_reporting_cram.collect() versions = ch_versions.ifEmpty(null) } diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index 4220e7ad..8d062c03 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -328,12 +328,26 @@ workflow LONGREAD_COVERAGE { ) ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions) + // + // + // + ch_read_paths + .map { meta, read_path -> + tuple( + [ id : meta.id, + sz : file( read_path ).size() + ], + read_path, + ) + } + .set { ch_for_PacBio } + emit: ch_minbed = BEDTOOLS_MERGE_MIN.out.bed ch_halfbed = FINDHALFCOVERAGE.out.bed ch_maxbed = BEDTOOLS_MERGE_MAX.out.bed ch_bigwig = UCSC_BEDGRAPHTOBIGWIG.out.bigwig - ch_reporting = view_input.bam_input + ch_reporting = ch_for_PacBio.collect() versions = ch_versions } From 531272787249ed88b1aa71698eac0d4b8dc10490 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 26 Jul 2023 18:04:37 +0100 Subject: [PATCH 57/85] Linting --- modules.json | 138 ++++++++++++++++++++++++++++++++----------- nextflow_schema.json | 6 ++ 2 files changed, 109 insertions(+), 35 deletions(-) diff --git a/modules.json b/modules.json index 9c5592d5..cf5ba17e 100755 --- a/modules.json +++ b/modules.json @@ -8,173 +8,241 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -183,4 +251,4 @@ } } } -} +} \ No newline at end of file diff --git a/nextflow_schema.json b/nextflow_schema.json index 686460a1..e4df788f 100755 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -34,6 +34,12 @@ "fa_icon": "fas fa-envelope", "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" + }, + "trace_timestamp" :{ + "type": "string", + "description": "Not to be used, this passes data from the config into the pipeline", + "fa_icon": "fas fa-lock", + "help_text": "Don't use this param, required for TreeValProjects Summary functions" } } }, From d1259020b803419a997a05988f7539424f6ef226 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Wed, 26 Jul 2023 18:23:59 +0100 Subject: [PATCH 58/85] Additional small changes and linting --- modules.json | 138 +++++++++++-------------------------------- nextflow_schema.json | 2 +- 2 files changed, 36 insertions(+), 104 deletions(-) diff --git a/modules.json b/modules.json index cf5ba17e..9c5592d5 100755 --- a/modules.json +++ b/modules.json @@ -8,241 +8,173 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -251,4 +183,4 @@ } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index e4df788f..f98570a5 100755 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -35,7 +35,7 @@ "help_text": "Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run.", "pattern": "^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$" }, - "trace_timestamp" :{ + "trace_timestamp": { "type": "string", "description": "Not to be used, this passes data from the config into the pipeline", "fa_icon": "fas fa-lock", From 6410c6cf4c3cc55d91b1e10059f20dac1b0895e9 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 27 Jul 2023 16:15:18 +0100 Subject: [PATCH 59/85] Fixed bug when coming across multiple cram or pacbio files for summary functions --- lib/TreeValProject.groovy | 21 ++++++++++--------- subworkflows/local/hic_mapping.nf | 28 ++++++++++++++++++++----- subworkflows/local/longread_coverage.nf | 25 +++++++++++----------- 3 files changed, 47 insertions(+), 27 deletions(-) diff --git a/lib/TreeValProject.groovy b/lib/TreeValProject.groovy index d3749a6e..775835ef 100755 --- a/lib/TreeValProject.groovy +++ b/lib/TreeValProject.groovy @@ -31,17 +31,18 @@ class TreeValProject { def output_hf = new File(output_directory, "input_data_${params.trace_timestamp}.txt") output_hf.write """\ ---RUN_DATA--- - Pipeline_version: ${input_data.version} - Pipeline_runname: ${input_data.runName} - Pipeline_session: ${input_data.session_id} - Pipeline_duration: ${input_data.duration} - Pipeline_datastrt: ${input_data.DateStarted} - Pipeline_datecomp: ${input_data.DateCompleted} + Pipeline_version: ${input_data.version} + Pipeline_runname: ${input_data.runName} + Pipeline_session: ${input_data.session_id} + Pipeline_duration: ${input_data.duration} + Pipeline_datastrt: ${input_data.DateStarted} + Pipeline_datecomp: ${input_data.DateCompleted} ---INPUT_DATA--- - InputYamlFile: ${input_data.input_yaml} - InputAssemblyData: ${input_data.rf_data} - Input_PacBio>Bam: ${input_data.pb_data} - Input_HiCCram>Bam: ${input_data.cm_data} + InputSampleID: ${input_data.sample_name} + InputYamlFile: ${input_data.input_yaml} + InputAssemblyData: ${input_data.rf_data} + Input_PacBio_Files: ${input_data.pb_data} + Input_Cram_Files: ${input_data.cm_data} ---RESOURCES--- """.stripIndent() diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index 9be4bb12..7da868e9 100755 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -263,11 +263,16 @@ workflow HIC_MAPPING { // // LOGIC: FOR REPORTING // - ch_filtering_input - .map{ meta, cramfile, cramindex, from, to, base, chunkid, rg, bwaprefix -> - tuple([ id : meta.id, - size: file(cramfile).size() ], - cramfile ) + + ch_cram_files = GrabFiles( get_reads_input ) + + ch_cram_files + .collect() + .map { meta, cram -> + tuple( [ id: 'cram', + sz: cram instanceof ArrayList ? cram.collect { it.size()} : cram.size() ], + cram + ) } .set { ch_reporting_cram } @@ -281,3 +286,16 @@ workflow HIC_MAPPING { ch_reporting = ch_reporting_cram.collect() versions = ch_versions.ifEmpty(null) } + +process GrabFiles { + tag "${meta.id}" + executor 'local' + + input: + tuple val(meta), path("in") + + output: + tuple val(meta), path("in/*.cram") + + "true" +} diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index 8d062c03..65963626 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -329,25 +329,26 @@ workflow LONGREAD_COVERAGE { ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions) // + // LOGIC: // - // - ch_read_paths - .map { meta, read_path -> - tuple( - [ id : meta.id, - sz : file( read_path ).size() - ], - read_path, - ) - } - .set { ch_for_PacBio } + ch_grabbed_read_paths.map{it} + + ch_grabbed_read_paths + .collect() + .map { meta, fasta -> + tuple( [ id: 'pacbio', + sz: fasta instanceof ArrayList ? fasta.collect { it.size()} : fasta.size() ], + fasta + ) + } + .set { ch_reporting_pacbio } emit: ch_minbed = BEDTOOLS_MERGE_MIN.out.bed ch_halfbed = FINDHALFCOVERAGE.out.bed ch_maxbed = BEDTOOLS_MERGE_MAX.out.bed ch_bigwig = UCSC_BEDGRAPHTOBIGWIG.out.bigwig - ch_reporting = ch_for_PacBio.collect() + ch_reporting = ch_reporting_pacbio.collect() versions = ch_versions } From f6a954a81a27345333188cb3e0591992c98d495b Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Fri, 28 Jul 2023 16:45:52 +0100 Subject: [PATCH 60/85] Adding reporting to rapid workflow --- conf/modules.config | 2 +- workflows/treeval_rapid.nf | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index bd041e52..77d1dbea 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -22,7 +22,7 @@ process { // Files to be uploaded to the TreeVal JBrowse2 instance // .genome, .gz.{tbi|csi}, .bigBed, .bigWig, .paf - withName: 'GENERATE_GENOME_FILE|TABIX_BGZIPTABIX|UCSC_BEDTOBIGBED|UCSC_BEDGRAPHTOBIGWIG|.*:.*:SYNTENY:MINIMAP2_ALIGN' { + withName: 'GENERATE_GENOME_FILE|TABIX_BGZIPTABIX|UCSC_BEDTOBIGBED|UCSC_BEDGRAPHTOBIGWIG|.*:.*:SYNTENY:MINIMAP2_ALIGN|.*:.*:GENERATE_GENOME:CUSTOM_GETCHROMSIZES' { publishDir = [ path: { "${params.outdir}/treeval_upload" }, mode: params.publish_dir_mode, diff --git a/workflows/treeval_rapid.nf b/workflows/treeval_rapid.nf index b74f3925..1fd8f17f 100755 --- a/workflows/treeval_rapid.nf +++ b/workflows/treeval_rapid.nf @@ -123,6 +123,28 @@ workflow TREEVAL_RAPID { ch_versions.unique().collectFile(name: 'collated_versions.yml') ) + // + // LOGIC: GENERATE SOME CHANNELS FOR REPORTING + // + GENERATE_GENOME.out.reference_tuple + .combine( YAML_INPUT.out.assembly_classT ) + .combine( YAML_INPUT.out.assembly_ttype ) + .map { meta, reference, lineage, ticket -> + tuple( + [ id: meta.id, + sz: file(reference).size(), + ln: lineage, + tk: ticket ], + reference + ) + } + .set { rf_data } + + params.sample_id = YAML_INPUT.out.assembly_id.collect() + params.rf_data = rf_data.collect() // reference data tuple( [ id, size, lineage, ticket ], file) + params.pb_data = LONGREAD_COVERAGE.out.ch_reporting.collect() // merged pacbio.bam data tuple( [ id, size ], file ) | Should really be a collected list of the raw fasta + params.cm_data = HIC_MAPPING.out.ch_reporting.collect() // merged cram.bam data tuple( [ id, size ], file ) | Should really be a collected list of the raw cram + emit: software_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.yml versions_ch = CUSTOM_DUMPSOFTWAREVERSIONS.out.versions @@ -139,7 +161,8 @@ workflow.onComplete { NfcoreTemplate.email(workflow, params, summary_params, projectDir, log) } NfcoreTemplate.summary(workflow, params, log) - // TreeValProject.summary(workflow, reference_tuple, summary_params, projectDir) + + TreeValProject.summary(workflow, params) } From deb0af8dd86724c9ba08fa3ec344382669c0745a Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 10:59:11 +0100 Subject: [PATCH 61/85] Resetting permissions --- workflows/treeval.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/workflows/treeval.nf b/workflows/treeval.nf index f4a8c481..75229e8c 100755 --- a/workflows/treeval.nf +++ b/workflows/treeval.nf @@ -123,6 +123,7 @@ workflow TREEVAL { // // SUBWORKFLOW: FOR SPLITTING THE REF GENOME INTO SCAFFOLD CHUNKS AND RUNNING SOME SUBWORKFLOWS // ON THOSE CHUNKS + // THIS WILL BE REQUIRED FOR LARGER GENOMES EST > 6GB // // REFERENCE_GENOME_SPLIT --> SELFCOMP // --> GENE_ALIGNMENT From a6146041775fedccadf55d8fe0345171ed235822 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 11:11:18 +0100 Subject: [PATCH 62/85] Adding spaces to fix github bug --- CITATIONS.md | 2 +- CODE_OF_CONDUCT.md | 2 +- LICENSE | 2 +- assets/adaptivecard.json | 2 +- assets/treeval_test.yaml | 1 + main.nf | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 460acae6..bc52ac1f 100755 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,6 +1,6 @@ # sanger-tol/treeval: Citations -## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) +## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/ ) > Ewels, P. et al. 2020. ‘The NF-core framework for community-curated bioinformatics pipelines’, Nature Biotechnology, 38(3), pp. 276–278. doi:10.1038/s41587-020-0439-x. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index f4fd052f..dacee074 100755 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -108,4 +108,4 @@ All reports will be handled with utmost discretion and confidentially. ### v1.0 - March 12th, 2021 -- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. +- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/ ) CoC. diff --git a/LICENSE b/LICENSE index dbbab5cd..ac4a5f34 100755 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2022-2023 Genome Research Ltd. +Copyright (c) 2022 - 2023 Genome Research Ltd. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/assets/adaptivecard.json b/assets/adaptivecard.json index 1dbe9c70..eac75b32 100755 --- a/assets/adaptivecard.json +++ b/assets/adaptivecard.json @@ -16,7 +16,7 @@ "type": "TextBlock", "size": "Large", "weight": "Bolder", - "color": "<% if (success) { %>Good<% } else { %>Attention<%} %>", + "color": "<% if ( success ) { %>Good<% } else { %>Attention<%} %>", "text": "sanger-tol/treeval v${version} - ${runName}", "wrap": true }, diff --git a/assets/treeval_test.yaml b/assets/treeval_test.yaml index 53f38c44..0563400c 100755 --- a/assets/treeval_test.yaml +++ b/assets/treeval_test.yaml @@ -25,3 +25,4 @@ busco: outdir: "NEEDS TESTING" intron: size: "50k" +fix: "testoing" diff --git a/main.nf b/main.nf index 0757da9d..15d7fa3c 100755 --- a/main.nf +++ b/main.nf @@ -14,7 +14,7 @@ nextflow.enable.dsl = 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -WorkflowMain.initialise(workflow, params, log) +WorkflowMain.initialise( workflow, params, log ) /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 1d03353d3d2261bb492d092d5ce204694735b4be Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 11:31:45 +0100 Subject: [PATCH 63/85] Adding spaces to fix github bug --- README.md | 26 +++++++++---------- assets/gene_alignment/assm_cdna.as | 2 +- assets/gene_alignment/assm_cds.as | 2 +- assets/gene_alignment/assm_pep.as | 2 +- assets/gene_alignment/assm_rna.as | 2 +- .../local_testing/nxOsc-2023-05-02.dp.TEST.md | 2 +- conf/digest.config | 2 +- conf/full_s3_test.config | 8 +++--- conf/igenomes.config | 2 +- conf/s3_test.config | 8 +++--- conf/selfcomp.config | 4 +-- conf/test.config | 8 +++--- conf/test_full.config | 6 ++--- docs/usage.md | 1 - main.nf | 8 +++--- .../cram_filter_align_bwamem2_fixmate_sort.nf | 2 +- modules/local/extract_repeat.nf | 4 +-- modules/local/get_largest_scaff.nf | 6 ++--- modules/local/get_synteny_genomes.nf | 4 +-- modules/local/makecmap_cmap2bed.nf | 6 ++--- modules/local/makecmap_fa2cmapmulticolor.nf | 2 +- modules/local/makecmap_renamecmapids.nf | 6 ++--- modules/local/selfcomp_alignmentblocks.nf | 6 ++--- modules/local/selfcomp_mapids.nf | 8 +++--- modules/local/selfcomp_mummer2bed.nf | 8 +++--- modules/local/selfcomp_splitfasta.nf | 12 ++++----- modules/nf-core/bwamem2/index/main.nf | 2 +- modules/nf-core/bwamem2/index/meta.yml | 2 +- .../custom/dumpsoftwareversions/main.nf | 2 +- .../custom/dumpsoftwareversions/meta.yml | 2 +- modules/nf-core/minimap2/align/meta.yml | 2 +- modules/nf-core/minimap2/index/meta.yml | 2 +- modules/nf-core/miniprot/index/meta.yml | 2 +- modules/nf-core/paftools/sam2paf/meta.yml | 2 +- modules/nf-core/samtools/sort/meta.yml | 2 +- modules/nf-core/tabix/bgziptabix/meta.yml | 2 +- .../tabix/bgziptabix/tabix-bgziptabix.diff | 2 +- pipeline_template.yml | 2 +- pyproject.toml | 2 +- tower.yml | 2 +- 40 files changed, 87 insertions(+), 88 deletions(-) diff --git a/README.md b/README.md index 164e0287..81bd54f3 100755 --- a/README.md +++ b/README.md @@ -13,19 +13,19 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool The treeval pipeline has a sister pipeline currently named [curationpretext](https://github.com/sanger-tol/curationpretext) which acts to regenerate the pretext maps and accessory files during genomic curation in order to confirm interventions. This pipeline is sufficiently different to the treeval implementation that it is written as it's own pipeline. -1. Parse input yaml (YAML_INPUT) -2. Generate my.genome file (GENERATE_GENOME) -3. Generate insilico digests of the input assembly (INSILICO_DIGEST) -4. Generate gene alignments with high quality data against the input assembly (GENE_ALIGNMENT) -5. Generate a repeat density graph (REPEAT_DENSITY) -6. Generate a gap track (GAP_FINDER) -7. Generate a map of self complementary sequence (SELFCOMP) -8. Generate syntenic alignments with a closely related high quality assembly (SYNTENY) -9. Generate a coverage track using PacBio data (LONGREAD_COVERAGE) -10. Generate HiC maps, pretext and higlass using HiC cram files (HIC_MAPPING) -11. Generate a telomere track based on input motif (TELO_FINDER) -12. Run Busco and convert results into bed format (BUSCO_ANNOTATION) -13. Ancestral Busco linkage if available for clade (BUSCO_ANNOTATION:ANCESTRAL_GENE) +1. Parse input yaml ( YAML_INPUT ) +2. Generate my.genome file ( GENERATE_GENOME ) +3. Generate insilico digests of the input assembly ( INSILICO_DIGEST ) +4. Generate gene alignments with high quality data against the input assembly ( GENE_ALIGNMENT ) +5. Generate a repeat density graph ( REPEAT_DENSITY ) +6. Generate a gap track ( GAP_FINDER ) +7. Generate a map of self complementary sequence ( SELFCOMP ) +8. Generate syntenic alignments with a closely related high quality assembly ( SYNTENY ) +9. Generate a coverage track using PacBio data ( LONGREAD_COVERAGE ) +10. Generate HiC maps, pretext and higlass using HiC cram files ( HIC_MAPPING ) +11. Generate a telomere track based on input motif ( TELO_FINDER ) +12. Run Busco and convert results into bed format ( BUSCO_ANNOTATION ) +13. Ancestral Busco linkage if available for clade ( BUSCO_ANNOTATION:ANCESTRAL_GENE ) ## Usage diff --git a/assets/gene_alignment/assm_cdna.as b/assets/gene_alignment/assm_cdna.as index f8e7afbe..30552cc5 100755 --- a/assets/gene_alignment/assm_cdna.as +++ b/assets/gene_alignment/assm_cdna.as @@ -8,5 +8,5 @@ string name; "Name of gene" uint score; "Score" char[1] strand; "+ or - for strand" string geneSymbol; "Gene Symbol" -string ensemblId; "Ensembl Accession number" +string ensemblId; "Ensembl Accession number" ) diff --git a/assets/gene_alignment/assm_cds.as b/assets/gene_alignment/assm_cds.as index 63002786..4306c459 100755 --- a/assets/gene_alignment/assm_cds.as +++ b/assets/gene_alignment/assm_cds.as @@ -8,5 +8,5 @@ string name; "Name of gene" uint score; "Score" char[1] strand; "+ or - for strand" string geneSymbol; "Gene Symbol" -string ensemblId; "Ensembl Accession number" +string ensemblId; "Ensembl Accession number" ) diff --git a/assets/gene_alignment/assm_pep.as b/assets/gene_alignment/assm_pep.as index a63070c7..40b8701f 100755 --- a/assets/gene_alignment/assm_pep.as +++ b/assets/gene_alignment/assm_pep.as @@ -8,5 +8,5 @@ string name; "Name of gene" uint score; "Score" char[1] strand; "+ or - for strand" string geneSymbol; "Gene Symbol" -string ensemblId; "Ensembl Accession number" +string ensemblId; "Ensembl Accession number" ) diff --git a/assets/gene_alignment/assm_rna.as b/assets/gene_alignment/assm_rna.as index 9edf6cbd..f28bdf37 100755 --- a/assets/gene_alignment/assm_rna.as +++ b/assets/gene_alignment/assm_rna.as @@ -8,5 +8,5 @@ string name; "Name of gene" uint score; "Score" char[1] strand; "+ or - for strand" string geneSymbol; "Gene Symbol" -string ensemblId; "Ensembl Accession number" +string ensemblId; "Ensembl Accession number" ) diff --git a/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md b/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md index 32fbd6d0..8bdc4c2c 100755 --- a/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md +++ b/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md @@ -28,4 +28,4 @@ e5fed140728b0f0d088d983a34868d8d punchlist/OscheiusTipulae.ASM1342590v1_cdna_pun 9d2cca3997c9a60f66516af739eb3719 repeat/Oscheius_DF5033_renamed.bed bb92039394cc0f2e9e6809e78be4bc9e rna/CaenorhabditisElegans.WBcel235_rna.bigBed 4254dcb32d0aed160e03d3f6c02cf636 rna/Gae_host.Gae_rna.bigBed -b2d9bea322639d2b0954a0ccc7eed800 selfcomp/Oscheius_DF5033_selfcomp.bigBed +b2d9bea322639d2b0954a0ccc7eed800 selfcomp/Oscheius_DF5033_selfcomp.bigBed diff --git a/conf/digest.config b/conf/digest.config index 9cd3d209..cc8abab5 100755 --- a/conf/digest.config +++ b/conf/digest.config @@ -25,6 +25,6 @@ conda { createTimeout = "120 min" } // Load test_data.config containing paths to test data //includeConfig 'test_data.config' -manifest { +manifest { nextflowVersion = '!>=21.10.0' } diff --git a/conf/full_s3_test.config b/conf/full_s3_test.config index 1674f7ca..89d7cecf 100755 --- a/conf/full_s3_test.config +++ b/conf/full_s3_test.config @@ -15,10 +15,10 @@ params { config_profile_description = 'Minimal Test Data for GitHub Actions test' // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = '6.GB' - max_time = '6.h' + max_cpus = 2 + max_memory = '6.GB' + max_time = '6.h' // Input data - input = "${projectDir}/assets/full_s3_treeval_test.yaml" + input = "${projectDir}/assets/full_s3_treeval_test.yaml" } diff --git a/conf/igenomes.config b/conf/igenomes.config index 7a1b3ac6..c2b8d501 100755 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -417,7 +417,7 @@ params { mito_name = "chrM" macs_gsize = "1.2e7" } - 'susScr3' { + 'susScr3' { fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" diff --git a/conf/s3_test.config b/conf/s3_test.config index bb684f90..65bc1f09 100755 --- a/conf/s3_test.config +++ b/conf/s3_test.config @@ -15,10 +15,10 @@ params { config_profile_description = 'Minimal Test Data for GitHub Actions test' // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = '6.GB' - max_time = '6.h' + max_cpus = 2 + max_memory = '6.GB' + max_time = '6.h' // Input data - input = "${projectDir}/assets/s3_treeval_test.yaml" + input = "${projectDir}/assets/s3_treeval_test.yaml" } diff --git a/conf/selfcomp.config b/conf/selfcomp.config index 9cd3d209..29b7a3b4 100755 --- a/conf/selfcomp.config +++ b/conf/selfcomp.config @@ -1,6 +1,6 @@ params { - outdir = "output/" - publish_dir_mode = "copy" + outdir = "output/" + publish_dir_mode = "copy" singularity_pull_docker_container = false } diff --git a/conf/test.config b/conf/test.config index 087f0165..c3a6bb5e 100755 --- a/conf/test.config +++ b/conf/test.config @@ -18,9 +18,9 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Limit resources so that this can run on GitHub Actions - max_cpus = 6 - max_memory = '12.GB' - max_time = '6.h' + max_cpus = 6 + max_memory = '12.GB' + max_time = '6.h' - input = 'assets/local_testing/nxOscSUBSET.yaml' + input = 'assets/local_testing/nxOscSUBSET.yaml' } diff --git a/conf/test_full.config b/conf/test_full.config index e6e1025a..5d6a9617 100755 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -16,8 +16,8 @@ cleanup = true params { - config_profile_name = 'Full local test profile' - config_profile_description = 'Full test dataset to check pipeline function, using a current full local dataset' + config_profile_name = 'Full local test profile' + config_profile_description = 'Full test dataset to check pipeline function, using a current full local dataset' - input = 'assets/local_testing/nxOscDF5033.yaml' + input = 'assets/local_testing/nxOscDF5033.yaml' } diff --git a/docs/usage.md b/docs/usage.md index 321329bf..3c22bb76 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -29,7 +29,6 @@ These folders will contain your fasta files. The data per organism will be descr The samplesheet for this pipeline is as shown below. This yaml is parsed by the pipeline and converted into the relavent channels. - `assembly` - - `sizeClass`: {S | L} denotes the size of genome S = <4Gb. - `sample_id`: ToLID of the sample. - `latin_name`: Latin identification of species - `classT`: Clade name (as used to group synteny sequences and to complete alignment/data_dir). diff --git a/main.nf b/main.nf index 15d7fa3c..5e412368 100755 --- a/main.nf +++ b/main.nf @@ -27,11 +27,11 @@ include { TREEVAL_RAPID } from './workflows/treeval_rapid' // WORKFLOW: Run main sanger-tol/treeval analysis pipeline workflow SANGERTOL_TREEVAL { - TREEVAL () + TREEVAL () } workflow SANGERTOL_TREEVAL_RAPID { - TREEVAL_RAPID () + TREEVAL_RAPID () } /* @@ -44,11 +44,11 @@ workflow SANGERTOL_TREEVAL_RAPID { // WORKFLOW: Execute named workflow for the pipeline // workflow FULL { - SANGERTOL_TREEVAL () + SANGERTOL_TREEVAL () } workflow RAPID { - SANGERTOL_TREEVAL_RAPID () + SANGERTOL_TREEVAL_RAPID () } /* diff --git a/modules/local/cram_filter_align_bwamem2_fixmate_sort.nf b/modules/local/cram_filter_align_bwamem2_fixmate_sort.nf index fe7dff81..f65298aa 100755 --- a/modules/local/cram_filter_align_bwamem2_fixmate_sort.nf +++ b/modules/local/cram_filter_align_bwamem2_fixmate_sort.nf @@ -32,7 +32,7 @@ process CRAM_FILTER_ALIGN_BWAMEM2_FIXMATE_SORT { bwa-mem2: \$(bwa-mem2 --version | sed 's/bwa-mem2 //g') END_VERSIONS """ - // temp removal staden_io_lib: \$(echo \$(staden_io_lib --version 2>&1) | sed 's/^.*staden_io_lib //; s/Using.*\$//') + // temp removal staden_io_lib: \$(echo \$(staden_io_lib --version 2>&1) | sed 's/^.*staden_io_lib //; s/Using.*\$//') CAUSES ERROR stub: def prefix = task.ext.prefix ?: "${meta.id}" diff --git a/modules/local/extract_repeat.nf b/modules/local/extract_repeat.nf index 13f2898c..801c9b45 100755 --- a/modules/local/extract_repeat.nf +++ b/modules/local/extract_repeat.nf @@ -18,7 +18,7 @@ process EXTRACT_REPEAT { task.ext.when == null || task.ext.when script: - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = "1.0" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ extract_repeat.pl $file > ${prefix}_repeats.bed @@ -31,7 +31,7 @@ process EXTRACT_REPEAT { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" def VERSION = "1.0" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ touch ${prefix}_repeats.bed diff --git a/modules/local/get_largest_scaff.nf b/modules/local/get_largest_scaff.nf index 1819f4dd..3e3fc2d7 100755 --- a/modules/local/get_largest_scaff.nf +++ b/modules/local/get_largest_scaff.nf @@ -16,7 +16,7 @@ process GET_LARGEST_SCAFF { path "versions.yml" , emit: versions shell: - def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. $/ largest_scaff=`head -n 1 "${file}" | cut -d$'\t' -f2` @@ -27,8 +27,8 @@ process GET_LARGEST_SCAFF { /$ stub: - def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ largest_scaff=1000000 diff --git a/modules/local/get_synteny_genomes.nf b/modules/local/get_synteny_genomes.nf index 8e2b4a5f..933ebb57 100755 --- a/modules/local/get_synteny_genomes.nf +++ b/modules/local/get_synteny_genomes.nf @@ -16,7 +16,7 @@ process GET_SYNTENY_GENOMES { path "versions.yml" , emit: versions script: - def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ if [ ! -d ${synteny_path}${assembly_classT}/ ] || [ -z "\$(ls -A ${synteny_path}${assembly_classT}/)" ] then @@ -34,7 +34,7 @@ process GET_SYNTENY_GENOMES { """ stub: - def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. """ touch empty.fasta diff --git a/modules/local/makecmap_cmap2bed.nf b/modules/local/makecmap_cmap2bed.nf index 90addde9..533abd79 100755 --- a/modules/local/makecmap_cmap2bed.nf +++ b/modules/local/makecmap_cmap2bed.nf @@ -19,8 +19,8 @@ process MAKECMAP_CMAP2BED { 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}" """ grep -v '#' $cmap > ${prefix}_${enzyme}_edited.cmap cmap2bed.py -t ${prefix}_${enzyme}_edited.cmap -z $enzyme | sort -k1,1 -k2,2n > ${enzyme}.bed @@ -33,7 +33,7 @@ process MAKECMAP_CMAP2BED { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_${enzyme}.bed diff --git a/modules/local/makecmap_fa2cmapmulticolor.nf b/modules/local/makecmap_fa2cmapmulticolor.nf index 0adeba13..6aa8e406 100755 --- a/modules/local/makecmap_fa2cmapmulticolor.nf +++ b/modules/local/makecmap_fa2cmapmulticolor.nf @@ -20,7 +20,7 @@ process MAKECMAP_FA2CMAPMULTICOLOR { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' """ fa2cmap_multi_color.pl -i $fasta -e $enzyme 1 $args diff --git a/modules/local/makecmap_renamecmapids.nf b/modules/local/makecmap_renamecmapids.nf index 1f158a01..ef162457 100755 --- a/modules/local/makecmap_renamecmapids.nf +++ b/modules/local/makecmap_renamecmapids.nf @@ -19,8 +19,8 @@ process MAKECMAP_RENAMECMAPIDS { 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}" """ rename_cmapids.pl -cmapfile $cmap -idx_key $keys $args > ${prefix}_EDITED.cmap @@ -33,7 +33,7 @@ process MAKECMAP_RENAMECMAPIDS { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_EDITED.cmap diff --git a/modules/local/selfcomp_alignmentblocks.nf b/modules/local/selfcomp_alignmentblocks.nf index d54dc8e8..5d23431a 100755 --- a/modules/local/selfcomp_alignmentblocks.nf +++ b/modules/local/selfcomp_alignmentblocks.nf @@ -18,8 +18,8 @@ process SELFCOMP_ALIGNMENTBLOCKS { 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}" """ build_alignment_block.py $args -i $bedfile -o ${prefix}_chained.block @@ -33,7 +33,7 @@ process SELFCOMP_ALIGNMENTBLOCKS { """ stub: - def prefix = task.ext.prefix ?: "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_chained.block diff --git a/modules/local/selfcomp_mapids.nf b/modules/local/selfcomp_mapids.nf index 42fc9b34..c19d7393 100755 --- a/modules/local/selfcomp_mapids.nf +++ b/modules/local/selfcomp_mapids.nf @@ -19,8 +19,8 @@ process SELFCOMP_MAPIDS { 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}" """ mapids.py -i $bed -r $agp > ${prefix}_mapped.bed @@ -32,8 +32,8 @@ process SELFCOMP_MAPIDS { """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}_mapped.bed diff --git a/modules/local/selfcomp_mummer2bed.nf b/modules/local/selfcomp_mummer2bed.nf index 1087523c..c38f6d88 100755 --- a/modules/local/selfcomp_mummer2bed.nf +++ b/modules/local/selfcomp_mummer2bed.nf @@ -19,8 +19,8 @@ process SELFCOMP_MUMMER2BED { 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}" """ mummer2bed.py $args -i $mummerfile -l $motiflen > ${prefix}.bed @@ -33,8 +33,8 @@ process SELFCOMP_MUMMER2BED { """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${prefix}.bed diff --git a/modules/local/selfcomp_splitfasta.nf b/modules/local/selfcomp_splitfasta.nf index d1aa7edb..be4584b2 100755 --- a/modules/local/selfcomp_splitfasta.nf +++ b/modules/local/selfcomp_splitfasta.nf @@ -19,9 +19,9 @@ process SELFCOMP_SPLITFASTA { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = "1.7.8-1" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = "1.7.8-1" """ split_genomes_for_ensembl.pl $fasta ${prefix}_split.fa ${prefix}_split.agp @@ -34,9 +34,9 @@ process SELFCOMP_SPLITFASTA { """ stub: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - def VERSION = "1.7.8-1" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def VERSION = "1.7.8-1" """ touch ${prefix}_split.agp touch ${prefix}_split.fa diff --git a/modules/nf-core/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf index 30940852..62458b61 100755 --- a/modules/nf-core/bwamem2/index/main.nf +++ b/modules/nf-core/bwamem2/index/main.nf @@ -18,7 +18,7 @@ process BWAMEM2_INDEX { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' """ mkdir bwamem2 bwa-mem2 \\ diff --git a/modules/nf-core/bwamem2/index/meta.yml b/modules/nf-core/bwamem2/index/meta.yml index 40c26c38..e5d0aa3c 100755 --- a/modules/nf-core/bwamem2/index/meta.yml +++ b/modules/nf-core/bwamem2/index/meta.yml @@ -12,7 +12,7 @@ tools: a large reference genome, such as the human genome. homepage: https://github.com/bwa-mem2/bwa-mem2 documentation: https://github.com/bwa-mem2/bwa-mem2#usage - licence: ["MIT"] + licence: [ "MIT" ] input: - meta: type: map diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index ebc87273..29a40298 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -19,6 +19,6 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' } diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index c32657de..73053a43 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -10,7 +10,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: ["MIT"] + licence: [ "MIT" ] input: - versions: type: file diff --git a/modules/nf-core/minimap2/align/meta.yml b/modules/nf-core/minimap2/align/meta.yml index 991b39a0..6788a032 100755 --- a/modules/nf-core/minimap2/align/meta.yml +++ b/modules/nf-core/minimap2/align/meta.yml @@ -13,7 +13,7 @@ tools: A versatile pairwise aligner for genomic and spliced nucleotide sequences. homepage: https://github.com/lh3/minimap2 documentation: https://github.com/lh3/minimap2#uguide - licence: ["MIT"] + licence: [ "MIT" ] input: - meta: type: map diff --git a/modules/nf-core/minimap2/index/meta.yml b/modules/nf-core/minimap2/index/meta.yml index b58f35c6..892d2496 100755 --- a/modules/nf-core/minimap2/index/meta.yml +++ b/modules/nf-core/minimap2/index/meta.yml @@ -10,7 +10,7 @@ tools: A versatile pairwise aligner for genomic and spliced nucleotide sequences. homepage: https://github.com/lh3/minimap2 documentation: https://github.com/lh3/minimap2#uguide - licence: ["MIT"] + licence: [ "MIT" ] input: - meta: type: map diff --git a/modules/nf-core/miniprot/index/meta.yml b/modules/nf-core/miniprot/index/meta.yml index 3a098802..2b8e6e23 100755 --- a/modules/nf-core/miniprot/index/meta.yml +++ b/modules/nf-core/miniprot/index/meta.yml @@ -11,7 +11,7 @@ tools: A versatile pairwise aligner for genomic and protein sequences. homepage: https://github.com/lh3/miniprot documentation: https://github.com/lh3/miniprot - licence: ["MIT"] + licence: [ "MIT" ] input: - meta: type: map diff --git a/modules/nf-core/paftools/sam2paf/meta.yml b/modules/nf-core/paftools/sam2paf/meta.yml index bc08f9a9..35071b07 100755 --- a/modules/nf-core/paftools/sam2paf/meta.yml +++ b/modules/nf-core/paftools/sam2paf/meta.yml @@ -10,7 +10,7 @@ tools: A program to manipulate paf files / convert to and from paf. homepage: https://github.com/lh3/minimap2 documentation: https://github.com/lh3/minimap2/blob/master/README.md - licence: ["MIT"] + licence: [ "MIT" ] input: - meta: type: map diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml index 07328431..80ee08e1 100755 --- a/modules/nf-core/samtools/sort/meta.yml +++ b/modules/nf-core/samtools/sort/meta.yml @@ -14,7 +14,7 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] + licence: [ "MIT" ] input: - meta: type: map diff --git a/modules/nf-core/tabix/bgziptabix/meta.yml b/modules/nf-core/tabix/bgziptabix/meta.yml index 2761e271..da9fd66f 100755 --- a/modules/nf-core/tabix/bgziptabix/meta.yml +++ b/modules/nf-core/tabix/bgziptabix/meta.yml @@ -12,7 +12,7 @@ tools: homepage: https://www.htslib.org/doc/tabix.html documentation: https://www.htslib.org/doc/tabix.1.html doi: 10.1093/bioinformatics/btq671 - licence: ["MIT"] + licence: [ "MIT" ] input: - meta: type: map diff --git a/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff b/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff index 55016165..90e3d55b 100755 --- a/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff +++ b/modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff @@ -14,5 +14,5 @@ Changes in module 'nf-core/tabix/bgziptabix' """ bgzip --threads ${task.cpus} -c $args $input > ${prefix}.${input.getExtension()}.gz tabix $args2 ${prefix}.${input.getExtension()}.gz - + ************************************************************ diff --git a/pipeline_template.yml b/pipeline_template.yml index 0aa7398f..a7e3d014 100755 --- a/pipeline_template.yml +++ b/pipeline_template.yml @@ -1,3 +1,3 @@ -prefix: sanger-tol +prefix: sanger-tol skip: - igenomes diff --git a/pyproject.toml b/pyproject.toml index 0d62beb6..6102010c 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ # Should be kept the same as nf-core/tools to avoid fighting with template synchronisation. [tool.black] line-length = 120 -target_version = ["py37", "py38", "py39", "py310"] +target_version = ["py37", "py38", "py39", "py310" ] [tool.isort] profile = "black" diff --git a/tower.yml b/tower.yml index 787aedfe..55bc3522 100755 --- a/tower.yml +++ b/tower.yml @@ -1,5 +1,5 @@ reports: multiqc_report.html: display: "MultiQC HTML report" - samplesheet.csv: + samplesheet.csv : display: "Auto-created samplesheet with collated metadata and FASTQ paths" From af14d00765ec391f37912d511b952e038fc9dab8 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 11:55:59 +0100 Subject: [PATCH 64/85] Adding spaces to fix github bug --- assets/full_s3_treeval_test.yaml | 1 - assets/methods_description_template.yml | 4 ++-- assets/multiqc_config.yml | 6 +++--- assets/nematode/csv_data/s3_Gae_Host.Gae-data.csv | 10 +++++----- assets/s3_treeval_test.yaml | 1 - assets/schema_input.json | 2 +- assets/sendmail_template.txt | 2 +- assets/slackreport.json | 2 +- 8 files changed, 13 insertions(+), 15 deletions(-) diff --git a/assets/full_s3_treeval_test.yaml b/assets/full_s3_treeval_test.yaml index 7e688b5d..911260b0 100755 --- a/assets/full_s3_treeval_test.yaml +++ b/assets/full_s3_treeval_test.yaml @@ -1,5 +1,4 @@ assembly: - sizeClass: "" # S if {genome => 4Gb} else L level: scaffold sample_id: nxOscDoli1 classT: nematode diff --git a/assets/methods_description_template.yml b/assets/methods_description_template.yml index b42a1ed9..6a3f02fd 100755 --- a/assets/methods_description_template.yml +++ b/assets/methods_description_template.yml @@ -3,8 +3,8 @@ description: "Suggested text and references to use when describing pipeline usag section_name: "sanger-tol/treeval Methods Description" section_href: "https://github.com/sanger-tol/treeval" plot_type: "html" -## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline -## You inject any metadata in the Nextflow '${workflow}' object +## TODO nf-core: Update the HTML below to your prefered methods description, e.g. add publication citation for this pipeline +## You inject any metadata in the Nextflow '${workflow}' object data: |

Methods

Data was processed using sanger-tol/treeval v${workflow.manifest.version} ${doi_text} of the sanger-tol collection of workflows, created using nf-core (Ewels et al., 2020).

diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index e68a4f0a..a6721584 100755 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,10 +3,10 @@ report_comment: > analysis pipeline. report_section_order: "sanger-tol-treeval-methods-description": - order: -1000 + order: -1000 software_versions: - order: -1001 + order: -1001 "sanger-tol-treeval-summary": - order: -1002 + order: -1002 export_plots: true diff --git a/assets/nematode/csv_data/s3_Gae_Host.Gae-data.csv b/assets/nematode/csv_data/s3_Gae_Host.Gae-data.csv index b967de78..dca2b3dd 100755 --- a/assets/nematode/csv_data/s3_Gae_Host.Gae-data.csv +++ b/assets/nematode/csv_data/s3_Gae_Host.Gae-data.csv @@ -1,5 +1,5 @@ -org,type,data_file -Gae_host.Gae,cdna,https://tolit.cog.sanger.ac.uk/test-data/Gae_host/genomic_data/gene_alignment/Gae_host5000cdna.MOD.fa -Gae_host.Gae,cds,https://tolit.cog.sanger.ac.uk/test-data/Gae_host/genomic_data/gene_alignment/Gae_host12003cds.MOD.fa -Gae_host.Gae,pep,https://tolit.cog.sanger.ac.uk/test-data/Gae_host/genomic_data/gene_alignment/Gae_host12005pep.MOD.fa -Gae_host.Gae,rna,https://tolit.cog.sanger.ac.uk/test-data/Gae_host/genomic_data/gene_alignment/Gae_host18005rna.MOD.fa +org, type, data_file +Gae_host.Gae, cdna, https://tolit.cog.sanger.ac.uk/test-data/Gae_host/genomic_data/gene_alignment/Gae_host5000cdna.MOD.fa +Gae_host.Gae, cds, https://tolit.cog.sanger.ac.uk/test-data/Gae_host/genomic_data/gene_alignment/Gae_host12003cds.MOD.fa +Gae_host.Gae, pep, https://tolit.cog.sanger.ac.uk/test-data/Gae_host/genomic_data/gene_alignment/Gae_host12005pep.MOD.fa +Gae_host.Gae, rna, https://tolit.cog.sanger.ac.uk/test-data/Gae_host/genomic_data/gene_alignment/Gae_host18005rna.MOD.fa diff --git a/assets/s3_treeval_test.yaml b/assets/s3_treeval_test.yaml index cc80c4bd..d3ddb32a 100755 --- a/assets/s3_treeval_test.yaml +++ b/assets/s3_treeval_test.yaml @@ -1,5 +1,4 @@ assembly: - sizeClass: "" # S if {genome => 4Gb} else L level: scaffold sample_id: nxOscDoli1 classT: nematode diff --git a/assets/schema_input.json b/assets/schema_input.json index 7240ae81..631e24d3 100755 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -31,6 +31,6 @@ ] } }, - "required": ["sample", "fastq_1"] + "required": [ "sample", "fastq_1" ] } } diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 7652fd11..3d299c57 100755 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -26,7 +26,7 @@ Content-Disposition: inline; filename="sanger-tol-treeval_logo_light.png" join( '\n' ) %> <% -if (mqcFile){ +if ( mqcFile ){ def mqcFileObj = new File("$mqcFile") if (mqcFileObj.length() < mqcMaxSize){ out << """ diff --git a/assets/slackreport.json b/assets/slackreport.json index 1fcea494..bdc3b859 100755 --- a/assets/slackreport.json +++ b/assets/slackreport.json @@ -2,7 +2,7 @@ "attachments": [ { "fallback": "Plain-text summary of the attachment.", - "color": "<% if (success) { %>good<% } else { %>danger<%} %>", + "color": "<% if ( success ) { %>good<% } else { %>danger<%} %>", "author_name": "sanger-tol/treeval v${version} - ${runName}", "author_icon": "https://www.nextflow.io/docs/latest/_static/favicon.ico", "text": "<% if (success) { %>Pipeline completed successfully!<% } else { %>Pipeline completed with errors<% } %>", From 4d5dcd2a7410bbb1ae45a2e0d173a4680d2f7eaf Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 12:00:00 +0100 Subject: [PATCH 65/85] Adding spaces to fix github bug --- assets/digest/digest.as | 10 +++++----- assets/email_template.html | 4 ++-- assets/email_template.txt | 4 ++-- modules/nf-core/miniprot/align/meta.yml | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/assets/digest/digest.as b/assets/digest/digest.as index 5ded115f..5b6272fa 100755 --- a/assets/digest/digest.as +++ b/assets/digest/digest.as @@ -1,9 +1,9 @@ table insilico_digest "bionano digest cut sites" ( -string chrom; "Reference sequence chromosome or scaffold" -uint chromStart; "Start position of feature on chromosome" -uint chromEnd; "End position of feature on chromosome" -string name; "Name of enzyme" -string length; "length of fragment" +string chrom; "Reference sequence chromosome or scaffold" +uint chromStart; "Start position of feature on chromosome" +uint chromEnd; "End position of feature on chromosome" +string name; "Name of enzyme" +string length; "length of fragment" ) diff --git a/assets/email_template.html b/assets/email_template.html index 6d58d16e..bc5dc98f 100755 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -12,10 +12,10 @@ -

sanger-tol/treeval v${version}

+

sanger-tol/treeval v${ version }

Run Name: $runName

-<% if (!success){ +<% if ( !success ){ out << """

sanger-tol/treeval execution completed unsuccessfully!

diff --git a/assets/email_template.txt b/assets/email_template.txt index fc03acac..a7226e3c 100755 --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -1,6 +1,6 @@ Run Name: $runName -<% if (success){ +<% if ( success ){ out << "## sanger-tol/treeval execution completed successfully! ##" } else { out << """#################################################### @@ -9,7 +9,7 @@ Run Name: $runName The exit status of the task that caused the workflow execution to fail was: $exitStatus. The full error message was: -${errorReport} +${ errorReport } """ } %> diff --git a/modules/nf-core/miniprot/align/meta.yml b/modules/nf-core/miniprot/align/meta.yml index 503579e5..45416c2a 100755 --- a/modules/nf-core/miniprot/align/meta.yml +++ b/modules/nf-core/miniprot/align/meta.yml @@ -13,7 +13,7 @@ tools: A versatile pairwise aligner for genomic and protein sequences. homepage: https://github.com/lh3/miniprot documentation: https://github.com/lh3/miniprot - licence: ["MIT"] + licence: [ "MIT" ] input: - meta: type: map From b34a8f0e967fdcded341b7adab2071f97e6076f4 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 12:01:41 +0100 Subject: [PATCH 66/85] Adding spaces to fix github bug --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 81bd54f3..4e0cf096 100755 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ The treeval pipeline has a sister pipeline currently named [curationpretext](htt > 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. -Currently, it is advised to run the pipeline with docker or singularity as a couple of major modules do not currently have a conda env associated with them. +Currently, it is advised to run the pipeline with docker or singularity as a small number of major modules do not currently have a conda env associated with them. Now, you can run the pipeline using: From d2efd3678fa5e108b76e18e43c8d6a622550fe7d Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 12:02:44 +0100 Subject: [PATCH 67/85] Adding spaces to fix github bug --- modules/nf-core/busco/main.nf | 10 +++++----- modules/nf-core/miniprot/align/meta.yml | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/nf-core/busco/main.nf b/modules/nf-core/busco/main.nf index b40014eb..bcd09332 100755 --- a/modules/nf-core/busco/main.nf +++ b/modules/nf-core/busco/main.nf @@ -24,11 +24,11 @@ process BUSCO { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}-${lineage}" - def busco_config = config_file ? "--config $config_file" : '' - def busco_lineage = lineage.equals('auto') ? '--auto-lineage' : "--lineage_dataset ${lineage}" - def busco_lineage_dir = busco_lineages_path ? "--offline --download_path ${busco_lineages_path}" : '' + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}-${lineage}" + def busco_config = config_file ? "--config $config_file" : '' + def busco_lineage = lineage.equals('auto') ? '--auto-lineage' : "--lineage_dataset ${lineage}" + def busco_lineage_dir = busco_lineages_path ? "--offline --download_path ${busco_lineages_path}" : '' """ # Nextflow changes the container --entrypoint to /bin/bash (container default entrypoint: /usr/local/env-execute) # Check for container variable initialisation script and source it. diff --git a/modules/nf-core/miniprot/align/meta.yml b/modules/nf-core/miniprot/align/meta.yml index 45416c2a..503579e5 100755 --- a/modules/nf-core/miniprot/align/meta.yml +++ b/modules/nf-core/miniprot/align/meta.yml @@ -13,7 +13,7 @@ tools: A versatile pairwise aligner for genomic and protein sequences. homepage: https://github.com/lh3/miniprot documentation: https://github.com/lh3/miniprot - licence: [ "MIT" ] + licence: ["MIT"] input: - meta: type: map From ac805d78a869877df7c30f9b1f204687a57b59f5 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 12:21:19 +0100 Subject: [PATCH 68/85] linting fixes --- CITATIONS.md | 2 +- CODE_OF_CONDUCT.md | 2 +- assets/local_testing/nxOsc-2023-05-02.dp.TEST.md | 2 +- assets/multiqc_config.yml | 6 +++--- assets/schema_input.json | 2 +- modules/nf-core/bwamem2/index/meta.yml | 2 +- modules/nf-core/custom/dumpsoftwareversions/meta.yml | 2 +- modules/nf-core/minimap2/align/meta.yml | 2 +- modules/nf-core/minimap2/index/meta.yml | 2 +- modules/nf-core/miniprot/index/meta.yml | 2 +- modules/nf-core/paftools/sam2paf/meta.yml | 2 +- modules/nf-core/samtools/sort/meta.yml | 2 +- modules/nf-core/tabix/bgziptabix/meta.yml | 2 +- pipeline_template.yml | 2 +- tower.yml | 2 +- 15 files changed, 17 insertions(+), 17 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index bc52ac1f..460acae6 100755 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -1,6 +1,6 @@ # sanger-tol/treeval: Citations -## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/ ) +## [nf-core](https://pubmed.ncbi.nlm.nih.gov/32055031/) > Ewels, P. et al. 2020. ‘The NF-core framework for community-curated bioinformatics pipelines’, Nature Biotechnology, 38(3), pp. 276–278. doi:10.1038/s41587-020-0439-x. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index dacee074..f4fd052f 100755 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -108,4 +108,4 @@ All reports will be handled with utmost discretion and confidentially. ### v1.0 - March 12th, 2021 -- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/ ) CoC. +- Complete rewrite from original [Contributor Covenant](http://contributor-covenant.org/) CoC. diff --git a/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md b/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md index 8bdc4c2c..32fbd6d0 100755 --- a/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md +++ b/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md @@ -28,4 +28,4 @@ e5fed140728b0f0d088d983a34868d8d punchlist/OscheiusTipulae.ASM1342590v1_cdna_pun 9d2cca3997c9a60f66516af739eb3719 repeat/Oscheius_DF5033_renamed.bed bb92039394cc0f2e9e6809e78be4bc9e rna/CaenorhabditisElegans.WBcel235_rna.bigBed 4254dcb32d0aed160e03d3f6c02cf636 rna/Gae_host.Gae_rna.bigBed -b2d9bea322639d2b0954a0ccc7eed800 selfcomp/Oscheius_DF5033_selfcomp.bigBed +b2d9bea322639d2b0954a0ccc7eed800 selfcomp/Oscheius_DF5033_selfcomp.bigBed diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml index a6721584..e68a4f0a 100755 --- a/assets/multiqc_config.yml +++ b/assets/multiqc_config.yml @@ -3,10 +3,10 @@ report_comment: > analysis pipeline. report_section_order: "sanger-tol-treeval-methods-description": - order: -1000 + order: -1000 software_versions: - order: -1001 + order: -1001 "sanger-tol-treeval-summary": - order: -1002 + order: -1002 export_plots: true diff --git a/assets/schema_input.json b/assets/schema_input.json index 631e24d3..7240ae81 100755 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -31,6 +31,6 @@ ] } }, - "required": [ "sample", "fastq_1" ] + "required": ["sample", "fastq_1"] } } diff --git a/modules/nf-core/bwamem2/index/meta.yml b/modules/nf-core/bwamem2/index/meta.yml index e5d0aa3c..40c26c38 100755 --- a/modules/nf-core/bwamem2/index/meta.yml +++ b/modules/nf-core/bwamem2/index/meta.yml @@ -12,7 +12,7 @@ tools: a large reference genome, such as the human genome. homepage: https://github.com/bwa-mem2/bwa-mem2 documentation: https://github.com/bwa-mem2/bwa-mem2#usage - licence: [ "MIT" ] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/custom/dumpsoftwareversions/meta.yml index 73053a43..c32657de 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/custom/dumpsoftwareversions/meta.yml @@ -10,7 +10,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: [ "MIT" ] + licence: ["MIT"] input: - versions: type: file diff --git a/modules/nf-core/minimap2/align/meta.yml b/modules/nf-core/minimap2/align/meta.yml index 6788a032..991b39a0 100755 --- a/modules/nf-core/minimap2/align/meta.yml +++ b/modules/nf-core/minimap2/align/meta.yml @@ -13,7 +13,7 @@ tools: A versatile pairwise aligner for genomic and spliced nucleotide sequences. homepage: https://github.com/lh3/minimap2 documentation: https://github.com/lh3/minimap2#uguide - licence: [ "MIT" ] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/minimap2/index/meta.yml b/modules/nf-core/minimap2/index/meta.yml index 892d2496..b58f35c6 100755 --- a/modules/nf-core/minimap2/index/meta.yml +++ b/modules/nf-core/minimap2/index/meta.yml @@ -10,7 +10,7 @@ tools: A versatile pairwise aligner for genomic and spliced nucleotide sequences. homepage: https://github.com/lh3/minimap2 documentation: https://github.com/lh3/minimap2#uguide - licence: [ "MIT" ] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/miniprot/index/meta.yml b/modules/nf-core/miniprot/index/meta.yml index 2b8e6e23..3a098802 100755 --- a/modules/nf-core/miniprot/index/meta.yml +++ b/modules/nf-core/miniprot/index/meta.yml @@ -11,7 +11,7 @@ tools: A versatile pairwise aligner for genomic and protein sequences. homepage: https://github.com/lh3/miniprot documentation: https://github.com/lh3/miniprot - licence: [ "MIT" ] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/paftools/sam2paf/meta.yml b/modules/nf-core/paftools/sam2paf/meta.yml index 35071b07..bc08f9a9 100755 --- a/modules/nf-core/paftools/sam2paf/meta.yml +++ b/modules/nf-core/paftools/sam2paf/meta.yml @@ -10,7 +10,7 @@ tools: A program to manipulate paf files / convert to and from paf. homepage: https://github.com/lh3/minimap2 documentation: https://github.com/lh3/minimap2/blob/master/README.md - licence: [ "MIT" ] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/samtools/sort/meta.yml b/modules/nf-core/samtools/sort/meta.yml index 80ee08e1..07328431 100755 --- a/modules/nf-core/samtools/sort/meta.yml +++ b/modules/nf-core/samtools/sort/meta.yml @@ -14,7 +14,7 @@ tools: homepage: http://www.htslib.org/ documentation: http://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 - licence: [ "MIT" ] + licence: ["MIT"] input: - meta: type: map diff --git a/modules/nf-core/tabix/bgziptabix/meta.yml b/modules/nf-core/tabix/bgziptabix/meta.yml index da9fd66f..2761e271 100755 --- a/modules/nf-core/tabix/bgziptabix/meta.yml +++ b/modules/nf-core/tabix/bgziptabix/meta.yml @@ -12,7 +12,7 @@ tools: homepage: https://www.htslib.org/doc/tabix.html documentation: https://www.htslib.org/doc/tabix.1.html doi: 10.1093/bioinformatics/btq671 - licence: [ "MIT" ] + licence: ["MIT"] input: - meta: type: map diff --git a/pipeline_template.yml b/pipeline_template.yml index a7e3d014..0aa7398f 100755 --- a/pipeline_template.yml +++ b/pipeline_template.yml @@ -1,3 +1,3 @@ -prefix: sanger-tol +prefix: sanger-tol skip: - igenomes diff --git a/tower.yml b/tower.yml index 55bc3522..787aedfe 100755 --- a/tower.yml +++ b/tower.yml @@ -1,5 +1,5 @@ reports: multiqc_report.html: display: "MultiQC HTML report" - samplesheet.csv : + samplesheet.csv: display: "Auto-created samplesheet with collated metadata and FASTQ paths" From aafaa39cacd191b17a1dce5e3059c30050a4015d Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 12:30:59 +0100 Subject: [PATCH 69/85] Update modules --- modules.json | 138 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 103 insertions(+), 35 deletions(-) diff --git a/modules.json b/modules.json index 9c5592d5..cf5ba17e 100755 --- a/modules.json +++ b/modules.json @@ -8,173 +8,241 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -183,4 +251,4 @@ } } } -} +} \ No newline at end of file From c61c112ee288644a88502d4647da4af5ca6d9f29 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 12:51:27 +0100 Subject: [PATCH 70/85] Adding spaces to fix github bug --- assets/email_template.html | 4 ++-- assets/email_template.txt | 4 ++-- modules/nf-core/busco/main.nf | 10 +++++----- modules/nf-core/bwamem2/index/main.nf | 2 +- modules/nf-core/custom/dumpsoftwareversions/main.nf | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) mode change 100755 => 100644 assets/email_template.html mode change 100755 => 100644 assets/email_template.txt diff --git a/assets/email_template.html b/assets/email_template.html old mode 100755 new mode 100644 index bc5dc98f..6d58d16e --- a/assets/email_template.html +++ b/assets/email_template.html @@ -12,10 +12,10 @@ -

sanger-tol/treeval v${ version }

+

sanger-tol/treeval v${version}

Run Name: $runName

-<% if ( !success ){ +<% if (!success){ out << """

sanger-tol/treeval execution completed unsuccessfully!

diff --git a/assets/email_template.txt b/assets/email_template.txt old mode 100755 new mode 100644 index a7226e3c..fc03acac --- a/assets/email_template.txt +++ b/assets/email_template.txt @@ -1,6 +1,6 @@ Run Name: $runName -<% if ( success ){ +<% if (success){ out << "## sanger-tol/treeval execution completed successfully! ##" } else { out << """#################################################### @@ -9,7 +9,7 @@ Run Name: $runName The exit status of the task that caused the workflow execution to fail was: $exitStatus. The full error message was: -${ errorReport } +${errorReport} """ } %> diff --git a/modules/nf-core/busco/main.nf b/modules/nf-core/busco/main.nf index bcd09332..b40014eb 100755 --- a/modules/nf-core/busco/main.nf +++ b/modules/nf-core/busco/main.nf @@ -24,11 +24,11 @@ process BUSCO { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}-${lineage}" - def busco_config = config_file ? "--config $config_file" : '' - def busco_lineage = lineage.equals('auto') ? '--auto-lineage' : "--lineage_dataset ${lineage}" - def busco_lineage_dir = busco_lineages_path ? "--offline --download_path ${busco_lineages_path}" : '' + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}-${lineage}" + def busco_config = config_file ? "--config $config_file" : '' + def busco_lineage = lineage.equals('auto') ? '--auto-lineage' : "--lineage_dataset ${lineage}" + def busco_lineage_dir = busco_lineages_path ? "--offline --download_path ${busco_lineages_path}" : '' """ # Nextflow changes the container --entrypoint to /bin/bash (container default entrypoint: /usr/local/env-execute) # Check for container variable initialisation script and source it. diff --git a/modules/nf-core/bwamem2/index/main.nf b/modules/nf-core/bwamem2/index/main.nf index 62458b61..30940852 100755 --- a/modules/nf-core/bwamem2/index/main.nf +++ b/modules/nf-core/bwamem2/index/main.nf @@ -18,7 +18,7 @@ process BWAMEM2_INDEX { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' """ mkdir bwamem2 bwa-mem2 \\ diff --git a/modules/nf-core/custom/dumpsoftwareversions/main.nf b/modules/nf-core/custom/dumpsoftwareversions/main.nf index 29a40298..ebc87273 100755 --- a/modules/nf-core/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/custom/dumpsoftwareversions/main.nf @@ -19,6 +19,6 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' } From efd95af2bf61a9bafb599f04cffffd0ace60f646 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 13:14:14 +0100 Subject: [PATCH 71/85] Linting fixes --- modules.json | 138 +++++++++++++-------------------------------------- 1 file changed, 35 insertions(+), 103 deletions(-) diff --git a/modules.json b/modules.json index cf5ba17e..9c5592d5 100755 --- a/modules.json +++ b/modules.json @@ -8,241 +8,173 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ], + "installed_by": ["modules"], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -251,4 +183,4 @@ } } } -} \ No newline at end of file +} From 349f2ea93d81d9e7e239c51ed403cf788093213d Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Mon, 31 Jul 2023 13:35:59 +0100 Subject: [PATCH 72/85] Updating Changelog --- CHANGELOG.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02f39a21..1b90af9b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ The essential pathways of the gEVAL pipeline have now been converted to Nextflow - Subworkflow to generate tracks detailing self complementary regions. - Subworkflow to generate syntenic alignments to high quality genomes. - Subworkflow to generate tracks containing telomeric sites. +- Custom Groovy for reporting to provide file metrics and resource usage. ### Parameters @@ -44,15 +45,15 @@ Note, since the pipeline is using Nextflow DSL2, each process will be run with i | cooler | - | 0.9.2 | | gnu-sort | - | 8.25 | | minimap2 + samtools | - | 2.24 + 1.14 | -| miniprot | - | 0.5 | +| miniprot | - | 0.11--he4a0461_2 | | mummer | - | 3.23 | | paftools (minimap2 + samtools) | - | 2.24 + 1.14 | -| pretextmap + samtools | - | 0.1.9=h9f5acd7_1 + 1.16.1 | +| pretextmap + samtools | - | 0.1.9 + 1.17 | | samtools | - | 1.17 | -| seqtk | - | 1.3 | +| seqtk | - | 1.4 | | tabix | - | 1.11 | | ucsc | - | 377 | -| windowmasker (blast) | - | 2.13.0 | +| windowmasker (blast) | - | 2.14.0 | ### Fixed From 5e0161482169764dd3a9c86ad629a29c58d2ebf6 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 1 Aug 2023 13:02:16 +0100 Subject: [PATCH 73/85] Removing nf-core images are reformatting output.md --- assets/nf-core-treeval_logo_light.png | Bin 10550 -> 0 bytes conf/digest.config | 30 ------ conf/selfcomp.config | 30 ------ docs/images/mqc_fastqc_adapter.png | Bin 23458 -> 0 bytes docs/images/mqc_fastqc_counts.png | Bin 33918 -> 0 bytes docs/images/mqc_fastqc_quality.png | Bin 55769 -> 0 bytes docs/images/nf-core-treeval_logo_dark.png | Bin 69014 -> 0 bytes docs/images/nf-core-treeval_logo_light.png | Bin 68928 -> 0 bytes docs/output.md | 112 +++++++++------------ 9 files changed, 50 insertions(+), 122 deletions(-) delete mode 100755 assets/nf-core-treeval_logo_light.png delete mode 100755 conf/digest.config delete mode 100755 conf/selfcomp.config delete mode 100755 docs/images/mqc_fastqc_adapter.png delete mode 100755 docs/images/mqc_fastqc_counts.png delete mode 100755 docs/images/mqc_fastqc_quality.png delete mode 100755 docs/images/nf-core-treeval_logo_dark.png delete mode 100755 docs/images/nf-core-treeval_logo_light.png diff --git a/assets/nf-core-treeval_logo_light.png b/assets/nf-core-treeval_logo_light.png deleted file mode 100755 index 074f9c6af1272bf7f6d126f7e0e99c0eb16f98b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10550 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 diff --git a/docs/images/mqc_fastqc_quality.png b/docs/images/mqc_fastqc_quality.png deleted file mode 100755 index a4b89bf56ab2ba88cab87841916eb680a816deae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55769 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�)v~C(0C)c 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 M)78&qol`;+0Fu7JivR!s diff --git a/docs/images/nf-core-treeval_logo_dark.png b/docs/images/nf-core-treeval_logo_dark.png deleted file mode 100755 index 9d2e6bb9816fb49bf9063781631c808678784d9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69014 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%0D6Aha9ZZvy3Owj0R@{kHIA1_W(q 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 diff --git a/docs/images/nf-core-treeval_logo_light.png b/docs/images/nf-core-treeval_logo_light.png deleted file mode 100755 index 4bd3b871e2c658b57393242d2f6fc679d60da6ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68928 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�ev`Q}H7y#R1zKkC5n?0_OP7^FqWWeXhX0t0pNK z(bt$TL*ehNPtM(;VA@5R9zN!e8~K<~cX3NnUF1p*`5e(DU1F8lRX-)8KbL`E|L`3V zNx2$Zf1S7Do%}yd%DH81m#>ET4sG1bNkca-B!p$@$27Ju`3?2uL@BKov2V<7mu!_y zZ{zyp_2QITSG-eP=P-{N#gu#(3@bdT4+KZJNda3|h8Nf=HS=!63yn&_8xd=3Jkhf$ z!}BGTsS9Rf-o-Z?Q?|cG3CC|q^rGJn>M0i8LCYqr+E3?cMnhr-$;c_-;y3nImk_jg z*SB>)9>F^Z*<}?lDtFvDC)3w(;J|^ymifdvBjSktDB*-0?<&&u_8~@@7`@G>U0<++ z9+SbA7tkuQpQRryewLjRBRYX|j#Qk}?Z|6*YO7K~og$D#s)y)BWmu8L?D||OjOHli z(rd40>4_~TSlT+@@R3Vwl4m533X}aO_w!RFZu2~QpnL7?*4I%LpD*2+wLVo|@%I8{ zzZ*2>_N_CqtE}T$qqCAa_KGgmtQr5qR1iS0X_i)@emeG`q0wmFbyr~nZu(wbqnm8n zm>_weO@nuHR=8~I#88`0`PS5U9d(wcUZTt7AX?2|`@=qRC83w>Mlt@JqGP!z*B~9k zLWkYhn<%5xrfan)FuTkCh{hk_05N^8n#jP+e{_`}<+~B3W?CiNuAua}a_MTdYyUEu zusJz*oM-`=N*{Piw?l43yLb=$GNYte%b+5I@-V7dC>B1^m zR*$`EP?Yr|V3rCL9eeM`ru`w7D!cmZMv3U8-`dIMVpnov@J7;{b@x9^3m-Z3Y{Z&* zD_zX0=I>)SdOkw+&z36W$kA!;9RD64IRcJ9N)qO^ytsAe+9S#M%>(p0L@&TU7Z<6d zXj3LQe0J3d7TseiYm0wOit-x`{PWm{J|RZs<&$+&Hgo2h z5yoyB+HQt44OJ{z%<^Nov&O3L_s`N7xT*-x6tM{ij1IE&RK^F;>C|9s3ZaVQ%s1ZD z&nS+C*X#c67*TD{>-$e&9F_U?(pP^n73=qY;t~6n@8+=ca8aLp%dr}3!iDJCk?<^K z&vypzO3_=}Gj~EnkD5>38d&H~S$*Q#8lks$jjwQi7#*)n;Y=>q4V;``tYFUD_J8e# zh|!nSX8$YmI;3~P|A88khWk?zH-)?If|Hk_xY3dxFKoZ2t zJhyn*p%TVmg-uCC^US3grB{BCe;gjJc~y-@ArHqhvcIIv>?>x{3Ka?IQMYkLr(_(> zW9Yhih|wXG9m5&4$o+&R?gWb^T_Edb8q`Plm^+Gd%I_1>MvGg_x>l(|hG zXL8v{RZZI(QAKaWHr5s{+1W7^G~V*hY!i97m?+bvfBkF?1U{OvO;CKD`v$kh#Mp6S zW}dnS&g=07uy2cfao?kBg`l52EM{x5^{qZ9WVy(?lQ9ObhGymV&M6W5@vZoDNTGn5;{NXx zX<|J~8H=}B&gYFdI$k|n(j)EUEB-F--tzpx?lX!kjav~2haKue-^}@3(<2`l9v*%V zpct`r=&rGCgdyq>V-|xIQ&eFazpBmQxvNAkeJ+~rNaF6(0Q}arT=aY7^=HiHH|9($ z2FqKi7a4zW5&2$7`1++}teA$yJok{Vzq)`Pmy%Nml3Kg-F zXgU?f+Q^T}S6DR=!9a6CFTM63I1qE;!8>bUFzl|a`*)PGkDYY|aNoPCe2S{MV#&TC z!F=~d-rdNg6D;BHXbe@$z9Ddm+VuDVjk-}hr>I}r58#I@|Hf&`?C6on@5rDQ;BtN* zCm#GK9DZNG)n!xr>vw+e68-Re^a17vyB)GrmOgb32YfBAX7Z}B^qsjdl3ZJRYm~<- zu>14DocgGES;E)15;iXQOAcTgE-RVS%WN{_ViKsrj|B?;TuuS3;|dS!u*jwlru ztBk1E6!us{JY>%V92A6y^0s)NzF5~my5ZE6)b0sJz-@?W8pFoHx$16HHPOny-p6#g{Jl;f&|&AJU;;%xQ`;X{=fW1tN4U72f4 zG2cMw-+5+3LoqX^{p5EUUI>9<26SbY{c>rF%o(YY8`tmLVq6s@K1cKBOl@2}*jRT~ zwnF^kOUr9N0z8a!ueni;qm=x6K}x5od!>a{9A3?Y6I!_mV$%j)A(Y*B&e?@v8S-a( zSs!W+gCwB|RuzEbEPOpaAT+ZfMs4{P_i7&;wmSDNBc#h04lydP z5hC|$bEW#=|eu-u>CWszC&qFp66I!fh(Y*Z8a;X4HJEb(E8rIV;uNI`YuH-0LG z_x|L@M;I=omg$aE(ovAcYk2X;oS)P(zTYR)WiNgO zyKe)d4l{1;mgU^sK2|@v0DmngV>`~z-{GLowF<(4%{)|B5!HIprtr|JB(XfNq)F41 zdBg7zqyK>m2|zW_rj-*ODz_K43Ai6K?;X2D^odN@Trxj!?`>nAs;1XPoBi~&g)}9R z%Mk9FZFTg7bZi1w?Ot=Hz}>6#t^$S6^%~71Rd%7%yXx;S_t zt$ev7PH)oT_RV1JM{E6CffG#%%Bw8`QG6>kQr&(jVIfv&iAif$%O5ydUwiap6W<&v z6Fcmpmhs~C*}t_NH&TIG85T<+5v{-jE2d1K8R0F3_wzj=JtlSsiU1_P;jIu^rVt_$ z12*~{@dWX^EGlooFiB*1lh^f3mtR~?6WXJ5B!8FTMy%2r1aV71x1-&JDdv*D$fk(E zVm%|}?A;~_a#xV!!8snvf{hP7d)bjzB}+edZ+|(zqRkJa54CYhAB$vW9i)=5Jb1Td zsKHz4h5CdIc?r6d&$A<`fhL|44`p0}NYs9xL{5hW#nr+3gyFT9ae7LB7N1huo;yjb z&wqUL-Jo$kkm45a9E#{1v?(hCYS$&-Bp%v6bD5a*gN`dT>3kVm>-w&YhaNy*!&?ij985sS&kCNa*JE8-5_j zl*)Ynf_EvK>~Nl0&OdOB-Lk>%-s?G}==9cy*Z4c0bLjG)or+@Iy6*0Mt>7%jftcqU z_udxaRbCWFgPc{vTfq-3ZDye=9>R0)Bi@CaU_mpj1{f~K9QZafW~F|U&y<^Q)&CHq zFo4D-zr(JPUg2U$d;*Q;!ZuHD4D6}d<7)|w^W(gcEkIi(h^Cp!=CPKa!I7uay&pJ8vY}rHdBkJ~S=vi+eT$}~wv;e%L7}&a*03xDe z641-lqNOI{=)U4uT~qf@4QM{Q=j=M%-eZ{#(dJS=iu^w{4uPI2(A91YbOkq5dnMu^ z15m)6Dz4IgZaQj_0FM0W-{F6{QB$+Ehc;Vmu4mC%2G{h-{o+HBkP?7|AROl^&*XlN zc{98Ncz*GL$dj#;uK8Yn9=-%52mw7idF*<#&aI$(UQuEe&OGOBRZcJaVH|)#IH90w zbu(d01*q~5_r>ReULX$yb~x$fg?8DnBhL)Ur!y5BcXn#3)B#SIPF@jTO#X+%}kW$rp4 z3HUieI@rAoBzq4wsev^5inv}1Sydf6MvtALXt@YrrxxtnRhJqC@h{PQq)%?!|2&PT zpP5>5)3pHS*KMqIO&W(WVY_EfVp{Cxd02)`XoJK9h!XVb@0(q4F2# zJ}mNy&+|Bnmlqv1P4hM{I*^EWBi?`d-6?cN$lB^``8zBA%$r;9tA!NF3I$fVIxVhD(!OdjKfxSyz0@J8@s*BK_WI$@|uGw$m!mVLT+5xsx z{KGk7{QTE}Jx58gK}JV44rH?!|6Sc8AJ)Wgapd0HBQ)FW>n>WJ;vmc9Ex!(h$pqqc z8QU$FAE6>prrggQ0J;1iHDkRVI|CX7z+Xi`kvVmn`a8x4e!nt|yE*#)L1tRH72FwP zy}zc8@yNOTAu%*!f}4v0+e|0--z5ooD6v-%V({(K1kI(3Hm*lpE4|pVS;4rleR&L?aN7Kv{&uC*`91Y|dCsl=N?)>V1R&soy^VyDmb4<38D)!4InyyH&6 z0f16w;%OKKXPivp?+|A&o!mWFCBUZO|8%zX^pC0=yn*wtvWC$=-ao&Z+91td6AYAd z!l-jeHRp2*41eHtPKGkGu>*&tXe0PnR3d5W%~sw)$Ql@8vJhADJi-kl%mUo*d9lT8 zdO|NQ3VcSJDtZcmSOat* zd%gvZvK$-FccrVC9p44n&2AF*>TduE);a!3ZvJ$2;kOrUzvKx9m&SqQ!UN^W&SlX+ z_Hcl^&Kr0c z2vJj0bsAlsEv3mQa4tNe+GnM*KG3D{Q6u-#U4aBKIj{YuYvU4kcx;N)(KzJ_={MjAFuLS?R3PHnijg*CMuZ5>*2TkknWmFH2nAKDBSVjNthgj z441SWzajgc%#wb9c|*XjDC@+^q1o~Vlsx-%@yuDGtMxmaxH4MIRjAOva6YW< zFzABA!sNW}3mFRe+N-*g+!j?W@*&}0ItKAZ)+U!^?=F6e$Ue;R>Y}Z+=M``$sRg*X z9$@rO*o*(H{6N!|M=q5ABL$mP{Yh>C$9-$4KFZ$y)1!4et}IvZ0*zuhK_@)7;<(0tx5Cm_Jqrzhea(H>C6xM|;cjg@1w zuhx7IF^WgVevuFJ96L?gU2apvTk)CZr*?qQ0T>mo@y@AFigJ|DC6+=ZF1>);wJ#Cu zDa?V5@}Slt@1I~fKZ#UZR_hF6Yx$E1Q;krj-qL{*Dcz1rXXlpGW8$14M)cyxf&+86 zb*Tj>$~LRK_QxFY6Hb~b5oSkV5zY@{Jq_yE{tzZJQm%6JAS#yb&kA8{GXB0jbBM@+ zZ-sfD+rX?hr|H;u2ge6bu>%Jfg6}b_?6b%wEAyYV2h7wQtU*A5!NroL-j;1`xMFXl zSIF@ao{GJz(ymN%m&LQ_-=mTq*Y&xolD`)q0IyOuhKmz0DmK-x?U?ez%3%;&B#Y{S zcKR?(;6!&T+oz`g-5p!NRnzvJ6bzS72tE*=SBRT1B(eV_cWQj_)tsbu+pee*w$Jyt zRxwb!*;1R4{axORv&G?Db8yEHS>c3Nrx=?IqPE^|29fmMJMR9n$Ws#wzY1@%hl{Me zuGwB}y&sGyjixIdegma38z|1h&!9G$bc@^0?E2B9rCdj+sHEFr^(c06LKYQpZMio= z76r-X?~#%*%On(P#i*>Itgrc}#_nA)Z+(Sb|M3cE_KU1Bq~yw?3QE%!Ve8I z9KS)gws75Rc>?g|TG-=@N6W~{#?UmcP!q$slAzUy+*sozSkNX+A83(}7TO4(!uk=9 z6Va5j?R6NedEbwrGJ0r_1||=l28w=M_x-k9VG9n6&^?A#^Z4V4!Jvb%UYl;`opV4| z;Z1V^!i5d;YOIR%0~g^wrmm@n+sVsiG`f6x8kvy1M}m&KHhD$QV>bF&@P?OfaBbW* zxC}sWl=Du-BRX~mTduC%3r-Ub)*q5Be2=qg>HmW=_D4LO-pQbvta6x_UG5C>KBJ-hc}&vz zZ?nwzsH)wou7?;C7=js7Y?7NI*=tx=u?=#zFkCg+SJMYG01Dn zo%MX{qLuA=X@pPb$z?@^;@3Ope7MJ1t2@9nbhOCgCt?bRQ_wPD-e}3QosK=x7I`@6u*Y&)f*YmpW*O8rQDj_T- z@}h93a%r@n4-iJLCjaHc3#jMD1SXhc+xbu3*;h{e`x*=6qom#zvWJ(#VRL)Mwh5FD zA0d`5DcpW``T@6y6l!V5ZR^l;J}ey_*!gm4(E^kZCR_v6K-n{-9Et|1+Lt*&ziqBQ$XXl>)uE;ekq^JE{zl2xhx>V^#t*KS+K zP0(&@ExRQ?$zXr$n%Dj#=U@Uz?nRyL=HXx`y4PR$SGem;yYr-~-?)EOog~+FoJ9S! z^}+KTC^n_Om%rQps2kVDz7Uj}>*sq300^hGGECx5S4OgZFRLSaA!}pE*q3yI3#(9Rwg zftY|o_2f243lz7s_IJkF&Y(}!ocZ|lN`{4U@K+-xfF@Axau+YY$CebSMlT85x3iTz6X+C|GlUiRiaRrN50`ZGJoy6g(1VHJP#d@Y%C0_2v zeYdcGU4|6zDE%cm!D{w4ai~PwHdO55>o4ybp>NxXRH^@{QnUNOWCB8!qO7Z$VqlOW zNasf1dlf(7u?<}0-|N+PPrsxK%R}dMt#wXIJ?7yJFwIe&*6ct5cq>Lx?JcV_@!1{5 zxQbJ)?BL5ZN@}2fTBX#POz(p`#V@-&1#e4weCz*<|E{ISg{KUPtp!_k}9@K1@mB7?>dG`_Z5$0R*ozIiaia!mt8GUhq z$~EQA9U*yf>BGuLPvX+Nw}Pz%q-T)V;^sF5ss~VD zy(CckI%aWcUnxOK?KOdRL_cF%NM6DF>OnbFKnx7&sH1Oa-U2g%&U+c!W{%+fc|@ZG zC4(%NFXpT@8&G^Sczd)3|3bNxP89@WTy0DehHRe*kQdMvQ_?#%_3v1zbOlB&+#4n^Bg7TZuyFk@ec%HdtcvOyuuyy_98 z1PLHr`$^>|ztey~!)%SAfT}ZiL3!FB2_vRVRpq1)N5sK|07RG#oIm)D_~ze2iXy3G=N#aGe$H}bppmCMKC15urD zBYDNQzvwY8e425y&2uCm)}6k=6p`>XSWXF~5a^BTO{bq#+6H+A{qeP@6X&}5nAUNN zu#wG1-AjyIyfBOrU-5N3DVgPM z3?=KCa-{Ojnx35U%-EKTxru8&E)k9df36s%fJ!BD+8tlXH;z1b(E6P8j_&lu1UG#3 ziZ8MVA<1mE}kilZE7d-S>a7_8p1orxsQgIJ+HwbBgyuar`a415jpG?foKE=+Qi zH>gOEyM)rngbbfAs~q2F`i1cmdLq)-MqBZ%tTP;?n==}492R#!+*R%jtSj!lOF9w2 zc4kh5HvcqN0Stt3%=2$3O1;sIOWl7K7v-z*1_DR`k4D~9+SBRYjmHZK)JkY*{l&gF zghnKz|6Y#^4qHzZl5Zzv@i{V&%lH{rgsg{nRRMju4Jq}g9vostXa33?lm!U5zCHOo z&cJS+b>H$hWH@>g>YV=g7?GF@ogKeFu0s`Zt~pibL;h%{eQl?}S8J#7HJix_NC^gz zh6GiYtN(!a`*wesFswSDd9&X1Gru=7&HAXRgqd>P$-TWrd_{zh>c>jmOHMD@DY0cY z)O0(8iAw+`u6?|trmC#XT)~0 zqwlp9+cAU$BJC2qb>>T1FQflL6m)rc9u{Mli6NR{^ap(cWgKTpfFc=!WSsg2v~0L8 zi^j_z1#;p=lss3d2tl(sOU;h=K|{vWk=Iycyv^Bs8&VrTM_;t*QGVc2#r)#}RwssE zi!PocnX4lDe;U56iSUWna@tQaj<$co+iO2N=*daUEbNQX=wYq4ga)f>ETQ1O10w} z8$$isCm3D;Kx~$^!0e{l=ZMk*FmFOi^}rucr?(R@7PLJvx@5!maM};SWbp2*(G{UC zxGvTTSP%>q%k~L)+uldo*MzpAy3^^vVl|1Zi~eh``Z_$W1~2#!7afz|c9p3!wdVwr z0HncX!lya*7wIA4Y0j!j#hZ9`wQu)ZQ8BpmH|Raw{9>unZ`((JOkwc;xrNo(Y^r)v z5EMJob?M@XiSsYrw;ZMW8@Lt3JjFhwmDzcIi2bSl;P4WM(i;0@%aEfe72l|3l*g3t zXaWcGr22~jgPPJ1yVEw%Nik-GWC}egHFHN{c5)tBPc^j*)935%%%7D(Jpu1M87GB` z&I$uYmhLO;gA6yCiOeHf^O*7o#%OK! z&qg`>1%9l^TZA1Ee2OBqU7ZSj!5J_01=AJy>agDL+(OK9-}Qd zDy*aLP4MgZ-Rz3YweCfbCSeql3lES(5cYCWckWFWzhGVoqYwS~BK~bQqs!eW5CM8(&Zj zxg=~lFlwE+$wJi8MzmJb=NYb@P4jInnsIGy<4OJ2*xusTj*}|em|{l)$zXzM%O3BA zZ%w^~0q(8Hy0g1X8!kBKPwI(0zIdSh5T#3Y@pGOYS$ed!9@)kB6}eKyI2NO?NGUo7 z!WtM#kV?j@{c8b-;aIZc?g>7~@PhOlPO5q783-N(xeNAs!OdcE;tu}e=tLDg-UBk{ zI5@Qg(P}d12!m$+8oiyKcmk=tJ2>)v_lPLHwby+gCc03JQ;WM-dF*e*x0zrQ6S{Ze zo9p8-bi!*mfVdfN_=c3IAG%+IwC|3idF|u)M%Tux{a75CME{NOZTx&`<7+!`Ea>j2!4}ZP zlt%a*35=!pk0h@>r?=2<*^r{@8OsMv=?PcwSEyA1gy`*fIf>DBB*V{-iX9 zPg!-H-RnV30eQQ97F^viW#E}A)xyx0F7ELxiybA;iq$`UXD+sF>kZW6FYOnG_ zfWim=M^6?Xp_ca8Q)x`&+m&l?e|VP7b~P}*5QtMhss3|lhRPsV_uX5-mG&q<_ak5V zOzV=Jy~O0GH@#s77@x`2m9A1i`S4gY<;dM;Vd4vrsa{DsCC;RF7nXUl+qpUTkb)*7 zKTdq-Qt(#6!uV-!jLr{d62?4(m8O|+E4B#p3qudh6;#Z6G*`>rz2C<+jyK<5^b@NY ztzr1ZzUcyx?Bly>%HWB*Z806YB~q2&HZ9t2Nf#ipwV~trE!Uyw>ZmUa>$BUWI#Mz- z`h^t*u}-8Y!iY(CZ;uPk|ZX(5ZB^t`IQfO-e)uXQ+0C|ztXd8hYu=Z z{bXBWYX|#Z#$E`Z;`a)tSqM!Z-aMoUdxLu!fZuQv}SUI!Pyc%^@K!ES@c~@-~fT&+GK3MR#{`ZMxJe za0)Iq6gxFz+gB9M+au=-MMfLA-)y+lTTM5xv+Pb_+pW8tIja1(7X8F?Rl8CBk8}?v z!^+z$$zE`o+3LuM$v;aoY}R)7l8(fK*Wql_sLA9+;mP zGgs;m|9DZLqWXh9Xtpx(;Z$xE24y~}WmeH%6-5{16sZ|x>M2Igwl?%lrZz0k;69Gd zgr1_kl+wuPHh!e^(oILs{h?AvpGME6Crkyyk z?O7B0&V4b;FxRE3a_M(lhFBP#@RtB1MVA-1#r=$okm)#NX=8I^iBR(n&uj zIhw_cxr9?@#db`v?h#shxK8?lC#~9*Lj1@%p+D1rN2Pji-+#hAhivOqtI4_k(@+QK zRw>iV#zU7}Sab~WQZc2f?G`>IfGiupBzSlBK0cvwDyu|3gKUfGE#k^Amr4!)5#VuR}%HzxIn)&=tSj*{!GC77J9w%G1?x9}J`2UhRs3 z0{zJ|?BbM9JAMP|rF(vMJ$|ezguidRfa>$S3D$1aG^$fYHGOp;%#*G8PT9Gj>5!fJ zD3`@8ok*3LOO{dQ$jNxzOTp36l>D{iClB{p{G0CApGahSTFE~#j$sfU>^Br{uZ$_qsv*vtZZJxC+_{ zsS34kSPtmFKEyNJ6b5k)N#^CL4*_QO(lcl>HwNLUjTR2!qXh{%THEjLc z^?^I+M5_8}#rZEoeLL}Q$xL#Kx=_m`F2mu+u%@sds72m;mknKDg>nk@o6LpH39nUHP!sCv1Tu_@k z%dD)njLcUtIgNdvve}Tt~%S~&z2ldUoj2ACMql5qgn#V{O zKXdZ_lYJ4mzhZhrxX-;zy+3AGw4s@o{8bshtC*ESA$&x5zyG5vDsbj_?$-Ldd}hN3 zCO!oj+nl~*uX4jTfoMvOBRT^1Ahen@@2a=C>SU1fD0{KF*%YyLul(?Dxq!AYikI5A zQ!2rLJC>W)p0BouFKcF<#`0_PeBn@d0&gDwVjA08xW9<><3lzvE4PWqDg|_<{TkZ2+u8gD!dVu7akbNQ+2itVA%5pH;ocR5OtTz5bYBo# zRuEoLTbZS?ch?$Wr=Xn6Ubka3tJLqyp|dX)p8BHfd`16My1}L`WDgPJ-}tEpkp`e~ z2hdTtq~OQ_m9*A!&#H;@@RA_YaC+Bxp4<5K;m3$4;7?zv(pS0^m#<=D_&JxLl1JmE z5YapS=RFUH@u(D!M0ZaQ(dV=UPAu=M zS+a5Wmt}}dl>RAwC+X>iR54RfNn7YbjZb1KFK?V^rwxcV5%UCm;qi|lcQHV5`eIIdyWcuEX|NxMzk5b@IgYakiJr5bGBPu%dt zm6r}GPa1#|BDe&k*mvZosws42DrK! zM*BJzH!Z3klBOQL+SFK8C3jo%LECDTyT8hw$LhvNSfo(|>n;r$yMp9cuiNAwWY{aP zg1zOJtJtOS@zcUfn|y-#W@c`~T8Dl=hf!06=s+#a2VA-jahL30C)zbq$1D+p98~8$ zOFIQ=q9g{0|L!=v{0NRqqjWE@@d-uOsa=#%Q?(zB#`bLByKESn@fVVxhAPQ-{R^9N zTkpF`spJBg`E~qFg>GelrqYop4+ZI{O{d%^5mB}C-x>X9MNp_W=6Tb0uj7BVv+mKP zT(PNV5UgO>Gm_~^!*QH@yo;v zYfIyaWv?o8cuUW5a(H+d=bq))%*NqlEF!f2u)&#Zs`L_?Jc9#C_^RU7ZIz=H#}e)9 zAh|`6Q7NE$QQPdI1$5R4K0b|0A|Le0I$nMg+Xc^}Ym!noE!UMhVD)lV>sbq3C2t?0 z7F+i1F0mPUJbJKct}?VL9EfON&Yrm0YZe$X`qa%|#XN?Jp)wbTTO)5!n6Cxw^kjd# z95jO&3!cPYv?och%QqXD&!(Dxu(`S>V7zp(#xVQ?&e+VsUy)gRlMn<*oopnn=N-^H zdXV3JceP;snrVB1a)Qt?sUY{E#Z%YMN?YZ4zryE(T@xB|abb|$d>5LY#izmucSwlf zmf=C{!Z;?5PlfkSD%)O}>1Vz0`SX1J-h;8baggmI1D zq`*{VlbB})JHOqW#`Xs?;6T^Dv7UZ;qs|Vm1J8;b6t;l}<#eAQ3mJw2@&w!}xu^-l zfdnHa|6NR=o@K^&+ezhM`U7NO?A>N3_U+H}lPOISlUs33QkYdTe?D~v7LHWv z@=%qjy%giJ+V^Vx=2GBfuvQ&9)(n|*Er;oY;h_}~YNQ!xj_UhH_+h%!$WElU90_nx zp6?^|HgWnjHyd0$<7XMaUGvLfkdeM}`;Jre_ z@RwC~HT%CYEP|^IEq(U1eP3F%FsAWXx;Oi6G*=s2#Okfg;v2M8krrMe1z{fk!2NIX zrGLM=m!-UQ-kT8$vd6(h_+npscuAb;-6tp?Z|*P9Z3z!m=GZ&T^5F@O2i&LiZ6v@C z?LqHk+|M)0!#|On;lp%k<*oYbaoI)9S)!^9O0DKzqV?Jl6>1}N3F_0sr=3?{r%OUU9P-p z(lgc*X?xv^CS5WB@I`Z)+Acqlb?N?LG;>?ls>7bWzMOBC=$Lo_)#a)~{xAR^(5SU^UdBP%kEhDthlQ&|rJ$UP)WyN|L zhBc?|7@4Nz%?^c^jyVZaEI1v#Y12T6P*LT1=uL{fU#7LJ_fJ)|bKx)w(P8b5AUOc`~cnUA*?OAp5iI=;!P&v|g~g3Vf(dNKn@=jdpn%yZ@47a9djS?dEsJp~c;$T?w~}V8bCa=8ww>T@D-g zm;8zoo`&^b#)qU-a%cSSnD?Gu2%Q1!Xijrhng6O7CjSk|c`sbX-JO-oTHjZZ_4Iif zq%qv+sJ8EMo84ED^OXwMaA#_kSq>doD2w~7X&dYeLn9RL*DHMHKr46D?YT|hFo{9GSbOCU$c_3fl#;h6Wu{k)LaQ(;qusA>QMOvLn zKhdRc*#?wz;l?6cV)nviBFOV@`@FRV-K!pX>bO-!suumoC;q|9pdrM+U3N|-r#1Mv zxjN9Wn2r02k3v+&!nl~=a!sinq502tOKDHuMsgZSNyWWv5dl5Hi z6{pspRvk(Hqv|!ub*F>fCkNUY3+h+g%*;2m#PZn;#|4&~#U}H(p-g8mHbzbVu*K%} zCDm8N*$lvppuzf~2y{Ma#2F3>Kei z<}Yg!u9u4MG+}VpB5f|HS{RS0NsT7zMv-a8-=8REJwqGzmQSIcvG%rf`oXhyZlx19 zQ_s+Ld9bnUO^jN4KENvf8qj_U3oXG%;-k{9_lHljgQ06jD`=;rHdBt5En``I0q!)P zbxHgGJx2+klL=IKN~mxduQxF1Dbrky6GeSqw2Z_* z_aM~>A3V7cz1$mIJ~%pQ$ye9F$n9~op`Lc`+a_F=y4|>vIaqNDq@=tGTF<%lLKzd@ z`}oo#@oW3vk1aMzk`+{C!+4p@`&mj9{QeJ}BY0t{CK8q)5Pg^~p1<{hj3G`<852Pl zep*mk{YT&~d$Z7vBfHY1e=vXJh%j$fcTza-=3lH+so$$y*wUPvzqz=8>?cFs z<*U2QLFbF3a;}KIEcqJi;daXABYrZU^q=QS{KE&R`C&eN$q$>F?7_9?GMT7k z-V>?Cb>OX6EbTV=sGJ}?qSs>5unV(Ry-z-Xb?#%o^J-_wDPcW-Prp3iCE1#EE~ll+ zH5_}C<50trknp<#wUCyr56<)Tz>PdJw#OsZqEh!wP}I34Q2UwK&Nv4(6>fxSz3Sn;E80Tt;Hm>z|-y9W`7JoXh5Si9Q<>3-Fj0SGl-0GQq6&CLhNvxW- z=ih95pjG-+B@Ry=s38Spyie05ONXv@FOiwf^vu^QE62I*B|f(iXlhT-yj0zfmoj

)bNtXB<>| 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

Output files @@ -39,13 +36,13 @@ This subworkflow reads the input .yaml via the use of the built-in snakeyaml.Yam -This workflow generates a .genome file which describes the base pair length of each scaffold in the reference genome. This is performed by [SAMTOOLS_FAIDX](https://nf-co.re/modules/samtools_faidx) to generate a .fai file. This index file is trimmed using local module [GENERATE_GENOME_FILE](../modules/local/generate_genome_file.nf) to output a .genome file. This file is then recycled into the workflow to be used by a number of other subworkflows. - ![Generate genome workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_generate_genome.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### LONGREAD_COVERAGE +## longread-coverage + +Longread Coverage uses Pacbio HiC reads to generage a coverage bigWig as well as a trio of depth.bigbed files.
Output files @@ -59,9 +56,9 @@ This workflow generates a .genome file which describes the base pair length of e
-Longread Coverage uses Pacbio HiC reads to generage a coverage bigWig as well as a trio of depth.bigbed files. +## gap-finder -### GAP_FINDER +The gap-finder subworkflow generates a bed file containing the genomic locations of the gaps in the sequence. This file is injected into the hic_maps at a later stage. The output bed file is then BGzipped and indexed for display on JBrowse.
Output files @@ -74,13 +71,13 @@ Longread Coverage uses Pacbio HiC reads to generage a coverage bigWig as well as
-The GAP_FINDER subworkflow generates a bed file containing the genomic locations of the gaps in the sequence. This is performed by the use of [SEQTK_CUTN]() which cuts the input genome at sites of N (gaps). [GAP_LENGTH]() then calculates the lengths of gaps generates in the previous step, this file is injected into the hic_maps at a later stage. SEQTK's output bed file is then BGzipped and indexed by [TABIX_BGZIPTABIX](https://nf-co.re/modules/tabix_bgziptabix). - ![Gap Finder workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_gap_finder.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### REPEAT_DENSITY +## repeat-density + +This uses [WindowMasker](https://github.com/goeckslab/WindowMasker) to mark potential repeats on the genome. The genome is chunked into 10kb bins which move along the entire genome as sliding windows in order to profile the repeat intensity. These fragments are then mapped back to the original assembly for visualization purposes.
Output files @@ -89,13 +86,14 @@ The GAP_FINDER subworkflow generates a bed file containing the genomic locations - `*_repeat_density.bw`: Intersected read windows aligned to the reference genome in bigwig format.
-This uses [WindowMasker](https://github.com/goeckslab/WindowMasker) to mark potential repeats on the genome. The genome is chunked into 10kb bins which move along the entire genome as sliding windows in order to profile the repeat intensity. Bedtools is then used to intersect the bins and WindowMasker fragments. These fragments are then mapped back to the original assembly for visualization purposes. ![Repeat Density workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_repeat_density.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### HIC_MAPPING +## hic-mapping + +The hic-mapping subworkflow takes a set of HiC read files in .cram format as input and derives HiC mapping outputs in .pretext, .hic, and .mcool formats. These outputs are used for visualization on [PretextView](https://github.com/wtsi-hpag/PretextView), [Juicebox](https://github.com/aidenlab/Juicebox), and [Higlass](https://github.com/higlass/higlass) respectively.
Output files @@ -106,13 +104,14 @@ This uses [WindowMasker](https://github.com/goeckslab/WindowMasker) to mark pote - `*.mcool`: HiC map required for HiGlass
-The HIC_MAPPING subworkflow takes a set of HiC read files in .cram format as input and derives HiC mapping outputs in .pretext, .hic, and .mcool formats. These outputs are used for visualization on [PretextView](https://github.com/wtsi-hpag/PretextView), [Juicebox](https://github.com/aidenlab/Juicebox), and [Higlass](https://github.com/higlass/higlass) respectively. ![Hic Mapping workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_hic_mapping.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### TELO_FINDER +## telo-finder + +The telo-finder subworkflow uses a supplied (by the .yaml) telomeric sequence to identify putative telomeric regions in the input genome. The BGZipped and indexed file is used in JBrowse and as supplementary data for HiGlass and PreText.
Output files @@ -125,13 +124,13 @@ The HIC_MAPPING subworkflow takes a set of HiC read files in .cram format as inp
-The TELO_FINDER subworkflow uses a supplied (by the .yaml) telomeric sequence to identify putative telomeric regions in the input genome. This is acheived via the use of [FIND_TELOMERE_REGIONS](../modules/local/find_telomere_regions.nf), the output of which is used to generate a telomere.windows file with [FIND_TELOMERE_WINDOWS](../modules/local/find_telomere_windows.nf) (Both of these modules utilise VGP derived telomere programs [found here](https://github.com/VGP/vgp-assembly/tree/master/pipeline/telomere)), data for each telomeric site is then extracted into bed format with [EXTRACT_TELO](../modules/local/extract_telo.nf) and finally BGZipped and indexed with [TABIX_BGZIPTABIX](https://nf-co.re/modules/tabix_bgziptabix/tabix_bgziptabix). - ![Telomere Finder workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_telo_finder.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### BUSCO_ANALYSIS +## busco-analysis + +The BUSCO annotation subworkflow takes an assembly genome as input and extracts a list of [BUSCO](https://gitlab.com/ezlab/busco) genes based on the BUSCO results obtained from BUSCO. Additionally, it provides an overlap BUSCO gene set based on a list of lepidoptera ancestral genes (Wright et al., 2023), which has been investigated by Charlotte Wright from Mark Blaxter's lab at the Sanger Institute.
Output files @@ -142,13 +141,13 @@ The TELO_FINDER subworkflow uses a supplied (by the .yaml) telomeric sequence to
-The BUSCO_ANNOTATION subworkflow takes an assembly genome as input and extracts a list of [BUSCO](https://gitlab.com/ezlab/busco) genes based on the BUSCO results obtained from BUSCO. Additionally, it provides an overlap BUSCO gene set based on a list of lepidoptera ancestral genes (Wright et al., 2023), which has been investigated by Charlotte Wright from Mark Blaxter's lab at the Sanger Institute. - ![Busco analysis workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_busco_analysis.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### GENE_ALIGNMENT +## gene-alignment + +The gene alignment subworkflows load genesets (cdna, cds, rna, pep) data from a given list of genomes detailed, in the input .yaml, and aligns these to the reference genome. It contains two subworkflows, one of which handles peptide data and the other of which handles RNA, nuclear and complementary DNA data. These produce files that can be displayed by JBrowse as tracks.
Output files @@ -167,23 +166,13 @@ The BUSCO_ANNOTATION subworkflow takes an assembly genome as input and extracts
-The gene alignment subworkflows loads genesets (cdna, cds, rna, pep) data from a given list of genomes detailed, in the input .yaml, and aligns these to the reference genome. It contains two subworkflows, one of which handles peptide data and the other of which handles RNA, nuclear and complementary DNA data. These produce files that can be displayed by JBrowse as tracks. - -NUC_ALIGNMENTS: Reference fasta and fai files are aligned with the above mentioned gene alignment query files by [MINIMAP2_ALIGN](https://nf-co.re/modules/minimap2_align). -These are merged with [SAMTOOLS_MERGE](https://nf-co.re/modules/samtools_merge), converted to .bed format through [BEDTOOLS_BAMTOBED](https://nf-co.re/modules/bedtools_bamtobed), sorted via [BEDTOOLS_SORT](https://nf-co.re/modules/bedtools_sort) and finally converted to .bigBed format [UCSC_BEDTOBIGBED](https://nf-co.re/modules/ucsc_bedtobigbed) with the use of an auto SQL file found in the /assets/gene_alignment folder. This process is performed per species per data type. - -PEP_ALIGNMENTS: Reference fasta is indexed with [MINIPROT_INDEX](https://nf-co.re/modules/miniprot_index) and aligned with peptide data [MINIPROT_ALIGN](https://nf-co.re/modules/miniprot_align). The output .gff file is merged with [CAT_CAT](https://nf-co.re/modules/cat_cat) per species, sorted with [BEDTOOLS_SORT](https://nf-co.re/modules/bedtools_sort) and indexed with [TABIX_BGZIPTABIX](https://nf-co.re/modules/tabix_bgziptabix/tabix_bgziptabix). - -PUNCHLIST: Punchlists contain information on genes found to be duplicated (fully and partially) in the input genome. This is generated differently dependent on whether the datatype is peptide or not. - -- NUC_ALIGNMENT:PUNCHLIST takes the merged.bam produced after the [SAMTOOLS_MERGE](https://nf-co.re/modules/samtools_merge) step. This is then converted into a .paf file with [PAFTOOLS_SAM2PAF](https://github.com/nf-core/modules/tree/master/modules/nf-core/paftools/sam2paf) and finally into bed with [PAF2BED](../modules/local/paf_to_bed.nf). -- PEP_ALIGNMENT:PUNCHLIST takes the merged.gff produced by [CAT_CAT](https://nf-co.re/modules/cat_cat) and converts it into .bed with [GFF_TO_BED](../modules/local/gff_to_bed.nf) - ![Gene alignment workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_gene_alignment.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### INSILICO_DIGEST +## insilico-digest + +The insilico-digest workflow is used to visualize the Bionano enzyme cutting sites for a genomic FASTA file. This procedure generates data tracks based on three digestion enzymes: BSPQ1, BSSS1, and DLE1.
Output files @@ -193,13 +182,13 @@ PUNCHLIST: Punchlists contain information on genes found to be duplicated (fully
-The INSILICO_DIGEST workflow is used to visualize the Bionano enzyme cutting sites for a genome FASTA file. It starts by identifying the recognition sequences of the labeling enzyme to create a CMAP file. This CMAP file is then converted into BED and BIGBED formats to provide visualizations of the Bionano enzyme cutting sites. This procedure generates data tracks based on three digestion enzymes: BSPQ1, BSSS1, and DLE1. - ![Insilico digest workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_insilico_digest.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### SELFCOMP +## selfcomp + +The selfcomp subworkflow is a comparative genomics analysis originally performed by the Ensembl project. It involves comparing the genes and genomic sequences within a single species. The goal of the analysis is mainly to identify haplotypic duplications in a particular genome assembly.
Output files @@ -209,13 +198,13 @@ The INSILICO_DIGEST workflow is used to visualize the Bionano enzyme cutting sit
-he SELFCOMP subworkflow is a comparative genomics analysis originally performed by the Ensembl project. It involves comparing the genes and genomic sequences within a single species. The goal of the analysis is mainly to identify haplotypic duplications in a particular genome assembly. - ![Selfcomp workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_selfcomp.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### SYNTENY +## synteny + +This worflows searches along predetermined path for syntenic genome files based on clade and then aligns with [MINIMAP2_ALIGN](https://nf-co.re/modules/minimap2_align) each to the reference genome, emitting an aligned .paf file for each.
Output files @@ -225,22 +214,21 @@ he SELFCOMP subworkflow is a comparative genomics analysis originally performed
-This worflows searches along predetermined path for syntenic genome files based on clade and then aligns with [MINIMAP2_ALIGN](https://nf-co.re/modules/minimap2_align) each to the reference genome, emitting an aligned .paf file for each. - ![Synteny workflow](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_synteny.jpeg) ![Workflow Legend](https://raw.githubusercontent.com/sanger-tol/treeval/dev/docs/images/treeval_1_0_legend.jpeg) -### Pipeline information +## pipeline-information + +[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage.
Output files -- `pipeline_info/` +- `treeval_info/` + - Report generated by TreeValProject. - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`.
- -[Nextflow](https://www.nextflow.io/docs/latest/tracing.html) provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to troubleshoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. From bd1d37f16eaa4919a56110068b959e6ef6abbedf Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 1 Aug 2023 13:05:29 +0100 Subject: [PATCH 74/85] Linting fix --- CHANGELOG.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b90af9b..e7ee3034 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,24 +36,24 @@ The essential pathways of the gEVAL pipeline have now been converted to Nextflow Note, since the pipeline is using Nextflow DSL2, each process will be run with its own Biocontainer. This means that on occasion it is entirely possible for the pipeline to be using different versions of the same tool. However, the overall software dependency changes compared to the last release have been listed below for reference. -| Module | Old Version | New Versions | -| ------------------------------ | ----------- | ------------------------- | -| bedtools | - | 2.31.0 | -| busco | - | 5.4.3 | -| bwa-mem2 | - | 2.2.1 | -| cat | - | 2.3.4 | -| cooler | - | 0.9.2 | -| gnu-sort | - | 8.25 | -| minimap2 + samtools | - | 2.24 + 1.14 | -| miniprot | - | 0.11--he4a0461_2 | -| mummer | - | 3.23 | -| paftools (minimap2 + samtools) | - | 2.24 + 1.14 | -| pretextmap + samtools | - | 0.1.9 + 1.17 | -| samtools | - | 1.17 | -| seqtk | - | 1.4 | -| tabix | - | 1.11 | -| ucsc | - | 377 | -| windowmasker (blast) | - | 2.14.0 | +| Module | Old Version | New Versions | +| ------------------------------ | ----------- | ---------------- | +| bedtools | - | 2.31.0 | +| busco | - | 5.4.3 | +| bwa-mem2 | - | 2.2.1 | +| cat | - | 2.3.4 | +| cooler | - | 0.9.2 | +| gnu-sort | - | 8.25 | +| minimap2 + samtools | - | 2.24 + 1.14 | +| miniprot | - | 0.11--he4a0461_2 | +| mummer | - | 3.23 | +| paftools (minimap2 + samtools) | - | 2.24 + 1.14 | +| pretextmap + samtools | - | 0.1.9 + 1.17 | +| samtools | - | 1.17 | +| seqtk | - | 1.4 | +| tabix | - | 1.11 | +| ucsc | - | 377 | +| windowmasker (blast) | - | 2.14.0 | ### Fixed From 0c714fb0364f6c1c655fb2fd984d3e9349721e01 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 1 Aug 2023 15:29:50 +0100 Subject: [PATCH 75/85] Updated for review --- .../local_testing/nxOsc-2023-05-02.dp.TEST.md | 31 -- assets/schema_input.json | 26 +- assets/treeval_test.yaml | 28 -- bin/gff_to_bed.sh | 18 - conf/igenomes.config | 432 ------------------ conf/modules.config | 2 +- .../treeval_genealignment_workflow.jpeg | Bin 114401 -> 0 bytes .../treeval_generategenome_workflow.jpeg | Bin 16116 -> 0 bytes .../treeval_insilicodigest_workflow.jpeg | Bin 39160 -> 0 bytes docs/images/treeval_selfcomp_workflow.jpeg | Bin 80497 -> 0 bytes docs/images/treeval_synteny_workflow.jpeg | Bin 19130 -> 0 bytes docs/usage.md | 90 +--- modules/local/gff_to_bed.nf | 42 -- subworkflows/local/pep_alignments.nf | 8 +- 14 files changed, 43 insertions(+), 634 deletions(-) delete mode 100755 assets/local_testing/nxOsc-2023-05-02.dp.TEST.md delete mode 100755 assets/treeval_test.yaml delete mode 100755 bin/gff_to_bed.sh delete mode 100755 conf/igenomes.config delete mode 100755 docs/images/treeval_genealignment_workflow.jpeg delete mode 100755 docs/images/treeval_generategenome_workflow.jpeg delete mode 100755 docs/images/treeval_insilicodigest_workflow.jpeg delete mode 100755 docs/images/treeval_selfcomp_workflow.jpeg delete mode 100755 docs/images/treeval_synteny_workflow.jpeg delete mode 100755 modules/local/gff_to_bed.nf diff --git a/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md b/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md deleted file mode 100755 index 32fbd6d0..00000000 --- a/assets/local_testing/nxOsc-2023-05-02.dp.TEST.md +++ /dev/null @@ -1,31 +0,0 @@ -e769c449778489095a023896d05b87fa cds/CaenorhabditisElegans.WBcel235_cds.bigBed -29f4bb4aa841e754e6ad90a95c51a8ac cds/Gae_host.Gae_cds.bigBed -55e02bdabcbd4c03413d42026ac9e34a custom/software_versions.yml -d41d8cd98f00b204e9800998ecf8427e gap/Oscheius_DF5033_gaplen.bed -efa3906048c52a26a3b762142b138df2 gen/CaenorhabditisElegans.WBcel235_cdna.bigBed -6a1f75afdc99390c150a9abe204e856b generate/my.genome -ab841e49f59ff1dd51ed87191c2d7562 gen/Gae_host.Gae_cdna.bigBed -8b277d209db8bf97c46f118562c4b9b5 gen/OscheiusTipulae.ASM1342590v1_cdna.bigBed -1d1846bbab542500504b19bfc56cb9b2 insilico/BSPQI.bigBed -008e29071b2574e2ed50a2887f4a7fc5 insilico/BSSSI.bigBed -5f58843218b373c5addd38bc91e0d74d insilico/DLE1.bigBed -08d932ddcb01866d9cfa76dbcaf8c5f5 longread/Oscheius_DF5033.bigWig -36e4493afcd46a6c89d762fee08b2aa8 longread/Oscheius_DF5033_halfdepth.bed -7bd5f463e6cd75e876f648dce93411fc longread/Oscheius_DF5033_maxdepth.bed -82d251d88ee7d9bdbb29b68d3136b7ea longread/Oscheius_DF5033_zerodepth.bed -cf6a4dc883979ac9cafd75382aa16bdc pep/CaenorhabditisElegans.WBcel235_pep.gff.gz -84c1ad1989c7e9bcf13258b2774f4a25 pep/CaenorhabditisElegans.WBcel235_pep.gff.gz.tbi -c2cccc5ab38b0e6b4e12fea2c1151569 pep/Gae_host.Gae_pep.gff.gz -6a6522a6176761172a6313df9fc5b210 pep/Gae_host.Gae_pep.gff.gz.tbi -e012da1d0c2ea40171785ead8a294289 punchlist/CaenorhabditisElegans.WBcel235_cdna_punchlist.bed -d9da11fc3f6170a1c37c38765718ab47 punchlist/CaenorhabditisElegans.WBcel235_cds_punchlist.bed -31d4e0cec6ef4ec92d51336393a923be punchlist/CaenorhabditisElegans.WBcel235_rna_punchlist.bed -1ae4cbf700ff5b6d02c96631351f7eb8 punchlist/Gae_host.Gae_cdna_punchlist.bed -50f76662114c8a77e8604a5a539e1e9c punchlist/Gae_host.Gae_cds_punchlist.bed -c269f93c3a43697116b5aa75314e5e07 punchlist/Gae_host.Gae_rna_punchlist.bed -e5fed140728b0f0d088d983a34868d8d punchlist/OscheiusTipulae.ASM1342590v1_cdna_punchlist.bed -779ad07ceefaca4657090c9f0322ddfd repeat/Oscheius_DF5033.bigWig -9d2cca3997c9a60f66516af739eb3719 repeat/Oscheius_DF5033_renamed.bed -bb92039394cc0f2e9e6809e78be4bc9e rna/CaenorhabditisElegans.WBcel235_rna.bigBed -4254dcb32d0aed160e03d3f6c02cf636 rna/Gae_host.Gae_rna.bigBed -b2d9bea322639d2b0954a0ccc7eed800 selfcomp/Oscheius_DF5033_selfcomp.bigBed diff --git a/assets/schema_input.json b/assets/schema_input.json index 7240ae81..da0589ea 100755 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -7,10 +7,28 @@ "items": { "type": "object", "properties": { - "sample": { - "type": "string", - "pattern": "^\\S+$", - "errorMessage": "Sample name must be provided and cannot contain spaces" + "assembly": { + "type": "object", + "properties": { + "sample_id":{ + "type": "string", + "errorMessage": "Sample name must be provided and cannot contain spaces" + }, + "latin_name":{ + "type": "string", + "errorMessage": "The scientific name for the assembly" + }, + "classT":{ + "type": "string", + "errorMessage": "The Clade of the assembly. Used as the syntenic group and to complete the gene_alignment data dir." + }, + "TicketType":{ + "type": "string", + "errorMessage": "Not currently in use. Single word description of assebmly." + } + } + } + }, "fastq_1": { "type": "string", diff --git a/assets/treeval_test.yaml b/assets/treeval_test.yaml deleted file mode 100755 index 0563400c..00000000 --- a/assets/treeval_test.yaml +++ /dev/null @@ -1,28 +0,0 @@ -assembly: - sizeClass: { S if (genome => 4Gb) else L } - sample_id: ToLID - latin_name: to_provide_taxonomic_rank - classT: { nematode | insect | mammal | etc } - TicketType: { DTOL | VGP | ERGA | FACULTY | OTHER } -reference_file: path_to_input_genome -assem_reads: - pacbio: path_to_fasta - hic: path_to_cram - supplementary: path -alignment: - data_dir: gene_alignment_data - geneset: "csv of genesets" -self_comp: - motif_len: 0 - mummer_chunk: 10 -telomere: - teloseq: TTAGGG -synteny: - synteny_genome_path: syntenic_genome_path -busco: - lineages_path: path_to_lineages_folder - lineage: lineage -outdir: "NEEDS TESTING" -intron: - size: "50k" -fix: "testoing" diff --git a/bin/gff_to_bed.sh b/bin/gff_to_bed.sh deleted file mode 100755 index 12f96690..00000000 --- a/bin/gff_to_bed.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -# gff_to_bed.sh -# ------------------- -# A shell script to convert a -# gff into bed format by stripping the -# PAF header and reorganising the data -# ------------------- -# Author = yy5 - -version='1.0.0' - -if [ $1 == '-v']; -then - echo "$version" -else - grep '##PAF' $1 | sed 's/##PAF\t//g'|awk 'BEGIN{FS="\t";}{a[$1]++;if(a[$1]==2)print v[$1] ORS $0;if(a[$1]>2)print;v[$1]=$0;}' | awk '$(NF+1) = ($10/$11)*100'|awk '$(NF+1) = ($10/($2*3))*100'|awk -vOFS='\t' '{print $6,$8,$9,$1,$2,$10,$(NF-1),$NF}' > $2 -fi diff --git a/conf/igenomes.config b/conf/igenomes.config deleted file mode 100755 index c2b8d501..00000000 --- a/conf/igenomes.config +++ /dev/null @@ -1,432 +0,0 @@ -/* -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Nextflow config file for iGenomes paths -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Defines reference genomes using iGenome paths. - Can be used by any config that customises the base path using: - $params.igenomes_base / --igenomes_base ----------------------------------------------------------------------------------------- -*/ - -params { - // illumina iGenomes reference file paths - genomes { - 'GRCh37' { - fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/GRCh37-blacklist.bed" - } - 'GRCh38' { - fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'GRCm38' { - fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/GRCm38-blacklist.bed" - } - 'TAIR10' { - fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Annotation/README.txt" - mito_name = "Mt" - } - 'EB2' { - fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Annotation/README.txt" - } - 'UMD3.1' { - fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Annotation/README.txt" - mito_name = "MT" - } - 'WBcel235' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Annotation/Genes/genes.bed" - mito_name = "MtDNA" - macs_gsize = "9e7" - } - 'CanFam3.1' { - fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Annotation/README.txt" - mito_name = "MT" - } - 'GRCz10' { - fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'BDGP6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Annotation/Genes/genes.bed" - mito_name = "M" - macs_gsize = "1.2e8" - } - 'EquCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Annotation/README.txt" - mito_name = "MT" - } - 'EB1' { - fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Annotation/README.txt" - } - 'Galgal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Gm01' { - fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Annotation/README.txt" - } - 'Mmul_1' { - fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Annotation/README.txt" - mito_name = "MT" - } - 'IRGSP-1.0' { - fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'CHIMP2.1.4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Annotation/README.txt" - mito_name = "MT" - } - 'Rnor_5.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'Rnor_6.0' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Annotation/Genes/genes.bed" - mito_name = "MT" - } - 'R64-1-1' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Annotation/Genes/genes.bed" - mito_name = "MT" - macs_gsize = "1.2e7" - } - 'EF2' { - fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Annotation/README.txt" - mito_name = "MT" - macs_gsize = "1.21e7" - } - 'Sbi1' { - fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Annotation/README.txt" - } - 'Sscrofa10.2' { - fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Annotation/README.txt" - mito_name = "MT" - } - 'AGPv3' { - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Annotation/Genes/genes.bed" - mito_name = "Mt" - } - 'hg38' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg38-blacklist.bed" - } - 'hg19' { - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "2.7e9" - blacklist = "${projectDir}/assets/blacklists/hg19-blacklist.bed" - } - 'mm10' { - fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.87e9" - blacklist = "${projectDir}/assets/blacklists/mm10-blacklist.bed" - } - 'bosTau8' { - fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'ce10' { - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "9e7" - } - 'canFam3' { - fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Annotation/README.txt" - mito_name = "chrM" - } - 'danRer10' { - fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.37e9" - } - 'dm6' { - fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Annotation/Genes/genes.bed" - mito_name = "chrM" - macs_gsize = "1.2e8" - } - 'equCab2' { - fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Annotation/README.txt" - mito_name = "chrM" - } - 'galGal4' { - fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Annotation/README.txt" - mito_name = "chrM" - } - 'panTro4' { - fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Annotation/README.txt" - mito_name = "chrM" - } - 'rn6' { - fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Annotation/Genes/genes.bed" - mito_name = "chrM" - } - 'sacCer3' { - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" - readme = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Annotation/README.txt" - mito_name = "chrM" - macs_gsize = "1.2e7" - } - 'susScr3' { - fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" - bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" - star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" - bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" - gtf = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.gtf" - bed12 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/Genes/genes.bed" - readme = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Annotation/README.txt" - mito_name = "chrM" - } - } -} diff --git a/conf/modules.config b/conf/modules.config index 77d1dbea..5bdc8c66 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -32,7 +32,7 @@ process { // Files to be stored along side the TreeVal files for access by curators // all are .bed - withName: 'PAF2BED|GFF_TO_BED|FINDHALFCOVERAGE|BEDTOOLS_MERGE_MAX|BEDTOOLS_MERGE_MIN' { + withName: 'PAF2BED|EXTRACT_COV_IDEN|FINDHALFCOVERAGE|BEDTOOLS_MERGE_MAX|BEDTOOLS_MERGE_MIN' { publishDir = [ path: { "${params.outdir}/treeval_upload/punchlists" }, mode: params.publish_dir_mode, diff --git a/docs/images/treeval_genealignment_workflow.jpeg b/docs/images/treeval_genealignment_workflow.jpeg deleted file mode 100755 index a81fa73ac5733bcecc9dc64bd06d839d9e133933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 114401 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
dfu8IoB^FXr)GVD5iFF@g!PPa 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.QIV6Nhm zc}3m8iis4q?2EAzPD6X=c@kW&C*W+tWyZSY&}9a=Su!#7Vbrw9z)g26k~wbNEtor8 zwpcsyLp*e$<&#qTvR5a&?dD@br$}^pmu2##|ER7vAJoM5TE1s`w-C>gtl#FdkG#7XIW#iDKMS(GpUhY*u>L8NP{cq=FCN9uM<6_pk3!MoT>P| zgVz^VBC1xGhFkO(94bk@aZ>%deD?I=KWorxQ489cz0}u0bQ2qzbzJ1N|BVbP=0Sgd zroZJ8s>J;DI>dgRJBef3z^-E2(7u|MAQC&-80;<4trji|Jl+ z7wNu&iBEPr4PNrZOT^@rbiW?9ZeLZ|2xZ~tXgW~*Qcj3y^KRTb=O;%c!QcPr>bZ-1 zcH^Vvs$Yvb3)_ns z9G_h|Fx2T}xA2aD#>O|e|=w*W}1FjeIo4KS#~H}-&j5+cjiWW_QE`XKoShw5;e}8xw(Jd>v?By$aIfv2KZgf z>;J|tv#z%Gx&U>GZtj)6j*`Lk!zFtNT%5{wDGSxPBeOM9+yI(DS_t2l*M{r=i@Em> zXfoUOhIMA_qJn}_6-bb-geFy`Co~C75{e1|5(o$qs^BQnq=yiChlEh2gpQ2T2|WQM zw4q8@x-{pDp6`s_d*< z-w!qW_502LB&GPrk>5-=^hz2IhzF2+3*?Q#o9p#QmH&`SE z)pfm)H8xKeXQKB{&Ld?ch{ z&DU?S>pc-@NH82B+<#NFmr3mwP4lQ|QWbNBYDwj*1G?b2lry!4^Rl2APK7et3X}Ak zRE4UtaH8X!kLhuJ;=pLJ#iyBWe_lN7R(M6DQ&lNOV^S1n^KO$Kz(#;2V0xwQ{7|{? zNmf{47RXPh;v;?*6i)6Advb7ouFSslyX7-T?OZU7CA+@7AH^U-i>zZP z@3|znxT(hD*-$?&y4&@kc_UI3X#hey>AI+G_&7cq$W#qfCy>y>An61rz3dbp%Gl9~ zKMOm`Hp=NMq>2 z1;$r0hVExUs%$buMq_Yu!4Pl-%Q_Z@N;s~bS&?vJWh2Tnso7lE*nX(quM$GidJ~_i zTHIhBaxeF7W=;RlXETO-PIWF^AXZ2t*6(sgG&A$DfPMBb^g;T2lkR}0qnEj~@O3-v z!pp0}!ZNQHg+L$B{8FNQRajdeeV6Mf8G!%TZ$CEu&$PU=iIB@;pZ$#<1na5J+X7P7 zrjy*rSeZBz>^fF=j^QEtnYtS2Uy%bmC0(e7%l?XS7yRqfoBJ&BPC9l`8#k^cqg!YY zNIwI}gWU}TTL1O0`}%JM9-Rqo4Nm1Jy0Bw!Isqz0tF_8=*Yeg7CY(48e7C5bIV3#i zs&sRaMoYii3-Jv}x_5wlQcJ@Hs3YfjStFONG`6NfQ|l396S@)6u5Op4wp?+>g%^)O z+e1to48-Kwb8#AXZzp>W)vTN)VW#()4t(_J3F#^E%`YV-YpuMkFb%{|RtG&TW{N0&6^R^BkLuhA|=JH z_!y_I#O1i$VyOV3a>Wl4=z?TE@#&$wNGKrs%3af{x+%~3ghxwcG0szNil%O0LPxX` zsJed&heZ(RXmJ+ZCT5ONvx4AuB;Z47rKT?E;h{I-qshj(r=~`a& zFaR*s!8ZrhcLo}QX2;%BQ(Lh2&QN=}bnTl4a$WqOn)5aqnyaPeS;7JTST{M39|3dV zvTpM-GsmB=T4#^rCK;q?ht<8TqW61azv9#QSzqJ&_3PdLq4&}^@&E4|t4JE_`x66gwd|S~5kv-{yY0(dY&}@$;E|Hl{Le}WZ=IQpf9Vo>KO7ea%_}OA zpr!zlqxNtRs7dK#9HEkJ6`Up-$v7uSO&5#XIsg6{uvc(+L3aJc?jQ)5X7tXGjKVW zvD#}|H~db2qO~YL)tnJft=Dp z-t(D~4|-Ji4jvsQT(3=l z&9uaF#GYI*K3yuNHXs!9Fvm%BST#_y)bw|1Z*Tp{L?tO2j`aXD`)mxkP zD2pmKPuo6K$xMMSJr2%V)v0GS8vrduP>q z!8bgYVCC3F^U+dG=@pW`s`R2S%gbz~08c{)OemyMt0G@HYw)^Zb_Oi&yYuF;;f>3kJY;Mx%R0`vIvD&b~hxX1dVU3!mjwFV(D@3k;^v3n)&B(NU)YJ~bN~dmJ4&bXOk|Em2Vad_)m`R8|YjrnDHg$=ba!AmZ`l!BuZb-`jvu1taB%lCO4MF#Recq%SnfZ-LjlKs)$rV|j&53ScP%YBgin#j6=*68Jay(rsH z_2|Kab~#x^IJ?rKZ(mFiSe7aDUYdS@^l&$42`)<})es^%0GMKd&HEarZ?}ghXLX@t z4{6!qZHu0Muxi4B;n>m{sdJr*&G+v){AbxYW-t(K*)Fk!q zrocH|dD3M@{3IcMB?qyApj+a&$)%uVN5A(z3`nFZR`tHGdRea^A3jZ5D0$cy64 zGXzq(VNoGrx8C7WH?jRl$s0X1b<9c)KO%S@YAHV#(JA9D2wOspPqLY=4LE~U;wnOH1RM2&@4hij4@dB|A7mekib#o~l zP9o6tG@>;yh08s$qk@4^UuX&#i(cCD$=oRHt}Og)kc-QEnt*Z@@t%L?e>XKmrnduX z#c+|?-Kgkyvq&YcK79M5vHECVQQzdK6eQrMjD}L$R4vmNSVca5is^LkK~P58y*NEP zQ)%UkQtz2beU%LCi9pU#?^IfLF!{EJ%F%E3+@lwjX9?6I2CE)_(ujx{*jxBeVn$yZ($wHD!XU2M8nlha( zIX9VUxU_kAh$pg=!k%0tn^#`Y*2|euI$Lur(N(_ow|`ggKYUf3XdS;H8q&A|%|9n6 zXIRdy>m-MjHYj}|)uxw2i|K&kpQU6kjgc_J2!ak;pybBe>O}X4M}(Ajurf0bt7#Q63uXC!FoPGp zv6o8R%Q+ttl*egSwJ>j7;w4C+Tyj#k1# zd7)E@!>YAjFJqPuWgRsd(r*>)tA@}O{LU>|dfu2AvGyJPTMo~^YKF+AefPzf7>Dhc z>KD7qQgkN1%ogml^9OMBJ#?3TG_9h^L4`^TU)>zr4yzP^=~eDo@*@fPxBY8|QqSyc zzn}29GF7&6F@!F^;b`uEELNwy4ADJyw_K2JTQn;7I@K~&*iw^MoCU*28-cNAq*+e7 zZ08r(^Yx&*Egc3W>n}eWe(Yp+X`R>wn+Q>6m+KTPv#zTENI`llSuBw6fcCIx=6P78 z#V+G~*ID;b?{^%1NuQYAx9_chPS3LYT8Q{E@8*_2Pbpb2s4NLhGCF1L*zNiGvo*97 zwv4}cydA|&NbmR0HKerQ(M|bItink=L|B2wL*g8Jn+r{nO-?bOe0aVw6h@0pU`YaG zhr>fTEwYELixTM@=#-^fv&|^ zeD3J0MeV-WT^Xo3dpfMhsH$C4ZhqdyM?1=!ZI&k>cbrNGH7bO~#G2PPDECgeM~ppxVkzY?d0_2p(oy3|q7>X) zI`gpNY7|8qO%hce0c$^P8Qc&CW(Wa+V=~d{U6v`S{b-j#B_F2BP^o$o$3LOfTXno! zefs_aTm3(TfmO5k;|Lbh5SsmEL8UtfTH--Y$y&Q~J}doc7cuqFic_3ydj+A^Hi5rV zIcpR7yRiY)ZkDoe*iy1!TGAEu^*M9`LWXC--AKkGuZmB{>AoDU7qA)XZ9FSuu?Plg#WH5XVkzCIewTHHcPo z2GJU8UQ)GQvI}X$v$`|6=BU@rmrcQ;HmU^;98aA1lJ}2Q&rLve+R4{ya$_0z1c567 zE!`y=+vcCj4l`YPy6>miOHY0nE;ANBjn;BgotV&eiPZ(CS2{_Lr-Z$XhZE_OTsGM>Vs(>`oDEh| z+98Aas)1C^e4>S$2Bo8_<5*Z&itIIbC+u9tIlh`%_3Ymmwg&WZ{lp4(j!vwFcf!KB z_{xy3T+tkCb)oBogA4bsH(qUO!@9a;bY07C(c)hVZMF5ZdG`CmLYOjabL?>>%?uCb zv?zEW)Zx)ss%Mv@eU|9gp8n6=94?yfBHaEs!V#}rus*$+*0|*OOi!v8^X=BJZ~qg( zfxip+S(xDSWFqZy-|Ypg;+p~L)v=Ak;x4we8LuOk&T{ew$DhBdjaz3&gsNbtBgE8j z8NgEv?!Yt`X11D$Bq9tnzuMq&yt<<~#~9fotXO3z(wE>HWH=s>q0J8o z9R-~VG))ebF&i!jIYU&O+G%Rd+HQhHV36RISAo4CD4OnU; zRT;NrgUcx5t_r4aY@6cyE`0#8=~Rf78~0Ws7xRqG!l1q3wYa`Q^}0}RY0y^?ZWe32 z1#bj9qW`vNL0@pGD&}&@7d`T-%=}6Q{lx;t1VG?ptwp6s32rklTLyaj3GF|3q42z> zoGn@69^n_5PEO!3@5K1QcN8x0+*(i0HZsHGxo*rCj2Ns)eiZYekWhDBsjpyZ|pDUXp}EdEwl+aMTz+Q@ED6T5l{y^K(owL zx`{BWysj|$v<+QkJ{%g+xB!nDgCku8F#zuj4SH`We{YvC|Eh#kiD+4h>Br^PkP_Hr zCAQSK%%S?;P^qj*o+PVtG&>9KWmTp$AY45!xLi!zkk?iY(Jy`r5r-Eof7LATdyZOB zFDhEti0*$fhQ&sIjix?(ih=gbpz!4r)v0~89*O$o9KDjCK8d6o zYUN3a=`4*p2+(Y?w|Ub%D>)c2Qjd@ykWOmLX7zD8N6}AxC#N8>U-El zur6m8^Qt2*hF@<=OskDjCsm3{s?fCn%yK!_sK0&8cUak-fTZ{xbGOSAb46m!sEM5c zt9?0H(9u|X1PR4iNeHct6CxTrRW}WttLRcU3JsOJU*6u1NI1b^;Vr3mQC}(!W;r0r zfaq{J1Kx#ZC%8%2vRg)zO1n3rrS&_ju=$9Nw$0Hbhj#KqG2Qk;vhl-vW-zzWSf$#B z>`wZsO5Slb0;|x4Oeci+YVv3|qQHFMRYB^UdPPU?U0z7BH=+GEuox08-%$GyMb1%T z&}(Iie;TV!M!$%Unqg=DN_n&cr+mvk;{O4u|TlS4tsNOJauG z&8k`XcawOfN5>$tbKlwv5AS)Q?efO2CSTKm%rZJ*WeaaZvt%kI^%F_E=Uask}8N+y>}EI{C!?J@;?i__$ub-F7pRu=i6StYYiWjU`5nM$a-a~`JHG>%gG_Tq6FlSrZ2t*LA2mbj(+-J{3@?4CxxS5NY}=ebW_0icSEx$ zX0fM)F|QyzDre%lFk2!Smv8nLF7oq(lUop}*i9W53No9L#Xo7Ou6cGY^a=N%OU^XX zu#`2i=~VHkOV+i#N(-rEZ#6=iwMCiejn(PY)*!^(7*!V5o6+Y}`Rcu{O`Fd#YJV zhx5#lPqR)PB$YSCawbiA+(jDtmrShWq&J(c4+d_>2zeDVBay;SgTnzZ{A>JdeH`(S z;~m0vqNo4a0o+rm`r_#Z>}y}hyF%E71y=u>!Wve0QFqHnk%q8QLwj@(w*!8ZrVUsz ziw4?@2WqINWY2=^9OQJ!1Fn;=eqoD?wQ%A*2?Jr=u-O%AHdfD9C6XE3^((&0;dKwc zp`095%i8z0m;kKw5KJ_+_Y9Yw5sLB8#u(v0QOB%<8rl*YC?dqqw6|M!aaXgyT!mZj zxe)ww|E@njhwFfd(Y!k8V`yO&Hl$cPqIQeW$ z?Oi_vX~xlOtoPqMBkyL8D@I=XS@8Ak#FR<~f7|Onjs&J-=wB+V;0HBUw^!Hd^SqAJ zOFT7eK~f?h-Ef`^XN}BC=bZODm(j5&haWm~)`o1KOdgoK&j+nwsfkAGYv)vh2j*+w z$tlm6h!^klV8yv!&)o_LGtcJHD)byW^F+@|_7l9O6z;x*oc+kPKGyFr+#?bg<6{}h zWRmd6=vHN0myPEoc9|v5ikDBQaAfQ|?PK>y9O2_GjsSaD>T1f*@M@{m#EEmru@viD zU2+Er9y?+z00V2-&O5OqRKh!r6e$kMmfiBWRpD)$i3={j zxBSjQ*U4QeQ}g4F4}Fd%KHQ6U{e9bClJCHx21{NjA1KyUYur*^2x54IZ^TZiWVxto zM*B}13|CzYax&IMr3OX?sB78^n+Ya;iBt@Zt|j!Z`S|mA`iymYO@8zUTNh)HrZmc) zC@VNgYbnBvZ6~PsB~pEJ^hsCu9^eTSj~gmaCx!?ly)W6Su(1R3F1c``$1<5g=rlii zY-PGhzhlqz(=Gl~KXdbnRCB*H`o-(_Sry`xjaNt2z3y*()WSdYKGtkIF7?4iH4fsg z8c{xFfi`cO$&!uA(sq_9O6tqgHj&kFqhv(D9uf@WJZm3kxzQ{A&Sn@bFC7<))r;iI z&^JEK+3qJQ$2_Mmn_3HR|%WPWI^~@G-dzMnsJ`Wo*5{X&Oq+MRy{90mJEunBFZM-W;)TD4UEo z2QE;z7bEi~;p2;0v%5xDm_&FiOc4w6d$61wVJ8cge8ZR%)*3cB+p*QmIV=2pYFDou z*o4*#ByP>_nkC0^d#_V>oY`G}x$J5A?uG(WKviuhcMinR#@5DlGCDeKeqrx~;?tcS z*TyZ-A=O+{BRh?`PNu&I&>xjsuY z8eXc7O|f+A>b(-GG0mC}lz>;5VyydLQN*&-1xj5rxbO7i_c+2K5l#%w-=SJ7-ZY(O zyF+tJLFUp+U0HRe;U&#EI;97k#!C?&n#rD0vZC)?s@8sg{ZX#jDBdl63W@`3>vJX- zg0&#B3AuK$jbp1lB4s;1dqv4yhGlObChHukoCArd4t7Z(;Y>PPre*F%Nw&6#j=3*F zx%*@W$ci1Zw%(_#qUxh%O(|!~xtmt!pIRENi=wV0L!zB9_p*Cb&A0PXbKWl3CpfHO z7wRc|?|o|GM~8g46=Y>AKT*rQ@kO=aohKetdp_~CG}`Aj)mr|Flblzu62*RSJ0%kxcsi`x#U=F`dZb!`uEuf^h0WwOOJ*UJx@}Ad_ zkzIXR1U?*)cHQ#fQgM|^JH==y@dv!7|M>&^C*|KO#r8`h1;%UajrN+wQB2i0i7je@ zJa>0;&;{YbH#%)thPy>8EFPsfe>!|wsO`sHh<>#19S89@iiF#W-Up*kDEaf-LN*tt zgF#>{-WEYto@6p#uY|*DbqWUu^6HUrQ&n1mEE9*+j=k|O#>jjxjy%zFUVH7f+k7G7 zVz)CiEDaJI=Q}Ihd?g)5N>-7wF;bqnMLI7BQ*!5U&c9~JSGA}DK!7IRPSntb*lC*aS#1M~K_cW#zs}ULMQeP_&B0f=) zi)$6jExp$Fic8?Vx>67=Rx$A23qXao6kwn{)IvVQwKC7Vv>v7I9{zgv{lIq3CCMr? zViERLnqci+Rd@(S$NA%IQZS@q2L%f$q^b=rWF;~v%?i6G7FmTAuNn)~LKE6G#-9?U z=H!bp5IQVv?hHn(GEeQ>iNXKuS^QIiS#@4-=?cmI=KAR*lk~w49e2~iA>NX-87Z5h zbv_~SMfC}i&r9j+wJ3OxdSazghXq@PA@US#vKh0PW6>dXji&Z2DZSHFudA@Zm3~Pf zLR%2ASSTYp#OZ92Ygh$=z=GD=I^ksEW=ckS_~oIeV0;j$g84 zw5GXw1)3Bd&>Lkhsn@?iyqn@wQ&Jdbx>%Uxt4iLB z-a7#l5h=2hmsw6-lxgG{F8LV|EPB#sl441Q=O(g>yS0H`K7^lyu%HZf=5g5#cQ2G7 zafy&Jhg3HG{FGv%0fJe z2?<@R2VEaup%!%;m&c3}1BzqCt1Gvv4G~OjStg|3i|h`nT{R;?Z4b%pIl9r&9AR}e zC^dvf`3E`9y(cY53&{DiPnBS_#6p&lMwxIB(4FshqYg1K!VpNf6Gz~B9O|7U3DN1b zE8i41kLPmBOZNw&*OqpppRD&ae-+#`-{L+kzp!O4+G_7?K-~5TzEQ{OCfV&lcF{c|E>nsmo)1$j8#DKD6=6g%yz0Lg7*yYlAi@q*Jsr^lV!sGBq)pC*@f6Y#a`)Xj^(SnzEuMgx`bgz@8p2|LuwmLUcS#m7*uz&N-cwX6N z%UCqsgC%4N8oc=!r)E>y+eXOrHo<$TMxSt$s?b^4RA}IMS zF(UVWiWS*?JA4)BWR=~2qH9i`6@^DI0GbWNQ@{!0@;Iykuw@vE zwbksUK*jy3azi!i5nJ^V3_8h#d$>#non+}opgMz2@`dCAgHF;|>)YnxKQ!V#)(vb{ z;rs*y&^qyWN(evIC^syOEWR4}GZVQ;B%ihS;r)c4TB<*IzvvL^6DgNhAPWv?tpKpp z7Mi7X=Pi4_@ql!!HV_TP+E{myw|(%YqDoc@$mLy1yU1kf_-F3uFAq%KEXsYV)sGvO z`^>4=k@EqYVZ5qvF5{<`wr&ZvDxNes%||8|DG!ZEYwa*DwDD&%rt2!S1GG`9hyRiMr5n;E;^mc(JEvu2wn3lIFx??efyyCH@dsl|8Ld(U+>V4 z99f`BWUP}&$_OVvtGsW6#&hn8`?3Dg4LrJFC!(`0ty~AMZzy)&L)T47);CS5J+gbR z2m6^*SE|q9Q;+l0b8QS}WDzUOl}Y!s8+H0WBZoh2n|u3chuTeZZWkIu&rY|*p*yo* z=XhKO=?o?z%NG%(#T+CFYlKKI8-6l0K2tWljo-9%(M^(REO~HGxIZDr$gmW}dVN@$ z(@8g$w;jZEJdhlW@4j_ySmc869`YUBE zD>mq1^W{quC^V_O@%i3EP&JE9TZscxd7~DXbJO=x(k zC!acPOp=-X^{=$;?Zh`ga*+^AIlNrC_1w?bc9ry;zP5{2|z+@684gfMe~C} zGJ`6ph0#mv`(Jz3qd-`x$IV9871QbjPB&aAC)(2l4b8z6uNyVgQiMERr@vir`t{3e zG>5)3(kvbtz01-^d|upx62Yw=wBUPW?C=<72-s}Xbp^`#OcyF z3&`2tVUk1zHnNJ`yE)XL%8?>$ng9Mf0MDPJ`dfk#E0gdnCGuRuhR3JDR-LB_ew|iQ z-bbD|{@cs`{_Utn(Y?I>GW8Ufl2Z-@>dN8)7<7{2ps#!=p?hs_DK8{Qr{>um#*{^S zvl3z_ja@>wqEQrGUTxUIIt#;_Uz)w5@MLJmqpzqP^+8k9+7Kzc38k|)U1r(|(4Q@s zl^zxr$)M=e{aKuRT|HU-@8$lp&;KshHtTYzUXp3+kdi~9FBZ)@=Of}_#pMgLb zenp*a0m*rm5r<^<&nC0NT!gO5_!o_O*Y^7v7F7n&Ov15667N5&$=Cc}j&1l2SM`s^ zxKG4!2?P1WU(O`xq4^D#GFjB8#q2WXanZR4FCRz@%k95(7+2J*|1@sN67lvi1T88;98Y4Dfef>*h1`H$zH)qJ`#V85sKF0D-iET9fBhh?w zaZJo+Q~H+8a7*-6ROQEUEqcm=q$GF?$b4e;@|58P8?Tk=eMo|7g}@yG0U;A@k|ms| z4~+tAyYdkahg+#CVCLv~t5<4wB=q=hO_CSit1Ocy&m21Z&}49u5Y=Vj!hKA0nm3NnZ~JV@_9vZxX!$XL z*?gnSSq0%}9*4rllygPZqCgn$fK2>8llm-UJLea}7T+#f zoUO^qXYBHIE;OtCF%~r(QZQu0!G$EW>R5@@+4YX*&=tN1Eg4`doj7W?`ZF$p6w9}k zD~4y~wwVqA5$BP5i3x7XIjdLByHB}~+Oe4x$_Mb;S1zlHl~e zEdTGBr~TlyMfn$b2AuK*T4Fp0)7KTmSR@G}*vdB}4t;8|>}VBQL$h+Q^6DoZyS8%0 zs+}vJsdD{~$1F?q2=9@)P{k)`;ZWXpDP0jGMTyKkca>9Evh=2u>X|Hl3j4@p7AHLA zxZ&1bMi{{?Cs{o=%YajX<&@AzB1?~>c2QuJ!8k^k9dd01oEktoR(o#BYsXUUQHkuS znc7DPfr&VX--lXf*$H!xv4<_DJOIoS1yy(o6g#(ht$bV!0>JtU6%2E!v`!w^Kf}{n z8%=L+FkE2~E_6)}5|AfszvMyyHJs(D$IfD5z*7vApy+J>JrPu^AFxC-6qqBmag)Dd z>Jp66rP*PT8_~bw{@yDL6QgN|)2%^?+A$%s=G4R{|=D=#lz>*TU{bkym0aAODwoa>uo%|;c453}qEB8uQQUp4y zgpCt@&gUjOS@3yJfgir(2MdYltIp>z=h$SY)@$wAvyaQX_3UAq*%pV*X;(RgJ$Jj~ z9;XwFF=07qefSzbiiw{Gq{o(H19CT|nb}jbAtsgDw1JwF-&^!=QvVBHZU08zQT8XJ zMzt#Re2dshlL7gVV|!uE8OO=MK)7Kj2#k>gWba+}{6@<%P-~Sv=6(oTNbgvY>S&Td zT}YcHaSbwH49RE%mY6&vO$J4f11(sze;%V1{9_@))qfu0hDP3x%hc;Vh{=3v!MOuw zgw~qhVO)CDxCqY5fxkm8ieJ5HAXt*8(+0uWOp-QBwdgQ=#Aj&-Qd~^kw*XAo%X>e{ z{xf~z>^ppJB;n_vvNNs zj^59Moi_rh*ZT^fE)1|l8xxA;(!2EX;IHwqSaNTOQn(socHHv!n)N=Z4|$L3k1eL0 z%hHWNUPm-}z2xXo!{Yq;hBi=-)ZLc7rD|O%>2NBoKf8ayg;$Xf)^&Uu4LmKC5Y4a} zD#>49c&CFq1e*T3$G%tUM8K_uDTkZWXRwt)@6+iYVR6276cPGrOlru?rEyv3bU|JVUSNACnxFSS081(6%{Yki#aAv zQV1!-7-}tasP4pruUG!X>%{uRE6b|_I@2n^ zG))9rt^ML7TA~ZE?~QAh`~Fb&i!@i-*b=7IL`_+f2n;ayfw)H z1AP~TMECD_i^iMI0rEE^M!3o;no8M&sMIg|icj+;gW{#DU3Q;1RYw}LR?CaV^Us1} zZhzJlOA26+6Ww;xB@Y3IyZEWrF%Q0%bmSZvl65*-FV=*lrOnLC*pYFY)X30TP|!%d z8b%NxhAY~pL`G7QuSyTJkHnDUT(Oxn2D}CT-!Ojv6Lz4Z7cmSBOz{zt1!iY(KslD% z)e6cfUC@s`Fv_kWX?QaOY7!EdJwgTQuww$`)W&+rLPW8V^?R8d7RlD?U<`z^+Nq)# zxCUyk2uSeAIAeC%eVPlj9iCjH>p<}>X7|#x9y;#16Y*{{tf%B+$nZ9)MX$|4pWk-B z0)J=%thBxvD2(BFnA3r)*L^&v#EP2lamBsES;bQsAgieUeN5iaxCm zy*2FKhpj0n)26TgAotvLJ9@IsviI*jJZtYQqZ77yo0j(t!%`y6*{8=9&h$$vH{D7} zL%GD1e3ue*v1~;TF7T!#Nc^B+(9QdGx1Dt8gYU+pBS-!>%tuF#924QUv2&~xG7@Gz z+OgGTWtgKwh?(UsLl-9Rp07h1NKtI2eQ;oC*x(C@ku6)N?Y0Hib`rQOk;WpHQmRC8*JVf~y zY~Q>jhsjV@HBl9MNdq2glv@tf>Ccp0+4L^yKuCvPlREN0j^g|oG<7A!omC#RM;2JE zV8@&otr&m>Lcm|F#RD%>{Ng^lj`*dRwRSv>I(G5Q7fqV7iN)iK(zg~vqfC^ zxzLeQknqLuyYZt_dP(72&1@^O*DVytH{1Y~8H`KCM%G*FxO|f!8yO~}VOaP)(Z~#o z2JDBc(Ib&OK@+RT@ECC!OoWf$GP$V5rj6_bGe+dPUS@$TY;Z>5t?tfO;O!*=1(6xq zdvQ2zQHDz`Ez%vEk-%`!DE$Hbj6G zQ)kJ*uL~4PhYJ77&ihx5*c`Z@-fM8 z@|L#D%wDYFBP(7TTaDOtTp^LfZtsoZb&|oLrd^h}t9B5D;#0BqYSl=6(+96Zpd@rB z8u}h#YZJuQ&a;`Lp_v&L9I4u?E1vkZttUXXvZ(TW^r%0YuOLV_;Eu7`3vAq(`s3q= zO~qY=%+>K4@l}{Z)_Qe}3%TT;1>a1Y%z(fXBqWXv15-Gcje|uevXz4P#dCTEWHw*6 zigc^R*1L_!x&dj0+7WTE;1R;R8N)eQV0o3AhP||mty(4!u=%l1eU(8k0Hw%hzrCb$ zYUOgo8*smJVDCcZq4^tf!NC9nU(dLNeqkKe_Ou+R*hVwGoPn%Mrtxw!Si;_828S9laZss-5?<8=`0uTX`UT z{DaEBB=6Pv4fl)rzxyPZkhQLywq82;Md25>_qz=a2PP#;JC?07cYdhWx8y%-tI?+^ z=-3B*5*mQ>UVc@d(_1MVqASglx{&6%2fxwZ`emz_xZFUX1&;svUkPH)lPTv&>Cvc3 z_1)~qloZ2rg5$&x*OGvVWHF4m88RczYbp2ZmP+SGyUJNguzp*jCPf7PnRfGy`J4ZI znh9sn6B>7ZS^aP*AlH;))j4uH&VA(bvw%*2KQkG1P*;w*8&I=wL|<$KuN@H+-h$qg zr>eKZBT)N}g^R`2fV=5Kdw{zath2GFeyZFhGl)9Ow~~N}SLXU6r>ktY-^-)m(DJ>6QrFmpkS5 z(y!!i*54Wpf(BC8k^qA_TYN6^*PT+%t5Ef?VTa2GJ!~16y$%Y09D!^z5uo{sELNgz z;XGw`GEzS1mka2q*a*&d)&rS!$s{EfwQy2zXGMlQ&r3B^1wy}Hmz^8EXT(SuY@39B z1{|w5B$mFC7j{=lU?Jao&Mg%E-bVOm=nz%aEJ?4nhGEsQHl!>U) zY;I!haZ@bkP8RL@^nM|$y;RkTx|5n#XN&QzQFQs|X1be-F`oYYy^62d~q?#9gksw05!Wc#O#imxPr zuTDiXEjf8wL{y37NdGR&}z2UcbuCjIO{i+Xpo?rer(s5gIYA;|i zx!z}b*K={b7+T1eZYru>-_^yctQM;nA|`YaW03sBAv~clhqoyQ;Em?L%vIhBsX`Fs zE$q5nCWQ;FX|Ge{xu08ilnHI30wB=>b9cI#xWYz)JT!S>up%cSWiYc(tB_`MqFhNGuZExgWNNf=xScC2* z!Z#x(Q0f^R`iN^@&G$xqq)2=J{`>Vh@)p8qM3$rXGi0(-VA$wucUnxMsyQloK&LS( zL=Y673p#iiC(%?8zF8G3xZ{e|{G2U|uAaT2=ae{7PT`~`{b#TX%9&1%HlFI{jpo@-Ub5?mKwn;Axkwsm&dXx0{6v{)KY>@Yp6)1@7wA6GZ) zWnv&%H*?FqZL~y5wo^%A9WZciTQJQA%QvLLFo;~3Eh>^38KD1SaPxY(rTp%7tvyav z!o-&A-eB1VgR2U0zxBCHaznE*+k4rykEpY9VOd7TuUfLP^nQc zOjiI=9GClQX{7xA;6Q^;C2!4A^uoR2m;GZPX%f@5s2G!%>LjeT#mRt5I7tqm_Py{Q zQtZBOSJrfP`EM*lx1L8H%58ZbmSw|&0)996!LMYYWW#UhbK&2jC+av890o$nRX)hO z<(o>672Xr0pH1X95$h57S;{my2BiQ8?D9o$)M)y>?cQ5YqR+}ff3-8L7U2G-{FL1#dht!6c3;1^pP zU8!+uoTTp9irkYeE7w_h;LpblklV@TaY)Ug86T%KxxBGH1J~TDk2HSJx&hFT+lzo7 zPIN=l;-=Y|*%MM-KEx?^KE(8-#>KkQ-8+{gLtcG6>*~rh?eg9O@zTS`ATLg82!%sB z(hS&jTa$w>0;{@#NDw~;GEOfC@f!%kixl>rhz&6v$}P^my`MLpkhtDyHpH|qt`vmn zr>D2Z_zm&cD%k0S2=-PCiBfq5HbM<@rp(v{`)!bGs)|L+y9eO}5BH~E3}T0b<7TY` z;UB`{%^s}~CZrN)EfGADTS0KbU7|{UHTR`Tp#@OHlnGTWMmj@JsPXQ{9S^C5PN|tu zteuRvD{_srr3WbMhLsn=*FRPw?=NyU@c5thxA2ayiXpsZfM&_-aOe&&lgefE5_{Ex z6s@jUw}+KttnoeUHj9Oibb6vnF){DdXI)K*Wd_wt7*EU_=m0mXO1NHbMVtj%0a{*Y z(7VP=bRt0b#1kDvZDoZniwelfaelmrAJ?rZVN!_+$=1_#uJ|o#*`8IEpp$lrq+4WU zBES+eoQ%mX{ADuXvLQbRh%$d&is)kS-y}H1$W6McN9wd+#*{b@xi;4t8Ouuz-&*~G z-^?P)=oNCmIn#4%t?K__@4e%i%=W!e?4qKA0@9_|fb=3o0f8h0B%w$GICPQ_dXXS9 zjvzH4EkI~e0wgr)T}J5yq=jA_>0Rm4^v0Qe_RN0I+2`!fx#!;Zy`Rs0{t6Edt7WmC zwSK>Ep+rn3h*nPm3n1g%?+x|{%YeaEj`3ByYQsXTvxnOggPqJ_=ajdVZtkZ%9S{nS zON1T!JxuB!V@>LY0G&>2ZuXkOrc?zlI6IshR|+y9dutb6>z63k_c~OAeumr`*jirc zPtT^-yqw{XHfLqgtatK?bZWiCbsEq_8@>E(2Tj`O)zL<8o;G?_280Pdt#qkK>A5y@ zmC}-smkI`jDlw^I$?OxKy4JdT?ZSgp=84|Q2%N)Rn)k=p9b&6B=|eRb;lj=!f=H&jrKChy>eOB&2+#3)9@O*BcWA@B ztl&*XjB&kKToOWJhd7bp#X78}+$Et*aXMpac$_f34n&Z?;0Q&tj5x-l-r z^)xOgfFX0x^{_SoZGJ$esZx`zztd5iE4RozUsRm_VN;|t{qqHA3Fw7oPEVHcn4&e6 zzm`SIF56%)6-azQqEXY>b|o{Fxh&pf>E<=toHcf~kpK1 zC!?NY>x)cSwe%QYOoSg7xV?CeWaRaag1$xV@OSa_Oa7pT&exJwaYnOvbBJX%q8E7@f_5IL|nNG?+# zfGLh|$x?+SQDTcip0A*2$a@uSuzisyVYB%VH1)UhZ>h<$kK)H!t5n0zY9AF=pcKa8 zodO^zQ=AMyzE6?{k1g;?9wX)-l>~Eg`AsLJ2E(fha3dQxqR6Ra?-8@So7vX!W&Na@ zvJ}@=3_Z{(c0=~Ftn3f0>W+w{qNvntW!Ww-U`3agZ}u#qG37xn{1GY-Gd8>qNKhD(_c@#=ib1KB zqC&|4Bq^UZ*<_89lUJ-8OH^^oF14PV?ITS4*x*LR5FAJO9Hzdda5BxS&}J;7~ugU6j)viPp2IX-K4Xeu&a?X5k?;((zI+Ud~j z0`hK^8=lKKaFWY|NH}U>eOGSF!xJLUSAs@@nCco<3`)6k;Q|ZrD!}q=|(iC;FX#1UO zgVEV*>7YSfv;04I6Q>X)EA_lNv2$T7zOqAICI)%qwc{TC9B=x|9X@gdI*(Yk=1JA; zd)0Xi(cE`kh{^;@6%zwZ)7&hX>R~-Td3I==Q4Bg0oq4hNGPaUs?lsIs1W-4LDpYVN zOVkTPYUK;&#A`cfV?`?ax+}MmXlQw1xu1VuUjA&vAD_-h)u_D{%@D9Zkx}}zu92r+ z!c*lH@$gH-B_XHd=)B{?%BHAyTng&0KZqxV*prdc9z2(q+u);uxz%z3xZm(**^qzp z^YhhA5iIFMl}UwEOdRHbamqb`QT5Zt{g{=KZn%qMPHek*MI0NBu(YK1o=fb-4es_9 zbIIS{q_-QBgN3f-zxwTi55m)w5^M34C{rQYTJvF7BoV!6mw4+%u8v|hOffF_7LDU4Git0m;h96*FS3)ak zvP3k8lR-o6UZe*BnPWKiq$}BOYQJapQnr|O#0H6-1jqvlgswVpNCN>&@Fk?Rn3}hm z{_!ssm9akhWz(@f_CwDuuVGurje-+fTMo@7BjK~8Q5-GcB$sT_Qa5wWQK=2ZV}#>@g9;d=6$^)Y65A z-tx6ABBDW-t~Q-wgGNGFh{TZeI8v_MjBBi!i^aPJ-H z86Uwk*~$I#P_-E;KeD^m>RYDlB4&}KfJb-`R@U`@9TBA17mqf1HqOII?FBl81Ckd@ zmv_df)uS?UaY!7OMBR(cFrZ&$Y-}ZCq7UvsvP|eW(VSCZn5krRL`@ga)3C~>{tX*H zb)IA7a^G@H*01ZFBkcBfvX~I^A_K(yzDkL4=Stvp3t~zm-{bU$*bcVn=LL@r$Sj%KKHpst=El-V zT;|;8%Yx5xR_MsH5Eq*O&Y&+ zs%%9_J-{&ET8j;PVXofXP>lc$2dNCV#+qc_ibLiM^uV}s;<(Koef;v4H2m)PtZhh%#LA(oMVaO5LH&cV_~ zmORPKt7$?{jdYy2sHei3Gxm(wb;x#ax%(leL^uO zA-9gD4*l_U_{Q&R$A1cJr=v41Q;TiWDo3$oS6)DFbk1uqq4fkM1#&I5`agmUvv60d z#w(VKr{n<-BIl!a2J)ph8X6y1*Z5j7l1+p%E8=3;!*ects%uoW7a%rqQ5iEVb6*Tv zDsmGtVvmG1e5LB&C6+Bp2@3~_PaLVuX^a>JQqTS&Id8z~RAjrd@t|T!hUCq8>Y38& zZr2b*s3lxFhmZ)36D?D7jM)%S{ly5GDH0jlT_HRDtjD8{qGIqZZmD{#ywd(luz#Rq zL&)KZ)Zx$V^ogw+8Z&P7TJM?HPtvz|R`Z)yPW_>Q{=fUCHiNBN_iIaqlLWK(%IDQk zE9=j49?0g1%=S3QRnpN-lcLWw^eW%N( z`78WTb8nFB`)jA&lApr1zj6Mbc(WhgW-=M!VCxU%H)0LT9)$`J}AX_6n*{&Z9qFW`}Jn$ za%N(|1AvH@wnMqV27J<#8e1V{9LMP(+rKg9e5~qa)%sT~#s7qU3r*&Lr>in_@2Y;a z3`5%tAACzxRs=?l%74|W0FHjM=B-|?c6~5~OJ{o%__RzGFsHo!re0sJy@0a*$f6Vv zC>4)4-%Lq9Uvf#`H?FqY{8ezK{YGr)jtr0btfN`)0LhO)qvGD&(r>$R;samof4?C% zcSCy6UUGjuFnpNCl^G#l*C^3FK?Qbu43uFr&m8Uq4(A;=gShkWeQV^|rTMzu83_6N zGjf?LLDyFMzth1pwi!hJPkmgZhTTixr%9jSZfh|}o*qBHTWH4-hgR|UV^*mmw1zwa z&1zEW3QH>(DORypxO}dl%$|bDef2nvCb_}6plt6IlMGl2e<#tEuT}SX@e?StXWmVc zc#b3?ns}AN$hO(O8Dj@Bl$Q3(p&3LL3%@>mGFuzecBr1)eEB82X}b8E(*+491+F}y zVm!K!XzDTlk(378?$~-K4R=v9qOlYyuUaW(`iso#|8*bt$IsU^79KC!HkTYv9m|&v z@(4XHXYJwsnRDVle)@kzR){t&=bf}dVJ^Jlnh_6ZY-2Y6m-j@r@2FqR@AC21x-wd3 z_cj|*qUO>JpETMh#A8+*54zETlFRjXl>(xlT<(6RaZrAFtvOI~VQtNy`wMH*ap1NC z>)6Y0mOW#mduqQ)Nq_xLx6mzB&Tw3xQeL{||ErblCJoh+^w@#pz*o`Hc69&ehW6R- zbSZbU?ZGO{1*S3V`ulLN4_+kSLFZQV zCo9#StN$YKf`1Y{=#u7jiWg<&gWCtG%*S~StWsyZ^?mA`EA$+b(iDZUS17dOG2m&= zX}f>dzzd&a*6ETLbSD(Y#ax;LgV4vomt>i zieGYu{icIbb?PDF&5;7}3gcjHqJSk$WG^)I!kvFt{6F5fNUyk_e04h_YTn`%I}HJ# zyh%cNg=>|D4(qJIrjbLHyWi>Re&R3ZI$h*#!!a}RT6^6@rL`LNoIc9Ns3%~wn76{^ zhkjH119D_&<%*rwqbUiJU-Q+6V#CF}rR&&Z0}3pA!mH!PqXogIdE?>ZoH}!CM7XFB zJf}O_;H4d#B_?N{Y2SMm{m7V}6|!gp)|-e5JWg#h5ogz8 znyr+SCAlZQO5}hWLZSMV{4{d^Ps)Gk(K9xt&;c636L2NEi;flxV|3C!v-9Kk=is$o z#-i0HC8#&uv?yg;ej_g$gli$In9DiKs9lUsD)Q#v0LZZzz;hdhV{ZPX$iIC&HLqIx zO6eEUCi=|TnZoC%Cv%1*dQEs@Bww{mzh7408$Rz4~ZEtec4-7$P&;R!n4!cYC5+od#RE?;!2MrOewy|jy*xF zRQ48yIGFEl3ybX*`WSG)xW5kE##NF4N=Wx1cCc}5W8eCh)fT*W$$W~#Py?~MZk_V> zM(jM5)j=;OH&`l`HnH=(1k~THfq<oh3#Bsa-%w6s&TaLZ+#o}$V5iZ(^ z%Eh*KYM0!4)-`TYb>d@~Dh*+>{Db${NFO=D14?OGZp)V4@na0eYc$V-LanOos%!!V zs0HJ;cWAW042M}%02m5i#meDx&vaK=mc%c9DMn~o7STMz+Nj_qC6`rx}``Z zy?i7MSWm(YdWDY?9?n_?k^i>vEcrN5Z%3 z1Mrot2K(fd;;c?&f#H`lT*D`X6+U{m*=G-8{pl`;-}|aY0MF{n^)>W0`q7CG%$3Vd z-{~wAU2PvdF=(51D=Go&9)7C#XK#M*qp%%}!NN607$!!Cxo?zKr;4Ko`oGnO@|mz#Ts`o_viZ z$WFJ3#2uWQvyTD$6)}(XLYKVRQ@t_`T0*y%1b@hw-_H-->D!^cw5jufpiDX)9!iS# zR7?_zBqc^-``LKKX=w@VSQ_4QNH;gvF)zNg9Gqp~F88N7+Q0t?`*BCrj1cpr={Rfn z>}8e!^$g?WpOm^B4Z}$QZPyed=;R#HNs&3r3+Tc(nI%gN?YMAX^{4q%&j?R7mAx3f zn$H&I@L-)6#`ryh66 z1F3f}%@;vG&O!19gg}uS)B@Y0vPxdKNMy7YpW2nk;M5fwHLF%qo2E~qf=F$jdv85r zmdP?tI_rRC)m(XYj~sLTM~VL;mqAwamim<_-mJ~jzGs#b*(dLMks5xPC!JqOUD%c% zu{6si_}%^0Ve^SdX4|icczW?YkF04$#z{%4Ka+CI$Xl6Opw9Zu$7`+B?xtHOzp|jW zgTGeG_k%kWo`Gv63hL7CyNr9}frO01+?cQg3uH@1bcu0cyiS}z1`OnNRXijZ8}MwZ zU5-APZz*3nx>!h3CV$wDoGp{Jik_mlx8FqEnB$`bqWSvjyWeNG?h@%KUB7nV;O1IG zDgp_2rYJvUl9)(qg~vYWQ8^^AW-OY|NMJyl7+Z~|Jc2!W^l4(mq$wq5PF!axdwk6F zb=U28HO9z7P9NjLBUqO?Nqe*AKmup?OhxfYi=6|9mBgp6f+!bI04gs{>L~r(C3X@O ztGYbbEyTY*9_8;G3xb6KlbI$Z(?yrbP&>A_@K2jZ=$DR#1-Yg=lycF8CNsX?ylxQs zVVV$C&$}3fM}t)IY=EHtK^X%g>6~In%K6p$ujChr1|f0q*NCc^!JJ{&1xVP?rSM%q zC{lOkb&7v&#Tq|S#{p$E|FYiI&0nYbi^=|rl*WZdmV<&OGwkbpCt*I)bT63+H!c!U zo(PjUw%w;gesP;thOoy#O2&Lnd>}$8>;xG3CZ5}mDl^6_>@#}y+SO{|)fefIhQYD7zeMbw!S2h2JdadcNblLX z`8c0rq&7$OiuGr?J=fP+C-qd!6GA1f7A_PsRbwW^TqKU-l^WpGMEGR|;)(?AEU`2> zCWjtLoB{H0uBrdiu4j^9Qm^TACG1gUHSog5Z`InYO%y%$yYHGKoJ zdETnCCcv`J(|Z>y%bo6(Z(J8Y;E+xYP>8ALiUkR%0A&rO->Z33DNtaJOkMAme}CTS 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ì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 b()}BI=jO22%gLt>|BbKyC%$s}`^5hT4wa}T diff --git a/docs/images/treeval_selfcomp_workflow.jpeg b/docs/images/treeval_selfcomp_workflow.jpeg deleted file mode 100755 index 47593de4d5ffc4999831aa82220e27b1c41a1244..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80497 zcmd43cU)83wl5y6fFd2FOK%1w5PDI10-=N+nsfpL3`Hr5ZUyNAA@n9CK&S!<9odTX zB7^`^-Sm#qRFLvx?|aWa_uRYB@4fSR_jBKyf2=jvoNJCT)?9PUF~@g~waz}B{RW_e zYD2UE6zAzS#ccrKYzm+OxOn0B^!xGRdAfAv((j4#%9YDks3@tasVJ$asISvrr@nUM z8Wj}{Jgx=Q40Md=dAi?;Q2gHV;w8%ShIH4cuAP_ui|OoF06pa;KZ??e z6!d@#^b{BADb79sxBwJ@3m1PE7x1@q|UcO8P zptx}H(&Z~x=@}?_8JR3nm|6LxmnD@TB)b!Wv5@g+uPxC0s_eJ_#km%QqC!ZN%_)4k^TLVm*v{WIp};x4?`>0 zTW_xm;=K8sGn}rykdPscWMcZf1`|b>4*YSNyT-#T<20T?22DF7JNYv}WVtXl5pEWd zu$Js53T)Z0qi?Mz_37l#>ghqv>mvJO3ZXC|S50l#i&uK)GXc&z*p33s+Aeui42Iqd zNL>(;xw-A{qq>`;PKCwU|I~nFJkIAgyu+5l!*Ekt*v1zq&MIWQPJGBjz-j_v6(@zR zIH?wlVPRzK0E|5{GCubfd(gDq*U$Q4Tj~YawPA!S;iP5WKAyLp+D{-UK!rV1Fw=dF zzHwe6vYy_De5rtMg;Ou8r&LChZfL-WMGo`1nJWg zZ_+kQR53!kX2BWVOpb)c)bK0}>}noE+P#rcL+NPT=6p0`R>gqfXWq z>UG{SuawN$kxdU*O;48(xDPn(q{#vZ13~5bK7}DVqJtdDll6LHtW`TUrm0p)dY8KT zg7waQl8wngsbdojjjI8;=mTDF2pdA%Ll%tR@p}%WhE;H%0s3T|%{B;u%#1dc449Fq zgkF}^fz~op*YO4{w#69vdz=B@z0P!e zS8sm^Gmp%OZRn2G0tMycMt}vw0ys9=IEGvW3`0)vv+lXK5$a8T*_nP_xhZ01&Dx)B zRZWQ3448$I^gZ*?)WzKhBNDj~IAausYbSRfOzMHCcZWI~sds*}mz-j$xKVUq7Q}nl zq35eAl2FAU{*6~UZ6uLG+u$0A`*~H z4b=m<*K6B&N~HFN_w6`Qb=CpFC3XhadvU+KSu)2Rb6IeSeJtpH5ok*Euc(JrI&$&-;jT19Fyt4YC4F-1WH0rGQ%ojQ2LUZ5|Bbc_42 zbfVnFfPJcbp7W|%waEU|u8P&90J}Ozx>Z=1Xl;%WeAs)rE;fNs5}PRvlEDc%w7p~I zFwaf|(b6$ZOxUe`1?I1N1hC_3Z=_QfPEl&$9Tn+dzzJO;nwrrXK0Xkbo*hh6^rX2@ z;@({GEhFIi2i;`OWM~??NPCJ;8u=8NiN9BpbR-nKQS|bz_~Yqqy_P*yw`vhtGmjXt zJPnv?68Gm?2l=J$$qYX98c~OBjp5^}uP`M+AWz6Zp#E}SyB%8b3QcWA@GIe7xX=*Z z%ftnkX?svll6lTAP|_bu(#m7yHMR{cPak#-HA)QO>OC0=`PsP{+%6m6%OL60Xy4@X zG|(&f9pUe_?M`Df1-oG}pSCTwGe6IAaKAzEU%l{#! zql)gQ^%3KW}(iUJMO(^<1RKj`l& z$X@(QT9rN0&a_H>S7-mcnEYqZ^YIvA#f?<$5y*_hou2*?jezmo4%Fk+Bc%zmP# zsDB1{uyR(jJU_xHka#$qafV(IY@CE`z6bFoIHTL*u zAGdt4*8>ZOPw6fCS^kaXe>h(#nRgp5H1yc2daTK6fUFm+Uz};QJ=^Stmt+sn8TC*p=uilUf8{|*PyjWt4+0X!^&yB?T1*GU|fSAF;9&tJ=Yp( zHt|_8D=9y7+78Ef>HYP${x^bzt)X~!^*zq9|HA0Jpj1A6AIUh`?D?7g@<;}%$1~FC zA8xzY>D-N7^&t!QcqqG9;8$`2G_kUidS;^9k0T?`?fB_^X3ob44{TiKt}!y1dN7%- zqf5=8FHGk%;`F1&tU&15I88)iLrQ;lcaI`>!A$&dsCDPKFy^F|OIW8qt~~eCzQkU^ zZ`Zy~XFDi;Q;iGg%kjO8_crs6uH=p*mwe656)tEr!tKLkJ?%)V3OP|KlrC*u&gJ_3 zbxJ6pqNc2>Y|T@rq2|H(XL9Yn0WW<%9dZ9z!p)IX&hbq(;!ieLUoLK3If>6(@D%>0 za;;_c2gO{Y;=4Ad)xgP~lX&$nimHG>Z-Y1gb42oKGi+LG?G*3}rQ1SL++Zy)c{sf< zubvA`If8QJ@cGb3hhp2uy;5dp0IrnU$~S!vrys^KnuBt5qubF=4jCc(HP2CX!@hZ< z>be9zK9S?d7_xA??}7J8e8HE_F~iMZ)}Z097tedz)D6SkDwd_v1%rB=OayQ1?eEltlD%}*YU{~;otl{R|`Kt10wf3pYs z-Z-7G<3km$-f+o$WG&)b>b?Gb$f^eLR7ud$)unn0i6rq>|M@T!Z_i(|^j|%m%hX|q zq>cXu{HR7OrM$N}I^HmC|E0hPuA6T4bgC)F7$+ecH>Hnp4W|D(Faf$Bhw7PP zbuY3aDOAueJ^D9YFyquel8M@~C4Px~zBVAcNc0X-|g!pm^E%!^Z;MoY5(} zACVGSBi?#8>d*dU^?Qc-Gu>>s#2H|9>FK)eTFkOe6X-Fhod+NKn1X7MJG|-);IiK4 z{6O12)dy*(_DW^)2EXr;$qg&h-YwBm6A81jA@^5io2eYIv|HUh_Os|VJ->c zgTCYeVJj(6wd$};+bAv!DZ3%xgA$~waJ_!w;NX@1bQT+Oz5uH-@GbVT5b3VkVQTb{^vY?r8iY~WV#SkumO(gJkbx7Kn`8^nh^@{UUajuu^4(!8ar<6dpU~evdsiHu9q_WlTc3g0O)8 zN2_>3F_15bo{JZ7JK}@ORwl?>wF|6_h89@Dky07H^_tldrY}+rJ)m(=S0`OyDI$^p z@f{h{cI)#2?ji^yx+7VJhL2#e0XP&Yu=a~GF_qu`;pv4p__46*aL}090HTcC)F+d6 zop)acT+eo;ID3s-j!HxhgA`czu#mFoc~a70D@zy)1`&$-7weil3%Khu_f&B46%Qp^ z%yc3!mCePASoR>Z@9=3W+)}b;mRFX4{=PomHC!NDau_6`9i&iWUQM*`kS;E6cH#me zNr9T4r->o;Q8qme)24Gd z^&aV51Lf4)UyHH=ic3SU!HWAwx1=9q%XL&kv(5l`;KV$ESiIJEdOTUC6IFgN|2`&r z`^fBt5y4}e%_ysoQ~--Hcc3mS%}Qm5&jc~pjH(E0LcIEk!&7KC{RZT}R5-h6~&LuF|ulsC4P(dRk#QzI}abNhlIB zZZ*c`MIf+*Ugz|ndKu$86BzS+(5R-%vXoq33bBeZMt^O!bfL@BI(Cg7&#$(`0Z&fb zni@;==xIhLXOz`&9w|DPrb~&%i=yOslgkQUweApQkIdK;D&YAeMqjEdTdZN8>_=Rq zC~(GZ`tT#CqvO8H_PXup82x&&YTXExeNd7RX`wvNLm)9dT_8@UsK~9jyemItvK$dw z$r_ibua1dIXh`#mvUt;X@YvZukSzb*x`tl8gelo%I%hMqJehOko~o|<$3mGca$omI z!d}PTqnXb%GUM2T?~gup%xvwPtIUI^pt!vbm0V1P51=Z3W# z=VB+`77jpd?X?F-WN?=}RCFU783p&ucP!HuRD^$u+L)L3Z?sPxxz5OarmqHRWk;gc zE9JcFP3t_sldak)hLA)W^x_+mF;}5JbVwUc`7wBWK)Ao99rd_6u#4TZsHOO)i)Xy6 zkK$U@$v$+u?C59vC+(%SU2L;&wQYe;(5E<~*Saz6)_s%Hx*w*h6z3WiHZ&fm_K#us z#y>u6t#-<^kL}VlC-wwZ1o79IKW^pvwZ3ELF+z&F4c%0_BTi7f2fVH%!DqT*d*cB3 zgt1&Sf=b&%g(aAN?RAE0eSjxIjmfiI>{HpSmZ!3?PR^~KAkty!J-nLu&6yN4U+iLv z=UBmZ;TmHdCNo|zH5Z<9FLAB0HD+3;ktU(v3S<{BC#7b2Bqu0pITCAFDm!}8vC;V6 zfJr=pmMLwlfEDub5N!I%-Pfr)Dm#a694;GYO&rnS8`7Q)-D@6G@a%m`^m6z#weZmZ zeInQRC2}g0$=+0q=0c2Ki80=oe_Zkq1K(bE5j^Z~M|R4VVDzRNCD|n5Li6SODSlU9Dn_rg}E^iYTJtI`*(xH8j6+5yq4Hylk+MdwLVflCD)+TGsMF-`WkJ1hwD-oV6N z(VT}-^BJ=h4@yhS<~|4Sd#hwWWm;W9Dl05fS43s95q7dAxz)R6$sSMm`r=F+P=Q)p za(Y0LdlSK>LLA9qWree4!)v?c#ozvoF!ocbsJid;xBW+>F&0+ikmWZI4syjtn~@(o zetSRghN+H~-RvDS9lAE5J)lo`MY2Jd7Z%1wo;bTLbD=F2yhdzd!#{ zdRrLQ?#Xi9qt>v*4&3x1xZsh#HpJM~5WOfe0f%Wiho|5w3#7g`98?arxNVGChkg-C zBJRiMv4(Ak?R{i(;&bIh-fg&L125^V&&>)`B@jBmMLfW!_0KET2Z#Iol$)b(tv?HR zR%SeTbvoLGAO(5;tb6o|uSM$AtiD#8fw-3ZP^1oRxd#N3m3iJ~Osxfj@)`>9`Dh$N z5^(@8BhnYFJ;jUObE8|ihrHBk*eadFpXO1bU*Ii1T)d99X0ZHIyK3hIh?_>cY+o3^IJTJRI zy(ogENYQ|@V#7mc%r&$-w$=lNQqzt6N#K-uknUnB8^BPFk?LT9{WQdz76!_>9RtOHFVn?#X0)$#KdoxPi%SWn+HlzDTHu+NZ5q1-srMI zWFmqKR`MhFLFB~ZtccKWi3jNIt>Mc(Nj`cV#)8%jb)&tX=5d!%`uPU31u*?ZmBp5v z2HT4jD1LtRC~9a@1GWOfp8_Esngi{Bmf`rs2mO=v4n;mQ>)SehVx?ip@%IQtn0-2E z>40btT$#1@?YV<^+HGAFuAH>%zdRqM3e`o=RLE4grHnQCzf$H3IqE1H9x)8EsSmwC z5DAnNaN1OGA|aVMnx^o-LhfMe8f#`EH}o^Vl=WI|`@#B**BZ_MfnU79u@5WdR~Qy- zYUL`blyOTh#jPq+^@+EY`Y45B42s~NihIk2mSaRkOz7({QDMTtQJ(51c|5?Q+_ZM4 z#mMN%rchVi!v4v+6Z)Ij{@olgXP1aKWg_)UQ^w^7O1l}N4O1|3&g13H5fel0?N-(` zk8JR=!UvZxb>9M!#cFn*<2(V?#4g*Q;M@8*N1I0m&=2)MZfS$NgtEQjQI>jmvTPrr zM`{Skzg)1!b`9WDvX26J4aAsp@t}P+1C!v7c40d!?z@s)6@*=KUkPeDMPC>o{FmBexcU z?%;-y(j@w${Lw-D{_JjQxz+;qL{Vz%x=E0k^Z+qAFfLQ}qHlMx>4NG~w+{h= z!U-ud81PCYDv??s58^IqV#u8qT*U(RZf-emaaERGGLz%Q`A>Mbr?+;jl*Glv?S<{T zs)36tBf^CW734zI!p#$)q8wdF%Vf@r$`9YCp2B2KjO)3^y2kD2F2uY)@#7r@wGLn< zHlDvc)yg^$e@71L=eT;;At|2f#x^Pxkx-m%EU1fgdN8K6^|A|53tz7*iNAUqU{-B_Nv7w0T@#*aS@%<8f!_OU$ z_YH_yljA96AA&gnbY64JQJ*qa!bMv*yPp?j85CJ#aP({*Hhqal5x36(5`zt)&cb&B zo!>EiGF}_n>AzIXTnHkW?)8Dx&)q08F1=)*Z`su~wED23IpE1aTF9w^yiRTJqhs&$ ztpeAX%v#Edcc|L-tqz}A7MtE$^8j-k%M1J0%?dqI`~k`P#zmbPeP9{F+aeAGhe|2R zH3Y1kpZ{<{^IPTQ_Ye2{mot44^ZyBJs{HYCU-Z!#Ku7!x z0N2sC2dNAv&86Ht(cAlt(%`{9@aa!Uv!DFWLC4J@(4AxScILIae;CaFe7L}vrE<;w zv~M)D`?uIOiCI$1Q_hg0_d|eiR~JF~-li97qGOpZH3tP$BcTn*3mmKs5C^qyMD`i*E)-Yi)RrR#5+>4$ee` z?Nhl!>q;gAu7so1j91iFX3URn^*j+( zVJKd}hx3Zdta`}EJ9~_)L)hq_cs*U5=hy3E9c*(*&-T3isv_g3MB(>zHGuz)@)JR& z@Fs%A7B2G(2m3t1s*A~e&_WcnR`SGx&ol+QC+3yntnbG+Q<>WUI|KBEz2%r?y{ z@&kN=>pVA`l4hNcDeQ#f3yUAro0Pe}?Zc}q8~#em*hPZ9pE3B8ld>TXMDALE;@_G8 z&N&NA1IgxxZsr3|QsE)}xzD7}MNQdeSr70Up9m0c>G?r1 zA9w_5u*Q$p+Pjc*_Jn`C8nv({H0NFXXA|!84$2H~%C-i7vxR&Cg#rR|R59NFGbAdQ ze={Tx|0QQ%DtI_>5QD+^`6Dsj8At>iLOn4W+BXF?%CF} zf4(`3^JfwLi#KJl%Ocyu+ToqHeK$gTlAhs}mQU&^X2hd*C+-rgc2Z3~uLUsD%E!O{X-3pR3CM zQs4hkZ%1s$<0>4C1Z?H9A98Ug(hV8*r_Avd4R{I&o2bc_!gbq%o)tDUiX6HzjeSi~ zD;Zg@A8_TQ{y@zOL#8gOYj$FbG2VDl0S2R5G8wTo)VQj?({Dc6>%%Bjs7QZJBg}P@ zl+O>6<{wWF>Q>La%RhFi@usr3)!;L+3M%M`)3Vnwj=B z@bgP501}@4gRp-I_Wn!g^bLl78%;MQX*rwyYgOVp9sYr!bgk0q4c&Fq401rw*gl!p zpss=v>x>x|@_=MKOiweY>VKClrfh22ki;=Nw$H9I>X2V6Ixf2P@#V<6X{~7;t@&(7 z5)i{kVz?fQEj&%2c9V43j0<_tm9yh*iho}=zJq(GTa=BEk?H&z_DD=rXvW%ICCX}_ zT7^MV6Uql7$M#Do)OTtpeh3g}vS#&U()Hb;GIfM}RkkwFEb*A9=l2~Z-A>9k%m-s= z4P5$veS8ME(xNw}O&_|};FCOh4ratAx8oWq2x8Zkct;Y}y7^~!T5y60k(TV1mgS4Z zl7Wvds}GgECwi*^%(-69spAi1pzE*J78{2e7aNOD%zW?gmjS9Yv)5c6g#&hOrz+BP`N*oWvQBP1j$4(F33cxQq zAIfe~PaaLG{b+X$W`FnhYKK}Cn)^H1an0&=Z|mYu?@Z*pd=og>Ig@8?Z>@6%xasv# z!&2GJ$$O}xs-oZw5G(7JSI#Y6UGHu_J~n&?=;V+d8lz?VG(`~i+;BewEYPH{dR{LL zIB+&w;-eAT$s54Tt-f?3TcJHvz(bg1wp>27O&TE@hnAb?(Bfaaf`4t90LY@*lmJEj z)qra?aV%O=l)j#ZhRAEt;YgxE;bp`vay(kmMt^CFtk1-Jp>cRw+Zi1^bOg7&<#wwi$bB@RLU;I%v+oz?7vVHV~{tmKq zLe`kfF61P>j1D2(I|IyuD3T@S>wgoXUa>&#B$)3cjonrW=rFeXSFhaMD>8zng#!*Hkv=%n@CFD< zWW=_!K!uX9Qk8Z^bUJ0--NjF=%|J{sLpb`iZ{~XE#9=CFqZYYtb1;%d3w`o1$~@@P zerZ2jWtWC`Q{*n)eCF@d1r{O=5@gUPxvdQC?*RrWeqm`<&o)Yggd=|8^VcA0niuAI z*96nA66n`+poUqkE_=_)?yS%=9j6_f0p`}d#67@C4|Rznd|Fy!nnd0Zy15L@bM=%8 z%EZ#fbb7XDM1k>=2kXWnq>Ve4C5D1x0y+Y`lDYyZrLseAjlrzaL-BWSZZreU$Kj~H z3~aJ728tInvE~oc)^_&sJDy;pUu!nJLu)zC)e6$rMT?VH77b%f90}8fqCQM5u$`k|7EKf`Ik<-&dRkeX70u%4|e=lcWm%VMuL1M-T`rg<=C(!0Ze?=nn+8P z0a^zAaZd*t z?pLXOMx&I7yP;LyJ?PRG0-E_&eBu}gG!|n_pC}Lyql`%uh!hVw16(4z?4-XEeV8Sl zKU=re;yVM%en3K438n2_%ScHa!Be}FQ5o=}X+Z|kTw*F#`@*k&&#hsW@a+$00N{os zxvDf19DUFuMNknlC7f?aSzkjkz#tYt{l4IM6KM*$i1saz1PbSxYy;;EO-1sJh@ra- zwKtH6m^r~J>3LP^tr6z5V*U7F%BU`@q4(@>t316007F+ME5`5AX|(tD6YWDo*Ap$)V+x`Q zjJK?@A+Vhl%yk6c8NHCU5#FSto@(GK(Cx!2quf4Fh@FZukLKs!OI6W>bFdPgSb?J+ zKR85Br*eZ`sE3h2N9D_CfQjxMCMGM({4+ zUs_81wj#xqoErFTkg04J8;w(CuDU$t*o4C{3i|(m;Z7LxN8O=WQ}fkSmP%*+&tEo9fFwz<*U~}(_Z5xlD0?_{|lOk{!1ksgbcV5u!*6Avla(+Mt5oGHsFNdZFN@s{P0f23ejRMVGCS zlwWMjifqj680AqB7P&fyLR%vyQ6|1EK7lHdLQYYU@VI2b!EoR~w!g7E_OLth(m=C^ zV14^{hO76wS-`%@My{74L{oePlR-(h3*Bp+XQ$&T=@VBYn2WU$?ijvX8+NoiPm&!R z#NqRGt80!`f!5@V3UA+O>v&i~!{T-sJockz<{-oQMl1i~U17G4zPxhj$IZ?ai{ptt zrpyK=VxRy?Y`~Umf8&0}Y5YkA0R5Tfd>y~3D9c!>fd>X5tTF|EgV0L6Zrm`(C?0W0 zgFJh!yaS_zCQ7;oF1g<0AXEdBLl#bf+hsKw0ivdgCp|)#R9kzUD|(a(JF1fqYev9Xg;DYn=HZb3|mqv3Qt(n?>&@R=aa{bPRV zadnl8ynUrJt+@-@tAs@%EujFG40PeG{-Hx5rByj2w-t4A5?sHL-BjC#K(S-nRhOOa z_%#uOT9wdhDovhxDASv(Piz&8$aE)uRnKp4(vSWKJ|LO6l?i{RZh?w)B4GyHIN z$-=tUhHiQ&+(EU@^_q~< zf>sIKgDI_=E4m0?$mrE7TF)VnxH(xU&`olAT@smF2F{7CVpq`lhHMFK$~)PYbviGJ zE*(0hJLY*{HkkdO)|j~9PaPm#tibgx&Kb$)qdO>HW1N_tf*neo&?>%cFAVDVSs_*#c|T! zzqNKm zr>Eb~N!{i>SkNDi`(OI)6sBnDRgy6A;rLs=YsE5Cm~pz-=Y+20fV17(8-!=xY$24G zd&?k>PhcfLA)7i97AF!gZ}6Q#Gc1uIwmV9|E}!DLWfyyLJ3 znY0XXwtQ?8)#B4QaWp-5sq|jj^`?qMR|`)g3B*i+R*Bh~PC3=?Ynjc+;yuDV#zW_H zE#W##wSk0d+=Xd3j>!QM(uBI;!Ugx8US)`;tMgCT=Hyfc-VULg+<&-7QSCiQuxb>T z)t@BzTP$m@!#(iNhxLP1@v7lIsM*3G%3b~aU6Z~-Z z5+#5WfEcH{V-A$nIBB5vX8B%$iIA1d)w!uxG6&pB*fG;laA#x`Q3q12ZTg%~ zAcHcN0F=O8>TOG$Nr)4dm%rJ&^_=kWlqBH9jIKJFZ=hr40C_t zs#wqKsb+<*hY0>m$y_YF_6JoJb zs6sLk-@yRKoR4~!?w8*!RtK66o`f2GG9h>v9($brwq4_&)KXSXrhm_M|fads~B2dA7h8aq{1ry_<1f6ArQ~UZM$C z(k?vrN2|7PYzRY?dJo`_?@wDM$<0CPaMULSt%xW^LG?7KKS^`lqWb(P&H&W`U(Nvc z0@s44Yz5_rD9*8gs`NX81t>TQs;yC&Ps4JJ=|>N^43118g|TKXL#VQ>gaU?*gLOu0 z|IWYtUyw*m#7lG%EPM)n`rwh3B4pMAf2iSLFpO8*Df{`NsfT2++iKX$LH#feat4UA zpXM4fz&uJ`KYSEfeyd$CXfs(GRY&qbkmsXBA%4=*pv8ML_IdSoRaO7BO#;G7n8&^q z?@3I9to^Pk5U#nnOP(u&qdN$OT=cs@D3phsVU${44wOkk&5WAhuOHWq2y zj_KkskAxLN`}1Wxsx)d>`;97o&~!w5+py82b@oRm&Dt>6fqv1bZlwbob)yA|*$Y?s>9 zB^}vXZz)HIG+t|VY-ESKEN=xC2#Jno4o}p;KpF*Cmp^*}C`=zr93|R*8(aBKNPM)M zvHJ(k|9^m(QGbc_QBQrk@7s1D;NP*wKf|WV<`7SAQ~jqAUt*6M%H~coN#L*`KE`B7 z07C&`LF)5EdNS=9V0zHe2u(TzoB?{}sI>6(DMg5#Sv1OPqwDmj={uXu`i)s#+o}G_q3D5W@6zI_-<~+MC2sbK@^Se0AMjyh>>l@@VR@zBo| zmHHc)aqr!tIyCn^6$oNd-5x9|0FgEsNaZqFQrf1=eS6V^Ui(ym1i6*R*2se0NsEo8=tA25Se_6`Qfly7UvvTq?k0 zL1-9yauRvqGT2k+d~Gu7Rd#7bUvwMIdaV3y?SN4seuPiLPM%N-$8hUr<(g>g5^Zl7OQ!pVk|fK}ixg z(Xn)a%)xyrYcvvdiLi}`#2`{tw4M8G9s^J6(zZfjit@=HYHuS{A+Jq0ENGf-<)Q_8 zxtfhi(m8Yr!Zy4>#Wz7JdO8fbQc+*lz%gAna}t5uK16U1LvKgpd7S971)VvYjjxl^ z^_5yh7oyP%nr{$@K}B~$FZ+Z3F@&JlIXuM15+x1n%19683MKW;*Qv#PN1;#cyMmxk z`t+;4h1Pvh?3vi;W+bw6P#MdPakeH|kCd`#64sMs#5Gi|n}J3I`ptttKek{(!vi3e zFk$&%mbR1B(v!q@Y`@2h1fI%&hlS@|>wg<7!Smhzl<>;x)V4MI!Ev|$t>fk|zoYE` z&6AVu4$Uh3%jqkN)52G2Z=FL5gxhaR9i^@eWzDT3&H&%+%D(AbayfkXEqUR`!i+3S zM0*d~tKp^1r+JKXGO}`HB=LofL%X-x`-imGQz}JzQ6sa>TkG$PS0+qudcdsAlF4I5 z=8@h(2JBe~9*sh6O*``~cyQny=PrFIy}kJ2aa+3amRORv6!7|O#>;xoYac}w5WNBWPCjqA=~Ahz_|e9|jdBEpuQPzQ zZsypI<=DeEf+#f+?xh${g=V?M=pu6Yb+JMdQn3~Ju!Tx?rFK%l5ZBy zCnKdIySyYM(O0YSgQnqnNx2ptyd+(<+4Sb3#TBN0VvL-uez;{LsKCoy3a@XGKdDZ=etCcrR-OH_5aHys!I#yVz$*leah+VH`>`6%3Yw`;| zP(=O1CQQ&`%rbGgx{4%hUyeRG4{RlQMiXNUa;=Wf03>@QL8t4j!fY-g3Wo5xZ?*S^(s0tm(FK2B(TH*~7dH)y^-oB{hC| zMNr7Ce0NE;G6-KC81K__v9pm+TlkdL)8L@!4W9WS@FrSh7&B1;7xSgLt>J~S8EyP- z&3`hPTjJN1)Vx{kzEZrgZ@X4MDO5X3+iv>vXT)Yj%-Z)#SzEkDV?}56fi`;F3FeV! z?N*e@0w>Kz>%FQl8NqKfEYb%@C>wjpl_O-L;uKDT&H$c0;66RC!CKCz!d~&Ocm7!@ zGNql%zQcnvK+_rEpwRc@?$+i;#Ii=-)uqpY|1TI>DOLzh!Ni-;bP@E+Q=(4 z`$-qBlbnmx9Zt*F?c8u)$-@n~!-xP0sHAZ!h@%iv8Q(DM*zWl{f~|;S8n=nMgxxki zkBX4AN>9)Ia%V&%^N?M@5|(*qL8jdmcYBCLCD^D_8n1qkeqKMw?(TPgkXVs{Q+mg& zs@aTo;Cc zV~;;*bw_$~b5r30TzLa!B`u;0D_%A+Z6YBjj8Ok!A-e*}J4ntrmkmAvNZ5p4bl>7g zR8S52QpGEQ189srDDt>#<<^Mt=5=+yh&<0Tz(jD>1Sfs!($u6y{6f6{Cj?zf-|G9h zGr+lzx}m$2yEHX1PTL=$PTTkPE8s%OTX*^Zyzi`RhHYe^^@s=@*cFs9l&FAq6t7J`U4@Psv8P6j%-$wD%Dx zW93+mUYHO(Mff#Km@R4RuuVzB&V4@>MJdPo7oc$c*!Ywt+Tn#Q%PRKuAE}#%qKfWu zF4M*F8}j-41*A%MQqf?2sd2#_lDTKVXeU}kUC-y-4d6R{(38nYaui-QVV)nBrgD2_ zrB;TklE_>&*+|D*RrE&XqF zBAQLwDMMfLgjwGrMzdcq=g$s``Lc7Er!r^|7hq6o^-A*^%limfoM9sTdGr2LHU9%xfb=4oI{OS`S~fT zc2ZxdLLRs6{DL}8ovCjRWp*m@B>4vi#LaNG3MU@f;&hqkP0!5y!L z+rA873HDcCI)xW~_ZA9DUAbPjxA&}4{^k4)iCgbM(t^3%=>eU3I~nmqgZ!~aT>c3j zdKKIJeB-0%+pTjxHpf;e zz48L_@fojb2eZ*Xi}D7< zBrdDo2a1{5CD|2MTjY`FP4D*@d=u0Rl9X8w^{)_e&OiD0jnjV{Zf2aap@kMth>a&( z0=9=mEq{c~{B_jKU%Jo#IB3tWF2**z(!%C|Hm~{}nk2`~5QV_7uWv_+gz&BH{2X^)%)=aye4h9w1Cea}I?@geIZ<&>o?j9UB7f$_R{O;Z&% zN45&lPcO5f%Gg9tLU*6G!exc_rD`XA&+Df7E_w{J&7$Kx&;iACAH&e!Qg$H2-6L5p z9>q><#yk+{L+yYRrhGdD`iYt5;aW4*?%1);ICbT zU8k&1^zT{YkY2>GG>NCdEf$Y0yeA$@TaKU);%L?@h&Ngeyw_ZzBF0%ZLa-I?IJV`? zWZu!b?DY_|pY|5S6?skWhr9&K1a2|&f`9k0>$@gyd}l$C;=DgSw>o8(t5R+jDoLhT zGp9KK7*u9*qyNuAL}BukTv*vz38WSjw7?BII|nDGh8M=P$&6z@oo|c$wb}n`6zor$ zf6LrAUzHJ0$y(xD$p5wU-6IX(+n>6hB(E)xUgJN<^6t}$juER(eqm3B*NghjX`m&w zV~=I0k;#Rzn8I7#JwloVd?28n$>FcTjd$}@tUTs}V<-a5+2pqjO`SPkPA-QqEN4ck z!W-$=mUsp)QvAH|0eb+|&lG#UM~us%NB4S)nGU?v&Pf|kY|O(6Srdmy_IIu?qt-74 z=ULp$8<{G>`bL`2vr#>L&Cf4XpXfc&-IDFUcvp(6db4<5zqrlam@~#WacuccQ;7C- z>cKb;EtJjD8nmsVe?@Qq+Cwutpeu|e>i~YyHIg*WM$~;3?xC$~m9j{`p1{n+_|u=bElt-1*{$0?I?#6*B@$X)7V!sN_hF_c%!9A1P&J>VX88PI<_b z>cK$6NnUu(5E>{LDA=r-n0PItBM|E78YF#WCw2z-B&Boejr-dEH8?kNEwJo-WOVQx zHl?=HzFQCF$IVxrykL5|yl#J8?JEAqtJLVWZ`X~_0Gas5caFJ>=N11|3TXk>PosV| zF=DB+haC}bgjh8sp3vYi9+WONsiOm1k;nlBhW^xgTU{dGD5K>(5^4EOCDnVO*&x+< zG65u(>qnLkGiy?|n|yL=XF9?1+E^GEY-oKp|uq8^xtfH!K) zA?o(^BIFWeuuWXyEJK_WLE0Ta8Iet5;DQ4Fq+b*ReQ>4+EWavsQZvfFRs+TVL{YaB=FVcIuk zamK`Yv)7AjvH$+tmn%r)LNdgvP*LWesQusc`XA49S>rCIAR*Dl%_HSCx^*+^kQ~}4 z5d+EfKz8|_FZ}!v|HykhCrKb?tBGtY_c5MWe~(T`|@q|&BVX1tZn$BlBc*gC1!@c2}Rmz`qZN|+J5Mu*ue1DXFjr12)6acp+^^uZy&)^A_rjsUQ7`ONUWFiRI$!T z$y=xMuPAC-Cbg{Mty0$_cbot0hFfeI3w^Q!SCS=ZKMieXWJR~r7k4HL-Y!zU%-fFM z1q0dfVtOt`MWM#KYDRvl?(dE@mh?xTlGanE4m_dFS}?^?yu!m)7|!@(zQK392rj6v zUKp{e2O(Rb)nCWvMF~^lS>{CD{WTTrNUmFB4V5Vw74e!fE30I(sFW4p2;mGPicC%0 zO5z1>#UgG$Y?<{r1&fPU?#NcKnq zuMIT<`iMJk{RV$1U7jDWJ`v-}(@8dH6tIPjnVdVSj8Q_=s_z3B6y?Y|D-gVZbL;g1 z-lOa1uH(P(Q-&Ki>VJ4C>U@pt&WiRq1GuF*OfAI=MAeuSxeKJ0#7Q&Z1O-2OP#(9p zd_DuniBv5-iu`T;kM6B(2=9a~9fSQpX_71?9y2Q#g59lMWth&^4q(u3k@;c(6xd(QAQtM?#FC~0cD-eV81rFDSTZ~fs zR2tkw>6la-b<-({4Xf9=J|jfKl`8T;F-thI&!0^|$(>qNa#VOg8HQZ3hAN3}@sNrxVkpvg0kT`^jdsld}cKA{rO_;7qHG+hI^n^1nF{5eE} z?)uc}j8dD`Y%XzjXysGdD?O_^tN|xDxnwFjE!3hdSvS4_lj_ZQQA+jcMB7Jx`AvSo z#KliH2t?C` zEnAcvy&c|31bZp8&^x{^x?r+@vCZE6jl=dmckrxuXOPryty6x(T5L$e9O?k4Uu;;155=?3){L*|oV~whNux~VXH3K)vs>Cov<>Tcs&+@I&3tICC03i;4BSI<<0i0jV(cPpqVp&#TaGDcXkw2)_q`p4%pNu%DQD{JXYBljx@{@Ry*XyN~HpZw?E_um>P zs=1#wLY3R&<+Vcj+*abvuGz{v2m&tOtN1MiZ8Hwyz<}i|7S;{0ax@v-$|H7TtzpSp z%|=)n{po=B`0=Pm`ldAxI#fUF)i3Xb(6L26$~NSxIgaLieOHlVd{DEUYeF+rj9(Si zO`x07uE`V8t~s(l8?1W#4(^5NGBK>h`tF$~B|kHC5Wf}!${pf+h*R^91^COyPOCW1)tacEv}gq{h(0 z_m&&BLK~^%$qt=NiiunAEwgs=%AO3wh|BVnL8>;AgZugtp(My>(}3yR_c*O=T8o

s0naIvO8oV;)s>dvOqg-(X#wuT(tkoKt+}#>cpc-bMV9^T+av-hJ@Wj}*$7o0E z`QN%H{Tk}P`LxeAkQrMN1TM5Ucvsb<=>fW9@23B0@Ybt!cuwXGoGsRFk+1`RKiuV_~Pouei2G zNGKSy=q9E?^}(e;`&Rm+ihbv7g?0I{YnF3 z=H$OoKpS?MjJjCtWm5cab!>MWslPcsg&p_9Ed~7FZn*9$aCdPp-&fw;BX5eb{7Uv; zR=4&4SLM+$&?ju%7o6T-X;@1pK6qcK4~#Z^lRs6o#g0pA(%fc#1DAU=6Q1a^w-eq5 zgALFaA1fh)W0;x&pTDa~B>#MLIsbp-w*Nsh)L)(56(&J%B$?|K251Ed$F`xFRCi2V zbCO^Xex-gq7Z?l_Jfhg4yO`IX znpId2?%+D9RU^iDKimT6lfi`$GNFic6*hfO@TCvn?O{~ASVDF&TEMYkyF@E0j_xb< z$7cCF7#^U??S~WfhN6|}Od(H=ZCXpP?uK1bt*=2?qm_~MYvO`)-c`Ga`AMIRl4iOL z&`wnA(5%%FMZjaN-cMHP4vO`Qw$~AIKjB$*9}k)5mdA0_#8VQo2#ibhdF&Imcq*#I zB^A4$u7_5I_#AW`qNb|2$90ir9v&mhd(eAgobA!?c8cYXyIdhj)DVsiI0pwAzsYZo zri(^u`Xp5kt@cht^{3iLAwg1W#_qQ(L(3DXQ#ibbUWjv4#xQy6x-b0X_Wg7IA9zbr z$)PEcpc(zwn(mylVRB9-_WjNY&Jzanit_JHxTvunJ>^N24RoBGM0?77Nx{2a zZ$wt4Oxkv0EaPp#Ve3T5FS!PXQB@y2T*g88OK!Ki)yW>MgHNmKpD04}y==!{lw7+1 z(aR>d3_`H{mCeyE*I8IFmKO`NL~~BPM$vAS5)g$~Livo2#*lUBMMcAy@eePa@6h!*)#to@v@Qgzn-qMbQuNH6Hy@%54;Ia0}=r<$qkTD(z3CTosf zaEiN9Kc@J>9&8Bfa(JlXaI62f?_cPDG^76^=-d~gz`N84v0!3R4J!vZzG>s!qP@fXudb%hD#{-N52Nkc1%F`TCV)uDVmyyD83)Eh~YN0+}tljP<8G=gF@nHvE z(DA{cFk3Tt);xCJ@U;v)jXA1|OHw>{G2kg#gE)E_WyKBMXnjv+1Q4Z78XWv+>aK zT=1RIkLR&viSEE zC#U}t!_%Ll&j0$2B8Z*Yd z(PO`#$wGsVL$9=y!PbfYC1?C2AP8MvbrBITYcam^wC4bM>yG+`MB^6B@2;n1t%?dgYX3&T66YD*=h${*QPgmu z6GHm!Xa}zyj4Lt9;cXJK7}W1zSC~MsmYtCU@h3o$zsA@z(qE`H2wrH4g`iyd#Fp1~ zMW*F4cu+IqA_E{jgIJECSdR9=%=@wl>tW*(Q9=+Q(^djllJ;{4+nXF*4eM35ZkN%Z{=BTxnxS#w0a30g{!+bmW{9YNS@1wSA z_zT`G)6WM%}kfASz|qTW05$-AGbc;dP4NzZG+)S5j!Zdwk(bg4yg`!!N%J`%mUJY4U1y zmL-15u7B)1yE_>_H!}LAR=ub6u}oEl#N|~x@P0TKTCdv`DjB>fgc6KiBx83bu?wcBK*E~ zJ)U9a_hqgqRvp*sRhnymeT1nwF8gLjcF+PDt`m^c>6OxfSS9Fjkg?{6o ziq;x-CWGz|Cfa2?42E4)6lF88dN-n>XU)?n1+o-FF@priC!C>OK|%*&5E&;n&+$V*s!g*pPNZ|7VcIf^XSru2cb>{pl5Y*>R;=kY=M@jeq4OoU^--_W zc{>-Yd3nApCY8%cwuKJy!v?5nh4AHoxhQ2rJb!3 zP2Uy}F{C~w?h%dYba#t$Lil*|nc&KaG42a;QrnPCL?2OSm{~}p(7~w&@5>T-H?3Ca zs+|J?xylr5Np=qPY z#Bz1sQ|SsBaW8C{f)0tds;W6R=Yb7^F8=52q4ioJrlFz(L(i&Ah*B0^Lg`H)gs*>; zD@T38My0S7I}#IPUTd%p<7Z~$3RF1Kzn3QAAh9Tlbq{meU=^ZA=A-7GF-R&EDqH!k z>6@qE+u_5Yk6_8Po|Y=YNId&J*Kt63A`$de4Ln;^!n9JflA^PacM<*E&L;@}1YELy zH!eptfXcvDHD9*bq%*ueia9}xcgV>>Z8$a?S>>BOR9&F4~n8-gCEZ3z)r4u&wjiOm_B7gm) z(-A-k$y%OHx3M`bl{!?IS2*++{IF-%G$$YOe}2~K?i^OM>9+NK|JWrl-O6QK8@nuQoK3f2aP?IXuTB=PV%ATHMDN4swghvHltE=7 z42;a1ce8phb-f_R1}M;x7q=zI7!S_rk7u?=fyc;kq`4v0TPf1k%+n#$qJ4u;jf^{@ zokY5~mRI5}tC;o*Nu{ZX;T%crJdwR>vv-`k>!_PKnqgQ?I}|h*sb1i@$q`ery*pGL z-f&lI%wbu0^GXq{8Ol9k*^^QFt^wW}7e&>`BT)d3?1)~MhE8@MY7G%GME3S216w9V z=f{)CR*)$atF%YNsU@Wl>9stwuu{$Nhxs;H3#7zp(E?3(bU^@X*Wof3hvp%~Z&Xy~?bpFqzoaDYA}h6YkKZc|8C4@@Y)bS2eFM6x|yXPLrhmCU5( zZ6!pLYD!#E_d=h);{O=$X)amc==&(;SN9?QvIibtIGgkgb=(~QB2KItZu&6R>txP@ z-1Z=Sx)R&5(8SOv;PUQVmraqDj}~0G>rk^q741H5qVUknu;wW=XHxRU)uH$ryOCjI zr+B)ce1ri)ElR9>sT7o!6k~7m^!c)Q{X#(52|Fj2RG>~g*4La?(^{kP7(z&>YsRKl z7Rv;nz-a>;k@8t`2f34t8SHu-+z1R-jB_5hf2d;NKW^qO$`THWuIs7{{6>LOYkd8B z{i;X4waAQPiJ!&64wIyhQhWIkF!G{V%h|ati68IAWPGY3KG22b!!T=x@}G)2te#NI^6jam3ptn# zZoI0v4`b$_Pi6A#?+%$sO@<_y#`U5%3;0G4$LjV*cHAnt^OanHbrhU50LKhC~(X6{B>@dPx!u~PdOO)@kBzu*khfe!M_e*~jtoUkq zB$zXueW-OhySeSmN5|qumw#d4{Sso>gU!pH2u~o?Ds$#Ypdjbxc2aU0EpM-y>9dP~ z!`>uz;0z`^8J1ZnC_*@dNMX`ZK8fy=cIvmvg z;P#RE%a!Wa?fztLrT->!&+i4k`?#NRpMo8Z)N=N}wk_8RbrhFPlWl4?@1MCUIo=xX zj$K#2Kc9Uir^PvNhQY~j|IAi`{+I8Hlam*?-k&;lSPThoz#fPBLBF1{dd*upFX%t9 zM<6d!?+ogp*(C}u_t;prOp2%0oQ$nmq|1~1TIF>Pb4{vdt<8V85`;N9lM^>D@(~RE{MaD-oHKBx#V9<2J7M3=hl=WnbQR`aB8c zeg52iUweDpFn+|i%Rd5gw0*hxelc~+poM=MH}u6A)(*^Rw~B8J;iw9KQ8cNF!B$^} z_9sxWGa2Tm`43=MLt{81l0Yyb-ua81MS)|w94pQ6543-^TDq(#xmRgChLHB}PcB$5YePPMf zc9z?+nhYRG=2Y#HxZ^v?dvmu!?sJCYlB2W>FA`L`G2osN{lMEGSB8t`HQ~IfZZ``v z9Hm~bZXwcOdBuH+NXA3IDuH;($vN!Ey+h{ zpH$cce#YxVt$|XW-%lHm!yfAd+z<|~5pZ4f`lH+b&{Xi_)7U=_lkcxCD{QTv;Ya$u zQQY{7(IqmpU1|Kdbgt*|_j$=-P=SmXaI3_UYj?y^!_=@imNl>8MB%5Cbt~+wQaqr3?cH}DszSK!|I$UnF zy@}*URM%vv`Q*f^&*zw}*@@7jeO2KA9z^RGpsrxj`4hR*UgX0IR&OK>iy3MN#;uX&K>%1z7A-@7{Cc_S6+YjF! zE|rqFY;4rq-&>6*j@+0Wkr}ov#vqdlk?FELv0N#xei7X<8B5b~udCkJ!S|NVAM|=P zp#(+C?{v^I@Y@;~(k?H@p#zIK)nbLq`syMgBI+&P(Y*VvclO;%8+t@URx=$RQy4QT5!MGjy1L3Zdg;UuDjp1JYrDsLVU|*n!N~N-I=2CAe)ww zWnyI2{`i+U8K40hMt6888nvq#YI2CidZ8lr#A0|vE$X);Pg_spYUK}dL>+ZX*(Wfc zHb25p9*KNPX-E)fTq(oAO1x|bJILPWeulYa^`(QV15mHHuNMIC(2VE%Q((|J^pC@MTSzgFh zzT!LC-{t$d2SHL_Joo4u#nq9cvcQ=;3P5+$rs)BX}T&1i$S#yHGm&3d1bZun=+z^VMKH4Qc>d3FFwCe{1zZ8G8x`%d1K$4 z^px)BrNL4IKI(85}cj?7PHbrZk1&nHhyNIiI0OsBVK$P3kmIhE)mq?v}AFZJ6Is1Pu2x80o> zs%rdl_j?PkB1nZO%e|P5V^CsmKZi9h)wE{f)lbW5W0vmjg&9LxYEyfFdaZJCiF)w| zw7Rq5e9m8djQ2j`)Kp>l{99Po%5-OTw51>uesC}Qr-}Ok%QW%a~96^(;f4A^oocWW`;dbeXCvYBoXovabBeflwe2H zDnPy9z;!v;sHt}SOuKM_PzWSw(wM|X{Oa+s0f0Ev<_B{r*v2pGJ=%uO%y)en&$Df2 zErZ1omQej&?Q;wxSE>d_-9vg=i^k@eQg!o*n?|ztI1k!gT~Mpr7UE)A^trm5ii~mT zZ_VC&eNR#KZ>I^xpayab-8UcY_n7!b(Z5`@eG2fH z?*=dpQyN;!!c0=1(ZKCS--57$3Aw&CeOj7=XxwM4M&(%)aYRSz8cOFUPgPSI*NX~r zMyxX?J3hx1op9lJ-s{VHn`)tXB$dw^nB0(lzd_h4KJnG|{51KPQm@IvJ99h_b<9@^ zo2*zAU`tPCCmDIe;62tNw0l;a)LMxn3IQ(NU+;Up9~E0wK>LG2Ct-?U=Y4 z@96G;vYlUkabXC@IGp zerbt}_^nHi*6&KTZ_w9nfFbv0CG)O?a<12Hnnh0mLn0sb^RfE!GJp}BXTXl zMZh%ObiMentd2xMLollxTWKZcW3(YBh|6P1Oo-Dgf-uzH-Ng0uI_BEuZ6kS`+Iiw? zxkKE9-HY{Fkt9tdAM#Ug7D*~AkzZAfonsAfqkV6_&&p1!iA#LpGkDtlTrFek@~75t zH4H9M^bxL&$DOTsXjX`T9XIiACu=^^^@f7i$MYqgpkHnPcgH+GSWoJiCmNOTU(cwO z8v&~JMh{5r8Vxs?rW!m;TE3-pGA+#>IiV< zm&ZmMOc(P(0gWC;yt_U&=Jm3p+q(CHD|z0e_6q#X%4MgzC|p7#8wL60J;k{b4jcx- z5tq~6r)_us=(|y;uPmoMC>Fk7@qRDp`~Q)Zp6%qQCrWax@faV#pXwg2BqRnl&$Rd% zq_(CrN{v)}Lwc~#ob2R?dRWwO3zPfYBE!rnJHTUc@&41NyW|R7{weSZ19j|?>!hqC zD=rzY`87lbql>#S_*-#}GB}yv(p=`_$Y9d%tcPq9%`%i%agZm{q03heTT9QI4krRI|Et$ewC@^zzXYkmt3r(g*}+)iwwg4|5DUB>XFD^8+Xxd%Et0A3M$D=gAHd?~p-XwwOOxQ}tB2b@GO^bzRfu+kb-|a3OX&V! z(-SXnb9a|@#UK%x7KwD;LfsW0e;6(6h-Qmvk#$6d$721Km+Y!bRF zndBLB%84KjiC1R1WUM(D6%}oOipu{#Ir#Dq7ay3qz;cJ)?K*`nzx(ZX>cz}uTac5C zSbP>WV{8|CMoS+bq;5UUwhXeqCG+mzwBL!x z%f7~%dcs{(B&O`HZ%CBxWT}irL^Kuzw}}|^^1WtCj{w|xG{%)+6?E>3qI-YnE5DPz z!?u-@R?O?g&DKFon9{$ZWB6`F|2_F?{u>2J>i&?a#nCHv?xw@G&FgJ_+v%fZ9oGfu z-bo9hB~QFlg}>sQNO3|sH@lSOFmZ!{yxu(8+CK>W0IWBU^60w06yUx8^N&}OA1Vv} zetU{@xwXG9UV#IHf%80$?wq=_&g#(0T>+NED=c|AO}F|iXD|_ZkA4V-gP-B&HFQ}J zjQ1Uw{@F{}eff(|kH+w$$81{JpA4$iUUKdN(7{>A#rE(Rgst?pHXl-{L{G%j?h(|j z)uYn2NUPC_+qH$LQCVmbe=*<9R2%pxr>^;_xdcb6wv+C zxMsDIhxK8QeB)v9G+}{mIp0O!k-2)Wc``8qM5K%|bQ|vxX3%VK^``Kk2eQyT4yES_ z&>EKq$*ZnR7JVYC}R z)vQ!dZ8d__q`x{uBmk*B$N+20;T&_x4!fyTs2E79d`TX^i)G^ebni2@hb?=|fm+$7 zv@i&yZFSeXjK#Yn3}veE2{Q=dU70Fho%e2&u>_PtcylPFkIoQbvtg=*#SDe(825Yi zW+h)pjXLFsYWmfe@)^K_9XD$-bTSrSs()%6SD7mAk*j3Nt=Y*g3e!Mt+Z2p2!wCvj z<+$c4&q4V$V1-lnr$q*=mq8o-vE;;Y5nYCo6{Rr|T&MsT9=C$gWkx?7!OURB2A%9X z$nhxb0x8wJ5HdxPIXkXGcyRwjv?x%`8-jU^6+~E0-A9pNGkw=SqBJ z8_P?0xN|cfr!?;IMh)a`+K)9_=-v;l@SPni#EORu1No}p{s0Sop!ojRJ4VP479Zo1 zp*_4wgh@eFi4(ZJJ4~$Ar%Q#%yDYA*$##LLSTJ%}A!lckA-)bRAFOdr3rOEbjjnA` z!AIh`yU*Cm2-iN=?)dEspRCFc)Z}5{w9skIP<<~BSZFgi34`Z{w+*S{AB=){)l}4A zF&7p)=u*(xF`}D&+PEjUG2S+l*G3sOGt{M=R6HTOy7smw^DFm9VpQhO9uzTKrftpt zl4mRI71T!eHJ^0(&7#Q*1gcpoU#Y|9RfStttI}7FLo%CGzjx_EinoI$Zs)Y|ncs8l z!NO-_=ziOsL+bgcb;DY>&sOO|{HDXPJR|qcVpaq4;!^GOzEQ~K7#loGcI8sh0E{uw zy`8rp`MMInQRGHR2H>%VSpdRAHUdeRPJ6SS+Yf z-`B>aTIou;V`PqZ%736+#7Jc?HiMj3O;l5|^ewI#1!~*JJszUY@kBCj`CVJqHV(oq4&uM zElA&;Q9DE;`k=u!=jf={42^=Dgb=j@8k1A3ae4q@(W1J>6Qtk-I)%3~O|li^kbak7 zSd$wYRtPR(3l~1%H&AU|LNnrelu)r;iYo}$z)ZZ~$3ip*tUNT*j{9t(a}Z5m-u#7l zHg{0A6J=GmHGdQi?W_keY_xCi>1b?MvI02w?na>EO7(p;x`))j z^BstBJ2oUuPKKjLVW!C-m-wE8rtJK&c5=d!QNEX<-Fz!lM6g`@Z5wJ*uG&czv+}sp zb_6rc69t5-#o~qs$zh6iD%=enWJX0$Qfr-p-B*M1VTU3#@L|a_YDTW=K`2tRr8NFyM>g)$s{PdS6uiop?wgE87%!B1 z)v9)Lz%{!j9Fb9|N@lZ@nzz4EG(@I$#6FKHu=9KUWQNa9Hdf~ytF9g2J=es-uH3x^ z3s()5xKuF-ti%m;HJW`w#m=nTu+%msu25_`M**rT+`=|85{0KV%hKq1eyOKZOe#N| zzR|qGQmV@YpgRTeVs{on0K~)%^R$Cu1Cbg(^|;a1S}fJw=^wA&->qAes-KT?OwXdoIH0`B)`@)4 zcYT0_#tbqHL;KIChVpj;$hHt#oE7SapoyD~xRf~PAWMs@JxyML){_pgm9e-9pI3k} zg?mB|V*90VEU4*>=9su(H2YAZ#O?|6DcEuKU}F7H-iEKn{i4syNFJ#v&aJ2%Q!*m) z*h@hy9_D##E&aim5~F>4>QXxqpPQl=XPa?*`zw8FbqLXzsAEyA?rS_6n(C42x$E>U zKobAS9ZCQBx1!EU1g5G$Dc-`72U6>t_*IOtXJU&j;K>4eIfj=IlN-HrDe$;u zhZ1MoA~9IA3f!^Hxvx=FL1v3ZKQ*2X8|+{_TW^ZsFt$|yXX#=WBQitLxGlTSRZfcpr{nW%zai)@oGA@1_M2C5 zbehp~5ji}-T%WvoU@%w0J2Z&*u3>EwI>Vu|MV#OqCGA2Si0z;cEz&6_a=pm3s)Q3eWhB>!F8~0ORltwb#!~cliKz#gSab(4I^8%obwsJEpzuUP{UEE8%Njo6RmhOpf=!?cwdrx%qbO`6H*u}uv}?mdC^&yaAIV#iS%7@c+fbv0aX zNNfzx?p!s`_9In%6#ThQqU6YRbn3jc)nzEdw@^S7X zmXkEK&mHS<(thowyax78s`Z6;^SZ;iOiHL)mv6rn$u^VdCy2q+{mWNgF1|aN=mfkV z63T|T6aWln15M<)<;mbELoN5LmJ~aSE>ua~qGCXcZOR!&5mss2#m4w0A`e3MKis zJp*&^g3!P8Op!JLhz1zMK1a*yR1S~f?ZT%ZX%9j(Emj8kg zInsKWIq=r4!8;?`RMk|en+_Y*O?3EJUIt2$Af|+Q3v(Hd%WUeN)K_^iK}pZ>%?LQr zB7`s!7ycw|e>h1M>#;O87a3Au3K3t4G5T_z(d$dg-i_BmfFop%lWFXV**LN-6J(V% zTcoNYRtllwKBc*?2PqYd))Q1yDtui}u-lual2x#2wb%fZIf)9l%qo^ig*Sb=))-O} zR0&Que%oUx(o>M90tJmJ=TuW$I_~4<-=Xzr!643-tm|?|#fI>BdfqJd2)F&SafvoG zhXrw?rLrVW(czMfqulu`jn3feLU8BJYQ0)^64wa7p7mXoxk`;tuxpb^?u0IiT7x5o zQ%0k-YJGB?*$86we6@%SKUrzI?tp6}V#FkLZjJKUl0p#$R@Y7GiawZLb}@nz)XZ{6 ztO*R6QpxOM8m{qXY~s6}Bn~_K{=G@DCT{|_9eLeuAB<3qG6H~KXCo58RnTiZdyzQ*zQMxMxN{} z2s*@70}$$R^7T|SQA34DSpvxZd0_!}Qx-bnZf>gL7^l}bnX+2V+)AIYRIK3lLhp%*?L zv84LH{Wmo-2r?x)3HW)}BmEG3m$}2>`S<{-@bvoSGo{Nb_%BU6BL`XRw3r`bqQ3oZ z@%wx7+|{mc6nQRkxfS($SJZS~??g{AM5oUyl>Scbp0!`Tw+e{#bUkjs#PzG@BOWz@is85|3V^E433im)By*&H_Ruha+P@4#NN68kR42MON$};6t4DCQJsg^f;`7 zG$RF;x2jLTTBCbx--C&6z~SeU7J+OMbCB+9+VCAmp&dbqEeQ)nAvd~mG@e(*E>Qp0 z;k~dH=UbO7S}KuwU6Oy2^4&WjlkmAs07%$Iq`>FrpGN4gy;7NKZq=Z8i1JD`HLg4- zQQxMF%{q~O-Q)D5^BFjaUCnb39R63L^5_k(3iUzUdl5&#+QCXP~ zAYXkLDfPcXC*jpwGJ@``p_}?;h{e6V~HMMvq7f1pgl1+MP+hIVf zgK35X^M3;3BjcR@h@s=hv&}!<;%|T4S;-|1h|{+8MkPkE<5b)|Ic8$|IyqMH@$8Go z5f_D83H6pWRkn4x^z}D0jPadco+)0tVB79LNx0Gl9qw1lvd7@nGu+t7=t|3BRsg2# z69hSYMwSZ_q#cF#yz1EcgvrTs@#+=roD9U%_UeRNHh8iJEEz^i70-AdXY-Fnm;c!6 z@<*$rip7VVjsm}g8C$a2zd?B7rA~+0*)lj?XTvBl+j_FXFP=UWoCbEA!!Ufo7T%JyuISo?g=TKRh#CuS6`SgiAhWwa=>cszw!HR zLjv(t0;CP>7+kv=nybrUgf&F+z3dgfov1Y7MzidzuipW$q|f41L2<;rDuk%earyL` zG)cNVbD2Y|zjV-FlR;%N$w@z4xs{i7PC#4HBYIO^?TB`j&)Hy?OlhbCkE^-7M3;P& zp?nq@Nj|kako?;V`^)ctX7Tt##!vhh`)55JRzpiwV_Qz7s<~Y`aM7F!NDEoas*M7duuFQNGri zPpkR!ADxZvCT|dvlTA0ng=Xfk2w3+u74Mq`!`ZA{$#gSM>UC7uv&hlP+z^989SfLw zwF;MX=hQzMw*I@7C6i?ax&p}O~7S;+$QIP zh`nV>TnvklfH^;XDyKwh0;%PBPSo+49VqX8#a0lTp+5V>?cuo8lx5cVo?tdk4x3c3 zr9lI`0Hn^4GND8*ex4%2MHFCUDvQq5f37*;5@Yk&E^Q9qsvzt2H|&p*umE#4yC+3J{0&i4Z~-OUVxJcD@c7ZVsp zbc7hLbTt}qNd+wS_Klj4vp6S6$nItfS{A8(#k+Jr&nlHW`Fg9i_uANpO~21g>VY>J zlbD|!dBhd1^mv!{SMW2~YTg;W*^GT3qx&XUa1`MRDJ2JDJ&4t26KCYuWfuYX+lYLg zbv91cYP&R22_+jl;j`Sb`^d*%8=R*z{Y1{}?Y>cHqn>y4$t4@hZ6+VsKes*Ucivs* zj!4-VCA^$EYz%%KY}s?^|CU@l^sd=r;n}89>ZUrZJss>h z45A!K;v?N5Q z{Y3v#mi#QplhsSuUw;MLL&Q+v` zG2W|**~N_fy-%ndkYCv3St`dCI?Y$&o$qJKFa2M-4&Q!W9)#8Ai!XF3eJU`I6|lCE zp$`8^RZZzmtu4Mqq6^`w^1@ImWXJ~HAJIQ$e0vn!A}i~j5x=-G*P;U7yx2C4uZ^pjneMC|g;4^pvK3qwqO zo^P@%xn8w=Q>Yh<>ybgJlqVkS?EC(fDzInOV>VEzzx840F9YVsd&++pOqbUj-`t@?Zajx^VVgJG=yW`(d-V{~QIR(3o(6krf6lkyJAcz2Tdb-=42;1O?AYE|bDtOT}>=W%@-@tGT-L8?iW6Uq3X6-}U*s z`3{toXSDHA6NwxlNW-LqJLSxO8p8jv+HVf5Y8^JA8<9jPTE;N>v;Br^^D^CHLdIf2 z__3FlY%)FV=OV@7W+!tdpU05)$t@nKWMkzq5yjHp>NyH(lbHhg#3Pr{&^C!Zhv%qv1_H+T zEXI0L%)w3dvnN|97v3;uuhm+_WnQi}Qxe85s((d@C?wVWl^|hNmR*+VGFUN;WLl=A z8$i3s)3q=_6{|Ln-T8E$tava9Tm#&}!=20$Iq&g$g3u3!V*v}%F&yp5(Bw!}+&Jf! z9#WKW6eyB6SS>^sGSEQaV^$xHr&P*FL=1BxI#ub8^7oj;)PHNw>T*`)lT@3HqFHmC zfRsrXinAu7^Eh-Gh0g-7rL2306904j%s=Z+$FNS+g7pcdb0{V18`|< zq)51?+alHs4L>-PyP8$=N-d`|Y`H3R3Wm+TTMYDxN5Mte*a23)hBHD;uA$Rk&%_M8 ze7c7Nl3dBYgZfp{%93PP-ekvdllz0^nc`7PMver7b&`%2UZ4IDh!VkcRE&D??l46V zga<`z>SxF>Oe))}hgdjx#3b^0H^Abao99!Z86Vqq7v-F?M_yV>BKNYLrKm|v`URdL z*=6E)Z+e&#tGaigNoh&xevI4zw!!(hn5g52?`Psp+V9L#4hd=*cQX{_@EMS;nbn0J z5rxa{pCUlI2#bJti07PNt5^6~!d{L%ORWpEvLSA+*tLz0AX}DJcvqVkN=0vL)$4{A zZ@Y~^O+Ep%`nUUr?1J8Pw~u%ARZl8}N$Z#QYL&pY6Hd*AUI@=7rum#jtUYUn%(^dj zK=)ubE^U!IB+69E>?#Ipyy>o~tLS|#i0IFrl&{I|i$_yg_^T1+3gbZsPmQCy&eF?- z!uX?&7nvLmGxoaIQ?Y~YYTz6j%}W>WGMIUSwM+v_lw37)MX6frK8K zgf>zF34~rGfHuVdEl~@V>j$n0QFiUAZ5uaKOr}c}2}b{IeB&<7HPCdmU5KpHx?38I>0SiVWs_8~EYXvGHznat$VO z!guXFvRRz2bO6p8G7GVs7#tGmtFigMYTHH8bD?1+?sm@i$eyyy0dcJ5*&D?YFJi=@(NU zg;#q<|D@0H8mO7&;^v^cY(97f#1uY20a!@RNSjlQ*`@B)UJ|zow3JeM@}^fw(*A1- zz13qfn_-ds_6fOypQsY5X{R73%d`IML76PcP##Jwb5j3&8yZrfU5M6n`EIF>$$FF$jcK( zV=nSe5YfrvNKZB`zR0Y@%&9|{3=4YH;!Y6sZN^SVcJ*M^lyAgDPhzN8_=#PHHm<5{ zy9NkMet?h>M#TXA@US+!c1J_PsAsXteToQ9@`LhBYfs#8vUJf?xIYlDcT4Yzi%s1Z zxN4H_`N$F@@ypK_Bu`%-jl*uDayzR;Q{_a3K8sWfe=W0OiiO4BU3!S`c(n(i)WzoN zr?V*&5_Y84dU*?&9}K`^)3=5MVsyPyw{BwMHvI@&2azW-{^7TLUEDT*@cUla`rBw> zKH=S9Pzu*_LEpC3LUFP1o*8UPfkiWq2T;t*ca5y3Z+UTI=5d|(*P+<5$Ejp0^($Q( zJF}d#y@(>GM7@ZZO%3m+wN1KjAP$RHCtLUmNNU}gSQ1TKx5|@3<^kp62Q+ip$_BZG zlh8DHHSk6mfI>ZJ=KHDB>1*CWT-03d<9KtefII zfgmQkSA!jheuhP*MR!kaF%iq@q@?if=`e0$8i^~TqZ5+`yu-S}ayOi!pWW2zC5d0xi)jo27q%pIJ02AoF8*Yo#d&K@2PaLa^2hoL@zH0^CZ*-~ zrQ7vCCLY8VfAu(#ost|H^f{G0f=xXw;Wnw76`k~-l69oAx6=4>TAFQJOzpXpscg}x ztpJSf8fd&%E4bfOuwyI54Y*9^SQ8I$j#!|aoWFt|#01hwQR(j|eX_i+`}2^vykw-r3H0``Q)7 z&~Zm0zBT^D+cQ)*rqtwp(7Erc8Zs!%tz7Ww<5|l)mkP;J zrGQ3W$E>0(zSs{pxzEFw;tussrBOkU7ITiaph3WPynJL+Y2VrF5_k3vJ+Cz3bT69q z%qoX$xZbCk4~uiSZJ#kBc}QLS99&a6>6GE}4pzlb;`?`Txks7z4Ymb!KbMa_xfl0f z>cQucUGTBqf4@6D&#aofZCJXAt{9)k$r^aad#^X9fAG<<+}yB5CT)X1a0%pPfwJ*b zD6RLhukD@@oFv@)QHrjN^yKf%HK3Y1_utRBe=h$2(s$d-uh4lgEz{3)-!)8U z|L=R){`%YR95o%6GdO8~zHpscr!K$N*W~*weSie1CE*>`g~uaauK_{M_MYsOxNRdQ zDpDojape1MLPns?v?0Z4vjXLpwxOsnpx6o+=ev}5yJ|IWQtx{9OL6v2B!f_s3#;0P z+qkeVEd)^{65Qk-H6tA*&4UE;HDOrUWC((qShUn?0dLd%8@ANS{Gq6UcV!GQ+DNgQ z%6%akfHrl*H|9#wKj-*Q3=04LA^8$ntww>6t1T)8Q#9w1QYX+?un1tcuPox!Jd6HTYCpJhCNv~zvY?MU0(Q>C*`K2c(@D;lgs^z~T z(|D6!R#%bFD+>5sR=?-Ht17p99o%z8r>DBdF%^fj2eHw&0>fE$kxUt2~|^I zeXphp`17S86KH?}U8riZIQu@Pj+^RxH^~QCHQH&&5UoebX~L5?K2{m7k9fWZpQzh{ zdszwwPjaVze)r6`d!c4mypC2W5tebode@ z1M~&-@H(M&)#55RLKh6ilG+&7BR{`ztgb5Jz}D zXy+U9SRE~-xI)MkfN*1@?N&>{ErIDlJj%+b+c#eSa}oZFP3MAV2=l4y+}-qAPdgE{ zsTA!x3j_mYCPBY)Uvv6Iz{*I=m%0(>NR}EHR_6h(s<$W^xdGP#H{QB`e%rAqpB(OC zlKakU`%995{hO5RR0soK_ca){P(widA>ZX^A(Tiulxwi5B~qMj@VkG`>>r@se<$E? zx8#|>Ks-mqWU`XEC0C>isk|I6r^d6VcH~taA;p|CY`o^RwVM|9o9j2PRE*kZvjdWC z?enud3d}DKp>|BNX!Fmy$4PHlf|l*GEhhS~@ayZ|e-F0&Tf+aTQzR9yzw=>$@j+Vdnk!}Bvn|TVCem$??`=^`DZ0`xETg8= zx~RLwzp$sGym;8GQnw}P+~1$@RFj-EL*lN_9QwDYROX(YIt4}#ex*vy9>nav4SY6q z)IDLM+8X{p?Pjd4Q+Qd>`xr#(PHy|z_T9pIj)~=`nqjcM>459Awkzk}V3Qmw+NUhY zG|R6wWJ7lQ?l!AH0+2X&SwtfD^Af7E!;eJP%ga~i&AkSoM~k(ta&vPj?}*ENIuk*4 z9sG|jn;&e4YZ)ulie`xee+kmWk?fQe?a!V?wM2%!a`Ch@mLDU~Cn{f!8P?aZcS+>H zaRaFJLBlUycYXNp%#Qiw8PFQCK3~xqp6YG~2oVTe+7iC^zP-6~m8z_pkLp4{K9+qE z)RzN_rzrptAS7}kT;}oe0M63eI?fp*bdx&4j!2$P%7WxgLYP@~UD&hWsO4Bh%C|rL z+J^o_H)LF=m&D&`GAM(}g_aJYtM=>mF+wzu_^&?VsS(j*O3FCjUaHJ`u{t@=Xb{CvF?j!P4fgNOSNQ`e%n8AXC1aO~N^M1nkqlyWP;Q*FJdn zysYgSkgvOh#9>Y_n&|hU71&>2)*K-2dmnd~R}OdHvUSMml&A?W{soo!%jZv6Vj^!o zx@@pPQ#iAH>x%Pn<*`DGL*ZYd(buxiE-l+SZ2o+~-pA+dzRM??!p>{&R$pDX!f$RsgK4)B# z&`#e&m0kj7L`_B_sME zy<@xsuaNX;xRHoH6o)BGEWgH2JxaCN+*OsPlGJ(c1ojPd`&g>HFe@G1qJJ{Erm9d2 z-wMFg_3K0=PfRt9dK*Wo#0*eoE!7SPPql!Qf~Oio1VC#i;dGfj1T8MAV}P{}$~XN% zGZ$=EUC-#OKQK3Ln|ANDjs|&JAkj^5W-MmVvMDRmvy1y_yVD)dQiHpJ^Xw+ef`nzu z8BRO=qqk4&z%dQh{lccfMhGd+2oig`hXp^=6i(4Bu)&<(O-LB*mmZMM?h%;{)D&D` zP;#_4uJS?bm{++X?p(%>y0ZyeFR)@=r0eu*C>qi~y6Z_p_;#eE#%dB!9j+S|Nv?2< zv=g0vl~u(qA-xRkS|JlSqswB8$z5~_@zPtInyp#D*(as230Q&8gWIFdZbDGH?SFGBymab;=YJab? zfidq&Ud88ramM&C51%0m$F0&R$C;{9S}vV?QO)4x}jUFyCGud z!d~nS4lZO)yC^+s`6<3^uoO4(IdBPTU0 z#cxlc587y9uHJDUCq{MLYRoxQYCZZ4)V39lSdG+BN~U=b<`G4Qs`dVKo%5R5sLmRg z<=h0I3Yg)s8v>kjIv-~Lgny{NcEDUNM@FHBwRMKy{)P_|B7f-X&*-2ZDg@n?oI z!t5gJdjgbDI&jeqFuy*T{r$35{%-;jz1#qW=aN1?`xFF$%~U---Z z-rmB{r(&H!$yUB=zF#NSn+wfF8#fw=z$-saTY4rk?j=KvCCfr5=ALG#JJk(D8whFI zL^OFUz1@mQ_!7cQE8k`w_yJ0uip%g^RpD53k{{jeqM92_+hU zNLc(jDE4(U$4_5MZRsmtC{q>s?QuEKs|a$20k?ff+=!gN-W9 z@sCAjbnKtontn9z;LAd+o-#Tv)|4T{poH;F>A=?|Zx%JMl28LJKz)q7-H8mrm#(IX+UiG9>mtVl8+*4OnuswU-0Vj?0}(>q;MnO7sfhvj-uqURgY%f_D%Wy?($ zYGKeLz0MnP>5FzbP-#U7yCb%xI-SgNQ^ZMw=$zH{sP+`4;fb;R`GOvIlhY>A-jnf# zn?HEILTX5=*vj-`ag>SX&SNhVN&y`OzMdY4^{9p8jaOJ)UdKjjv4pGajCR>soo2$5 z#4;v28U;_Kk^#N9#jZj=J?Kg_DwNbNdaD+*CO6uRE@m*gAFaW480jp-JGQ{8J6txV zq3crm0BOc;@ACLWeX}w8X;>8?^Zkp`Oq-14*yIunB8zq7Get1L`Qt>wXuq4K2r!}4 zku8pQ8cFsP`R6i6&05_Y6>pr+cbTQO(;1Ul9gQl$=4k*P?uqO2g5JSahhH6otECzx zMoJ6DyA`fnbR@~dVPWZA6~m_ac9zUrvw~w4gMqAMLSP<8vvF--3TSiir{rVc60$c+ zkA*5_$r{-Pj=Y@csgbu*w+fRzi1e=R4j?kTm0LKUAxzb=u}w3JGK8AvLZzuB@sb1) zSt{}sH|IL`Lb?P&%A=A!p}eHH&3rDRJbl_Ajpb_2LinR!ff#uxFD71I`ddt8)R{f?{+f z2C1H~kmMza!E*F2QmyzViJ02Btw3Hj<<^8@$G}+% zy<)|aOS!lBM3qJri3A$s!D8O3hY4tqR=?QY{s%^iI^8K%dfP-Zt^T02uZr^_(2|AhFk1%L)_zL$-!|a-UV-CkP4H7`#+W|BLB)3XpM^dg)J~SVOd5-N7<~JnKwIqGl(cz z@opPV0^BR77{Ho5lU}T}=$>V{s}h`TLs%LN(p7EO=iGv7dvmG?YX^kupBDb7-1|RY z5gyD4I0wr6HutXpoihcLp60GuLi6bjVr|YQSn#Z4*fBZv3 z^8Wb(XX|Dbbvyd=aKIxD$smvDQ?cj&By;fVGyl1(&)?$yHfMlc$MSLdZm#{)iP&EM zx!Q|PuuiNYPxV$$+OrBJa@_VvyiFu(qu)?}F`mQ7V?Q8!wP2Pa>|NQ!8D*-8 zu0celB7nL+Z=CXy2sj6aeEsyzyb;O`E5}a0##inEb<-8!+nDL~vnKo2QNE(TwHI^X znD&WvCL$cSKpVN}h?v3a(~KWgRJH@#?^*dLD|9lS=}EIn<6rD$;bc?kY@I3mHbGg^ zJG?^Tf@oMUU0O1p=i%kWzQsLd)$o2>5yxoF5Amkuy>^((w2Il`*=4%E&Fd!oh6_2G z&3BS0VTrR@(yLkOAv%i!*H=VXzqs6=-iOCb-H_wnt`$p{lwa0BxJe_N9@Xr!5bN1| zl|h#s5~X7!Q(!$JCPQtnDm#)tHHs+@1{)vM8W-YueDS~>wL8`FiNYe35ce2YqN_N6_~6XKl&E1Z6~A~jG7!o6- z2+8BSTHtb-sDiogaFR^R#Uv}YOJ+r`vMCwrC8I7D4Izb9cCi``1RO?CPOhBoZd+f2 zi;n;xqpL)R$cLlt^&rEoWq_|vlJyeZ>g$pad}+MBLQ==IEG!pZ*`6A{J2ag_z8lMU zw%X)Ut8{sbE_bH-yb`xjB15NRQ49iPt5LYeZ49Vd*@mGWripI4ubV1N2(!M5rFT<0 zx&$|}b-;^lszSI(VuDa5Z(6`*4aZd=&o|`1Ri3|{|HP)&--52{11b*ezLd|zH?}YL z?_l(wtjIxMTSej~ih(AMy;qH}nQGM!Q)K8^1P2mx-D$>KIG(1}$s=mGtsz->TQlTN zG%i7#FrL6S{*#kQE$zmGB+`Tvo&*boU|f}3?5<&Majp)uc8s@Xe~NKmJc)I-B*8s5 z_Jjv?Q;c41x#vPNl+aVc4>#(LDH;wo7HD;Hc-cMizFU`4nC{j)$IMLXwbNI(WdyIz zf*x?uAXC^ag^gH{{8WjrfrzHr>Tj%Om6TRv!rNO!Ur$K#MjUbS<15qdurM=7&Xkc! z8g4$oyB@uTjHA_PNUX5t8m++UEZe5|^?h+GTg-+@Ce13KXioZ&3&LJx1HpT3^7cmr zv{X`c@>ui_4RaJq9u=$RL5rkiN&`C%wVb{&-25WCZs=)hmox{3Zhp?R%8RQptiMqc z%G3p!^)^aCAmkt*9$q(z`h6eKr4&gwSl3pk_RE)f(w1NyUs)#n670CRGhI(ZcU#9< znaQ#2=L@sn*6ZJ2ynLMae7Ctj_Wle-3B1BzY*Nl&Jr;&z*N{yD_QOGnDYO6dBJR}M!fXLu@*MlJ|nl2uj2@SUgO-RiQnCTcIdlglFh@S(K?Dn!j7tK z(It$RT~kTeerHZ{g`0reX6?eeijTe0+Al;+OTbP`hB z&GhJNMEHZDah&O6lC;IQCcl%p-zPNqE#O}a0<5L`IY|T?-?GFa!{R+*AgGeZqNX1K zjpT)CAb|QWq5D!?6|6%sX(Snw+xV%W6-OC-^ESIS(z?K>99554>KF4c2*(rI^?d9c;3rZr4n`J}~iJKKHCL*?$qLR~|j+{dh&<;h>2 zG7i{pg>kY)mu4L5$6o5U{DtkfSl3?SuWZMC-hI|Le_=c3>*W*BJpG!_r*sBZo#lVO zw5!qKdye6#*=GR!e1S@)Q#E)Jccq>2mze#3C+6^f3v!FLb3*T{fO^SF%hc+b)?XIF z!xp#r&k}RT_ujkiKg<8&b9=j|Z{oAwk5*A#@;eZGGy$O|JhhWn}bq_jpt9)5m7xGg1SzDNDvsU4#S zdOZP5-StIp#QQpB7izW=EwOp82Or?|UP!Lc+h@#J$!5Vj)8z2CL-};H_~_D75{Z7C ztBpR{xAbpL&dSoxTrFBJ3O#M3y}dq4Nzcvf)ynMyMM z^My0lu9h*?9cXIwsp-) z^uq0?+LLnqL;TdyEZ6FG4)@Sm#%g=+mDTqie*gphEs0D19dfxkttSe$Cul{x3x8I|vjH_U9n8n11I z@qO#{#I#@(UBI54t5Wd#)$Z|?US|jzQy>gZ(&VXrwA%WjoI_z_y-DhE?IIO?|8Ste zenkH1Fr;GDp|?yw->A>nhpirxKZ#_XAWbCYsZVRm&H`jbyhzq`+t7H=c+nXr#zTOT zO5za5p>MBVQG9<=>5W_T16e3zJ_vS~Gi}#Sf#>H7HRZEH*v1meJ32z)#v>?#d z3U5+2oQK1s6E=#QTr0~d$+os@@(TgT=smS5o7lMy+`!nB4izhNp4Kl^F85v!(CbFv zPFUeoCjefqiy*KLT00^lB3yr13Nh5|bfoDVQ4J@lI$rmln=pwJkm9>8ykga^8>x*^ zdqkguFsRe#^_#`MS$dyAB^{_icpL>lS<;I7ZD2|h#K5i2ZB;$#$-?|*sxx1ec6_P7Y?5P#pUv7uK+1hFlBe;F!tn8I&@CMHpeV zjrsQ?JMj9ke3y6-Ca6siA5*?Nb2oHpdQIuP0a&FoSYFkqfGQa%f%c@5RA6mMu7&>E zxHe*u>5Nw~|La3D4#FS5N_us5suJtfoAb+f9wB+25OR<5cuXJ>Zd80Wzc^$$t)a=@WtBg3q z#UUd-UB-Y<$q7>Zk8>kX&pxo0haA+Hla;FGFKo zC48U=%;$KVkuZtgvx;ST**SOI!FmTuhdtl{rrW?Oq|-87wj_tQD9a_2I{IT8=6jQg zl&isV!`_9={xRVg*b^ER1HYegf^{+cj&C`!hMa}u*Kgd4M$VVh?<~KFn&cS=Sr*_j zs`m~vyt)~1t+q~umjdSPt?4%7T+1Ce?@GcR;mixZD;+DpZkK3fbxm^=4;Ch9X7^?w zMy8=78^|#dR&66qz`!E_aD3_@+khC~J|H7x4WL zLY~-a9T0YmJeUR`CO4qb4h|@my9d*<`C7>Wpz*;|0qDL(eI?PWDI|3 zb@rt)p1m9f|G^3`>v5@~JI*G@rXp|&;|IB)?O!btN2HL<-VEfI?@TL z-aQ~PXGmeshbT>~n5dAv7vfX2=k{G?U3_1tO#=cV8i;;f0zuDIF(F5`bPeY(VKjI(r65(ux}DBsMAn&I$?lkA?C`7V9%_!isj<63cZcaf+P zXCsfn0^m+Tz2xz=U{CZy{flxnpf9Ie)rMRi>F4m%z6Si*Pt6pVeaoD=aDkCdt5 zeA1?a3w>*~M1`m4ev*xcoX&q*j5|y%6B(4P5B5Ei@hWveS0GgZEMLBI&0_-hS?w%a zHt|9EMA&Q%aY7I5`Jy=UDWL4m0TzRAaNd#P5>W-t+N87UBE{iEIDCn<kUXDI*36UlO@=srPWEuPO5e@rS+46~_@1A2iCJbkfJ;j|ZV^QW`IqFP z12ng0rj1-@gAPWH9h*8UgRB(bWeIP|9Cj}HR;c~ehI7j~@4dAf1NA|;0?uWk*frl2 zIDK*y(nj6mdm-^e2M5gSW zyJAAMS}Y)WsdjsIkSW(BOfM-+Xd{~Ih}0j)2STnS3V|7M1;uIJ%+mnpDT0%pqr9Ce zBTj~Nr{!Uv!o9Gn!DJ*2rF7N<(8!tN4gEA}EkqK!)tf{ytyxZ?cL|CNv{JK?$sVH? zht~Dw7TSi6EvyUc8AmaAb*j26eF)vKyF=3~8rYW@AlE^=;-UGBp{QQScQVQqip3-o zdSW!-8XQsQA|UB>`j_iaR?Iq%4Kj)>&TgR264}L*Ya(M)Db$gDncG6G*nB|WqnsBz z*LSvFcNerm%S;g@zCOELzYIpF6X77CnMiBv&!W4#E zIgL~s$r&7;TTkP1QZBw%(QFh-ySYzY^v{v7OhzrWC%~=!M2p3Y*RR539euwTnYb8b zP*oVZp`J9zK#<?S^AxSxUX-9IQdmNclYA`-7>)N%+6iOdx&R|Lb6>0{^ zz+NSBzsATW3S9#Sp#`oUty?vfsn1wUR48ul&Ac3@Wo5s&4*luS26L#{v3Trz7`FUn zZSEJQP;tO{3Aq_x6MS?vpwX$PsugzpX8qxD?d*l$Cw2L4DDjQ;F6}zx(|MfvIW{h} z#UU_Xpj}k*BxUWV3%4_VzHm^*`jzSzSC6n0-!*^#1v80hZcPn#_~1c`Ng%vh>q(zBb#1%LNN_cBnj!$1Hr`tz*EfbC`1(FC|(9)jxA?`YNP*#S= zqz$+RYPnc`&u3?_vqJPV;gy$&jK4#3NH0|sO*oww$JHJd(E&2z#LsHaq7s~)UT^3I z$`Mc2qiqotHnA{p8`5Udk%xDNIm>LQSJvh ztf+frX_ClkaRzKVJQ2oU#oGSRXaN;z`X;poq44b{#!I7~W;foiO%f*~S}y!~p)Aygb2;FeuXg-X*7DxJUX*59cx<~!W3-cR&i*2F5#2HBFOLyHCd z+g$}v+Q%a503FEMYou-eNrud3^mlDOfsH(-z*WQA4<>~M*v>riI_7SvE-aBF#o800 zHf%z02ecWLAao;z43sZw3KCb3;`{T~cqbYeliaG>kjj00WH*b+gc<4SmG^qh@Ps@P z)Y2qiR}Uka@vsP8Gv}qqE}cflJ7^QEVE~Ke7g2PPROyR3wS&nlf#NL~SqR=?2t>+qb4QF^d37CAH$^UVhfwir5i} zBNz@CSb4bNtMLcm>q&QaQQ#NraGC%yE=?>J-FN+o7eh2{h3>$N_0v5wU1BdC9jo)G z!NRvWVhM8hwE8ABlw1_?>7;F0`?u0Eyto50vRLPdfgJlXo#+hDTrmrMPfX8hps21Z zQh!)kJ`n#vi-RD4peX-H_P`ZH`x*hB4#qX=!l1MR_9OvC`NyRg6m4OzECSBCP*=WgdXt$UO5g3|KV7Te#;8&>uchqwO zX(i1mNT9nliS%Z%bgiBz!+Oeg;!}t9`kB6G(x%?2P?2vEQ;YBCH?{vFn4_8`jf-uUmCm(tffi*e+{%=}15_5du&(rf&BDoAI|PD%|#_ zE9!XChB&0)q1x4VnP4z!retlo?qx&er21G*3gGh4-OP%V&D4I$IL}&w-Md)Wu|g?+ zCo@g9gsI}E_2_&Zq>dj*xz*ZN%73z?Xe!g*?^Z2S8>!n@;T=x&$7@;IIRJzh~+9%q(!(q_` ztb@~p7Vw+8N})CaJtHUh5|TxbF6@dbLP}CIw;r|{C6s}icOgByY`BTFF%h8NrEH(29J_^((5#Eul2IB{#K+x&nl|Be%kYvjFqMuA9>3TaFmWm*2>2zv~KN{OH;AgAgSbBPdDl}eC z_Y4M8Bqe}5?bp{_^tNSlN(^3{U4P8kPipCTH()E)GBTUP{uS3Yav^l3bsXhSG#hSN zxFzR$%;f*^y)4I7RoSo4|6@NJkuq-6(GOb_YLS`|lyIyf9F#pV1K2VP9Y#Z(&eU;2 zq+Oxbc2WLW-ACubROdIm_NkIf<5VMiQ%EZ-AflkSx>(nqDBg zWXg;)KGI`$Py zVeS7OhkL{-1-25gD}y?mG&@PZ(te9>aNX^3{J$kDvCBRm_WwwLNa%tv4AiG89wd|u zQ$OYj97j5z*~DKxfpJp;t!NJ} z456QH5pl3xMmUhBE+O+|jLcSW@|W98Z@xGF?#q)!g=X6Sp#iA$<+mmQ<=^2fO=5;E z+%EC6N!aC@qzXeU;1^%grPUT^kEKYl*zU2ou&O&%ETv6Y-ukyHBH2Q%nHm3FGhLCQ z0y?=?t~Ta?VT(o=k4Q%YRPhK`y5F93>C&5aXEhUS8g|wQFxZg1O{)CW)g=LlYUV}nOLiyclDnY` z$4STcM8x}uqt~faxfD-FA8S_j`IqYpuF4%*y<$+o&goGk!(+1PYcB0X3rKgMfO5EH zN$F0F&?Bf9vzb3!eO`M*(YpEGhG4YYcEIuT-zcX3!QB5$$>1LXe>3#+g|_SGMdqKV z_^TtV;hj^Fa#1^)_p~XuV*4=d`n?GoK8lzY9E;$MH#MpJlZ-+jRuu4+WtNmoIh>^g z{_%d~NM$EE^z#ved2QLZArc^B3^c#r(QVrFsYCR^ zn&{g_8aE|tB1&1kV6>p^`{IO!s!@^rPUefS1twFlY6ZhC@>A8i*N#uVo4S@gGX=my16EH2J${XrTVr{spePkiqa>ZFz~lHMgmLLIR@POe6u;XH?L8Q#3i4 zHG!y?AQ%Z6IpE<2O0YJCv}p=-A6ctVkXy+MB}Vi(XSZ3#LL4rZodoCS&ea6zIA{j? z(mM?y8@xhy=M#Zb-`ND^vag5mk!72U62|5aZa$f@P>Ky3IMN=$fc zzVSVbP7Yh!B|}I3T!~pJ*RiAmkn)`H)WLDB*8yg!6gmxdm!d0G5D&j8{UxdQ_{SgO zR(fBL*-e%RCkRpbK!_dB(Q>wM3>SzS%!(WgtArAPJdpa^+d;krUvI*;R6fNcAnTtq z{ih%Z|6r;XP&wra_d7Y-NF!;!r~_Gzzd%QH_>&fCg*+n8oQ=@YN7%5A4aG|P$D?hw zZ?mEtyIRX#b{elvKbvt`{wnBMDWy@!T))qAF8nGPop?5UmjbK38ZPSDZNC0||G_^b z_1ndt=s{mB2Zb6E`9`;+ZGMaz9Q4RoyDUXgygDE;G?c9yel-bO6NjlB6@nzy-bQne zjb#$^Du{0S0aQ2q38VSMh|U08fMh##e`*gBm=WUl>1v^0jtXgVRa|1B*|=XdgtGT3 zab&K;iJa*<$MQZh?7%>jiewpWG0=>fYp9DVAK!@ryA61~oiR1rfGtcXV#w*QJ29;W z*O=xMM|t!^a?6@1!nMu?b^`j(TB$U+^;iFHX_vdn-thY~x&LNH{pn(tHrpQWFnw0;12OiqPrf;g zuho&eIhI+LIeuA`aPm~UW@93f)%%RrcP-bn@sS9fqW8f;>iX2SH>-!czb6Z2jon|< zf6>nWudgwUTB`tB+$))$cXw_?(@d7lNG9pvO`KgpFZeUq48$IG`no3$=2KFLV@0pP zMto3baZZFoRyL%;uc&%MqOPY`0}M(?NX9yDaoE)U1~mE;t`>~GZAm4{kR)tEG1E&D zD9sxr?27a`CQfICq_#Y1uRg6idivE#5ZoR5;le}e-cA_guu`?ISRH2&*7AM;Kb!l2 zo%DOH_ecAj$r}aR4k4b9aNQi*;MO$LdNn_V0$j7bByg}?13e|*PwCaGd$BJh4A*cx z3lq)+(8eLV#Dg~;lSqkN?Uv<+ujPsNvcU4|QmWhcAOS4{UZ5`NzozvkSkW%odZ3=- z0(r!@6S{Ab_m<|Cwli~uIhmh-bFo{sj74X<=X|l?W||7?*AQTd7ZnY9AedQiMN_x?+7SI?9iAD;1)Lk}ij!e4!fESZ;?nGk`9vw1D# zwHLNUv@K-BDcpqENfb1N$6gFGtc``6EsgRup~ST#vTvE`deXVE!h6$P*C6HA3c|8l zOEgDSIK#?IZ#4=@Lb9hp$Y7@`1HM`Kpj0jSWvW0&@g|42HZARn#2QZ_)J|6 zFM)iB%>>>IX{i`b=-@;2#>1hMYf1ZvaJ}q)QUTu1+E3lRs@@^kniI@4#Z-vPeAzW% z#{XnU)gH-ar(DA*Lb3P9T8JEL*N9?b zjfU0hI>51kNOeCK%a0qSaxh|V1+GF-*7QNEnB6nBjQ}Q<$9Nn6*b}o(#kld_ZJq!WGZ612U_ikSS4MbAWRh?ko&-Y z)@=`#tCGgbyY97-#kvgCViZKW3f72+{pctabAtwTWN&K*tpmsqtADG6C)F;+`alksvEop;I-hs|rRPxg&bEjtJ}QW}Gb|?e4mPvYrTB6KrZ=?+u39(Q70V>M zZ?(5;FV>Zp<|KZyO7NWm_kWfk*2e?DGIp(|f<}%irr;k`oRJW|%|5$o z^JsH1&&LswWNWJ}Xoto|Sy7qhP%RP|`aBiCEB>vr*e1p*)O+4fL$LB)wkJ10myjgi z@v=a3?{>w(*&Mf4^uen%;$4R>laihiMmV&A!rOSi-9928Q53MHg@xb zc_JSQ>E()c#1^vv_+i+R@!S+3`zO|5Y0q9(gS(?H5#E2;JC0lD;Ky^;kMHe`$+q5+ zRj85AA4O(;JbUo5=bqUwy&5>|zpz*Pb^#|w{I1w2!zbP3i@PRxfXK@_0w3$2#O1Q{ zRVeD0+0{HX?B6Gxn#b??8C5M?d`Zs*7nAc1358QdCLD!wHIm9g8#?^eKyVULHqpq< z0Ik(ux?ENz$?iDsHEEIF&Eod)RH|b_tk@=IDf30l&1hd6#%My#mfxJ3298njVFQva zW)M!pn@pN?$}vhrSnAnX$Q4viM=soGjHlV9v5;*|s2DP>+}`l_Z3g9=+NK~|6?)3s zx2}*o9`;hl{>37rVu_iNid(}b&<40fPcxO|kR7e)fAdbXZ79B#)+`IYTx(Q=NK(TO z@%VQ0>BATOEU{YnSpAk-THa^PSC4NGHoFr=GZW=zk{|6qPiw6U{NZJxRk<sd=?~kFG{$|Jmd&@+fv1YeUr#yoFbOHlHJ`>#r|DH+XT0fdy2ky`effX{-_= zi!`(2eik!RkjFi$M4yq@zsM5ZxmCj9=mNiu@cB{!8*vk6kMvmVb4}L4(7N`*o%we3 zS5xXRRTPpF-ix1F$f@aYY`bmbw!*CR66z*@!L<3KkA`dsz(-~&oHv~N68Lq>6<`NBtelin|dIq3Q|KUCAaZ*cZk=q;6_L-y)k z+txO|y18d%1aO#2U`e2JDOZ)y_?RH6uef>CC;?C`37V;WMEHQe!3tnqFKoUndZ#93 zdE%yU3Qx~St$Q4?bRcG;P)2IfSlU*bWWh}07a&s}dES&-%xAV_dZujp^MxoUOW7uE z=>ir@nLEQMhHL6h`B~J>(b($jsP#j1ymf;Yn+t?2g~cCs!_!E#P!jj29Afv{QIoATKO+E5b!otK4(wITml+zlE6B zE2mv{-Trfp;08R?=>yafZoG)J+3ZgBuR<9T^HK2GiPNa#G91HEOR4TGXvPu z>@$`6A++%2K&UfW(jn6`fzUboc(KCMEE5CGZSuf1n+rrP;~vn{*Nntfu69sxj(IXN z&Zx-%hO&x5>yP@4M#Bc9eoK$j%EVs=c}$i@CGUj4ea~M^|AB&X-$1!l@NJ)*ySvRb zI1_xws@IS?=T_U)L3p35>kfK zG;DG)tXsDG4hm4!oKqN__Lt3Jxv4miVb}A&j=uiH#H_?k;C9ThHXOlA*i!SX(K@x$ zeK%8mOqtIL`NTXV@0XKu+!S1u#P_1@^M(7VYX|K@ffn~>O>)Ts?Y8c#rf!B=aq!<8 zRsPWkbi{!bE6f+_Wri^DF}hFU*A7Ox5UYU&f|P?jaS6P}U>+AS)=49t{ihUgcTKZc zApcmZkF(Ld>*>1Z4K88vO`zm~K*q;z-U$2e{+jNenAK|lZz@CvGXnED%f%vXa+PW~ ze4XKHS@F#etdZIltXA-j1p1M@k;8&Vd1ws19lvz8b~6tzT=1<$(|6L=YyrTw0HI}l zWhWhhJGP27W08tf3Ol-Ii|qbEHmxC){T<9^(5uB;)m8zs$JDv!r|8K~_sDYK1B7#3 zx#9@k^aQJmc|w?p%8Sa(^BPTss~7*T^4>eHscdZ<#&Jdk1qB2I6r=6ksLq>r99CTatSPkN1eAsJSV!>H_eX&#?iL_Eb zro*p(OcBtN;eRTGJ*V@7t%@3N)es7mhEMFg&H6_bkGWbnooe=K_nH_P|D)A2Lyfwq z+Yb+;rP6niUbxLuwUey|fj*_!*bZXU(2%?OSB!{xMpv17hxxxrHS zjljIczE#T3UYc?bpMQ(}zgOh{{!y{(bHkeDW$gQ|<4YOPSGh3r5jZVtm$N~2HWnjX z3s}85TgO`c@}UqiY8ow(HOwU1M~YJ<6grgh8&!kW|2ld9M{ZxL3p8C5zqY^MH$w!S zXK~+?Bk89;i~zXD*?4s=`RSMjYY~AId55UVssOCE6)g)H|jE? zt<{-LR0nf=*L32To2S9ksO7vE%Tne+$yiC#vbr!c^FEG91RpL~lsWHa;r`x`Ci1g@mLb*+baw2djTwfBt8lRVum%-xwncGC7^J3VUKw*_wcx zh*f5_A!dC(3|ssP&p`hX)scKTaNY{E_V_RtjePKnY9j(qiX7kko+En$cu z#oV<0L&|V2e11o=DDr1ura8K%>CM`{))cG}g@h+jWHc4CQ}7+tGuY}4)RH%=G&L+B zR?f4Y!H+eifh+(bTF7dOxLwBNs`VtFN};22E2BWdJoH`SeG07pGbvLMim&@h@Mc0? z++KX4(uMcY->EKrIw4SEhp@#;PI`2&D2BLTInDZ=ip6{sETKBaKkE4K*+g0|UA!1! z)Ivm#!_YWWQ}a7jWj?_7*j-fLG^sbYqLgwma`C_(nLB`Xs*Tyz!5JeEQnu|3eo)(ltPv_m2a9 zNE*#>A1E=SRgKzK_OcOM?;EvO*DrpcqUwn{Qq$Sj1-3Fk1L=7q4n}f*^s8F1Twwm! z(e!)HtI>B-j2?_{o3Be-xK9<1f77oH)#34l)&ZpRQmfKwg-pp5*T-rLzyg*~M;n5Wf zJNuIUWUTGU`47Bb8F7X}!rDB%!tuJiEUK)$A-tK&mQn+nRs_XV429BLih&a4b`^ttD(^IGhYCbhpq9QQc$EI$L}r zsPc_pXwvpq*LUMgEb%uE;El|IvAWnHP_Z-niYQmRF?p=C^lqn$iW!cMvN!MyS!%y& z1R`!c?R@fI_4_}4M`I8Z;~A6OTsotPl(Wc!M9xS1xvTo{6DTZQmcFv}vMW)w!hD(W}Z3&dF{vr15_by(b z?Kl>uQ*!uG4bSLo)YUaMDx7>RQYgV`5(&}~Qjr*<21|k*RC^*KAy8z#;AKYEuAGP>4Ze5GQk>(-alXy2P*;InoBRhw zkvWQJ3G4r16^;K@J&rdfiB(la21r}^3x81sv>d(`6W^z1MSGpnXxeXC^!Fe!wc#af zNCmQJYgp0E=0NRIAI~9Z?0CvX%y+8Z_D$2&oE{ayxkYy~FHD#^604RDvHsnXdA~`l z{3a{%zg1#oaL%ZqH+Uksp06s_g)!9f#o6WfWtV0NKnt4>%W-`lT1@PG>5=UjQX|Xz zRrU-xRw8u<^K2!9doa(GSmONDOYV-Mg6vEAx~HtU1w+4zf2Wf6?Lp(e?NNWHVnsPx z7V(gwGB8m8?;;>Ef0Y!`{aqa8uNL|v-H|#)=icPHQ1=X$TN78je^I!(&bK^u4@G8T zisW?~%JeI=OJXj}-2u1{MD+8VAyynD<7l&I9uIjU9@wpB_m*%R^`1$%QeFSx}pSVV=}qpQOW%U_GuW88MIQTKAFVpU{QH^Esa3x z9p-c{08cE{s)ug=K7amG%E0Fo<|C(<`HU>6P^d?tFxOb;Q=Q8V`WDOfooa^bAh@-C zq3Ye#w_AwI9|B(g$oKZ#rPFFebjR#TRDki(H!kmG$_CEhk5N_1F4xC;lD8jmEEilU zY;_G@U_lxkezTWi4vRbfg_&S)akI9Uu>v==e1G?P4;F}Hh(5ihy=c}WScPpVi9twd zYu+&%Wi4Yz0ra1|+35e;ZE!`B^AHo?H5JmmPv6OV>(7>opX7u5+_0xW@$H!Fgl{4X zRjU+jsW5h~L(cmbs9!6YiU3J^oEJERav( z_NSR1XKfq30HYR#d7qWzB*8O3TPeWgfdeQUfW;_rP0E*wiug5j^T+De&89nrF|Do^ zKJeXkN!JCA>vj%(%_EM6rR5Qyx>YCaO7vqd&M+w^gN)f?7Wmi}=_Q;t zDU{oiH*VN5i(Ed^l5+Q!v8g$$69PN9M0Jto$2 zNo)^H{6WwVru8vtfgjb}U#plO@uh@N914y#EbYkpArTzP)yhR)(Mp>3?o>mK!?l}D z6FtNpCbBvgZD#N;6pVO$oBje7GY2n~<*x+fMtqv^R`kNSn!J*A92L3cHF@tcuw_nP zLQqSZ)ob-i=apx%!k=`o;At}q#{Cn8XjoR}GiH2ZyuJ*wZBQ0pV*1?8JfQXUF1EmJ zaSXB2&A6&}3$7^+yE#GYSuu;W8H1s|0G!ruAh_gGBKFdU+FiycnrQjg2UE)gH?8E} z10OA9pEVFzIPO%AD`Qa8ZwUKla7*X2^w@{L+)I}WY3sDZVfYPmdF_z3D+8!prfuei zKDjfq{$=`uoQyqE{n`l*fj)E-D=~8LVJT$BXvA6&1O^=zkFRwC+iYnv-XDLQ# zGEAXci(WTs_B&OJ@HAojtjh&NYd?5GGX75Cw59mP%#*5R3vcBN+GqUczVD?hJPWC7 zwkTu3tN*l${_T*)`)q#^d*p+KF+7;^e6ZG}swstjduYT#SCN*NL zAXjJ7$N#k9}=9Ed2H3Y{6N9r1M$K8~JtV@yF-pX0!KtQydKO_SYWi5uHCx zk4+0I_$dr?eZA`LDV&h616jDgU{Wh0qa!(3Z3Xeh^ZM~SazLzIInX6;2 zJ6_r{HAX}=sJojOc`bH@ih0R0WfZ(x2JKg4$+B?r6%L)Z!RlZZv88xWMmRsI<5E(6&fte(r5my;GXFR)F3op${37h2) zCbLpdx?Y;Rc|1!*fgCU^9Ia3wJ9p=_v(bh>EHn7bQp7SAgNaj8u}W-KGik4hrk`R? z%5bQ)ZYR4$r&yR8EIlk_cO^^2NjOrcT0m~N4}quA;=Gvb^fhjIh4r{ZOFkPfN+1hK z2X1wUSr*OnNpQK{o>5`sFjfz%ZcKG+&H90W)GQdCD}IehC5_8-Ayw;LgtHCB~6~mI;z!DgzbxC`L zzYVeX>!y;5X&l|g;M!5vutus%?($_Z0Q@VlOa_YsVmrJb4);h~0DL$bG~G9E8U?_l zEDF2T^{7nBn46|0yV94aoXM$Z-4iOnv>2`n0;Q~E8n!oP_;@_F>l*btdWQvnL<8?I z&VYwfSwieGn%{P@9mE;>J}DUDeKA2;eQ@YL5iSd7IcOOvW~&BS<8F-fe-zIGyI6h zJ%N;=2;?+tFb_G7r*dQ2SGw&}=`)|Zki44_a-42<>A?aYMG03h6tS2ZH;*SnCGHH$ zDqJYI=`gst%V#GGT<+cfTxsyIBqWqHIO|v33m5bm4+*%vDXmiVv<&;+ z%BMj8Er8#!C{i9;s@tFI!Nj?gXXEII=6~IzlK~F@T^wXk5oj&sL%qjAwIH$iWzax7KAm4sfGIeJGKUWr?{Ra3t`NC7MR$UK{(aK@`;^Bw`|nid z9Cw1h_|%)<5&CStt8%8dcA@vlpImyq*V#4FO4R<@98bittXLv<7QzBCyfke6N|hfT zgV$z=ZD)soi3~H!S27^RL8j>x0k;Ma#d#D7H@QLo`QSWwn71mSWJ0n|E8=Dtn~=Bn zxCE@UB|i|v_TUo(c>_JrkavOBH7a1jaQ-9|HoS?b$lzc4=`kZf_@=ECCt}e&e*X?D zsRD#ANb;B9kt8Ihyb=)>@lcq0@wovqnz!Za12V(Y&Ak-#079vc^hm&EoV=boDH-EF z2@xBKsii8g8ZOR@)xstsKp~}>y=K8T-Y;0` zE>QS}7OH?x?*#@A7kNS~n=W~YS)2$#b~=74~gh8TKM)Nq?$W@s*nf!Z#aXzn%X;E)F{OrXYPp~W5UE$DDu z=$;T}+GE(N&M6rzMhr|8HgVXhY$SE&qNfJ8;*K{e6@sPnqE&g{N5-~ZW+ujQAdmn- zS%z3>LB+G;Sh=WW1~C>xXaC~$Y+q{On2sTB23CkH{k@TV@w+Vc<>`A?g8e3Hl6@u! z!A+dFZAar`qZYP+J9q!Vble1QFT|xzdPuFxY&0J}LXvoa{}RsnK*hpHQ*jRiFzT}J zHADX7Fc)dpsUoOCmy>Upwm0N}ELYaY0G)ZWLvz>i?w()%9IJF*M^QwTRGPgo&lY^@ z8T<_%+;H)|#CNL0weM7CBj2f>Uk-tNr`jI;PIZj`_WAl1%Cl%H|2x&5!TCoee9ljB z-U8=K`3hGe-;eZMuKD|*r3>z9+O%yh|0aCoY>NxJ8l;gEb%#o}+r!JudGyo(h#UM;#3@0ODbQ{zMUwy zsoF>#8r{0XBp#zs>B$e`k!`vAZIu#a z;{HQ=3~CJg5VQ8w;A4re*X%U(!?9|yl!=^WGE$zS)S|;JsRe_|irLeMdw7I}y;)*q#Y-7*w4Ro6A0)XrVI*ZJHT_9Pbq37% zjqS9WiXEfB$;IJqms8)>6eN%VV0EASXYb5{D;aTG65V##+OlHtwJXPoL5VMZ(SLro zf@{I=jUYuXw^n;Zcw9ul>#;)w8aUiblnNEgo3?`J1@tt<1=$XC@IL-d6*`G153Wxs zcZqbj_Q4FBXvFFh*ahG>4aQX}yEV8WL}*060gq(KK9BweJ!`;qJ>2JstKp0tjKg$y zEH;)61q9X&^UX%9^5+V2GWRG-_x6UbCHV+B=6zK{IyDQ3&?!2o(H*|-7<_BVnDe-$ zu5ZeW#K4by9Us3$UqW!FD)-6K6S!ZBc78^97gIk)xwWQ`O_f(B$!uPNEA?`o+ru4e z%|cdppUh8Hn9FaZ1lJhP)D=3&aiTBN%|uPi8CIRYBO?oXJeBz9?$k3?y}>)4zC_Mw zr>zBP-In(jatws_A6=TM%McwnOOx^5GVVLUZQ-7OEYo83hPQ5 zJrs}YU8zxFk;Gp=?E-^m2#oZ^|29@USB3dM%4l!9xGT$c& z^=ufA(m>R-JdR_``$$n-zZ7*^&;8g~p*5gCYCmmkThP*U#Z-*{4pLsw3#`*XX1&`% zTE@Q^TX=xh?*6(Ej)L7hzW;Rmv0+$#r$k0+B1mJ8uWzWGreZYe(?bE6h0Ad zGq&-?xjRq{{(1l%t;yHPhfZ+tOB6BST~lAV&+wWl8`kgrhW=Qdq2ggV#l>Q=Y_Kj- z%&NhCMBYPRFduHSDWc)s0d9lb^W` zP8sQJoDHNOe{B~W11Jfxjq)iuH0c?Bea)r?K-uLw1AtXxW}2|to=lKNx5Gd#c1qXw z&8_Ewef!RN4L-IeDsT@$qlZHg(=1j=>up-@`dk8vB@-e#NO zoDeu8a8#HqFg;snrQ&dd1TxDeNb(-}9l?KKbg)_TNx8Tnwp}#s^DM%x5iL$jx6sF&?EXm(j#UQYdoQ+L{oxS*=S(Km%jZt6oHj*DE=AEfVT_y%<2PPis$8rt z-FzR-H(j^(48C8B=hX<83~A`bs;QYL)5ux=4~j9 zxEUw(8eRmWk>*o>mXu7Spvvd-Rf{6XPG-9UmsHLeBL!2881Lv-aw#CqQG;@+y3pyh zg*UOM#%KUiTsXO3HfR0Tb-WBeU2hYw-Nc85P{GxtapeQmuh@k#bMKwWQiCQ}bd&Z} zK$hpyMVi_9e(Fh-fY|nQpzg2R6@prm${FTOOYs^I=)ti*W}b0@2K*qng=P4 zEJ|4+E`fNH86K4Rp)?vw1KvL1d?$m_^zql7xRH`^fRLrc`StHbWk8c&S|@j_g4CDR zS1+8^y%xUHxGiWD>uo!!suTMtYFf}%M9P2u{v`FH3kVLfnRq@cGwMU+78!_5Ry!{pj@#U&`GZTe`h{OVd zfhPDRFsTquoV0^aCW|N!nk5QIkWCmfbu3dG&rMnh^%k)X)7SOa#?HB$Ep>ies{8`z zYXtEkB^DCYN+Va)>~r%if7YcJCI@_}MfT6=lLQZ@?}x{GLbd8F!n20_+oj-+YD0P7$)pe_(Hq4T_LW1K)+TUqzVIni9GDy0aa;(4 zqXFTH9X-=}`QcYA>}AtF?h6%R#~nzI;-Y+;f$cXY`E@$=^(pBv^U80i8pVXU)z!t$F|0X3CQDJ!E4 zhS{)z0n`d=pjmk1f}uf}p9x9NhnJjdW(EduQaH|aHr3%y@IbAfLf-mwYoo)y}igVQfW3q%piCeaTH5tzwsD3xKB^84Y9Cv zT`;e@rWI8Fm|V_QPr}c*?Niv4MRLW~#)cS)sG@DWTw-?JCZ6MkVg;F|Ix9RtI?JBg!Fgj~Yx@cbb` z)GG^C6wq(5N-mfvE1nv1uIV+~aQLA&@1wuY%S?Ff3axUUQ51=q`82^tN-sSwRLsr^ zd^ZL1or?cqP-040K*QvZBD)gp!RWcA`Q5n1W2N!B?^G7+k2f<;kg3`;%)Qd?=d_*| ztjC@Ox__ry6u&!W*A!spW<`8j1+H@{I8$MqGJ90YbzaaNo||2oU109R4^Mz-m?l04 zR|tHqi;XHZuiSa{9%sV%OhNA#D6dXY7cWR?Q`lt?W-37DMWJ@-3(~3DN}svLZccD- zG!;zy*y@#gCq(}`6K*I&-1s#C1!l(%0!CS~%zgHtspY8rhhelLFCnUp4g(+|TPeE@ zgOrk51{mYw=%i*0@e9AFeRWD?p(y|W;f8vhEp&SiPd=1t&XoV~)t%P<{#=%uQ5hs^ zgXGuhn&)Rxdv$LErmTTdqcAsT#==+pUL5re!N=6N>Rj&yBL?hD1fDVJ+v5i!T__GI z&0s_9kV7Dih1j6#GQIEFdwkm@1o2)nd^L=Hkzd;2ldRMmrRsY{yY4@=b)Or&`&1xq zV8^J%TAlPpC8TI5nP3@^ufJKyy-%TG91Dum_dQWE*0j88FmmqjAnwx|tI&zlz29kL!yE=4@K}aIS2bVs?TD12WPKMvPZ~e%B znW&|hn&8S7GX!4FEqpX?8PGg&i$E_rx|-2f*QEW-tM|E88fvUTWbAI0d6~hWeqfOn zzCbUWWUc~+CgmwcYHt=dXPa{Oa8OtuEA%x7_o!=&it21Yk>mPzs!5*RpYvcUpPRZl_f;w6#&YB8)n0)&pi{4Sob$|Qr=Z*b&4+Gxdqm(Q)VcV;-}E;$5^!7Rsh zXD|B2i)^@hufFcs1YuV^9BNuTb6k>D%6o2Tl0KsodXle(M3H z1AkD*b8^R=@B^E#-Pq?o?-YO9R00f^8?M(OpdT^VoptQK9)+)Y5)5j85sSN{iw{+ z^XeE51*03?{xv1t0?v8w+x&E=4wmdWt@ zjrj4mTVvWdm2dRSaw7QFTfZ+gLWY{vlLfp>V?65l!c58!R8m*1?d?vcJo0tQ*wrS0 zD#;8+_(Zz2y>Z^H9;Z5QJaOI0Vyj^!Ea8+6K;f|hT?KDIz$sX};QL#LZ~itL|29kh z{%JIRfh9iOh6sWTrkPQE(H|DWVaIMeUk>~9lH;$wrTP;rJNEAd{GRwzbh*B-*hsW; zP4hMmQLBv##i`kAt;U&Z7Hi%Qc#YznEiYx`fa>_7J~>HoCDVBPgEWCzycy0Agky+^i9e#oIy*%g3q&@kS-Ubql3y6ipF^mxMXf<~H;8 zJ=DWJ0Q-EaU@W4%Ol0xe^0)a+vnDZU7`9zmRA~syCS@tGX zYuY1ETwQhb;KnBW8*4TvnzYF-E>3?OEaJlAZ}92L^{zKN)8|qR^>tN0W?_dn`=JcO zMkbR_se{C6VzhBYsbr3GMv{39QGq2^*2${QeR$t>$-GwRo@2l%IM>m6b|BHV`&DxF zsGNto?o(I&bYEDIcyB40-Jrczwc|KPY^2SZsr0#r4yjbA#JT)%WY%Y9I7xmFLuT7&B*-P z`g&W4Tz(bVc`=N;GV z>1h`*k-c=#c}uVy^Ep|be};VR)?>KCL$crjM!TbE2#|YBKkZrypmuvN>51gQPQyM> zHq=gn70g4Efu5EW9)l^}vM}y0((>w-IYLi(x{xN(U7x?v?NO)bTuiI>%0jMILGt*G zRLel&qW>^>&$$Y7`8;O+n5D#}r!OaUH%FVisoqAErERTgm!?`0;p?oKH@6Ty*14EK|F|r%q}voNmaIB?NE6M^w=f?@|1CAr*v|#NSK0StVYq1}MF9wisTJ0d-!@<#_3A#n`+vIUZW0u2g(Cb2MT3 z^B{7pm{oW^AywQ$6NXeaEnAKM*|0bC2Y)vPWmHIp2{b!aR>{CbY9;{TWk-k#`WmI5>YPxLa?MA~dz~VIf|%+NWy& zQ`Ox-)0I=vPQgEq1pc4Vf`lCsoyO0zEGv+FN!!Bn1)aEF6pmI2S~<0PGlR2IOmfPF3}Yo?OoTAF2*Tpr6=eF zA>@A36oSiTw6wISrPrDBYH6v!2p8VmgztOy6YrI*dQ7D)ltcXpViTbZa-8<DA%Nks#JJpLrHhiox+W)h3k(c{{DY^tA=)yUg1zSo(oll_&K z+awBsH_ayQkBoH1t@D&f%87@71Ifk{_l80xutf*T3DON?j@HHX6PT=`F#taa(cOQ2 zhy&K2JYh_Jrt60@DHgW4g&m$^Q`Q@%YZ!JBC-G_^N+%KeMLnbVr5^J^anWG)Ma`gy>^Ob3bLQQMc$oXa zkF(W_q9-Yxnr`Xen$}mno|U7VP1(6Ez31q~N+BHDmNJ{3C-&7{g(&W~D&mjCExqgp zK|pA%O5YMDk$zVkDyE{M(#|b5#?5Vu3iSIZ6x7(9r5?@>_350HKU_CYu*zLZJ zZ!sHVL9e6=faT^}Lw#+M3{E@RD)~=lHkS!=>B@eH5Q~^Yj{&L8s;b;s6I(~!(Ytl8 z@3b^vjJs+IK{^#1M_NwL%G7icnQ?5drVV8xc5>+wftV|rVJeMX4-@HuBquQuHVQ{U zgUi;Wq?-L_oSV60v{6{)0s^;i^5dzyI4L8LDYQ3MU~vPt5?F2;{Sw^6sI!-v@Wc)_E@>4v{XS7YlAPz1C$V_t5n%9DByX9D zn%SCt!BKFoKDK-5TpZJ{$^vLr(uFZ!M5of%8}Ge)CTxbHp4iQ7QrA>)8nojOaiYB1VcTc*M_hlK}w7ub|1v4 z4UooKNhHA<5XrXux$)^}E^JQ1(k4=FPK+XYQ;;%r?K_p9IXGy(>zQp%e!l`LzMQ4j zxtcB5Yw+mBj_AHL#0$QD%N3w6$W)hfulagGdB3Wf!>RoxOEH^@Th*z$9d$CjyT=Dg zk0+YrY`AR`6;i4W5D%=D%Ra!)$JJ*q`P@2T$H`@jxR1L?eA~?bbYa?d4Vkp@ys_Kz z_3&v~e8Xk8_}n@J{K65)yIFUqPVw`dHpQ@Yoxl54EIi9S1eEOziMZbpF; z-_jJq$f!!(An!4&{haLbFey!s02-8P#=mif7*6Q`?KC7%vDR5@2fUP@A)L@O^&(4~ z+5F7HQz>uU^Pbj8cEaA4YL|598e|)ihmrvWb8ZWeO#Qoug&tvGUJNf$w5}ujb7=N% z=+SdKdFW{aFm<%l$*IU>gw5|sdqSRmdIl7l^r}B!VfG;_f4)i5f^ldzH6p)lMWi0d zc1KdGbrq5~WAp=dYW$8`9KxU&EzRJ^Hv*ANDTaatp&Btq^xKn99#p0>AI6Fq|NMG8 z9k8f~z^SLs`<)A-$gc+N*@f03N3lnVsED4CBsK$LPe0rk8@BnYbKT0DuQpY}gtl7Y zipN>=992^0VPwk*J=CPMz}X2GH8^PDE=$DUZ^C~gaYaFSr8CBU!=7-FQ1e`tn^yMKu8S>psBfZ+0~8OS;PHe-^7TPa&OW(Oe_O@P;m6B16`BJ zGnE&ql6BQu7WRtHp@|9Y5_fs?R#2%Y%)HupG&5?@YIr8%U@_)d|G0F+NKHN*w5n-iUrHaHhfqltIN*jv452_RIN-x; z%@2evrM8uOD?gPnMR_UD6(2-}t~C4tsJQ~8!?)SBMGQ~wW6k)V-mS&)<$+}!UL=8A z8kId8-jTe@e=(~;SO4BfDFY=k0^+G8h3hdKv*GruD`q zXKW7ZfQGk(8}u{K`Y93Hz+p&|2H;*ttQuHpNmn z2bxvDyqZwoXwwf&L&U{%3rp$tH6@)Iqr@OY@qzwFcM#?-Efi5Vgl6fLj*ggyHkmr5 zSO40Ef0rX@C0K!3&ZPC4toUF+x-_4qmZ<^8I|?eT>V>5CH5Sb6$=H0Eau@^>ov(N8 zu((|8#O!vHENpR6#TgzB*zZ&-i|V7RP{$1bph|bID7<*D$~2Xxtt$VpOs>hr8fp+Y3j9XAvM%L9v5WXI~vEInoF f{-Bh9o28V_T({oy_J0-#{%=eDUpyiB`^5hP%)K4} diff --git a/docs/images/treeval_synteny_workflow.jpeg b/docs/images/treeval_synteny_workflow.jpeg deleted file mode 100755 index 01168b3685af9c188e434f9e8171c0fdc7b40f44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19130 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 diff --git a/docs/usage.md b/docs/usage.md index 3c22bb76..7769c18d 100755 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,25 +8,30 @@ The TreeVal pipeline has three requirements before being able to run -First, it requires a .yaml file (described below). This will contain all of the information required for the running of the TreeVal pipeline. +Firstly, it requires a .yaml file (described below in Full Samplesheet). This will contain all of the information required for running the TreeVal pipeline. -The cram files must each be acompanied by an index files generated by SAMTOOLS. +The cram files must each be accompanied by an index file (.crai) generated by samtools index. The gene alignment data is also expected to follow a particular folder structure, such as (using data from the yaml below): ```bash geneset = "Gae_host.Gae,CSKR_v2.CSKR" -{gene_alignment_dir}{classT}/{i for i in geneset.split(',')}/{cds|cdna|rna|pep}/ +for organism in geneset.split(',') + path = {gene_alignment_dir}{classT}/{organism}/csv-data/{organism}-data.csv +``` + +Each csv file acts as a file of file names. Containing data per file in a format such as: -/lustre/scratch123/tol/resources/treeval/gene_alignment_data/nematode/Gae_host.Gae/{cds|cdna|rna|pep}/Gae_host.Gae_100_cdna.fasta +```bash +{organism},{cdna|pep|cds|rna},/lustre/scratch123/tol/resources/treeval/gene_alignment_data/{classT}/{organism}/{cds|cdna|rna|pep}/{organism}_{cdna|pep|cds|rna}.fasta ``` -These folders will contain your fasta files. The data per organism will be described in a csv file found in: `{gene_alignment_dir}{classT}/csv_data/`, for example: `/lustre/scratch123/tol/resources/treeval/gene_alignment_data/nematode/csv_data` will contain two files, `Gae_host.Gae-data.csv and CSKR_v2.CSKR`. Each of these will contain the sample_id, data_type and absolute_path. For example, `CSKR_v2,cdna,/lustre/scratch123/tol/resources/treeval/gene_alignment_data/nematode/Gae_host.Gae/cdna/Gae_host.Gae_100_cdna.fasta` +It is advised that the fasta files be no larger than 50Mb, this allows the pipeline to run without wasting significant resources on large alignments. ## Full samplesheet -The samplesheet for this pipeline is as shown below. This yaml is parsed by the pipeline and converted into the relavent channels. +The samplesheet for this pipeline is as shown below. This yaml is parsed by the pipeline and converted into the relevant channels. - `assembly` - `sample_id`: ToLID of the sample. @@ -51,14 +56,14 @@ The samplesheet for this pipeline is as shown below. This yaml is parsed by the - `intron:` - `size`: base pair size of introns default is 50k - `telomere`: - - `teloseq`: Telomeric sequence + - `teloseq`: Telomeric motif - `busco` - `lineages_path`: path to folder above lineages folder - `lineage`: Example is nematode_odb10 -### BUSCO databases +### Note on using BUSCO -The pipeline requires the use of the BUSCO and AEA subworkflows. +The pipeline requires the use of the BUSCO subworkflows. Create the database directory and move into the directory: ```bash @@ -68,7 +73,7 @@ mkdir -p $BUSCO cd $BUSCO ``` -Download BUSCO data and lineages to allow BUSCO to run in offline mode: +Download BUSCO data and lineages to allow BUSCO to run in offline mode. ## Subworkflows @@ -120,70 +125,7 @@ nextflow run sanger-tol/treeval --input assets/treeval.yaml --outdir -p With the `treeval.yaml` containing: -You will need to create a .yaml with information about the sample you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to follow the structure shown in the example below. - -- `assembly` - - `sizeClass`: {S | L} denotes the size of genome S = <4Gb. - - `sample_id`: ToLID of the sample. - - `latin_name`: Latin identification of species - - `classT`: Clade name (as used to group synteny sequences and to complete alignment/data_dir). - - `TicketType`: -- `reference_file`: Sample .fa file -- `assem_reads` - - `pacbio`: path to folder containing fasta.gz files. - - `hic`: path to folder containing cram files - - `supplementary`: #Will be required in future development. -- `alignment` - - `data_dir`: Gene alignment data path - - `common_name`: # For future implementation (adding bee, wasp, ant etc) - - `geneset`: a csv list of geneset data to be used -- `self_comp` - - `motif_len`: Length of motif to be used in self complementary sequence finding - - `mummer_chunk`: Size of chunks used by MUMMER module. -- `synteny` - - `synteny_genome_path`: Path to syntenic genomes grouped by clade. -- `outdir`: Will be required in future development. -- `intron:` - - `size`: base pair size of introns default is 50k -- `telomere`: - - `teloseq`: Telomeric sequence -- `busco` - - `lineages_path`: path to folder above lineages folder - - `lineage`: Example is nematode_odb10 - -An example is shown below: - -```bash -assembly: - sizeClass: S - level: scaffold - sample_id: nxOscDoli1 - classT: nematode - TicketType: DTOL -reference_file: /lustre/scratch123/tol/teams/grit/geval_pipeline/geval_runs/DTOL/nxOscDoli1_1/data/DTOL_nxOscDoli1_1_FULL.fa -assem_reads: - pacbio: path - hic: path - supplementary: path -alignment: - data_dir: /lustre/scratch123/tol/resources/treeval/gene_alignment_data/ - common_name: "" # For future implementation (adding bee, wasp, ant etc) - geneset: "Gae_host.Gae,CSKR_v2.CSKR" - #Path should end up looking like "{data_dir}{classT}/{common_name}/csv_data/{geneset}-data.csv" -self_comp: - motif_len: 0 - mummer_chunk: 10 -telomere: - teloseq: TTAGGG -synteny: - synteny_genome_path: /lustre/scratch123/tol/resources/treeval/synteny/ -busco: - lineages_path: /lustre/scratch123/tol/resources/busco/v5 - lineage: nematode_odb10 -outdir: "NEEDS TESTING" -intron: - size: "50k" -``` +You will need to create a .yaml with information about the sample you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to follow the structure shown in the full samplesheet shown above. ### Updating the pipeline diff --git a/modules/local/gff_to_bed.nf b/modules/local/gff_to_bed.nf deleted file mode 100755 index 6a2ad9c9..00000000 --- a/modules/local/gff_to_bed.nf +++ /dev/null @@ -1,42 +0,0 @@ -process GFF_TO_BED { - tag "${meta.id}" - label 'process_low' - - conda "conda-forge::coreutils=9.1" - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : - 'ubuntu:20.04' }" - - input: - tuple val( meta ), path( file ) - - output: - tuple val( meta ), file( "*.bed" ) , emit: punchlist - path "versions.yml" , emit: versions - - script: - def prefix = task.ext.prefix ?: "${meta.id}_${meta.type}_punchlist" - def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - """ - gff_to_bed.sh ${file} ${prefix}.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gff_to_bed: \$(gff_to_bed.sh -v) - coreutils: $VERSION - END_VERSIONS - """ - - stub: - def prefix = task.ext.prefix ?: "${meta.id}_${meta.type}_punchlist" - def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. - """ - touch ${prefix}.bed - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - gff_to_bed: \$(gff_to_bed.sh -v) - coreutils: $VERSION - END_VERSIONS - """ -} diff --git a/subworkflows/local/pep_alignments.nf b/subworkflows/local/pep_alignments.nf index 3dd99ae7..8f12e91e 100755 --- a/subworkflows/local/pep_alignments.nf +++ b/subworkflows/local/pep_alignments.nf @@ -8,7 +8,7 @@ include { BEDTOOLS_SORT } from '../../modules/nf-core/bedtools/sort/main include { TABIX_BGZIPTABIX } from '../../modules/nf-core/tabix/bgziptabix/main' include { MINIPROT_INDEX } from '../../modules/nf-core/miniprot/index/main' include { MINIPROT_ALIGN } from '../../modules/nf-core/miniprot/align/main' -include { GFF_TO_BED } from '../../modules/local/gff_to_bed' +include { EXTRACT_COV_IDEN } from '../../modules/local/extract_cov_iden' workflow PEP_ALIGNMENTS { take: @@ -91,10 +91,10 @@ workflow PEP_ALIGNMENTS { // // MODULE: CUTS GFF INTO PUNCHLIST // - GFF_TO_BED ( + EXTRACT_COV_IDEN ( CAT_CAT.out.file_out ) - ch_versions = ch_versions.mix( GFF_TO_BED.out.versions ) + ch_versions = ch_versions.mix( EXTRACT_COV_IDEN.out.versions ) BEDTOOLS_SORT.out.sorted .combine( max_scaff_size ) @@ -119,6 +119,6 @@ workflow PEP_ALIGNMENTS { emit: gff_file = BEDTOOLS_SORT.out.sorted tbi_gff = TABIX_BGZIPTABIX.out.gz_tbi - pep_punch = GFF_TO_BED.out.punchlist + pep_punch = EXTRACT_COV_IDEN.out.punchlist versions = ch_versions.ifEmpty(null) } From 56d70d0e693ede6e3db59d5207cbc7a3b361e2b9 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 1 Aug 2023 15:41:13 +0100 Subject: [PATCH 76/85] Updated for review --- assets/schema_input.json | 106 +++++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 15 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index da0589ea..d4bf8be0 100755 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -24,31 +24,107 @@ }, "TicketType":{ "type": "string", - "errorMessage": "Not currently in use. Single word description of assebmly." + "errorMessage": "Not currently in use. Single word description of associated project." + } + } + }, + "reference_file":{ + "type": "string", + "pattern": "^\\S+\\.f(ast)a$", + "errorMessage": "Assembly input file, decompressed" + }, + "assem_reads":{ + "type": "object", + "properties":{ + "pacbio":{ + "type": "string", + "errorMessage": "Path to folder containing fasta.gz files" + }, + "hic":{ + "type": "string", + "errorMessage": "Path to folder containing .cram and .crai files" + }, + "supplementary":{ + "type": "string", + "errorMessage": "Not currently in use. Placeholder for future use" + } + } + }, + "alignment":{ + "type":"object", + "properties":{ + "data_dir":{ + "type": "string", + "errorMessage": "Gene Alignment data directory" + }, + "common_name":{ + "type": "string", + "errorMessage": "Not currently in use. Common identifier for group (adding bee, wasp, ant as sub division for clade)" + }, + "geneset":{ + "type": "string", + "errorMessage": "A csv list of organisms to run against." + } + } + }, + "self_comp":{ + "type": "object", + "properties": { + "motif_len":{ + "type": "integer", + "errorMessage": "Length of motif to be used in self comp search" + }, + "mummer_chunk":{ + "type": "integer", + "errorMessage": "Size of chunks to be used my Mummer" + } + } + }, + "synteny":{ + "type": "object", + "properties": { + "synteny_genome_path":{ + "type": "string", + "errorMessage": "Syntenic Genome Directory Path" } } - } - }, - "fastq_1": { + "outdir":{ "type": "string", - "pattern": "^\\S+\\.f(ast)?q\\.gz$", - "errorMessage": "FastQ file for reads 1 must be provided, cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'" + "errorMessage": "Out directory path, can be changed via cli" }, - "fastq_2": { - "errorMessage": "FastQ file for reads 2 cannot contain spaces and must have extension '.fq.gz' or '.fastq.gz'", - "anyOf": [ - { + "intron":{ + "type": "object", + "properties":{ + "size":{ "type": "string", - "pattern": "^\\S+\\.f(ast)?q\\.gz$" + "errorMessage": "Base pair size of introns, defaults to 50k" + } + } + }, + "telomere":{ + "type": "object", + "properties": { + "teloseq":{ + "type": "string", + "errorMessage": "Expected telomeric motif" + } + } + }, + "busco":{ + "type": "object", + "properties": { + "lineage_path":{ + "type": "string", + "errorMessage": "Path to directory containing lineages folder" }, - { + "lineage":{ "type": "string", - "maxLength": 0 + "errorMessage": "busco lineage to run" } - ] + } } }, - "required": ["sample", "fastq_1"] + "required": ["busco", "telomere", "intron", "synteny", "self_comp", "alignment", "assem_reads", "reference_file", "assembly"] } } From 7bd2f74646b53561f07bd5407f41f9e55df01264 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 1 Aug 2023 15:42:13 +0100 Subject: [PATCH 77/85] Updated for review --- bin/extract_cov_iden.sh | 18 +++++++++++++ modules/local/extract_cov_iden.nf | 42 +++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100755 bin/extract_cov_iden.sh create mode 100755 modules/local/extract_cov_iden.nf diff --git a/bin/extract_cov_iden.sh b/bin/extract_cov_iden.sh new file mode 100755 index 00000000..977a388b --- /dev/null +++ b/bin/extract_cov_iden.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# extract_cov_iden.sh +# ------------------- +# A shell script to convert a +# extract coverage information from +# PAF header and reorganising the data +# ------------------- +# Author = yy5 + +version='1.0.0' + +if [ $1 == '-v']; +then + echo "$version" +else + grep '##PAF' $1 | sed 's/##PAF\t//g'|awk 'BEGIN{FS="\t";}{a[$1]++;if(a[$1]==2)print v[$1] ORS $0;if(a[$1]>2)print;v[$1]=$0;}' | awk '$(NF+1) = ($10/$11)*100'|awk '$(NF+1) = ($10/($2*3))*100'|awk -vOFS='\t' '{print $6,$8,$9,$1,$2,$10,$(NF-1),$NF}' > $2 +fi diff --git a/modules/local/extract_cov_iden.nf b/modules/local/extract_cov_iden.nf new file mode 100755 index 00000000..871d4ec4 --- /dev/null +++ b/modules/local/extract_cov_iden.nf @@ -0,0 +1,42 @@ +process EXTRACT_COV_IDEN { + tag "${meta.id}" + label 'process_low' + + conda "conda-forge::coreutils=9.1" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ubuntu:20.04' : + 'ubuntu:20.04' }" + + input: + tuple val( meta ), path( file ) + + output: + tuple val( meta ), file( "*.bed" ) , emit: punchlist + path "versions.yml" , emit: versions + + script: + def prefix = task.ext.prefix ?: "${meta.id}_${meta.type}_punchlist" + def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + extract_cov_iden.sh ${file} ${prefix}.bed + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + extract_cov_iden: \$(extract_cov_iden.sh -v) + coreutils: $VERSION + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}_${meta.type}_punchlist" + def VERSION = "9.1" // WARN: Version information not provided by tool on CLI. Please update this string when bumping container versions. + """ + touch ${prefix}.bed + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + extract_cov_iden: \$(extract_cov_iden.sh -v) + coreutils: $VERSION + END_VERSIONS + """ +} From e7717c558e7009fd8724e984f4c24c6cf829d01d Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 1 Aug 2023 16:11:59 +0100 Subject: [PATCH 78/85] Linting fix --- assets/schema_input.json | 72 +++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/assets/schema_input.json b/assets/schema_input.json index d4bf8be0..5b387a7d 100755 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -10,121 +10,131 @@ "assembly": { "type": "object", "properties": { - "sample_id":{ + "sample_id": { "type": "string", "errorMessage": "Sample name must be provided and cannot contain spaces" }, - "latin_name":{ + "latin_name": { "type": "string", "errorMessage": "The scientific name for the assembly" }, - "classT":{ + "classT": { "type": "string", "errorMessage": "The Clade of the assembly. Used as the syntenic group and to complete the gene_alignment data dir." }, - "TicketType":{ + "TicketType": { "type": "string", "errorMessage": "Not currently in use. Single word description of associated project." } } }, - "reference_file":{ + "reference_file": { "type": "string", "pattern": "^\\S+\\.f(ast)a$", "errorMessage": "Assembly input file, decompressed" }, - "assem_reads":{ + "assem_reads": { "type": "object", - "properties":{ - "pacbio":{ + "properties": { + "pacbio": { "type": "string", "errorMessage": "Path to folder containing fasta.gz files" }, - "hic":{ + "hic": { "type": "string", "errorMessage": "Path to folder containing .cram and .crai files" }, - "supplementary":{ + "supplementary": { "type": "string", "errorMessage": "Not currently in use. Placeholder for future use" } } }, - "alignment":{ - "type":"object", - "properties":{ - "data_dir":{ + "alignment": { + "type": "object", + "properties": { + "data_dir": { "type": "string", "errorMessage": "Gene Alignment data directory" }, - "common_name":{ + "common_name": { "type": "string", "errorMessage": "Not currently in use. Common identifier for group (adding bee, wasp, ant as sub division for clade)" }, - "geneset":{ + "geneset": { "type": "string", "errorMessage": "A csv list of organisms to run against." } } }, - "self_comp":{ + "self_comp": { "type": "object", "properties": { - "motif_len":{ + "motif_len": { "type": "integer", "errorMessage": "Length of motif to be used in self comp search" }, - "mummer_chunk":{ + "mummer_chunk": { "type": "integer", "errorMessage": "Size of chunks to be used my Mummer" } } }, - "synteny":{ + "synteny": { "type": "object", "properties": { - "synteny_genome_path":{ + "synteny_genome_path": { "type": "string", "errorMessage": "Syntenic Genome Directory Path" } } }, - "outdir":{ + "outdir": { "type": "string", "errorMessage": "Out directory path, can be changed via cli" }, - "intron":{ + "intron": { "type": "object", - "properties":{ - "size":{ + "properties": { + "size": { "type": "string", "errorMessage": "Base pair size of introns, defaults to 50k" } } }, - "telomere":{ + "telomere": { "type": "object", "properties": { - "teloseq":{ + "teloseq": { "type": "string", "errorMessage": "Expected telomeric motif" } } }, - "busco":{ + "busco": { "type": "object", "properties": { - "lineage_path":{ + "lineage_path": { "type": "string", "errorMessage": "Path to directory containing lineages folder" }, - "lineage":{ + "lineage": { "type": "string", "errorMessage": "busco lineage to run" } } } }, - "required": ["busco", "telomere", "intron", "synteny", "self_comp", "alignment", "assem_reads", "reference_file", "assembly"] + "required": [ + "busco", + "telomere", + "intron", + "synteny", + "self_comp", + "alignment", + "assem_reads", + "reference_file", + "assembly" + ] } } From 6a230d86d293698a224f3edcc4ddc8f02195407e Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 3 Aug 2023 15:01:43 +0100 Subject: [PATCH 79/85] Patching custom-getchromsize and fixing naming --- conf/base.config | 4 +- conf/modules.config | 6 +- modules.json | 139 +++++++++++++----- .../getchromsizes/custom-getchromsizes.diff | 59 ++++++++ modules/nf-core/custom/getchromsizes/main.nf | 27 ++-- subworkflows/local/generate_genome.nf | 3 +- subworkflows/local/hic_mapping.nf | 7 +- workflows/treeval.nf | 3 +- workflows/treeval_rapid.nf | 5 +- 9 files changed, 199 insertions(+), 54 deletions(-) create mode 100644 modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff diff --git a/conf/base.config b/conf/base.config index 1cc88bfa..cc526969 100755 --- a/conf/base.config +++ b/conf/base.config @@ -99,8 +99,8 @@ process { withName: '.*:.*:LONGREAD_COVERAGE:(MINIMAP2_ALIGN|MINIMAP2_ALIGN_SPLIT)' { cpus = { check_max( 16 * 1, 'cpus' ) } - memory = { check_max( 100.GB * task.attempt, 'memory' ) } - time = { check_max( 24.h * task.attempt, 'time' ) } + memory = { check_max( 200.GB * task.attempt, 'memory' ) } + time = { check_max( 36.h * task.attempt, 'time' ) } } withName: '.*:.*:LONGREAD_COVERAGE:SAMTOOLS_SORT' { diff --git a/conf/modules.config b/conf/modules.config index 5bdc8c66..56cd95e1 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -50,6 +50,10 @@ process { ] } + withName: CUSTOM_GETCHROMSIZES { + ext.suffix = "genome" + } + withName: BEDTOOLS_SORT { ext.prefix = { "${meta.id}.sorted" } } @@ -61,7 +65,7 @@ process { withName: GNU_SORT_B { ext.args = { "-k1,1 -k2,2n" } - ext.suffix = { "genome" } + ext.suffix = { "sorted.genome" } } withName: GNU_SORT_C { diff --git a/modules.json b/modules.json index 9c5592d5..78c6502a 100755 --- a/modules.json +++ b/modules.json @@ -8,173 +8,242 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "custom/getchromsizes": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ], + "patch": "modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff" }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": ["modules"], + "installed_by": [ + "modules" + ], "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": ["modules"] + "installed_by": [ + "modules" + ] } } }, @@ -183,4 +252,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff b/modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff new file mode 100644 index 00000000..4aecc870 --- /dev/null +++ b/modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff @@ -0,0 +1,59 @@ +Changes in module 'nf-core/custom/getchromsizes' +--- modules/nf-core/custom/getchromsizes/main.nf ++++ modules/nf-core/custom/getchromsizes/main.nf +@@ -1,5 +1,5 @@ + process CUSTOM_GETCHROMSIZES { +- tag "$fasta" ++ tag "$meta.id" + label 'process_single' + + conda "bioconda::samtools=1.16.1" +@@ -8,22 +8,27 @@ + 'biocontainers/samtools:1.16.1--h6899075_1' }" + + input: +- tuple val(meta), path(fasta) ++ tuple val(meta), path(fasta) ++ val suffix + + output: +- tuple val(meta), path ("*.sizes"), emit: sizes +- tuple val(meta), path ("*.fai") , emit: fai +- tuple val(meta), path ("*.gzi") , emit: gzi, optional: true +- path "versions.yml" , emit: versions ++ tuple val(meta), path ("*.${suffix}") , emit: sizes ++ tuple val(meta), path ("*.fa") , emit: fasta ++ tuple val(meta), path ("*.fai") , emit: fai ++ tuple val(meta), path ("*.gzi") , emit: gzi, optional: true ++ path "versions.yml" , emit: versions + + when: + 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}" + """ +- samtools faidx $fasta +- cut -f 1,2 ${fasta}.fai > ${fasta}.sizes ++ samtools faidx $fasta -o ${prefix}.fa.fai ++ cut -f 1,2 ${prefix}.fa.fai > ${prefix}.${suffix} ++ ++ mv ${fasta} ${prefix}.fa + + cat <<-END_VERSIONS > versions.yml + "${task.process}": +@@ -33,8 +38,8 @@ + + stub: + """ +- touch ${fasta}.fai +- touch ${fasta}.sizes ++ touch ${prefix}.fai ++ touch ${prefix}.${suffix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + +************************************************************ diff --git a/modules/nf-core/custom/getchromsizes/main.nf b/modules/nf-core/custom/getchromsizes/main.nf index 060a2e88..8af0c35a 100755 --- a/modules/nf-core/custom/getchromsizes/main.nf +++ b/modules/nf-core/custom/getchromsizes/main.nf @@ -1,5 +1,5 @@ process CUSTOM_GETCHROMSIZES { - tag "$fasta" + tag "$meta.id" label 'process_single' conda "bioconda::samtools=1.16.1" @@ -8,22 +8,27 @@ process CUSTOM_GETCHROMSIZES { 'biocontainers/samtools:1.16.1--h6899075_1' }" input: - tuple val(meta), path(fasta) + tuple val(meta), path(fasta) + val suffix output: - tuple val(meta), path ("*.sizes"), emit: sizes - tuple val(meta), path ("*.fai") , emit: fai - tuple val(meta), path ("*.gzi") , emit: gzi, optional: true - path "versions.yml" , emit: versions + tuple val(meta), path ("*.${suffix}") , emit: sizes + tuple val(meta), path ("*.fa") , emit: fasta + tuple val(meta), path ("*.fai") , emit: fai + tuple val(meta), path ("*.gzi") , emit: gzi, optional: true + path "versions.yml" , emit: versions when: 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}" """ - samtools faidx $fasta - cut -f 1,2 ${fasta}.fai > ${fasta}.sizes + samtools faidx $fasta -o ${prefix}.fa.fai + cut -f 1,2 ${prefix}.fa.fai > ${prefix}.${suffix} + + mv ${fasta} ${prefix}.fa cat <<-END_VERSIONS > versions.yml "${task.process}": @@ -33,8 +38,8 @@ process CUSTOM_GETCHROMSIZES { stub: """ - touch ${fasta}.fai - touch ${fasta}.sizes + touch ${prefix}.fai + touch ${prefix}.${suffix} cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/generate_genome.nf b/subworkflows/local/generate_genome.nf index d7a37e03..97580e7d 100755 --- a/subworkflows/local/generate_genome.nf +++ b/subworkflows/local/generate_genome.nf @@ -31,7 +31,8 @@ workflow GENERATE_GENOME { // EMITS REFERENCE INDEX FILE MODIFIED FOR SCAFF SIZES // CUSTOM_GETCHROMSIZES ( - to_chromsize + to_chromsize, + "genome" ) ch_versions = ch_versions.mix( CUSTOM_GETCHROMSIZES.out.versions ) diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index 7da868e9..4d534a16 100755 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -28,8 +28,9 @@ workflow HIC_MAPPING { take: reference_tuple // Channel [ val(meta), path(file) ] reference_index // Channel [ val(meta), path(file) ] - dot_genome // Channel: [val(meta), [ datafile ]] + dot_genome // Channel [ val(meta), [ datafile ]] hic_reads_path // Channel [ val(meta), path(directory) ] + assembly_id // Channel val( id ) main: ch_versions = Channel.empty() @@ -108,7 +109,7 @@ workflow HIC_MAPPING { .map { file -> tuple ( [ - id: file[0].toString().split('/')[-1].split('_')[0] // Change to sample_id + id: file[0].toString().split('/')[-1].split('_')[0] + '_' + file[0].toString().split('/')[-1].split('_')[1] ], file ) @@ -139,6 +140,8 @@ workflow HIC_MAPPING { } .set { pretext_input } + pretext_input.input_bam.view() + // // MODULE: GENERATE PRETEXT MAP FROM MAPPED BAM FOR LOW RES // diff --git a/workflows/treeval.nf b/workflows/treeval.nf index 75229e8c..ce3b2137 100755 --- a/workflows/treeval.nf +++ b/workflows/treeval.nf @@ -207,7 +207,8 @@ workflow TREEVAL { GENERATE_GENOME.out.reference_tuple, GENERATE_GENOME.out.ref_index, GENERATE_GENOME.out.dot_genome, - YAML_INPUT.out.hic_reads + YAML_INPUT.out.hic_reads, + YAML_INPUT.out.assembly_id ) ch_versions = ch_versions.mix(HIC_MAPPING.out.versions) diff --git a/workflows/treeval_rapid.nf b/workflows/treeval_rapid.nf index 1fd8f17f..a24202b5 100755 --- a/workflows/treeval_rapid.nf +++ b/workflows/treeval_rapid.nf @@ -67,6 +67,8 @@ workflow TREEVAL_RAPID { ) ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) + GENERATE_GENOME.out.reference_tuple.view() + // // SUBWORKFLOW: GENERATES A BIGWIG FOR A REPEAT DENSITY TRACK // @@ -102,7 +104,8 @@ workflow TREEVAL_RAPID { GENERATE_GENOME.out.reference_tuple, GENERATE_GENOME.out.ref_index, GENERATE_GENOME.out.dot_genome, - YAML_INPUT.out.hic_reads + YAML_INPUT.out.hic_reads, + YAML_INPUT.out.assembly_id ) ch_versions = ch_versions.mix(HIC_MAPPING.out.versions) From 58dfffe29b904062ff96f1e67208440aba006713 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 3 Aug 2023 15:02:19 +0100 Subject: [PATCH 80/85] Patching custom-getchromsize and fixing naming --- conf/modules.config | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 56cd95e1..edc5f2b3 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -50,10 +50,6 @@ process { ] } - withName: CUSTOM_GETCHROMSIZES { - ext.suffix = "genome" - } - withName: BEDTOOLS_SORT { ext.prefix = { "${meta.id}.sorted" } } From 118434b017969efffa53ac5cbc3b8a2a2f934ecc Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 3 Aug 2023 15:29:17 +0100 Subject: [PATCH 81/85] Patching custom-getchromsize and fixing naming --- conf/modules.config | 5 +++-- subworkflows/local/longread_coverage.nf | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index edc5f2b3..b2f51aa5 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -42,7 +42,7 @@ process { // Files to be used for pretext, likely to be deleted once the hic workflow is complete. // .bed, .hr.pretext, .lr.pretext, needs centromere} - withName: 'GAP_LENGTH|PRETEXTMAP_HIGHRES|PRETEXTMAP_STANDRD|COOLER_ZOOMIFY|.*:.*:REPEAT_DENSITY:UCSC_BEDGRAPHTOBIGWIG|EXTRACT_TELO|JUICER_TOOLS_PRE|SNAPSHOT_SRES|SNAPSHOT_HRES|GET_PAIRED_CONTACT_BED' { + withName: 'SEQTK_CUTN|GAP_LENGTH|PRETEXTMAP_HIGHRES|PRETEXTMAP_STANDRD|COOLER_ZOOMIFY|UCSC_BEDGRAPHTOBIGWIG|EXTRACT_TELO|JUICER_TOOLS_PRE|SNAPSHOT_SRES|SNAPSHOT_HRES|GET_PAIRED_CONTACT_BED' { publishDir = [ path: { "${params.outdir}/hic_files" }, mode: params.publish_dir_mode, @@ -84,6 +84,7 @@ process { withName: SEQTK_CUTN { ext.args = "-n 1" + ext.prefix = { "${meta.id}_gap" } } withName: MINIPROT_ALIGN { @@ -181,7 +182,7 @@ process { } withName: '.*:.*:LONGREAD_COVERAGE:UCSC_BEDGRAPHTOBIGWIG' { - ext.prefix = 'coverage' + ext.prefix = { "${meta.id}_coverage" } } // diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index 65963626..85071d29 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -313,8 +313,9 @@ workflow LONGREAD_COVERAGE { // GNU_SORT.out.sorted .combine( dot_genome ) - .multiMap { meta, file, meta_my_genome, my_genome -> - ch_coverage_bed : tuple ([ id: meta.id, single_end: true], file) + .combine(reference_tuple) + .multiMap { meta, file, meta_my_genome, my_genome, ref_meta, ref -> + ch_coverage_bed : tuple ([ id: ref_meta.id, single_end: true], file) genome_file : my_genome } .set { bed2bw_input } @@ -337,8 +338,8 @@ workflow LONGREAD_COVERAGE { .collect() .map { meta, fasta -> tuple( [ id: 'pacbio', - sz: fasta instanceof ArrayList ? fasta.collect { it.size()} : fasta.size() ], - fasta + sz: fasta instanceof ArrayList ? fasta.collect { it.size()} : fasta.size() ], + fasta ) } .set { ch_reporting_pacbio } From ebdc07cbe46a2ebaf27734aad7ec59721dea449b Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Thu, 3 Aug 2023 15:42:18 +0100 Subject: [PATCH 82/85] Patching custom-getchromsize and fixing naming --- conf/modules.config | 2 +- subworkflows/local/longread_coverage.nf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b2f51aa5..40c44751 100755 --- a/conf/modules.config +++ b/conf/modules.config @@ -42,7 +42,7 @@ process { // Files to be used for pretext, likely to be deleted once the hic workflow is complete. // .bed, .hr.pretext, .lr.pretext, needs centromere} - withName: 'SEQTK_CUTN|GAP_LENGTH|PRETEXTMAP_HIGHRES|PRETEXTMAP_STANDRD|COOLER_ZOOMIFY|UCSC_BEDGRAPHTOBIGWIG|EXTRACT_TELO|JUICER_TOOLS_PRE|SNAPSHOT_SRES|SNAPSHOT_HRES|GET_PAIRED_CONTACT_BED' { + withName: 'SEQTK_CUTN|GAP_LENGTH|PRETEXTMAP_HIGHRES|PRETEXTMAP_STANDRD|COOLER_ZOOMIFY|COV_FOLDER|UCSC_BEDGRAPHTOBIGWIG|EXTRACT_TELO|JUICER_TOOLS_PRE|SNAPSHOT_SRES|SNAPSHOT_HRES|GET_PAIRED_CONTACT_BED' { publishDir = [ path: { "${params.outdir}/hic_files" }, mode: params.publish_dir_mode, diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index 85071d29..c8c54b6e 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -330,7 +330,7 @@ workflow LONGREAD_COVERAGE { ch_versions = ch_versions.mix(UCSC_BEDGRAPHTOBIGWIG.out.versions) // - // LOGIC: + // LOGIC: GENERATE A SUMMARY TUPLE FOR OUTPUT // ch_grabbed_read_paths.map{it} From 2e40a2ca6f9acd5ae91028c9b0a70c559ae0329c Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Fri, 4 Aug 2023 10:25:30 +0100 Subject: [PATCH 83/85] Linting fix --- modules.json | 255 --------------------------------------------------- 1 file changed, 255 deletions(-) diff --git a/modules.json b/modules.json index 78c6502a..e69de29b 100755 --- a/modules.json +++ b/modules.json @@ -1,255 +0,0 @@ -{ - "name": "sanger-tol/treeval", - "homePage": "https://github.com/sanger-tol/treeval", - "repos": { - "https://github.com/nf-core/modules.git": { - "modules": { - "nf-core": { - "bedtools/bamtobed": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "bedtools/genomecov": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "bedtools/intersect": { - "branch": "master", - "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] - }, - "bedtools/makewindows": { - "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] - }, - "bedtools/map": { - "branch": "master", - "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] - }, - "bedtools/merge": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "bedtools/sort": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "busco": { - "branch": "master", - "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] - }, - "bwamem2/index": { - "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] - }, - "cat/cat": { - "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] - }, - "cooler/cload": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "cooler/zoomify": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "custom/dumpsoftwareversions": { - "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] - }, - "custom/getchromsizes": { - "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ], - "patch": "modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff" - }, - "gnu/sort": { - "branch": "master", - "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] - }, - "minimap2/align": { - "branch": "master", - "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] - }, - "minimap2/index": { - "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] - }, - "miniprot/align": { - "branch": "master", - "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] - }, - "miniprot/index": { - "branch": "master", - "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] - }, - "mummer": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "paftools/sam2paf": { - "branch": "master", - "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] - }, - "pretextmap": { - "branch": "master", - "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] - }, - "pretextsnapshot": { - "branch": "master", - "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] - }, - "samtools/faidx": { - "branch": "master", - "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] - }, - "samtools/markdup": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "samtools/merge": { - "branch": "master", - "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] - }, - "samtools/sort": { - "branch": "master", - "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] - }, - "samtools/view": { - "branch": "master", - "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] - }, - "seqtk/cutn": { - "branch": "master", - "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] - }, - "tabix/bgziptabix": { - "branch": "master", - "git_sha": "591b71642820933dcb3c954c934b397bd00d8e5e", - "installed_by": [ - "modules" - ], - "patch": "modules/nf-core/tabix/bgziptabix/tabix-bgziptabix.diff" - }, - "ucsc/bedgraphtobigwig": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "ucsc/bedtobigbed": { - "branch": "master", - "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] - }, - "windowmasker/mk_counts": { - "branch": "master", - "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] - }, - "windowmasker/ustat": { - "branch": "master", - "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] - } - } - }, - "subworkflows": { - "nf-core": {} - } - } - } -} \ No newline at end of file From c9757caba0bd195f5523afd1037088f224e7f8a0 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 8 Aug 2023 12:46:35 +0100 Subject: [PATCH 84/85] Fixes and minor changes --- conf/base.config | 14 +- modules.json | 253 ++++++++++++++++++ .../getchromsizes/custom-getchromsizes.diff | 59 ---- modules/nf-core/custom/getchromsizes/main.nf | 6 +- subworkflows/local/hic_mapping.nf | 2 - subworkflows/local/longread_coverage.nf | 2 +- workflows/treeval_rapid.nf | 2 - 7 files changed, 268 insertions(+), 70 deletions(-) delete mode 100644 modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff diff --git a/conf/base.config b/conf/base.config index cc526969..4e7932ac 100755 --- a/conf/base.config +++ b/conf/base.config @@ -92,14 +92,14 @@ process { // RESOURCES: CHANGES TO FREQUENT FAILURES BELOW THIS MEM POINT - withName: '(MINIPROT_ALIGN|MINIMAP2_ALIGN)' { - memory = { check_max( 120.GB * Math.ceil( task.attempt * 1.5 ) , 'memory' ) } - time = { check_max( 20.h * task.attempt, 'time' ) } + withName: '.*:.*:GENE_ALIGNMENT:.*:(MINIPROT_ALIGN|MINIMAP2_ALIGN)' { + memory = { check_max( 100.GB * Math.ceil( task.attempt * 1.5 ) , 'memory' ) } + time = { check_max( 12.h * task.attempt, 'time' ) } } withName: '.*:.*:LONGREAD_COVERAGE:(MINIMAP2_ALIGN|MINIMAP2_ALIGN_SPLIT)' { cpus = { check_max( 16 * 1, 'cpus' ) } - memory = { check_max( 200.GB * task.attempt, 'memory' ) } + memory = { check_max( 300.GB * task.attempt, 'memory' ) } time = { check_max( 36.h * task.attempt, 'time' ) } } @@ -157,4 +157,10 @@ process { cpus = { check_max( 16 * 1, 'cpus' ) } memory = { check_max( 100.GB * task.attempt, 'memory' ) } } + + withName: BUSCO { + cpus = { check_max( 6 * task.attempt, 'cpus' ) } + memory = { check_max( 80.GB * task.attempt, 'memory' ) } + time = { check_max( 12.h * task.attempt, 'time' ) } + } } diff --git a/modules.json b/modules.json index e69de29b..d98ef8db 100755 --- a/modules.json +++ b/modules.json @@ -0,0 +1,253 @@ +{ + "name": "sanger-tol/treeval", + "homePage": "https://github.com/sanger-tol/treeval", + "repos": { + "https://github.com/nf-core/modules.git": { + "modules": { + "nf-core": { + "bedtools/bamtobed": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "bedtools/genomecov": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "bedtools/intersect": { + "branch": "master", + "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", + "installed_by": [ + "modules" + ] + }, + "bedtools/makewindows": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "bedtools/map": { + "branch": "master", + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] + }, + "bedtools/merge": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "bedtools/sort": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "busco": { + "branch": "master", + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] + }, + "bwamem2/index": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "cat/cat": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "cooler/cload": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "cooler/zoomify": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "custom/dumpsoftwareversions": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "custom/getchromsizes": { + "branch": "master", + "git_sha": "d75b37fef175f241230ee25c485bd574c768e282", + "installed_by": [ + "modules" + ] + }, + "gnu/sort": { + "branch": "master", + "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", + "installed_by": [ + "modules" + ] + }, + "minimap2/align": { + "branch": "master", + "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", + "installed_by": [ + "modules" + ] + }, + "minimap2/index": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "miniprot/align": { + "branch": "master", + "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", + "installed_by": [ + "modules" + ] + }, + "miniprot/index": { + "branch": "master", + "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", + "installed_by": [ + "modules" + ] + }, + "mummer": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "paftools/sam2paf": { + "branch": "master", + "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", + "installed_by": [ + "modules" + ] + }, + "pretextmap": { + "branch": "master", + "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", + "installed_by": [ + "modules" + ] + }, + "pretextsnapshot": { + "branch": "master", + "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", + "installed_by": [ + "modules" + ] + }, + "samtools/faidx": { + "branch": "master", + "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", + "installed_by": [ + "modules" + ] + }, + "samtools/markdup": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "samtools/merge": { + "branch": "master", + "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", + "installed_by": [ + "modules" + ] + }, + "samtools/sort": { + "branch": "master", + "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", + "installed_by": [ + "modules" + ] + }, + "samtools/view": { + "branch": "master", + "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", + "installed_by": [ + "modules" + ] + }, + "seqtk/cutn": { + "branch": "master", + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] + }, + "tabix/bgziptabix": { + "branch": "master", + "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247", + "installed_by": [ + "modules" + ] + }, + "ucsc/bedgraphtobigwig": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "ucsc/bedtobigbed": { + "branch": "master", + "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", + "installed_by": [ + "modules" + ] + }, + "windowmasker/mk_counts": { + "branch": "master", + "git_sha": "30c3ed32e8bd5ddaf349ba2f4f99d38182fdc08c", + "installed_by": [ + "modules" + ] + }, + "windowmasker/ustat": { + "branch": "master", + "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", + "installed_by": [ + "modules" + ] + } + } + }, + "subworkflows": { + "nf-core": {} + } + } + } +} \ No newline at end of file diff --git a/modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff b/modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff deleted file mode 100644 index 4aecc870..00000000 --- a/modules/nf-core/custom/getchromsizes/custom-getchromsizes.diff +++ /dev/null @@ -1,59 +0,0 @@ -Changes in module 'nf-core/custom/getchromsizes' ---- modules/nf-core/custom/getchromsizes/main.nf -+++ modules/nf-core/custom/getchromsizes/main.nf -@@ -1,5 +1,5 @@ - process CUSTOM_GETCHROMSIZES { -- tag "$fasta" -+ tag "$meta.id" - label 'process_single' - - conda "bioconda::samtools=1.16.1" -@@ -8,22 +8,27 @@ - 'biocontainers/samtools:1.16.1--h6899075_1' }" - - input: -- tuple val(meta), path(fasta) -+ tuple val(meta), path(fasta) -+ val suffix - - output: -- tuple val(meta), path ("*.sizes"), emit: sizes -- tuple val(meta), path ("*.fai") , emit: fai -- tuple val(meta), path ("*.gzi") , emit: gzi, optional: true -- path "versions.yml" , emit: versions -+ tuple val(meta), path ("*.${suffix}") , emit: sizes -+ tuple val(meta), path ("*.fa") , emit: fasta -+ tuple val(meta), path ("*.fai") , emit: fai -+ tuple val(meta), path ("*.gzi") , emit: gzi, optional: true -+ path "versions.yml" , emit: versions - - when: - 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}" - """ -- samtools faidx $fasta -- cut -f 1,2 ${fasta}.fai > ${fasta}.sizes -+ samtools faidx $fasta -o ${prefix}.fa.fai -+ cut -f 1,2 ${prefix}.fa.fai > ${prefix}.${suffix} -+ -+ mv ${fasta} ${prefix}.fa - - cat <<-END_VERSIONS > versions.yml - "${task.process}": -@@ -33,8 +38,8 @@ - - stub: - """ -- touch ${fasta}.fai -- touch ${fasta}.sizes -+ touch ${prefix}.fai -+ touch ${prefix}.${suffix} - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - -************************************************************ diff --git a/modules/nf-core/custom/getchromsizes/main.nf b/modules/nf-core/custom/getchromsizes/main.nf index 8af0c35a..1fd1e768 100755 --- a/modules/nf-core/custom/getchromsizes/main.nf +++ b/modules/nf-core/custom/getchromsizes/main.nf @@ -13,7 +13,7 @@ process CUSTOM_GETCHROMSIZES { output: tuple val(meta), path ("*.${suffix}") , emit: sizes - tuple val(meta), path ("*.fa") , emit: fasta + tuple val(meta), path ("*.fa") , emit: fasta tuple val(meta), path ("*.fai") , emit: fai tuple val(meta), path ("*.gzi") , emit: gzi, optional: true path "versions.yml" , emit: versions @@ -28,7 +28,9 @@ process CUSTOM_GETCHROMSIZES { samtools faidx $fasta -o ${prefix}.fa.fai cut -f 1,2 ${prefix}.fa.fai > ${prefix}.${suffix} - mv ${fasta} ${prefix}.fa + if [[ "${fasta}" != "${prefix}-ref.fa" ]]; then + mv ${fasta} ${prefix}-ref.fa + fi cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/hic_mapping.nf b/subworkflows/local/hic_mapping.nf index 4d534a16..cf249ca4 100755 --- a/subworkflows/local/hic_mapping.nf +++ b/subworkflows/local/hic_mapping.nf @@ -140,8 +140,6 @@ workflow HIC_MAPPING { } .set { pretext_input } - pretext_input.input_bam.view() - // // MODULE: GENERATE PRETEXT MAP FROM MAPPED BAM FOR LOW RES // diff --git a/subworkflows/local/longread_coverage.nf b/subworkflows/local/longread_coverage.nf index c8c54b6e..f1ca457c 100755 --- a/subworkflows/local/longread_coverage.nf +++ b/subworkflows/local/longread_coverage.nf @@ -332,7 +332,7 @@ workflow LONGREAD_COVERAGE { // // LOGIC: GENERATE A SUMMARY TUPLE FOR OUTPUT // - ch_grabbed_read_paths.map{it} + ch_grabbed_read_paths.map{ it } ch_grabbed_read_paths .collect() diff --git a/workflows/treeval_rapid.nf b/workflows/treeval_rapid.nf index a24202b5..b7606031 100755 --- a/workflows/treeval_rapid.nf +++ b/workflows/treeval_rapid.nf @@ -67,8 +67,6 @@ workflow TREEVAL_RAPID { ) ch_versions = ch_versions.mix(GENERATE_GENOME.out.versions) - GENERATE_GENOME.out.reference_tuple.view() - // // SUBWORKFLOW: GENERATES A BIGWIG FOR A REPEAT DENSITY TRACK // From af026dc73fc1a0b266eea3d22c6372227942a650 Mon Sep 17 00:00:00 2001 From: DLBPointon Date: Tue, 8 Aug 2023 12:49:01 +0100 Subject: [PATCH 85/85] modules.json --- modules.json | 138 +++++++++++++-------------------------------------- 1 file changed, 35 insertions(+), 103 deletions(-) diff --git a/modules.json b/modules.json index d98ef8db..f2689dc0 100755 --- a/modules.json +++ b/modules.json @@ -8,240 +8,172 @@ "bedtools/bamtobed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/genomecov": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/intersect": { "branch": "master", "git_sha": "c1532c77717ad7c64752b26b0fd9b4556bdef272", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/makewindows": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/map": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/merge": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bedtools/sort": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "busco": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "bwamem2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cat/cat": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/cload": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "cooler/zoomify": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/dumpsoftwareversions": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "custom/getchromsizes": { "branch": "master", "git_sha": "d75b37fef175f241230ee25c485bd574c768e282", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "gnu/sort": { "branch": "master", "git_sha": "88f6e982fb8bd40488d837b3b08a65008e602840", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/align": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "minimap2/index": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/align": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "miniprot/index": { "branch": "master", "git_sha": "8d737766e8f3c1417212b4b56acb959f3c356d26", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "mummer": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "paftools/sam2paf": { "branch": "master", "git_sha": "603ecbd9f45300c9788f197d2a15a005685b4220", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextmap": { "branch": "master", "git_sha": "decfb802f2e573efb7b44ff06b11ecf16853054d", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "pretextsnapshot": { "branch": "master", "git_sha": "911696ea0b62df80e900ef244d7867d177971f73", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/faidx": { "branch": "master", "git_sha": "fd742419940e01ba1c5ecb172c3e32ec840662fe", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/markdup": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/merge": { "branch": "master", "git_sha": "0460d316170f75f323111b4a2c0a2989f0c32013", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/sort": { "branch": "master", "git_sha": "a0f7be95788366c1923171e358da7d049eb440f9", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "samtools/view": { "branch": "master", "git_sha": "3ffae3598260a99e8db3207dead9f73f87f90d1f", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "seqtk/cutn": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "tabix/bgziptabix": { "branch": "master", "git_sha": "5e7b1ef9a5a2d9258635bcbf70fcf37dacd1b247", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedgraphtobigwig": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "ucsc/bedtobigbed": { "branch": "master", "git_sha": "9e51255c4f8ec69fb6ccf68593392835f14fecb8", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/mk_counts": { "branch": "master", "git_sha": "30c3ed32e8bd5ddaf349ba2f4f99d38182fdc08c", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] }, "windowmasker/ustat": { "branch": "master", "git_sha": "726ee59cd9360a965d96ea9ea8770f16b8ddd6cc", - "installed_by": [ - "modules" - ] + "installed_by": ["modules"] } } }, @@ -250,4 +182,4 @@ } } } -} \ No newline at end of file +}