Como ya he mencionado, los procesos son unidades "atómicas" e independientes que lo único que necesitan para su
ejecución es disponer de los datos de entrada que definan (y producir unos datos de salida también definidos
por el propio proceso).
Así pues, podemos pensar que al inicio de nuestro pipeline todos los procesos se encuentran
creados y a la espera de "ser alimentados". Dicha alimentación se realiza a través de los diferentes operadores
que ofrece un Channel:
hola.nf
process goodbye {
input:
path name
output:
stdout
"""
cat $name
"""
}
process hi {
input:
val name
output:
path "name.txt"
"""
echo Hi $name > name.txt
"""
}
workflow {
Channel.of( 'Jorge' ) | hi | goodbye | view
}
En este ejemplo podemos ver dos procesos definidos (goodbye y hi)
-
goodbye recibe un fichero como entrada (path
) y en su contexto lo vamos a referenciar como name.
Su ejecución va a consistir en volcar (`cat
) dicho fichero por la consola, emitiendo la salida
-
hi por su parte recibe una cadena (val
) y en su contexto la vamos a referenciar como name
(no confundir
con el de goodbye). Dicho proceso va a concatenar una cadena fija con el parámetro de entrada para generar
un fichero de trabajo name.txt
y emitirá la ruta de este fichero
Por último definimos el flujo de trabajo:
Como podemos intuir, el orden de ejecución de los procesos no viene determinado por su posición en el fichero
sino por la composición del flujo de trabajo. De esta manera Nextflow nos permitirá definir (y reutilizar)
procesos en diferentes ficheros y componerlos a nuestro antojo
En los siguientes artículos iremos viendo, entre otras cosas, cómo ejecutar procesos en paralelo