2016-07-26 17 views
1

Ausgehend von einer Liste von DNA-Sequenzen, muss ich im Gegenzug alle möglichen Konsensussequenzen (die resultierende Sequenz mit der höchsten Nukleotidfrequenz an jeder Position) Sequenzen haben. Wenn in einigen Positionen die Nukleotide die gleiche höchste Frequenz haben, muss ich alle möglichen Kombinationen mit der höchsten Häufigkeit erhalten. Ich muss auch im Gegenzug die Profilmatrix (eine Matrix mit den Frequenzen jedes Nukleotids für jede Sequenz) haben.Python: Multiple Consensus-Sequenzen

Dies ist mein Code so weit (aber es gibt nur eine Konsensus-Sequenz):

seqList = ['TTCAAGCT','TGGCAACT','TTGGATCT','TAGCAACC','TTGGAACT','ATGCCATT','ATGGCACT'] 
n = len(seqList[0]) 
profile = { 'T':[0]*n,'G':[0]*n ,'C':[0]*n,'A':[0]*n } 

for seq in seqList: 

    for i, char in enumerate(seq): 
     profile[char][i] += 1 



consensus = "" 
for i in range(n): 
    max_count = 0 
    max_nt = 'x' 
    for nt in "ACGT": 
     if profile[nt][i] > max_count: 
      max_count = profile[nt][i] 
      max_nt = nt 
    consensus += max_nt 
print(consensus) 
for key, value in profile.items(): 
    print(key,':', " ".join([str(x) for x in value])) 

TTGCAACT 
C : 0 0 1 3 2 0 6 1 
A : 2 1 0 1 5 5 0 0 
G : 0 1 6 3 0 1 0 0 
T : 5 5 0 0 0 1 1 6 

(Wie Sie sehen können, in Position vier, C und G die gleiche höchste Punktzahl haben, bedeutet das, ich muss Erhalten Sie zwei Konsensus-Sequenzen)

Ist es möglich, diesen Code zu ändern, um alle möglichen Sequenzen zu erhalten, oder könnten Sie mir die Logik (der Pseudocode) erklären, wie Sie das richtige Ergebnis erhalten?

Vielen Dank im Voraus!

+0

Derzeit Code druckt nur die letzte seq, nicht der Konsens ein –

+0

Danke, Ohad, sorry für die Fehler, ich habe meinen Code korrigiert, jetzt sollte ich den Konsens zurückgeben. (aber nur einer, so bleibt das Hauptproblem :). Über Ihre Antwort muss die Ausgabe die gesamten zwei Sequenzen anzeigen. – 3lli0t

+0

das für Sie behoben –

Antwort

1

Ich bin sicher, gibt es bessere Möglichkeiten, aber das ist einfach:

bestseqs = [[]] 
for i in range(n): 
    d = {N:profile[N][i] for N in ['T','G','C','A']} 
    m = max(d.values()) 
    l = [N for N in ['T','G','C','A'] if d[N] == m] 
    bestseqs = [ s+[N] for N in l for s in bestseqs ] 

for s in bestseqs: 
    print(''.join(s)) 

# output: 
ATGGAACT 
ATGCAACT 
+0

@ 3lli0t Gern geschehen. Sie sollten die Antwort akzeptieren. –

+1

fertig;) danke nochmal! – 3lli0t