---
og:title: NextFlow
---

# 🧪 NextFlow

[NextFlow](https://www.nextflow.io/) es un framework de flujo de trabajo que permite el desarrollo de pipelines de análisis de datos científicos y bioinformáticos. Está diseñado para ser escalable y reproducible, permitiendo la ejecución de flujos de trabajo en diferentes entornos computacionales, desde laptops hasta clusters de alto rendimiento.

```{note}
Para más información revise la [documentación oficial](https://www.nextflow.io/docs/stable/index.html).
```

## Instalación

NextFlow puede compilarse e instalarse a través de [Spack](/tutoriales/spack).

A continuación se detallan los pasos:

1. Use Spack para compilar e instalar el programa NextFlow
    ```bash
    # Instalar NextFlow
    spack install nextflow
    ```

1. Si la compilación fue exitosa, va a poder hacer lo siguiente:
    ```bash
    # Actualizar módulos de Spack
    spack module tcl refresh -y
    module use ~/spack/share/spack/modules/linux-rocky8-zen2/
    ```

1. Dentro del listado de módulos disponibles podrá encontrar la versión de NextFlow instalada.
    ```bash
    # Verificar módulos disponibles
    module avail
    ```

## Ejemplo Básico

1. Para ejecutar el "hello world" de NextFlow primero tiene que cargar el módulo:
    ```bash
    # Cargar la versión instalada recientemente
    module load nextflow/23.10.0-gcc-12.3.0-u6v2oc2
    ```

1. Luego puede trabajar dentro de un directorio para la prueba del "hello world":
    ```bash
    # Crear y entrar al directorio del proyecto
    mkdir -p ~/workspace/nextflow-hello-world
    cd ~/workspace/nextflow-hello-world

    # Ejecutar el ejemplo hello world
    nextflow run hello
    ```

## Script de SLURM

A continuación se muestra un script de ejemplo para ejecutar un pipeline de NextFlow en el cluster.

Escriba el script `submit_nf.sh`

```{code-block} slurm
#!/bin/bash
#SBATCH --job-name=test_nf
#SBATCH --partition=short
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=64
#SBATCH --nodes=1
#SBATCH --time 05:00

source /etc/profile

# Cargar módulos necesarios
module use ~/spack/share/spack/modules/linux-rocky8-zen2/
module load nextflow/23.10.0-gcc-12.3.0-u6v2oc2

# Configurar variables de entorno para NextFlow
export NXF_BASE_DIR="/scratch/$USER/nextflow-hello-world"
export NXF_WORK="$NXF_BASE_DIR/nxf_work"
export NXF_TEMP="$NXF_BASE_DIR/nxf_temp"
export NXF_LAUNCHER="$NXF_BASE_DIR/nxf_launcher"

# Crear directorios temporales
mkdir -p $NXF_BASE_DIR $NXF_WORK $NXF_TEMP $NXF_LAUNCHER

# Ejecutar el pipeline
cd $NXF_BASE_DIR
nextflow run hello -ansi-log false
```

```{note}
Ajuste los parámetros de SLURM (nodos, CPUs, tiempo) según las necesidades específicas de su pipeline.
```

Ya puede encolar el job:

```bash
sbatch submit_nf.sh
```

:::{dropdown} Ejemplo de salida
```{code-block}
:caption: slurm.out
N E X T F L O W  ~  version 23.10.0
Launching `https://github.com/nextflow-io/hello` [golden_moriondo] DSL2 - revision: 2be824e69a [master]
[a0/b4fbcf] Submitted process > sayHello (2)
[9b/923a62] Submitted process > sayHello (3)
[76/dc9944] Submitted process > sayHello (4)
[de/9d6753] Submitted process > sayHello (1)
Bonjour world!

Ciao world!

Hello world!

Hola world!
```
:::


```{seealso}
[Como escribir un script de submit](/tutoriales/slurm-script).
```

## Contenedores

NextFlow permite que cada proceso pueda ejecutarse dentro de un _container_, ya sea de Docker o de _Apptainer_ (anteriormente conocido como _Singularity_).

Puede verificar que _Apptainer_ está cargado y funcionando a través del commando:

```bash
apptainer --help
```

### Script de SLURM con Apptainer

```{admonition} Importante
:class: info
1. Dado que *solo* los nodos cabecera (_head_) cuentan con acceso a internet, es necesario descargar las imágenes de Apptainer previo a la ejecución del workflow dentro de un directorio en nuestro Home.
1. Este directorio será informado a NextFlow mediante la variable de entorno `NXF_APPTAINER_CACHEDIR`.
```

#### Descarga de las imágenes de Apptainer

> Apptainer almacenará las imágenes por defecto en `/scratch/$USER/.apptainer/cache`. La ubicación de la caché puede modificarse configurando la variable de entorno `APPTAINER_CACHEDIR`.

Para cambiar el directorio a Home:

```bash
export APPTAINER_CACHEDIR=$HOME/.apptainer/cache
export NXF_APPTAINER_CACHEDIR=$APPTAINER_CACHEDIR
mkdir -p $APPTAINER_CACHEDIR
```

Además,es necesario crear un directorio con las imágenes en formato SIF:

```bash
export APPTAINER_SIFDIR_FOR_NXF=$HOME/workspace/apptainer/images
mkdir -p
```

Luego descargue las imágenes que serán utilizadas por el workflow, en este caso de ejemplo, ejecutamos:

```bash
cd $APPTAINER_SIFDIR_FOR_NXF
apptainer pull docker://quay.io/nextflow/bash
```

```{note}
Puede encontrar todas las imágenes utilizadas dentro del archivo `nextflow.config` de su workflow NextFlow.
```

Verificamos que la imagen esté guardada:

```bash
apptainer cache list
```

En caso de necesitar limpiar el cache:

```bash
apptainer cache clean
```

#### Encolado del job

Escriba el script `submit_nf_apptainer.sh`

```{code-block} slurm
#!/bin/bash
#SBATCH --job-name=test_nf_apt
#SBATCH --partition=short
#SBATCH --ntasks-per-node=60
#SBATCH --cpus-per-task=1
#SBATCH --nodes=1
#SBATCH --time 05:00

source /etc/profile

# Cargar módulos necesarios
module use ~/spack/share/spack/modules/linux-rocky8-zen2/
module load nextflow/23.10.0-gcc-12.3.0-u6v2oc2

# Configurar variables de entorno para NextFlow
export NXF_BASE_DIR=/scratch/$USER/nextflow-hello-world
export NXF_WORK=$NXF_BASE_DIR/nxf_work
export NXF_TEMP=$NXF_BASE_DIR/nxf_temp
export NXF_LAUNCHER=$NXF_BASE_DIR/nxf_launcher
export APPTAINER_SIFDIR_FOR_NXF=$HOME/workspace/apptainer/images

# Configurar el directorio cache para las imagenes de Apptainer
export APPTAINER_CACHEDIR=$HOME/.apptainer/cache
export NXF_APPTAINER_CACHEDIR=$APPTAINER_CACHEDIR

# Crear directorios temporales
mkdir -p $NXF_BASE_DIR $NXF_WORK $NXF_TEMP $NXF_LAUNCHER $NXF_APPTAINER_CACHEDIR

# Ejecutar el pipeline
cd $NXF_BASE_DIR
nextflow run hello -ansi-log false -with-apptainer $APPTAINER_SIFDIR_FOR_NXF/bash_latest.sif
```

Ya puede encolar el job:

```bash
sbatch submit_nf_apptainer.sh
```

:::{dropdown} Ejemplo de salida
```{code-block}
:caption: slurm.out
Nextflow 25.04.4 is available - Please consider updating your version to it
N E X T F L O W  ~  version 23.10.0
Launching `https://github.com/nextflow-io/hello` [berserk_magritte] DSL2 - revision: 2be824e69a [master]
[9b/35ec78] Submitted process > sayHello (4)
[01/9630d3] Submitted process > sayHello (2)
[b6/0e877c] Submitted process > sayHello (1)
[98/eaed8b] Submitted process > sayHello (3)
Hola world!

Ciao world!

Hello world!

Bonjour world!
```
:::


### Múltiples imágenes

En caso de contar con procesos dentro del workflow que utilizan diferentes imágenes de Apptainer, es necesario especificarlas dentro del archivo de configuración `nextflow.config`, como el siguiente ejemplo:

```{code-block} groovy
process {
    withName:foo {
        container = '$APPTAINER_SIFDIR_FOR_NXF/image_name_1'
    }
    withName:bar {
        container = '$APPTAINER_SIFDIR_FOR_NXF/image_name_2'
    }
}
apptainer {
    enabled = true
}
```

Más información disponible [aquí](https://www.nextflow.io/docs/edge/container.html)