

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Especificidades da definição do fluxo de trabalho da WDL
<a name="workflow-languages-wdl"></a>

Os tópicos a seguir fornecem detalhes sobre os tipos e diretivas disponíveis para as definições de fluxo de trabalho da WDL em. HealthOmics

**Topics**
+ [Conversão de tipo implícita em WDL leniente](#workflow-wdl-type-conversion)
+ [Definição de namespace em input.json](#workflow-wdl-namespace-defn)
+ [Tipos primitivos na Biblioteca Digital Mundial](#workflow-wdl-primitive-types)
+ [Tipos complexos em WDL](#workflow-wdl-complex-types)
+ [Diretivas na Biblioteca Digital Mundial](#workflow-wdl-directives)
+ [Metadados de tarefas na WDL](#workflow-wdl-task-metadata)
+ [Exemplo de definição de fluxo de trabalho WDL](#wdl-example)

## Conversão de tipo implícita em WDL leniente
<a name="workflow-wdl-type-conversion"></a>

HealthOmics oferece suporte à conversão de tipo implícita no arquivo input.json e na definição do fluxo de trabalho. Para usar a conversão de tipo implícita, especifique o mecanismo de fluxo de trabalho como tolerante à WDL ao criar o fluxo de trabalho. O WDL lenient inclui todos os recursos padrão da WDL, além de comportamentos adicionais de compatibilidade projetados para fluxos de trabalho migrados da Cromwell. Ele suporta as diretivas Cromwell do cliente e algumas lógicas não conformes.

[A WDL lenient suporta a conversão de tipos para os seguintes itens na lista de exceções limitadas da WDL:](https://github.com/openwdl/wdl/blob/wdl-1.1/SPEC.md#-limited-exceptions)
+ Flutue até Int, onde a coerção não resulta em perda de precisão (como 1,0 mapeia para 1).
+ String to Int/Float, onde a coerção não resulta em perda de precisão.
+ Mapeie [W, X] para Array [Pair [Y, Z]], no caso em que W é coercível para Y e X é coercível para Z.
+ Array [Pair [W, X]] para Map [Y, Z], no caso em que W é coercível para Y e X é coercível para Z (como 1,0 mapas para 1).

Para usar a conversão de tipo implícita, especifique o mecanismo do fluxo de trabalho como WDL\_LENIENT ao criar o fluxo de trabalho ou a versão do fluxo de trabalho.

No console, o parâmetro do mecanismo de fluxo de trabalho é chamado de **Idioma**. Na API, o parâmetro do mecanismo de fluxo de trabalho é chamado de **mecanismo**. Para acessar mais informações, consulte [Crie um fluxo de trabalho privado](create-private-workflow.md) ou [Crie uma versão do fluxo de trabalho](workflows-version-create.md).

## Definição de namespace em input.json
<a name="workflow-wdl-namespace-defn"></a>

HealthOmics suporta variáveis totalmente qualificadas em input.json. Por exemplo, se você declarar duas variáveis de entrada chamadas número1 e número2 no fluxo de trabalho: **SumWorkflow**

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

 Você pode usá-las como variáveis totalmente qualificadas em input.json: 

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

## Tipos primitivos na Biblioteca Digital Mundial
<a name="workflow-wdl-primitive-types"></a>

A tabela a seguir mostra como as entradas na WDL são mapeadas para os tipos primitivos correspondentes. HealthOmics fornece suporte limitado para coerção de tipo, por isso recomendamos que você defina tipos explícitos. 


**Tipos primitivos**  

| Tipo WDL | Tipo JSON | Exemplo de WDL | Exemplo de chave e valor JSON | Observações | 
| --- | --- | --- | --- | --- | 
| Boolean | boolean | Boolean b | "b": true | O valor deve estar em minúsculas e sem aspas. | 
| Int | integer | Int i | "i": 7 | Não deve ser citado. | 
| Float | number | Float f | "f": 42.2 | Não deve ser citado. | 
| String | string | String s | "s": "characters" | As cadeias de caracteres JSON que são um URI devem ser mapeadas para um arquivo WDL para serem importadas. | 
| File | string | File f | "f": "s3://amzn-s3-demo-bucket1/path/to/file" | O Amazon S3 e os URIs HealthOmics de armazenamento são importados, desde que a função do IAM fornecida para o fluxo de trabalho tenha acesso de leitura a esses objetos. Nenhum outro esquema de URI é suportado (como file://https://, eftp://). O URI deve especificar um objeto. Não pode ser um diretório, o que significa que não pode terminar com / a. | 
| Directory | string | Directory d | "d": "s3://bucket/path/" | O Directory tipo não está incluído na WDL 1.0 ou 1.1, então você precisará version development adicioná-lo ao cabeçalho do arquivo WDL. O URI deve ser um URI do Amazon S3 e com um prefixo que termine com '/'. Todo o conteúdo do diretório será copiado recursivamente para o fluxo de trabalho como um único download. O Directory deve conter somente arquivos relacionados ao fluxo de trabalho. | 

## Tipos complexos em WDL
<a name="workflow-wdl-complex-types"></a>

A tabela a seguir mostra como as entradas na WDL são mapeadas para os tipos JSON complexos correspondentes. Os tipos complexos na Biblioteca Digital Mundial são estruturas de dados compostas por tipos primitivos. Estruturas de dados, como listas, serão convertidas em matrizes.


**Tipos complexos**  

| Tipo WDL | Tipo JSON | Exemplo de WDL | Exemplo de chave e valor JSON | Observações | 
| --- | --- | --- | --- | --- | 
| Array | array | Array[Int] nums | “nums": [1, 2, 3] | Os membros da matriz devem seguir o formato do tipo de matriz WDL. | 
| Pair | object | Pair[String, Int] str\_to\_i | “str\_to\_i": {"left": "0", "right": 1} | Cada valor do par deve usar o formato JSON do tipo WDL correspondente. Os nomes das chaves de string nas representações JSON do par WDL são comparados sem distinção entre maiúsculas e minúsculas. Por exemplo, {"left”: “0", “right”: 1} e {"LEFT”: “0", “Right”: 1} são tratados como equivalentes ao desserializar em um tipo de par. | 
| Map | object | Map[Int, String] int\_to\_string | "int\_to\_string": { 2: "hello", 1: "goodbye" } | Cada entrada no mapa deve usar o formato JSON de seu tipo WDL correspondente. | 
| 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>  | Os nomes dos membros da estrutura devem corresponder exatamente aos nomes das chaves do objeto JSON. Cada valor deve usar o formato JSON do tipo de WDL correspondente. | 
| Object | N/A | N/A | N/A | O Object tipo WDL está desatualizado e deve ser substituído por Struct em todos os casos. | 

## Diretivas na Biblioteca Digital Mundial
<a name="workflow-wdl-directives"></a>

HealthOmics suporta as seguintes diretivas em todas as versões da WDL que HealthOmics oferecem suporte.

### Configurar recursos de GPU
<a name="workflow-wdl-directive-gpu"></a>

HealthOmics suporta atributos de tempo de execução **acceleratorType** e **acceleratorCount** com todas as [instâncias de GPU](https://docs.aws.amazon.com/omics/latest/dev/task-accelerators.html) compatíveis. HealthOmics também oferece suporte a aliases chamados **gpuType** e**gpuCount**, que têm a mesma funcionalidade de seus equivalentes aceleradores. Se a definição da WDL contiver as duas diretivas, HealthOmics use os valores do acelerador.

O exemplo a seguir mostra como usar essas diretivas:

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

### Configurar a repetição de tarefas para erros de serviço
<a name="workflow-wdl-task-retry"></a>

HealthOmics suporta até duas tentativas para uma tarefa que falhou devido a erros de serviço (códigos de status HTTP 5XX). Você pode configurar o número máximo de novas tentativas (1 ou 2) e pode optar por não participar de novas tentativas por erros de serviço. Por padrão, HealthOmics tenta no máximo duas tentativas. 

O exemplo a seguir define `preemptible` a opção de não aceitar novas tentativas por erros de serviço:

```
{
  preemptible: 0 
}
```

Para obter mais informações sobre novas tentativas de tarefas em HealthOmics, consulte[Tentativas de tarefas](monitoring-runs.md#run-status-task-retries).

### Configurar a repetição da tarefa para falta de memória
<a name="workflow-wdl-retries"></a>

HealthOmics suporta novas tentativas para uma tarefa que falhou porque ficou sem memória (código de saída do contêiner 137, código de status HTTP 4XX). HealthOmics dobra a quantidade de memória para cada tentativa de repetição.

Por padrão, HealthOmics não tenta novamente para esse tipo de falha. Use a `maxRetries` diretiva para especificar o número máximo de novas tentativas.

O exemplo a seguir é definido `maxRetries` como 3, de modo que HealthOmics tente no máximo quatro tentativas para concluir a tarefa (a tentativa inicial mais três tentativas):

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

**nota**  
A repetição da tarefa em caso de falta de memória requer o GNU findutils 4.2.3\+. O contêiner de HealthOmics imagem padrão inclui esse pacote. Se você especificar uma imagem personalizada em sua definição de WDL, certifique-se de que a imagem inclua GNU findutils 4.2.3\+.

### Configurar códigos de devolução
<a name="workflow-wdl-directive-returnCodes"></a>

O atributo **returnCodes** fornece um mecanismo para especificar um código de retorno, ou um conjunto de códigos de retorno, que indica a execução bem-sucedida de uma tarefa. O mecanismo da WDL respeita os códigos de retorno que você especifica na seção de tempo de **execução** da definição da WDL e define o status das tarefas adequadamente. 

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

HealthOmics também oferece suporte a um alias chamado **continue OnReturnCode**, que tem os mesmos recursos de **ReturnCodes**. Se você especificar os dois atributos, HealthOmics usa o valor **ReturnCodes**.

## Metadados de tarefas na WDL
<a name="workflow-wdl-task-metadata"></a>

HealthOmics suporta as seguintes opções de metadados para tarefas de WDL.

### Desative o armazenamento em cache no nível da tarefa com o atributo volatile
<a name="workflow-wdl-volatile-attribute"></a>

O atributo **volatile** permite que você desabilite o cache de chamadas para tarefas específicas em seu fluxo de trabalho da WDL. Quando uma tarefa é marcada como volátil, ela sempre será executada e nunca usará resultados em cache, mesmo quando o cache estiver habilitado para execução.

Adicione o atributo **volatile** à seção **meta** da definição de sua tarefa:

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

## Exemplo de definição de fluxo de trabalho WDL
<a name="wdl-example"></a>

Os exemplos a seguir mostram definições de fluxo de trabalho privadas para conversão de `CRAM` para `BAM` em WDL. O `BAM` fluxo de trabalho `CRAM` to define duas tarefas e usa ferramentas do `genomes-in-the-cloud` contêiner, que são mostradas no exemplo e estão disponíveis publicamente. 

O exemplo a seguir mostra como incluir o contêiner Amazon ECR como parâmetro. Isso permite HealthOmics verificar as permissões de acesso ao seu contêiner antes que ele inicie a execução.

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

O exemplo a seguir mostra como especificar quais arquivos usar em sua execução, quando os arquivos estão em um bucket do 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"
}
```

Se você quiser especificar arquivos de um armazenamento de sequência, indique isso conforme mostrado no exemplo a seguir, usando o URI para o armazenamento de sequência.

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

Em seguida, você pode definir seu fluxo de trabalho na WDL, conforme mostrado no exemplo a seguir. 

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