BLAST

From CC Doc
Jump to navigation Jump to search
This page is a translated version of the page BLAST and the translation is 100% complete.
Other languages:
English • ‎français


BLAST (pour Basic Local Alignment Search Tool) permet de trouver les régions similaires entre deux ou plusieurs séquences de nucléotides ou d'acides aminés, et de réaliser un alignement de ces régions homologues.

Manuel de l'utilisateur

Vous trouverez plus d'information sur les arguments dans le manuel de l'utilisateur ou en lançant la commande.

Question.png
[name@server ~]$ blastn -help

Bases de données

Certaines bases de données de séquences fréquemment utilisées sont installées sur les grappes de Calcul Canada; consultez Données génomiques.

Accélérer la recherche

Dans les exemples qui suivent, le fichier ref.fa est utilisé comme base de référence au format FASTA et le fichier seq.fa pour les requêtes à faire.

makeblastdb

Avant d'exécuter une recherche, il faut préparer la base de données. Ceci peut se faire par une tâche de prétraitement, avec les autres tâches dépendantes du résultat de la tâche makeblastdb. Voici un exemple d'un script de soumission :

File : makeblastdb.sh

#!/bin/bash

#SBATCH --account=def-<user>  # The account to use
#SBATCH --time=00:02:00       # The duration in HH:MM:SS format
#SBATCH --cpus-per-task=1     # The number of cores
#SBATCH --mem=512M            # Total memory for this task

module load gcc/7.3.0 blast+/2.9.0

# Create the nucleotide database based on `ref.fa`.
makeblastdb -in ref.fa -title reference -dbtype nucl -out ref.fa


Vecteur de tâches

Le parallélisme des données peut grandement améliorer la recherche; il s'agit de diviser le fichier de requêtes en plusieurs requêtes qui se feront à la base de données.

Prétraitement

Pour accélérer la recherche, le fichier seq.fa doit être divisé en plusieurs petites parts. Ces parts devraient être d'au moins 1Mo; des parts plus petites pourraient nuire au système de fichiers parallèles.

Avec l'utilitaire faSplit, la commande

Question.png
[name@server ~]$ module load kentutils/20180716
Question.png
[name@server ~]$ faSplit sequence seqs.fa 10 seq

crée 10 fichiers nommés seqN.faN représente [0..9] pour 10 requêtes (séquences).

Soumettre une tâche

Une fois que les requêtes sont séparées vous pouvez créer une tâche pour chaque fichier seq.fa.N avec un vecteur de tâches. L'identifiant de la tâche contenu dans le vecteur correspondra au nom du fichier où se trouvent les requêtes à exécuter.

Avec cette solution, l'ordonnanceur peut utiliser les ressources de la grappe qui sont disponibles pour exécuter les plus petites tâches.

File : blastn_array.sh

#!/bin/bash

#SBATCH --account=def-<user>  # The account to use
#SBATCH --time=00:02:00       # The duration in HH:MM:SS format of each task in the array
#SBATCH --cpus-per-task=1     # The number of cores for each task in the array
#SBATCH --mem-per-cpu=512M    # The memory per core for each task in the array
#SBATCH --array=0-9           # The number of tasks: 10

module load gcc/7.3.0 blast+/2.9.0

# Using the index of the current task, given by `$SLURM_ARRAY_TASK_ID`, run the corresponding query and write the result
blastn -db ref.fa -query seq.fa.${SLURM_ARRAY_TASK_ID} > seq.ref.${SLURM_ARRAY_TASK_ID}


Avec le script ci-dessus, vous pouvez soumettre votre requête BLAST et elle sera exécutée après que la base de données aura été créée.

Question.png
[name@server ~]$ sbatch --dependency=afterok:$(sbatch makeblastdb.sh) blastn_array.sh

Quand toutes les tâches du vecteur sont terminées, concaténez les résultats avec

Question.png
[name@server ~]$ cat seq.ref.{0..9} > seq.ref

où les 10 fichiers sont concaténés dans seq.ref. Ceci peut s'effectuer à partir du nœud de connexion ou comme tâche indépendante une fois que toutes les tâches du vecteur sont complétées.

GNU Parallel

GNU Parallel est un bon outil pour grouper plusieurs petites tâches en une et la paralléliser. Cette solution réduit les problèmes qui se produisent avec plusieurs petits fichiers dans un système de fichiers parallèles avec des requêtes sur des blocs de taille fixe dans seq.fa avec un cœur et plusieurs nœuds.

Par exemple, pour le fichier seq.fa de 100Mo, vous pourriez lire des blocs de 10Mo et GNU Parallel créerait 3 tâches, utilisant ainsi 3 cœurs; en demandant 10 cœurs, ce sont 7 cœurs qui auraient été gaspillés. La taille des blocs est donc importante. On peut aussi laisser GNU Parallel décider, comme dans l'exemple ci-dessous.

Voir aussi Travailler avec des fichiers volumineux dans la page sur GNU Parallel.

Utiliser plusieurs cœurs dans un nœud

File : blastn_gnu.sh

#!/bin/bash

#SBATCH --account=def-<user>  # The account to use
#SBATCH --time=00:02:00       # The duration in HH:MM:SS format
#SBATCH --cpus-per-task=4     # The number of cores
#SBATCH --mem-per-cpu=512M    # The memory per core

module load gcc/7.3.0 blast+/2.9.0

cmd='blastn -db ref.fa -query - '

# Using the `::::` notation, give the sequences file to GNU parallel
# where
#   --jobs number of core to use, equal $SLURM_CPUS_PER_TASK (the number of cores requested)
#   --keep-order keep same order as given in input
#   --block -1 let GNU Parallel evaluate the block size and adapt
#   --recstart record start, here the sequence identifier `>`
#   --pipepart pipe parts of $cmd together. 
#              `--pipepart` is faster than `--pipe` (which is limited to 500MB/s) as `--pipepart` can easily go to 5GB/s according to Ole Tange.
# and redirect results in `seq.ref`.
parallel --jobs $SLURM_CPUS_PER_TASK --keep-order --block -1 --recstart '>' --pipepart $cmd :::: seq.fa > seq.ref


Note : Le fichier ne doit pas être compressé.

Soumettre une tâche

Avec le script ci-dessus, vous pouvez soumettre votre requête BLAST et elle sera exécutée après que la base de données aura été créée.

Question.png
[name@server ~]$ sbatch --dependency=afterok:$(sbatch makeblastdb.sh) blastn_gnu.sh


Additional tips

  • Si le stockage local du nœud le permet, copiez votre base de données FASTA dans l'espace local /scratch ($SLURM_TMPDIR).
  • Si votre recherche s'y prête, réduisez le nombre de réponses (-max_target_seqs, -max_hsps).
  • Si votre recherche s'y prête, limitez la liste des réponses avec des filtres -evalue pour ne conserver que les réponses quasi identiques.