

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# WDL ワークフロー定義の詳細
<a name="workflow-languages-wdl"></a>

以下のトピックでは、HealthOmics の WDL ワークフロー定義で使用できるタイプとディレクティブについて詳しく説明します。

**Topics**
+ [WDL lenient での暗黙的な型変換](#workflow-wdl-type-conversion)
+ [input.json の名前空間定義](#workflow-wdl-namespace-defn)
+ [WDL のプリミティブ型](#workflow-wdl-primitive-types)
+ [WDL の複雑なタイプ](#workflow-wdl-complex-types)
+ [WDL のディレクティブ](#workflow-wdl-directives)
+ [WDL のタスクメタデータ](#workflow-wdl-task-metadata)
+ [WDL ワークフロー定義の例](#wdl-example)

## WDL lenient での暗黙的な型変換
<a name="workflow-wdl-type-conversion"></a>

HealthOmics は、input.json ファイルとワークフロー定義で暗黙的な型変換をサポートしています。暗黙的な型キャストを使用するには、ワークフローを作成するときにワークフローエンジンを WDL lenient として指定します。WDL lenient には、すべての標準 WDL 機能に加えて、Cromwell から移行されたワークフロー用に設計された追加の互換性動作が含まれています。お客様の Cromwell ディレクティブといくつかの非準拠ロジックをサポートしています。

WDL lenient は、WDL の制限[された例外](https://github.com/openwdl/wdl/blob/wdl-1.1/SPEC.md#-limited-exceptions)のリストで、以下の項目の型変換をサポートしています。
+ Int に浮動します。この場合、強制によって精度が失われません (1.0 は 1 にマップされます）。
+ Int/Float への文字列。強制によって精度が失われることはありません。
+ W が Y に強制され、X が Z に強制される場合、[W, X] を配列 [Pair[Y, Z]] にマッピングします。
+ Array[Pair[W, X]] を Map[Y, Z] に、W が Y に強制され、X が Z に強制される場合 (1.0 マップが 1 など）。

暗黙的な型キャストを使用するには、ワークフローまたはワークフローバージョンを作成するときに、ワークフローエンジンを WDL\_LENIENT として指定します。

コンソールでは、ワークフローエンジンパラメータの名前は **Language** です。API では、ワークフローエンジンパラメータに **engine** という名前が付けられます。詳細については、[プライベートワークフローを作成する](create-private-workflow.md)または[ワークフローバージョンを作成する](workflows-version-create.md)を参照してください。

## input.json の名前空間定義
<a name="workflow-wdl-namespace-defn"></a>

HealthOmics は input.json で完全修飾変数をサポートしています。たとえば、ワークフロー **SumWorkflow** で number1 と number2 という名前の 2 つの入力変数を宣言するとします。

```
workflow SumWorkflow {
  input {
    Int number1
    Int number2
  }
}
```

 input.json では、完全修飾変数として使用できます。

```
{
    "SumWorkflow.number1": 15,
    "SumWorkflow.number2": 27
}
```

## WDL のプリミティブ型
<a name="workflow-wdl-primitive-types"></a>

次の表は、WDL の入力が一致するプリミティブ型にどのようにマッピングされるかを示しています。HealthOmics では型強制のサポートが制限されているため、明示的な型を設定することをお勧めします。


**プリミティブ型**  

| WDL タイプ | JSON タイプ | WDL の例 | JSON キーと値の例 | 注意事項 | 
| --- | --- | --- | --- | --- | 
| Boolean | boolean | Boolean b | "b": true | 値は小文字で、引用符で囲まない必要があります。 | 
| Int | integer | Int i | "i": 7 | 引用符で囲まない必要があります。 | 
| Float | number | Float f | "f": 42.2 | 引用符で囲まない必要があります。 | 
| String | string | String s | "s": "characters" | URI である JSON 文字列は、インポートする WDL ファイルにマッピングする必要があります。 | 
| File | string | File f | "f": "s3://amzn-s3-demo-bucket1/path/to/file" | Amazon S3 および HealthOmics ストレージ URIs は、ワークフローに提供される IAM ロールがこれらのオブジェクトへの読み取りアクセス権を持っている限りインポートされます。他の URI スキーム (file://、、 など) https://はサポートされていませんftp://。URI は オブジェクトを指定する必要があります。ディレクトリにすることはできません。つまり、 で終わることはできません/。 | 
| Directory | string | Directory d | "d": "s3://bucket/path/" | Directory タイプは WDL 1.0 または 1.1 に含まれていないため、WDL ファイルの ヘッダーversion developmentに を追加する必要があります。URI は Amazon S3 URI で、プレフィックスが '/' で終わる必要があります。ディレクトリのすべてのコンテンツは、1 回のダウンロードとしてワークフローに再帰的にコピーされます。には、ワークフローに関連するファイルのみを含めるDirectory必要があります。 | 

## WDL の複雑なタイプ
<a name="workflow-wdl-complex-types"></a>

次の表は、WDL の入力が一致する複雑な JSON タイプにどのようにマッピングされるかを示しています。WDL の複雑な型は、プリミティブ型で構成されるデータ構造です。リストなどのデータ構造は配列に変換されます。


**複合型**  

| WDL タイプ | JSON タイプ | WDL の例 | JSON キーと値の例 | 注意事項 | 
| --- | --- | --- | --- | --- | 
| Array | array | Array[Int] nums | “nums": [1, 2, 3] | 配列のメンバーは、WDL 配列タイプの形式に従う必要があります。 | 
| Pair | object | Pair[String, Int] str\_to\_i | “str\_to\_i": {"left": "0", "right": 1} | ペアの各値は、一致する WDL タイプの JSON 形式を使用する必要があります。WDL ペア JSON 表現の文字列キー名は、大文字と小文字を区別せずに一致します。たとえば、{"left": "0"、"right": 1}、{"LEFT": "0"、"Right": 1} は、ペアタイプに逆シリアル化するときに同等として扱われます。 | 
| Map | object | Map[Int, String] int\_to\_string | "int\_to\_string": { 2: "hello", 1: "goodbye" } | マップの各エントリは、一致する WDL タイプの JSON 形式を使用する必要があります。 | 
| Struct | object | <pre>struct SampleBamAndIndex { <br />  String sample_name <br />  File bam <br />  File bam_index <br />} SampleBamAndIndex b_and_i</pre>  |  <pre>"b_and_i": { <br />   "sample_name": "NA12878", <br />   "bam": "s3://amzn-s3-demo-bucket1/NA12878.bam", <br />   "bam_index": "s3://amzn-s3-demo-bucket1/NA12878.bam.bai" <br />}           </pre>  | 構造体メンバーの名前は、JSON オブジェクトキーの名前と完全に一致する必要があります。各値は、一致する WDL タイプの JSON 形式を使用する必要があります。 | 
| Object | 該当なし | 該当なし | 該当なし | WDL Objectタイプは古いため、いずれの場合Structも に置き換える必要があります。 | 

## WDL のディレクティブ
<a name="workflow-wdl-directives"></a>

HealthOmics は、HealthOmics がサポートするすべての WDL バージョンで次のディレクティブをサポートしています。

### GPU リソースを設定する
<a name="workflow-wdl-directive-gpu"></a>

HealthOmics は、サポートされているすべての [GPU インスタンス](https://docs.aws.amazon.com/omics/latest/dev/task-accelerators.html)**acceleratorCount**でランタイム属性 **acceleratorType**と をサポートします。HealthOmics は**gpuCount**、アクセラレーターと同じ機能を持つ **gpuType**および という名前のエイリアスもサポートしています。WDL 定義に両方のディレクティブが含まれている場合、HealthOmics はアクセラレーター値を使用します。

次の例は、これらのディレクティブを使用する方法を示しています。

```
runtime {
    gpuCount: 2
    gpuType: "nvidia-tesla-t4"
}
```

### サービスエラーのタスク再試行を設定する
<a name="workflow-wdl-task-retry"></a>

HealthOmics は、サービスエラー (5XX HTTP ステータスコード) のために失敗したタスクに対して最大 2 回の再試行をサポートします。最大再試行回数 (1 または 2) を設定し、サービスエラーの再試行をオプトアウトできます。デフォルトでは、HealthOmics は最大 2 回の再試行を試みます。

次の例では`preemptible`、 がサービスエラーの再試行をオプトアウトするように を設定します。

```
{
  preemptible: 0 
}
```

HealthOmics でのタスクの再試行の詳細については、「」を参照してください[タスクの再試行](monitoring-runs.md#run-status-task-retries)。

### メモリ不足のタスク再試行を設定する
<a name="workflow-wdl-retries"></a>

HealthOmics は、メモリ不足 (コンテナ終了コード 137、4XX HTTP ステータスコード) のために失敗したタスクの再試行をサポートしています。HealthOmics は、再試行するたびにメモリの量を 2 倍にします。

デフォルトでは、HealthOmics はこのタイプの障害を再試行しません。`maxRetries` ディレクティブを使用して、最大再試行回数を指定します。

次の例では、 を 3 `maxRetries`に設定するため、HealthOmics はタスクの完了を最大 4 回試行します (最初の試行と 3 回の再試行）。

```
runtime {
    maxRetries: 3
}
```

**注記**  
メモリ不足のタスク再試行には、GNU findutils 4.2.3\+ が必要です。デフォルトの HealthOmics イメージコンテナには、このパッケージが含まれています。WDL 定義でカスタムイメージを指定する場合は、そのイメージに GNU findutils 4.2.3\+ が含まれていることを確認してください。

### リターンコードを設定する
<a name="workflow-wdl-directive-returnCodes"></a>

**returnCodes** 属性は、タスクが正常に実行されたことを示すリターンコードまたは一連のリターンコードを指定するメカニズムを提供します。WDL エンジンは、WDL 定義の**ランタイム**セクションで指定したリターンコードを尊重し、それに応じてタスクのステータスを設定します。

```
runtime {
    returnCodes: 1
}
```

HealthOmics は、returnCodes と同じ機能を持つ **continueOnReturnCode** という名前のエイリアスもサポートしています。 **returnCodes** 両方の属性を指定すると、HealthOmics は **returnCodes** 値を使用します。

## WDL のタスクメタデータ
<a name="workflow-wdl-task-metadata"></a>

HealthOmics は、WDL タスクに対して次のメタデータオプションをサポートしています。

### volatile 属性を使用してタスクレベルのキャッシュを無効にする
<a name="workflow-wdl-volatile-attribute"></a>

**volatile** 属性を使用すると、WDL ワークフロー内の特定のタスクのコールキャッシュを無効にすることができます。タスクが揮発性としてマークされると、実行に対してキャッシュが有効になっている場合でも、常に実行され、キャッシュされた結果は使用されません。

タスク定義の**メタ**セクションに **volatile** 属性を追加します。

```
task my_volatile_task {
    meta {
        volatile: true
    }
    
    input {
        String input_file
    }
    
    command {
        echo "Processing ${input_file}" > output.txt
    }
    
    output {
        File result = "output.txt"
    }
}
```

## WDL ワークフロー定義の例
<a name="wdl-example"></a>

次の例は、WDL `BAM`で から `CRAM` に変換するためのプライベートワークフロー定義を示しています。`CRAM` から `BAM` ワークフローへの は 2 つのタスクを定義し、`genomes-in-the-cloud`コンテナのツールを使用します。この例は、一般公開されています。

次の例は、Amazon ECR コンテナをパラメータとして含める方法を示しています。これにより、HealthOmics は実行を開始する前にコンテナへのアクセス許可を検証できます。

```
{
   ...
   "gotc_docker":"<account_id>.dkr.ecr.<region>.amazonaws.com/genomes-in-the-cloud:2.4.7-1603303710"
}
```

次の例は、ファイルが Amazon S3 バケットにある場合に、実行で使用するファイルを指定する方法を示しています。

```
{
    "input_cram": "s3://amzn-s3-demo-bucket1/inputs/NA12878.cram",
    "ref_dict": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.dict",
    "ref_fasta": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta",
    "ref_fasta_index": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta.fai",
    "sample_name": "NA12878"
}
```

シーケンスストアからファイルを指定する場合は、次の例に示すように、シーケンスストアの URI を使用して指定します。

```
{
    "input_cram": "omics://429915189008.storage.us-west-2.amazonaws.com/111122223333/readSet/4500843795/source1",
    "ref_dict": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.dict",
    "ref_fasta": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta",
    "ref_fasta_index": "s3://amzn-s3-demo-bucket1/inputs/Homo_sapiens_assembly38.fasta.fai",
    "sample_name": "NA12878"
}
```

その後、次の例に示すように、WDL でワークフローを定義できます。

```
 version 1.0
workflow CramToBamFlow {
    input {
        File ref_fasta
        File ref_fasta_index
        File ref_dict
        File input_cram
        String sample_name
        String gotc_docker = "<account>.dkr.ecr.us-west-2.amazonaws.com/genomes-in-the-
cloud:latest"
    }
    #Converts CRAM to SAM to BAM and makes BAI.
    call CramToBamTask{
         input:
            ref_fasta = ref_fasta,
            ref_fasta_index = ref_fasta_index,
            ref_dict = ref_dict,
            input_cram = input_cram,
            sample_name = sample_name,
            docker_image = gotc_docker,
     }
     #Validates Bam.
     call ValidateSamFile{
        input:
           input_bam = CramToBamTask.outputBam,
           docker_image = gotc_docker,
     }
     #Outputs Bam, Bai, and validation report to the FireCloud data model.
     output {
         File outputBam = CramToBamTask.outputBam
         File outputBai = CramToBamTask.outputBai
         File validation_report = ValidateSamFile.report
      }
}
#Task definitions.
task CramToBamTask {
    input {
       # Command parameters
       File ref_fasta
       File ref_fasta_index
       File ref_dict
       File input_cram
       String sample_name
       # Runtime parameters
       String docker_image
    }
   #Calls samtools view to do the conversion.
   command {
       set -eo pipefail

       samtools view -h -T ~{ref_fasta} ~{input_cram} |
       samtools view -b -o ~{sample_name}.bam -
       samtools index -b ~{sample_name}.bam
       mv ~{sample_name}.bam.bai ~{sample_name}.bai
    }
    
    #Runtime attributes:
    runtime {
        docker: docker_image
    }

    #Outputs a BAM and BAI with the same sample name
     output {
         File outputBam = "~{sample_name}.bam"
         File outputBai = "~{sample_name}.bai"
    }
}

#Validates BAM output to ensure it wasn't corrupted during the file conversion.
task ValidateSamFile {
   input {
      File input_bam
      Int machine_mem_size = 4
      String docker_image
   }
   String output_name = basename(input_bam, ".bam") + ".validation_report"
   Int command_mem_size = machine_mem_size - 1
   command {
       java -Xmx~{command_mem_size}G -jar /usr/gitc/picard.jar \
       ValidateSamFile \
       INPUT=~{input_bam} \
       OUTPUT=~{output_name} \
       MODE=SUMMARY \
       IS_BISULFITE_SEQUENCED=false
    }
    runtime {
    docker: docker_image
    }
   #A text file is generated that lists errors or warnings that apply.
    output {
        File report = "~{output_name}"
    }
}
```