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
Objectif : lancer le même outil (FastQC) sur 3 échantillons Fastq différents
2538_eb3i_n1_2025, 4 CPUs, 2 Go RAM
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é.
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}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.gzLancez votre workflow dans le terminal
Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_01.sh
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.gzLancez votre workflow dans le terminal
Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_02.sh
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.logComment rediriger le message “Analysis complete for FILE1_R1.fastq.gz” ?
Utiliser l’opérateur &> qui permet de rediriger STDIN (la sortie standard) et STDERR (la sortie d’erreur) dans un même fichier
Lancez votre workflow dans le terminal
Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_03.sh
forUne 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}
doneDans 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
doneLancez votre workflow dans le terminal
Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_04.sh
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
doneLancez votre workflow dans le terminal
Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_05.sh
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
doneLancez votre workflow dans le terminal
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
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.gzLancez votre workflow dans le terminal
Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_07.sh
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:20Lancez votre workflow dans le terminal
Si besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_08.sh
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
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
On voudra lancer le script avec la commande sbatch :
#!/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
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
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
On voudra lancer le script avec la commande sbatch :
#!/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 KeepPairsSi besoin: wget https://raw.githubusercontent.com/IFB-ElixirFr/EBAII/refs/heads/master/2024/ebaiin1/workflow/scripts/script_mapping_rna.sh
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
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.fnaGenome 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 :
#!/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
!! 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 :
#!/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