LoginSignup
1
0

More than 3 years have passed since last update.

CWLで、ツールが複数のファイルを必要とするときなど、secondaryFiles について

Posted at

概要

想定するのは、ファイルの拡張子がない部分を渡すと、ツールが拡張子をつけて、
必要なファイル群を探すというツールがある。

結論

必要なファイル群 のうち、1つのファイルを指定し、
文字列 は、その渡された1つのファイルから、生成し、
ほかの 必要なファイル群 は、secondaryFiles で指定するのがよさそうである。

考え方

この場合、ツールには 文字列 だけを引数として渡すので、
ツール定義(CommandLineTool)にも、 文字列 を渡して、 必要なファイル群 を、
ツール定義の中で生成したくなるが、その方向に進んで、いまだに成功していない。

ツールにとって必要なのは、以下のものなので、一番重要とおもわれる。ファイル群を指定する。

  1. ファイル群
  2. ファイル群のプリフィックス

実行するツールが使うファイルを指定し、そこから

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.bwasample1.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に明示的に指定する指定するようにするとよい。

専門家もいないようなときは、何もファイルをわたさずに、ツールを実行してエラーメッセージから推測するという方法がある。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0