namerootではうまく編集できないouput名の編集
#CWL
目的
inputのFileやstringを用いて、outputファイル名を作成したい(例)inputのファイル名を一部変えたoutputファイル名
code:bash
# before
examele-foo.vcf.gz
# after
example.vcf.gz
解答
他の入力パラメータを使って出力名を作成する例を示します。この場合、example.vcf.gzからexamele-foo.vcf.gzを作りたいので、namerootフィールドを使うだけでは不十分です。(例)$(inputs.vcf.nameroot)
code:yaml
cwlVersion: v1.2
class: CommandLineTool
requirements:
InlineJavascriptRequirement: {}
baseCommand: echo
inputs:
vcf: string
output_name:
type: string
default: 'dummy text'
doc: "Automatically calculated from vcf"
inputBinding:
valueFrom: $(inputs.vcf.slice(0, -7))-foo.vcf.gz
outputs: []
このように実行できます
code:bash
$ cwltool sample.cwl --vcf example.vcf.gz
INFO /home/vscode/.local/bin/cwltool 3.1.20240708091338.dev14+gacd6a1b0
INFO Resolved 'sample.cwl' to 'file:///workspaces/cwltool/sample.cwl'
INFO job sample.cwl /tmp/6kj7azpo$ echo \
example-foo.vcf.gz
example-foo.vcf.gz
INFO job sample.cwl completed success
{}INFO Final process status is success
実装例
https://github.com/ellisdoro/BioHackathonFiles2024/blob/9a0186bc630688ca1955c847b7a12fdaa13a4380/Tools/AddTogoVarAnnotation.cwl#L42-L54
注意点
default: 'dummy text'を入れないと、下記valueFromは動かない
valueFrom: $(inputs.vcf.slice(0, -7))-foo.vcf.gz
output_nameは入力値としては基本的に与えないが、type:string?にはしない
type:string?は、output_nameの値がnullになり、output_nameのvalueFromが実行されないため、このケースでは機能しない。
type:string?にしても動くが、冗長
namerootではなぜだめなのか?
namerootはファイル名だけ取り出し最後の「.拡張子」を取り除くのには有効
code:yaml
# $(inputs.vcf.nameroot)
# vcf = path/to/examele-foo.vcf.gz
#change to .txt, examele-foo.vcf.txt
$(inputs.vcf.nameroot)+.txt
CWLのnamerootなどの説明