Outline

Objectif :

Lancer le même outil (fastqc) sur 3 échantillons différents

Concepts :

  • Écriture d’un script bash

  • Déclaration de variables pour généraliser les échantillons et les répertoires de travail

  • Réalisation d’une boucle pour lancer l’outil sur chaque échantillon

  • Premier script SLURM

Démarrage d’une instance sur Jupyter

Objectif : lancer le même outil (FastQC) sur 3 échantillons Fastq différents

2538_eb3i_n1_2025, 4 CPUs, 2 Go RAM

Variables et scripts

Définition: ce sont des éléments qui associent un nom (l’identifiant) à une valeur, qui sera sauvegardée dans la mémoire du système programmé.

  • Il existe un certain nombre de variables systèmes pré-définies
echo $USER
echo $PWD
echo $SHELL

env | head # Liste les variables système
  • On peut créer ses propres variables
  • Il faudra préfixer les variables avec le caractère ‘$’ pour y faire référence
PROJECT=project_rlegendre # Attention, pas d’espace autour de l’opérateur "="
echo ${PROJECT} # ou echo $PROJECT 
echo /shared/projects/${PROJECT}

WORKDIR=/shared/projects/${PROJECT}
echo ${WORKDIR}

Préparation de l’environnement de travail

mkdir -p ${WORKDIR}/tp_workflow/

cd ${WORKDIR}/tp_workflow/

mkdir data

cd data

cp /shared/projects/2538_eb3i_n1_2025/TP_workflow/data/*.fastq.gz .


cd .. 

touch script_01.sh 

Script simple

Dans un script_01.sh :

#!/bin/bash
mkdir -p fastqc
module load fastqc/0.11.9

fastqc --outdir fastqc data/FILE1_R1.fastq.gz
fastqc --outdir fastqc data/FILE1_R2.fastq.gz

Lancement du workflow

Lancez votre workflow dans le terminal

bash script_01.sh

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_01.sh

Avec définition de la variable SAMPLE

Dans un script_02.sh :

#!/bin/bash

mkdir -p fastqc
module load fastqc/0.11.9

SAMPLE=FILE1
echo ">>> Processing $SAMPLE"
fastqc --outdir fastqc data/${SAMPLE}_R1.fastq.gz
fastqc --outdir fastqc data/${SAMPLE}_R2.fastq.gz

SAMPLE=FILE2
echo ">>> Processing $SAMPLE"
fastqc --outdir fastqc data/${SAMPLE}_R1.fastq.gz
fastqc --outdir fastqc data/${SAMPLE}_R2.fastq.gz

SAMPLE=FILE3
echo ">>> Processing $SAMPLE"
fastqc --outdir fastqc data/${SAMPLE}_R1.fastq.gz
fastqc --outdir fastqc data/${SAMPLE}_R2.fastq.gz

Lancement du workflow

Lancez votre workflow dans le terminal

bash script_02.sh

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_02.sh

On redirige les sorties

Dans un script_03.sh :

#!/bin/bash

mkdir -p fastqc
module load fastqc/0.11.9

SAMPLE=FILE1
echo ">>> Processing $SAMPLE"
fastqc --outdir fastqc data/${SAMPLE}_R1.fastq.gz 2> fastqc/${SAMPLE}_R1.log
fastqc --outdir fastqc data/${SAMPLE}_R2.fastq.gz 2> fastqc/${SAMPLE}_R2.log

SAMPLE=FILE2
echo ">>> Processing $SAMPLE"
fastqc --outdir fastqc data/${SAMPLE}_R1.fastq.gz 2> fastqc/${SAMPLE}_R1.log
fastqc --outdir fastqc data/${SAMPLE}_R2.fastq.gz 2> fastqc/${SAMPLE}_R2.log

SAMPLE=FILE3
echo ">>> Processing $SAMPLE"
fastqc --outdir fastqc data/${SAMPLE}_R1.fastq.gz 2> fastqc/${SAMPLE}_R1.log
fastqc --outdir fastqc data/${SAMPLE}_R2.fastq.gz 2> fastqc/${SAMPLE}_R2.log

Question bonus

Comment rediriger le message “Analysis complete for FILE1_R1.fastq.gz” ?

Cliquez ici pour voir tricher !

Utiliser l’opérateur &> qui permet de rediriger STDIN (la sortie standard) et STDERR (la sortie d’erreur) dans un même fichier

Lancement du workflow

Lancez votre workflow dans le terminal

bash script_03.sh

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_03.sh

Utilisation des boucles for

Une boucle permet de réaliser des tâches itératives.

for PRENOM in Pauline Stephanie Emilie Pierre Mathieu
  do
    echo ${PRENOM}
  done
  
#On peut itérer sur une liste de fichiers
for FILE in data/*
  do
    echo ${FILE}
  done
  
#On peut itérer sur le résultat d’une commande
for READ in $(ls data/* | grep -v FILE1)
  do
    echo ${READ}
  done

Itérer sur les fichiers Fastq

Dans un script_04.sh :

#!/bin/bash

mkdir -p fastqc
module load fastqc/0.11.9

for SAMPLE in FILE1 FILE2 FILE3
do
echo ">>> Processing $SAMPLE"
fastqc --outdir fastqc data/${SAMPLE}_R1.fastq.gz 2> fastqc/${SAMPLE}_R1.log
fastqc --outdir fastqc data/${SAMPLE}_R2.fastq.gz 2> fastqc/${SAMPLE}_R2.log
done

Lancement du workflow

Lancez votre workflow dans le terminal

bash script_04.sh

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_04.sh

Itérer sur le résultat d’une commande

Dans un script_05.sh :

#!/bin/bash

mkdir -p fastqc

module load fastqc/0.11.9

for SAMPLE in $(ls data/ | sed 's/.fastq.gz//')
do
echo ">>> Processing $SAMPLE"
fastqc --outdir fastqc data/${SAMPLE}_R1.fastq.gz &> fastqc/${SAMPLE}_R1.log
fastqc --outdir fastqc data/${SAMPLE}_R2.fastq.gz &> fastqc/${SAMPLE}_R2.log
done

Lancement du workflow

Lancez votre workflow dans le terminal

bash script_05.sh

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_05.sh

Ajouter des options pour SLURM

On commence à décrire un peu plus précisément les ressources nécessaires à notre étape

#!/bin/bash

#SBATCH --account=$USER
#SBATCH --job-name=fastqc_test
#SBATCH --account=2538_eb3i_n1_2025  # Modifier en fonction du projet
#SBATCH --cpus-per-task=1        # Modifier en fonction des besoins
#SBATCH --mem=4GB                # Idem

module load …

Plein d’autres options utiles: voir intro SLURM et https://ifb-elixirfr.gitlab.io/cluster/doc/quick-start/

Dans un script_06.sh :

#!/bin/bash

#SBATCH --partition=fast
#SBATCH --job-name=my_fastqc
#SBATCH --account=2538_eb3i_n1_2025  # Modifier en fonction du projet
#SBATCH --cpus-per-task=1        # Modifier en fonction des besoins
#SBATCH --mem=4GB                # Idem
  
mkdir -p fastqc
module load fastqc/0.11.9

for SAMPLE in $(ls data/ | sed 's/.fastq.gz//')
do
echo ">>> Processing $SAMPLE"
srun --job-name $SAMPLE fastqc --outdir fastqc data/${SAMPLE}.fastq.gz

done

Lancement du workflow

Lancez votre workflow dans le terminal

sbatch script_06.sh

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_06.sh Cette fois ci, on lance le script avec la commande sbatch et on monitore avec squeue

Vérifier que le job tourne

squeue
squeue -u $USER

sacct -u $USER
sacct -u $USER | tail -n 1

Parallelisation des taches

Au lieu de lancer chaque job l’un après l’autre, de manière séquentielle, on va les lancer en parallèle. On utilise un “job array”.

Dans un script_07.sh :

#!/bin/bash
#SBATCH --partition=fast
#SBATCH --job-name=my_fastqc
#SBATCH --account=2538_eb3i_n1_2025  # Modifier en fonction du projet
#SBATCH --cpus-per-task=1        # Modifier en fonction des besoins
#SBATCH --mem=4GB                # Idem
#SBATCH --array=1-6              # Modifier en fonction du nb de tâches à lancer en parallèle

mkdir -p fastqc
module load fastqc/0.11.9

# le Nième fichier de ma liste
SAMPLE=$(ls data/ | sed 's/.fastq.gz//' | \
head -n ${SLURM_ARRAY_TASK_ID} | tail -n 1)

srun --job-name $SAMPLE fastqc --outdir fastqc data/${SAMPLE}.fastq.gz

Lancement du workflow

Lancez votre workflow dans le terminal

sbatch script_07.sh
sacct -u $USER | grep RUNNING | grep FILE

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_07.sh

Ajouter une etape

Dans un script_08.sh :

#!/bin/bash
#SBATCH --partition=fast
#SBATCH --job-name=my_fastqc
#SBATCH --account=2538_eb3i_n1_2025 # Modifier en fonction du projet
#SBATCH --cpus-per-task=1       # Modifier en fonction des besoins
#SBATCH --mem=4GB               # Idem
#SBATCH --array=1-3             # Modifier en fonction du nb de tâches à lancer en parallèle

mkdir -p fastqc
module load fastqc/0.11.9
mkdir -p trimmomatic
module load trimmomatic/0.39

# le Nième fichier de ma liste
SAMPLE=$(basename $(ls data/*R1* | sed 's/.fastq.gz//' | \
head -n ${SLURM_ARRAY_TASK_ID} | tail -n 1))

srun --job-name FASTQC-$SAMPLE fastqc --outdir fastqc data/${SAMPLE}.fastq.gz
srun --job-name FASTQC-$SAMPLE fastqc --outdir fastqc data/${SAMPLE/R1/R2}.fastq.gz
srun --job-name TRIM-$SAMPLE trimmomatic PE -threads 4 -phred33 \
                            data/${SAMPLE}.fastq.gz  data/${SAMPLE/R1/R2}.fastq.gz \
                            trimmomatic/${SAMPLE}.fastq.gz trimmomatic/${SAMPLE/R1/R2}.fastq.gz \
                            trimmomatic/${SAMPLE/R1/unpaired}.fastq.gz \
                            SLIDINGWINDOW:4:20 MINLEN:20

Lancement du workflow

Lancez votre workflow dans le terminal

sbatch script_08.sh
sacct -u $USER | grep RUNNING | grep FILE

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_08.sh

🔬 Workflow ChIP-seq

Mise en pratique: Alignement avec bowtie2

On vous propose maintenant de mettre en pratique ce que vous venez de voir et d’écrire un script SLURM pour aligner tous les échantillons sur le génome de référence avec Bowtie2

$ module load bowtie2/2.5.1
$ bowtie2 --help

Si besoin de plus d’aide : manuel Bowtie2

Index Bowtie2: /shared/bank/arabidopsis_thaliana/TAIR10.1/bowtie2/

Annotation (GTF): /shared/bank/arabidopsis_thaliana/TAIR10.1/gtf/GCF_000001735.4_TAIR10.1_genomic.gtf

Script d’alignement avec Bowtie2

On voudra lancer le script avec la commande sbatch :

sbatch script_mapping_chip.sh
Cliquez ici pour voir la solution !
#!/bin/bash

#SBATCH --account=2538_eb3i_n1_2025
#SBATCH --job-name=bowtie_align
#SBATCH --cpus-per-task=8
#SBATCH --mem=20GB
#SBATCH --array=1-3

module load bowtie2/2.5.1
module load samtools/1.18
  
OUT_DIR="bowtie_res"
mkdir -p $OUT_DIR

GENOME_INDEX="/shared/bank/arabidopsis_thaliana/TAIR10.1/bowtie2/GCF_000001735.4_TAIR10.1_genomic"


SAMPLE=$(ls data/*R1* | sed 's/.fastq.gz//' | awk "NR==${SLURM_ARRAY_TASK_ID}")
BASENAME=$(basename ${SAMPLE/_R1/.bowtie_TAIR10.1})

  
srun bowtie2 -p 2 --mm -x ${GENOME_INDEX} -1 ${SAMPLE}.fastq.gz -2 ${SAMPLE/R1/R2}.fastq.gz -S bowtie_res/${BASENAME}.sam
srun samtools view -@ 2 -q 10 -b bowtie_res/${BASENAME}.sam | samtools sort -@ 2 - -o bowtie_res/${BASENAME}.bam 

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_mapping_chip.sh

🧬 Workflow RNA-seq

Mise en pratique: Alignement avec STAR

On vous propose maintenant de mettre en pratique ce que vous venez de voir et d’écrire un script SLURM pour aligner tous les échantillons sur le génome de référence avec STAR

$ module load star/2.7.9a
$ STAR --help

Si besoin de plus d’aide : manuel STAR

Index STAR: /shared/bank/arabidopsis_thaliana/TAIR10.1/star-2.7.9a/

Annotation (GTF): /shared/bank/arabidopsis_thaliana/TAIR10.1/gtf/GCF_000001735.4_TAIR10.1_genomic.gtf

Script d’alignement avec STAR

On voudra lancer le script avec la commande sbatch :

sbatch script_mapping_rna.sh
Cliquez ici pour voir la solution !
#!/bin/bash

#SBATCH --account=2538_eb3i_n1_2025
#SBATCH --job-name=star_align
#SBATCH --cpus-per-task=8
#SBATCH --mem=20GB
#SBATCH --array=1-3

module load star/2.7.11a

OUT_DIR="/path/to/my/project/TP_rnaseq/workflow/star_res"
mkdir -p $OUT_DIR

DATA_DIR="/shared/projects/2422_ebaii_n1/atelier_rnaseq/04-Workflow/data/"
STAR_INDEX="/shared/bank/arabidopsis_thaliana/TAIR10.1/star-2.7.9a/"
GTF="/shared/bank/arabidopsis_thaliana/TAIR10.1/gtf/GCF_000001735.4_TAIR10.1_genomic.gtf"

R1IN=$(ls $DATA_DIR/*_R1.fastq.gz | awk "NR==${SLURM_ARRAY_TASK_ID}")
R2IN=${R1IN/_R1/_R2}
BASENAME=${R1IN/_R1.fastq.gz/.STAR_TAIR10.1_}

srun STAR --runThreadN ${SLURM_CPUS_PER_TASK} --genomeDir ${STAR_INDEX} \
  --sjdbGTFfile ${GTF} --readFilesCommand zcat --readFilesIn ${R1IN} ${R2IN} \
  --outFileNamePrefix ${OUT_DIR}/${BASENAME} --outSAMtype BAM SortedByCoordinate \
  --outSAMunmapped Within KeepPairs

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_mapping_rna.sh

🌿 Workflow Variants

Mise en pratique: Alignement avec bwa/minimap

On vous propose maintenant de mettre en pratique ce que vous venez de voir et d’écrire un script SLURM pour aligner tous les échantillons sur le génome de référence avec bwa et/ou minimap

Script d’alignement avec bwa

$ module load bwa/0.7.17
$ bwa --help

Si besoin de plus d’aide : manuel bwa

Les index ne sont pas présents dans les bases de données de l’ifb (ici: /shared/bank/arabidopsis_thaliana/TAIR10.1/), nous allons donc les créer.

bwa index -p $PWD/TAIR10 /shared/bank/arabidopsis_thaliana/TAIR10.1/fasta/GCF_000001735.4_TAIR10.1_genomic.fna

Genome de reference (fasta): /shared/bank/arabidopsis_thaliana/TAIR10.1/fasta/GCF_000001735.4_TAIR10.1_genomic.fna

On voudra lancer le script avec la commande sbatch :

sbatch script_mapping_variant_short_read.sh
Cliquez ici pour voir la solution !
#!/bin/bash

#SBATCH --account=2538_eb3i_n1_2025
#SBATCH --job-name=bwa_align
#SBATCH --cpus-per-task=8
#SBATCH --mem=20GB
#SBATCH --array=1-3

module load bwa/0.7.17
module load samtools/1.18
  
OUT_DIR=$PWD"/bwa_res"
mkdir -p $OUT_DIR

GENOME_INDEX=$PWD"/TAIR10"

SAMPLE=$(ls data/*R1* | sed 's/.fastq.gz//' | awk "NR==${SLURM_ARRAY_TASK_ID}")
BASENAME=$(basename ${SAMPLE/_R1/})

  
srun bwa mem -t 2 ${GENOME_INDEX}  ${SAMPLE}.fastq.gz  ${SAMPLE/R1/R2}.fastq.gz > $OUT_DIR/${BASENAME}.unsorted.sam
srun samtools view -@ 2 -q 10 -b $OUT_DIR/${BASENAME}.unsorted.sam | samtools sort -@ 2 - -o $OUT_DIR/${BASENAME}.sorted.bam 

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_mapping_variant_short_read.sh

Script d’alignement avec minimap2

$ module minimap2/2.28
$ minimap2 --help

!! Faire semblant que les reads R1 sont des reads nanopore ou pacbio svp

Si besoin de plus d’aide : manuel minimap2

Genome de reference (fasta): /shared/bank/arabidopsis_thaliana/TAIR10.1/fasta/GCF_000001735.4_TAIR10.1_genomic.fna

On voudra lancer le script avec la commande sbatch :

sbatch script_mapping_variant_long_read.sh
Cliquez ici pour voir la solution !
#!/bin/bash

#SBATCH --account=2538_eb3i_n1_2025
#SBATCH --job-name=minimap_align
#SBATCH --cpus-per-task=8
#SBATCH --mem=20GB
#SBATCH --array=1-3

module load minimap2/2.28
module load samtools/1.18
  
OUT_DIR=$PWD"/minimap_res"
mkdir -p $OUT_DIR

GENOME="/shared/bank/arabidopsis_thaliana/TAIR10.1/fasta/GCF_000001735.4_TAIR10.1_genomic.fna"

SAMPLE=$(ls data/*R1* | sed 's/.fastq.gz//' | awk "NR==${SLURM_ARRAY_TASK_ID}")
BASENAME=$(basename ${SAMPLE/_R1/})

  
srun minimap2 -t 2 -a ${GENOME}  ${SAMPLE}.fastq.gz -o $OUT_DIR/${BASENAME}.unsorted.sam
srun samtools view -@ 2 -q 10 -b $OUT_DIR/${BASENAME}.unsorted.sam | samtools sort -@ 2 - -o $OUT_DIR/${BASENAME}.sorted.bam 

Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_mapping_variant_long_read.sh