2011-04-16 9 views
6

Zaten hizalanmış sıraları kaydetmeye çalışıyorum. verilen parametrelereHizalama parametreleri verildiğinde hizalanmış sıralar için bir skor hesaplayabilen bir fonksiyon var mı?

substitution matrix : blosum62 
gap open penalty : -5 
gap extension penalty : -1 
Ben BioPython yemek kitabı aracılığıyla benziyordu

ile

seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE' 
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE' 

diyelim ama olsun bütün ikame matris blogsum62 ama birisi zaten kütüphanede bu tür uygulamaya sahip olması gerektiğini hissediyorum .

Bu yüzden sorunumu çözebilecek herhangi bir kitaplık veya en kısa kodu öneren var mı? önceden

Thx

+0

Kodunuzu düzgün şekilde biçimlendirin. –

+0

neden basitçe vurmuyorsunuz? Biopython blastall ile yapabilirsiniz. – joaquin

cevap

8

Jessada,

BLOSUM62 matrisidir (yazım not edin;) Bio.SubsMat.MatrixInfo olduğunu ve (bu yüzden ('A', 'A') değerinde 4 puan olan) küpe skorlarına çözümleyen bir sözlük . Boşlukları yok, ve matrisin sadece bir üçgeni (yani, ('T', 'A') olabilir ama ('A', 'T') değil, Biopython'da bazı yardımcı fonksiyonlar vardır. Bio.Pairwise bazı dahil, ancak bu ben ile geldi budur bir cevap olarak:. sizin uyum için 82 döndürür

from Bio.SubsMat import MatrixInfo 

def score_match(pair, matrix): 
    if pair not in matrix: 
     return matrix[(tuple(reversed(pair)))] 
    else: 
     return matrix[pair] 

def score_pairwise(seq1, seq2, matrix, gap_s, gap_e): 
    score = 0 
    gap = False 
    for i in range(len(seq1)): 
     pair = (seq1[i], seq2[i]) 
     if not gap: 
      if '-' in pair: 
       gap = True 
       score += gap_s 
      else: 
       score += score_match(pair, matrix) 
     else: 
      if '-' not in pair: 
       gap = False 
       score += score_match(pair, matrix) 
      else: 
       score += gap_e 
    return score 

seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE' 
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE' 

blosum = MatrixInfo.blosum62 

score_pairwise(seq1, seq2, blosum, -5, -1) 

Orada tüm bu yapmak için neredeyse certianly güzel yollar, ama bu bir iyi olmalı başlatın.

5

blosum62 276 öğelerin bir dictonary olduğunu. Ben sadece 276 dönüşlerin bir iterasyon temsil ettiği, eksik öğeleri ile tamamlamak için tercih

, diziler ar analiz edilecek ise e 276'dan fazla elemente sahip olması muhtemeldir. Sonuç olarak, her bir çiftin skorunu skor_match() işleviyle bulursanız, bu işlev dizilerin her bir öğesi için if pair not in matrix testini gerçekleştirmelidir, yani kesinlikle 276 kattan fazla.

Çok zaman alan başka bir şey: her bir score += something, yeni bir tam sayı oluşturur ve bu yeni nesneye puanı adını bağlar. Her bir bağlanma, mevcut miktara derhal eklenen bir jeneratör tarafından bir tamsayı akışıyla mevcut olmayan bir miktar süreyi alır. verim yerine dönüş çünkü

from Bio.SubsMat.MatrixInfo import blosum62 as blosum 
from itertools import izip 

blosum.update(((b,a),val) for (a,b),val in blosum.items()) 

def score_pairwise(seq1, seq2, matrix, gap_s, gap_e, gap = True): 
    for A,B in izip(seq1, seq2): 
     diag = ('-'==A) or ('-'==B) 
     yield (gap_e if gap else gap_s) if diag else matrix[(A,B)] 
     gap = diag 

seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE' 
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE' 

print sum(score_pairwise(seq1, seq2, blosum, -5, -1)) 

Bu score_pairwise() bir jeneratör fonksiyonudur.

İlgili konular