#!/usr/bin/env bash

# featurecounts seqtk_sample
# 
# 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="featurecounts"
VIASH_META_FUNCTIONALITY_NAME="featurecounts"
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 "featurecounts seqtk_sample"
  echo ""
  echo "featureCounts is a read summarization program for counting reads generated from"
  echo "either RNA or genomic DNA sequencing experiments by implementing highly"
  echo "efficient chromosome hashing and feature blocking techniques. It works with"
  echo "either single or paired-end reads and provides a wide range of options"
  echo "appropriate for different sequencing applications."
  echo ""
  echo "Inputs:"
  echo "    -a, --annotation"
  echo "        type: file, required parameter, file must exist"
  echo "        example: annotation.gtf"
  echo "        Name of an annotation file. GTF/GFF format by default. See '--format'"
  echo "        option for more format information."
  echo ""
  echo "    -i, --input"
  echo "        type: file, required parameter, multiple values allowed, file must exist"
  echo "        example: input_file1.bam"
  echo "        A list of SAM or BAM format files separated by semi-colon (;). They can"
  echo "        be either name or location sorted. Location-sorted paired-end reads are"
  echo "        automatically sorted by read names."
  echo ""
  echo "Outputs:"
  echo "    -o, --counts"
  echo "        type: file, required parameter, output, file must exist"
  echo "        example: features.tsv"
  echo "        Name of output file including read counts in tab delimited format."
  echo ""
  echo "    --summary"
  echo "        type: file, output, file must exist"
  echo "        example: summary.tsv"
  echo "        Summary statistics of counting results in tab delimited format."
  echo ""
  echo "    --junctions"
  echo "        type: file, output, file must exist"
  echo "        example: junctions.txt"
  echo "        Count number of reads supporting each exon-exon junction. Junctions were"
  echo "        identified from those exon-spanning reads in the input (containing 'N'"
  echo "        in CIGAR string)."
  echo ""
  echo "Annotation:"
  echo "    -F, --format"
  echo "        type: string"
  echo "        example: GTF"
  echo "        choices: [ GTF, GFF, SAF ]"
  echo "        Specify format of the provided annotation file. Acceptable formats"
  echo "        include 'GTF' (or compatible GFF format) and 'SAF'. 'GTF' by default."
  echo ""
  echo "    -t, --feature_type"
  echo "        type: string, multiple values allowed"
  echo "        example: exon"
  echo "        Specify feature type(s) in a GTF annotation. If multiple types are"
  echo "        provided, they should be separated by ';' with no space in between."
  echo "        'exon' by default. Rows in the annotation with a matched feature will be"
  echo "        extracted and used for read mapping."
  echo ""
  echo "    -g, --attribute_type"
  echo "        type: string"
  echo "        example: gene_id"
  echo "        Specify attribute type in GTF annotation. 'gene_id' by default."
  echo "        Meta-features used for read counting will be extracted from annotation"
  echo "        using the provided value."
  echo ""
  echo "    --extra_attributes"
  echo "        type: string, multiple values allowed"
  echo "        Extract extra attribute types from the provided GTF annotation and"
  echo "        include them in the counting output. These attribute types will not be"
  echo "        used to group features. If more than one attribute type is provided they"
  echo "        should be separated by semicolon (;)."
  echo ""
  echo "    -A, --chrom_alias"
  echo "        type: file, file must exist"
  echo "        example: chrom_alias.csv"
  echo "        Provide a chromosome name alias file to match chr names in annotation"
  echo "        with those in the reads. This should be a two-column comma-delimited"
  echo "        text file. Its first column should include chr names in the annotation"
  echo "        and its second column should include chr names in the reads. Chr names"
  echo "        are case sensitive. No column header should be included in the file."
  echo ""
  echo "Level of summarization:"
  echo "    -f, --feature_level"
  echo "        type: boolean_true"
  echo "        Perform read counting at feature level (eg. counting reads for exons"
  echo "        rather than genes)."
  echo ""
  echo "Overlap between reads and features:"
  echo "    -O, --overlapping"
  echo "        type: boolean_true"
  echo "        Assign reads to all their overlapping meta-features (or features if"
  echo "        '--feature_level' is specified)."
  echo ""
  echo "    --min_overlap"
  echo "        type: integer"
  echo "        example: 1"
  echo "        Minimum number of overlapping bases in a read that is required for read"
  echo "        assignment. 1 by default. Number of overlapping bases is counted from"
  echo "        both reads if paired end. If a negative value is provided, then a gap of"
  echo "        up to specified size will be allowed between read and the feature that"
  echo "        the read is assigned to."
  echo ""
  echo "    --frac_overlap"
  echo "        type: double"
  echo "        example: 0.0"
  echo "        min: 0.0"
  echo "        max: 1.0"
  echo "        Minimum fraction of overlapping bases in a read that is required for"
  echo "        read assignment. Value should be within range [0,1]. 0 by default."
  echo "        Number of overlapping bases is counted from both reads if paired end."
  echo "        Both this option and '--min_overlap' option need to be satisfied for"
  echo "        read assignment."
  echo ""
  echo "    --frac_overlap_feature"
  echo "        type: double"
  echo "        example: 0.0"
  echo "        min: 0.0"
  echo "        max: 1.0"
  echo "        Minimum fraction of overlapping bases in a feature that is required for"
  echo "        read assignment. Value should be within range [0,1]. 0 by default."
  echo ""
  echo "    --largest_overlap"
  echo "        type: boolean_true"
  echo "        Assign reads to a meta-feature/feature that has the largest number of"
  echo "        overlapping bases."
  echo ""
  echo "    --non_overlap"
  echo "        type: integer"
  echo "        Maximum number of non-overlapping bases in a read (or a read pair) that"
  echo "        is allowed when being assigned to a feature. No limit is set by default."
  echo ""
  echo "    --non_overlap_feature"
  echo "        type: integer"
  echo "        Maximum number of non-overlapping bases in a feature that is allowed in"
  echo "        read assignment. No limit is set by default."
  echo ""
  echo "    --read_extension5"
  echo "        type: integer"
  echo "        Reads are extended upstream by <int> bases from their 5' end."
  echo ""
  echo "    --read_extension3"
  echo "        type: integer"
  echo "        Reads are extended upstream by <int> bases from their 3' end."
  echo ""
  echo "    --read2pos"
  echo "        type: integer"
  echo "        choices: [ 3, 5 ]"
  echo "        Reduce reads to their 5' most base or 3' most base. Read counting is"
  echo "        then performed based on the single base the read is reduced to."
  echo ""
  echo "Multi-mapping reads:"
  echo "    -M, --multi_mapping"
  echo "        type: boolean_true"
  echo "        Multi-mapping reads will also be counted. For a multi-mapping read, all"
  echo "        its reported alignments will be counted. The 'NH' tag in BAM/SAM input"
  echo "        is used to detect multi-mapping reads."
  echo ""
  echo "Fractional counting:"
  echo "    --fraction"
  echo "        type: boolean_true"
  echo "        Assign fractional counts to features. This option must be used together"
  echo "        with '--multi_mapping' or '--overlapping' or both. When"
  echo "        '--multi_mapping' is specified, each reported alignment from a"
  echo "        multi-mapping read (identified via 'NH' tag) will carry a fractional"
  echo "        count of 1/x, instead of 1 (one), where x is the total number of"
  echo "        alignments reported for the same read. When '--overlapping' is"
  echo "        specified, each overlapping feature will receive a fractional count of"
  echo "        1/y, where y is the total number of features overlapping with the read."
  echo "        When both '--multi_mapping' and '--overlapping' are specified, each"
  echo "        alignment will carry a fractional count of 1/(x*y)."
  echo ""
  echo "Read filtering:"
  echo "    -Q, --min_map_quality"
  echo "        type: integer"
  echo "        example: 0"
  echo "        The minimum mapping quality score a read must satisfy in order to be"
  echo "        counted. For paired-end reads, at least one end should satisfy this"
  echo "        criteria. 0 by default."
  echo ""
  echo "    --split_only"
  echo "        type: boolean_true"
  echo "        Count split alignments only (ie. alignments with CIGAR string containing"
  echo "        'N'). An example of split alignments is exon-spanning reads in RNA-seq"
  echo "        data."
  echo ""
  echo "    --non_split_only"
  echo "        type: boolean_true"
  echo "        If specified, only non-split alignments (CIGAR strings do not contain"
  echo "        letter 'N') will be counted. All the other alignments will be ignored."
  echo ""
  echo "    --primary"
  echo "        type: boolean_true"
  echo "        Count primary alignments only. Primary alignments are identified using"
  echo "        bit 0x100 in SAM/BAM FLAG field."
  echo ""
  echo "    --ignore_dup"
  echo "        type: boolean_true"
  echo "        Ignore duplicate reads in read counting. Duplicate reads are identified"
  echo "        using bit Ox400 in BAM/SAM FLAG field. The whole read pair is ignored if"
  echo "        one of the reads is a duplicate read for paired end data."
  echo ""
  echo "Strandedness:"
  echo "    -s, --strand"
  echo "        type: integer"
  echo "        example: 0"
  echo "        choices: [ 0, 1, 2 ]"
  echo "        Perform strand-specific read counting. A single integer value (applied"
  echo "        to all input files) should be provided. Possible values include: 0"
  echo "        (unstranded), 1 (stranded) and 2 (reversely stranded). Default value is"
  echo "        0 (ie. unstranded read counting carried out for all input files)."
  echo ""
  echo "Exon-exon junctions:"
  echo "    -G, --ref_fasta"
  echo "        type: file, file must exist"
  echo "        example: reference.fasta"
  echo "        Provide the name of a FASTA-format file that contains the reference"
  echo "        sequences used in read mapping that produced the provided SAM/BAM files."
  echo ""
  echo "Parameters specific to paired end reads:"
  echo "    -p, --paired"
  echo "        type: boolean_true"
  echo "        Specify that input data contain paired-end reads. To perform fragment"
  echo "        counting (ie. counting read pairs), the '--countReadPairs' parameter"
  echo "        should also be specified in addition to this parameter."
  echo ""
  echo "    --count_read_pairs"
  echo "        type: boolean_true"
  echo "        Count read pairs (fragments) instead of reads. This option is only"
  echo "        applicable for paired-end reads."
  echo ""
  echo "    -B, --both_aligned"
  echo "        type: boolean_true"
  echo "        Count read pairs (fragments) instead of reads. This option is only"
  echo "        applicable for paired-end reads."
  echo ""
  echo "    -P, --check_pe_dist"
  echo "        type: boolean_true"
  echo "        Check validity of paired-end distance when counting read pairs. Use"
  echo "        '--min_length' and '--max_length' to set thresholds."
  echo ""
  echo "    -d, --min_length"
  echo "        type: integer"
  echo "        example: 50"
  echo "        Minimum fragment/template length, 50 by default."
  echo ""
  echo "    -D, --max_length"
  echo "        type: integer"
  echo "        example: 600"
  echo "        Maximum fragment/template length, 600 by default."
  echo ""
  echo "    -C, --same_strand"
  echo "        type: boolean_true"
  echo "        Do not count read pairs that have their two ends mapping to different"
  echo "        chromosomes or mapping to same chromosome but on different strands."
  echo ""
  echo "    --donotsort"
  echo "        type: boolean_true"
  echo "        Do not sort reads in BAM/SAM input. Note that reads from the same pair"
  echo "        are required to be located next to each other in the input."
  echo ""
  echo "Read groups:"
  echo "    --by_read_group"
  echo "        type: boolean_true"
  echo "        Assign reads by read group. \"RG\" tag is required to be present in the"
  echo "        input BAM/SAM files."
  echo ""
  echo "Long reads:"
  echo "    --long_reads"
  echo "        type: boolean_true"
  echo "        Count long reads such as Nanopore and PacBio reads. Long read counting"
  echo "        can only run in one thread and only reads (not read-pairs) can be"
  echo "        counted. There is no limitation on the number of 'M' operations allowed"
  echo "        in a CIGAR string in long read counting."
  echo ""
  echo "Assignment results for each read:"
  echo "    --detailed_results"
  echo "        type: file, output, file must exist"
  echo "        example: detailed_results"
  echo "        Directory to save the detailed assignment results. Use"
  echo "        \`--detailed_results_format\` to determine the format of the detailed"
  echo "        results."
  echo ""
  echo "    -R, --detailed_results_format"
  echo "        type: string"
  echo "        choices: [ CORE, SAM, BAM ]"
  echo "        Output detailed assignment results for each read or read-pair. Results"
  echo "        are saved to a file that is in one of the following formats: CORE, SAM"
  echo "        and BAM. See documentaiton for more info about these formats."
  echo ""
  echo "Miscellaneous:"
  echo "    --max_M_op"
  echo "        type: integer"
  echo "        example: 10"
  echo "        Maximum number of 'M' operations allowed in a CIGAR string. 10 by"
  echo "        default. Both 'X' and '=' are treated as 'M' and adjacent 'M' operations"
  echo "        are merged in the CIGAR string."
  echo ""
  echo "    --verbose"
  echo "        type: boolean_true"
  echo "        Output verbose information for debugging, such as un-matched"
  echo "        chromosome/contig names."
}

# 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 quay.io/biocontainers/subread:2.0.6--he4a0461_0
ENTRYPOINT []
RUN featureCounts -v 2>&1 | sed 's/featureCounts v\([0-9.]*\)/featureCounts: \1/' > /var/software_versions.txt

LABEL org.opencontainers.image.description="Companion container for running component featurecounts"
LABEL org.opencontainers.image.created="2024-06-27T09:29:51Z"
LABEL org.opencontainers.image.source="https://github.com/ShiLab-Bioinformatics/subread"
LABEL org.opencontainers.image.revision="796c3bcdbb5f5fa578686cd33c28817d83f04427"
LABEL org.opencontainers.image.version="seqtk_sample"

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 "featurecounts seqtk_sample"
            exit
            ;;
        --annotation)
            [ -n "$VIASH_PAR_ANNOTATION" ] && ViashError Bad arguments for option \'--annotation\': \'$VIASH_PAR_ANNOTATION\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_ANNOTATION="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --annotation. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --annotation=*)
            [ -n "$VIASH_PAR_ANNOTATION" ] && ViashError Bad arguments for option \'--annotation=*\': \'$VIASH_PAR_ANNOTATION\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_ANNOTATION=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -a)
            [ -n "$VIASH_PAR_ANNOTATION" ] && ViashError Bad arguments for option \'-a\': \'$VIASH_PAR_ANNOTATION\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_ANNOTATION="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -a. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --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
            ;;
        -i)
            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 -i. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --counts)
            [ -n "$VIASH_PAR_COUNTS" ] && ViashError Bad arguments for option \'--counts\': \'$VIASH_PAR_COUNTS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_COUNTS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --counts. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --counts=*)
            [ -n "$VIASH_PAR_COUNTS" ] && ViashError Bad arguments for option \'--counts=*\': \'$VIASH_PAR_COUNTS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_COUNTS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -o)
            [ -n "$VIASH_PAR_COUNTS" ] && ViashError Bad arguments for option \'-o\': \'$VIASH_PAR_COUNTS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_COUNTS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -o. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --summary)
            [ -n "$VIASH_PAR_SUMMARY" ] && ViashError Bad arguments for option \'--summary\': \'$VIASH_PAR_SUMMARY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SUMMARY="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --summary. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --summary=*)
            [ -n "$VIASH_PAR_SUMMARY" ] && ViashError Bad arguments for option \'--summary=*\': \'$VIASH_PAR_SUMMARY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SUMMARY=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --junctions)
            [ -n "$VIASH_PAR_JUNCTIONS" ] && ViashError Bad arguments for option \'--junctions\': \'$VIASH_PAR_JUNCTIONS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_JUNCTIONS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --junctions. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --junctions=*)
            [ -n "$VIASH_PAR_JUNCTIONS" ] && ViashError Bad arguments for option \'--junctions=*\': \'$VIASH_PAR_JUNCTIONS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_JUNCTIONS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --format)
            [ -n "$VIASH_PAR_FORMAT" ] && ViashError Bad arguments for option \'--format\': \'$VIASH_PAR_FORMAT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FORMAT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --format. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --format=*)
            [ -n "$VIASH_PAR_FORMAT" ] && ViashError Bad arguments for option \'--format=*\': \'$VIASH_PAR_FORMAT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FORMAT=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -F)
            [ -n "$VIASH_PAR_FORMAT" ] && ViashError Bad arguments for option \'-F\': \'$VIASH_PAR_FORMAT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FORMAT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -F. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --feature_type)
            if [ -z "$VIASH_PAR_FEATURE_TYPE" ]; then
              VIASH_PAR_FEATURE_TYPE="$2"
            else
              VIASH_PAR_FEATURE_TYPE="$VIASH_PAR_FEATURE_TYPE;""$2"
            fi
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --feature_type. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --feature_type=*)
            if [ -z "$VIASH_PAR_FEATURE_TYPE" ]; then
              VIASH_PAR_FEATURE_TYPE=$(ViashRemoveFlags "$1")
            else
              VIASH_PAR_FEATURE_TYPE="$VIASH_PAR_FEATURE_TYPE;"$(ViashRemoveFlags "$1")
            fi
            shift 1
            ;;
        -t)
            if [ -z "$VIASH_PAR_FEATURE_TYPE" ]; then
              VIASH_PAR_FEATURE_TYPE="$2"
            else
              VIASH_PAR_FEATURE_TYPE="$VIASH_PAR_FEATURE_TYPE;""$2"
            fi
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -t. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --attribute_type)
            [ -n "$VIASH_PAR_ATTRIBUTE_TYPE" ] && ViashError Bad arguments for option \'--attribute_type\': \'$VIASH_PAR_ATTRIBUTE_TYPE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_ATTRIBUTE_TYPE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --attribute_type. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --attribute_type=*)
            [ -n "$VIASH_PAR_ATTRIBUTE_TYPE" ] && ViashError Bad arguments for option \'--attribute_type=*\': \'$VIASH_PAR_ATTRIBUTE_TYPE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_ATTRIBUTE_TYPE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -g)
            [ -n "$VIASH_PAR_ATTRIBUTE_TYPE" ] && ViashError Bad arguments for option \'-g\': \'$VIASH_PAR_ATTRIBUTE_TYPE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_ATTRIBUTE_TYPE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -g. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --extra_attributes)
            if [ -z "$VIASH_PAR_EXTRA_ATTRIBUTES" ]; then
              VIASH_PAR_EXTRA_ATTRIBUTES="$2"
            else
              VIASH_PAR_EXTRA_ATTRIBUTES="$VIASH_PAR_EXTRA_ATTRIBUTES;""$2"
            fi
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --extra_attributes. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --extra_attributes=*)
            if [ -z "$VIASH_PAR_EXTRA_ATTRIBUTES" ]; then
              VIASH_PAR_EXTRA_ATTRIBUTES=$(ViashRemoveFlags "$1")
            else
              VIASH_PAR_EXTRA_ATTRIBUTES="$VIASH_PAR_EXTRA_ATTRIBUTES;"$(ViashRemoveFlags "$1")
            fi
            shift 1
            ;;
        --chrom_alias)
            [ -n "$VIASH_PAR_CHROM_ALIAS" ] && ViashError Bad arguments for option \'--chrom_alias\': \'$VIASH_PAR_CHROM_ALIAS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CHROM_ALIAS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --chrom_alias. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --chrom_alias=*)
            [ -n "$VIASH_PAR_CHROM_ALIAS" ] && ViashError Bad arguments for option \'--chrom_alias=*\': \'$VIASH_PAR_CHROM_ALIAS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CHROM_ALIAS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -A)
            [ -n "$VIASH_PAR_CHROM_ALIAS" ] && ViashError Bad arguments for option \'-A\': \'$VIASH_PAR_CHROM_ALIAS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CHROM_ALIAS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -A. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --feature_level)
            [ -n "$VIASH_PAR_FEATURE_LEVEL" ] && ViashError Bad arguments for option \'--feature_level\': \'$VIASH_PAR_FEATURE_LEVEL\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FEATURE_LEVEL=true
            shift 1
            ;;
        -f)
            [ -n "$VIASH_PAR_FEATURE_LEVEL" ] && ViashError Bad arguments for option \'-f\': \'$VIASH_PAR_FEATURE_LEVEL\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FEATURE_LEVEL=true
            shift 1
            ;;
        --overlapping)
            [ -n "$VIASH_PAR_OVERLAPPING" ] && ViashError Bad arguments for option \'--overlapping\': \'$VIASH_PAR_OVERLAPPING\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OVERLAPPING=true
            shift 1
            ;;
        -O)
            [ -n "$VIASH_PAR_OVERLAPPING" ] && ViashError Bad arguments for option \'-O\': \'$VIASH_PAR_OVERLAPPING\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_OVERLAPPING=true
            shift 1
            ;;
        --min_overlap)
            [ -n "$VIASH_PAR_MIN_OVERLAP" ] && ViashError Bad arguments for option \'--min_overlap\': \'$VIASH_PAR_MIN_OVERLAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_OVERLAP="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --min_overlap. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --min_overlap=*)
            [ -n "$VIASH_PAR_MIN_OVERLAP" ] && ViashError Bad arguments for option \'--min_overlap=*\': \'$VIASH_PAR_MIN_OVERLAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_OVERLAP=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --frac_overlap)
            [ -n "$VIASH_PAR_FRAC_OVERLAP" ] && ViashError Bad arguments for option \'--frac_overlap\': \'$VIASH_PAR_FRAC_OVERLAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FRAC_OVERLAP="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --frac_overlap. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --frac_overlap=*)
            [ -n "$VIASH_PAR_FRAC_OVERLAP" ] && ViashError Bad arguments for option \'--frac_overlap=*\': \'$VIASH_PAR_FRAC_OVERLAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FRAC_OVERLAP=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --frac_overlap_feature)
            [ -n "$VIASH_PAR_FRAC_OVERLAP_FEATURE" ] && ViashError Bad arguments for option \'--frac_overlap_feature\': \'$VIASH_PAR_FRAC_OVERLAP_FEATURE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FRAC_OVERLAP_FEATURE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --frac_overlap_feature. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --frac_overlap_feature=*)
            [ -n "$VIASH_PAR_FRAC_OVERLAP_FEATURE" ] && ViashError Bad arguments for option \'--frac_overlap_feature=*\': \'$VIASH_PAR_FRAC_OVERLAP_FEATURE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FRAC_OVERLAP_FEATURE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --largest_overlap)
            [ -n "$VIASH_PAR_LARGEST_OVERLAP" ] && ViashError Bad arguments for option \'--largest_overlap\': \'$VIASH_PAR_LARGEST_OVERLAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_LARGEST_OVERLAP=true
            shift 1
            ;;
        --non_overlap)
            [ -n "$VIASH_PAR_NON_OVERLAP" ] && ViashError Bad arguments for option \'--non_overlap\': \'$VIASH_PAR_NON_OVERLAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_NON_OVERLAP="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --non_overlap. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --non_overlap=*)
            [ -n "$VIASH_PAR_NON_OVERLAP" ] && ViashError Bad arguments for option \'--non_overlap=*\': \'$VIASH_PAR_NON_OVERLAP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_NON_OVERLAP=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --non_overlap_feature)
            [ -n "$VIASH_PAR_NON_OVERLAP_FEATURE" ] && ViashError Bad arguments for option \'--non_overlap_feature\': \'$VIASH_PAR_NON_OVERLAP_FEATURE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_NON_OVERLAP_FEATURE="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --non_overlap_feature. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --non_overlap_feature=*)
            [ -n "$VIASH_PAR_NON_OVERLAP_FEATURE" ] && ViashError Bad arguments for option \'--non_overlap_feature=*\': \'$VIASH_PAR_NON_OVERLAP_FEATURE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_NON_OVERLAP_FEATURE=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --read_extension5)
            [ -n "$VIASH_PAR_READ_EXTENSION5" ] && ViashError Bad arguments for option \'--read_extension5\': \'$VIASH_PAR_READ_EXTENSION5\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_EXTENSION5="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --read_extension5. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --read_extension5=*)
            [ -n "$VIASH_PAR_READ_EXTENSION5" ] && ViashError Bad arguments for option \'--read_extension5=*\': \'$VIASH_PAR_READ_EXTENSION5\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_EXTENSION5=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --read_extension3)
            [ -n "$VIASH_PAR_READ_EXTENSION3" ] && ViashError Bad arguments for option \'--read_extension3\': \'$VIASH_PAR_READ_EXTENSION3\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_EXTENSION3="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --read_extension3. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --read_extension3=*)
            [ -n "$VIASH_PAR_READ_EXTENSION3" ] && ViashError Bad arguments for option \'--read_extension3=*\': \'$VIASH_PAR_READ_EXTENSION3\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ_EXTENSION3=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --read2pos)
            [ -n "$VIASH_PAR_READ2POS" ] && ViashError Bad arguments for option \'--read2pos\': \'$VIASH_PAR_READ2POS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ2POS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --read2pos. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --read2pos=*)
            [ -n "$VIASH_PAR_READ2POS" ] && ViashError Bad arguments for option \'--read2pos=*\': \'$VIASH_PAR_READ2POS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_READ2POS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --multi_mapping)
            [ -n "$VIASH_PAR_MULTI_MAPPING" ] && ViashError Bad arguments for option \'--multi_mapping\': \'$VIASH_PAR_MULTI_MAPPING\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MULTI_MAPPING=true
            shift 1
            ;;
        -M)
            [ -n "$VIASH_PAR_MULTI_MAPPING" ] && ViashError Bad arguments for option \'-M\': \'$VIASH_PAR_MULTI_MAPPING\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MULTI_MAPPING=true
            shift 1
            ;;
        --fraction)
            [ -n "$VIASH_PAR_FRACTION" ] && ViashError Bad arguments for option \'--fraction\': \'$VIASH_PAR_FRACTION\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_FRACTION=true
            shift 1
            ;;
        --min_map_quality)
            [ -n "$VIASH_PAR_MIN_MAP_QUALITY" ] && ViashError Bad arguments for option \'--min_map_quality\': \'$VIASH_PAR_MIN_MAP_QUALITY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_MAP_QUALITY="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --min_map_quality. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --min_map_quality=*)
            [ -n "$VIASH_PAR_MIN_MAP_QUALITY" ] && ViashError Bad arguments for option \'--min_map_quality=*\': \'$VIASH_PAR_MIN_MAP_QUALITY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_MAP_QUALITY=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -Q)
            [ -n "$VIASH_PAR_MIN_MAP_QUALITY" ] && ViashError Bad arguments for option \'-Q\': \'$VIASH_PAR_MIN_MAP_QUALITY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_MAP_QUALITY="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -Q. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --split_only)
            [ -n "$VIASH_PAR_SPLIT_ONLY" ] && ViashError Bad arguments for option \'--split_only\': \'$VIASH_PAR_SPLIT_ONLY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SPLIT_ONLY=true
            shift 1
            ;;
        --non_split_only)
            [ -n "$VIASH_PAR_NON_SPLIT_ONLY" ] && ViashError Bad arguments for option \'--non_split_only\': \'$VIASH_PAR_NON_SPLIT_ONLY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_NON_SPLIT_ONLY=true
            shift 1
            ;;
        --primary)
            [ -n "$VIASH_PAR_PRIMARY" ] && ViashError Bad arguments for option \'--primary\': \'$VIASH_PAR_PRIMARY\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_PRIMARY=true
            shift 1
            ;;
        --ignore_dup)
            [ -n "$VIASH_PAR_IGNORE_DUP" ] && ViashError Bad arguments for option \'--ignore_dup\': \'$VIASH_PAR_IGNORE_DUP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_IGNORE_DUP=true
            shift 1
            ;;
        --strand)
            [ -n "$VIASH_PAR_STRAND" ] && ViashError Bad arguments for option \'--strand\': \'$VIASH_PAR_STRAND\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_STRAND="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --strand. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --strand=*)
            [ -n "$VIASH_PAR_STRAND" ] && ViashError Bad arguments for option \'--strand=*\': \'$VIASH_PAR_STRAND\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_STRAND=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -s)
            [ -n "$VIASH_PAR_STRAND" ] && ViashError Bad arguments for option \'-s\': \'$VIASH_PAR_STRAND\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_STRAND="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -s. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --ref_fasta)
            [ -n "$VIASH_PAR_REF_FASTA" ] && ViashError Bad arguments for option \'--ref_fasta\': \'$VIASH_PAR_REF_FASTA\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REF_FASTA="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --ref_fasta. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --ref_fasta=*)
            [ -n "$VIASH_PAR_REF_FASTA" ] && ViashError Bad arguments for option \'--ref_fasta=*\': \'$VIASH_PAR_REF_FASTA\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REF_FASTA=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -G)
            [ -n "$VIASH_PAR_REF_FASTA" ] && ViashError Bad arguments for option \'-G\': \'$VIASH_PAR_REF_FASTA\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_REF_FASTA="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -G. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --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
            ;;
        -p)
            [ -n "$VIASH_PAR_PAIRED" ] && ViashError Bad arguments for option \'-p\': \'$VIASH_PAR_PAIRED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_PAIRED=true
            shift 1
            ;;
        --count_read_pairs)
            [ -n "$VIASH_PAR_COUNT_READ_PAIRS" ] && ViashError Bad arguments for option \'--count_read_pairs\': \'$VIASH_PAR_COUNT_READ_PAIRS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_COUNT_READ_PAIRS=true
            shift 1
            ;;
        --both_aligned)
            [ -n "$VIASH_PAR_BOTH_ALIGNED" ] && ViashError Bad arguments for option \'--both_aligned\': \'$VIASH_PAR_BOTH_ALIGNED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_BOTH_ALIGNED=true
            shift 1
            ;;
        -B)
            [ -n "$VIASH_PAR_BOTH_ALIGNED" ] && ViashError Bad arguments for option \'-B\': \'$VIASH_PAR_BOTH_ALIGNED\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_BOTH_ALIGNED=true
            shift 1
            ;;
        --check_pe_dist)
            [ -n "$VIASH_PAR_CHECK_PE_DIST" ] && ViashError Bad arguments for option \'--check_pe_dist\': \'$VIASH_PAR_CHECK_PE_DIST\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CHECK_PE_DIST=true
            shift 1
            ;;
        -P)
            [ -n "$VIASH_PAR_CHECK_PE_DIST" ] && ViashError Bad arguments for option \'-P\': \'$VIASH_PAR_CHECK_PE_DIST\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_CHECK_PE_DIST=true
            shift 1
            ;;
        --min_length)
            [ -n "$VIASH_PAR_MIN_LENGTH" ] && ViashError Bad arguments for option \'--min_length\': \'$VIASH_PAR_MIN_LENGTH\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_LENGTH="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --min_length. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --min_length=*)
            [ -n "$VIASH_PAR_MIN_LENGTH" ] && ViashError Bad arguments for option \'--min_length=*\': \'$VIASH_PAR_MIN_LENGTH\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_LENGTH=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -d)
            [ -n "$VIASH_PAR_MIN_LENGTH" ] && ViashError Bad arguments for option \'-d\': \'$VIASH_PAR_MIN_LENGTH\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MIN_LENGTH="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -d. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --max_length)
            [ -n "$VIASH_PAR_MAX_LENGTH" ] && ViashError Bad arguments for option \'--max_length\': \'$VIASH_PAR_MAX_LENGTH\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MAX_LENGTH="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --max_length. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --max_length=*)
            [ -n "$VIASH_PAR_MAX_LENGTH" ] && ViashError Bad arguments for option \'--max_length=*\': \'$VIASH_PAR_MAX_LENGTH\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MAX_LENGTH=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -D)
            [ -n "$VIASH_PAR_MAX_LENGTH" ] && ViashError Bad arguments for option \'-D\': \'$VIASH_PAR_MAX_LENGTH\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MAX_LENGTH="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -D. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --same_strand)
            [ -n "$VIASH_PAR_SAME_STRAND" ] && ViashError Bad arguments for option \'--same_strand\': \'$VIASH_PAR_SAME_STRAND\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SAME_STRAND=true
            shift 1
            ;;
        -C)
            [ -n "$VIASH_PAR_SAME_STRAND" ] && ViashError Bad arguments for option \'-C\': \'$VIASH_PAR_SAME_STRAND\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_SAME_STRAND=true
            shift 1
            ;;
        --donotsort)
            [ -n "$VIASH_PAR_DONOTSORT" ] && ViashError Bad arguments for option \'--donotsort\': \'$VIASH_PAR_DONOTSORT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_DONOTSORT=true
            shift 1
            ;;
        --by_read_group)
            [ -n "$VIASH_PAR_BY_READ_GROUP" ] && ViashError Bad arguments for option \'--by_read_group\': \'$VIASH_PAR_BY_READ_GROUP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_BY_READ_GROUP=true
            shift 1
            ;;
        --long_reads)
            [ -n "$VIASH_PAR_LONG_READS" ] && ViashError Bad arguments for option \'--long_reads\': \'$VIASH_PAR_LONG_READS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_LONG_READS=true
            shift 1
            ;;
        --detailed_results)
            [ -n "$VIASH_PAR_DETAILED_RESULTS" ] && ViashError Bad arguments for option \'--detailed_results\': \'$VIASH_PAR_DETAILED_RESULTS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_DETAILED_RESULTS="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --detailed_results. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --detailed_results=*)
            [ -n "$VIASH_PAR_DETAILED_RESULTS" ] && ViashError Bad arguments for option \'--detailed_results=*\': \'$VIASH_PAR_DETAILED_RESULTS\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_DETAILED_RESULTS=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --detailed_results_format)
            [ -n "$VIASH_PAR_DETAILED_RESULTS_FORMAT" ] && ViashError Bad arguments for option \'--detailed_results_format\': \'$VIASH_PAR_DETAILED_RESULTS_FORMAT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_DETAILED_RESULTS_FORMAT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --detailed_results_format. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --detailed_results_format=*)
            [ -n "$VIASH_PAR_DETAILED_RESULTS_FORMAT" ] && ViashError Bad arguments for option \'--detailed_results_format=*\': \'$VIASH_PAR_DETAILED_RESULTS_FORMAT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_DETAILED_RESULTS_FORMAT=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        -R)
            [ -n "$VIASH_PAR_DETAILED_RESULTS_FORMAT" ] && ViashError Bad arguments for option \'-R\': \'$VIASH_PAR_DETAILED_RESULTS_FORMAT\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_DETAILED_RESULTS_FORMAT="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to -R. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --max_M_op)
            [ -n "$VIASH_PAR_MAX_M_OP" ] && ViashError Bad arguments for option \'--max_M_op\': \'$VIASH_PAR_MAX_M_OP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MAX_M_OP="$2"
            [ $# -lt 2 ] && ViashError Not enough arguments passed to --max_M_op. Use "--help" to get more information on the parameters. && exit 1
            shift 2
            ;;
        --max_M_op=*)
            [ -n "$VIASH_PAR_MAX_M_OP" ] && ViashError Bad arguments for option \'--max_M_op=*\': \'$VIASH_PAR_MAX_M_OP\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_MAX_M_OP=$(ViashRemoveFlags "$1")
            shift 1
            ;;
        --verbose)
            [ -n "$VIASH_PAR_VERBOSE" ] && ViashError Bad arguments for option \'--verbose\': \'$VIASH_PAR_VERBOSE\' \& \'$2\' - you should provide exactly one argument for this option. && exit 1
            VIASH_PAR_VERBOSE=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" == "native" ]  ; then
  VIASH_ENGINE_TYPE='native'
elif   [ "$VIASH_ENGINE_ID" == "docker" ]  ; then
  VIASH_ENGINE_TYPE='docker'
else
  ViashError "Engine '$VIASH_ENGINE_ID' is not recognized. Options are: docker, native."
  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='images.viash-hub.com/vsh/biobox/featurecounts:seqtk_sample'
  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_PAR_ANNOTATION+x} ]; then
  ViashError '--annotation' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_PAR_INPUT+x} ]; then
  ViashError '--input' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
if [ -z ${VIASH_PAR_COUNTS+x} ]; then
  ViashError '--counts' is a required argument. Use "--help" to get more information on the parameters.
  exit 1
fi
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_FEATURE_LEVEL+x} ]; then
  VIASH_PAR_FEATURE_LEVEL="false"
fi
if [ -z ${VIASH_PAR_OVERLAPPING+x} ]; then
  VIASH_PAR_OVERLAPPING="false"
fi
if [ -z ${VIASH_PAR_LARGEST_OVERLAP+x} ]; then
  VIASH_PAR_LARGEST_OVERLAP="false"
fi
if [ -z ${VIASH_PAR_MULTI_MAPPING+x} ]; then
  VIASH_PAR_MULTI_MAPPING="false"
fi
if [ -z ${VIASH_PAR_FRACTION+x} ]; then
  VIASH_PAR_FRACTION="false"
fi
if [ -z ${VIASH_PAR_SPLIT_ONLY+x} ]; then
  VIASH_PAR_SPLIT_ONLY="false"
fi
if [ -z ${VIASH_PAR_NON_SPLIT_ONLY+x} ]; then
  VIASH_PAR_NON_SPLIT_ONLY="false"
fi
if [ -z ${VIASH_PAR_PRIMARY+x} ]; then
  VIASH_PAR_PRIMARY="false"
fi
if [ -z ${VIASH_PAR_IGNORE_DUP+x} ]; then
  VIASH_PAR_IGNORE_DUP="false"
fi
if [ -z ${VIASH_PAR_PAIRED+x} ]; then
  VIASH_PAR_PAIRED="false"
fi
if [ -z ${VIASH_PAR_COUNT_READ_PAIRS+x} ]; then
  VIASH_PAR_COUNT_READ_PAIRS="false"
fi
if [ -z ${VIASH_PAR_BOTH_ALIGNED+x} ]; then
  VIASH_PAR_BOTH_ALIGNED="false"
fi
if [ -z ${VIASH_PAR_CHECK_PE_DIST+x} ]; then
  VIASH_PAR_CHECK_PE_DIST="false"
fi
if [ -z ${VIASH_PAR_SAME_STRAND+x} ]; then
  VIASH_PAR_SAME_STRAND="false"
fi
if [ -z ${VIASH_PAR_DONOTSORT+x} ]; then
  VIASH_PAR_DONOTSORT="false"
fi
if [ -z ${VIASH_PAR_BY_READ_GROUP+x} ]; then
  VIASH_PAR_BY_READ_GROUP="false"
fi
if [ -z ${VIASH_PAR_LONG_READS+x} ]; then
  VIASH_PAR_LONG_READS="false"
fi
if [ -z ${VIASH_PAR_VERBOSE+x} ]; then
  VIASH_PAR_VERBOSE="false"
fi

# check whether required files exist
if [ ! -z "$VIASH_PAR_ANNOTATION" ] && [ ! -e "$VIASH_PAR_ANNOTATION" ]; then
  ViashError "Input file '$VIASH_PAR_ANNOTATION' does not exist."
  exit 1
fi
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_CHROM_ALIAS" ] && [ ! -e "$VIASH_PAR_CHROM_ALIAS" ]; then
  ViashError "Input file '$VIASH_PAR_CHROM_ALIAS' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_REF_FASTA" ] && [ ! -e "$VIASH_PAR_REF_FASTA" ]; then
  ViashError "Input file '$VIASH_PAR_REF_FASTA' does not exist."
  exit 1
fi

# check whether parameters values are of the right type
if [[ -n "$VIASH_PAR_FEATURE_LEVEL" ]]; then
  if ! [[ "$VIASH_PAR_FEATURE_LEVEL" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--feature_level' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_OVERLAPPING" ]]; then
  if ! [[ "$VIASH_PAR_OVERLAPPING" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--overlapping' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_MIN_OVERLAP" ]]; then
  if ! [[ "$VIASH_PAR_MIN_OVERLAP" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--min_overlap' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_FRAC_OVERLAP" ]]; then
  if ! [[ "$VIASH_PAR_FRAC_OVERLAP" =~ ^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$ ]]; then
    ViashError '--frac_overlap' has to be a double. Use "--help" to get more information on the parameters.
    exit 1
  fi
  if command -v bc &> /dev/null; then
    if ! [[ `echo $VIASH_PAR_FRAC_OVERLAP '>=' 0.0 | bc` -eq 1 ]]; then
      ViashError '--frac_overlap' has be more than or equal to 0.0. Use "--help" to get more information on the parameters.
      exit 1
    fi
  elif command -v awk &> /dev/null; then
    if ! [[ `awk -v n1=$VIASH_PAR_FRAC_OVERLAP -v n2=0.0 'BEGIN { print (n1 >= n2) ? "1" : "0" }'` -eq 1 ]]; then
      ViashError '--frac_overlap' has be more than or equal to 0.0. Use "--help" to get more information on the parameters.
      exit 1
    fi
  else
    ViashWarning '--frac_overlap' specifies a minimum value but the value was not verified as neither \'bc\' or \`awk\` are present on the system.
  fi
  if command -v bc &> /dev/null; then
    if ! [[ `echo $VIASH_PAR_FRAC_OVERLAP '<=' 1.0 | bc` -eq 1 ]]; then
      ViashError '--frac_overlap' has to be less than or equal to 1.0. Use "--help" to get more information on the parameters.
      exit 1
    fi
  elif command -v awk &> /dev/null; then
    if ! [[ `awk -v n1=$VIASH_PAR_FRAC_OVERLAP -v n2=1.0 'BEGIN { print (n1 <= n2) ? "1" : "0" }'` -eq 1 ]]; then
      ViashError '--frac_overlap' has be less than or equal to 1.0. Use "--help" to get more information on the parameters.
      exit 1
    fi
  else
    ViashWarning '--frac_overlap' specifies a maximum value but the value was not verified as neither \'bc\' or \'awk\' are present on the system.
  fi
fi
if [[ -n "$VIASH_PAR_FRAC_OVERLAP_FEATURE" ]]; then
  if ! [[ "$VIASH_PAR_FRAC_OVERLAP_FEATURE" =~ ^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$ ]]; then
    ViashError '--frac_overlap_feature' has to be a double. Use "--help" to get more information on the parameters.
    exit 1
  fi
  if command -v bc &> /dev/null; then
    if ! [[ `echo $VIASH_PAR_FRAC_OVERLAP_FEATURE '>=' 0.0 | bc` -eq 1 ]]; then
      ViashError '--frac_overlap_feature' has be more than or equal to 0.0. Use "--help" to get more information on the parameters.
      exit 1
    fi
  elif command -v awk &> /dev/null; then
    if ! [[ `awk -v n1=$VIASH_PAR_FRAC_OVERLAP_FEATURE -v n2=0.0 'BEGIN { print (n1 >= n2) ? "1" : "0" }'` -eq 1 ]]; then
      ViashError '--frac_overlap_feature' has be more than or equal to 0.0. Use "--help" to get more information on the parameters.
      exit 1
    fi
  else
    ViashWarning '--frac_overlap_feature' specifies a minimum value but the value was not verified as neither \'bc\' or \`awk\` are present on the system.
  fi
  if command -v bc &> /dev/null; then
    if ! [[ `echo $VIASH_PAR_FRAC_OVERLAP_FEATURE '<=' 1.0 | bc` -eq 1 ]]; then
      ViashError '--frac_overlap_feature' has to be less than or equal to 1.0. Use "--help" to get more information on the parameters.
      exit 1
    fi
  elif command -v awk &> /dev/null; then
    if ! [[ `awk -v n1=$VIASH_PAR_FRAC_OVERLAP_FEATURE -v n2=1.0 'BEGIN { print (n1 <= n2) ? "1" : "0" }'` -eq 1 ]]; then
      ViashError '--frac_overlap_feature' has be less than or equal to 1.0. Use "--help" to get more information on the parameters.
      exit 1
    fi
  else
    ViashWarning '--frac_overlap_feature' specifies a maximum value but the value was not verified as neither \'bc\' or \'awk\' are present on the system.
  fi
fi
if [[ -n "$VIASH_PAR_LARGEST_OVERLAP" ]]; then
  if ! [[ "$VIASH_PAR_LARGEST_OVERLAP" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--largest_overlap' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_NON_OVERLAP" ]]; then
  if ! [[ "$VIASH_PAR_NON_OVERLAP" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--non_overlap' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_NON_OVERLAP_FEATURE" ]]; then
  if ! [[ "$VIASH_PAR_NON_OVERLAP_FEATURE" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--non_overlap_feature' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_READ_EXTENSION5" ]]; then
  if ! [[ "$VIASH_PAR_READ_EXTENSION5" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--read_extension5' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_READ_EXTENSION3" ]]; then
  if ! [[ "$VIASH_PAR_READ_EXTENSION3" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--read_extension3' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_READ2POS" ]]; then
  if ! [[ "$VIASH_PAR_READ2POS" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--read2pos' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_MULTI_MAPPING" ]]; then
  if ! [[ "$VIASH_PAR_MULTI_MAPPING" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--multi_mapping' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_FRACTION" ]]; then
  if ! [[ "$VIASH_PAR_FRACTION" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--fraction' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_MIN_MAP_QUALITY" ]]; then
  if ! [[ "$VIASH_PAR_MIN_MAP_QUALITY" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--min_map_quality' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_SPLIT_ONLY" ]]; then
  if ! [[ "$VIASH_PAR_SPLIT_ONLY" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--split_only' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_NON_SPLIT_ONLY" ]]; then
  if ! [[ "$VIASH_PAR_NON_SPLIT_ONLY" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--non_split_only' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_PRIMARY" ]]; then
  if ! [[ "$VIASH_PAR_PRIMARY" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--primary' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_IGNORE_DUP" ]]; then
  if ! [[ "$VIASH_PAR_IGNORE_DUP" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--ignore_dup' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_STRAND" ]]; then
  if ! [[ "$VIASH_PAR_STRAND" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--strand' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
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_COUNT_READ_PAIRS" ]]; then
  if ! [[ "$VIASH_PAR_COUNT_READ_PAIRS" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--count_read_pairs' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_BOTH_ALIGNED" ]]; then
  if ! [[ "$VIASH_PAR_BOTH_ALIGNED" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--both_aligned' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_CHECK_PE_DIST" ]]; then
  if ! [[ "$VIASH_PAR_CHECK_PE_DIST" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--check_pe_dist' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_MIN_LENGTH" ]]; then
  if ! [[ "$VIASH_PAR_MIN_LENGTH" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--min_length' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_MAX_LENGTH" ]]; then
  if ! [[ "$VIASH_PAR_MAX_LENGTH" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--max_length' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_SAME_STRAND" ]]; then
  if ! [[ "$VIASH_PAR_SAME_STRAND" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--same_strand' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_DONOTSORT" ]]; then
  if ! [[ "$VIASH_PAR_DONOTSORT" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--donotsort' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_BY_READ_GROUP" ]]; then
  if ! [[ "$VIASH_PAR_BY_READ_GROUP" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--by_read_group' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_LONG_READS" ]]; then
  if ! [[ "$VIASH_PAR_LONG_READS" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--long_reads' has to be a boolean_true. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_MAX_M_OP" ]]; then
  if ! [[ "$VIASH_PAR_MAX_M_OP" =~ ^[-+]?[0-9]+$ ]]; then
    ViashError '--max_M_op' has to be an integer. Use "--help" to get more information on the parameters.
    exit 1
  fi
fi
if [[ -n "$VIASH_PAR_VERBOSE" ]]; then
  if ! [[ "$VIASH_PAR_VERBOSE" =~ ^(true|True|TRUE|false|False|FALSE|yes|Yes|YES|no|No|NO)$ ]]; then
    ViashError '--verbose' 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_FORMAT" ]; then
  VIASH_PAR_FORMAT_CHOICES=("GTF;GFF;SAF")
  IFS=';'
  set -f
  if ! [[ ";${VIASH_PAR_FORMAT_CHOICES[*]};" =~ ";$VIASH_PAR_FORMAT;" ]]; then
    ViashError '--format' specified value of \'$VIASH_PAR_FORMAT\' 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_READ2POS" ]; then
  VIASH_PAR_READ2POS_CHOICES=("3;5")
  IFS=';'
  set -f
  if ! [[ ";${VIASH_PAR_READ2POS_CHOICES[*]};" =~ ";$VIASH_PAR_READ2POS;" ]]; then
    ViashError '--read2pos' specified value of \'$VIASH_PAR_READ2POS\' 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_STRAND" ]; then
  VIASH_PAR_STRAND_CHOICES=("0;1;2")
  IFS=';'
  set -f
  if ! [[ ";${VIASH_PAR_STRAND_CHOICES[*]};" =~ ";$VIASH_PAR_STRAND;" ]]; then
    ViashError '--strand' specified value of \'$VIASH_PAR_STRAND\' 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_DETAILED_RESULTS_FORMAT" ]; then
  VIASH_PAR_DETAILED_RESULTS_FORMAT_CHOICES=("CORE;SAM;BAM")
  IFS=';'
  set -f
  if ! [[ ";${VIASH_PAR_DETAILED_RESULTS_FORMAT_CHOICES[*]};" =~ ";$VIASH_PAR_DETAILED_RESULTS_FORMAT;" ]]; then
    ViashError '--detailed_results_format' specified value of \'$VIASH_PAR_DETAILED_RESULTS_FORMAT\' 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_COUNTS" ] && [ ! -d "$(dirname "$VIASH_PAR_COUNTS")" ]; then
  mkdir -p "$(dirname "$VIASH_PAR_COUNTS")"
fi
if [ ! -z "$VIASH_PAR_SUMMARY" ] && [ ! -d "$(dirname "$VIASH_PAR_SUMMARY")" ]; then
  mkdir -p "$(dirname "$VIASH_PAR_SUMMARY")"
fi
if [ ! -z "$VIASH_PAR_JUNCTIONS" ] && [ ! -d "$(dirname "$VIASH_PAR_JUNCTIONS")" ]; then
  mkdir -p "$(dirname "$VIASH_PAR_JUNCTIONS")"
fi
if [ ! -z "$VIASH_PAR_DETAILED_RESULTS" ] && [ ! -d "$(dirname "$VIASH_PAR_DETAILED_RESULTS")" ]; then
  mkdir -p "$(dirname "$VIASH_PAR_DETAILED_RESULTS")"
fi

if  [ "$VIASH_ENGINE_ID" == "native" ]  ; then
  if [ "$VIASH_MODE" == "run" ]; then
    VIASH_CMD="bash"
  else
    ViashError "Engine '$VIASH_ENGINE_ID' does not support mode '$VIASH_MODE'."
    exit 1
  fi
fi

if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then
  # detect volumes from file arguments
  VIASH_CHOWN_VARS=()
if [ ! -z "$VIASH_PAR_ANNOTATION" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_ANNOTATION")" )
  VIASH_PAR_ANNOTATION=$(ViashDockerAutodetectMount "$VIASH_PAR_ANNOTATION")
fi
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_COUNTS" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_COUNTS")" )
  VIASH_PAR_COUNTS=$(ViashDockerAutodetectMount "$VIASH_PAR_COUNTS")
  VIASH_CHOWN_VARS+=( "$VIASH_PAR_COUNTS" )
fi
if [ ! -z "$VIASH_PAR_SUMMARY" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_SUMMARY")" )
  VIASH_PAR_SUMMARY=$(ViashDockerAutodetectMount "$VIASH_PAR_SUMMARY")
  VIASH_CHOWN_VARS+=( "$VIASH_PAR_SUMMARY" )
fi
if [ ! -z "$VIASH_PAR_JUNCTIONS" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_JUNCTIONS")" )
  VIASH_PAR_JUNCTIONS=$(ViashDockerAutodetectMount "$VIASH_PAR_JUNCTIONS")
  VIASH_CHOWN_VARS+=( "$VIASH_PAR_JUNCTIONS" )
fi
if [ ! -z "$VIASH_PAR_CHROM_ALIAS" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_CHROM_ALIAS")" )
  VIASH_PAR_CHROM_ALIAS=$(ViashDockerAutodetectMount "$VIASH_PAR_CHROM_ALIAS")
fi
if [ ! -z "$VIASH_PAR_REF_FASTA" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_REF_FASTA")" )
  VIASH_PAR_REF_FASTA=$(ViashDockerAutodetectMount "$VIASH_PAR_REF_FASTA")
fi
if [ ! -z "$VIASH_PAR_DETAILED_RESULTS" ]; then
  VIASH_DIRECTORY_MOUNTS+=( "$(ViashDockerAutodetectMountArg "$VIASH_PAR_DETAILED_RESULTS")" )
  VIASH_PAR_DETAILED_RESULTS=$(ViashDockerAutodetectMount "$VIASH_PAR_DETAILED_RESULTS")
  VIASH_CHOWN_VARS+=( "$VIASH_PAR_DETAILED_RESULTS" )
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-featurecounts-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'
#!/bin/bash

set -e

## VIASH START
# The following code has been auto-generated by Viash.
$( if [ ! -z ${VIASH_PAR_ANNOTATION+x} ]; then echo "${VIASH_PAR_ANNOTATION}" | sed "s#'#'\"'\"'#g;s#.*#par_annotation='&'#" ; else echo "# par_annotation="; 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_COUNTS+x} ]; then echo "${VIASH_PAR_COUNTS}" | sed "s#'#'\"'\"'#g;s#.*#par_counts='&'#" ; else echo "# par_counts="; fi )
$( if [ ! -z ${VIASH_PAR_SUMMARY+x} ]; then echo "${VIASH_PAR_SUMMARY}" | sed "s#'#'\"'\"'#g;s#.*#par_summary='&'#" ; else echo "# par_summary="; fi )
$( if [ ! -z ${VIASH_PAR_JUNCTIONS+x} ]; then echo "${VIASH_PAR_JUNCTIONS}" | sed "s#'#'\"'\"'#g;s#.*#par_junctions='&'#" ; else echo "# par_junctions="; fi )
$( if [ ! -z ${VIASH_PAR_FORMAT+x} ]; then echo "${VIASH_PAR_FORMAT}" | sed "s#'#'\"'\"'#g;s#.*#par_format='&'#" ; else echo "# par_format="; fi )
$( if [ ! -z ${VIASH_PAR_FEATURE_TYPE+x} ]; then echo "${VIASH_PAR_FEATURE_TYPE}" | sed "s#'#'\"'\"'#g;s#.*#par_feature_type='&'#" ; else echo "# par_feature_type="; fi )
$( if [ ! -z ${VIASH_PAR_ATTRIBUTE_TYPE+x} ]; then echo "${VIASH_PAR_ATTRIBUTE_TYPE}" | sed "s#'#'\"'\"'#g;s#.*#par_attribute_type='&'#" ; else echo "# par_attribute_type="; fi )
$( if [ ! -z ${VIASH_PAR_EXTRA_ATTRIBUTES+x} ]; then echo "${VIASH_PAR_EXTRA_ATTRIBUTES}" | sed "s#'#'\"'\"'#g;s#.*#par_extra_attributes='&'#" ; else echo "# par_extra_attributes="; fi )
$( if [ ! -z ${VIASH_PAR_CHROM_ALIAS+x} ]; then echo "${VIASH_PAR_CHROM_ALIAS}" | sed "s#'#'\"'\"'#g;s#.*#par_chrom_alias='&'#" ; else echo "# par_chrom_alias="; fi )
$( if [ ! -z ${VIASH_PAR_FEATURE_LEVEL+x} ]; then echo "${VIASH_PAR_FEATURE_LEVEL}" | sed "s#'#'\"'\"'#g;s#.*#par_feature_level='&'#" ; else echo "# par_feature_level="; fi )
$( if [ ! -z ${VIASH_PAR_OVERLAPPING+x} ]; then echo "${VIASH_PAR_OVERLAPPING}" | sed "s#'#'\"'\"'#g;s#.*#par_overlapping='&'#" ; else echo "# par_overlapping="; fi )
$( if [ ! -z ${VIASH_PAR_MIN_OVERLAP+x} ]; then echo "${VIASH_PAR_MIN_OVERLAP}" | sed "s#'#'\"'\"'#g;s#.*#par_min_overlap='&'#" ; else echo "# par_min_overlap="; fi )
$( if [ ! -z ${VIASH_PAR_FRAC_OVERLAP+x} ]; then echo "${VIASH_PAR_FRAC_OVERLAP}" | sed "s#'#'\"'\"'#g;s#.*#par_frac_overlap='&'#" ; else echo "# par_frac_overlap="; fi )
$( if [ ! -z ${VIASH_PAR_FRAC_OVERLAP_FEATURE+x} ]; then echo "${VIASH_PAR_FRAC_OVERLAP_FEATURE}" | sed "s#'#'\"'\"'#g;s#.*#par_frac_overlap_feature='&'#" ; else echo "# par_frac_overlap_feature="; fi )
$( if [ ! -z ${VIASH_PAR_LARGEST_OVERLAP+x} ]; then echo "${VIASH_PAR_LARGEST_OVERLAP}" | sed "s#'#'\"'\"'#g;s#.*#par_largest_overlap='&'#" ; else echo "# par_largest_overlap="; fi )
$( if [ ! -z ${VIASH_PAR_NON_OVERLAP+x} ]; then echo "${VIASH_PAR_NON_OVERLAP}" | sed "s#'#'\"'\"'#g;s#.*#par_non_overlap='&'#" ; else echo "# par_non_overlap="; fi )
$( if [ ! -z ${VIASH_PAR_NON_OVERLAP_FEATURE+x} ]; then echo "${VIASH_PAR_NON_OVERLAP_FEATURE}" | sed "s#'#'\"'\"'#g;s#.*#par_non_overlap_feature='&'#" ; else echo "# par_non_overlap_feature="; fi )
$( if [ ! -z ${VIASH_PAR_READ_EXTENSION5+x} ]; then echo "${VIASH_PAR_READ_EXTENSION5}" | sed "s#'#'\"'\"'#g;s#.*#par_read_extension5='&'#" ; else echo "# par_read_extension5="; fi )
$( if [ ! -z ${VIASH_PAR_READ_EXTENSION3+x} ]; then echo "${VIASH_PAR_READ_EXTENSION3}" | sed "s#'#'\"'\"'#g;s#.*#par_read_extension3='&'#" ; else echo "# par_read_extension3="; fi )
$( if [ ! -z ${VIASH_PAR_READ2POS+x} ]; then echo "${VIASH_PAR_READ2POS}" | sed "s#'#'\"'\"'#g;s#.*#par_read2pos='&'#" ; else echo "# par_read2pos="; fi )
$( if [ ! -z ${VIASH_PAR_MULTI_MAPPING+x} ]; then echo "${VIASH_PAR_MULTI_MAPPING}" | sed "s#'#'\"'\"'#g;s#.*#par_multi_mapping='&'#" ; else echo "# par_multi_mapping="; fi )
$( if [ ! -z ${VIASH_PAR_FRACTION+x} ]; then echo "${VIASH_PAR_FRACTION}" | sed "s#'#'\"'\"'#g;s#.*#par_fraction='&'#" ; else echo "# par_fraction="; fi )
$( if [ ! -z ${VIASH_PAR_MIN_MAP_QUALITY+x} ]; then echo "${VIASH_PAR_MIN_MAP_QUALITY}" | sed "s#'#'\"'\"'#g;s#.*#par_min_map_quality='&'#" ; else echo "# par_min_map_quality="; fi )
$( if [ ! -z ${VIASH_PAR_SPLIT_ONLY+x} ]; then echo "${VIASH_PAR_SPLIT_ONLY}" | sed "s#'#'\"'\"'#g;s#.*#par_split_only='&'#" ; else echo "# par_split_only="; fi )
$( if [ ! -z ${VIASH_PAR_NON_SPLIT_ONLY+x} ]; then echo "${VIASH_PAR_NON_SPLIT_ONLY}" | sed "s#'#'\"'\"'#g;s#.*#par_non_split_only='&'#" ; else echo "# par_non_split_only="; fi )
$( if [ ! -z ${VIASH_PAR_PRIMARY+x} ]; then echo "${VIASH_PAR_PRIMARY}" | sed "s#'#'\"'\"'#g;s#.*#par_primary='&'#" ; else echo "# par_primary="; fi )
$( if [ ! -z ${VIASH_PAR_IGNORE_DUP+x} ]; then echo "${VIASH_PAR_IGNORE_DUP}" | sed "s#'#'\"'\"'#g;s#.*#par_ignore_dup='&'#" ; else echo "# par_ignore_dup="; fi )
$( if [ ! -z ${VIASH_PAR_STRAND+x} ]; then echo "${VIASH_PAR_STRAND}" | sed "s#'#'\"'\"'#g;s#.*#par_strand='&'#" ; else echo "# par_strand="; fi )
$( if [ ! -z ${VIASH_PAR_REF_FASTA+x} ]; then echo "${VIASH_PAR_REF_FASTA}" | sed "s#'#'\"'\"'#g;s#.*#par_ref_fasta='&'#" ; else echo "# par_ref_fasta="; 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_COUNT_READ_PAIRS+x} ]; then echo "${VIASH_PAR_COUNT_READ_PAIRS}" | sed "s#'#'\"'\"'#g;s#.*#par_count_read_pairs='&'#" ; else echo "# par_count_read_pairs="; fi )
$( if [ ! -z ${VIASH_PAR_BOTH_ALIGNED+x} ]; then echo "${VIASH_PAR_BOTH_ALIGNED}" | sed "s#'#'\"'\"'#g;s#.*#par_both_aligned='&'#" ; else echo "# par_both_aligned="; fi )
$( if [ ! -z ${VIASH_PAR_CHECK_PE_DIST+x} ]; then echo "${VIASH_PAR_CHECK_PE_DIST}" | sed "s#'#'\"'\"'#g;s#.*#par_check_pe_dist='&'#" ; else echo "# par_check_pe_dist="; fi )
$( if [ ! -z ${VIASH_PAR_MIN_LENGTH+x} ]; then echo "${VIASH_PAR_MIN_LENGTH}" | sed "s#'#'\"'\"'#g;s#.*#par_min_length='&'#" ; else echo "# par_min_length="; fi )
$( if [ ! -z ${VIASH_PAR_MAX_LENGTH+x} ]; then echo "${VIASH_PAR_MAX_LENGTH}" | sed "s#'#'\"'\"'#g;s#.*#par_max_length='&'#" ; else echo "# par_max_length="; fi )
$( if [ ! -z ${VIASH_PAR_SAME_STRAND+x} ]; then echo "${VIASH_PAR_SAME_STRAND}" | sed "s#'#'\"'\"'#g;s#.*#par_same_strand='&'#" ; else echo "# par_same_strand="; fi )
$( if [ ! -z ${VIASH_PAR_DONOTSORT+x} ]; then echo "${VIASH_PAR_DONOTSORT}" | sed "s#'#'\"'\"'#g;s#.*#par_donotsort='&'#" ; else echo "# par_donotsort="; fi )
$( if [ ! -z ${VIASH_PAR_BY_READ_GROUP+x} ]; then echo "${VIASH_PAR_BY_READ_GROUP}" | sed "s#'#'\"'\"'#g;s#.*#par_by_read_group='&'#" ; else echo "# par_by_read_group="; fi )
$( if [ ! -z ${VIASH_PAR_LONG_READS+x} ]; then echo "${VIASH_PAR_LONG_READS}" | sed "s#'#'\"'\"'#g;s#.*#par_long_reads='&'#" ; else echo "# par_long_reads="; fi )
$( if [ ! -z ${VIASH_PAR_DETAILED_RESULTS+x} ]; then echo "${VIASH_PAR_DETAILED_RESULTS}" | sed "s#'#'\"'\"'#g;s#.*#par_detailed_results='&'#" ; else echo "# par_detailed_results="; fi )
$( if [ ! -z ${VIASH_PAR_DETAILED_RESULTS_FORMAT+x} ]; then echo "${VIASH_PAR_DETAILED_RESULTS_FORMAT}" | sed "s#'#'\"'\"'#g;s#.*#par_detailed_results_format='&'#" ; else echo "# par_detailed_results_format="; fi )
$( if [ ! -z ${VIASH_PAR_MAX_M_OP+x} ]; then echo "${VIASH_PAR_MAX_M_OP}" | sed "s#'#'\"'\"'#g;s#.*#par_max_M_op='&'#" ; else echo "# par_max_M_op="; fi )
$( if [ ! -z ${VIASH_PAR_VERBOSE+x} ]; then echo "${VIASH_PAR_VERBOSE}" | sed "s#'#'\"'\"'#g;s#.*#par_verbose='&'#" ; else echo "# par_verbose="; 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

# create temporary directory
tmp_dir=\$(mktemp -d -p "\$meta_temp_dir" "\${meta_functionality_name}_XXXXXX")
mkdir -p "\$tmp_dir/temp"

# create detailed_results directory if variable is set and directory does not exist
if [[ ! -z "\$par_detailed_results" ]] && [[ ! -d "\$par_detailed_results" ]]; then
  mkdir -p "\$par_detailed_results"
fi

# replace comma with semicolon
par_feature_type=\$(echo \$par_feature_type | tr ',' ';')
par_extra_attributes=\$(echo \$par_extra_attributes | tr ',' ';')

# unset flag variables
[[ "\$par_feature_level" == "false" ]] && unset par_feature_level
[[ "\$par_overlapping" == "false" ]] && unset par_overlapping
[[ "\$par_largest_overlap" == "false" ]] && unset par_largest_overlap
[[ "\$par_multi_mapping" == "false" ]] && unset par_multi_mapping
[[ "\$par_fraction" == "false" ]] && unset par_fraction
[[ "\$par_split_only" == "false" ]] && unset par_split_only
[[ "\$par_non_split_only" == "false" ]] && unset par_non_split_only
[[ "\$par_primary" == "false" ]] && unset par_primary
[[ "\$par_ignore_dup" == "false" ]] && unset par_ignore_dup
[[ "\$par_paired" == "false" ]] && unset par_paired
[[ "\$par_count_read_pairs" == "false" ]] && unset par_count_read_pairs
[[ "\$par_both_aligned" == "false" ]] && unset par_both_aligned
[[ "\$par_check_pe_dist" == "false" ]] && unset par_check_pe_dist
[[ "\$par_same_strand" == "false" ]] && unset par_same_strand
[[ "\$par_donotsort" == "false" ]] && unset par_donotsort
[[ "\$par_by_read_group" == "false" ]] && unset par_by_read_group
[[ "\$par_long_reads" == "false" ]] && unset par_long_reads
[[ "\$par_verbose" == "false" ]] && unset par_verbose

IFS=";" read -ra input <<< \$par_input

featureCounts \\
  \${par_format:+-F "\${par_format}"} \\
  \${par_feature_type:+-t "\${par_feature_type}"} \\
  \${par_attribute_type:+-g "\${par_attribute_type}"} \\
  \${par_extra_attributes:+--extraAttributes "\${extra_attributes}"} \\
  \${par_chrom_alias:+-A "\${par_chrom_alias}"} \\
  \${par_feature_level:+-f} \\
  \${par_overlapping:+-O} \\
  \${par_min_overlap:+--minOverlap "\${par_min_overlap}"} \\
  \${par_frac_overlap:+--fracOverlap "\${par_frac_overlap}"} \\
  \${par_frac_overlap_feature:+--fracOverlapFeature "\${par_frac_overlap_feature}"} \\
  \${par_largest_overlap:+--largestOverlap} \\
  \${par_non_overlap:+--nonOverlap "\${par_non_overlap}"} \\
  \${par_non_overlap_feature:+--nonOverlapFeature "\${par_non_overlap_feature}"} \\
  \${par_read_extension5:+--readExtension5 "\${par_read_extension5}"} \\
  \${par_read_extension3:+--readExtension3 "\${par_read_extension3}"} \\
  \${par_read2pos:+--read2pos "\${par_read2pos}"} \\
  \${par_multi_mapping:+-M} \\
  \${par_fraction:+--fraction} \\
  \${par_min_map_quality:+-Q "\${par_min_map_quality}"} \\
  \${par_split_only:+--splitOnly} \\
  \${par_non_split_only:+--nonSplitOnly} \\
  \${par_primary:+--primary} \\
  \${par_ignore_dup:+--ignoreDup} \\
  \${par_strand:+-s "\${par_strand}"} \\
  \${par_junctions:+-J} \\
  \${par_ref_fasta:+-G "\${par_ref_fasta}"} \\
  \${par_paired:+-p} \\
  \${par_count_read_pairs:+--countReadPairs} \\
  \${par_both_aligned:+-B} \\
  \${par_check_pe_dist:+-P} \\
  \${par_min_length:+-d "\${par_min_length}"} \\
  \${par_max_length:+-D "\${par_max_length}"} \\
  \${par_same_strand:+-C} \\
  \${par_donotsort:+--donotsort} \\
  \${par_by_read_group:+--byReadGroup} \\
  \${par_long_reads:+-L} \\
  \${par_detailed_results:+--Rpath "\${par_detailed_results}"} \\
  \${par_detailed_results_format:+-R "\${par_detailed_results_format}"} \\
  \${par_max_M_op:+--maxMOp "\${par_max_M_op}"} \\
  \${par_verbose:+--verbose} \\
  \${meta_cpus:+-T "\${meta_cpus}"} \\
  --tmpDir "\$tmp_dir/temp" \\
  -a "\$par_annotation" \\
  -o "\$tmp_dir/output.txt" \\
  "\${input[*]}"

[[ ! -z "\$par_counts" ]] && mv "\$tmp_dir/output.txt" "\$par_counts"
[[ ! -z "\$par_summary" ]] && mv "\$tmp_dir/output.txt.summary" "\$par_summary"
if [[ ! -z "\$par_junctions" ]] && [[ -e "\$tmp_dir/output.txt.jcounts" ]]; then 
  mv "\$tmp_dir/output.txt.jcounts" "\$par_junctions"
fi
VIASHMAIN
bash "\$tempscript" &
wait "\$!"

VIASHEOF


if [[ "$VIASH_ENGINE_TYPE" == "docker" ]]; then
  # strip viash automount from file paths
  
  if [ ! -z "$VIASH_PAR_ANNOTATION" ]; then
    VIASH_PAR_ANNOTATION=$(ViashDockerStripAutomount "$VIASH_PAR_ANNOTATION")
  fi
  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_COUNTS" ]; then
    VIASH_PAR_COUNTS=$(ViashDockerStripAutomount "$VIASH_PAR_COUNTS")
  fi
  if [ ! -z "$VIASH_PAR_SUMMARY" ]; then
    VIASH_PAR_SUMMARY=$(ViashDockerStripAutomount "$VIASH_PAR_SUMMARY")
  fi
  if [ ! -z "$VIASH_PAR_JUNCTIONS" ]; then
    VIASH_PAR_JUNCTIONS=$(ViashDockerStripAutomount "$VIASH_PAR_JUNCTIONS")
  fi
  if [ ! -z "$VIASH_PAR_CHROM_ALIAS" ]; then
    VIASH_PAR_CHROM_ALIAS=$(ViashDockerStripAutomount "$VIASH_PAR_CHROM_ALIAS")
  fi
  if [ ! -z "$VIASH_PAR_REF_FASTA" ]; then
    VIASH_PAR_REF_FASTA=$(ViashDockerStripAutomount "$VIASH_PAR_REF_FASTA")
  fi
  if [ ! -z "$VIASH_PAR_DETAILED_RESULTS" ]; then
    VIASH_PAR_DETAILED_RESULTS=$(ViashDockerStripAutomount "$VIASH_PAR_DETAILED_RESULTS")
  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_COUNTS" ] && [ ! -e "$VIASH_PAR_COUNTS" ]; then
  ViashError "Output file '$VIASH_PAR_COUNTS' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_SUMMARY" ] && [ ! -e "$VIASH_PAR_SUMMARY" ]; then
  ViashError "Output file '$VIASH_PAR_SUMMARY' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_JUNCTIONS" ] && [ ! -e "$VIASH_PAR_JUNCTIONS" ]; then
  ViashError "Output file '$VIASH_PAR_JUNCTIONS' does not exist."
  exit 1
fi
if [ ! -z "$VIASH_PAR_DETAILED_RESULTS" ] && [ ! -e "$VIASH_PAR_DETAILED_RESULTS" ]; then
  ViashError "Output file '$VIASH_PAR_DETAILED_RESULTS' does not exist."
  exit 1
fi


exit 0
