2. Nextflow

2.4. «Hello world»

Empezaremos por un script sencillo (helloworld.nf) donde imprimimos una frase, por ejemplo «Hello world».

nextflow.enable.dsl=2


params.str = 'Hello world!'


process printStr {

 output:

    stdout


  """

echo '${params.str}'

  """

}



workflow {

 printStr | view ( )

}
  • En primer lugar, al script nf le indicaremos que utilizamos DSL2.
  • Crearemos un parámetro al cual nombraremos str y le asignaremos la frase «Hello world!». El nombre del parámetro está precedido por un punto y la palabra params. En esta sección, al ser un único parámetro no hace falta crear un canal, ya que Nextflow le asigna directamente un canal value. Hay distintos tipos de canales, como veremos más adelante, y el canal value es el más simple.
  • El siguiente segmento define un proceso al cual nombraremos printStr. La nomenclatura de los procesos es process seguido del nombre que le asignamos. Los procesos están formados de tres partes: input, output y script. En este caso, le indicamos que el output sea el estándar, y al ser un valor simple tampoco hace falta que definamos un canal específicamente. Dentro del proceso definiremos qué queremos hacer. Imprimimos el parámetro str.
  • Finalmente asignamos la última sección al flujo del workflow.

Una vez creado el script lo ejecutaremos:

$ nextflow run helloworld.nf

El resultado se muestra en la figura 2.

Figura 2. Ejecución del script helloworld.nf.
Fuente: elaboración propia.

Como se puede observar, se ha ejecutado un proceso printStr y se visualiza su resultado. Si quisiéramos modificar un parámetro, en este caso str, desde la línea de comandos ejecutaremos:

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

Y obtendremos el nuevo resultado.

Ahora le añadiremos un segundo proceso: poner todas las letras en mayúscula. Para ello añadiremos el proceso 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 ( )

}

Y el resultado lo visualizamos en la figura 3.

Figura 3. Output de dos procesos en Nextflow.
Fuente: elaboración propia.

Como podéis comprobar en la sección workflow, primero ejecutamos printStr, posteriormente allToUpper y finalmente lo visualizamos mediante view( ). view es un operador que veremos más adelante.

Seguidamente sustituimos el comando de allToUpper:

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

por:

rev $x

y volvemos a ejecutar el script. En este caso, queremos imprimir «Hello world!» del revés. Como el primer paso ya lo habíamos lanzado anteriormente, podemos resumir la ejecución mediante la opción resume:

$ nextflow run helloworld.nf -resume

y nos generará el output de la figura 4.

Figura 4. Resumir la ejecución del script helloworld.nf.
Fuente: elaboración propia.

Como podéis ver, el primer paso del script no ha sido calculado de nuevo, sino que se ha utilizado el proceso ya generado anteriormente (cached). De esta forma, si en algún paso del pipeline ha habido algún error que ha parado el proceso, se puede resumir previa subsanación del problema.