概要
想定するのは、ファイルの拡張子がない部分を渡すと、ツールが拡張子をつけて、
必要なファイル群を探すというツールがある。
結論
必要なファイル群
のうち、1つのファイルを指定し、
文字列
は、その渡された1つのファイルから、生成し、
ほかの 必要なファイル群
は、secondaryFiles
で指定するのがよさそうである。
考え方
この場合、ツールには 文字列
だけを引数として渡すので、
ツール定義(CommandLineTool)にも、 文字列
を渡して、 必要なファイル群
を、
ツール定義の中で生成したくなるが、その方向に進んで、いまだに成功していない。
ツールにとって必要なのは、以下のものなので、一番重要とおもわれる。ファイル群を指定する。
- ファイル群
- ファイル群のプリフィックス
実行するツールが使うファイルを指定し、そこから
sample1.bwa
のファイルを指定して、
secondaryFilesに、 sample1.bai
を指定するようにする。
inputs:
- id: bwa_file
type: File # .bwa を指定する
secondaryFiles:
- ^.bai # こちらは、ユーザーが明示的にしていしなくてよい。
lastalの場合
このツールには、 .prj
ほか、いくつかのファイルが、必要である。
この場合は、.prj
ファイルを指定し、そこからほかのファイルを secondaryFiles
としてステージングするようにする。
cwlVersion: v1.0
class: CommandLineTool
baseCommand: [lastal]
arguments:
- -Q$(inputs.query_sequences)
- -e$(inputs.minimum_alignment_score)
- -i$(inputs.batches)
- $(inputs.dbname.dirname)/$(inputs.dbname.nameroot)
- $(inputs.source)
inputs:
- id: query_sequences
type: int
- id: minimum_alignment_score
type: int
- id: batches
type: int
- id: dbname
type: File # .prj
secondaryFiles:
- ^.tis
- ^.des
- ^.bck
- ^.sds
- ^.ssp
- ^.suf
- id: source
type: File
outputs:
- id: outputmaf
type: stdout
stdout: $(inputs.source.nameroot).maf
ただこの場合は、フルパス指定がかのうだったのよかった。
相対パス指定の場合は、また少し考える必要がある。
失敗談、ファイル名部分から拡張子をつけて必要なファイルを指定しようとした。
ファイル名を文字列として受け取り、拡張子部分を自動生成しようとしても、うまくいかない。(現状うまくいっていない)
例えば sample1
だけを渡して、そこから、
- sample1.bwa
- sample1.bai
というファイルを指定するようにしてもうまく動かない。
これは、ファイルをステージングする段階よりあとに、
sample1
という文字列から、sample1.bwa
とsample1.bai
を生成する順番になっていると考えられる。
実際の例
test
という文字列を渡して、いかの3つのファイルをツールにわたしたかったが、うまくいかなかった。
- test.txt
- test.tsv
- test.csv
cwlVersion: v1.0
class: CommandLineTool
requirements:
InlineJavascriptRequirement: {}
baseCommand: [cat]
arguments: []
inputs:
- id: prefix
type: string
inputBinding:
valueFrom: |
${
return { class: "File", path: "test.txt", location: "test.txt" };
}
outputs:
- id: out
type: stdout
stdout: output.txt
おまけ、重要とおもわれるファイルを探すこと
bwaとbaiなどは、関係性がわかりやすいとして、その他のケースで
最初に指定するファイルに関しては、ツールを使う人にどれが重要な
ファイルなのかを確認して、それだけCWLに明示的に指定する指定するようにするとよい。
専門家もいないようなときは、何もファイルをわたさずに、ツールを実行してエラーメッセージから推測するという方法がある。