

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Spesifikasi definisi alur kerja WDL
<a name="workflow-languages-wdl"></a>

Topik berikut memberikan rincian tentang jenis dan arahan yang tersedia untuk definisi alur kerja WDL di. HealthOmics

**Topics**
+ [Konversi tipe implisit di WDL yang lunak](#workflow-wdl-type-conversion)
+ [Definisi namespace di input.json](#workflow-wdl-namespace-defn)
+ [Tipe primitif di WDL](#workflow-wdl-primitive-types)
+ [Jenis kompleks di WDL](#workflow-wdl-complex-types)
+ [Arahan di WDL](#workflow-wdl-directives)
+ [Metadata tugas di WDL](#workflow-wdl-task-metadata)
+ [Contoh definisi alur kerja WDL](#wdl-example)

## Konversi tipe implisit di WDL yang lunak
<a name="workflow-wdl-type-conversion"></a>

HealthOmics mendukung konversi tipe implisit dalam file input.json dan definisi alur kerja. Untuk menggunakan casting tipe implisit, tentukan mesin alur kerja sebagai WDL lunak saat Anda membuat alur kerja. WDL lenient mencakup semua fitur WDL standar ditambah perilaku kompatibilitas tambahan yang dirancang untuk alur kerja yang dimigrasikan dari Cromwell. Ini mendukung arahan pelanggan Cromwell dan beberapa logika non-kesesuaian.

[WDL lunak mendukung konversi tipe untuk item berikut dalam daftar pengecualian terbatas WDL:](https://github.com/openwdl/wdl/blob/wdl-1.1/SPEC.md#-limited-exceptions)
+ Mengapung ke Int, di mana paksaan tidak menghasilkan kehilangan presisi (seperti 1.0 peta ke 1).
+ String to Int/Float, di mana paksaan menghasilkan tidak ada kehilangan presisi.
+ Petakan [W, X] ke Array [Pair [Y, Z]], dalam kasus di mana W dapat dipaksakan ke Y dan X dapat dipaksakan ke Z.
+ Array [Pasangkan [W, X]] ke Peta [Y, Z], dalam kasus di mana W dapat dipaksakan ke Y dan X dapat dipaksakan ke Z (seperti 1,0 peta ke 1).

Untuk menggunakan casting tipe implisit, tentukan mesin alur kerja sebagai WDL\_LENIENT saat Anda membuat alur kerja atau versi alur kerja.

Di konsol, parameter mesin alur kerja diberi nama **Bahasa**. Di API, parameter workflow engine diberi nama **engine**. Untuk informasi selengkapnya, lihat [Buat alur kerja pribadi](create-private-workflow.md) atau [Buat versi alur kerja](workflows-version-create.md).

## Definisi namespace di input.json
<a name="workflow-wdl-namespace-defn"></a>

HealthOmics mendukung variabel yang sepenuhnya memenuhi syarat di input.json. Misalnya, jika Anda mendeklarasikan dua variabel input bernama number1 dan number2 dalam alur kerja: **SumWorkflow**

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

 Anda dapat menggunakannya sebagai variabel yang sepenuhnya memenuhi syarat di input.json: 

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

## Tipe primitif di WDL
<a name="workflow-wdl-primitive-types"></a>

Tabel berikut menunjukkan bagaimana input dalam peta WDL ke tipe primitif yang cocok. HealthOmics menyediakan dukungan terbatas untuk pemaksaan tipe, jadi sebaiknya Anda menyetel tipe eksplisit. 


**Jenis primitif**  

| Jenis WDL | Jenis JSON | Contoh WDL | Contoh kunci dan nilai JSON | Catatan | 
| --- | --- | --- | --- | --- | 
| Boolean | boolean | Boolean b | "b": true | Nilainya harus huruf kecil dan tidak dikutip. | 
| Int | integer | Int i | "i": 7 | Harus tidak dikutip. | 
| Float | number | Float f | "f": 42.2 | Harus tidak dikutip. | 
| String | string | String s | "s": "characters" | String JSON yang merupakan URI harus dipetakan ke file WDL untuk diimpor. | 
| File | string | File f | "f": "s3://amzn-s3-demo-bucket1/path/to/file" | Amazon S3 dan URI HealthOmics penyimpanan diimpor selama peran IAM yang disediakan untuk alur kerja memiliki akses baca ke objek ini. Tidak ada skema URI lain yang didukung (sepertifile://,https://, danftp://). URI harus menentukan objek. Itu tidak bisa menjadi direktori yang berarti tidak dapat diakhiri dengan/. | 
| Directory | string | Directory d | "d": "s3://bucket/path/" | DirectoryJenis ini tidak termasuk dalam WDL 1.0 atau 1.1, jadi Anda harus menambahkan version development ke header file WDL. URI harus berupa URI Amazon S3 dan dengan awalan yang diakhiri dengan '/'. Semua isi direktori akan disalin secara rekursif ke alur kerja sebagai unduhan tunggal. DirectorySeharusnya hanya berisi file yang terkait dengan alur kerja. | 

## Jenis kompleks di WDL
<a name="workflow-wdl-complex-types"></a>

Tabel berikut menunjukkan bagaimana input dalam peta WDL untuk jenis JSON kompleks yang cocok. Tipe kompleks dalam WDL adalah struktur data yang terdiri dari tipe primitif. Struktur data seperti daftar akan dikonversi ke array.


**Jenis kompleks**  

| Jenis WDL | Jenis JSON | Contoh WDL | Contoh kunci dan nilai JSON | Catatan | 
| --- | --- | --- | --- | --- | 
| Array | array | Array[Int] nums | “nums": [1, 2, 3] | Anggota array harus mengikuti format tipe array WDL. | 
| Pair | object | Pair[String, Int] str\_to\_i | “str\_to\_i": {"left": "0", "right": 1} | Setiap nilai pasangan harus menggunakan format JSON dari jenis WDL yang cocok. Nama kunci string dalam representasi WDL Pair JSON dicocokkan secara case-insensitive. Misalnya, {"left”: “0", “right”: 1} dan {"LEFT”: “0", “Right”: 1} diperlakukan sebagai setara saat deserialisasi menjadi tipe Pair. | 
| Map | object | Map[Int, String] int\_to\_string | "int\_to\_string": { 2: "hello", 1: "goodbye" } | Setiap entri di peta harus menggunakan format JSON dari jenis WDL yang cocok. | 
| 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>  | Nama-nama anggota struct harus sama persis dengan nama-nama kunci objek JSON. Setiap nilai harus menggunakan format JSON dari jenis WDL yang cocok. | 
| Object | N/A | N/A | N/A | ObjectJenis WDL sudah usang dan harus diganti dengan Struct dalam semua kasus. | 

## Arahan di WDL
<a name="workflow-wdl-directives"></a>

HealthOmics mendukung arahan berikut di semua versi WDL yang mendukung. HealthOmics 

### Konfigurasikan sumber daya GPU
<a name="workflow-wdl-directive-gpu"></a>

HealthOmics mendukung atribut runtime **acceleratorType** dan **acceleratorCount** dengan semua instance [GPU](https://docs.aws.amazon.com/omics/latest/dev/task-accelerators.html) yang didukung. HealthOmics juga mendukung alias bernama **gpuType** dan**gpuCount**, yang memiliki fungsi yang sama dengan rekan-rekan akselerator mereka. Jika definisi WDL berisi kedua arahan, HealthOmics gunakan nilai akselerator.

Contoh berikut menunjukkan cara menggunakan arahan ini:

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

### Konfigurasikan coba lagi tugas untuk kesalahan layanan
<a name="workflow-wdl-task-retry"></a>

HealthOmics mendukung hingga dua percobaan ulang untuk tugas yang gagal karena kesalahan layanan (kode status HTTP 5XX). Anda dapat mengonfigurasi jumlah maksimum percobaan ulang (1 atau 2) dan Anda dapat memilih keluar dari percobaan ulang untuk kesalahan layanan. Secara default, HealthOmics mencoba maksimal dua percobaan ulang. 

Contoh berikut ditetapkan `preemptible` untuk memilih keluar dari percobaan ulang untuk kesalahan layanan:

```
{
  preemptible: 0 
}
```

Untuk informasi selengkapnya tentang percobaan ulang tugas HealthOmics, lihat[Tugas Mencoba Ulang](monitoring-runs.md#run-status-task-retries).

### Konfigurasikan tugas coba lagi untuk kehabisan memori
<a name="workflow-wdl-retries"></a>

HealthOmics mendukung percobaan ulang untuk tugas yang gagal karena kehabisan memori (kode keluar wadah 137, kode status HTTP 4XX). HealthOmics menggandakan jumlah memori untuk setiap upaya coba lagi.

Secara default, HealthOmics tidak mencoba lagi untuk jenis kegagalan ini. Gunakan `maxRetries` arahan untuk menentukan jumlah maksimum percobaan ulang.

Contoh berikut ditetapkan `maxRetries` ke 3, sehingga HealthOmics upaya maksimal empat upaya untuk menyelesaikan tugas (upaya awal ditambah tiga percobaan ulang):

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

**catatan**  
Coba lagi tugas untuk kehabisan memori membutuhkan GNU findutils 4.2.3\+. Wadah HealthOmics gambar default menyertakan paket ini. Jika Anda menentukan gambar kustom dalam definisi WDL Anda, pastikan bahwa gambar tersebut menyertakan GNU findutils 4.2.3\+.

### Konfigurasikan kode pengembalian
<a name="workflow-wdl-directive-returnCodes"></a>

Atribut **ReturnCodes** menyediakan mekanisme untuk menentukan kode pengembalian, atau satu set kode pengembalian, yang menunjukkan keberhasilan pelaksanaan tugas. Mesin WDL menghormati kode pengembalian yang Anda tentukan di bagian **runtime** definisi WDL, dan menetapkan status tugas yang sesuai. 

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

HealthOmics juga mendukung alias bernama **continue OnReturnCode**, yang memiliki kemampuan yang sama dengan **ReturnCodes**. Jika Anda menentukan kedua atribut, HealthOmics menggunakan nilai **ReturnCodes**.

## Metadata tugas di WDL
<a name="workflow-wdl-task-metadata"></a>

HealthOmics mendukung opsi metadata berikut untuk tugas WDL.

### Nonaktifkan caching tingkat tugas dengan atribut volatile
<a name="workflow-wdl-volatile-attribute"></a>

Atribut **volatile** memungkinkan Anda untuk menonaktifkan caching panggilan untuk tugas-tugas tertentu dalam alur kerja WDL Anda. Ketika tugas ditandai sebagai volatile, itu akan selalu mengeksekusi dan tidak pernah menggunakan hasil cache, bahkan ketika caching diaktifkan untuk dijalankan.

Tambahkan atribut **volatile** ke bagian **meta** definisi tugas Anda:

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

## Contoh definisi alur kerja WDL
<a name="wdl-example"></a>

Contoh berikut menunjukkan definisi alur kerja pribadi untuk mengkonversi dari `CRAM` ke `BAM` dalam WDL. `BAM`Alur kerja `CRAM` to mendefinisikan dua tugas dan menggunakan alat dari `genomes-in-the-cloud` wadah, yang ditampilkan dalam contoh dan tersedia untuk umum. 

Contoh berikut menunjukkan cara menyertakan wadah Amazon ECR sebagai parameter. Ini memungkinkan HealthOmics untuk memverifikasi izin akses ke penampung Anda sebelum memulai menjalankan proses.

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

Contoh berikut menunjukkan cara menentukan file mana yang akan digunakan dalam proses Anda, saat file berada di bucket 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"
}
```

Jika Anda ingin menentukan file dari toko urutan, tunjukkan bahwa seperti yang ditunjukkan dalam contoh berikut, menggunakan URI untuk penyimpanan urutan.

```
{
    "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"
}
```

Anda kemudian dapat menentukan alur kerja Anda di WDL seperti yang ditunjukkan pada contoh berikut. 

```
 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}"
    }
}
```