0

mein Problem ist sehr einfach, aber ich kann nicht herausfinden, wie man es löst. Ich habe eine Liste von etwa einer Million Sequenzen und jeder von ihnen muss mit einem Sequenzierungsadapter ausgerichtet werden. Ich denke, die Ausrichtung in Python mit paarwise2-Tools von Biopython zu tun. Ich möchte dieses Werkzeug benutzen, weil ich alle Ausrichtungspunkte sammeln muss, einige Mathe tun und die Folgen auf der Mathe wählen muss. Wenn ich den Code unten ausführe, funktioniert es, aber es ist langsam, weil nur eine Ausrichtung pro Zeit ausgeführt wird.Multithreads in Python über eine große Multifasta

def align_call(record, adapter): 
score = pairwise2.align.localms(record.seq, adapter.seq, 1, -3, -1, -0.99, one_alignment_only=1, score_only=1) 
print record.id + " " + record.seq + " " + adapter.id + " " + str(score) 
#results.append(line) 
return 

if __name__ == '__main__':  
fastaSeq = argv[1] 
threads = argv[2] 
fastaAdapt = argv[3] 
listSeq = [] 
adpt = list(SeqIO.parse(fastaAdapt, "fasta")) 
for record in SeqIO.parse(fastaSeq, "fasta"): 
    align_call(record, adpt[0]) 

Daher dachte ich, den Code zu ändern und Multithreading oder Multiprozess verwendet Prozess zu beschleunigen, indem eine Anzahl n von parallelen Jobs Senden von der Anzahl der Threads aus, dass der Computer aufweist. So kam ich so etwas nach oben:

results = [] 

def align_call(record, adapter): 
score = pairwise2.align.localms(record.seq, adapter.seq, 1, -3, -1, -0.99, one_alignment_only=1, score_only=1) 
line = record.id + " " + record.seq + " " + adapter.id + " " + str(score) 
results.append(line) 
return results 

if __name__ == '__main__':  
fastaSeq = argv[1] 
threads = argv[2] 
fastaAdapt = argv[3] 

listSeq = [] 
adpt = list(SeqIO.parse(fastaAdapt, "fasta")) 
for record in SeqIO.parse(fastaSeq, "fasta"): 
    pool = Pool(processes=1) 
    result = pool.apply_async(align_call, args= (record, adpt[0])) 
    print result.get() 

Das Skript funktioniert, aber ich kann nicht modulieren, wie viel Sequenz und sein muß jedes Mal senden, wenn ich eine Menge von ihnen zu bekommen, ich laufe aus Kern und Speichern.

Irgendeine Idee, wie ich das tun kann? Vorschläge? Ich habe versucht, durch Queue Umsetzung aber nicht

Dank Luigi

Antwort

0

Sie wollten arbeiten, könnten in vsearch suchen (oder usearch) Es ist ziemlich schnell! und unterstützt Multi-Threading

https://github.com/torognes/vsearch

vsearch --usearch_global big.fasta -db adapter_seq.fasta --uc outputfile.txt --id 0.8 --iddef 0 --threads 6 

--id ist die maximale Differenz% von der Zielsequenz, die Sie (80% in diesem Fall), ermöglichen

--iddef 0 die Bewertungsmethode 0 = Identität auf Basis der kürzesten Sequenz, 2 = Streifen terminal Lücken ...)

Sie können dann lesen Sie in dieser outputfile.txt und greifen Sie auf die Ausrichtung Scores/Übereinstimmungen/Lücken/Ausrichtung Länge Abfrage Name ... für jede Sequenz. Mit den gewünschten Abfragenamen gesammelt, können Sie diese verwenden, um die relevanten Sequenzen aus der Original-Fasta-Datei

ziehen Wenn Sie möchten nur die Sequenzen, die größer als x% zum Adapter passen, können Sie verwenden - Matched, anstelle von --uc, was Ihnen eine Fasta-Datei der Sequenzen gibt, die über dem Grenzwert -id liegen.

Alternativ gibt Ihnen --samout eine Sam-Datei mit dem Seq-Namen, der Ausrichtungslänge, dem Zigarrencode für die Ausrichtung sowie der Abfragesequenz.

https://github.com/torognes/vsearch/releases/download/v2.7.1/vsearch_manual.pdf hat den vollen Satz von Ausgabeoptionen und Befehlen

Verwandte Themen