🐓

CWL の requirements 一巡り: SchemaDefRequirement

2020/12/05に公開

この記事は CWL Advent Calendar 2020 の6日目の記事です。

Common Workflow Language (CWL) では、ワークフロー実行処理系が満たさなければならない機能以外にも、Process requirements と呼ばれる optional features についても標準化が行われています[1]

今回は CWL v1.2 で定義されている SchemaDefRequirement について簡単な解説を行います。また、各サンプルは可能な限り公式の準拠度テストで用いられているファイルを引用します。

対象読者

Conformance test #198: tests/anon_enum_inside_array_inside_schemadef.cwl:

cwlVersion: v1.2
class: CommandLineTool
requirements:
  SchemaDefRequirement:
    types: 
      - name: vcf2maf_params
        type: record
        fields:
          species:
              - "null"
              - type: enum
                symbols: [homo_sapiens, mus_musculus]
          ncbi_build:
              - "null"
              - type: enum
                symbols: [GRCh37, GRCh38, GRCm38]
inputs:
  first: vcf2maf_params
baseCommand: echo
arguments:
  - prefix: species
    valueFrom: $(inputs.first.species)
  - prefix: ncbi_build
    valueFrom: $(inputs.first.ncbi_build)
outputs:
  result: stdout

SchemaDefRequirement を用いることで、record 型 (多くのプログラミング言語で提供されている classstruct に相当するもの) および enum 型 (symbols フィールドで指定した値しか取れない文字列型)を定義し、name フィールドで付けた名前を使って inputs フィールドや outputs フィールド中から参照することができます。

上の例では、SchemaDefRequirement.types 内で speciesncbi_build フィールドを持つ vcf2maf_params 型を定義し、inputs.first の型として利用しています。この例では一回しか参照していないためありがたみは薄いですが、入力と出力で同じ型が現れる場合など、複数回の参照が必要になる場合には有効です。

ただし record 型を用いると経験的に可読性が著しく落ちるため、本当に必要な場面以外では使用しないほうがいいでしょう。例えば git などのサブコマンドを持つツール用の CWL 定義を書く際には役に立つかもしれませんが、大抵の場合は git loggit commit などの各サブコマンドに対してツール定義を書くほうが簡単で、かつユーザーからも利用しやすくなります。

脚注
  1. つまり、Process requiremens を含むワークフローやツール定義は、全ての CWL 準拠のワークフロー実行処理系で動かせるわけではありません。詳細は別記事を参照してください。 ↩︎

Discussion