

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# File di definizione del flusso di lavoro in HealthOmics
<a name="workflow-definition-files"></a>

Si utilizza una definizione del flusso di lavoro per specificare informazioni sul flusso di lavoro, sulle esecuzioni e sulle attività in corso. Le definizioni del flusso di lavoro vengono create in uno o più file utilizzando un linguaggio di definizione del flusso di lavoro. HealthOmics supporta le definizioni dei flussi di lavoro scritte in WDL, Nextflow o CWL. 

HealthOmics supporta le seguenti scelte per le definizioni dei flussi di lavoro WDL: 
+ WDL — Fornisce un motore WDL conforme alle specifiche. 
+ WDL lenient: progettato per gestire i flussi di lavoro migrati da Cromwell. Supporta le direttive Cromwell dei clienti e alcune logiche non conformi. Per informazioni dettagliate, vedi [Conversione implicita dei tipi in WDL lenient](workflow-languages-wdl.md#workflow-wdl-type-conversion).

Per informazioni su ciascuna delle lingue del flusso di lavoro, consulta le sezioni dettagliate specifiche della lingua di seguito.

Nella definizione del flusso di lavoro si specificano i seguenti tipi di informazioni:
+ **Language version**— La lingua e la versione della definizione del flusso di lavoro.
+ **Compute and memory**— I requisiti di calcolo e memoria per le attività del flusso di lavoro.
+ **Inputs**— Ubicazione degli input per le attività del flusso di lavoro. Per ulteriori informazioni, consulta [HealthOmics input di esecuzione](workflows-run-inputs.md).
+ **Outputs**— Posizione in cui salvare gli output generati dalle attività.
+ **Task resources**— Requisiti di calcolo e memoria per ogni attività.
+ **Accelerators**— altre risorse richieste dalle attività, come gli acceleratori.

**Topics**
+ [HealthOmics requisiti di definizione del flusso di lavoro](workflow-defn-requirements.md)
+ [Supporto della versione per i linguaggi HealthOmics di definizione del flusso di lavoro](workflows-lang-versions.md)
+ [Requisiti di calcolo e memoria per le attività HealthOmics](memory-and-compute-tasks.md)
+ [Risultati delle attività in una definizione di HealthOmics flusso di lavoro](workflows-task-outputs.md)
+ [Le risorse delle attività in una definizione di HealthOmics flusso di lavoro](task-resources.md)
+ [Acceleratori di attività in una definizione di workflow HealthOmics](task-accelerators.md)
+ [Specifiche della definizione del flusso di lavoro WDL](workflow-languages-wdl.md)
+ [Specifiche della definizione del flusso di lavoro Nextflow](workflow-definition-nextflow.md)
+ [Specifiche della definizione del flusso di lavoro CWL](workflow-languages-cwl.md)
+ [Esempi di definizioni del flusso di lavoro](workflow-definition-examples.md)

# HealthOmics requisiti di definizione del flusso di lavoro
<a name="workflow-defn-requirements"></a>

I file HealthOmics di definizione del flusso di lavoro devono soddisfare i seguenti requisiti:
+ Le attività devono definire input/output parametri, repository di contenitori Amazon ECR e specifiche di runtime come l'allocazione della memoria o della CPU.
+ Verifica che i tuoi ruoli IAM dispongano delle autorizzazioni richieste.<a name="lower"></a>
  + Il tuo flusso di lavoro ha accesso ai dati di input provenienti da AWS risorse, come Amazon S3. 
  + Il tuo flusso di lavoro ha accesso a servizi di repository esterni quando necessario.
+ Dichiara i file di output nella definizione del flusso di lavoro. Per copiare i file di esecuzione intermedi nella posizione di output, dichiarateli come output del flusso di lavoro. 
+ Le posizioni di input e output devono trovarsi nella stessa regione del flusso di lavoro. 
+ HealthOmics gli input del flusso di lavoro di archiviazione devono essere in `ACTIVE` stato. HealthOmics non importerà input con uno `ARCHIVED` stato, causando il fallimento del flusso di lavoro. Per informazioni sugli input degli oggetti Amazon S3, consulta. [HealthOmics input di esecuzione](workflows-run-inputs.md)
+ La **main** posizione del flusso di lavoro è facoltativa se l'archivio ZIP contiene una singola definizione di flusso di lavoro o un file denominato «principale».<a name="lower"></a>
  + Percorso di esempio: `workflow-definition/main-file.wdl`
+ Prima di creare un flusso di lavoro da Amazon S3 o dall'unità locale, crea un archivio zip dei file di definizione del flusso di lavoro e di eventuali dipendenze, come i flussi di lavoro secondari.
+ Ti consigliamo di dichiarare i contenitori Amazon ECR nel flusso di lavoro come parametri di input per la convalida delle autorizzazioni Amazon ECR. 

Considerazioni aggiuntive su Nextflow:
+ **/bin**

  Le definizioni del flusso di lavoro Nextflow possono includere una cartella /bin con script eseguibili. Questo percorso ha accesso alle attività in sola lettura ed eseguibile. Le attività che si basano su questi script devono utilizzare un contenitore creato con gli interpreti di script appropriati. La migliore pratica consiste nel chiamare direttamente l'interprete. Esempio:

  ```
  process my_bin_task {
     ...
     script:
        """
        python3 my_python_script.py
        """
  }
  ```
+ **includeConfig**

  Le definizioni dei flussi di lavoro basate su NextFlow possono includere file nextflow.config che aiutano ad astrarre le definizioni dei parametri o i profili delle risorse di processo. Per supportare lo sviluppo e l'esecuzione di pipeline Nextflow su più ambienti, utilizza una configurazione HealthOmics specifica da aggiungere alla configurazione globale utilizzando la direttiva IncludeConfig. Per mantenere la portabilità, configura il flusso di lavoro in modo che includa il file solo durante l'esecuzione utilizzando il codice seguente: HealthOmics 

  ```
  // at the end of the nextflow.config file
  if ("$AWS_WORKFLOW_RUN") {
      includeConfig 'conf/omics.config'
  }
  ```
+ **Reports**

  HealthOmics non supporta i report dag, trace ed esecuzione generati dal motore. È possibile generare alternative ai report di traccia ed esecuzione utilizzando una combinazione di GetRun chiamate API. GetRunTask 

Considerazioni aggiuntive sulla CWL:
+ **Container image uri interpolation**

  HealthOmics consente alla proprietà DockerPull di essere un'espressione DockerRequirement javascript in linea. Esempio:

  ```
  requirements:
    DockerRequirement:
      dockerPull: "$(inputs.container_image)"
  ```

  Ciò consente di specificare l'immagine del contenitore URIs come parametri di input per il flusso di lavoro.
+ **Javascript expressions**

  Le espressioni Javascript devono essere `strict mode` conformi.
+ **Operation process**

  HealthOmics non supporta i processi operativi CWL.

# Supporto della versione per i linguaggi HealthOmics di definizione del flusso di lavoro
<a name="workflows-lang-versions"></a>

HealthOmics supporta file di definizione del flusso di lavoro scritti in Nextflow, WDL o CWL. Le seguenti sezioni forniscono informazioni sul supporto delle HealthOmics versioni per queste lingue.

**Topics**
+ [Supporto della versione WDL](#workflows-lang-versions-WDL)
+ [Supporto per la versione CWL](#workflows-lang-versions-CWL)
+ [Supporto per la versione Nextflow](#workflows-lang-versions-nextflow)

## Supporto della versione WDL
<a name="workflows-lang-versions-WDL"></a>

HealthOmics supporta le versioni 1.0, 1.1 e la versione di sviluppo della specifica WDL.

Ogni documento WDL deve includere una dichiarazione di versione per specificare a quale versione (principale e secondaria) della specifica a cui aderisce. [Per ulteriori informazioni sulle versioni, vedere WDL versioning](https://github.com/openwdl/wdl/blob/wdl-1.1/SPEC.md#versioning)

Le versioni 1.0 e 1.1 della specifica WDL non supportano questo tipo. `Directory` Per utilizzare il `Directory` tipo per input o output, impostate la versione su **development** nella prima riga del file:

```
version development  # first line of .wdl file
     ... remainder of the file ...
```

## Supporto per la versione CWL
<a name="workflows-lang-versions-CWL"></a>

HealthOmics supporta le versioni 1.0, 1.1 e 1.2 del linguaggio CWL.

È possibile specificare la versione della lingua nel file di definizione del flusso di lavoro CWL. Per ulteriori informazioni su CWL, consultate la guida per l'utente di [CWL](https://github.com/common-workflow-language/user_guide)

## Supporto per la versione Nextflow
<a name="workflows-lang-versions-nextflow"></a>

HealthOmics supporta quattro versioni stabili di Nextflow. Nextflow rilascia in genere una versione stabile ogni sei mesi. HealthOmics non supporta le versioni mensili «edge».

HealthOmics supporta le funzionalità rilasciate in ogni versione, ma non le funzionalità di anteprima.

### Versioni supportate
<a name="workflows-versions-nextflow-list"></a>

HealthOmics supporta le seguenti versioni di Nextflow:
+ Nextflow v22.04.01 DSL 1 e DSL 2
+ Nextflow v23.10.0 DSL 2 (impostazione predefinita)
+ Nextflow versione 24.10.8 DSL 2
+ Nextflow v25.10.0 DSL 2

**Nota**  
HealthOmics non supporta la modalità di sintassi rigorosa in Nextflow v25.10.0.

[Per migrare il flusso di lavoro all'ultima versione supportata (v25.10.0), segui la guida all'aggiornamento di Nextflow.](https://www.nextflow.io/docs/latest/migrations/25-10.html)

Ci sono alcune modifiche sostanziali durante la migrazione a Nextflow v24 e v25. [Segui la guida alla migrazione di Nextflow.](https://www.nextflow.io/docs/latest/migrations/index.html)

### Rileva ed elabora le versioni di Nextflow
<a name="workflows-versions-processing"></a>

HealthOmics rileva la versione DSL e la versione di Nextflow specificate. Determina automaticamente la migliore versione di Nextflow da eseguire in base a questi input.

#### Versione DSL
<a name="workflows-versions-p1"></a>

HealthOmics rileva la versione DSL richiesta nel file di definizione del flusso di lavoro. Ad esempio, puoi specificare:. `nextflow.enable.dsl=2`

HealthOmics supporta DSL 2 per impostazione predefinita. Fornisce la retrocompatibilità con DSL 1, se specificato nel file di definizione del flusso di lavoro.
+ Se si specifica DSL 1, HealthOmics esegue Nextflow v22.04 DSL1 (l'unica versione supportata che esegue DSL 1).
+ Se non specifichi una versione DSL o se non HealthOmics riesci ad analizzare le informazioni DSL per qualsiasi motivo (ad esempio errori di sintassi nel file di definizione del flusso di lavoro), il valore predefinito è DSL 2 ed esegue Nextflow v23.10.0. HealthOmics 
+ [Per aggiornare il flusso di lavoro da DSL 1 a DSL 2 per sfruttare le versioni e le funzionalità software più recenti di Nextflow, consulta Migrazione da DSL 1.](https://nextflow.io/docs/latest/dsl1.html)

#### Versioni Nextflow
<a name="workflows-versions-p2"></a>

HealthOmics rileva la versione di Nextflow richiesta nel file di configurazione di Nextflow (nextflow.config), se fornisci questo file. Ti consigliamo di aggiungere la `nextflowVersion` clausola alla fine del file per evitare sostituzioni impreviste delle configurazioni incluse. [Per ulteriori informazioni, consulta la configurazione di Nextflow.](https://nextflow.io/docs/latest/config.html)

Puoi specificare una versione di Nextflow o un intervallo di versioni utilizzando la seguente sintassi:

```
   // exact match
   manifest.nextflowVersion = '1.2.3'   
            
   // 1.2 or later (excluding 2 and later)
   manifest.nextflowVersion = '1.2+'         
            
   // 1.2 or later
   manifest.nextflowVersion = '>=1.2'
            
   // any version in the range 1.2 to 1.5
   manifest.nextflowVersion = '>=1.2, <=1.5' 
            
   // use the "!" prefix to stop execution if the current version 
   // doesn't match the required version.
   manifest.nextflowVersion = '!>=1.2'
```

HealthOmics elabora le informazioni sulla versione di Nextflow come segue: 
+ Se si utilizza **=** per specificare una versione esatta che HealthOmics supporta, HealthOmics utilizza quella versione. 
+ Se si utilizza **\$1** per specificare una versione esatta o un intervallo di versioni non supportate, HealthOmics genera un'eccezione e fallisce l'esecuzione. Prendi in considerazione l'utilizzo di questa opzione se desideri essere rigoroso con le richieste di versione e fallire rapidamente se la richiesta include versioni non supportate.
+ Se specificate un intervallo di versioni, HealthOmics utilizza la versione con la preferenza più alta in quell'intervallo. L'ordine di preferenza dal più alto al più basso è v23.10.0, v22.04.0, v24.10.8 e v25.10.0. Esempio:
  + Se l'intervallo copre v23.10.0, v24.10.8 e v25.10.0, sceglie v23.10.0. HealthOmics 
  + Se l'intervallo copre v24.10.8 HealthOmics e v25.10.0, sceglie v24.10.8.
+ Se non esiste una versione richiesta o se le versioni richieste non sono valide o non possono essere analizzate per qualsiasi motivo:
  + Se hai specificato DSL 1, HealthOmics esegue Nextflow v22.04.
  + Altrimenti, esegue Nextflow v23.10.0. HealthOmics 

 Puoi recuperare le seguenti informazioni sulla versione di Nextflow utilizzata per ogni esecuzione: HealthOmics 
+ I log di esecuzione contengono informazioni sulla versione effettiva di Nextflow utilizzata per l'esecuzione. HealthOmics 
+ HealthOmics aggiunge avvisi nei log di esecuzione se non esiste una corrispondenza diretta con la versione richiesta o se è necessario utilizzare una versione diversa da quella specificata.
+ La risposta all'operazione **GetRun** API include un campo (`engineVersion`) con la versione effettiva di Nextflow HealthOmics utilizzata per l'esecuzione. Esempio:

  ```
  "engineVersion":"22.04.0"
  ```

# Requisiti di calcolo e memoria per le attività HealthOmics
<a name="memory-and-compute-tasks"></a>

HealthOmics esegue le attività private del flusso di lavoro in un'istanza omics. HealthOmics offre una varietà di tipi di istanze per soddisfare diversi tipi di attività. Ogni tipo di istanza ha una configurazione fissa di memoria e vCPU (e una configurazione GPU fissa per i tipi di istanze di elaborazione accelerata). Il costo dell'utilizzo di un'istanza omics varia a seconda del tipo di istanza. Per i dettagli, consulta la pagina [HealthOmics dei prezzi](https://aws.amazon.com/healthomics/pricing/).

Per le attività in un flusso di lavoro, si specifica la memoria richiesta e v CPUs nel file di definizione del flusso di lavoro. Quando viene eseguita un'operazione di workflow, HealthOmics alloca l'istanza omics più piccola che contiene la memoria richiesta e v. CPUs Ad esempio, se un'attività richiede 64 GiB di memoria e 8 vCPUs, HealthOmics seleziona. `omics.r.2xlarge`

Ti consigliamo di esaminare i tipi di istanza e di impostare la v CPUs e la dimensione di memoria richieste in modo che corrispondano all'istanza che meglio soddisfa le tue esigenze. Il contenitore delle attività utilizza il numero di v CPUs e la dimensione della memoria specificati nel file di definizione del flusso di lavoro, anche se il tipo di istanza dispone di v CPUs e memoria aggiuntivi. 

L'elenco seguente contiene informazioni aggiuntive su vCPU e allocazione della memoria:
+ Le allocazioni di risorse dei container sono limiti rigidi. Se un'attività esaurisce la memoria o tenta di utilizzare v aggiuntiviCPUs , l'attività genera un registro degli errori e viene chiusa.
+ Se non specifichi alcun requisito di calcolo o memoria, HealthOmics seleziona **omics.c.large** e imposta di default una configurazione con 1 vCPU e 1 GiB di memoria.
+ La configurazione minima che è possibile richiedere è 1 vCPU e 1 GiB di memoria. 
+ Se si specifica vCPUs, memory o GPUs che supera i tipi di istanza supportati, viene generato un messaggio di errore e il HealthOmics flusso di lavoro non viene convalidato
+ Se specificate unità frazionarie, HealthOmics arrotondate al numero intero più vicino.
+ HealthOmics riserva una piccola quantità di memoria (5%) per gli agenti di gestione e registrazione, pertanto l'allocazione completa della memoria potrebbe non essere sempre disponibile per l'applicazione coinvolta nell'operazione.
+ HealthOmics corrisponde ai tipi di istanza per soddisfare i requisiti di calcolo e memoria specificati e può utilizzare una combinazione di generazioni hardware. Per questo motivo, possono verificarsi alcune lievi variazioni nei tempi di esecuzione delle attività per la stessa attività.

Questi argomenti forniscono dettagli sui tipi di istanze HealthOmics supportati. 

**Topics**
+ [Tipi di istanze standard](#workflow-task-standard-instances)
+ [Istanze ottimizzate per il calcolo](#workflow-task-compute-optimized-instances)
+ [Istanze ottimizzate per la memoria](#workflow-task-memory-optimized-instances)
+ [Istanze di elaborazione accelerata](#workflow-task-accelerated-computing-instances)

**Nota**  
 Per le istanze standard, di calcolo e ottimizzate per la memoria, aumenta la dimensione della larghezza di banda dell'istanza se l'istanza richiede un throughput più elevato. Le istanze Amazon EC2 con meno di 16 vCPU (dimensioni 4xl e inferiori) possono subire un aumento del throughput. Per ulteriori informazioni sulla velocità effettiva delle istanze Amazon EC2, consulta Larghezza di banda disponibile delle istanze di [Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth).

## Tipi di istanze standard
<a name="workflow-task-standard-instances"></a>

Per i tipi di istanze standard, le configurazioni mirano a un equilibrio tra potenza di calcolo e memoria. 

HealthOmics supporta le istanze 32xlarge e 48xlarge in queste regioni: Stati Uniti occidentali (Oregon) e Stati Uniti orientali (Virginia settentrionale).


| Istanza | Numero di v CPUs | Memoria | 
| --- | --- | --- | 
| omics.m.large | 2 | 8 GiB | 
| omics.m.xlarge | 4 | 16 GiB | 
| omics.m.2xlarge | 8 | 32 GiB | 
| omics.m.4xlarge | 16 | 64 GiB | 
| omics.m.8xlarge | 32 | 128 GiB | 
| omics.m.12xlarge | 48 | 192 GiB | 
| omics.m.16xlarge | 64 | 256 GiB | 
| omics.m.24xlarge | 96 | 384 GiB | 
| omics.m.32xlarge | 128 | 512 GiB | 
| omics.m.48xlarge | 192 | 768 GiB | 

## Istanze ottimizzate per il calcolo
<a name="workflow-task-compute-optimized-instances"></a>

Per i tipi di istanza ottimizzati per l'elaborazione, le configurazioni offrono maggiore potenza di calcolo e meno memoria.

HealthOmics supporta le istanze 32xlarge e 48xlarge in queste regioni: Stati Uniti occidentali (Oregon) e Stati Uniti orientali (Virginia settentrionale).


| Istanza | Numero di v CPUs | Memoria | 
| --- | --- | --- | 
| omics.c.large | 2 | 4 GiB | 
| omics.c.xlarge | 4 | 8 GiB | 
| omics.c.2xlarge | 8 | 16 GiB | 
| omics.c.4xlarge | 16 | 32 GiB | 
| omics.c.8xlarge | 32 | 64 GiB | 
| omics.c.12xlarge | 48 | 96 GiB | 
| omics.c. 16 x large | 64 | 128 GiB | 
| omics.c.24xlarge | 96 | 192 GiB | 
| omics.c.32xlarge | 128 | 256 GiB | 
| omics.c.48xlarge | 192 | 384 GiB | 

## Istanze ottimizzate per la memoria
<a name="workflow-task-memory-optimized-instances"></a>

Per i tipi di istanza ottimizzati per la memoria, le configurazioni hanno meno potenza di calcolo e più memoria.

HealthOmics supporta le istanze 32xlarge e 48xlarge in queste regioni: Stati Uniti occidentali (Oregon) e Stati Uniti orientali (Virginia settentrionale).


| Istanza | Numero di v CPUs | Memoria | 
| --- | --- | --- | 
| omic s.r.large | 2 | 16 GiB | 
| omic s.r.xlarge | 4 | 32 GiB | 
| omic s.r.2xlarge | 8 | 64 GiB | 
| omic s.r.4 x grande | 16 | 128 GiB | 
| omic s.r.8xlarge | 32 | 256 GiB | 
| omic s.r.12 x grande | 48 | 384 GiB | 
| omics.r. 16 x grande | 64 | 512 GiB | 
| omic s.r.24xlarge | 96 | 768 GiB | 
| omic s.r.32xlarge | 128 | 1024 GiB | 
| Fomics.r. 48 x grande | 192 | 1536 GiB | 

## Istanze di elaborazione accelerata
<a name="workflow-task-accelerated-computing-instances"></a>

Facoltativamente, è possibile specificare risorse GPU per ogni attività in un flusso di lavoro, in modo da HealthOmics allocare un'istanza di elaborazione accelerata per l'attività. Per informazioni su come specificare le informazioni sulla GPU nel file di definizione del flusso di lavoro, vedere. [Acceleratori di attività in una definizione di workflow HealthOmics](task-accelerators.md)

Se si specifica un acceleratore di attività che supporta più tipi di istanza, HealthOmics seleziona il tipo di istanza in base alla disponibilità. Se sono disponibili più tipi di istanza, HealthOmics dà la preferenza all'istanza a basso costo. L'eccezione è rappresentata dal task accelerator nvidia-t4-a10g-l4 che dà la preferenza all'istanza di ultima generazione disponibile nella tua regione.

Le istanze G4 non sono supportate nella regione di Israele (Tel Aviv). Le istanze G5 non sono supportate nella regione Asia Pacifico (Singapore). 



**Topics**
+ [Tipi di istanze G6 e G6e](#workflow-task-accelerated-accelerated-g6)
+ [Istanze G4 e G5](#workflow-task-accelerated-accelerated-g45)

### Tipi di istanze G6 e G6e
<a name="workflow-task-accelerated-accelerated-g6"></a>

HealthOmics supporta le seguenti configurazioni di istanza di calcolo accelerato G6. Tutte le istanze omics.g6 utilizzano Nvidia L4. GPUs

HealthOmics supporta le istanze G6 e G6e in queste regioni: Stati Uniti occidentali (Oregon) e Stati Uniti orientali (Virginia settentrionale).


| Istanza | Numero di v CPUs | Memoria | Numero di GPUs | Memoria GPU | 
| --- | --- | --- | --- | --- | 
| omics.g6.xlarge | 4 | 16 GiB | 1 | 24 GiB | 
| omics.g6.2xlarge | 8 | 32 GiB | 1 | 24 GiB | 
| omics.g6.4xlarge | 16 | 64 GiB | 1 | 24 GiB | 
| omics.g6.8xlarge | 32 | 128 GiB | 1 | 24 GiB | 
| omics.g6.12xlarge | 48 | 192 GiB | 4 | 96 GiB | 
| omics.g6.16xlarge | 64 | 256 GiB | 1 | 24 GiB | 
| omics.g6.24xlarge | 96 | 384 GiB | 4 | 96 GiB | 

Tutte le istanze omics.g6e utilizzano Nvidia L40s. GPUs


| Istanza | Numero di v CPUs | Memoria | Numero di GPUs | Memoria GPU | 
| --- | --- | --- | --- | --- | 
| omics.g6e.xlarge | 4 | 32 GiB | 1 | 48 GiB | 
| omics.g6e.2xlarge | 8 | 64 GiB | 1 | 48 GiB | 
| omics.g6e.4xlarge | 16 | 128 GiB | 1 | 48 GiB | 
| omics.g6e.8xlarge | 32 | 256 GiB | 1 | 48 GiB | 
| omics.g6e.12xlarge | 48 | 384 GiB | 4 | 192 GiB | 
| omics.g6e.16xlarge | 64 | 512 GiB | 1 | 48 GiB | 
| omics.g6e.24xlarge | 96 | 768 GiB | 4 | 192 GiB | 

### Istanze G4 e G5
<a name="workflow-task-accelerated-accelerated-g45"></a>

HealthOmics supporta le seguenti configurazioni di istanze di calcolo accelerato G4 e G5. 

Tutte le istanze omics.g5 utilizzano Nvidia Tesla A10G. GPUs


| Istanza | Numero di v CPUs | Memoria | Numero di GPUs | Memoria GPU | 
| --- | --- | --- | --- | --- | 
| omics.g5.xlarge | 4 | 16 GiB | 1 | 24 GiB | 
| omics.g5.2xlarge | 8 | 32 GiB | 1 | 24 GiB | 
| omics.g5.4xlarge | 16 | 64 GiB | 1 | 24 GiB | 
| omics.g5.8xlarge | 32 | 128 GiB | 1 | 24 GiB | 
| omics.g5.12xlarge | 48 | 192 GiB | 4 | 96 GiB | 
| omics.g5.16xlarge | 64 | 256 GiB | 1 | 24 GiB | 
| omics.g5.24xlarge | 96 | 384 GiB | 4 | 96 GiB | 

Tutte le istanze omics.g4dn utilizzano Nvidia Tesla T4. GPUs


| Istanza | Numero di v CPUs | Memoria | Numero di GPUs | Memoria GPU | 
| --- | --- | --- | --- | --- | 
| omics.g4dn.xlarge | 4 | 16 GiB | 1 | 16 GiB | 
| omics.g4dn.2xlarge | 8 | 32 GiB | 1 | 16 GiB | 
| omics.g4dn.4xlarge | 16 | 64 GiB | 1 | 16 GiB | 
| omics.g4dn.8xlarge | 32 | 128 GiB | 1 | 16 GiB | 
| omics.g4dn.12xlarge | 48 | 192 GiB | 4 | 64 GiB | 
| omics.g4dn.16xlarge | 64 | 256 GiB | 1 | 24 GiB | 

# Risultati delle attività in una definizione di HealthOmics flusso di lavoro
<a name="workflows-task-outputs"></a>

Gli output delle attività vengono specificati nella definizione del flusso di lavoro. Per impostazione predefinita, HealthOmics elimina tutti i file di attività intermedi al termine del flusso di lavoro. Per esportare un file intermedio, lo si definisce come output. 

Se si utilizza la memorizzazione nella cache delle chiamate, HealthOmics salva gli output delle attività nella cache, inclusi tutti i file intermedi definiti come output.

I seguenti argomenti includono esempi di definizione delle attività per ciascuno dei linguaggi di definizione del flusso di lavoro.

**Topics**
+ [Output delle attività per WDL](#workflow-task-outputs-wdl)
+ [Output delle attività per Nextflow](#workflow-task-outputs-nextflow)
+ [Output delle attività per CWL](#workflow-task-outputs-cwl)

## Output delle attività per WDL
<a name="workflow-task-outputs-wdl"></a>

Per le definizioni dei flussi di lavoro scritte in WDL, definite i risultati nella sezione Workflow di primo livello. **outputs** 

HealthOmics

**Topics**
+ [Output delle attività per STDOUT](#task-outputs-wdl-stdout)
+ [Output dell'attività per STDERR](#task-outputs-wdl-stderr)
+ [Emissione dell'operazione in un file](#task-outputs-wdl-file)
+ [Emissione dell'operazione su una serie di file](#task-outputs-wdl-files)

### Output delle attività per STDOUT
<a name="task-outputs-wdl-stdout"></a>

Questo esempio crea un'attività denominata `SayHello` che riproduce il contenuto STDOUT nel file di output dell'operazione. **La **stdout** funzione WDL acquisisce il contenuto STDOUT (in questo esempio, la stringa di input Hello World\$1** ) nel file. **stdout\$1file** 

Poiché HealthOmics crea registri per tutto il contenuto STDOUT, l'output viene visualizzato anche in CloudWatch Logs, insieme ad altre informazioni di registrazione STDERR relative all'attività.

```
version 1.0
 workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File stdout_file = SayHello.stdout_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        echo "~{message}" 
        echo "Current date: $(date)"
        echo "This message was printed to STDOUT"
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File stdout_file = stdout()
    }
}
```

### Output dell'attività per STDERR
<a name="task-outputs-wdl-stderr"></a>

Questo esempio crea un'attività denominata `SayHello` che riproduce il contenuto STDERR del file di output dell'operazione. **La **stderr** funzione WDL acquisisce il contenuto STDERR (in questo esempio, la stringa di input Hello World\$1** ) nel file. **stderr\$1file** 

Poiché HealthOmics crea registri per tutto il contenuto STDERR, l'output verrà visualizzato in CloudWatch Logs, insieme ad altre informazioni di registrazione STDERR relative all'attività.

```
version 1.0
 workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File stderr_file = SayHello.stderr_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        echo "~{message}" >&2
        echo "Current date: $(date)" >&2
        echo "This message was printed to STDERR" >&2
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File stderr_file = stderr()
    }
}
```

### Emissione dell'operazione in un file
<a name="task-outputs-wdl-file"></a>

In questo esempio, l' SayHello attività crea due file (message.txt e info.txt) e li dichiara esplicitamente come output denominato (message\$1file e info\$1file). 

```
version 1.0
workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File message_file = SayHello.message_file
        File info_file = SayHello.info_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        # Create message file
        echo "~{message}" > message.txt
        
        # Create info file with date and additional information
        echo "Current date: $(date)" > info.txt
        echo "This message was saved to a file" >> info.txt
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File message_file = "message.txt"
        File info_file = "info.txt"
    } 
}
```

### Emissione dell'operazione su una serie di file
<a name="task-outputs-wdl-files"></a>

In questo esempio, l'`GenerateGreetings`attività genera una serie di file come output dell'operazione. L'operazione genera dinamicamente un file di saluto per ogni membro dell'array di input. `names` Poiché i nomi dei file non sono noti fino all'esecuzione, la definizione di output utilizza la funzione WDL glob () per generare tutti i file che corrispondono al modello. `*_greeting.txt` 

```
version 1.0
 workflow HelloArray {
    input {
        Array[String] names = ["World", "Friend", "Developer"]
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call GenerateGreetings {
        input:
            names = names,
            container = ubuntu_container
    }

    output {
        Array[File] greeting_files = GenerateGreetings.greeting_files
    }
}

task GenerateGreetings {
    input {
        Array[String] names
        String container
    }

    command  <<<
        # Create a greeting file for each name
        for name in ~{sep=" " names}; do
            echo "Hello, $name!" > ${name}_greeting.txt
        done
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        Array[File] greeting_files = glob("*_greeting.txt")
    }       
 }
```

## Output delle attività per Nextflow
<a name="workflow-task-outputs-nextflow"></a>

Per le definizioni dei flussi di lavoro scritte in Nextflow, definisci una direttiva **PublishDir** per esportare il contenuto delle attività nel tuo bucket Amazon S3 di output. **`/mnt/workflow/pubdir`Imposta** il valore PublishDir su. 

 HealthOmics Per esportare file in Amazon S3, i file devono trovarsi in questa directory.

Se un'operazione produce un gruppo di file di output da utilizzare come input per un'attività successiva, consigliamo di raggruppare questi file in una directory e di emettere la directory come output dell'attività. L'enumerazione di ogni singolo file può causare un collo di bottiglia di I/O nel file system sottostante. Per esempio:

```
process my_task {
      ...
      // recommended
      output "output-folder/", emit: output
      
      // not recommended
      // output "output-folder/**", emit: output
      ...
  }
```

## Output delle attività per CWL
<a name="workflow-task-outputs-cwl"></a>

Per le definizioni dei flussi di lavoro scritte in CWL, è possibile specificare gli output delle attività utilizzando le attività. `CommandLineTool` Le sezioni seguenti mostrano esempi di `CommandLineTool` attività che definiscono diversi tipi di output.

**Topics**
+ [Output delle attività per STDOUT](#task-outputs-cwl-stdout)
+ [Output dell'attività per STDERR](#task-outputs-cwl-stderr)
+ [Emissione dell'operazione in un file](#task-outputs-cwl-file)
+ [Esecuzione dell'operazione su una serie di file](#task-outputs-cwl-files)

### Output delle attività per STDOUT
<a name="task-outputs-cwl-stdout"></a>

Questo esempio crea un'`CommandLineTool`attività che riproduce il contenuto STDOUT in un file di output di testo denominato. **output.txt** **Ad esempio, se fornite il seguente input, l'output dell'attività risultante è Hello World\$1** nel **output.txt** file.

```
{
    "message": "Hello World!"
}
```

La `outputs` direttiva specifica che il nome dell'output è **example\$1out** e il suo tipo è`stdout`. Affinché un'attività a valle consumi l'output di questa attività, si riferirebbe all'output come. `example_out`

Poiché HealthOmics crea registri per tutto il contenuto STDERR e STDOUT, l'output viene visualizzato anche in CloudWatch Logs, insieme ad altre informazioni di registrazione STDERR relative all'attività.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: echo
stdout: output.txt
inputs:
  message:
    type: string
    inputBinding:
      position: 1
outputs:
  example_out:
    type: stdout

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### Output dell'attività per STDERR
<a name="task-outputs-cwl-stderr"></a>

Questo esempio crea un'`CommandLineTool`attività che riproduce il contenuto STDERR in un file di output di testo denominato. **stderr.txt** L'attività modifica il codice in `baseCommand` modo che venga `echo` scritto su STDERR (anziché su STDOUT).

La `outputs` direttiva specifica che il nome dell'output è e il tipo è**stderr\$1out**. `stderr` 

Poiché HealthOmics crea registri per tutto il contenuto STDERR e STDOUT, l'output verrà visualizzato in CloudWatch Logs, insieme ad altre informazioni di registrazione STDERR relative all'attività.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: [bash, -c]
stderr: stderr.txt
inputs:
  message:
    type: string
    inputBinding:
      position: 1
      shellQuote: true
      valueFrom: "echo $(self) >&2"
outputs:
  stderr_out:
    type: stderr

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### Emissione dell'operazione in un file
<a name="task-outputs-cwl-file"></a>

Questo esempio crea un'`CommandLineTool`attività che crea un archivio tar compresso dai file di input. Fornite il nome dell'archivio come parametro di input (archive\$1name). 

La **outputs** direttiva specifica che il tipo di `archive_file` output è `File` e utilizza un riferimento al parametro di input per collegarsi `archive_name` al file di output.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: [tar, cfz]
inputs:
  archive_name:
    type: string
    inputBinding:
      position: 1
  input_files:
    type: File[]
    inputBinding:
      position: 2
      
outputs:
  archive_file:
    type: File
    outputBinding:
      glob: "$(inputs.archive_name)"

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### Esecuzione dell'operazione su una serie di file
<a name="task-outputs-cwl-files"></a>

In questo esempio, l'`CommandLineTool`attività crea una matrice di file utilizzando il `touch` comando. Il comando utilizza le stringhe del parametro `files-to-create` di input per denominare i file. Il comando genera una serie di file. L'array include tutti i file nella directory di lavoro che corrispondono al `glob` modello. Questo esempio utilizza un pattern di caratteri jolly («\$1») che corrisponde a tutti i file.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: touch
inputs:
  files-to-create:
    type:
      type: array
      items: string
    inputBinding:
      position: 1
outputs:
  output-files:
    type:
      type: array
      items: File
    outputBinding:
      glob: "*"

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

# Le risorse delle attività in una definizione di HealthOmics flusso di lavoro
<a name="task-resources"></a>

Nella definizione del flusso di lavoro, definisci quanto segue per ogni attività:
+ L'immagine del contenitore per l'attività. Per ulteriori informazioni, consulta [Immagini di container per flussi di lavoro privati](workflows-ecr.md).
+ Il numero CPUs e la memoria necessari per l'operazione. Per ulteriori informazioni, consulta [Requisiti di calcolo e memoria per le attività HealthOmics](memory-and-compute-tasks.md).

HealthOmics ignora qualsiasi specifica di archiviazione per attività. HealthOmics fornisce un'archiviazione di esecuzione a cui possono accedere tutte le attività in esecuzione. Per ulteriori informazioni, consulta [Esegui tipi di storage nei flussi HealthOmics di lavoro](workflows-run-types.md).

------
#### [ WDL ]

```
task my_task {
   runtime {
      container: "<aws-account-id>.dkr.ecr.<aws-region>.amazonaws.com/<image-name>"
      cpu: 2
      memory: "4 GB"
   }
   ...
}
```

Per un flusso di lavoro WDL, HealthOmics tenta fino a due nuovi tentativi per un'operazione che non riesce a causa di errori di servizio (la richiesta API restituisce un codice di stato HTTP 5XX). Per ulteriori informazioni sui nuovi tentativi di attività, vedere. [Ritentativi di attività](monitoring-runs.md#run-status-task-retries)

È possibile disattivare il comportamento dei nuovi tentativi specificando la seguente configurazione per l'operazione nel file di definizione WDL:

```
runtime {
   preemptible: 0
}
```

------
#### [ NextFlow ]

```
process my_task {
   container "<aws-account-id>.dkr.ecr.<aws-region>.amazonaws.com/<image-name>"
   cpus 2
   memory "4 GiB"
   ...
}
```

------
#### [ CWL ]

```
cwlVersion: v1.2
class: CommandLineTool
requirements:
    DockerRequirement:
        dockerPull: "<aws-account-id>.dkr.ecr.<aws-region>.amazonaws.com/<image-name>"
    ResourceRequirement:
        coresMax: 2
        ramMax: 4000 # specified in mebibytes
```

------

# Acceleratori di attività in una definizione di workflow HealthOmics
<a name="task-accelerators"></a>

Nella definizione del flusso di lavoro, puoi facoltativamente specificare le specifiche dell'acceleratore GPU per un'attività. HealthOmics supporta i seguenti valori accelerator-spec, oltre ai tipi di istanza supportati:


| Specifiche dell'acceleratore | Tipi di istanze Healthomics | 
| --- | --- | 
| nvidia-tesla-t4 | G4 | 
| nvidia-tesla-t4 a 10 g | G4 e G5 | 
| nvidia-tesla-a10 g | G5 | 
| nvidia-t4-a10g-l4 | G4, G5 e G6 | 
| nvidia-l4-a10g | G5 e G6 | 
| nvidia-l4 | G6 | 
| nvidia-l40s | G6e | 

Se si specifica un tipo di acceleratore che supporta più tipi di istanza, HealthOmics seleziona il tipo di istanza in base alla capacità disponibile. Se entrambi i tipi di istanza sono disponibili, HealthOmics dà la preferenza all'istanza a basso costo. L'eccezione è rappresentata dal task accelerator nvidia-t4-a10g-l4 che dà la preferenza all'istanza di ultima generazione disponibile.

Per i dettagli sui tipi di istanze[Istanze di elaborazione accelerata](memory-and-compute-tasks.md#workflow-task-accelerated-computing-instances), vedere.

Nell'esempio seguente, la definizione del flusso di lavoro specifica `nvidia-l4` come acceleratore:

------
#### [ WDL ]

```
task my_task {
 runtime {
    ...
    acceleratorCount: 1
    acceleratorType: "nvidia-l4"
 }
 ...
}
```

------
#### [ NextFlow ]

```
process my_task {
 ...
 accelerator 1, type: "nvidia-l4"
 ...
}
```

------
#### [ CWL ]

```
cwlVersion: v1.2
class: CommandLineTool
requirements:
  ...
  cwltool:CUDARequirement:
      cudaDeviceCountMin: 1
      cudaComputeCapability: "nvidia-l4"
      cudaVersionMin: "1.0"
```

------

# Specifiche della definizione del flusso di lavoro WDL
<a name="workflow-languages-wdl"></a>

I seguenti argomenti forniscono dettagli sui tipi e le direttive disponibili per le definizioni dei flussi di lavoro WDL in. HealthOmics

**Topics**
+ [Conversione implicita dei tipi in WDL lenient](#workflow-wdl-type-conversion)
+ [Definizione dello spazio dei nomi in input.json](#workflow-wdl-namespace-defn)
+ [Tipi primitivi in WDL](#workflow-wdl-primitive-types)
+ [Tipi complessi in WDL](#workflow-wdl-complex-types)
+ [Direttive in WDL](#workflow-wdl-directives)
+ [Metadati delle attività in WDL](#workflow-wdl-task-metadata)
+ [Esempio di definizione del flusso di lavoro WDL](#wdl-example)

## Conversione implicita dei tipi in WDL lenient
<a name="workflow-wdl-type-conversion"></a>

HealthOmics supporta la conversione implicita dei tipi nel file input.json e nella definizione del flusso di lavoro. Per utilizzare il tipo di casting implicito, specificate il motore di workflow come WDL clemente quando create il flusso di lavoro. WDL lenient è progettato per gestire i flussi di lavoro migrati da Cromwell. Supporta le direttive Cromwell dei clienti e alcune logiche non conformi.

[WDL lenient supporta la conversione dei tipi per i seguenti elementi nell'elenco delle eccezioni limitate di WDL:](https://github.com/openwdl/wdl/blob/wdl-1.2/SPEC.md#-limited-exceptions)
+ Float to Int, dove la coercizione non comporta alcuna perdita di precisione (ad esempio 1,0 mappato a 1).
+ String to Int/Float, dove la coercizione non comporta alcuna perdita di precisione.
+ Mappa [W, X] su Array [Pair [Y, Z]], nel caso in cui W sia coercibile con Y e X sia coercibile con Z.
+ Array [Pair [W, X] to Map [Y, Z], nel caso in cui W sia coercibile con Y e X sia coercibile con Z (ad esempio 1,0 mappato a 1).

Per utilizzare il type casting implicito, specificate il motore di workflow come WDL\$1LENIENT quando create il workflow o la versione del workflow.

**Nella console, il parametro del motore di workflow è denominato Language.** Nell'API, il parametro del motore di workflow è denominato **engine**. Per ulteriori informazioni, consulta [Creare un flusso di lavoro privato](create-private-workflow.md) o [Creare una versione del flusso di lavoro](workflows-version-create.md).

## Definizione dello spazio dei nomi in input.json
<a name="workflow-wdl-namespace-defn"></a>

HealthOmics supporta variabili completamente qualificate in input.json. Ad esempio, se dichiarate due variabili di input denominate number1 e number2 nel flusso di lavoro: **SumWorkflow**

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

 Puoi usarle come variabili complete in input.json: 

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

## Tipi primitivi in WDL
<a name="workflow-wdl-primitive-types"></a>

La tabella seguente mostra come gli input in WDL vengono mappati ai tipi primitivi corrispondenti. HealthOmics fornisce un supporto limitato per la coercizione dei tipi, quindi consigliamo di impostare tipi espliciti. 


**tipi primitivi**  

| Tipo WDL | Tipo JSON | Esempio WDL | Esempio di chiave e valore JSON | Note | 
| --- | --- | --- | --- | --- | 
| Boolean | boolean | Boolean b | "b": true | Il valore deve essere minuscolo e senza virgolette. | 
| Int | integer | Int i | "i": 7 | Deve essere senza virgolette. | 
| Float | number | Float f | "f": 42.2 | Deve essere non quotato. | 
| String | string | String s | "s": "characters" | Le stringhe JSON che sono un URI devono essere mappate su un file WDL per essere importate. | 
| File | string | File f | "f": "s3://amzn-s3-demo-bucket1/path/to/file" | Amazon S3 e HealthOmics lo storage URIs vengono importati purché il ruolo IAM fornito per il flusso di lavoro abbia accesso in lettura a questi oggetti. Non sono supportati altri schemi URI (come file://https://, eftp://). L'URI deve specificare un oggetto. Non può essere una directory, il che significa che non può terminare con un/. | 
| Directory | string | Directory d | "d": "s3://bucket/path/" | Il Directory tipo non è incluso in WDL 1.0 o 1.1, quindi sarà necessario aggiungerlo version development all'intestazione del file WDL. L'URI deve essere un URI Amazon S3 e deve avere un prefisso che termina con un '/'. Tutti i contenuti della directory verranno copiati in modo ricorsivo nel flusso di lavoro come singolo download. DirectoryDeve contenere solo file relativi al flusso di lavoro. | 

## Tipi complessi in WDL
<a name="workflow-wdl-complex-types"></a>

La tabella seguente mostra come gli input in WDL vengono mappati ai tipi JSON complessi corrispondenti. I tipi complessi in WDL sono strutture di dati composte da tipi primitivi. Le strutture di dati, come gli elenchi, verranno convertite in matrici.


**Tipi complessi**  

| Tipo WDL | Tipo JSON | Esempio WDL | Esempio di chiave e valore JSON | Note | 
| --- | --- | --- | --- | --- | 
| Array | array | Array[Int] nums | “nums": [1, 2, 3] | I membri dell'array devono seguire il formato del tipo di array WDL. | 
| Pair | object | Pair[String, Int] str\$1to\$1i | “str\$1to\$1i": \$1"left": "0", "right": 1\$1 | Ogni valore della coppia deve utilizzare il formato JSON del tipo WDL corrispondente. | 
| Map | object | Map[Int, String] int\$1to\$1string | "int\$1to\$1string": \$1 2: "hello", 1: "goodbye" \$1 | Ogni voce nella mappa deve utilizzare il formato JSON del tipo WDL corrispondente. | 
| 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>  | I nomi dei membri della struttura devono corrispondere esattamente ai nomi delle chiavi degli oggetti JSON. Ogni valore deve utilizzare il formato JSON del tipo WDL corrispondente. | 
| Object | N/D | N/D | N/D | Il Object tipo WDL è obsoleto e deve essere sostituito da Struct in tutti i casi. | 

## Direttive in WDL
<a name="workflow-wdl-directives"></a>

HealthOmics supporta le seguenti direttive in tutte le versioni WDL che supportano. HealthOmics 

### Configura le risorse della GPU
<a name="workflow-wdl-directive-gpu"></a>

HealthOmics supporta gli attributi di runtime **acceleratorType** e **acceleratorCount** con tutte le istanze [GPU](https://docs.aws.amazon.com/omics/latest/dev/task-accelerators.html) supportate. HealthOmics supporta anche gli alias denominati **gpuType** and**gpuCount**, che hanno le stesse funzionalità delle controparti con acceleratore. Se la definizione WDL contiene entrambe le direttive, HealthOmics utilizza i valori dell'acceleratore.

L'esempio seguente mostra come utilizzare queste direttive:

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

### Configurare la ripetizione delle attività per gli errori di servizio
<a name="workflow-wdl-task-retry"></a>

HealthOmics supporta fino a due tentativi per un'operazione non riuscita a causa di errori di servizio (codici di stato HTTP 5XX). È possibile configurare il numero massimo di tentativi (1 o 2) e disattivare i tentativi per errori di servizio. Per impostazione predefinita, HealthOmics tenta un massimo di due nuovi tentativi. 

L'esempio seguente imposta `preemptible` la disattivazione dei nuovi tentativi per errori di servizio:

```
{
  preemptible: 0 
}
```

Per ulteriori informazioni sui nuovi tentativi di attività in HealthOmics, vedere. [Ritentativi di attività](monitoring-runs.md#run-status-task-retries)

### Configurare un nuovo tentativo di operazione in caso di esaurimento della memoria
<a name="workflow-wdl-retries"></a>

HealthOmics supporta nuovi tentativi per un'operazione che non è riuscita perché la memoria è esaurita (codice di uscita del contenitore 137, codice di stato HTTP 4XX). HealthOmics raddoppia la quantità di memoria per ogni nuovo tentativo.

Per impostazione predefinita, HealthOmics non riprova per questo tipo di errore. Utilizzate la `maxRetries` direttiva per specificare il numero massimo di tentativi.

L'esempio seguente è `maxRetries` impostato su 3, in modo che HealthOmics tenti un massimo di quattro tentativi di completare l'operazione (il tentativo iniziale più tre tentativi):

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

**Nota**  
Per riprovare l'operazione se la memoria non è sufficiente, è necessario GNU findutils 4.2.3\$1. Il contenitore di immagini predefinito include questo pacchetto. HealthOmics Se specificate un'immagine personalizzata nella definizione WDL, assicuratevi che l'immagine includa GNU findutils 4.2.3\$1.

### Configura i codici di restituzione
<a name="workflow-wdl-directive-returnCodes"></a>

L'attributo **ReturnCodes** fornisce un meccanismo per specificare un codice di ritorno, o un set di codici di ritorno, che indica l'esecuzione corretta di un'attività. Il motore WDL rispetta i codici restituiti specificati nella sezione **runtime** della definizione WDL e imposta lo stato delle attività di conseguenza. 

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

HealthOmics **supporta anche un alias denominato **continueOnReturnCode**, che ha le stesse funzionalità di ReturnCodes.** **Se si specificano entrambi gli attributi, HealthOmics utilizza il valore ReturnCodes.**

## Metadati delle attività in WDL
<a name="workflow-wdl-task-metadata"></a>

HealthOmics supporta le seguenti opzioni di metadati per le attività WDL.

### Disattiva la memorizzazione nella cache a livello di attività con l'attributo volatile
<a name="workflow-wdl-volatile-attribute"></a>

L'attributo **volatile** consente di disabilitare la memorizzazione nella cache delle chiamate per attività specifiche nel flusso di lavoro WDL. Quando un'attività è contrassegnata come volatile, verrà sempre eseguita e non utilizzerà mai i risultati memorizzati nella cache, anche quando la memorizzazione nella cache è abilitata per l'esecuzione.

Aggiungi l'attributo **volatile** alla **meta-sezione della definizione** dell'attività:

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

## Esempio di definizione del flusso di lavoro WDL
<a name="wdl-example"></a>

Gli esempi seguenti mostrano le definizioni di workflow private per la conversione da `CRAM` a `BAM` in WDL. Il `BAM` flusso di lavoro `CRAM` to definisce due attività e utilizza gli strumenti del `genomes-in-the-cloud` contenitore, illustrato nell'esempio e disponibile pubblicamente. 

L'esempio seguente mostra come includere il contenitore Amazon ECR come parametro. Ciò consente di HealthOmics verificare le autorizzazioni di accesso al contenitore prima che inizi l'esecuzione.

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

L'esempio seguente mostra come specificare quali file utilizzare nell'esecuzione, quando i file si trovano in un 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"
}
```

Se desideri specificare file da un archivio di sequenze, indicalo come mostrato nell'esempio seguente, utilizzando l'URI per l'archivio delle sequenze.

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

È quindi possibile definire il flusso di lavoro in WDL come illustrato nell'esempio seguente. 

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

# Specifiche della definizione del flusso di lavoro Nextflow
<a name="workflow-definition-nextflow"></a>

HealthOmics supporta Nextflow e. DSL1 DSL2 Per informazioni dettagliate, vedi [Supporto per la versione Nextflow](workflows-lang-versions.md#workflows-lang-versions-nextflow).

Nextflow si DSL2 basa sul linguaggio di programmazione Groovy, quindi i parametri sono dinamici e la coercizione dei tipi è possibile utilizzando le stesse regole di Groovy. I parametri e i valori forniti dall'input JSON sono disponibili nella mappa parameters () del flusso di lavoro. `params`

**Topics**
+ [Usa i plugin nf-schema e nf-validation](#schema-and-validation-plugins-nextflow)
+ [Specificare l'archiviazione URIs](#storage-uris-nextflow)
+ [Direttive Nextflow](#workflow-nexflow-directives)
+ [Esporta contenuti a livello di flusso di lavoro](#exporting-workflow-content-nextflow)
+ [Esporta il contenuto delle attività](#exporting-task-content-nextflow)

## Usa i plugin nf-schema e nf-validation
<a name="schema-and-validation-plugins-nextflow"></a>

**Nota**  
Riepilogo del supporto per i plugin: HealthOmics   
v22.04 — nessun supporto per i plugin
v23.10 — supporta e `nf-schema` `nf-validation`
v24.10 — supporta `nf-schema`
v25.10 — supporta`nf-schema`,, e `nf-core-utils` `nf-fgbio` `nf-prov`

HealthOmics fornisce il seguente supporto per i plugin Nextflow:
+ Per Nextflow v23.10, preinstalla il plugin nf-validation @1 .1.1 HealthOmics . 
+ Per Nextflow v23.10 e versioni successive, preinstalla il plugin nf-schema @2 .3.0. HealthOmics 
+ Non è possibile recuperare plug-in aggiuntivi durante l'esecuzione di un flusso di lavoro. HealthOmics ignora qualsiasi altra versione del plugin specificata nel file. `nextflow.config`
+ Per Nextflow v24 e versioni successive, `nf-schema` è la nuova versione del plugin obsoleto. `nf-validation` [Per ulteriori informazioni, consulta nf-schema nel repository Nextflow.](https://github.com/nextflow-io/nf-schema) GitHub

## Specificare l'archiviazione URIs
<a name="storage-uris-nextflow"></a>

Quando un Amazon S3 o un HealthOmics URI viene utilizzato per costruire un file o un oggetto di percorso Nextflow, rende l'oggetto corrispondente disponibile per il flusso di lavoro, purché sia concesso l'accesso in lettura. L'uso di prefissi o directory è consentito per Amazon S3. URIs Per alcuni esempi, consulta [Formati dei parametri di input di Amazon S3](workflows-run-inputs.md#s3-run-input-formats). 

HealthOmics supporta parzialmente l'uso di modelli glob in Amazon URIs S3 HealthOmics o Storage. URIs Usa i pattern Glob nella definizione del flusso di lavoro per la creazione dei `path` nostri canali. `file` Per il comportamento previsto e i casi esatti, vedi[Gestione Nextflow del pattern Glob negli input di Amazon S3](workflows-run-inputs.md#wd-nextflow-s3-formats).

## Direttive Nextflow
<a name="workflow-nexflow-directives"></a>

Le direttive Nextflow vengono configurate nel file di configurazione di Nextflow o nella definizione del flusso di lavoro. L'elenco seguente mostra l'ordine di precedenza HealthOmics utilizzato per applicare le impostazioni di configurazione, dalla priorità più bassa a quella più alta:

1. Configurazione globale nel file di configurazione.

1. Sezione delle attività della definizione del flusso di lavoro.

1. Selettori specifici dell'attività nel file di configurazione.

**Topics**
+ [Strategia di ripetizione delle attività utilizzando `errorStrategy`](#workflow-nextflow-errorStrategy)
+ [Tentativi di riprovare l'attività utilizzando `maxRetries`](#workflow-nexflow-task-retry)
+ [Disattiva la ripetizione dell'attività utilizzando `omicsRetryOn5xx`](#workflow-nextflow-retry-5xx)
+ [`time`Durata dell'attività utilizzando la direttiva](#time-directive-nextflow)

### Strategia di ripetizione delle attività utilizzando `errorStrategy`
<a name="workflow-nextflow-errorStrategy"></a>

Usa la `errorStrategy` direttiva per definire la strategia per gli errori delle attività. Per impostazione predefinita, quando un'attività ritorna con un'indicazione di errore (uno stato di uscita diverso da zero), l'attività si interrompe e HealthOmics termina l'intera esecuzione. Se è impostata su `errorStrategy``retry`, HealthOmics tenta un nuovo tentativo dell'operazione non riuscita. Per aumentare il numero di tentativi, vedere. [Tentativi di riprovare l'attività utilizzando `maxRetries`](#workflow-nexflow-task-retry)

```
process {
    label 'my_label'
    errorStrategy 'retry'

    script:
    """
    your-command-here
    """
}
```

Per informazioni su come HealthOmics gestisce i nuovi tentativi di operazione durante un'esecuzione, vedere. [Ritentativi di attività](monitoring-runs.md#run-status-task-retries)

### Tentativi di riprovare l'attività utilizzando `maxRetries`
<a name="workflow-nexflow-task-retry"></a>

Per impostazione predefinita, HealthOmics non tenta di ripetere un'operazione non riuscita o tenta un solo tentativo se configurato. `errorStrategy` Per aumentare il numero massimo di tentativi, imposta `errorStrategy` `retry` e configura il numero massimo di tentativi utilizzando la direttiva. `maxRetries`

L'esempio seguente imposta il numero massimo di tentativi su 3 nella configurazione globale.

```
process {
    errorStrategy = 'retry'
    maxRetries = 3
}
```

L'esempio seguente mostra come impostare `maxRetries` la definizione del flusso di lavoro nella sezione delle attività.

```
process myTask {
    label 'my_label'
    errorStrategy 'retry'
    maxRetries 3
    
    script:
    """
    your-command-here
    """
}
```

L'esempio seguente mostra come specificare la configurazione specifica dell'attività nel file di configurazione di Nextflow, in base ai selettori di nome o etichetta.

```
process {
    withLabel: 'my_label' {
        errorStrategy = 'retry'
        maxRetries = 3
    }

    withName: 'myTask' {
        errorStrategy = 'retry'
        maxRetries = 3
    }
}
```

### Disattiva la ripetizione dell'attività utilizzando `omicsRetryOn5xx`
<a name="workflow-nextflow-retry-5xx"></a>

Per Nextflow v23 e versioni successive, HealthOmics supporta i nuovi tentativi di attività se l'operazione non è riuscita a causa di errori di servizio (5XX codici di stato HTTP). Per impostazione predefinita, HealthOmics tenta fino a due nuovi tentativi di un'operazione non riuscita. 

È possibile `omicsRetryOn5xx` configurare la disattivazione del nuovo tentativo di operazione per errori di servizio. Per ulteriori informazioni su come riprovare l'attività HealthOmics, vedere. [Ritentativi di attività](monitoring-runs.md#run-status-task-retries)

L'esempio seguente configura `omicsRetryOn5xx` la configurazione globale per disattivare il nuovo tentativo di operazione.

```
process {
    omicsRetryOn5xx = false
}
```

L'esempio seguente mostra come eseguire la configurazione `omicsRetryOn5xx` nella sezione delle attività della definizione del flusso di lavoro.

```
process myTask {
    label 'my_label'
    omicsRetryOn5xx = false
    
    script:
    """
    your-command-here
    """
}
```

L'esempio seguente mostra `omicsRetryOn5xx` come impostare una configurazione specifica per l'attività nel file di configurazione Nextflow, in base ai selettori di nome o etichetta.

```
process {
    withLabel: 'my_label' {
        omicsRetryOn5xx = false
    }

    withName: 'myTask' {
        omicsRetryOn5xx = false
    }
}
```

### `time`Durata dell'attività utilizzando la direttiva
<a name="time-directive-nextflow"></a>

HealthOmics fornisce una quota regolabile (vedi[HealthOmics quote di servizio](service-quotas.md)) per specificare la durata massima di un'esecuzione. Per i flussi di lavoro Nextflow v23 e versioni successive, puoi anche specificare la durata massima delle attività utilizzando la direttiva Nextflow. `time`

Durante lo sviluppo di nuovi flussi di lavoro, l'impostazione della durata massima delle attività consente di catturare attività inutili e attività di lunga durata. 

[Per ulteriori informazioni sulla direttiva time di Nextflow, consulta la direttiva time nel riferimento di Nextflow.](https://www.nextflow.io/docs/latest/reference/process.html#process-time)

HealthOmics fornisce il seguente supporto per la direttiva time Nextflow:

1. HealthOmics supporta la granularità di 1 minuto per la direttiva time. È possibile specificare un valore compreso tra 60 secondi e il valore massimo della durata dell'esecuzione.

1. Se si immette un valore inferiore a 60, lo HealthOmics arrotonda a 60 secondi. Per valori superiori a 60, HealthOmics arrotonda per difetto al minuto più vicino.

1. Se il flusso di lavoro supporta nuovi tentativi per un'operazione, HealthOmics riprova l'operazione in caso di timeout.

1. Se un'attività scade (o scade l'ultimo tentativo), HealthOmics annulla l'attività. Questa operazione può avere una durata da uno a due minuti.

1. In caso di timeout dell'attività, HealthOmics imposta l'esecuzione e lo stato dell'attività su Non riuscita e annulla le altre attività in esecuzione (per le attività con stato Avvio, In sospeso o In esecuzione). HealthOmics esporta gli output delle attività completate prima del timeout nella posizione di output S3 designata. 

1. Il tempo trascorso da un'attività in sospeso non viene conteggiato ai fini della durata dell'attività.

1. Se l'esecuzione fa parte di un gruppo di esecuzione e il gruppo di esecuzione scade prima del timer dell'attività, l'esecuzione e l'attività passano allo stato non riuscito.

Specificate la durata del timeout utilizzando una o più delle seguenti unità:`ms`,, `s` `m``h`, o. `d`

L'esempio seguente mostra come specificare la configurazione globale nel file di configurazione Nextflow. Imposta un timeout globale di 1 ora e 30 minuti.

```
process {
    time = '1h30m'
}
```

L'esempio seguente mostra come specificare una direttiva temporale nella sezione delle attività della definizione del flusso di lavoro. Questo esempio imposta un timeout di 3 giorni, 5 ore e 4 minuti. Questo valore ha la precedenza sul valore globale nel file di configurazione, ma non ha la precedenza su una direttiva temporale specifica per l'attività nel file di configurazione. `my_label`

```
process myTask {
    label 'my_label'
    time '3d5h4m'
        
    script:
    """
    your-command-here
    """
}
```

L'esempio seguente mostra come specificare le direttive temporali specifiche dell'attività nel file di configurazione Nextflow, in base ai selettori di nome o etichetta. Questo esempio imposta un valore di timeout globale dell'attività di 30 minuti. Imposta un valore di 2 ore per l'attività `myTask` e imposta un valore di 3 ore per le attività con etichetta`my_label`. Per le attività che corrispondono al selettore, questi valori hanno la precedenza sul valore globale e sul valore nella definizione del flusso di lavoro.

```
process {
    time = '30m'
    
    withLabel: 'my_label' {
        time = '3h'  
    }

    withName: 'myTask' {
        time = '2h'  
    }
}
```

## Esporta contenuti a livello di flusso di lavoro
<a name="exporting-workflow-content-nextflow"></a>

Per Nextflow v25.10, puoi esportare file prodotti al di fuori di singole attività, come report di provenienza o pipeline. DAGs Per esportare questi file, scrivili su. `/mnt/workflow/output/` HealthOmics esporta i file inseriti in questa directory nel `output/` prefisso nella posizione di output Amazon S3 della tua corsa.

L'esempio seguente mostra come configurare il `nf-prov` plug-in su cui scrivere un rapporto di provenienza. `/mnt/workflow/output/`

```
prov {
    formats {
        bco {
            file = "/mnt/workflow/output/pipeline_info/manifest.bco.json"
        }
    }
}
```

Puoi anche passare questo percorso come parametro nell'input JSON della tua esecuzione. Questo approccio è comune ai flussi di lavoro nf-core che utilizzano. `params.outdir`

```
{
    "outdir": "/mnt/workflow/output/"
}
```

## Esporta il contenuto delle attività
<a name="exporting-task-content-nextflow"></a>

Per i flussi di lavoro scritti in Nextflow, definisci una direttiva **PublishDir** per esportare il contenuto delle attività nel tuo bucket Amazon S3 di output. **Come mostrato nell'esempio seguente, imposta il valore PublishDir su.** `/mnt/workflow/pubdir` Per esportare file in Amazon S3, i file devono trovarsi in questa directory.

```
 nextflow.enable.dsl=2
              
  workflow {
    CramToBamTask(params.ref_fasta, params.ref_fasta_index, params.ref_dict, params.input_cram, params.sample_name)
    ValidateSamFile(CramToBamTask.out.outputBam)
  }
  
  process CramToBamTask {
    container "<account>.dkr.ecr.us-west-2.amazonaws.com/genomes-in-the-cloud"
  
    publishDir "/mnt/workflow/pubdir"
  
    input:
        path ref_fasta
        path ref_fasta_index
        path ref_dict
        path input_cram
        val sample_name
  
    output:
        path "${sample_name}.bam", emit: outputBam
        path "${sample_name}.bai", emit: outputBai
  
    script:
    """
        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
    """
  }
  
  process ValidateSamFile {
    container "<account>.dkr.ecr.us-west-2.amazonaws.com/genomes-in-the-cloud"
  
    publishDir "/mnt/workflow/pubdir"
  
    input:
        file input_bam
  
    output:
        path "validation_report"
  
    script:
    """
        java -Xmx3G -jar /usr/gitc/picard.jar \
        ValidateSamFile \
        INPUT=${input_bam} \
        OUTPUT=validation_report \
        MODE=SUMMARY \
        IS_BISULFITE_SEQUENCED=false
    """
  }
```

Per Nextflow v25.10, in alternativa a`publishDir`, puoi utilizzare gli output del flusso di lavoro per esportare il contenuto delle attività. L'esempio seguente mostra come definire un `output` blocco di flusso di lavoro che esporta i risultati delle attività in Amazon S3.

```
process myTask {
    input:
    val data

    output:
    path 'result.txt'

    script:
    """
    echo ${data} > result.txt
    """
}

workflow {
    main:
    output_file = myTask('hello')

    publish:
    results = output_file
}

output {
    results {
        path '.'
    }
}
```

Per ulteriori informazioni sugli output del flusso di lavoro, consulta Output del [flusso di lavoro nella documentazione](https://www.nextflow.io/docs/latest/workflow.html#workflow-output-def) di Nextflow.

# Specifiche della definizione del flusso di lavoro CWL
<a name="workflow-languages-cwl"></a>

I flussi di lavoro scritti in Common Workflow Language, o CWL, offrono funzionalità simili ai flussi di lavoro scritti in WDL e Nextflow. Puoi utilizzare Amazon S3 o HealthOmics lo storage URIs come parametri di input. 

Se definisci l'input in un SecondaryFile in un flusso di lavoro secondario, aggiungi la stessa definizione nel flusso di lavoro principale.

HealthOmics i flussi di lavoro non supportano i processi operativi. [Per ulteriori informazioni sui processi operativi nei flussi di lavoro CWL, consultate la documentazione CWL.](https://www.commonwl.org/user_guide/topics/operations.html)

La migliore pratica consiste nel definire un flusso di lavoro CWL separato per ogni contenitore utilizzato. Ti consigliamo di non codificare la voce DockerPull con un URI Amazon ECR fisso.

**Topics**
+ [Converti i flussi di lavoro CWL da utilizzare HealthOmics](#workflow-cwl-convert)
+ [Disattiva la ripetizione dell'attività utilizzando `omicsRetryOn5xx`](#workflow-cwl-retry-5xx)
+ [Ripeti una fase del flusso di lavoro](#workflow-cwl-loop)
+ [Riprova le attività con maggiore memoria](#workflow-cwl-out-of-memory-retry)
+ [Esempi](#workflow-cwl-examples)

## Converti i flussi di lavoro CWL da utilizzare HealthOmics
<a name="workflow-cwl-convert"></a>

Per convertire una definizione di workflow CWL esistente da utilizzare HealthOmics, apportate le seguenti modifiche:
+ Sostituisci tutti i container Docker URIs con Amazon URIs ECR.
+ Assicurati che tutti i file del flusso di lavoro siano dichiarati come input nel flusso di lavoro principale e che tutte le variabili siano definite in modo esplicito.
+ Assicurati che tutto il JavaScript codice sia conforme alla modalità rigorosa.

## Disattiva la ripetizione dell'attività utilizzando `omicsRetryOn5xx`
<a name="workflow-cwl-retry-5xx"></a>

HealthOmics supporta nuovi tentativi di attività se l'operazione non è riuscita a causa di errori di servizio (codici di stato HTTP 5XX). Per impostazione predefinita, HealthOmics tenta fino a due nuovi tentativi di un'operazione non riuscita. Per ulteriori informazioni su come riprovare l'operazione HealthOmics, vedere. [Ritentativi di attività](monitoring-runs.md#run-status-task-retries)

Per disattivare la ripetizione dell'attività a causa di errori di servizio, configura la `omicsRetryOn5xx` direttiva nella definizione del flusso di lavoro. È possibile definire questa direttiva in base a requisiti o suggerimenti. Consigliamo di aggiungere la direttiva come suggerimento per la portabilità.

```
requirements:
  ResourceRequirement:
    omicsRetryOn5xx: false

hints:
  ResourceRequirement:
    omicsRetryOn5xx: false
```

I requisiti hanno la precedenza sui suggerimenti. Se l'implementazione di un'attività fornisce un fabbisogno di risorse nei suggerimenti che è fornito anche dai requisiti in un flusso di lavoro che lo include, i requisiti di inclusione hanno la precedenza.

Se lo stesso requisito di attività viene visualizzato a livelli diversi del flusso di lavoro, HealthOmics utilizza la voce più specifica di `requirements` (o`hints`, se non sono presenti voci). `requirements` L'elenco seguente mostra l'ordine di precedenza HealthOmics utilizzato per applicare le impostazioni di configurazione, dalla priorità più bassa a quella più alta:
+ Livello di flusso di lavoro
+ Livello di gradino
+ Sezione delle attività della definizione del flusso di lavoro

L'esempio seguente mostra come configurare la `omicsRetryOn5xx` direttiva a diversi livelli del flusso di lavoro. In questo esempio, il requisito a livello di flusso di lavoro ha la precedenza sui suggerimenti a livello di flusso di lavoro. Le configurazioni dei requisiti a livello di attività e fase hanno la precedenza sulle configurazioni dei suggerimenti.

```
class: Workflow
# Workflow-level requirement and hint
requirements:
  ResourceRequirement:
    omicsRetryOn5xx: false

hints:
  ResourceRequirement:
    omicsRetryOn5xx: false  # The value in requirements overrides this value 

steps:
  task_step:
    # Step-level requirement
    requirements:
      ResourceRequirement:
        omicsRetryOn5xx: false
    # Step-level hint
    hints:
      ResourceRequirement:
        omicsRetryOn5xx: false
    run:
      class: CommandLineTool
      # Task-level requirement
      requirements:
        ResourceRequirement:
          omicsRetryOn5xx: false
      # Task-level hint
      hints:
        ResourceRequirement:
          omicsRetryOn5xx: false
```

## Ripeti una fase del flusso di lavoro
<a name="workflow-cwl-loop"></a>

HealthOmics supporta la ripetizione ciclica di una fase del flusso di lavoro. È possibile utilizzare i loop per eseguire ripetutamente le fasi del flusso di lavoro fino a quando non viene soddisfatta una condizione specificata. Ciò è utile per i processi iterativi in cui è necessario ripetere un'operazione più volte o fino al raggiungimento di un determinato risultato.

**Nota:** la funzionalità Loop richiede la versione CWL 1.2 o successiva. I flussi di lavoro che utilizzano versioni CWL precedenti alla 1.2 non supportano le operazioni di loop.

Per utilizzare i loop nel flusso di lavoro CWL, definite un requisito di Loop. L'esempio seguente mostra la configurazione dei requisiti del loop:

```
requirements:
  - class: "http://commonwl.org/cwltool#Loop"
    loopWhen: $(inputs.counter < inputs.max)
    loop:
      counter:
        loopSource: result
        valueFrom: $(self)
    outputMethod: last
```

Il `loopWhen` campo controlla quando il ciclo termina. In questo esempio, il ciclo continua finché il contatore è inferiore al valore massimo. Il `loop` campo definisce come i parametri di input vengono aggiornati tra le iterazioni. `loopSource`specifica quale output dell'iterazione precedente viene immesso nell'iterazione successiva. Il `outputMethod` campo impostato su `last` restituisce solo l'output dell'iterazione finale.

## Riprova le attività con maggiore memoria
<a name="workflow-cwl-out-of-memory-retry"></a>

HealthOmics supporta la ripetizione automatica degli errori delle out-of-memory attività. Quando un'attività termina con il codice 137 (out-of-memory), HealthOmics crea una nuova attività con una maggiore allocazione di memoria in base al moltiplicatore specificato.

**Nota**  
HealthOmics riprova gli out-of-memory errori fino a 3 volte o finché l'allocazione della memoria non raggiunge i 1536 GiB, a seconda del limite raggiunto per primo.

L'esempio seguente mostra come configurare retry: out-of-memory

```
hints:
  ResourceRequirement:
    ramMin: 4096
  http://arvados.org/cwl#OutOfMemoryRetry:
    memoryRetryMultiplier: 2.5
```

Quando un'operazione fallisce a causa di out-of-memory, HealthOmics calcola l'allocazione della memoria tra tentativi utilizzando la formula:. `previous_run_memory × memoryRetryMultiplier` Nell'esempio precedente, se l'operazione con 4096 MB di memoria ha esito negativo, il nuovo tentativo utilizza 4096 × 2,5 = 10.240 MB di memoria.

Il `memoryRetryMultiplier` parametro controlla la quantità di memoria aggiuntiva da allocare per i tentativi di riprovare:
+ **Valore predefinito:** se non si specifica un valore, il valore predefinito è `2` (raddoppia la memoria)
+ **Intervallo valido:** deve essere un numero positivo maggiore di. `1` I valori non validi generano un errore di convalida 4XX
+ **Valore minimo effettivo:** i valori compresi tra `1` e `1.5` vengono aumentati automaticamente per `1.5` garantire un aumento significativo della memoria e prevenire tentativi eccessivi di nuovi tentativi

## Esempi
<a name="workflow-cwl-examples"></a>

Di seguito è riportato un esempio di workflow scritto in CWL. 

```
cwlVersion: v1.2
class: Workflow

inputs:
in_file:
type: File
secondaryFiles: [.fai]

out_filename: string
docker_image: string


outputs:
copied_file:
type: File
outputSource: copy_step/copied_file

steps:
copy_step:
in:
  in_file: in_file
  out_filename: out_filename
  docker_image: docker_image
out: [copied_file]
run: copy.cwl
```

Il file seguente definisce l'`copy.cwl`attività.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: cp

inputs:
in_file:
type: File
secondaryFiles: [.fai]
inputBinding:
  position: 1

out_filename:
type: string
inputBinding:
  position: 2
docker_image:
type: string

outputs:
copied_file:
type: File
outputBinding:
    glob: $(inputs.out_filename)

requirements:
InlineJavascriptRequirement: {}
DockerRequirement:
dockerPull: "$(inputs.docker_image)"
```

Di seguito è riportato un esempio di flusso di lavoro scritto in CWL con un requisito GPU.

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: ["/bin/bash", "docm_haplotypeCaller.sh"]
$namespaces:
cwltool: http://commonwl.org/cwltool#
requirements:
cwltool:CUDARequirement:
cudaDeviceCountMin: 1
cudaComputeCapability: "nvidia-tesla-t4" 
cudaVersionMin: "1.0"
InlineJavascriptRequirement: {}
InitialWorkDirRequirement:
listing:
- entryname: 'docm_haplotypeCaller.sh'
  entry: |
          nvidia-smi --query-gpu=gpu_name,gpu_bus_id,vbios_version --format=csv   

inputs: []
outputs: []
```

# Esempi di definizioni del flusso di lavoro
<a name="workflow-definition-examples"></a>

L'esempio seguente mostra la stessa definizione di flusso di lavoro in WDL, Nextflow e CWL.

------
#### [ WDL ]

```
version 1.1

task my_task {
   runtime { ... }
   inputs {
       File input_file
       String name
       Int threshold
   }
   
   command <<<
   my_tool --name ~{name} --threshold ~{threshold} ~{input_file}
   >>>
   
   output {
       File results = "results.txt"
   }
}

workflow my_workflow {
   inputs {
       File input_file
       String name
       Int threshold = 50
   }
   
   call my_task {
       input:
          input_file = input_file,
          name = name,
          threshold = threshold
   }
   outputs {
       File results = my_task.results
   }
}
```

------
#### [ Nextflow ]

```
nextflow.enable.dsl = 2

params.input_file = null
params.name = null
params.threshold = 50

process my_task {
   // <directives>
   
   input:
     path input_file
     val name
     val threshold
   
   output:
     path 'results.txt', emit: results
   
   script:
     """
     my_tool --name ${name} --threshold ${threshold} ${input_file}
     """
     
   
}

workflow MY_WORKFLOW {
   my_task(
       params.input_file,
       params.name,
       params.threshold
   )
}

workflow {
   MY_WORKFLOW()
}
```

------
#### [ CWL ]

```
cwlVersion: v1.2
class: Workflow

requirements:
    InlineJavascriptRequirement: {}

inputs:
   input_file: File
   name: string
   threshold: int

outputs:
    result:
        type: ...
        outputSource: ...

steps:
    my_task:
        run:
            class: CommandLineTool
            baseCommand: my_tool
            requirements:
                ...
            inputs:
                name:
                    type: string
                    inputBinding:
                        prefix: "--name"
                threshold:
                    type: int
                    inputBinding:
                        prefix: "--threshold"
                input_file:
                    type: File
                    inputBinding: {}
            outputs:
                results:
                    type: File
                    outputBinding:
                        glob: results.txt
```

------