2016-11-03 3 views
3

Ich schreibe ein Python-Skript und möchte die Informationen zur Abfragesequenz nach Möglichkeit in blastn als String-Variable und nicht als FASTA-Datei übergeben.Ist es möglich, eine String-Variable anstelle einer Datei an eine BLAST-Suche zu übergeben?

Ich verwendete Biopython SeqIO, um mehrere Transkriptnamen als Schlüssel und seine Sequenzen als zugehörigen Wert zu speichern.

So sieht es so etwas wie diese

transcripts = dict() 
for record in SeqIO.parse("transcript_sequences.fasta", "fasta"): 
transcripts[record.name] = record.seq 

print transcripts 

So das Wörterbuch wie folgt aussieht

{'var_F': Seq('CTTCATTCTCGTTTAGCGGCTGCTCGTGGAAATTTCGAAAAAATCTGAAACTAG...TGC', SingleLetterAlphabet())} 

Jetzt habe ich in der Sequenzinformation im Wörterbuch in die Hoch Abfrage und vorbehaltlich analysieren möge.

subprocess.call("blastn -query " + transcript['var_F'] + ".txt" + " -subject " + transcript['var_B'] + " -outfmt 6 > tmp_blast.txt", shell=True) 

Ich weiß Explosion nur in entweder Dateinamen oder eine Zeichenfolge für den Speicherort der Datei dauert, aber ich wollte nur wissen, ob es eine Abhilfe für dieses ist.

Vielen Dank im Voraus für meine erste Frage zu lesen: P

Antwort

2

Vom biopython Modul für BLAST:

http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc90

Es scheint, dass Sie in diesem biopython BLAST korrekt sind nicht SeqIO Objekt unterstützen oder biologische Sequenz als Parameter für BLAST-Funktionsaufruf, oder wie Sie mit subprocess.call() der BLAST-Binärdatei durchführen. Der einzige akzeptierte Eingabesequenzparameter ist ein Dateiname. Aus dem Tutorial:

>>> from Bio.Blast.Applications import NcbiblastxCommandline 
>>> help(NcbiblastxCommandline) 
... 
>>> blastx_cline = NcbiblastxCommandline(query="opuntia.fasta", db="nr", evalue=0.001, 
...          outfmt=5, out="opuntia.xml") 
>>> blastx_cline 
NcbiblastxCommandline(cmd='blastx', out='opuntia.xml', outfmt=5, query='opuntia.fasta', 
db='nr', evalue=0.001) 
>>> print(blastx_cline) 
blastx -out opuntia.xml -outfmt 5 -query opuntia.fasta -db nr -evalue 0.001 
>>> stdout, stderr = blastx_cline() 

So ist Ihre einzige Option, die tatsächliche FASTA-Datei als Eingabe zu verwenden. Wenn Sie jeweils eine Sequenz abfragen möchten, müssen Sie jede Sequenz in einer Datei speichern. Ich würde dies jedoch empfehlen, es sei denn, Sie haben einen Grund dazu. Ich denke, BLAST könnte schneller ausführen, wenn alle Abfrage-Sequenzen in der gleichen Datei sind. Auch können Sie den resultierenden BLAST-Ausgang mit biopython lesen über die Ergebnisse für jede Abfrage iterieren finden Sie unter:

http://biopython.org/DIST/docs/tutorial/Tutorial.html#htoc92

Beispiel aus dem obigen Link genommen:

Wenn Sie stattdessen BLASEN eine andere Art und Weise laufen, und hat den BLAST-Ausgang (im XML-Format) in der Datei my_blast.xml, alles, was Sie tun müssen, ist die Datei zum Lesen zu öffnen:

>>> result_handle = open("my_blast.xml") 
>>> from Bio.Blast import NCBIXML 
>>> blast_record = NCBIXML.read(result_handle) 

oder, wenn Sie viele Ergebnisse haben (dh mehrere Abfrage Sequenzen):

>>> from Bio.Blast import NCBIXML 
>>> blast_records = NCBIXML.parse(result_handle) 

Genau wie Bio.SeqIO und Bio.AlignIO (siehe Kapitel 5 und 6), haben wir ein Paar von Eingabefunktionen, lesen und analysieren, wo Lese für ist, wenn Sie genau ein Objekt haben, und Parse ist ein Iterator für den Fall, dass Sie viele Objekte haben können - aber anstatt SeqRecord- oder MultipleSeqAlignment-Objekte zu erhalten, erhalten wir BLAST-Record-Objekte.

Um mit der Situation umgehen zu können, in der die BLAST-Datei möglicherweise sehr groß ist und Tausende von Ergebnissen enthält, gibt NCBIXML.parse() einen Iterator zurück.Im Klartext, ermöglicht ein Iterator Sie durch die BLAST-Ausgabe zu dem Schritt Aufzeichnungen eines für jedes BLAST Suchergebnis durch einen BLAST Abrufen:

>>> from Bio.Blast import NCBIXML 
>>> blast_records = NCBIXML.parse(result_handle) 
>>> blast_record = next(blast_records) 
# ... do something with blast_record 
>>> blast_record = next(blast_records) 
# ... do something with blast_record 
>>> blast_record = next(blast_records) 
# ... do something with blast_record 
>>> blast_record = next(blast_records) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
StopIteration 
# No further records 
0

Sie die Sequenz als Zeichenfolge im FASTA-Format zu Standardeingabe passieren können, wenn Sie führe den Blast-Befehl aus.

query_string = '>' + record.description + '\n' + str(record.seq) 
blast_command = Bio.Blast.Applications.NcbiblastnCommandline(cmd='blastn', out=record.id + '.xml', outfmt=5, db=database_name, evalue=0.001) 
stdout, stderr = blast_command(stdin=query_string) 
Verwandte Themen