From 55d8baeb0fbe6112bf3a7313f71899b19eed16ea Mon Sep 17 00:00:00 2001 From: emmarousseau Date: Sun, 25 Aug 2024 21:14:06 +0100 Subject: [PATCH] update changelog, hep.txt, functional test, large test data --- CHANGELOG.md | 3 + src/bbmap_bbsplit/config.vsh.yaml | 9 +- src/bbmap_bbsplit/help.txt | 83 + src/bbmap_bbsplit/output/.build.yaml | 0 src/bbmap_bbsplit/output/.config.vsh.yaml | 415 +++++ src/bbmap_bbsplit/output/bbmap_bbsplit | 1755 +++++++++++++++++++++ src/bbmap_bbsplit/script.sh | 9 +- src/bbmap_bbsplit/test.sh | 16 +- 8 files changed, 2272 insertions(+), 18 deletions(-) create mode 100644 src/bbmap_bbsplit/output/.build.yaml create mode 100644 src/bbmap_bbsplit/output/.config.vsh.yaml create mode 100755 src/bbmap_bbsplit/output/bbmap_bbsplit diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fc960f4..c65b923a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -78,6 +78,9 @@ - `bedtools_getfasta`: extract sequences from a FASTA file for each of the intervals defined in a BED/GFF/VCF file (PR #59). +* `bbmap`: + - `bbmap_bbsplit`: Split sequencing reads by mapping them to multiple references simultaneously (PR #138). + ## MINOR CHANGES * Uniformize component metadata (PR #23). diff --git a/src/bbmap_bbsplit/config.vsh.yaml b/src/bbmap_bbsplit/config.vsh.yaml index 0ac1dcd5..7eb19331 100644 --- a/src/bbmap_bbsplit/config.vsh.yaml +++ b/src/bbmap_bbsplit/config.vsh.yaml @@ -21,6 +21,7 @@ argument_groups: type: file multiple: true description: Input fastq files, either one or two (paired), separated by ";". + multiple_sep: "," example: reads.fastq - name: "--primary_ref" type: file @@ -38,8 +39,8 @@ argument_groups: description: | Designate index to use. Corresponds to the number specified when building the index. If building the index, this will be the build's id. If multiple references are indexed - in the same directory, each needs a unique build ID. Default: 1.\ - example: 1 + in the same directory, each needs a unique build ID. Default: 1. + example: "1" - name: "--qin" type: string description: | @@ -127,8 +128,6 @@ argument_groups: type: file description: | Directory with index files. - direction: output - example: bbsplit - name: "--sam2bam" alternatives: ["--bs"] type: file @@ -175,7 +174,7 @@ engines: cp -r bbmap/* /usr/local/bin - type: docker run: | - echo "${meta_functionality_name}: bbmap: $(bbversion.sh | grep -v "Duplicate cpuset")" > /var/software_versions.txt + bbsplit.sh --version 2>&1 | awk '/BBMap version/{print "BBMAP:", $NF}' > /var/software_versions.txt runners: - type: executable - type: nextflow diff --git a/src/bbmap_bbsplit/help.txt b/src/bbmap_bbsplit/help.txt index e69de29b..56544a34 100644 --- a/src/bbmap_bbsplit/help.txt +++ b/src/bbmap_bbsplit/help.txt @@ -0,0 +1,83 @@ +``` +bbsplit.sh +``` + +BBSplit +Written by Brian Bushnell, from Dec. 2010 - present +Last modified June 11, 2018 + +Description: Maps reads to multiple references simultaneously. +Outputs reads to a file for the reference they best match, with multiple options for dealing with ambiguous mappings. + +To index: bbsplit.sh build=<1> ref_x= ref_y= +To map: bbsplit.sh build=<1> in= out_x= out_y= + +To be concise, and do everything in one command: +bbsplit.sh ref=x.fa,y.fa in=reads.fq basename=o%.fq + +that is equivalent to +bbsplit.sh build=1 in=reads.fq ref_x=x.fa ref_y=y.fa out_x=ox.fq out_y=oy.fq + +By default paired reads will yield interleaved output, but you can use the # symbol to produce twin output files. +For example, basename=o%_#.fq will produce ox_1.fq, ox_2.fq, oy_1.fq, and oy_2.fq. + + +Indexing Parameters (required when building the index): +ref= A list of references, or directories containing fasta files. +ref_= Alternate, longer way to specify references. e.g., ref_ecoli=ecoli.fa + These can also be comma-delimited lists of files; e.g., ref_a=a1.fa,a2.fa,a3.fa +build=<1> If multiple references are indexed in the same directory, each needs a unique build ID. +path=<.> Specify the location to write the index, if you don't want it in the current working directory. + +Input Parameters: +build=<1> Designate index to use. Corresponds to the number specified when building the index. +in= Primary reads input; required parameter. +in2= For paired reads in two files. +qin= Set to 33 or 64 to specify input quality value ASCII offset. +interleaved= True forces paired/interleaved input; false forces single-ended mapping. + If not specified, interleaved status will be autodetected from read names. + +Mapping Parameters: +maxindel=<20> Don't look for indels longer than this. Lower is faster. Set to >=100k for RNA-seq. +minratio=<0.56> Fraction of max alignment score required to keep a site. Higher is faster. +minhits=<1> Minimum number of seed hits required for candidate sites. Higher is faster. +ambiguous= Set behavior on ambiguously-mapped reads (with multiple top-scoring mapping locations). + best (use the first best site) + toss (consider unmapped) + random (select one top-scoring site randomly) + all (retain all top-scoring sites. Does not work yet with SAM output) +ambiguous2= Set behavior only for reads that map ambiguously to multiple different references. + Normal 'ambiguous=' controls behavior on all ambiguous reads; + Ambiguous2 excludes reads that map ambiguously within a single reference. + best (use the first best site) + toss (consider unmapped) + all (write a copy to the output for each reference to which it maps) + split (write a copy to the AMBIGUOUS_ output for each reference to which it maps) +qtrim= Quality-trim ends to Q5 before mapping. Options are 'l' (left), 'r' (right), and 'lr' (both). +untrim= Undo trimming after mapping. Untrimmed bases will be soft-clipped in cigar strings. + +Output Parameters: +out_= Output reads that map to the reference to . +basename=prefix%suffix Equivalent to multiple out_%=prefix%suffix expressions, in which each % is replaced by the name of a reference file. +bs= Write a shell script to 'file' that will turn the sam output into a sorted, indexed bam file. +scafstats= Write statistics on how many reads mapped to which scaffold to this file. +refstats= Write statistics on how many reads were assigned to which reference to this file. + Unmapped reads whose mate mapped to a reference are considered assigned and will be counted. +nzo=t Only print lines with nonzero coverage. + +***** Notes ***** +Almost all BBMap parameters can be used; run bbmap.sh for more details. +Exceptions include the 'nodisk' flag, which BBSplit does not support. +BBSplit is recommended for fastq and fasta output, not for sam/bam output. +When the reference sequences are shorter than read length, use Seal instead of BBSplit. + +Java Parameters: +-Xmx This will set Java's memory usage, overriding autodetection. + -Xmx20g will specify 20 gigs of RAM, and -Xmx200m will specify 200 megs. + The max is typically 85% of physical memory. +-eoom This flag will cause the process to exit if an + out-of-memory exception occurs. Requires Java 8u92+. +-da Disable assertions. + +This list is not complete. For more information, please consult /readme.txt +Please contact Brian Bushnell at bbushnell@lbl.gov if you encounter any problems. \ No newline at end of file diff --git a/src/bbmap_bbsplit/output/.build.yaml b/src/bbmap_bbsplit/output/.build.yaml new file mode 100644 index 00000000..e69de29b diff --git a/src/bbmap_bbsplit/output/.config.vsh.yaml b/src/bbmap_bbsplit/output/.config.vsh.yaml new file mode 100644 index 00000000..827fbc1b --- /dev/null +++ b/src/bbmap_bbsplit/output/.config.vsh.yaml @@ -0,0 +1,415 @@ +name: "bbmap_bbsplit" +namespace: "bbmap" +argument_groups: +- name: "Input" + arguments: + - type: "string" + name: "--id" + description: "Sample ID" + info: null + required: false + direction: "input" + multiple: false + multiple_sep: ";" + - type: "boolean_true" + name: "--paired" + description: "Paired fastq files or not?" + info: null + direction: "input" + - type: "file" + name: "--input" + description: "Input fastq files, either one or two (paired), separated by \";\"\ + ." + info: null + example: + - "reads.fastq" + must_exist: true + create_parent: true + required: false + direction: "input" + multiple: true + multiple_sep: ";" + - type: "file" + name: "--primary_ref" + description: "Primary reference FASTA" + info: null + must_exist: true + create_parent: true + required: false + direction: "input" + multiple: false + multiple_sep: ";" + - type: "file" + name: "--other_ref_names" + description: "Path to comma-separated file containing a list of reference genomes\ + \ to filter reads\nagainst with BBSplit.\n" + info: null + must_exist: true + create_parent: true + required: false + direction: "input" + multiple: false + multiple_sep: ";" + - type: "boolean_true" + name: "--only_build_index" + description: "If set, only builds the index. Otherwise, mapping is performed." + info: null + direction: "input" + - type: "string" + name: "--index" + description: "Designate index to use. Corresponds to the number specified when\ + \ building the index.\nIf building the index, this will be the build's id. If\ + \ multiple references are indexed\nin the same directory, each needs a unique\ + \ build ID. Default: 1.\\\n" + info: null + example: + - "1" + required: false + direction: "input" + multiple: false + multiple_sep: ";" + - type: "string" + name: "--qin" + description: "Set to 33 or 64 to specify input quality value ASCII offset. Automatically\ + \ detected if\nnot specified.\n" + info: null + required: false + direction: "input" + multiple: false + multiple_sep: ";" + - type: "boolean_true" + name: "--interleaved" + description: "True forces paired/interleaved input; false forces single-ended\ + \ mapping.\nIf not specified, interleaved status will be autodetected from read\ + \ names.\n" + info: null + direction: "input" + - type: "integer" + name: "--maxindel" + description: "Don't look for indels longer than this. Lower is faster. Set to\ + \ >=100k for RNA-seq.\n" + info: null + example: + - 20 + required: false + direction: "input" + multiple: false + multiple_sep: ";" + - type: "double" + name: "--minratio" + description: "Fraction of max alignment score required to keep a site. Higher\ + \ is faster.\n" + info: null + example: + - 0.56 + required: false + direction: "input" + multiple: false + multiple_sep: ";" + - type: "integer" + name: "--minhits" + description: "Minimum number of seed hits required for candidate sites. Higher\ + \ is faster.\n" + info: null + example: + - 1 + required: false + direction: "input" + multiple: false + multiple_sep: ";" + - type: "string" + name: "--ambiguous" + description: "Set behavior on ambiguously-mapped reads (with multiple top-scoring\ + \ mapping locations).\n * best Use the first best site (Default)\n * toss\ + \ Consider unmapped\n * random Select one top-scoring site randomly\n \ + \ * all Retain all top-scoring sites. Does not work yet with SAM output\n" + info: null + example: + - "best" + required: false + choices: + - "best" + - "toss" + - "random" + - "all" + direction: "input" + multiple: false + multiple_sep: ";" + - type: "string" + name: "--ambiguous2" + description: "Set behavior only for reads that map ambiguously to multiple different\ + \ references.\nNormal 'ambiguous=' controls behavior on all ambiguous reads;\n\ + Ambiguous2 excludes reads that map ambiguously within a single reference.\n\ + \ * best Use the first best site (Default)\n * toss Consider unmapped\n\ + \ * all Write a copy to the output for each reference to which it maps\n\ + \ * split Write a copy to the AMBIGUOUS_ output for each reference to which\ + \ it maps\n" + info: null + example: + - "best" + required: false + choices: + - "best" + - "toss" + - "all" + - "split" + direction: "input" + multiple: false + multiple_sep: ";" + - type: "string" + name: "--qtrim" + description: "Quality-trim ends to Q5 before mapping. Options are 'l' (left),\ + \ 'r' (right), and 'lr' (both).\n" + info: null + required: false + choices: + - "l" + - "r" + - "lr" + direction: "input" + multiple: false + multiple_sep: ";" + - type: "boolean_true" + name: "--untrim" + description: "Undo trimming after mapping. Untrimmed bases will be soft-clipped\ + \ in cigar strings." + info: null + direction: "input" +- name: "Output" + arguments: + - type: "file" + name: "--fastq_1" + description: "Output file for read 1.\n" + info: null + example: + - "read_out1.fastq" + must_exist: true + create_parent: true + required: false + direction: "output" + multiple: false + multiple_sep: ";" + - type: "file" + name: "--fastq_2" + description: "Output file for read 2.\n" + info: null + example: + - "read_out2.fastq" + must_exist: true + create_parent: true + required: false + direction: "output" + multiple: false + multiple_sep: ";" + - type: "file" + name: "--primary_fastq" + description: "Output reads that map to the primary reference.\n" + info: null + example: + - "primary.fastq.gz" + must_exist: true + create_parent: true + required: false + direction: "output" + multiple: false + multiple_sep: ";" + - type: "file" + name: "--all_fastq" + description: "Output reads that map to the primary reference.\n" + info: null + example: + - "all.fastq.gz" + must_exist: true + create_parent: true + required: false + direction: "output" + multiple: false + multiple_sep: ";" + - type: "file" + name: "--ref_fasta_list" + description: "Directory with index files.\n" + info: null + example: + - "bbsplit" + must_exist: true + create_parent: true + required: false + direction: "output" + multiple: false + multiple_sep: ";" + - type: "file" + name: "--sam2bam" + alternatives: + - "--bs" + description: "Write a shell script to 'file' that will turn the sam output into\ + \ a sorted, indexed bam file.\n" + info: null + example: + - "script.sh" + must_exist: true + create_parent: true + required: false + direction: "output" + multiple: false + multiple_sep: ";" + - type: "file" + name: "--scafstats" + description: "Write statistics on how many reads mapped to which scaffold to this\ + \ file.\n" + info: null + example: + - "scaffold_stats.txt" + must_exist: true + create_parent: true + required: false + direction: "output" + multiple: false + multiple_sep: ";" + - type: "file" + name: "--refstats" + description: "Write statistics on how many reads were assigned to which reference\ + \ to this file.\nUnmapped reads whose mate mapped to a reference are considered\ + \ assigned and will be counted.\n" + info: null + example: + - "reference_stats.txt" + must_exist: true + create_parent: true + required: false + direction: "output" + multiple: false + multiple_sep: ";" + - type: "boolean_true" + name: "--nzo" + description: "Only print lines with nonzero coverage." + info: null + direction: "input" +resources: +- type: "bash_script" + path: "script.sh" + is_executable: true +description: "Split sequencing reads by mapping them to multiple references simultaneously." +test_resources: +- type: "bash_script" + path: "test.sh" + is_executable: true +- type: "file" + path: "test_data" +info: null +status: "enabled" +requirements: + commands: + - "ps" +license: "BBTools Copyright (c) 2014" +links: + repository: "https://github.com/BioInfoTools/BBMap/blob/master/sh/bbsplit.sh" + homepage: "https://jgi.doe.gov/data-and-tools/software-tools/bbtools/bb-tools-user-guide/" + documentation: "https://jgi.doe.gov/data-and-tools/software-tools/bbtools/bb-tools-user-guide/bbmap-guide/" +runners: +- type: "executable" + id: "executable" + docker_setup_strategy: "ifneedbepullelsecachedbuild" +- type: "nextflow" + id: "nextflow" + directives: + tag: "$id" + auto: + simplifyInput: true + simplifyOutput: false + transcript: false + publish: false + config: + labels: + mem1gb: "memory = 1000000000.B" + mem2gb: "memory = 2000000000.B" + mem5gb: "memory = 5000000000.B" + mem10gb: "memory = 10000000000.B" + mem20gb: "memory = 20000000000.B" + mem50gb: "memory = 50000000000.B" + mem100gb: "memory = 100000000000.B" + mem200gb: "memory = 200000000000.B" + mem500gb: "memory = 500000000000.B" + mem1tb: "memory = 1000000000000.B" + mem2tb: "memory = 2000000000000.B" + mem5tb: "memory = 5000000000000.B" + mem10tb: "memory = 10000000000000.B" + mem20tb: "memory = 20000000000000.B" + mem50tb: "memory = 50000000000000.B" + mem100tb: "memory = 100000000000000.B" + mem200tb: "memory = 200000000000000.B" + mem500tb: "memory = 500000000000000.B" + mem1gib: "memory = 1073741824.B" + mem2gib: "memory = 2147483648.B" + mem4gib: "memory = 4294967296.B" + mem8gib: "memory = 8589934592.B" + mem16gib: "memory = 17179869184.B" + mem32gib: "memory = 34359738368.B" + mem64gib: "memory = 68719476736.B" + mem128gib: "memory = 137438953472.B" + mem256gib: "memory = 274877906944.B" + mem512gib: "memory = 549755813888.B" + mem1tib: "memory = 1099511627776.B" + mem2tib: "memory = 2199023255552.B" + mem4tib: "memory = 4398046511104.B" + mem8tib: "memory = 8796093022208.B" + mem16tib: "memory = 17592186044416.B" + mem32tib: "memory = 35184372088832.B" + mem64tib: "memory = 70368744177664.B" + mem128tib: "memory = 140737488355328.B" + mem256tib: "memory = 281474976710656.B" + mem512tib: "memory = 562949953421312.B" + cpu1: "cpus = 1" + cpu2: "cpus = 2" + cpu5: "cpus = 5" + cpu10: "cpus = 10" + cpu20: "cpus = 20" + cpu50: "cpus = 50" + cpu100: "cpus = 100" + cpu200: "cpus = 200" + cpu500: "cpus = 500" + cpu1000: "cpus = 1000" + debug: false + container: "docker" +engines: +- type: "docker" + id: "docker" + image: "ubuntu:22.04" + namespace_separator: "/" + setup: + - type: "docker" + run: + - "apt-get update && \\\napt-get install -y build-essential openjdk-17-jdk wget\ + \ tar && \\\nwget --no-check-certificate https://sourceforge.net/projects/bbmap/files/BBMap_39.01.tar.gz\ + \ && \\\ntar xzf BBMap_39.01.tar.gz && \\\ncp -r bbmap/* /usr/local/bin\n" + - type: "docker" + run: + - "echo \"${meta_functionality_name}: bbmap: $(bbversion.sh | grep -v \"Duplicate\ + \ cpuset\")\" > /var/software_versions.txt\n" + entrypoint: [] + cmd: null +build_info: + config: "[anonymized]/config.vsh.yaml" + runner: "executable" + engine: "docker" + output: "output" + executable: "output/bbmap_bbsplit" + viash_version: "0.9.0-RC6" + git_commit: "53e4dee07670cc9ee651ee10921fd2045097b4f1" + git_remote: "git@github.com:emmarousseau/biobox.git" +package_config: + name: "biobox" + description: "A collection of bioinformatics tools for working with sequence data.\n" + info: null + viash_version: "0.9.0-RC6" + source: "src" + target: "target" + config_mods: + - ".requirements.commands := ['ps']" + keywords: + - "bioinformatics" + - "modules" + - "sequencing" + license: "MIT" + links: + repository: "https://github.com/viash-hub/biobox" + issue_tracker: "https://github.com/viash-hub/biobox/issues" diff --git a/src/bbmap_bbsplit/output/bbmap_bbsplit b/src/bbmap_bbsplit/output/bbmap_bbsplit new file mode 100755 index 00000000..39d6e921 --- /dev/null +++ b/src/bbmap_bbsplit/output/bbmap_bbsplit @@ -0,0 +1,1755 @@ +#!/usr/bin/env bash + +# bbmap_bbsplit +# +# This wrapper script is auto-generated by viash 0.9.0-RC6 and is thus a +# derivative work thereof. This software comes with ABSOLUTELY NO WARRANTY from +# Data Intuitive. +# +# The component may contain files which fall under a different license. The +# authors of this component should specify the license in the header of such +# files, or include a separate license file detailing the licenses of all included +# files. + +set -e + +if [ -z "$VIASH_TEMP" ]; then + VIASH_TEMP=${VIASH_TEMP:-$VIASH_TMPDIR} + VIASH_TEMP=${VIASH_TEMP:-$VIASH_TEMPDIR} + VIASH_TEMP=${VIASH_TEMP:-$VIASH_TMP} + VIASH_TEMP=${VIASH_TEMP:-$TMPDIR} + VIASH_TEMP=${VIASH_TEMP:-$TMP} + VIASH_TEMP=${VIASH_TEMP:-$TEMPDIR} + VIASH_TEMP=${VIASH_TEMP:-$TEMP} + VIASH_TEMP=${VIASH_TEMP:-/tmp} +fi + +# define helper functions +# ViashQuote: put quotes around non flag values +# $1 : unquoted string +# return : possibly quoted string +# examples: +# ViashQuote --foo # returns --foo +# ViashQuote bar # returns 'bar' +# Viashquote --foo=bar # returns --foo='bar' +function ViashQuote { + if [[ "$1" =~ ^-+[a-zA-Z0-9_\-]+=.+$ ]]; then + echo "$1" | sed "s#=\(.*\)#='\1'#" + elif [[ "$1" =~ ^-+[a-zA-Z0-9_\-]+$ ]]; then + echo "$1" + else + echo "'$1'" + fi +} +# ViashRemoveFlags: Remove leading flag +# $1 : string with a possible leading flag +# return : string without possible leading flag +# examples: +# ViashRemoveFlags --foo=bar # returns bar +function ViashRemoveFlags { + echo "$1" | sed 's/^--*[a-zA-Z0-9_\-]*=//' +} +# ViashSourceDir: return the path of a bash file, following symlinks +# usage : ViashSourceDir ${BASH_SOURCE[0]} +# $1 : Should always be set to ${BASH_SOURCE[0]} +# returns : The absolute path of the bash file +function ViashSourceDir { + SOURCE="$1" + while [ -h "$SOURCE" ]; do + DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" + done + cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd +} +# ViashFindTargetDir: return the path of the '.build.yaml' file, following symlinks +# usage : ViashFindTargetDir 'ScriptPath' +# $1 : The location from where to start the upward search +# returns : The absolute path of the '.build.yaml' file +function ViashFindTargetDir { + SOURCE="$1" + while [[ "$SOURCE" != "" && ! -e "$SOURCE/.build.yaml" ]]; do + SOURCE=${SOURCE%/*} + done + echo $SOURCE +} +# see https://en.wikipedia.org/wiki/Syslog#Severity_level +VIASH_LOGCODE_EMERGENCY=0 +VIASH_LOGCODE_ALERT=1 +VIASH_LOGCODE_CRITICAL=2 +VIASH_LOGCODE_ERROR=3 +VIASH_LOGCODE_WARNING=4 +VIASH_LOGCODE_NOTICE=5 +VIASH_LOGCODE_INFO=6 +VIASH_LOGCODE_DEBUG=7 +VIASH_VERBOSITY=$VIASH_LOGCODE_NOTICE + +# ViashLog: Log events depending on the verbosity level +# usage: ViashLog 1 alert Oh no something went wrong! +# $1: required verbosity level +# $2: display tag +# $3+: messages to display +# stdout: Your input, prepended by '[$2] '. +function ViashLog { + local required_level="$1" + local display_tag="$2" + shift 2 + if [ $VIASH_VERBOSITY -ge $required_level ]; then + >&2 echo "[$display_tag]" "$@" + fi +} + +# ViashEmergency: log events when the system is unstable +# usage: ViashEmergency Oh no something went wrong. +# stdout: Your input, prepended by '[emergency] '. +function ViashEmergency { + ViashLog $VIASH_LOGCODE_EMERGENCY emergency "$@" +} + +# ViashAlert: log events when actions must be taken immediately (e.g. corrupted system database) +# usage: ViashAlert Oh no something went wrong. +# stdout: Your input, prepended by '[alert] '. +function ViashAlert { + ViashLog $VIASH_LOGCODE_ALERT alert "$@" +} + +# ViashCritical: log events when a critical condition occurs +# usage: ViashCritical Oh no something went wrong. +# stdout: Your input, prepended by '[critical] '. +function ViashCritical { + ViashLog $VIASH_LOGCODE_CRITICAL critical "$@" +} + +# ViashError: log events when an error condition occurs +# usage: ViashError Oh no something went wrong. +# stdout: Your input, prepended by '[error] '. +function ViashError { + ViashLog $VIASH_LOGCODE_ERROR error "$@" +} + +# ViashWarning: log potentially abnormal events +# usage: ViashWarning Something may have gone wrong. +# stdout: Your input, prepended by '[warning] '. +function ViashWarning { + ViashLog $VIASH_LOGCODE_WARNING warning "$@" +} + +# ViashNotice: log significant but normal events +# usage: ViashNotice This just happened. +# stdout: Your input, prepended by '[notice] '. +function ViashNotice { + ViashLog $VIASH_LOGCODE_NOTICE notice "$@" +} + +# ViashInfo: log normal events +# usage: ViashInfo This just happened. +# stdout: Your input, prepended by '[info] '. +function ViashInfo { + ViashLog $VIASH_LOGCODE_INFO info "$@" +} + +# ViashDebug: log all events, for debugging purposes +# usage: ViashDebug This just happened. +# stdout: Your input, prepended by '[debug] '. +function ViashDebug { + ViashLog $VIASH_LOGCODE_DEBUG debug "$@" +} + +# find source folder of this component +VIASH_META_RESOURCES_DIR=`ViashSourceDir ${BASH_SOURCE[0]}` + +# find the root of the built components & dependencies +VIASH_TARGET_DIR=`ViashFindTargetDir $VIASH_META_RESOURCES_DIR` + +# define meta fields +VIASH_META_NAME="bbmap_bbsplit" +VIASH_META_FUNCTIONALITY_NAME="bbmap_bbsplit" +VIASH_META_EXECUTABLE="$VIASH_META_RESOURCES_DIR/$VIASH_META_NAME" +VIASH_META_CONFIG="$VIASH_META_RESOURCES_DIR/.config.vsh.yaml" +VIASH_META_TEMP_DIR="$VIASH_TEMP" + + +# ViashHelp: Display helpful explanation about this executable +function ViashHelp { + echo "bbmap_bbsplit" + echo "" + echo "Split sequencing reads by mapping them to multiple references simultaneously." + echo "" + echo "Input:" + echo " --id" + echo " type: string" + echo " Sample ID" + echo "" + echo " --paired" + echo " type: boolean_true" + echo " Paired fastq files or not?" + echo "" + echo " --input" + echo " type: file, multiple values allowed, file must exist" + echo " example: reads.fastq" + echo " Input fastq files, either one or two (paired), separated by \";\"." + echo "" + echo " --primary_ref" + echo " type: file, file must exist" + echo " Primary reference FASTA" + echo "" + echo " --other_ref_names" + echo " type: file, file must exist" + echo " Path to comma-separated file containing a list of reference genomes to" + echo " filter reads" + echo " against with BBSplit." + echo "" + echo " --only_build_index" + echo " type: boolean_true" + echo " If set, only builds the index. Otherwise, mapping is performed." + echo "" + echo " --index" + echo " type: string" + echo " example: 1" + echo " Designate index to use. Corresponds to the number specified when" + echo " building the index." + echo " If building the index, this will be the build's id. If multiple" + echo " references are indexed" + echo " in the same directory, each needs a unique build ID. Default: 1.\\" + echo "" + echo " --qin" + echo " type: string" + echo " Set to 33 or 64 to specify input quality value ASCII offset." + echo " Automatically detected if" + echo " not specified." + echo "" + echo " --interleaved" + echo " type: boolean_true" + echo " True forces paired/interleaved input; false forces single-ended mapping." + echo " If not specified, interleaved status will be autodetected from read" + echo " names." + echo "" + echo " --maxindel" + echo " type: integer" + echo " example: 20" + echo " Don't look for indels longer than this. Lower is faster. Set to >=100k" + echo " for RNA-seq." + echo "" + echo " --minratio" + echo " type: double" + echo " example: 0.56" + echo " Fraction of max alignment score required to keep a site. Higher is" + echo " faster." + echo "" + echo " --minhits" + echo " type: integer" + echo " example: 1" + echo " Minimum number of seed hits required for candidate sites. Higher is" + echo " faster." + echo "" + echo " --ambiguous" + echo " type: string" + echo " example: best" + echo " choices: [ best, toss, random, all ]" + echo " Set behavior on ambiguously-mapped reads (with multiple top-scoring" + echo " mapping locations)." + echo " * best Use the first best site (Default)" + echo " * toss Consider unmapped" + echo " * random Select one top-scoring site randomly" + echo " * all Retain all top-scoring sites. Does not work yet with SAM" + echo " output" + echo "" + echo " --ambiguous2" + echo " type: string" + echo " example: best" + echo " choices: [ best, toss, all, split ]" + echo " Set behavior only for reads that map ambiguously to multiple different" + echo " references." + echo " Normal 'ambiguous=' controls behavior on all ambiguous reads;" + echo " Ambiguous2 excludes reads that map ambiguously within a single" + echo " reference." + echo " * best Use the first best site (Default)" + echo " * toss Consider unmapped" + echo " * all Write a copy to the output for each reference to which it" + echo " maps" + echo " * split Write a copy to the AMBIGUOUS_ output for each reference to" + echo " which it maps" + echo "" + echo " --qtrim" + echo " type: string" + echo " choices: [ l, r, lr ]" + echo " Quality-trim ends to Q5 before mapping. Options are 'l' (left), 'r'" + echo " (right), and 'lr' (both)." + echo "" + echo " --untrim" + echo " type: boolean_true" + echo " Undo trimming after mapping. Untrimmed bases will be soft-clipped in" + echo " cigar strings." + echo "" + echo "Output:" + echo " --fastq_1" + echo " type: file, output, file must exist" + echo " example: read_out1.fastq" + echo " Output file for read 1." + echo "" + echo " --fastq_2" + echo " type: file, output, file must exist" + echo " example: read_out2.fastq" + echo " Output file for read 2." + echo "" + echo " --primary_fastq" + echo " type: file, output, file must exist" + echo " example: primary.fastq.gz" + echo " Output reads that map to the primary reference." + echo "" + echo " --all_fastq" + echo " type: file, output, file must exist" + echo " example: all.fastq.gz" + echo " Output reads that map to the primary reference." + echo "" + echo " --ref_fasta_list" + echo " type: file, output, file must exist" + echo " example: bbsplit" + echo " Directory with index files." + echo "" + echo " --bs, --sam2bam" + echo " type: file, output, file must exist" + echo " example: script.sh" + echo " Write a shell script to 'file' that will turn the sam output into a" + echo " sorted, indexed bam file." + echo "" + echo " --scafstats" + echo " type: file, output, file must exist" + echo " example: scaffold_stats.txt" + echo " Write statistics on how many reads mapped to which scaffold to this" + echo " file." + echo "" + echo " --refstats" + echo " type: file, output, file must exist" + echo " example: reference_stats.txt" + echo " Write statistics on how many reads were assigned to which reference to" + echo " this file." + echo " Unmapped reads whose mate mapped to a reference are considered assigned" + echo " and will be counted." + echo "" + echo " --nzo" + echo " type: boolean_true" + echo " Only print lines with nonzero coverage." +} + +# initialise variables +VIASH_MODE='run' +VIASH_ENGINE_ID='docker' + +######## Helper functions for setting up Docker images for viash ######## +# expects: ViashDockerBuild + +# ViashDockerInstallationCheck: check whether Docker is installed correctly +# +# examples: +# ViashDockerInstallationCheck +function ViashDockerInstallationCheck { + ViashDebug "Checking whether Docker is installed" + if [ ! command -v docker &> /dev/null ]; then + ViashCritical "Docker doesn't seem to be installed. See 'https://docs.docker.com/get-docker/' for instructions." + exit 1 + fi + + ViashDebug "Checking whether the Docker daemon is running" + save=$-; set +e + docker_version=$(docker version --format '{{.Client.APIVersion}}' 2> /dev/null) + out=$? + [[ $save =~ e ]] && set -e + if [ $out -ne 0 ]; then + ViashCritical "Docker daemon does not seem to be running. Try one of the following:" + ViashCritical "- Try running 'dockerd' in the command line" + ViashCritical "- See https://docs.docker.com/config/daemon/" + exit 1 + fi +} + +# ViashDockerRemoteTagCheck: check whether a Docker image is available +# on a remote. Assumes `docker login` has been performed, if relevant. +# +# $1 : image identifier with format `[registry/]image[:tag]` +# exit code $? : whether or not the image was found +# examples: +# ViashDockerRemoteTagCheck python:latest +# echo $? # returns '0' +# ViashDockerRemoteTagCheck sdaizudceahifu +# echo $? # returns '1' +function ViashDockerRemoteTagCheck { + docker manifest inspect $1 > /dev/null 2> /dev/null +} + +# ViashDockerLocalTagCheck: check whether a Docker image is available locally +# +# $1 : image identifier with format `[registry/]image[:tag]` +# exit code $? : whether or not the image was found +# examples: +# docker pull python:latest +# ViashDockerLocalTagCheck python:latest +# echo $? # returns '0' +# ViashDockerLocalTagCheck sdaizudceahifu +# echo $? # returns '1' +function ViashDockerLocalTagCheck { + [ -n "$(docker images -q $1)" ] +} + +# ViashDockerPull: pull a Docker image +# +# $1 : image identifier with format `[registry/]image[:tag]` +# exit code $? : whether or not the image was found +# examples: +# ViashDockerPull python:latest +# echo $? # returns '0' +# ViashDockerPull sdaizudceahifu +# echo $? # returns '1' +function ViashDockerPull { + ViashNotice "Checking if Docker image is available at '$1'" + if [ $VIASH_VERBOSITY -ge $VIASH_LOGCODE_INFO ]; then + docker pull $1 && return 0 || return 1 + else + save=$-; set +e + docker pull $1 2> /dev/null > /dev/null + out=$? + [[ $save =~ e ]] && set -e + if [ $out -ne 0 ]; then + ViashWarning "Could not pull from '$1'. Docker image doesn't exist or is not accessible." + fi + return $out + fi +} + +# ViashDockerPush: push a Docker image +# +# $1 : image identifier with format `[registry/]image[:tag]` +# exit code $? : whether or not the image was found +# examples: +# ViashDockerPush python:latest +# echo $? # returns '0' +# ViashDockerPush sdaizudceahifu +# echo $? # returns '1' +function ViashDockerPush { + ViashNotice "Pushing image to '$1'" + save=$-; set +e + if [ $VIASH_VERBOSITY -ge $VIASH_LOGCODE_INFO ]; then + docker push $1 + out=$? + else + docker push $1 2> /dev/null > /dev/null + out=$? + fi + [[ $save =~ e ]] && set -e + if [ $out -eq 0 ]; then + ViashNotice "Container '$1' push succeeded." + else + ViashError "Container '$1' push errored. You might not be logged in or have the necessary permissions." + fi + return $out +} + +# ViashDockerPullElseBuild: pull a Docker image, else build it +# +# $1 : image identifier with format `[registry/]image[:tag]` +# ViashDockerBuild : a Bash function which builds a docker image, takes image identifier as argument. +# examples: +# ViashDockerPullElseBuild mynewcomponent +function ViashDockerPullElseBuild { + save=$-; set +e + ViashDockerPull $1 + out=$? + [[ $save =~ e ]] && set -e + if [ $out -ne 0 ]; then + ViashDockerBuild $@ + fi +} + +# ViashDockerSetup: create a Docker image, according to specified docker setup strategy +# +# $1 : image identifier with format `[registry/]image[:tag]` +# $2 : docker setup strategy, see DockerSetupStrategy.scala +# examples: +# ViashDockerSetup mynewcomponent alwaysbuild +function ViashDockerSetup { + local image_id="$1" + local setup_strategy="$2" + if [ "$setup_strategy" == "alwaysbuild" -o "$setup_strategy" == "build" -o "$setup_strategy" == "b" ]; then + ViashDockerBuild $image_id --no-cache $(ViashDockerBuildArgs "$engine_id") + elif [ "$setup_strategy" == "alwayspull" -o "$setup_strategy" == "pull" -o "$setup_strategy" == "p" ]; then + ViashDockerPull $image_id + elif [ "$setup_strategy" == "alwayspullelsebuild" -o "$setup_strategy" == "pullelsebuild" ]; then + ViashDockerPullElseBuild $image_id --no-cache $(ViashDockerBuildArgs "$engine_id") + elif [ "$setup_strategy" == "alwayspullelsecachedbuild" -o "$setup_strategy" == "pullelsecachedbuild" ]; then + ViashDockerPullElseBuild $image_id $(ViashDockerBuildArgs "$engine_id") + elif [ "$setup_strategy" == "alwayscachedbuild" -o "$setup_strategy" == "cachedbuild" -o "$setup_strategy" == "cb" ]; then + ViashDockerBuild $image_id $(ViashDockerBuildArgs "$engine_id") + elif [[ "$setup_strategy" =~ ^ifneedbe ]]; then + local save=$-; set +e + ViashDockerLocalTagCheck $image_id + local outCheck=$? + [[ $save =~ e ]] && set -e + if [ $outCheck -eq 0 ]; then + ViashInfo "Image $image_id already exists" + elif [ "$setup_strategy" == "ifneedbebuild" ]; then + ViashDockerBuild $image_id --no-cache $(ViashDockerBuildArgs "$engine_id") + elif [ "$setup_strategy" == "ifneedbecachedbuild" ]; then + ViashDockerBuild $image_id $(ViashDockerBuildArgs "$engine_id") + elif [ "$setup_strategy" == "ifneedbepull" ]; then + ViashDockerPull $image_id + elif [ "$setup_strategy" == "ifneedbepullelsebuild" ]; then + ViashDockerPullElseBuild $image_id --no-cache $(ViashDockerBuildArgs "$engine_id") + elif [ "$setup_strategy" == "ifneedbepullelsecachedbuild" ]; then + ViashDockerPullElseBuild $image_id $(ViashDockerBuildArgs "$engine_id") + else + ViashError "Unrecognised Docker strategy: $setup_strategy" + exit 1 + fi + elif [ "$setup_strategy" == "push" -o "$setup_strategy" == "forcepush" -o "$setup_strategy" == "alwayspush" ]; then + ViashDockerPush "$image_id" + elif [ "$setup_strategy" == "pushifnotpresent" -o "$setup_strategy" == "gentlepush" -o "$setup_strategy" == "maybepush" ]; then + local save=$-; set +e + ViashDockerRemoteTagCheck $image_id + local outCheck=$? + [[ $save =~ e ]] && set -e + if [ $outCheck -eq 0 ]; then + ViashNotice "Container '$image_id' exists, doing nothing." + else + ViashNotice "Container '$image_id' does not yet exist." + ViashDockerPush "$image_id" + fi + elif [ "$setup_strategy" == "donothing" -o "$setup_strategy" == "meh" ]; then + ViashNotice "Skipping setup." + else + ViashError "Unrecognised Docker strategy: $setup_strategy" + exit 1 + fi +} + +# ViashDockerCheckCommands: Check whether a docker container has the required commands +# +# $1 : image identifier with format `[registry/]image[:tag]` +# $@ : commands to verify being present +# examples: +# ViashDockerCheckCommands bash:4.0 bash ps foo +function ViashDockerCheckCommands { + local image_id="$1" + shift 1 + local commands="$@" + local save=$-; set +e + local missing # mark 'missing' as local in advance, otherwise the exit code of the command will be missing and always be '0' + missing=$(docker run --rm --entrypoint=sh "$image_id" -c "for command in $commands; do command -v \$command >/dev/null 2>&1; if [ \$? -ne 0 ]; then echo \$command; exit 1; fi; done") + local outCheck=$? + [[ $save =~ e ]] && set -e + if [ $outCheck -ne 0 ]; then + ViashError "Docker container '$image_id' does not contain command '$missing'." + exit 1 + fi +} + +# ViashDockerBuild: build a docker image +# $1 : image identifier with format `[registry/]image[:tag]` +# $... : additional arguments to pass to docker build +# $VIASH_META_TEMP_DIR : temporary directory to store dockerfile & optional resources in +# $VIASH_META_NAME : name of the component +# $VIASH_META_RESOURCES_DIR : directory containing the resources +# $VIASH_VERBOSITY : verbosity level +# exit code $? : whether or not the image was built successfully +function ViashDockerBuild { + local image_id="$1" + shift 1 + + # create temporary directory to store dockerfile & optional resources in + local tmpdir=$(mktemp -d "$VIASH_META_TEMP_DIR/dockerbuild-$VIASH_META_NAME-XXXXXX") + local dockerfile="$tmpdir/Dockerfile" + function clean_up { + rm -rf "$tmpdir" + } + trap clean_up EXIT + + # store dockerfile and resources + ViashDockerfile "$VIASH_ENGINE_ID" > "$dockerfile" + + # generate the build command + local docker_build_cmd="docker build -t '$image_id' $@ '$VIASH_META_RESOURCES_DIR' -f '$dockerfile'" + + # build the container + ViashNotice "Building container '$image_id' with Dockerfile" + ViashInfo "$docker_build_cmd" + local save=$-; set +e + if [ $VIASH_VERBOSITY -ge $VIASH_LOGCODE_INFO ]; then + eval $docker_build_cmd + else + eval $docker_build_cmd &> "$tmpdir/docker_build.log" + fi + + # check exit code + local out=$? + [[ $save =~ e ]] && set -e + if [ $out -ne 0 ]; then + ViashError "Error occurred while building container '$image_id'" + if [ $VIASH_VERBOSITY -lt $VIASH_LOGCODE_INFO ]; then + ViashError "Transcript: --------------------------------" + cat "$tmpdir/docker_build.log" + ViashError "End of transcript --------------------------" + fi + exit 1 + fi +} + +######## End of helper functions for setting up Docker images for viash ######## + +# ViashDockerFile: print the dockerfile to stdout +# $1 : engine identifier +# return : dockerfile required to run this component +# examples: +# ViashDockerFile +function ViashDockerfile { + local engine_id="$1" + + if [[ "$engine_id" == "docker" ]]; then + cat << 'VIASHDOCKER' +FROM ubuntu:22.04 +ENTRYPOINT [] +RUN apt-get update && \ +apt-get install -y build-essential openjdk-17-jdk wget tar && \ +wget --no-check-certificate https://sourceforge.net/projects/bbmap/files/BBMap_39.01.tar.gz && \ +tar xzf BBMap_39.01.tar.gz && \ +cp -r bbmap/* /usr/local/bin + +RUN echo "${meta_functionality_name}: bbmap: $(bbversion.sh | grep -v "Duplicate cpuset")" > /var/software_versions.txt + +LABEL org.opencontainers.image.description="Companion container for running component bbmap bbmap_bbsplit" +LABEL org.opencontainers.image.created="2024-08-25T19:03:57+01:00" +LABEL org.opencontainers.image.source="https://github.com/BioInfoTools/BBMap/blob/master/sh/bbsplit.sh" +LABEL org.opencontainers.image.revision="53e4dee07670cc9ee651ee10921fd2045097b4f1" + +VIASHDOCKER + fi +} + +# ViashDockerBuildArgs: return the arguments to pass to docker build +# $1 : engine identifier +# return : arguments to pass to docker build +function ViashDockerBuildArgs { + local engine_id="$1" + + if [[ "$engine_id" == "docker" ]]; then + echo "" + fi +} + +# ViashAbsolutePath: generate absolute path from relative path +# borrowed from https://stackoverflow.com/a/21951256 +# $1 : relative filename +# return : absolute path +# examples: +# ViashAbsolutePath some_file.txt # returns /path/to/some_file.txt +# ViashAbsolutePath /foo/bar/.. # returns /foo +function ViashAbsolutePath { + local thePath + if [[ ! "$1" =~ ^/ ]]; then + thePath="$PWD/$1" + else + thePath="$1" + fi + echo "$thePath" | ( + IFS=/ + read -a parr + declare -a outp + for i in "${parr[@]}"; do + case "$i" in + ''|.) continue ;; + ..) + len=${#outp[@]} + if ((len==0)); then + continue + else + unset outp[$((len-1))] + fi + ;; + *) + len=${#outp[@]} + outp[$len]="$i" + ;; + esac + done + echo /"${outp[*]}" + ) +} +# ViashDockerAutodetectMount: auto configuring docker mounts from parameters +# $1 : The parameter value +# returns : New parameter +# $VIASH_DIRECTORY_MOUNTS : Added another parameter to be passed to docker +# examples: +# ViashDockerAutodetectMount /path/to/bar # returns '/viash_automount/path/to/bar' +# ViashDockerAutodetectMountArg /path/to/bar # returns '--volume="/path/to:/viash_automount/path/to"' +function ViashDockerAutodetectMount { + abs_path=$(ViashAbsolutePath "$1") + if [ -d "$abs_path" ]; then + mount_source="$abs_path" + base_name="" + else + mount_source=`dirname "$abs_path"` + base_name=`basename "$abs_path"` + fi + mount_target="/viash_automount$mount_source" + if [ -z "$base_name" ]; then + echo "$mount_target" + else + echo "$mount_target/$base_name" + fi +} +function ViashDockerAutodetectMountArg { + abs_path=$(ViashAbsolutePath "$1") + if [ -d "$abs_path" ]; then + mount_source="$abs_path" + base_name="" + else + mount_source=`dirname "$abs_path"` + base_name=`basename "$abs_path"` + fi + mount_target="/viash_automount$mount_source" + ViashDebug "ViashDockerAutodetectMountArg $1 -> $mount_source -> $mount_target" + echo "--volume=\"$mount_source:$mount_target\"" +} +function ViashDockerStripAutomount { + abs_path=$(ViashAbsolutePath "$1") + echo "${abs_path#/viash_automount}" +} +# initialise variables +VIASH_DIRECTORY_MOUNTS=() + +# initialise docker variables +VIASH_DOCKER_RUN_ARGS=(-i --rm) + +# initialise array +VIASH_POSITIONAL_ARGS='' + +while [[ $# -gt 0 ]]; do + case "$1" in + -h|--help) + ViashHelp + exit + ;; + ---v|---verbose) + let "VIASH_VERBOSITY=VIASH_VERBOSITY+1" + shift 1 + ;; + ---verbosity) + VIASH_VERBOSITY="$2" + shift 2 + ;; + ---verbosity=*) + VIASH_VERBOSITY="$(ViashRemoveFlags "$1")" + shift 1 + ;; + --version) + echo "bbmap_bbsplit" + exit + ;; + --id) + [ -n "$VIASH_PAR_ID" ] && ViashError Bad arguments for option \'--id\': \'$VIASH_PAR_ID\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_ID="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --id. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --id=*) + [ -n "$VIASH_PAR_ID" ] && ViashError Bad arguments for option \'--id=*\': \'$VIASH_PAR_ID\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_ID=$(ViashRemoveFlags "$1") + shift 1 + ;; + --paired) + [ -n "$VIASH_PAR_PAIRED" ] && ViashError Bad arguments for option \'--paired\': \'$VIASH_PAR_PAIRED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_PAIRED=true + shift 1 + ;; + --input) + if [ -z "$VIASH_PAR_INPUT" ]; then + VIASH_PAR_INPUT="$2" + else + VIASH_PAR_INPUT="$VIASH_PAR_INPUT;""$2" + fi + [ $# -lt 2 ] && ViashError Not enough arguments passed to --input. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --input=*) + if [ -z "$VIASH_PAR_INPUT" ]; then + VIASH_PAR_INPUT=$(ViashRemoveFlags "$1") + else + VIASH_PAR_INPUT="$VIASH_PAR_INPUT;"$(ViashRemoveFlags "$1") + fi + shift 1 + ;; + --primary_ref) + [ -n "$VIASH_PAR_PRIMARY_REF" ] && ViashError Bad arguments for option \'--primary_ref\': \'$VIASH_PAR_PRIMARY_REF\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_PRIMARY_REF="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --primary_ref. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --primary_ref=*) + [ -n "$VIASH_PAR_PRIMARY_REF" ] && ViashError Bad arguments for option \'--primary_ref=*\': \'$VIASH_PAR_PRIMARY_REF\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_PRIMARY_REF=$(ViashRemoveFlags "$1") + shift 1 + ;; + --other_ref_names) + [ -n "$VIASH_PAR_OTHER_REF_NAMES" ] && ViashError Bad arguments for option \'--other_ref_names\': \'$VIASH_PAR_OTHER_REF_NAMES\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_OTHER_REF_NAMES="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --other_ref_names. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --other_ref_names=*) + [ -n "$VIASH_PAR_OTHER_REF_NAMES" ] && ViashError Bad arguments for option \'--other_ref_names=*\': \'$VIASH_PAR_OTHER_REF_NAMES\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_OTHER_REF_NAMES=$(ViashRemoveFlags "$1") + shift 1 + ;; + --only_build_index) + [ -n "$VIASH_PAR_ONLY_BUILD_INDEX" ] && ViashError Bad arguments for option \'--only_build_index\': \'$VIASH_PAR_ONLY_BUILD_INDEX\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_ONLY_BUILD_INDEX=true + shift 1 + ;; + --index) + [ -n "$VIASH_PAR_INDEX" ] && ViashError Bad arguments for option \'--index\': \'$VIASH_PAR_INDEX\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_INDEX="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --index. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --index=*) + [ -n "$VIASH_PAR_INDEX" ] && ViashError Bad arguments for option \'--index=*\': \'$VIASH_PAR_INDEX\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_INDEX=$(ViashRemoveFlags "$1") + shift 1 + ;; + --qin) + [ -n "$VIASH_PAR_QIN" ] && ViashError Bad arguments for option \'--qin\': \'$VIASH_PAR_QIN\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_QIN="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --qin. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --qin=*) + [ -n "$VIASH_PAR_QIN" ] && ViashError Bad arguments for option \'--qin=*\': \'$VIASH_PAR_QIN\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_QIN=$(ViashRemoveFlags "$1") + shift 1 + ;; + --interleaved) + [ -n "$VIASH_PAR_INTERLEAVED" ] && ViashError Bad arguments for option \'--interleaved\': \'$VIASH_PAR_INTERLEAVED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_INTERLEAVED=true + shift 1 + ;; + --maxindel) + [ -n "$VIASH_PAR_MAXINDEL" ] && ViashError Bad arguments for option \'--maxindel\': \'$VIASH_PAR_MAXINDEL\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_MAXINDEL="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --maxindel. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --maxindel=*) + [ -n "$VIASH_PAR_MAXINDEL" ] && ViashError Bad arguments for option \'--maxindel=*\': \'$VIASH_PAR_MAXINDEL\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_MAXINDEL=$(ViashRemoveFlags "$1") + shift 1 + ;; + --minratio) + [ -n "$VIASH_PAR_MINRATIO" ] && ViashError Bad arguments for option \'--minratio\': \'$VIASH_PAR_MINRATIO\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_MINRATIO="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --minratio. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --minratio=*) + [ -n "$VIASH_PAR_MINRATIO" ] && ViashError Bad arguments for option \'--minratio=*\': \'$VIASH_PAR_MINRATIO\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_MINRATIO=$(ViashRemoveFlags "$1") + shift 1 + ;; + --minhits) + [ -n "$VIASH_PAR_MINHITS" ] && ViashError Bad arguments for option \'--minhits\': \'$VIASH_PAR_MINHITS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_MINHITS="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --minhits. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --minhits=*) + [ -n "$VIASH_PAR_MINHITS" ] && ViashError Bad arguments for option \'--minhits=*\': \'$VIASH_PAR_MINHITS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_MINHITS=$(ViashRemoveFlags "$1") + shift 1 + ;; + --ambiguous) + [ -n "$VIASH_PAR_AMBIGUOUS" ] && ViashError Bad arguments for option \'--ambiguous\': \'$VIASH_PAR_AMBIGUOUS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_AMBIGUOUS="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --ambiguous. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --ambiguous=*) + [ -n "$VIASH_PAR_AMBIGUOUS" ] && ViashError Bad arguments for option \'--ambiguous=*\': \'$VIASH_PAR_AMBIGUOUS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_AMBIGUOUS=$(ViashRemoveFlags "$1") + shift 1 + ;; + --ambiguous2) + [ -n "$VIASH_PAR_AMBIGUOUS2" ] && ViashError Bad arguments for option \'--ambiguous2\': \'$VIASH_PAR_AMBIGUOUS2\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_AMBIGUOUS2="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --ambiguous2. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --ambiguous2=*) + [ -n "$VIASH_PAR_AMBIGUOUS2" ] && ViashError Bad arguments for option \'--ambiguous2=*\': \'$VIASH_PAR_AMBIGUOUS2\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_AMBIGUOUS2=$(ViashRemoveFlags "$1") + shift 1 + ;; + --qtrim) + [ -n "$VIASH_PAR_QTRIM" ] && ViashError Bad arguments for option \'--qtrim\': \'$VIASH_PAR_QTRIM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_QTRIM="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --qtrim. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --qtrim=*) + [ -n "$VIASH_PAR_QTRIM" ] && ViashError Bad arguments for option \'--qtrim=*\': \'$VIASH_PAR_QTRIM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_QTRIM=$(ViashRemoveFlags "$1") + shift 1 + ;; + --untrim) + [ -n "$VIASH_PAR_UNTRIM" ] && ViashError Bad arguments for option \'--untrim\': \'$VIASH_PAR_UNTRIM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_UNTRIM=true + shift 1 + ;; + --fastq_1) + [ -n "$VIASH_PAR_FASTQ_1" ] && ViashError Bad arguments for option \'--fastq_1\': \'$VIASH_PAR_FASTQ_1\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_FASTQ_1="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --fastq_1. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --fastq_1=*) + [ -n "$VIASH_PAR_FASTQ_1" ] && ViashError Bad arguments for option \'--fastq_1=*\': \'$VIASH_PAR_FASTQ_1\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_FASTQ_1=$(ViashRemoveFlags "$1") + shift 1 + ;; + --fastq_2) + [ -n "$VIASH_PAR_FASTQ_2" ] && ViashError Bad arguments for option \'--fastq_2\': \'$VIASH_PAR_FASTQ_2\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_FASTQ_2="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --fastq_2. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --fastq_2=*) + [ -n "$VIASH_PAR_FASTQ_2" ] && ViashError Bad arguments for option \'--fastq_2=*\': \'$VIASH_PAR_FASTQ_2\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_FASTQ_2=$(ViashRemoveFlags "$1") + shift 1 + ;; + --primary_fastq) + [ -n "$VIASH_PAR_PRIMARY_FASTQ" ] && ViashError Bad arguments for option \'--primary_fastq\': \'$VIASH_PAR_PRIMARY_FASTQ\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_PRIMARY_FASTQ="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --primary_fastq. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --primary_fastq=*) + [ -n "$VIASH_PAR_PRIMARY_FASTQ" ] && ViashError Bad arguments for option \'--primary_fastq=*\': \'$VIASH_PAR_PRIMARY_FASTQ\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_PRIMARY_FASTQ=$(ViashRemoveFlags "$1") + shift 1 + ;; + --all_fastq) + [ -n "$VIASH_PAR_ALL_FASTQ" ] && ViashError Bad arguments for option \'--all_fastq\': \'$VIASH_PAR_ALL_FASTQ\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_ALL_FASTQ="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --all_fastq. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --all_fastq=*) + [ -n "$VIASH_PAR_ALL_FASTQ" ] && ViashError Bad arguments for option \'--all_fastq=*\': \'$VIASH_PAR_ALL_FASTQ\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_ALL_FASTQ=$(ViashRemoveFlags "$1") + shift 1 + ;; + --ref_fasta_list) + [ -n "$VIASH_PAR_REF_FASTA_LIST" ] && ViashError Bad arguments for option \'--ref_fasta_list\': \'$VIASH_PAR_REF_FASTA_LIST\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_REF_FASTA_LIST="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --ref_fasta_list. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --ref_fasta_list=*) + [ -n "$VIASH_PAR_REF_FASTA_LIST" ] && ViashError Bad arguments for option \'--ref_fasta_list=*\': \'$VIASH_PAR_REF_FASTA_LIST\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_REF_FASTA_LIST=$(ViashRemoveFlags "$1") + shift 1 + ;; + --sam2bam) + [ -n "$VIASH_PAR_SAM2BAM" ] && ViashError Bad arguments for option \'--sam2bam\': \'$VIASH_PAR_SAM2BAM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_SAM2BAM="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --sam2bam. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --sam2bam=*) + [ -n "$VIASH_PAR_SAM2BAM" ] && ViashError Bad arguments for option \'--sam2bam=*\': \'$VIASH_PAR_SAM2BAM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_SAM2BAM=$(ViashRemoveFlags "$1") + shift 1 + ;; + --bs) + [ -n "$VIASH_PAR_SAM2BAM" ] && ViashError Bad arguments for option \'--bs\': \'$VIASH_PAR_SAM2BAM\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_SAM2BAM="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --bs. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --scafstats) + [ -n "$VIASH_PAR_SCAFSTATS" ] && ViashError Bad arguments for option \'--scafstats\': \'$VIASH_PAR_SCAFSTATS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_SCAFSTATS="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --scafstats. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --scafstats=*) + [ -n "$VIASH_PAR_SCAFSTATS" ] && ViashError Bad arguments for option \'--scafstats=*\': \'$VIASH_PAR_SCAFSTATS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_SCAFSTATS=$(ViashRemoveFlags "$1") + shift 1 + ;; + --refstats) + [ -n "$VIASH_PAR_REFSTATS" ] && ViashError Bad arguments for option \'--refstats\': \'$VIASH_PAR_REFSTATS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_REFSTATS="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to --refstats. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + --refstats=*) + [ -n "$VIASH_PAR_REFSTATS" ] && ViashError Bad arguments for option \'--refstats=*\': \'$VIASH_PAR_REFSTATS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_REFSTATS=$(ViashRemoveFlags "$1") + shift 1 + ;; + --nzo) + [ -n "$VIASH_PAR_NZO" ] && ViashError Bad arguments for option \'--nzo\': \'$VIASH_PAR_NZO\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_PAR_NZO=true + shift 1 + ;; + ---engine) + VIASH_ENGINE_ID="$2" + shift 2 + ;; + ---engine=*) + VIASH_ENGINE_ID="$(ViashRemoveFlags "$1")" + shift 1 + ;; + ---setup) + VIASH_MODE='setup' + VIASH_SETUP_STRATEGY="$2" + shift 2 + ;; + ---setup=*) + VIASH_MODE='setup' + VIASH_SETUP_STRATEGY="$(ViashRemoveFlags "$1")" + shift 1 + ;; + ---dockerfile) + VIASH_MODE='dockerfile' + shift 1 + ;; + ---debug) + VIASH_MODE='debug' + shift 1 + ;; + ---cpus) + [ -n "$VIASH_META_CPUS" ] && ViashError Bad arguments for option \'---cpus\': \'$VIASH_META_CPUS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_META_CPUS="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to ---cpus. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + ---cpus=*) + [ -n "$VIASH_META_CPUS" ] && ViashError Bad arguments for option \'---cpus=*\': \'$VIASH_META_CPUS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_META_CPUS=$(ViashRemoveFlags "$1") + shift 1 + ;; + ---memory) + [ -n "$VIASH_META_MEMORY" ] && ViashError Bad arguments for option \'---memory\': \'$VIASH_META_MEMORY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_META_MEMORY="$2" + [ $# -lt 2 ] && ViashError Not enough arguments passed to ---memory. Use "--help" to get more information on the parameters. && exit 1 + shift 2 + ;; + ---memory=*) + [ -n "$VIASH_META_MEMORY" ] && ViashError Bad arguments for option \'---memory=*\': \'$VIASH_META_MEMORY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1 + VIASH_META_MEMORY=$(ViashRemoveFlags "$1") + shift 1 + ;; + *) # positional arg or unknown option + # since the positional args will be eval'd, can we always quote, instead of using ViashQuote + VIASH_POSITIONAL_ARGS="$VIASH_POSITIONAL_ARGS '$1'" + [[ $1 == -* ]] && ViashWarning $1 looks like a parameter but is not a defined parameter and will instead be treated as a positional argument. Use "--help" to get more information on the parameters. + shift # past argument + ;; + esac +done + +# parse positional parameters +eval set -- $VIASH_POSITIONAL_ARGS + + +if [ "$VIASH_ENGINE_ID" == "docker" ] ; then + VIASH_ENGINE_TYPE='docker' +else + ViashError "Engine '$VIASH_ENGINE_ID' is not recognized. Options are: docker." + exit 1 +fi + +if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then + # check if docker is installed properly + ViashDockerInstallationCheck + + # determine docker image id + if [[ "$VIASH_ENGINE_ID" == 'docker' ]]; then + VIASH_DOCKER_IMAGE_ID='biobox/bbmap/bbmap_bbsplit:latest' + fi + + # print dockerfile + if [ "$VIASH_MODE" == "dockerfile" ]; then + ViashDockerfile "$VIASH_ENGINE_ID" + exit 0 + + # enter docker container + elif [[ "$VIASH_MODE" == "debug" ]]; then + VIASH_CMD="docker run --entrypoint=bash ${VIASH_DOCKER_RUN_ARGS[@]} -v '$(pwd)':/pwd --workdir /pwd -t $VIASH_DOCKER_IMAGE_ID" + ViashNotice "+ $VIASH_CMD" + eval $VIASH_CMD + exit + + # build docker image + elif [ "$VIASH_MODE" == "setup" ]; then + ViashDockerSetup "$VIASH_DOCKER_IMAGE_ID" "$VIASH_SETUP_STRATEGY" + ViashDockerCheckCommands "$VIASH_DOCKER_IMAGE_ID" 'ps' 'bash' + exit 0 + fi + + # check if docker image exists + ViashDockerSetup "$VIASH_DOCKER_IMAGE_ID" ifneedbepullelsecachedbuild + ViashDockerCheckCommands "$VIASH_DOCKER_IMAGE_ID" 'ps' 'bash' +fi + +# setting computational defaults + +# helper function for parsing memory strings +function ViashMemoryAsBytes { + local memory=`echo "$1" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]'` + local memory_regex='^([0-9]+)([kmgtp]i?b?|b)$' + if [[ $memory =~ $memory_regex ]]; then + local number=${memory/[^0-9]*/} + local symbol=${memory/*[0-9]/} + + case $symbol in + b) memory_b=$number ;; + kb|k) memory_b=$(( $number * 1000 )) ;; + mb|m) memory_b=$(( $number * 1000 * 1000 )) ;; + gb|g) memory_b=$(( $number * 1000 * 1000 * 1000 )) ;; + tb|t) memory_b=$(( $number * 1000 * 1000 * 1000 * 1000 )) ;; + pb|p) memory_b=$(( $number * 1000 * 1000 * 1000 * 1000 * 1000 )) ;; + kib|ki) memory_b=$(( $number * 1024 )) ;; + mib|mi) memory_b=$(( $number * 1024 * 1024 )) ;; + gib|gi) memory_b=$(( $number * 1024 * 1024 * 1024 )) ;; + tib|ti) memory_b=$(( $number * 1024 * 1024 * 1024 * 1024 )) ;; + pib|pi) memory_b=$(( $number * 1024 * 1024 * 1024 * 1024 * 1024 )) ;; + esac + echo "$memory_b" + fi +} +# compute memory in different units +if [ ! -z ${VIASH_META_MEMORY+x} ]; then + VIASH_META_MEMORY_B=`ViashMemoryAsBytes $VIASH_META_MEMORY` + # do not define other variables if memory_b is an empty string + if [ ! -z "$VIASH_META_MEMORY_B" ]; then + VIASH_META_MEMORY_KB=$(( ($VIASH_META_MEMORY_B+999) / 1000 )) + VIASH_META_MEMORY_MB=$(( ($VIASH_META_MEMORY_KB+999) / 1000 )) + VIASH_META_MEMORY_GB=$(( ($VIASH_META_MEMORY_MB+999) / 1000 )) + VIASH_META_MEMORY_TB=$(( ($VIASH_META_MEMORY_GB+999) / 1000 )) + VIASH_META_MEMORY_PB=$(( ($VIASH_META_MEMORY_TB+999) / 1000 )) + VIASH_META_MEMORY_KIB=$(( ($VIASH_META_MEMORY_B+1023) / 1024 )) + VIASH_META_MEMORY_MIB=$(( ($VIASH_META_MEMORY_KIB+1023) / 1024 )) + VIASH_META_MEMORY_GIB=$(( ($VIASH_META_MEMORY_MIB+1023) / 1024 )) + VIASH_META_MEMORY_TIB=$(( ($VIASH_META_MEMORY_GIB+1023) / 1024 )) + VIASH_META_MEMORY_PIB=$(( ($VIASH_META_MEMORY_TIB+1023) / 1024 )) + else + # unset memory if string is empty + unset $VIASH_META_MEMORY_B + fi +fi +# unset nproc if string is empty +if [ -z "$VIASH_META_CPUS" ]; then + unset $VIASH_META_CPUS +fi + + +# check whether required parameters exist +if [ -z ${VIASH_META_NAME+x} ]; then + ViashError 'name' is a required argument. Use "--help" to get more information on the parameters. + exit 1 +fi +if [ -z ${VIASH_META_FUNCTIONALITY_NAME+x} ]; then + ViashError 'functionality_name' is a required argument. Use "--help" to get more information on the parameters. + exit 1 +fi +if [ -z ${VIASH_META_RESOURCES_DIR+x} ]; then + ViashError 'resources_dir' is a required argument. Use "--help" to get more information on the parameters. + exit 1 +fi +if [ -z ${VIASH_META_EXECUTABLE+x} ]; then + ViashError 'executable' is a required argument. Use "--help" to get more information on the parameters. + exit 1 +fi +if [ -z ${VIASH_META_CONFIG+x} ]; then + ViashError 'config' is a required argument. Use "--help" to get more information on the parameters. + exit 1 +fi +if [ -z ${VIASH_META_TEMP_DIR+x} ]; then + ViashError 'temp_dir' is a required argument. Use "--help" to get more information on the parameters. + exit 1 +fi + +# filling in defaults +if [ -z ${VIASH_PAR_PAIRED+x} ]; then + VIASH_PAR_PAIRED="false" +fi +if [ -z ${VIASH_PAR_ONLY_BUILD_INDEX+x} ]; then + VIASH_PAR_ONLY_BUILD_INDEX="false" +fi +if [ -z ${VIASH_PAR_INTERLEAVED+x} ]; then + VIASH_PAR_INTERLEAVED="false" +fi +if [ -z ${VIASH_PAR_UNTRIM+x} ]; then + VIASH_PAR_UNTRIM="false" +fi +if [ -z ${VIASH_PAR_NZO+x} ]; then + VIASH_PAR_NZO="false" +fi + +# check whether required files exist +if [ ! -z "$VIASH_PAR_INPUT" ]; then + IFS=';' + set -f + for file in $VIASH_PAR_INPUT; do + unset IFS + if [ ! -e "$file" ]; then + ViashError "Input file '$file' does not exist." + exit 1 + fi + done + set +f +fi +if [ ! -z "$VIASH_PAR_PRIMARY_REF" ] && [ ! -e "$VIASH_PAR_PRIMARY_REF" ]; then + ViashError "Input file '$VIASH_PAR_PRIMARY_REF' does not exist." + exit 1 +fi +if [ ! -z "$VIASH_PAR_OTHER_REF_NAMES" ] && [ ! -e "$VIASH_PAR_OTHER_REF_NAMES" ]; then + ViashError "Input file '$VIASH_PAR_OTHER_REF_NAMES' does not exist." + exit 1 +fi + +# check whether parameters values are of the right type +if [[ -n "$VIASH_PAR_PAIRED" ]]; then + if ! [[ "$VIASH_PAR_PAIRED" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then + ViashError '--paired' has to be a boolean_true. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_PAR_ONLY_BUILD_INDEX" ]]; then + if ! [[ "$VIASH_PAR_ONLY_BUILD_INDEX" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then + ViashError '--only_build_index' has to be a boolean_true. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_PAR_INTERLEAVED" ]]; then + if ! [[ "$VIASH_PAR_INTERLEAVED" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then + ViashError '--interleaved' has to be a boolean_true. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_PAR_MAXINDEL" ]]; then + if ! [[ "$VIASH_PAR_MAXINDEL" =~ ^[-+]?[0-9]+$ ]]; then + ViashError '--maxindel' has to be an integer. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_PAR_MINRATIO" ]]; then + if ! [[ "$VIASH_PAR_MINRATIO" =~ ^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$ ]]; then + ViashError '--minratio' has to be a double. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_PAR_MINHITS" ]]; then + if ! [[ "$VIASH_PAR_MINHITS" =~ ^[-+]?[0-9]+$ ]]; then + ViashError '--minhits' has to be an integer. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_PAR_UNTRIM" ]]; then + if ! [[ "$VIASH_PAR_UNTRIM" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then + ViashError '--untrim' has to be a boolean_true. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_PAR_NZO" ]]; then + if ! [[ "$VIASH_PAR_NZO" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then + ViashError '--nzo' has to be a boolean_true. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_CPUS" ]]; then + if ! [[ "$VIASH_META_CPUS" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'cpus' has to be an integer. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_B" ]]; then + if ! [[ "$VIASH_META_MEMORY_B" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_b' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_KB" ]]; then + if ! [[ "$VIASH_META_MEMORY_KB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_kb' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_MB" ]]; then + if ! [[ "$VIASH_META_MEMORY_MB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_mb' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_GB" ]]; then + if ! [[ "$VIASH_META_MEMORY_GB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_gb' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_TB" ]]; then + if ! [[ "$VIASH_META_MEMORY_TB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_tb' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_PB" ]]; then + if ! [[ "$VIASH_META_MEMORY_PB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_pb' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_KIB" ]]; then + if ! [[ "$VIASH_META_MEMORY_KIB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_kib' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_MIB" ]]; then + if ! [[ "$VIASH_META_MEMORY_MIB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_mib' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_GIB" ]]; then + if ! [[ "$VIASH_META_MEMORY_GIB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_gib' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_TIB" ]]; then + if ! [[ "$VIASH_META_MEMORY_TIB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_tib' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi +if [[ -n "$VIASH_META_MEMORY_PIB" ]]; then + if ! [[ "$VIASH_META_MEMORY_PIB" =~ ^[-+]?[0-9]+$ ]]; then + ViashError 'memory_pib' has to be a long. Use "--help" to get more information on the parameters. + exit 1 + fi +fi + +# check whether value is belongs to a set of choices +if [ ! -z "$VIASH_PAR_AMBIGUOUS" ]; then + VIASH_PAR_AMBIGUOUS_CHOICES=("best;toss;random;all") + IFS=';' + set -f + if ! [[ ";${VIASH_PAR_AMBIGUOUS_CHOICES[*]};" =~ ";$VIASH_PAR_AMBIGUOUS;" ]]; then + ViashError '--ambiguous' specified value of \'$VIASH_PAR_AMBIGUOUS\' is not in the list of allowed values. Use "--help" to get more information on the parameters. + exit 1 + fi + set +f + unset IFS +fi + +if [ ! -z "$VIASH_PAR_AMBIGUOUS2" ]; then + VIASH_PAR_AMBIGUOUS2_CHOICES=("best;toss;all;split") + IFS=';' + set -f + if ! [[ ";${VIASH_PAR_AMBIGUOUS2_CHOICES[*]};" =~ ";$VIASH_PAR_AMBIGUOUS2;" ]]; then + ViashError '--ambiguous2' specified value of \'$VIASH_PAR_AMBIGUOUS2\' is not in the list of allowed values. Use "--help" to get more information on the parameters. + exit 1 + fi + set +f + unset IFS +fi + +if [ ! -z "$VIASH_PAR_QTRIM" ]; then + VIASH_PAR_QTRIM_CHOICES=("l;r;lr") + IFS=';' + set -f + if ! [[ ";${VIASH_PAR_QTRIM_CHOICES[*]};" =~ ";$VIASH_PAR_QTRIM;" ]]; then + ViashError '--qtrim' specified value of \'$VIASH_PAR_QTRIM\' is not in the list of allowed values. Use "--help" to get more information on the parameters. + exit 1 + fi + set +f + unset IFS +fi + +# create parent directories of output files, if so desired +if [ ! -z "$VIASH_PAR_FASTQ_1" ] && [ ! -d "$(dirname "$VIASH_PAR_FASTQ_1")" ]; then + mkdir -p "$(dirname "$VIASH_PAR_FASTQ_1")" +fi +if [ ! -z "$VIASH_PAR_FASTQ_2" ] && [ ! -d "$(dirname "$VIASH_PAR_FASTQ_2")" ]; then + mkdir -p "$(dirname "$VIASH_PAR_FASTQ_2")" +fi +if [ ! -z "$VIASH_PAR_PRIMARY_FASTQ" ] && [ ! -d "$(dirname "$VIASH_PAR_PRIMARY_FASTQ")" ]; then + mkdir -p "$(dirname "$VIASH_PAR_PRIMARY_FASTQ")" +fi +if [ ! -z "$VIASH_PAR_ALL_FASTQ" ] && [ ! -d "$(dirname "$VIASH_PAR_ALL_FASTQ")" ]; then + mkdir -p "$(dirname "$VIASH_PAR_ALL_FASTQ")" +fi +if [ ! -z "$VIASH_PAR_REF_FASTA_LIST" ] && [ ! -d "$(dirname "$VIASH_PAR_REF_FASTA_LIST")" ]; then + mkdir -p "$(dirname "$VIASH_PAR_REF_FASTA_LIST")" +fi +if [ ! -z "$VIASH_PAR_SAM2BAM" ] && [ ! -d "$(dirname "$VIASH_PAR_SAM2BAM")" ]; then + mkdir -p "$(dirname "$VIASH_PAR_SAM2BAM")" +fi +if [ ! -z "$VIASH_PAR_SCAFSTATS" ] && [ ! -d "$(dirname "$VIASH_PAR_SCAFSTATS")" ]; then + mkdir -p "$(dirname "$VIASH_PAR_SCAFSTATS")" +fi +if [ ! -z "$VIASH_PAR_REFSTATS" ] && [ ! -d "$(dirname "$VIASH_PAR_REFSTATS")" ]; then + mkdir -p "$(dirname "$VIASH_PAR_REFSTATS")" +fi + +if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then + # detect volumes from file arguments + VIASH_CHOWN_VARS=() +if [ ! -z "$VIASH_PAR_INPUT" ]; then + VIASH_TEST_INPUT=() + IFS=';' + for var in $VIASH_PAR_INPUT; do + unset IFS + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$var")" ) + var=$(ViashDockerAutodetectMount "$var") + VIASH_TEST_INPUT+=( "$var" ) + done + VIASH_PAR_INPUT=$(IFS=';' ; echo "${VIASH_TEST_INPUT[*]}") +fi +if [ ! -z "$VIASH_PAR_PRIMARY_REF" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_PRIMARY_REF")" ) + VIASH_PAR_PRIMARY_REF=$(ViashDockerAutodetectMount "$VIASH_PAR_PRIMARY_REF") +fi +if [ ! -z "$VIASH_PAR_OTHER_REF_NAMES" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_OTHER_REF_NAMES")" ) + VIASH_PAR_OTHER_REF_NAMES=$(ViashDockerAutodetectMount "$VIASH_PAR_OTHER_REF_NAMES") +fi +if [ ! -z "$VIASH_PAR_FASTQ_1" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_FASTQ_1")" ) + VIASH_PAR_FASTQ_1=$(ViashDockerAutodetectMount "$VIASH_PAR_FASTQ_1") + VIASH_CHOWN_VARS+=( "$VIASH_PAR_FASTQ_1" ) +fi +if [ ! -z "$VIASH_PAR_FASTQ_2" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_FASTQ_2")" ) + VIASH_PAR_FASTQ_2=$(ViashDockerAutodetectMount "$VIASH_PAR_FASTQ_2") + VIASH_CHOWN_VARS+=( "$VIASH_PAR_FASTQ_2" ) +fi +if [ ! -z "$VIASH_PAR_PRIMARY_FASTQ" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_PRIMARY_FASTQ")" ) + VIASH_PAR_PRIMARY_FASTQ=$(ViashDockerAutodetectMount "$VIASH_PAR_PRIMARY_FASTQ") + VIASH_CHOWN_VARS+=( "$VIASH_PAR_PRIMARY_FASTQ" ) +fi +if [ ! -z "$VIASH_PAR_ALL_FASTQ" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_ALL_FASTQ")" ) + VIASH_PAR_ALL_FASTQ=$(ViashDockerAutodetectMount "$VIASH_PAR_ALL_FASTQ") + VIASH_CHOWN_VARS+=( "$VIASH_PAR_ALL_FASTQ" ) +fi +if [ ! -z "$VIASH_PAR_REF_FASTA_LIST" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_REF_FASTA_LIST")" ) + VIASH_PAR_REF_FASTA_LIST=$(ViashDockerAutodetectMount "$VIASH_PAR_REF_FASTA_LIST") + VIASH_CHOWN_VARS+=( "$VIASH_PAR_REF_FASTA_LIST" ) +fi +if [ ! -z "$VIASH_PAR_SAM2BAM" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_SAM2BAM")" ) + VIASH_PAR_SAM2BAM=$(ViashDockerAutodetectMount "$VIASH_PAR_SAM2BAM") + VIASH_CHOWN_VARS+=( "$VIASH_PAR_SAM2BAM" ) +fi +if [ ! -z "$VIASH_PAR_SCAFSTATS" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_SCAFSTATS")" ) + VIASH_PAR_SCAFSTATS=$(ViashDockerAutodetectMount "$VIASH_PAR_SCAFSTATS") + VIASH_CHOWN_VARS+=( "$VIASH_PAR_SCAFSTATS" ) +fi +if [ ! -z "$VIASH_PAR_REFSTATS" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_REFSTATS")" ) + VIASH_PAR_REFSTATS=$(ViashDockerAutodetectMount "$VIASH_PAR_REFSTATS") + VIASH_CHOWN_VARS+=( "$VIASH_PAR_REFSTATS" ) +fi +if [ ! -z "$VIASH_META_RESOURCES_DIR" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_META_RESOURCES_DIR")" ) + VIASH_META_RESOURCES_DIR=$(ViashDockerAutodetectMount "$VIASH_META_RESOURCES_DIR") +fi +if [ ! -z "$VIASH_META_EXECUTABLE" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_META_EXECUTABLE")" ) + VIASH_META_EXECUTABLE=$(ViashDockerAutodetectMount "$VIASH_META_EXECUTABLE") +fi +if [ ! -z "$VIASH_META_CONFIG" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_META_CONFIG")" ) + VIASH_META_CONFIG=$(ViashDockerAutodetectMount "$VIASH_META_CONFIG") +fi +if [ ! -z "$VIASH_META_TEMP_DIR" ]; then + VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_META_TEMP_DIR")" ) + VIASH_META_TEMP_DIR=$(ViashDockerAutodetectMount "$VIASH_META_TEMP_DIR") +fi + + # get unique mounts + VIASH_UNIQUE_MOUNTS=($(for val in "${VIASH_DIRECTORY_MOUNTS[@]}"; do echo "$val"; done | sort -u)) +fi + +if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then + # change file ownership + function ViashPerformChown { + if (( ${#VIASH_CHOWN_VARS[@]} )); then + set +e + VIASH_CMD="docker run --entrypoint=bash --rm ${VIASH_UNIQUE_MOUNTS[@]} $VIASH_DOCKER_IMAGE_ID -c 'chown $(id -u):$(id -g) --silent --recursive ${VIASH_CHOWN_VARS[@]}'" + ViashDebug "+ $VIASH_CMD" + eval $VIASH_CMD + set -e + fi + } + trap ViashPerformChown EXIT +fi + +if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then + # helper function for filling in extra docker args + if [ ! -z "$VIASH_META_MEMORY_B" ]; then + VIASH_DOCKER_RUN_ARGS+=("--memory=${VIASH_META_MEMORY_B}") + fi + if [ ! -z "$VIASH_META_CPUS" ]; then + VIASH_DOCKER_RUN_ARGS+=("--cpus=${VIASH_META_CPUS}") + fi +fi + +if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then + VIASH_CMD="docker run --entrypoint=bash ${VIASH_DOCKER_RUN_ARGS[@]} ${VIASH_UNIQUE_MOUNTS[@]} $VIASH_DOCKER_IMAGE_ID" +fi + + +# set dependency paths + + +ViashDebug "Running command: $(echo $VIASH_CMD)" +cat << VIASHEOF | eval $VIASH_CMD +set -e +tempscript=\$(mktemp "$VIASH_META_TEMP_DIR/viash-run-bbmap_bbsplit-XXXXXX").sh +function clean_up { + rm "\$tempscript" +} +function interrupt { + echo -e "\nCTRL-C Pressed..." + exit 1 +} +trap clean_up EXIT +trap interrupt INT SIGINT +cat > "\$tempscript" << 'VIASHMAIN' +## VIASH START +# The following code has been auto-generated by Viash. +$( if [ ! -z ${VIASH_PAR_ID+x} ]; then echo "${VIASH_PAR_ID}" | sed "s#'#'\"'\"'#g;s#.*#par_id='&'#" ; else echo "# par_id="; fi ) +$( if [ ! -z ${VIASH_PAR_PAIRED+x} ]; then echo "${VIASH_PAR_PAIRED}" | sed "s#'#'\"'\"'#g;s#.*#par_paired='&'#" ; else echo "# par_paired="; fi ) +$( if [ ! -z ${VIASH_PAR_INPUT+x} ]; then echo "${VIASH_PAR_INPUT}" | sed "s#'#'\"'\"'#g;s#.*#par_input='&'#" ; else echo "# par_input="; fi ) +$( if [ ! -z ${VIASH_PAR_PRIMARY_REF+x} ]; then echo "${VIASH_PAR_PRIMARY_REF}" | sed "s#'#'\"'\"'#g;s#.*#par_primary_ref='&'#" ; else echo "# par_primary_ref="; fi ) +$( if [ ! -z ${VIASH_PAR_OTHER_REF_NAMES+x} ]; then echo "${VIASH_PAR_OTHER_REF_NAMES}" | sed "s#'#'\"'\"'#g;s#.*#par_other_ref_names='&'#" ; else echo "# par_other_ref_names="; fi ) +$( if [ ! -z ${VIASH_PAR_ONLY_BUILD_INDEX+x} ]; then echo "${VIASH_PAR_ONLY_BUILD_INDEX}" | sed "s#'#'\"'\"'#g;s#.*#par_only_build_index='&'#" ; else echo "# par_only_build_index="; fi ) +$( if [ ! -z ${VIASH_PAR_INDEX+x} ]; then echo "${VIASH_PAR_INDEX}" | sed "s#'#'\"'\"'#g;s#.*#par_index='&'#" ; else echo "# par_index="; fi ) +$( if [ ! -z ${VIASH_PAR_QIN+x} ]; then echo "${VIASH_PAR_QIN}" | sed "s#'#'\"'\"'#g;s#.*#par_qin='&'#" ; else echo "# par_qin="; fi ) +$( if [ ! -z ${VIASH_PAR_INTERLEAVED+x} ]; then echo "${VIASH_PAR_INTERLEAVED}" | sed "s#'#'\"'\"'#g;s#.*#par_interleaved='&'#" ; else echo "# par_interleaved="; fi ) +$( if [ ! -z ${VIASH_PAR_MAXINDEL+x} ]; then echo "${VIASH_PAR_MAXINDEL}" | sed "s#'#'\"'\"'#g;s#.*#par_maxindel='&'#" ; else echo "# par_maxindel="; fi ) +$( if [ ! -z ${VIASH_PAR_MINRATIO+x} ]; then echo "${VIASH_PAR_MINRATIO}" | sed "s#'#'\"'\"'#g;s#.*#par_minratio='&'#" ; else echo "# par_minratio="; fi ) +$( if [ ! -z ${VIASH_PAR_MINHITS+x} ]; then echo "${VIASH_PAR_MINHITS}" | sed "s#'#'\"'\"'#g;s#.*#par_minhits='&'#" ; else echo "# par_minhits="; fi ) +$( if [ ! -z ${VIASH_PAR_AMBIGUOUS+x} ]; then echo "${VIASH_PAR_AMBIGUOUS}" | sed "s#'#'\"'\"'#g;s#.*#par_ambiguous='&'#" ; else echo "# par_ambiguous="; fi ) +$( if [ ! -z ${VIASH_PAR_AMBIGUOUS2+x} ]; then echo "${VIASH_PAR_AMBIGUOUS2}" | sed "s#'#'\"'\"'#g;s#.*#par_ambiguous2='&'#" ; else echo "# par_ambiguous2="; fi ) +$( if [ ! -z ${VIASH_PAR_QTRIM+x} ]; then echo "${VIASH_PAR_QTRIM}" | sed "s#'#'\"'\"'#g;s#.*#par_qtrim='&'#" ; else echo "# par_qtrim="; fi ) +$( if [ ! -z ${VIASH_PAR_UNTRIM+x} ]; then echo "${VIASH_PAR_UNTRIM}" | sed "s#'#'\"'\"'#g;s#.*#par_untrim='&'#" ; else echo "# par_untrim="; fi ) +$( if [ ! -z ${VIASH_PAR_FASTQ_1+x} ]; then echo "${VIASH_PAR_FASTQ_1}" | sed "s#'#'\"'\"'#g;s#.*#par_fastq_1='&'#" ; else echo "# par_fastq_1="; fi ) +$( if [ ! -z ${VIASH_PAR_FASTQ_2+x} ]; then echo "${VIASH_PAR_FASTQ_2}" | sed "s#'#'\"'\"'#g;s#.*#par_fastq_2='&'#" ; else echo "# par_fastq_2="; fi ) +$( if [ ! -z ${VIASH_PAR_PRIMARY_FASTQ+x} ]; then echo "${VIASH_PAR_PRIMARY_FASTQ}" | sed "s#'#'\"'\"'#g;s#.*#par_primary_fastq='&'#" ; else echo "# par_primary_fastq="; fi ) +$( if [ ! -z ${VIASH_PAR_ALL_FASTQ+x} ]; then echo "${VIASH_PAR_ALL_FASTQ}" | sed "s#'#'\"'\"'#g;s#.*#par_all_fastq='&'#" ; else echo "# par_all_fastq="; fi ) +$( if [ ! -z ${VIASH_PAR_REF_FASTA_LIST+x} ]; then echo "${VIASH_PAR_REF_FASTA_LIST}" | sed "s#'#'\"'\"'#g;s#.*#par_ref_fasta_list='&'#" ; else echo "# par_ref_fasta_list="; fi ) +$( if [ ! -z ${VIASH_PAR_SAM2BAM+x} ]; then echo "${VIASH_PAR_SAM2BAM}" | sed "s#'#'\"'\"'#g;s#.*#par_sam2bam='&'#" ; else echo "# par_sam2bam="; fi ) +$( if [ ! -z ${VIASH_PAR_SCAFSTATS+x} ]; then echo "${VIASH_PAR_SCAFSTATS}" | sed "s#'#'\"'\"'#g;s#.*#par_scafstats='&'#" ; else echo "# par_scafstats="; fi ) +$( if [ ! -z ${VIASH_PAR_REFSTATS+x} ]; then echo "${VIASH_PAR_REFSTATS}" | sed "s#'#'\"'\"'#g;s#.*#par_refstats='&'#" ; else echo "# par_refstats="; fi ) +$( if [ ! -z ${VIASH_PAR_NZO+x} ]; then echo "${VIASH_PAR_NZO}" | sed "s#'#'\"'\"'#g;s#.*#par_nzo='&'#" ; else echo "# par_nzo="; fi ) +$( if [ ! -z ${VIASH_META_NAME+x} ]; then echo "${VIASH_META_NAME}" | sed "s#'#'\"'\"'#g;s#.*#meta_name='&'#" ; else echo "# meta_name="; fi ) +$( if [ ! -z ${VIASH_META_FUNCTIONALITY_NAME+x} ]; then echo "${VIASH_META_FUNCTIONALITY_NAME}" | sed "s#'#'\"'\"'#g;s#.*#meta_functionality_name='&'#" ; else echo "# meta_functionality_name="; fi ) +$( if [ ! -z ${VIASH_META_RESOURCES_DIR+x} ]; then echo "${VIASH_META_RESOURCES_DIR}" | sed "s#'#'\"'\"'#g;s#.*#meta_resources_dir='&'#" ; else echo "# meta_resources_dir="; fi ) +$( if [ ! -z ${VIASH_META_EXECUTABLE+x} ]; then echo "${VIASH_META_EXECUTABLE}" | sed "s#'#'\"'\"'#g;s#.*#meta_executable='&'#" ; else echo "# meta_executable="; fi ) +$( if [ ! -z ${VIASH_META_CONFIG+x} ]; then echo "${VIASH_META_CONFIG}" | sed "s#'#'\"'\"'#g;s#.*#meta_config='&'#" ; else echo "# meta_config="; fi ) +$( if [ ! -z ${VIASH_META_TEMP_DIR+x} ]; then echo "${VIASH_META_TEMP_DIR}" | sed "s#'#'\"'\"'#g;s#.*#meta_temp_dir='&'#" ; else echo "# meta_temp_dir="; fi ) +$( if [ ! -z ${VIASH_META_CPUS+x} ]; then echo "${VIASH_META_CPUS}" | sed "s#'#'\"'\"'#g;s#.*#meta_cpus='&'#" ; else echo "# meta_cpus="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_B+x} ]; then echo "${VIASH_META_MEMORY_B}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_b='&'#" ; else echo "# meta_memory_b="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_KB+x} ]; then echo "${VIASH_META_MEMORY_KB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_kb='&'#" ; else echo "# meta_memory_kb="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_MB+x} ]; then echo "${VIASH_META_MEMORY_MB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_mb='&'#" ; else echo "# meta_memory_mb="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_GB+x} ]; then echo "${VIASH_META_MEMORY_GB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_gb='&'#" ; else echo "# meta_memory_gb="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_TB+x} ]; then echo "${VIASH_META_MEMORY_TB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_tb='&'#" ; else echo "# meta_memory_tb="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_PB+x} ]; then echo "${VIASH_META_MEMORY_PB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_pb='&'#" ; else echo "# meta_memory_pb="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_KIB+x} ]; then echo "${VIASH_META_MEMORY_KIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_kib='&'#" ; else echo "# meta_memory_kib="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_MIB+x} ]; then echo "${VIASH_META_MEMORY_MIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_mib='&'#" ; else echo "# meta_memory_mib="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_GIB+x} ]; then echo "${VIASH_META_MEMORY_GIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_gib='&'#" ; else echo "# meta_memory_gib="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_TIB+x} ]; then echo "${VIASH_META_MEMORY_TIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_tib='&'#" ; else echo "# meta_memory_tib="; fi ) +$( if [ ! -z ${VIASH_META_MEMORY_PIB+x} ]; then echo "${VIASH_META_MEMORY_PIB}" | sed "s#'#'\"'\"'#g;s#.*#meta_memory_pib='&'#" ; else echo "# meta_memory_pib="; fi ) + +## VIASH END +#!/bin/bash + +set -eo pipefail + +function clean_up { + rm -rf "\$tmpdir" +} +trap clean_up EXIT + +unset_if_false=( par_paired par_only_build_index par_interleaved par_untrim par_nzo) + +for var in "\${unset_if_false[@]}"; do + if [ -z "\${!var}" ]; then + unset \$var + fi +done + +if [ ! -d "\$par_built_index" ]; then + other_refs=() + while IFS="," read -r name path + do + other_refs+=("ref_\$name=\$path") + done < "\$par_ref_fasta_list" +fi + +if \$par_only_build_index; then + if [ -f "\$par_primary_ref" ] && [ \${#other_refs[@]} -gt 0 ]; then + bbsplit.sh \\ + ref_primary="\$par_primary_ref" "\${other_refs[@]}" \\ + path=\$par_index \\ + threads=\${meta_cpus:-1} + else + echo "ERROR: Please specify as input a primary fasta file along with names and paths to non-primary fasta files." + fi +else + IFS="," read -ra input <<< "\$par_input" + tmpdir=\$(mktemp -d "\$meta_temp_dir/\$meta_functionality_name-XXXXXXXX") + index_files='' + if [ -d "\$par_built_index" ]; then + index_files="path=\$par_built_index" + elif [ -f "\$par_primary_ref" ] && [ \${#other_refs[@]} -gt 0 ]; then + index_files="ref_primary=\$par_primary_ref \${other_refs[@]}" + else + echo "ERROR: Please either specify a BBSplit index as input or a primary fasta file along with names and paths to non-primary fasta files." + fi + if \$par_paired; then + bbsplit.sh \\ + \$index_files \\ + threads=\${meta_cpus:-1} \\ + in=\${input[0]} \\ + in2=\${input[1]} \\ + basename=\${tmpdir}/%_#.fastq \\ + refstats=bbsplit_stats.txt + read1=\$(find \$tmpdir/ -iname primary_1*) + read2=\$(find \$tmpdir/ -iname primary_2*) + cp \$read1 \$par_fastq_1 + cp \$read2 \$par_fastq_2 + else + bbsplit.sh \\ + \$index_files \\ + threads=\${meta_cpus:-1} \\ + in=\${input[0]} \\ + basename=\${tmpdir}/%.fastq \\ + refstats=bbsplit_stats.txt + read1=\$(find \$tmpdir/ -iname primary*) + cp \$read1 \$par_fastq_1 + fi +fi + +exit 0 +VIASHMAIN +bash "\$tempscript" & +wait "\$!" + +VIASHEOF + + +if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then + # strip viash automount from file paths + + if [ ! -z "$VIASH_PAR_INPUT" ]; then + unset VIASH_TEST_INPUT + IFS=';' + for var in $VIASH_PAR_INPUT; do + unset IFS + if [ -z "$VIASH_TEST_INPUT" ]; then + VIASH_TEST_INPUT="$(ViashDockerStripAutomount "$var")" + else + VIASH_TEST_INPUT="$VIASH_TEST_INPUT;""$(ViashDockerStripAutomount "$var")" + fi + done + VIASH_PAR_INPUT="$VIASH_TEST_INPUT" + fi + if [ ! -z "$VIASH_PAR_PRIMARY_REF" ]; then + VIASH_PAR_PRIMARY_REF=$(ViashDockerStripAutomount "$VIASH_PAR_PRIMARY_REF") + fi + if [ ! -z "$VIASH_PAR_OTHER_REF_NAMES" ]; then + VIASH_PAR_OTHER_REF_NAMES=$(ViashDockerStripAutomount "$VIASH_PAR_OTHER_REF_NAMES") + fi + if [ ! -z "$VIASH_PAR_FASTQ_1" ]; then + VIASH_PAR_FASTQ_1=$(ViashDockerStripAutomount "$VIASH_PAR_FASTQ_1") + fi + if [ ! -z "$VIASH_PAR_FASTQ_2" ]; then + VIASH_PAR_FASTQ_2=$(ViashDockerStripAutomount "$VIASH_PAR_FASTQ_2") + fi + if [ ! -z "$VIASH_PAR_PRIMARY_FASTQ" ]; then + VIASH_PAR_PRIMARY_FASTQ=$(ViashDockerStripAutomount "$VIASH_PAR_PRIMARY_FASTQ") + fi + if [ ! -z "$VIASH_PAR_ALL_FASTQ" ]; then + VIASH_PAR_ALL_FASTQ=$(ViashDockerStripAutomount "$VIASH_PAR_ALL_FASTQ") + fi + if [ ! -z "$VIASH_PAR_REF_FASTA_LIST" ]; then + VIASH_PAR_REF_FASTA_LIST=$(ViashDockerStripAutomount "$VIASH_PAR_REF_FASTA_LIST") + fi + if [ ! -z "$VIASH_PAR_SAM2BAM" ]; then + VIASH_PAR_SAM2BAM=$(ViashDockerStripAutomount "$VIASH_PAR_SAM2BAM") + fi + if [ ! -z "$VIASH_PAR_SCAFSTATS" ]; then + VIASH_PAR_SCAFSTATS=$(ViashDockerStripAutomount "$VIASH_PAR_SCAFSTATS") + fi + if [ ! -z "$VIASH_PAR_REFSTATS" ]; then + VIASH_PAR_REFSTATS=$(ViashDockerStripAutomount "$VIASH_PAR_REFSTATS") + fi + if [ ! -z "$VIASH_META_RESOURCES_DIR" ]; then + VIASH_META_RESOURCES_DIR=$(ViashDockerStripAutomount "$VIASH_META_RESOURCES_DIR") + fi + if [ ! -z "$VIASH_META_EXECUTABLE" ]; then + VIASH_META_EXECUTABLE=$(ViashDockerStripAutomount "$VIASH_META_EXECUTABLE") + fi + if [ ! -z "$VIASH_META_CONFIG" ]; then + VIASH_META_CONFIG=$(ViashDockerStripAutomount "$VIASH_META_CONFIG") + fi + if [ ! -z "$VIASH_META_TEMP_DIR" ]; then + VIASH_META_TEMP_DIR=$(ViashDockerStripAutomount "$VIASH_META_TEMP_DIR") + fi +fi + + +# check whether required files exist +if [ ! -z "$VIASH_PAR_FASTQ_1" ] && [ ! -e "$VIASH_PAR_FASTQ_1" ]; then + ViashError "Output file '$VIASH_PAR_FASTQ_1' does not exist." + exit 1 +fi +if [ ! -z "$VIASH_PAR_FASTQ_2" ] && [ ! -e "$VIASH_PAR_FASTQ_2" ]; then + ViashError "Output file '$VIASH_PAR_FASTQ_2' does not exist." + exit 1 +fi +if [ ! -z "$VIASH_PAR_PRIMARY_FASTQ" ] && [ ! -e "$VIASH_PAR_PRIMARY_FASTQ" ]; then + ViashError "Output file '$VIASH_PAR_PRIMARY_FASTQ' does not exist." + exit 1 +fi +if [ ! -z "$VIASH_PAR_ALL_FASTQ" ] && [ ! -e "$VIASH_PAR_ALL_FASTQ" ]; then + ViashError "Output file '$VIASH_PAR_ALL_FASTQ' does not exist." + exit 1 +fi +if [ ! -z "$VIASH_PAR_REF_FASTA_LIST" ] && [ ! -e "$VIASH_PAR_REF_FASTA_LIST" ]; then + ViashError "Output file '$VIASH_PAR_REF_FASTA_LIST' does not exist." + exit 1 +fi +if [ ! -z "$VIASH_PAR_SAM2BAM" ] && [ ! -e "$VIASH_PAR_SAM2BAM" ]; then + ViashError "Output file '$VIASH_PAR_SAM2BAM' does not exist." + exit 1 +fi +if [ ! -z "$VIASH_PAR_SCAFSTATS" ] && [ ! -e "$VIASH_PAR_SCAFSTATS" ]; then + ViashError "Output file '$VIASH_PAR_SCAFSTATS' does not exist." + exit 1 +fi +if [ ! -z "$VIASH_PAR_REFSTATS" ] && [ ! -e "$VIASH_PAR_REFSTATS" ]; then + ViashError "Output file '$VIASH_PAR_REFSTATS' does not exist." + exit 1 +fi + + +exit 0 diff --git a/src/bbmap_bbsplit/script.sh b/src/bbmap_bbsplit/script.sh index e5de89ed..f835731b 100755 --- a/src/bbmap_bbsplit/script.sh +++ b/src/bbmap_bbsplit/script.sh @@ -1,5 +1,8 @@ #!/bin/bash +## VIASH START +## VIASH END + set -eo pipefail function clean_up { @@ -15,7 +18,7 @@ for var in "${unset_if_false[@]}"; do fi done -if [ ! -d "$par_built_index" ]; then +if [ ! -d "$par_index" ]; then other_refs=() while IFS="," read -r name path do @@ -36,8 +39,8 @@ else IFS="," read -ra input <<< "$par_input" tmpdir=$(mktemp -d "$meta_temp_dir/$meta_functionality_name-XXXXXXXX") index_files='' - if [ -d "$par_built_index" ]; then - index_files="path=$par_built_index" + if [ -d "$par_index" ]; then + index_files="path=$par_index" elif [ -f "$par_primary_ref" ] && [ ${#other_refs[@]} -gt 0 ]; then index_files="ref_primary=$par_primary_ref ${other_refs[@]}" else diff --git a/src/bbmap_bbsplit/test.sh b/src/bbmap_bbsplit/test.sh index 62d9393d..cbe6058a 100644 --- a/src/bbmap_bbsplit/test.sh +++ b/src/bbmap_bbsplit/test.sh @@ -10,8 +10,8 @@ HERE echo ">>> Building BBSplit index" "${meta_executable}" \ --primary_ref "${meta_resources_dir}/test_data/genome.fasta" \ - --ref_fasta_list "bbsplit_fasta_list.txt" \ - --only_build_index true \ + --ref_fasta_list bbsplit_fasta_list.txt \ + --only_build_index \ --index "BBSplit_index" echo ">>> Check whether output exists" @@ -23,10 +23,9 @@ echo ">>> Filtering ribosomal RNA reads" echo ">>> Testing with single-end reads and primary/non-primary FASTA files" "${meta_executable}" \ --input "${meta_resources_dir}/test_data/SRR6357070_1.fastq.gz" \ - --only_build_index false \ --primary_ref "${meta_resources_dir}/test_data/genome.fasta" \ - --ref_fasta_list "bbsplit_fasta_list.txt" \ - --fastq_1 "filtered_SRR6357070_1.fastq.gz" + --ref_fasta_list bbsplit_fasta_list.txt \ + --fastq_1 filtered_SRR6357070_1.fastq.gz echo ">>> Check whether output exists" [ ! -f "filtered_SRR6357070_1.fastq.gz" ] && echo "Filtered reads file does not exist!" && exit 1 @@ -38,7 +37,6 @@ echo ">>> Testing with paired-end reads and primary/non-primary FASTA files" "${meta_executable}" \ --paired \ --input "${meta_resources_dir}/test_data/SRR6357070_1.fastq.gz,${meta_resources_dir}/test_data/SRR6357070_2.fastq.gz" \ - --only_build_index false \ --primary_ref "${meta_resources_dir}/test_data/genome.fasta" \ --ref_fasta_list "bbsplit_fasta_list.txt" \ --fastq_1 "filtered_SRR6357070_1.fastq.gz" \ @@ -55,8 +53,7 @@ rm filtered_SRR6357070_1.fastq.gz filtered_SRR6357070_2.fastq.gz echo ">>> Testing with single-end reads and BBSplit index" "${meta_executable}" \ --input "${meta_resources_dir}/test_data/SRR6357070_1.fastq.gz" \ - --only_build_index false \ - --built_index "BBSplit_index" \ + --index "BBSplit_index" \ --fastq_1 "filtered_SRR6357070_1.fastq.gz" echo ">>> Check whether output exists" @@ -67,8 +64,7 @@ echo ">>> Testing with paired-end reads and BBSplit index" "${meta_executable}" \ --paired \ --input "${meta_resources_dir}/test_data/SRR6357070_1.fastq.gz,${meta_resources_dir}/test_data/SRR6357070_2.fastq.gz" \ - --only_build_index false \ - --built_index "BBSplit_index" \ + --index "BBSplit_index" \ --fastq_1 "filtered_SRR6357070_1.fastq.gz" \ --fastq_2 "filtered_SRR6357070_2.fastq.gz"