lancer BLAST (bl2seq) sans créer de fichiers de séquence

J’ai un script qui effectue des requêtes BLAST (bl2seq)

Le script fonctionne comme ceci:

  1. Obtenir la séquence a, séquence b
  2. écrire la séquence a à filea
  3. écrire la séquence b à fileb
  4. exécuter la commande ‘bl2seq -i filea -j fileb -n blastn’
  5. obtenir la sortie de STDOUT, parsingr
  6. répéter 20 millions de fois

Le programme bl2seq ne supporte pas le piping. Est-il possible de faire cela et d’éviter d’écrire / lire sur le disque dur?

J’utilise Python BTW.

    Comment savez-vous que bl2seq ne supporte pas le piping? Au fait, pipes est une fonctionnalité du système d’exploitation, pas le programme. Si votre programme bl2seq génère quelque chose, que ce soit pour STDOUT ou pour un fichier, vous devriez pouvoir parsingr la sortie. Consultez également le fichier d’aide de bl2seq pour connaître les options à afficher dans un fichier, par exemple l’option -o . Ensuite, vous pouvez parsingr le fichier.

    De plus, comme vous utilisez Python, une alternative que vous pouvez utiliser est le module BioPython .

    Selon le système d’exploitation sur lequel vous exécutez, vous pouvez utiliser quelque chose comme la substitution de processus de bash . Je ne sais pas comment vous avez configuré cela en Python, mais vous utilisez essentiellement un canal nommé (ou un descripteur de fichier nommé). Cela ne fonctionnera pas si bl2seq essaie de chercher dans les fichiers, mais cela devrait fonctionner s’il les lit simplement de manière séquentielle.

    Est-ce le programme bl2seq de BioPerl ? Si c’est le cas, il ne semble pas que vous puissiez y faire de la tuyauterie. Vous pouvez, cependant, coder votre propre hack en utilisant Bio::Tools::Run::AnalysisFactory::Pise , qui est la manière recommandée de s’y prendre. Vous devriez le faire en Perl , cependant.

    S’il s’agit d’un bl2seq différent, bl2seq le message. Dans tous les cas, vous devriez probablement fournir plus de détails.

    Sensationnel. Je l’ai compris.

    La réponse est d’utiliser le module de sous-processus et les tubes de python!

    EDIT: j’ai oublié de mentionner que j’utilise blast2 qui supporte la tuyauterie.

    (cela fait partie d’une classe)

     def _query(self): from subprocess import Popen, PIPE, STDOUT pipe = Popen([BLAST, '-p', 'blastn', '-d', self.database, '-m', '8'], stdin=PIPE, stdout=PIPE) pipe.stdin.write('%s\n' % self.sequence) print pipe.communicate()[0] 

    où self.database est une chaîne contenant le nom de fichier de la firebase database, c’est-à-dire que ‘nt.fa’ self.sequence est une chaîne contenant la séquence de requête

    Cela imprime la sortie à l’écran mais vous pouvez facilement l’parsingr. Aucune E / S de disque lente. Pas d’parsing XML lente. Je vais écrire un module pour cela et le mettre sur github.

    De plus, je ne suis pas encore arrivé à ce point, mais je pense que vous pouvez faire plusieurs requêtes pour que la firebase database blast n’ait pas besoin d’être lue et chargée dans la RAM pour chaque requête.

    J’appelle blast2 en utilisant le script R:

     .... system("mkfifo seq1") system("mkfifo seq2") system("echo sequence1 > seq1"), wait = FALSE) system("echo sequence2 > seq2"), wait = FALSE) system("blast2 -p blastp -i seq1 -j seq2 -m 8", intern = TRUE) .... 

    C’est 2 fois plus lent que l’écriture et la lecture du disque dur!