2. Nextflow

2.4. «Hello world»

Començarem per un script senzill (helloworld.nf) on imprimim una frase, per exemple «Hello world».

nextflow.enable.dsl=2


params.str = 'Hello world!'


process printStr {

 output:

    stdout


  """

echo '${params.str}'

  """

}



workflow {

 printStr | view ( )

}
  • En primer lloc, a l’script nf li indicarem que utilitzem DSL2.
  • Crearem un paràmetre que anomenarem «Hello world!». El nom del paràmetre està precedit per un punt i l’expressió params. En aquesta secció, com que es tracta d’un únic paràmetre, no cal crear un canal, ja que Nextflow assigna directament un canal value. Hi ha diferents tipus de canals, com veurem més endavant, i el canal value és el més simple.
  • El següent segment defineix un procés al qual anomenarem printStr. La nomenclatura dels processos és process seguit del nom que li assignem. Els processos estan formats per tres parts: input, output i script. En aquest cas, li indiquem que l’output sigui l’estàndard, i en ser un valor simple tampoc cal que definim un canal específicament. Dins del procés definirem què volem fer. Imprimim el paràmetre str.
  • Finalment, assignem l’última secció al flux del workflow.

Un cop creat l’script l’executarem:

$ nextflow run helloworld.nf

El resultat es mostra a la figura 2.

Figura 2. Execució de l’script helloworld.nf.
Font: elaboració pròpia.

Com es pot observar, s’ha executat un procés printStr i se’n visualitza el resultat. Si voleu modificar un paràmetre, en aquest cas str, des de la línia d’ordres executarem:

$ nextflow run helloworld.nf --str 'Bye Bye World'

I obtindrem el nou resultat.

Ara li afegirem un segon procés: posar totes les lletres en majúscula. Per això afegirem el procés allToUpper.

nextflow.enable.dsl=2

params.str = 'Hello world!'

process printStr {

  output:

   path 'test.txt'


  """ 

echo '${params.str}' > test.txt

  """

}

process allToUpper {

 input:

   path x

  output:

    stdout

  """

cat $x | tr '[a-z]' '[A-Z]'

  """

}


workflow {

 printStr | allToUpper | view ( )

}

I el resultat el visualitzem a la figura 3.

Figura 3. Output de dos processos a Nextflow.
Font: elaboració pròpia.

Com podeu comprovar a la secció workflow, primer executem printStr, posteriorment allToUpper i finalment el visualitzem mitjançant view( ). view és un operador que veurem més endavant.

Seguidament substituïm l’ordre allToUpper:

cat $x | tr '[a-z]' '[A-Z]'

per:

rev $x

i tornem a executar l’script. En aquest cas, volem imprimir «Hello world!» al revés. Com que el primer pas ja l’havíem llançat anteriorment, podem resumir l’execució mitjançant l’opció resume:

$ nextflow run helloworld.nf -resume

i ens generarà l’output de la figura 4.

Figura 4. Resumir l’execució de l’script helloworld.nf.
Font: elaboració pròpia.

Com podeu veure, el primer pas de l’script no ha estat calculat de nou, sinó que s’ha utilitzat el procés ja generat anteriorment (cached). D’aquesta manera, si en algun pas del pipeline hi ha hagut algun error que ha aturat el procés, es pot resumir prèvia esmena del problema.