2017-02-20 3 views
1

Ich habe zwei fasta Dateien mit mehreren SequenzenSchleife über IDs von zwei FASTA-Dateien

cat file1.fasta 
>1 
ACGTCGAT 
>2 
ACTTTATT 
>3 
ACGGGG 

cat file2.fasta 
>1 
CCGGAGC 
>2 
TGTCAGTC 
>3 
CTACGTCTT 

Ich habe auch eine Liste von IDs für jede fasta Datei, die ich spezifische Sequenzen von ID zu extrahieren verwenden möchten, stellen Sie eine 2 Sequenz fasta und dann einige Operationen (align, calc distance).

Listen:

cat file1.list 
1 
3 
cat file2.list 
2 
1 

In Wirklichkeit dieser fasta Dateien und Listen sind Tausende von Sequenzen/Zeilen lang

ich in den Listen über jede Zeile Schleife versuchen die fasta Datei zu extrahieren, dass Spiele bestimmte ID/Zeile, dann kombinieren Sie die Fasta-Sequenz aus jeder Datei in eine zwei Sequenz Fasta-Datei, die ausgerichtet werden kann, usw. Grundsätzlich möchte ich eine paarweise Ausrichtung von jeder Fasta-Sequenz mit seinem "Paar". Also, basierend auf dem Beispiel hier und der Reihenfolge der Listen-ID, möchte ich die Fasta-Sequenz 1 von file1.fasta mit Fasta-Sequenz 2 von file2.fasta paaren und dann mit dem nächsten Paar fortfahren (Sequenz 3 von Datei1). Fasta, und Sequenz 1 von file2.fasta, etc). Extrahieren von Fasta-Sequenzen basierend auf ID ist relativ einfach (ein paar Möglichkeiten, es zu tun), aber man ist faOneRecord, die nur als Eingabe die Fasta-Datei, aus der Sie extrahieren möchten, dann den Datensatz/ID, die Sie finden möchten, und gibt das Fasta zurück Sequenz und Header:

faOneRecord <in.fa> <recordName> 

so, nach der ersten Schleife, würde ich diese Datei auf der Grundlage der ID-Liste erstellt hat:

>1 
ACGTCGAT 
>2 
TGTCAGTC 

und so weiter.

Ich würde denken, das ist relativ einfach zu tun, aber ich kann nicht scheinen, dorthin zu gelangen. Dann, sobald ich diese 2 Sequenz fasta, jede Schleife mache, möchte ich ausrichten und Entfernungsschätzungen erhalten, in eine Datei ausdrucken und zur nächsten Schleife gehen. Der Rest davon kann etwas Arbeit erfordern und erfordert spezielle Programme, aber ich brauche Hilfe, nur die 2 Sequenz Fasta extrahiert/über die Ids Looping zu produzieren.

Ich denke, die große Frage ist, wie über die IDs Schleife und dann Rohr diese IDs als Argumente in den faOneRecord Befehl

Dies könnte zu spezifisch sein, und wenn ja, entschuldige ich mich, aber alle Ideen auf, wie man gestartet wäre hilfreich und sehr geschätzt.

+0

Müssen Sie wirklich Bash verwenden? Dies ist ein Problem, das trivial in einer Sprache gelöst werden kann, in der Sie sowohl Fasta-Dateien öffnen als auch die Sequenzen in einem Array speichern können und bei denen Sie die Listendateien parallel durchlaufen können. Beides ist in bash sehr schwierig. – Marian

+0

Es muss nicht in bash sein ... Ich muss einfach Programme in bash aufrufen. Eine Python (Biopython) Lösung ist wahrscheinlich einfacher, aber ich bin nicht sehr versiert. Hast du einen Vorschlag wie man das in Python startet? – user95146

Antwort

1

Hier ist eine (unvollständige) Skizze einer Python-Lösung. Wie ich im Kommentar gesagt habe, gibt es zwei Schritte:

Zuerst lesen Sie beide Dateien in Arrays. Wenn Sie sicher sind, sind sie genau wie in Ihrem Beispiel, können Sie einfach die >x Linien ignorieren:

fasta1 = [''] # make sure the first item is saved to fasta1[1], not fasta[0] 
for line in open('file1.fasta'): 
    if not line.startswith('>'): 
     fasta1.append(line.strip()) 

Die for line in open() einfach die Datei und iteriert über seine Linien eröffnet.

Machen Sie dasselbe für Datei2.Dann können Sie die list Dateien abwechselnd lesen, bekommen Sie die Zahlen aus und drucken Sie die passende Sequenz:

for l1, l2 in zip(open('file1.list'), open('file2.list')): 
    print(fasta1[int(l1)]) 
    print(fasta2[int(l1)]) 

zip nimmt die beiden Dateien und liest sie parallel, so dass das erste Mal wird die Schleife ausgeführt, l1 und l2 enthalten die erste Zeile von file1.list bzw. file2.list; das zweite Mal, es ist die zweite Zeile von jedem usw.

+0

Danke. Das hat mich angefangen. Ein Thema - Wrapping von Fasta-Sequenzen ... In der Realität sind viele dieser Fasta-Sequenzen 100 bis einige tausend Bp lang, und die Sequenzen winden sich über Linien. Ich habe das Skript mit Wrapped Fasta getestet und es druckt nur die erste Zeile ... Kann ich damit umgehen? vielleicht wird der biopython Parser benötigt? Oder ich könnte die Folgen linearisieren. – user95146

+0

Wenn biopython eine Funktion hat, diese Dateien zu analysieren, benutzen Sie das. Der von mir vorgeschlagene Code ist nur ein schneller Hack. Zur Vervollständigung, hier ist, wie ich mit den Zeilen in reinem Python umgehen würde: Speichern Sie die Zeilen ('.strip()' ed) in einer zweiten Liste, und wenn Sie auf eine '> n' Zeile treffen,' '.join () 'all diese Zeilen und hänge sie an' fasta1' an. – Marian

+0

Danke. Wenn IDs in den 'list'-Dateien fehlen, wie können wir dann' list Index outof Range 'behandeln? Müsste ich jeden Indexing-Aufruf mit einem Fehler behandeln? Dh '
für l1, l2 in zip (open (' file1. Liste '), open (' file2.list ')): Versuch: a = fasta1 [int (l1)] außer Indexerror, e: print "GGG" ' CONTINUE – user95146

Verwandte Themen