-
JasperBoom authoredJasperBoom authored
lima.wdl 8.48 KiB
version 1.0
# Copyright (c) 2020 Leiden University Medical Center
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
task Lima {
input {
String libraryDesign = "same"
Boolean scoreFullPass = false
Int maxScoredBarcodePairs = 0
Int maxScoredBarcodes = 0
Int maxScoredAdapters = 0
Int minPasses = 0
Int minLength = 50
Int maxInputLength = 0
Float minRefSpan = 0.5
Int minScoringRegion = 1
Int minScore = 0
Int minEndScore = 0
Int minSignalIncrease = 10
Int minScoreLead = 10
Boolean ccsMode = false
Boolean splitBamNamed = false
Float scoredAdapterRatio = 0.25
Int peek = 0
Int guess = 0
Int guessMinCount = 0
Boolean peekGuess = false
String logLevel = "WARN"
File inputBamFile
File barcodeFile
String outputPrefix
Int threads = 2
String memory = "2G"
Int timeMinutes = 30
String dockerImage = "quay.io/biocontainers/lima:2.0.0--0"
}
Map[String, String] libraryDesignOptions = {"same": "--same", "different": "--different", "neighbors": "--neighbors"}
command {
set -e
mkdir -p "$(dirname ~{outputPrefix})"
lima \
~{libraryDesignOptions[libraryDesign]} \
~{true="--score-full-pass" false="" scoreFullPass} \
--max-scored-barcode-pairs ~{maxScoredBarcodePairs} \
--max-scored-barcodes ~{maxScoredBarcodes} \
--max-scored-adapters ~{maxScoredAdapters} \
--min-passes ~{minPasses} \
--min-length ~{minLength} \
--max-input-length ~{maxInputLength} \
--min-ref-span ~{minRefSpan} \
--min-scoring-regions ~{minScoringRegion} \
--min-score ~{minScore} \
--min-end-score ~{minEndScore} \
--min-signal-increase ~{minSignalIncrease} \
--min-score-lead ~{minScoreLead} \
~{true="--ccs" false="" ccsMode} \
~{true="--split-bam-named" false="" splitBamNamed} \
--scored-adapter-ratio ~{scoredAdapterRatio} \
--peek ~{peek} \
--guess ~{guess} \
--guess-min-count ~{guessMinCount} \
~{true="--peek-guess" false="" peekGuess} \
--log-level ~{logLevel} \
--num-threads ~{threads} \
~{"--log-file " + outputPrefix + ".stderr.log"} \
~{inputBamFile} \
~{barcodeFile} \
~{outputPrefix + ".bam"}
# copy the files with the default filename to the folder specified in
# outputPrefix.
if [ "~{basename(outputPrefix)}.json" != "~{outputPrefix}.json" ]; then
cp "~{basename(outputPrefix)}.json" "~{outputPrefix}.json"
cp "~{basename(outputPrefix)}.lima.counts" "~{outputPrefix}.lima.counts"
cp "~{basename(outputPrefix)}.lima.report" "~{outputPrefix}.lima.report"
cp "~{basename(outputPrefix)}.lima.summary" "~{outputPrefix}.lima.summary"
fi
}
output {
Array[File] limaBam = glob("*.bam")
Array[File] limaBamIndex = glob("*.bam.pbi")
Array[File] limaXml = glob("*.subreadset.xml")
File limaStderr = outputPrefix + ".stderr.log"
File limaJson = outputPrefix + ".json"
File limaCounts = outputPrefix + ".lima.counts"
File limaReport = outputPrefix + ".lima.report"
File limaSummary = outputPrefix + ".lima.summary"
}
runtime {
cpu: threads
memory: memory
time_minutes: timeMinutes
docker: dockerImage
}
parameter_meta {
# inputs
libraryDesign: {description: "Barcode structure of the library design.", category: "required"}
scoreFullPass: {description: "Only use subreads flanked by adapters for barcode identification.", category: "advanced"}
maxScoredBarcodePairs: {description: "Only use up to N barcode pair regions to find the barcode, 0 means use all.", category: "advanced"}
maxScoredBarcodes: {description: "Analyze at maximum the provided number of barcodes per ZMW, 0 means deactivated.", category: "advanced"}
maxScoredAdapters: {description: "Analyze at maximum the provided number of adapters per ZMW, 0 means deactivated.", category: "advanced"}
minPasses: {description: "Minimal number of full passes.", category: "common"}
minLength: {description: "Minimum sequence length after clipping.", category: "common"}
maxInputLength: {description: "Maximum input sequence length, 0 means deactivated.", category: "advanced"}
minRefSpan: {description: "Minimum reference span relative to the barcode length.", category: "advanced"}
minScoringRegion: {description: "Minimum number of barcode regions with sufficient relative span to the barcode length.", category: "advanced"}
minScore: {description: "Reads below the minimum barcode score are removed from downstream analysis.", category: "common"}
minEndScore: {description: "Minimum end barcode score threshold is applied to the individual leading and trailing ends.", category: "advanced"}
minSignalIncrease: {description: "The minimal score difference, between first and combined, required to call a barcode pair different.", category: "advanced"}
minScoreLead: {description: "The minimal score lead required to call a barcode pair significant.", category: "common"}
ccsMode: {description: "Ccs mode, use optimal alignment options.", category: "common"}
splitBamNamed: {description: "Split bam output by resolved barcode pair name.", category: "common"}
scoredAdapterRatio: {description: "Minimum ratio of scored vs sequenced adapters.", category: "advanced"}
peek: {description: "Demux the first N ZMWs and return the mean score, 0 means peeking deactivated.", category: "advanced"}
guess: {description: "Try to guess the used barcodes, using the provided mean score threshold, 0 means guessing deactivated.", category: "advanced"}
guessMinCount: {description: "Minimum number of ZMWs observed to whitelist barcodes.", category: "advanced"}
peekGuess: {description: "Try to infer the used barcodes subset, by peeking at the first 50,000 ZMWs.", category: "advanced"}
logLevel: {description: "Set log level. Valid choices: (TRACE, DEBUG, INFO, WARN, FATAL).", category: "advanced"}
inputBamFile: {description: "Bam input file.", category: "required"}
barcodeFile: {description: "Barcode/primer fasta file.", category: "required"}
outputPrefix: {description: "Output directory path + output file prefix.", category: "required"}
threads: {description: "The number of threads to be used.", category: "advanced"}
memory: {description: "The amount of memory available to the job.", category: "advanced"}
timeMinutes: {description: "The maximum amount of time the job will run in minutes.", category: "advanced"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
# outputs
limaBam: {description: "Demultiplexed reads output file(s)."}
limaBamIndex: {description: "Index of demultiplexed reads output file(s)."}
limaXml: {description: "Xml file of the subreadset(s)."}
limaStderr: {description: "Lima stderr log file."}
limaJson: {description: "Lima json file."}
limaCounts: {description: "Lima counts file."}
limaReport: {description: "Lima report file."}
limaSummary: {description: "Lima summary file."}
}
}