====== Nextflow ======

===== Основные компоненты =====

==== Директивы ====

./main.nf
<code>
process FASTQC {
	container 'biocontainers/fastqc:v0.11.5'
	tag "FASTQC on $sample_id"
}
</code>

  * https://training.nextflow.io/basic_training/containers/#software-directives

==== Каналы ====

./main.nf
<code>
ch = Channel.of(1, 2, 3)
ch.view() 
</code>

  * https://training.nextflow.io/basic_training/channels/#channel-factories

==== Процессы ====

<code>
process < name > {
    [ directives ] 

    input: 
    < process inputs >

    output: 
    < process outputs >

    when: 
    < condition >

    [script|shell|exec]: 
    """
    < user script to be executed >
    """
}
</code>

  * directives/Директивы — это начальные декларации, определяющие необязательные параметры.
  * input/Вход определяет ожидаемый входной канал(ы)
  * output/Выход определяет ожидаемый выходной канал(ы)
  * when/Когда является необязательным оператором предложения, разрешающим условные процессы
  * script|shell|exec/Скрипт — это строковый оператор, определяющий команду, которая должна быть выполнена задачей процесса.

  * https://training.nextflow.io/basic_training/processes

==== Операторы ====

<code>
Channel
    .of(1, 2, 3, 4)
    .map { it -> it * it }
    .view()
</code>

  * https://training.nextflow.io/basic_training/operators

==== Модули ====

<code>
include { SPLITLETTERS   } from './modules.nf'
include { SPLITLETTERS; CONVERTTOUPPER } from './modules.nf'
include { CONVERTTOUPPER as CONVERTTOUPPER_one } from './modules.nf'
</code>

  * https://training.nextflow.io/basic_training/modules/

==== Конфигурация ====

./nextflow.config
<code>
propertyOne = 'world'
anotherProp = "Hello $propertyOne"
customPath = "$PATH:/my/app/folder"
// comment a single line
params.foo = 'Hello'
env.ALPHA = 'some value'

process.container = 'nextflow/rnaseq-nf'
docker.enabled = true

// Настройки пакетного планировщика
process {
    cpus = 10
    memory = 8.GB
    container = 'biocontainers/bamtools:v2.4.0_cv3'
    withName: FOO {
        memory = { 4.GB * task.cpus }
    }
}
</code>

  * library:// загрузите образ контейнера из сервиса Singularity Library.
  * shub:// загрузите образ контейнера из Singularity Hub. (не работает)
  * docker:// загрузите образ контейнера из Docker Hub и преобразуйте его в формат Singularity.
  * docker-daemon:// извлеките образ контейнера из локальной установки Docker и преобразуйте его в файл образа Singularity.

  * https://training.nextflow.io/basic_training/config/

===== # Docker =====

==== Варианты работы: ====

=== Dockerfile ===

./Dockerfile
<code yaml>
FROM debian:bullseye-slim

LABEL image.author.name "Your Name Here"
LABEL image.author.email "your@email.here"

RUN apt-get update && apt-get install -y curl cowsay
</code>

== Запуск ==

<code bash>
$ docker build -t my-image .
$ docker run my-image cowsay Hello Docker!
$ docker run -it my-image bash
</code>

<code bash>
$ nextflow run script2.nf -with-docker my-image
</code>

./nextflow.config
<code>

</code>

== Repositories ==

<code bash>
$ docker pull quay.io/biocontainers/ubuntu:24.04
</code>

=== Singularity/Apptainer ===

Singularity/Apptainer — это среда выполнения контейнера, предназначенная для работы в высокопроизводительных вычислительных центрах обработки данных, где использование Docker, как правило, не допускается из-за ограничений безопасности.

Singularity реализует модель выполнения контейнера, похожую на Docker. Однако она использует совершенно другой дизайн реализации.

./my-image.sif
<code>
Bootstrap: docker
From: debian:bullseye-slim

%environment
export PATH=$PATH:/usr/games/

%labels
AUTHOR <your name>

%post

apt-get update && apt-get install -y locales-all curl cowsay
curl -sSL https://github.com/COMBINE-lab/salmon/releases/download/v1.0.0/salmon-1.0.0_linux_x86_64.tar.gz | tar xz \
&& mv /salmon-*/bin/* /usr/bin/ \
&& mv /salmon-*/lib/* /usr/lib/
</code>

<code bash>
$ sudo singularity build my-image.sif Singularity
$ singularity exec my-image.sif cowsay 'Hello Singularity'
$ singularity shell my-image.sif
$ singularity pull docker://debian:bullseye-slim
</code>

<code bash>
$ nextflow run script7.nf -with-singularity  nextflow/rnaseq-nf
</code>

./nextflow.config
<code>

</code>

== Repositories ==

<code bash>
$ singularity run https://depot.galaxyproject.org/singularity/ubuntu:24.04
</code>

=== Conda ===

Conda — популярный менеджер пакетов и сред. Встроенная поддержка Conda позволяет рабочим процессам Nextflow автоматически создавать и активировать среду(ы) Conda, учитывая зависимости, указанные каждым процессом.

<code bash>
conda init
</code>

./env.yml
<code>
name: nf-tutorial
channels:
    - conda-forge
    - defaults
    - bioconda
dependencies:
    - bioconda::salmon=1.5.1
    - bioconda::fastqc=0.11.9
    - bioconda::multiqc=1.12
    - conda-forge::tbb=2020.2
</code>

<code bash>
$ conda env create --file env.yml
$ conda env list
</code>

<code bash>
$ nextflow run script7.nf -with-conda ./
</code>

Другой способ создания сред, подобных conda, — это использование Dockerfile и micromamba.

./Dockerfile
<code>
FROM mambaorg/micromamba:0.25.1

COPY --chown=$MAMBA_USER:$MAMBA_USER env.yml /tmp/env.yml

RUN micromamba create -n nf-tutorial

RUN micromamba install -y -n nf-tutorial -f /tmp/env.yml && \
    micromamba clean --all --yes

ENV PATH /opt/conda/envs/nf-tutorial/bin:$PATH
</code>

== Repositories ==

<code bash>
$ conda install -c conda-forge -c bioconda ubuntu==24.04
</code>

=== BioContainers ===

<code bash>

</code>

== Repositories ==

  * https://biocontainers.pro/multipackage
  * https://biocontainers.pro/registry

<code bash>

</code>

===== # Docker Swarm =====

Отсутствует поддержка в Nextflow

===== # Kubernetes =====

<code bash>

</code>

===== # Slurm =====

[[application:hpc:slurm|Slurm]] — это отказоустойчивая и высокомасштабируемая система управления кластером и планирования заданий с открытым исходным кодом для больших и малых кластеров Linux. Slurm не требует никаких изменений ядра для своей работы и является относительно самодостаточной. Как менеджер рабочей нагрузки кластера, Slurm имеет три ключевые функции. Во-первых, он выделяет пользователям эксклюзивный и/или неэксклюзивный доступ к ресурсам (вычислительным узлам) на определенный период времени, чтобы они могли выполнять работу. Во-вторых, он предоставляет фреймворк для запуска, выполнения и мониторинга работы (обычно параллельной работы) на наборе выделенных узлов. Наконец, он разрешает конфликты за ресурсы, управляя очередью ожидающих работ.

Демоны slurmd обеспечивают отказоустойчивую иерархическую связь. 
Пользовательские команды включают: sacct, sacctmgr, salloc, sattach, sbatch, sbcast, scancel, scontrol, scrontab, sdiag, sh5util, sinfo, sprio, squeue, sreport, srun, sshare, sstat, strigger и sview. 
Все команды могут выполняться в любом месте кластера.

  * https://github.com/koroltim/NextFlow-on-SLURM/tree/main/examples

<code bash>

</code>

===== OAR =====


OAR — это универсальный менеджер ресурсов и задач (также называемый пакетным планировщиком) для кластеров HPC и других вычислительных инфраструктур (например, экспериментальных испытательных стендов распределенных вычислений, где универсальность является ключевым фактором).

  * https://oar.imag.fr/
  * https://github.com/oar-team/oar
  * https://github.com/oar-team/oar3
  * https://oar.imag.fr/docs/2.5/

<code bash>

</code>

===== # HyperQueue =====


HyperQueue — это инструмент, разработанный для упрощения выполнения больших рабочих процессов (графов задач) на кластерах HPC. Он позволяет выполнять большое количество задач простым способом, без необходимости вручную отправлять задания в пакетные планировщики, такие как Slurm или PBS. Вы указываете, что именно вы хотите вычислить, а HyperQueue автоматически запрашивает вычислительные ресурсы и динамически распределяет нагрузку задач по всем выделенным узлам и ресурсам. HyperQueue также может работать без Slurm/PBS как общий распределенный механизм выполнения задач.

  * https://github.com/It4innovations/hyperqueue
  * https://it4innovations.github.io/hyperqueue
  * https://github.com/jaantollander/workflows

<code bash>

</code>

===== # HTCondor =====


HTCondor — это программная система, которая создает среду высокопроизводительных вычислений (HTC). Она эффективно использует вычислительную мощность машин, подключенных через сеть, будь то отдельный кластер, набор кластеров в кампусе, облачные ресурсы, как автономные, так и временно присоединенные к локальному кластеру, или международные сети. Мощь исходит из способности эффективно использовать общие ресурсы с распределенным владением.

  * https://github.com/htcondor/htcondor

<code bash>

</code>

===== # Flux =====


Flux — это гибкая структура для управления ресурсами, созданная для вашего сайта. Структура состоит из набора проектов, инструментов и библиотек, которые могут использоваться для создания настраиваемых менеджеров ресурсов для центров высокопроизводительных вычислений. В отличие от традиционных менеджеров ресурсов, Flux может работать как параллельное задание в большинстве пусковых установок, поддерживающих MPI, в том числе в самом Flux. Это не только делает пакетные скрипты и рабочие процессы для Flux переносимыми на другие менеджеры ресурсов (просто запустите Flux как задание), но также означает, что пакетные задания имеют в своем распоряжении все функции полного менеджера ресурсов, как будто у них есть целый кластер. 

./nextflow.config
<code>
manifest {
    mainScript = 'demo.nf'
    homePage = 'https://github.com/nextflow-io/nextflow/tree/master/docker/flux'
    description = 'Demo using Nextflow with Flux'
}

process {
    executor = 'flux'
}
</code>

./main.nf
<code>
workflow {
    breakfast = Channel.of '🥞️', '🥑️', '🥧️', '🍵️', '🍞️'
    haveMeal(breakfast)
}

process haveMeal {
    debug true
    input:
    val food
    script:
    """
    printf '$food for breakfast!'
    """
}
</code>

<code bash>
$ nextflow -c nextflow.config run main.nf
</code>

===== # Bridge =====

Repo: https://github.com/cea-hpc/bridge

<code bash>

</code>