Une fois les index créés, on va vers l'obtention des fichiers de séquence bruts du projet.
$HOME), on se dirige là où l'on désire mettre les index pour la suite:
# On assume que l'on se dirige vers /shares/data pour créer # les répertoires nécessaires # Ajuster en fonction de votre environnement, évidemment! % mkdir /shares/data/indexes # Remarquez que les données d'annotation sont mises dans # une section distincte de celui des index % mkdir /shares/data/annotations % cd /shares/data/annotations # # Ici, on utilise une logique sous la forme source/version # sous /shares/data/annotations # % mkdir gencode # Dernière version en date # Avril 2026 % mkdir gencode/r49 % cd gencode/r49 # Fichier avec les annotations complètes en format GTF % curl -L -O https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_49/gencode.v49.annotation.gtf.gz # Fichier avec les annotations complètes en format GFF3 % curl -L -O https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_49/gencode.v49.annotation.gff3.gz # Fichier FASTA des transcrits pour protéines, utilisé par Salmon % curl -L -O https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_49/gencode.v49.pc_transcripts.fa.gz # Fichier FASTA du genome humain, GRCh38 % curl -L -O https://ftp.ebi.ac.uk/pub/databases/gencode/Gencode_human/release_49/GRCh38.primary_assembly.genome.fa.gz # Decompression des fichiers % for i in `ls | grep gz`; do gunzip $i; done
/shares/data/annotations/gencode et téléchargez les nouvelles versions.Créer les index pour les outils d'alignement est un processus exigeant et le premier exemple où l'utilisation d'une grappe de calcul et d'un système de gestion des tâches qui y réside est un atout. Dans le cas de la création des index, on est confronté à quelques problèmes:
Si on prend pour exemple la grappe de calcul Rorqual, on y trouve des serveurs qui ont tout ce que nous aurons de besoin, il faut simplement leur dire comment faire. En passant, faire cette construction sur une grappe SuperClafoutis n'est pas une option: certaines opérations d'indexation demandent des centaine de Gb de mémoire vive Cependant, une fois les index construits, on peut les télécharger pour utilisation locale car ces fichiers sont indépendants de la plateforme où ils ont été calculés.
Comme ce sont des tâches qui demandent du temps (plusieurs minutes à plusieurs heures), c'est le moment idéal pour apprendre à utiliser SLURM. À la base, SLURM est un système où un usager soumet des actions (interactives ou scriptées) via une application (srun ou sbatch) à une queue de traitement qui gèrera la suite des choses. Une fois la tâche assignée à un noeud de calcul, elle s'exécute indépendamment de votre attention (dans le cas de sbatch).
hisat2-build pour construire les fichiers nécessaires. Quant aux ressources nécessaires, la création des index avec les infos concernant les transcrits (sites d'épissage avec bordures intron-exon et liste des exons) est possible un ordinateur avec au moins 32 Gb de mémoire vive. Si vous voulez ajouter les infos sur les variations génétiques, il vous faudra plusieurs centaines de Gb de mémoire vive…
# On crée l'arborescence nécessaire sous /shares/data % cd /shares/data/indexes # # Remarquez que nous reprenons la structure logique # de l'organisation des fichiers retrouvés sous # /shares/data/annotations # # Construction des index utilisés spécifiquement par HISAT2 % mkdir hisat2 % mkdir hisat2/gencode % mkdir hisat2/gencode/r49 % mkdir hisat2/gencode/r49/interim_files % cd hisat2/gencode/r49/interim_files # # Ici, on assume que HISAT2 est sur le $PATH; les scripts devraient se trouver # au même niveau que l'application. # Il faut rediriger la sortie vers un fichier sinon ça sort sur STDOUT... % hisat2_extract_exons.py /shares/data/annotations/gencode/r49/gencode.v49.annotation.gtf > ./gencode_r49_exons.txt % hisat2_extract_splice_sites.py /shares/data/annotations/gencode/r49/gencode.v49.annotation.gtf > ./gencode_r49_ss.txt # Etape facultative: extraction des infos pour les variations génétiques # Dernière version disponible des données UCSC % curl -L -O http://hgdownload.soe.ucsc.edu/goldenPath/hg38/database/snp151Common.txt.gz % gunzip snp151Common.txt.gz # Ici, le script est un peu plus exigeant... Ça prend plus de temps que les étapes précédentes mais ça se fait sur un RPi. # A la fin, vous obtiendrez deux fichiers: un avec .haplotype et un autre .snp en suffixe avec gencode_r49_snp_haplo comme préfixe. % hisat2_extract_snps_haplotypes_UCSC.py /shares/data/annotations/gencode/r49/GRCh38.primary_assembly.genome.fa ./snp151Common.txt gencode_r49_snp_haplo
bash qui sera donner en entrée à l'application sbatch pour soumettre à l'ordonnanceur de tâches de SLURM. On doit écrire dans l'entête du script des instructions qui seront lues par l'ordonnanceur et qui permettront d'utiliser les bonnes ressources pour l'exécution. Le script qui suit est simplement un exemple ; votre propre grappe de calcul nécessitera fort probablement des instructions différentes…nano, écrire le texte suivant:
#!/bin/bash -l # ## # Nous sommes sous /shares/data/indexes/hisat2/gencode/r49 # (ou à l'endroit approprié de votre système de fichiers dans # une grappe de calcul) ## #SBATCH --account=nom_compte #SBATCH --job-name=hisat2-build_%j #SBATCH --output=hisat2-build_%j.out #SBATCH --error=hisat2-build_%j.err #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=256G #SBATCH --time=02:00:00 # # On assume que l'application hisat2-build est sur le $PATH # # Sur Rorqual, il faut charger l'application; retirez le # dièse de la prochaine ligne pour que le script fonctionne #module load hisat2 hisat2-build -p 4 \ --exon ./interim_files/gencode_r49_exons.txt \ --ss ./interim_files/gencode_r49_ss.txt \ /shares/data/annotations/gencode/r49/GRCh38.primary_assembly.genome.fa \ ./h_sapiens_gencode_r49_exons_ss # Sauvegarder votre fichier avec un nom comme hisat2-builder.sh
#!/bin/bash -l: cette ligne dicte que le script sera exécuté via l'interpréteur bash pour comprendre le reste du script.#SBATCH –account=nom_compte: paramètre nécessaire (par exemple, pour le cluster Rorqual) pour la comptabilité des tâches selon les groupes d'usagers.#SBATCH –job-name=hisat2-build_%j: chaque ligne commençant par #SBATCH est en fait une instruction pour sbatch, dans ce cas, la tâche portera le nom hisat2builder_%j où %j est une variable spécifique à sbatch attribuée au moment de la soumission et désignant le numéro de la tâche dans la queue de traitement.#SBATCH –output=hisat2-build_%j.out: nom du fichier de sortie sur STDOUT. Dans notre cas, c'est pratique d'inclure le numéro de la tâche pour faire le suivi.#SBATCH –error=hisat2-build_%j.err: nom du fichier de sortie des erreurs sur STDERR.#SBATCH –ntasks=1: nous avons une seule tâche à accomplir.#SBATCH –cpus-per-task=4: cette tâche demande 4 CPU pour en assurer l'exécution. Assurez-vous que cette valeur soit la même que celle du paramètre -p utilisé par HISAT2 #SBATCH –mem=256G: la tâche devrait être attribuée à un serveur avec au moins 256Gb de mémoire vive disponible (eh oui, c'est beaucoup mais nécessaire pour construire les fichiers d'index en utilisant les infos sur les exons et les bordures exon-intron).#SBATCH –time=02:00:00: la tâche sera abandonnée si elle dure plus de 2 heures. En théorie, ça devrait en prendre moins avec 4 coeurs de calcul pour l'exécution.#SBATCH –mail-user=courriel@institution.org: une adresse de courriel valide pour envoyer les états de la tâche sur le cluster. #SBATCH –mail-type=BEGIN,END,FAIL: le type d'information à communiquer à l'usager. Ici, on demande d'envoyer un courriel au début de l'exécution, à la fin de l'exécution et en cas d'erreur./shares/data/indexes/hisat2/gencode/r49, on soumet le script hisat2-builder.sh à la grappe de calcul avec la commande suivante:
% sbatch hisat2-builder.sh # Vous recevrez sur le terminal le numéro de votre tâche.
squeue pour voir:
# Une option: % squeue | grep nom_usager # Une autre option avec le numéro de la tâche: % squeue | grep job_id
squeue à surveiller est celle appelée ST pour Status. Si elle indique que la tâche est PD (pour Pending), ça veut dire que la tâche est en attente d'exécution; si elle indique R (pour Running, duh!), ça veut dire qu'elle est en exécution..ht2 qui à la fin de l'exécution constitueront votre index. Lors de l'appel de HISAT2 pour les tâches d'alignement, on utilisera comme source de l'index /shares/data/indexes/hisat2/gencode/r49/h_sapiens_gencode_r49_exons_ss sans l'extension .ht2./shares/data/indexes/hisat2/gencode/r49./shares/data/indexes (adaptez selon votre situation) et on doit créer l'arborescence comme pour HISAT2. Un point de différence: on doit aussi créer un répertoire dans lequel seront déposés les fichiers constituant l'index.
% cd /shares/data/indexes % mkdir star % mkdir star/gencode % mkdir star/gencode/r49 % mkdir star/gencode/r49/h_sapiens_r49_index
nano, on écrit le script nécessaire; disons que nous l'appellerons star_index-builder.sh:
% cd /shares/data/indexes/star/gencode/r49 % nano star_index-builder.sh
#!/bin/bash -l # #SBATCH --account=votre_compte #SBATCH --job-name=star-build_%j #SBATCH --output=star-build_%j.out #SBATCH --error=star-build_%j.err #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=64G #SBATCH --time=04:00:00 #SBATCH --mail-user=votre@adresse.courriel #SBATCH --mail-type=ALL # # On assume que l'application STAR est sur le $PATH # # Sur Rorqual, il faut charger l'application; retirez le # dièse de la prochaine ligne pour que le script fonctionne :-) #module load star STAR \ --runThreadN 4 \ --runMode genomeGenerate \ --genomeDir ./h_sapiens_r49_index \ --genomeFastaFiles /shares/data/annotations_genome/gencode/r49/GRCh38.primary_assembly.genome.fa \ --sjdbGTFfile /shares/data/annotations_genome/gencode/r49/gencode.v49.annotation.gtf \ --sjdbOverhang 99
–runThreadN 4: spécifie le nombre de coeurs de calcul à utiliser pour exécuter la commande. La valeur doit évidemment être la même que pour le paramètre –mem inscrit dans l'entête du script. –runMode genomeGenerate: la fonction de création d'index de STAR–genomeDir ./h_sapiens_r49_index: le répertoire où seront écrit les divers fichiers constituant l'index –genomeFastaFiles /shares/data/annotations_genome/gencode/r49/GRCh38.primary_assembly.genome.fa: le fichier, en format FASTA, du génome contre lequel faire les alignements–sjdbGTFfile /shares/data/annotations_genome/gencode/r49/gencode.v49.annotation.gtf: le fichier, en format GTF, contenant toutes les annotations disponibles sur les gènes du même génome. Les noms des chromosomes doivent être identiques entre les deux fichiers.–sjdbOverhang 99: correspond à la longueur des lectures contenues dans les fichiers FASTQ à aligner moins 1. Cette valeur correspond à la longueur de génome sur lequel une jonction exon-intron contenue dans le fichier d'annotation doit s'aligner.sbatch:
% sbatch star_index-builder.sh
.out contenant le texte suivant: ….. finished successfully. Vous être fin prêt pour la suite.generateDecoyTranscriptome.sh qui appelle une application appelée MashMap pour réussir ça
# On crée l'arborescence nécessaire sous /shares/data % cd /shares/data/indexes # # Remarquez que nous reprenons la structure logique # de l'organisation des fichiers retrouvés sous # /shares/data/annotations # % mkdir salmon % mkdir salmon/gencode % mkdir salmon/gencode/r49 % mkdir salmon/gencode/r49/interim_files % cd salmon/gencode/r49/interim_files
generateDecoyTranscriptome.sh en téléchargeant le package SalmonTools qui se trouve sur Github:
% git clone https://github.com/COMBINE-lab/SalmonTools.git # Le script se trouve dans le répertoire ./SalmonTools/scripts; il faut # le rendre executable % chmod u+x ./SalmonTools/scripts/generateDecoyTranscriptome.sh
sbatch:
# On retourne au niveau supérieur % cd .. # On utilise nano pour la composition du script % nano salmon_decoy-builder.sh
#!/bin/bash -l # #SBATCH --account=votre_compte #SBATCH --job-name=salmon_decoy-builder_%j #SBATCH --output=salmon_decoy-builder_%j.out #SBATCH --error=salmon_decoy-builder_%j.err #SBATCH --ntasks=1 #SBATCH --cpus-per-task=1 #SBATCH --mem=384G #SBATCH --time=08:00:00 #SBATCH --mail-user=votre@adresse.courriel #SBATCH --mail-type=ALL # # On assume que bedtools et mashmap sont sur le $PATH # Sinon, dans une. grappe de calcul, retirer # le # devant les 2 prochaines lignes #module load bedtools #module load mashmap ./SalmonTools/scripts/generateDecoyTranscriptome.sh \ -a /shares/data/annotations_genome/gencode/r49/gencode.v49.annotation.gtf \ -g /shares/data/annotations_genome/gencode/r49/GRCh38.primary_assembly.genome.fa \ -t /shares/data/annotations_genome/gencode/r49/gencode.v49.transcripts.fa \ -o ./interim_files
% sbatch salmon_decoy-builder.sh
interim_files les fichiers suivants: decoys.txt,exons.bed,gentrome.fa et reference.masked.genome.fa, qui seront utilisés à la prochaine étape.salmon demande pas mal moins de ressources que la création des fichiers decoys: ça se fait sur un Raspberry Pi 5 avec 8Gb de mémoire vive
# # On assume que nous sommes localement dans le répertoire # /shares/data/indexes/salmon/gencode/r49 # # Ajuster le lien distant en consequence de votre propre # environnement # % scp -r mon_compte@grappe_calcul:salmon/gencode/r49/interim_files .
/shares/data/indexes/gencode/r49, on exécute la fonction de création des index de salmon via un script pour soumission via sbatch. On crée donc un nouveau script (appelons le salmon_index-builder.sh) via nano:
#!/bin/bash -l # # Parametres sbatch pour une exécution locale de sbatch sur # un cluster SuperClafoutis ou une instance locale similaire # #SBATCH --job-name=salmon_index-builder_%j #SBATCH --output=salmon_index-builder_%j.out #SBATCH --error=salmon_index-builder_%j.err #SBATCH --ntasks=1 #SBATCH --cpus-per-task=4 #SBATCH --mem=7G # # On assume que salmon est sur le $PATH # Sinon, dans une. grappe de calcul, retirer # le # devant la prochaine ligne #module load salmon salmon index \ -p 4 \ -t ./interim_files/gentrome.fa \ -i h_sapiens_r49_index \ -k 31 --decoys ./interim_files/decoys.txt
h_sapiens_r49_index contenant une série de fichiers constituant l'index en question. Lors de l'exécution à venir, on spécifie le répertoire comme site de l'index à utiliser.