Bioinformatyka: Wykład 2 Algorytm Smitha Watermana implementacja w języku Python
Przyrównanie sekwencji Algorytm Smitha-Watermana dla pary sekwencji P i Q o długościach odpowiednio M i N. Zbuduj macierz prostokątną H o wymiarze MxN Wypełnij macierz tak, że H[i,j] jest miarą podobieństwa między i- tym aminokwasem z P i j-tym aminokwasem z Q Przetwórz macierz, zaczynając od górnego lewego roku używając wzoru H [ i, j] = max k max k H [ i 1, j 1]+ H [ i, j] ( H [ i,k] GapPenalty( i, j,k) ) ( H [ k, j] GapPenalty( i, j,k) ) 0
Macierze podobieństwa aminokwasów Otrzymane z częstości obserwowanych mutacji M ij = a log 2 f ( A A ) i j ( ) ( )! " # $ # f A f A $ % i j & # Matrix made by matblas from blosum62.iij # * column uses minimum score # BLOSUM Clustered Scoring Matrix in 1/2 Bit Units # Blocks Database = /data/blocks_5.0/blocks.dat # Cluster Percentage: >= 62 # Entropy = 0.6979, Expected = -0.5209
A R N D C Q E G H I L K M F P S T W Y V A 4-1 -2-2 0-1 -1 0-2 -1-1 -1-1 -2-1 1 0-3 -2 0 R -1 5 0-2 -3 1 0-2 0-3 -2 2-1 -3-2 -1-1 -3-2 -3 N -2 0 6 1-3 0 0 0 1-3 -3 0-2 -3-2 1 0-4 -2-3 D -2-2 1 6-3 0 2-1 -1-3 -4-1 -3-3 -1 0-1 -4-3 -3 C 0-3 -3-3 9-3 -4-3 -3-1 -1-3 -1-2 -3-1 -1-2 -2-1 Q -1 1 0 0-3 5 2-2 0-3 -2 1 0-3 -1 0-1 -2-1 -2 E -1 0 0 2-4 2 5-2 0-3 -3 1-2 -3-1 0-1 -3-2 -2 G 0-2 0-1 -3-2 -2 6-2 -4-4 -2-3 -3-2 0-2 -2-3 -3 H -2 0 1-1 -3 0 0-2 8-3 -3-1 -2-1 -2-1 -2-2 2-3 I -1-3 -3-3 -1-3 -3-4 -3 4 2-3 1 0-3 -2-1 -3-1 3 L -1-2 -3-4 -1-2 -3-4 -3 2 4-2 2 0-3 -2-1 -2-1 1 K -1 2 0-1 -3 1 1-2 -1-3 -2 5-1 -3-1 0-1 -3-2 -2 M -1-1 -2-3 -1 0-2 -3-2 1 2-1 5 0-2 -1-1 -1-1 1 F -2-3 -3-3 -2-3 -3-3 -1 0 0-3 0 6-4 -2-2 1 3-1 P -1-2 -2-1 -3-1 -1-2 -2-3 -3-1 -2-4 7-1 -1-4 -3-2 S 1-1 1 0-1 0 0 0-1 -2-2 0-1 -2-1 4 1-3 -2-2 T 0-1 0-1 -1-1 -1-2 -2-1 -1-1 -1-2 -1 1 5-2 -2 0 W -3-3 -4-4 -2-2 -3-2 -2-3 -2-3 -1 1-4 -3-2 11 2-3 Y -2-2 -2-3 -2-1 -2-3 2-1 -1-2 -1 3-3 -2-2 2 7-1 V 0-3 -3-3 -1-2 -2-3 -3 3 1-2 1-1 -2-2 0-3 -1 4
R Q E K D N H T S A G Y W F I L V M C P R 5 1 0 2-2 0 0-1 -1-1 -2-2 -3-3 -3-2 -3-1 -3-2 Q 1 5 2 1 0 0 0-1 0-1 -2-1 -2-3 -3-2 -2 0-3 -1 E 0 2 5 1 2 0 0-1 0-1 -2-2 -3-3 -3-3 -2-2 -4-1 K 2 1 1 5-1 0-1 -1 0-1 -2-2 -3-3 -3-2 -2-1 -3-1 D -2 0 2-1 6 1-1 -1 0-2 -1-3 -4-3 -3-4 -3-3 -3-1 N 0 0 0 0 1 6 1 0 1-2 0-2 -4-3 -3-3 -3-2 -3-2 H 0 0 0-1 -1 1 8-2 -1-2 -2 2-2 -1-3 -3-3 -2-3 -2 T -1-1 -1-1 -1 0-2 5 1 0-2 -2-2 -2-1 -1 0-1 -1-1 S -1 0 0 0 0 1-1 1 4 1 0-2 -3-2 -2-2 -2-1 -1-1 A -1-1 -1-1 -2-2 -2 0 1 4 0-2 -3-2 -1-1 0-1 0-1 G -2-2 -2-2 -1 0-2 -2 0 0 6-3 -2-3 -4-4 -3-3 -3-2 Y -2-1 -2-2 -3-2 2-2 -2-2 -3 7 2 3-1 -1-1 -1-2 -3 W -3-2 -3-3 -4-4 -2-2 -3-3 -2 2 11 1-3 -2-3 -1-2 -4 F -3-3 -3-3 -3-3 -1-2 -2-2 -3 3 1 6 0 0-1 0-2 -4 I -3-3 -3-3 -3-3 -3-1 -2-1 -4-1 -3 0 4 2 3 1-1 -3 L -2-2 -3-2 -4-3 -3-1 -2-1 -4-1 -2 0 2 4 1 2-1 -3 V -3-2 -2-2 -3-3 -3 0-2 0-3 -1-3 -1 3 1 4 1-1 -2 M -1 0-2 -1-3 -2-2 -1-1 -1-3 -1-1 0 1 2 1 5-1 -2 C -3-3 -4-3 -3-3 -3-1 -1 0-3 -2-2 -2-1 -1-1 -1 9-3 P -2-1 -1-1 -1-2 -2-1 -1-1 -2-3 -4-4 -3-3 -2-2 -3 7
A R N D C Q E G H I L K M F P S T W Y V A 2-2 0 0-2 0 0 1-1 -1-2 -1-1 -3 1 1 1-6 -3 0 R -2 6 0-1 -4 1-1 -3 2-2 -3 3 0-4 0 0-1 2-4 -2 N 0 0 2 2-4 1 1 0 2-2 -3 1-2 -3 0 1 0-4 -2-2 D 0-1 2 4-5 2 3 1 1-2 -4 0-3 -6-1 0 0-7 -4-2 C -2-4 -4-5 12-5 -5-3 -3-2 -6-5 -5-4 -3 0-2 -8 0-2 Q 0 1 1 2-5 4 2-1 3-2 -2 1-1 -5 0-1 -1-5 -4-2 E 0-1 1 3-5 2 4 0 1-2 -3 0-2 -5-1 0 0-7 -4-2 G 1-3 0 1-3 -1 0 5-2 -3-4 -2-3 -5 0 1 0-7 -5-1 H -1 2 2 1-3 3 1-2 6-2 -2 0-2 -2 0-1 -1-3 0-2 I -1-2 -2-2 -2-2 -2-3 -2 5 2-2 2 1-2 -1 0-5 -1 4 L -2-3 -3-4 -6-2 -3-4 -2 2 6-3 4 2-3 -3-2 -2-1 2 K -1 3 1 0-5 1 0-2 0-2 -3 5 0-5 -1 0 0-3 -4-2 M -1 0-2 -3-5 -1-2 -3-2 2 4 0 6 0-2 -2-1 -4-2 2 F -3-4 -3-6 -4-5 -5-5 -2 1 2-5 0 9-5 -3-3 0 7-1 P 1 0 0-1 -3 0-1 0 0-2 -3-1 -2-5 6 1 0-6 -5-1 S 1 0 1 0 0-1 0 1-1 -1-3 0-2 -3 1 2 1-2 -3-1 T 1-1 0 0-2 -1 0 0-1 0-2 0-1 -3 0 1 3-5 -3 0 W -6 2-4 -7-8 -5-7 -7-3 -5-2 -3-4 0-6 -2-5 17 0-6 Y -3-4 -2-4 0-4 -4-5 0-1 -1-4 -2 7-5 -3-3 0 10-2 V 0-2 -2-2 -2-2 -2-1 -2 4 2-2 2-1 -1-1 0-6 -2 4
Przyrównanie sekwencji Algorytm Smitha-Watermana dla pary sekwencji P i Q o długościach odpowiednio M i N. Zbuduj macierz prostokątną H o wymiarze MxN Wypełnij macierz tak, że H[i,j] jest miarą podobieństwa między i- tym aminokwasem z P i j-tym aminokwasem z Q Przetwórz macierz, zaczynając od górnego lewego roku używając wzoru H [ i, j] = max k max k H [ i 1, j 1]+ H [ i, j] ( H [ i,k] GapPenalty( i, j,k) ) ( H [ k, j] GapPenalty( i, j,k) ) 0
Przyrównanie sekwencji Algorytm Smitha-Watermana dla pary sekwencji P i Q o długościach odpowiednio M i N. Zbuduj macierz prostokątną H o wymiarze MxN Wypełnij macierz tak, że H[i,j] jest miarą podobieństwa między i- tym aminokwasem z P i j-tym aminokwasem z Q Przetwórz macierz, zaczynając od górnego lewego roku używając wzoru H i 1, j 1!! H [ i, j] = max k max k [ ]+ H [ i, j] H [ i,k] GapPenalty i, j, k H [ k, j] GapPenalty i, j, k ( ( )) ( ) ( ) 0 Znajdź wartość maksymalną Znajdź ścieżkę wiodącą od wartości 0 do wartości maksymalnej Znaleziona ścieżka jest najlepszym przyrównaniem lokalnym sekwencji P i Q
Algorytm Smitha Watermana Podany wzór jest ogólny jest prawdziwy dla dowolnej funkcji GapPenalty() Algorytm ma złożoność obliczeniową O(MxNx(M+N)) - dla każdego z MxN elementów macierzy musimy wyznaczyć maksimum funkcji dla kolumny i dla wiersza H [ i, j] = max k max k H [ i 1, j 1]+ H [ i, j] ( H [ i,k] GapPenalty( i, j,k) ) ( H [ k, j] GapPenalty( i, j,k) ) 0
Algorytm Smitha Watermana Jeżeli funkcja GapPenalty() ma postać: GapPenalty() = GapOpening + k*gapextension gdzie k jest długością przerwy Istnieje wersja algorytmu ze złożonością obliczeniową O(MxN), zaproponowana przez Osamu Gotoha (1982) H [ i, j] = max H [ i 1, j 1]+ H i, j [ ] [ ] E i, j F i, j 0 [ ] E[ i, j] = max F[ i, j] = max E[ i, j 1] GapExt H [ i, j 1] GapOpen GapExt F[ i 1, j] GapExt H [ i 1, j] GapOpen GapExt
Algorytm SWalign w Pythonie Założenia implementacja wersji podstawowej - wersja Gotoh samodzielnie wczytujemy: macierz podobieństwa dwie sekwencje obliczamy algorytmem SW punktację - jeżeli jest powyżej poziomu odcięcia to wołamy algorytm raz jeszcze, w wersji z wyliczaniem przyrównania
Algorytm SWalign w Pythonie Funkcja w Pythonie implementująca taką sekwencję działań def SW_align(Matrix_name,s1_name,s2_name,GapOpen,GapExt,Threshold): result = read_blosum(matrix_name) SimMat = result[2] RevIndx = result[1] S1 = read_fasta(s1_name) S2 = read_fasta(s2_name) Score = SW_align_simple(S1,S2,SimMat,RevIndx,GapOpen,GapExt) if Score > Threshold: tmp = SW_align_trace(S1,S2,SimMat,RevIndx,GapOpen,GapExt) Ftrace = SW_build_traceback(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],S1,S2) Alignment = SW_build_alignment(Ftrace,S1,S2) return(alignment) else : print(' Below threshold (',Threshold,')') return()
Algorytm SWalign w Pythonie Funkcja w Pythonie implementująca taką sekwencję działań def SW_align(Matrix_name,s1_name,s2_name,GapOpen,GapExt,Threshold): result = read_blosum(matrix_name) SimMat = result[2] RevIndx = result[1] S1 = read_fasta(s1_name) S2 = read_fasta(s2_name) Score = SW_align_simple(S1,S2,SimMat,RevIndx,GapOpen,GapExt) if Score > Threshold: tmp = SW_align_trace(S1,S2,SimMat,RevIndx,GapOpen,GapExt) Ftrace = SW_build_traceback(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],S1,S2) Alignment = SW_build_alignment(Ftrace,S1,S2) return(alignment) else : print(' Below threshold (',Threshold,')') return()
Algorytm SWalign w Pythonie. Funkcja w Pythonie implementująca taką sekwencję działań def SW_align(Matrix_name,s1_name,s2_name,GapOpen,GapExt,Threshold): result = read_blosum(matrix_name) SimMat = result[2] RevIndx = result[1] S1 = read_fasta(s1_name) S2 = read_fasta(s2_name) Score = SW_align_simple(S1,S2,SimMat,RevIndx,GapOpen,GapExt) if Score > Threshold: tmp = SW_align_trace(S1,S2,SimMat,RevIndx,GapOpen,GapExt) Ftrace = SW_build_traceback(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],S1,S2) Alignment = SW_build_alignment(Ftrace,S1,S2) return(alignment) else : print(' Below threshold (',Threshold,')') return()
Algorytm SWalign w Pythonie. Funkcja w Pythonie implementująca taką sekwencję działań def SW_align(Matrix_name,s1_name,s2_name,GapOpen,GapExt,Threshold): result = read_blosum(matrix_name) SimMat = result[2] RevIndx = result[1] S1 = read_fasta(s1_name) S2 = read_fasta(s2_name) Score = SW_align_simple(S1,S2,SimMat,RevIndx,GapOpen,GapExt) if Score > Threshold: tmp = SW_align_trace(S1,S2,SimMat,RevIndx,GapOpen,GapExt) Ftrace = SW_build_traceback(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],S1,S2) Alignment = SW_build_alignment(Ftrace,S1,S2) return(alignment) else : print(' Below threshold (',Threshold,')') return()
Algorytm SWalign w Pythonie. Funkcja w Pythonie implementująca taką sekwencję działań def SW_align(Matrix_name,s1_name,s2_name,GapOpen,GapExt,Threshold): result = read_blosum(matrix_name) SimMat = result[2] RevIndx = result[1] S1 = read_fasta(s1_name) S2 = read_fasta(s2_name) Score = SW_align_simple(S1,S2,SimMat,RevIndx,GapOpen,GapExt) if Score > Threshold: tmp = SW_align_trace(S1,S2,SimMat,RevIndx,GapOpen,GapExt) Ftrace = SW_build_traceback(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],S1,S2) Alignment = SW_build_alignment(Ftrace,S1,S2) return(alignment) else : print(' Below threshold (',Threshold,')') return()
Algorytm SWalign w Pythonie. Funkcja w Pythonie implementująca taką sekwencję działań def SW_align(Matrix_name,s1_name,s2_name,GapOpen,GapExt,Threshold): result = read_blosum(matrix_name) SimMat = result[2] RevIndx = result[1] S1 = read_fasta(s1_name) S2 = read_fasta(s2_name) Score = SW_align_simple(S1,S2,SimMat,RevIndx,GapOpen,GapExt) if Score > Threshold: tmp = SW_align_trace(S1,S2,SimMat,RevIndx,GapOpen,GapExt) Ftrace = SW_build_traceback(tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],S1,S2) Alignment = SW_build_alignment(Ftrace,S1,S2) return(alignment) else : print(' Below threshold (',Threshold,')') return()
read_blosum() Funkcje pomocnicze # Matrix made by matblas from blosum62.iij # * column uses minimum score # BLOSUM Clustered Scoring Matrix in 1/2 Bit Units # Blocks Database = /data/blocks_5.0/blocks.dat # Cluster Percentage: >= 62 # Entropy = 0.6979, Expected = -0.5209 A R N D C Q E G H I L K M F P S T W Y V B Z X * A 4-1 -2-2 0-1 -1 0-2 -1-1 -1-1 -2-1 1 0-3 -2 0-2 -1 0-4 R -1 5 0-2 -3 1 0-2 0-3 -2 2-1 -3-2 -1-1 -3-2 -3-1 0-1 -4 N -2 0 6 1-3 0 0 0 1-3 -3 0-2 -3-2 1 0-4 -2-3 3 0-1 -4 ~~~~ Y -2-2 -2-3 -2-1 -2-3 2-1 -1-2 -1 3-3 -2-2 2 7-1 -3-2 -1-4 V 0-3 -3-3 -1-2 -2-3 -3 3 1-2 1-1 -2-2 0-3 -1 4-3 -2-1 -4 B -2-1 3 4-3 0 1-1 0-3 -4 0-3 -3-2 0-1 -4-3 -3 4 1-1 -4 Z -1 0 0 1-3 3 4-2 0-3 -3 1-1 -3-1 0-1 -3-2 -2 1 4-1 -4 X 0-1 -1-1 -2-1 -1-1 -1-1 -1-1 -1-1 -2 0 0-2 -1-1 -1-1 -1-4 * -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4 1
Funkcje pomocnicze def read_blosum(name): Blosum_file = open(name,'r') MyMatrix=[] line_count =0 row='' header='' blosum = numpy.zeros((24,24)) revindx={} indx={} return(result)
Funkcje pomocnicze def read_blosum(name): Blosum_file = open(name,'r') MyMatrix=[] line_count =0 row='' header='' blosum = numpy.zeros((24,24)) revindx={} indx={} return(result) otwieranie pliku deklaracja listy użycie modułu numpy
Funkcje pomocnicze def read_blosum(name): for line in Blosum_file: if line[0]!= '#': line_count += 1 if line_count == 1: header = line.strip('\n') hindex=header.split() indx={i : hindex[i] for i in range(0,len(hindex))} for i,v in indx.items(): revindx[v] = i else: row = line.rstrip('\n') CurrAA = row[0] row_items=row.split() for i in range(1,len(row_items)): blosum[line_count-2,i-1]=row_items[i] result = [indx,revindx,blosum] return(result)
Funkcje pomocnicze def read_blosum(name): for line in Blosum_file: if line[0]!= '#': line_count += 1 if line_count == 1: header = line.strip('\n') hindex=header.split() indx={i : hindex[i] for i in range(0,len(hindex))} for i,v in indx.items(): revindx[v] = i else: row = line.rstrip('\n') CurrAA = row[0] row_items=row.split() for i in range(1,len(row_items)): blosum[line_count-2,i-1]=row_items[i] result = [indx,revindx,blosum] return(result) Czytanie z pliku linia po linii
Funkcje pomocnicze def read_blosum(name): for line in Blosum_file: if line[0]!= '#': line_count += 1 if line_count == 1: header = line.strip('\n') hindex=header.split() indx={i : hindex[i] for i in range(0,len(hindex))} for i,v in indx.items(): revindx[v] = i else: row = line.rstrip('\n') CurrAA = row[0] row_items=row.split() for i in range(1,len(row_items)): blosum[line_count-2,i-1]=row_items[i] result = [indx,revindx,blosum] return(result)
Funkcje pomocnicze def read_blosum(name): for line in Blosum_file: if line[0]!= '#': line_count += 1 if line_count == 1: header = line.strip('\n') hindex=header.split() indx={i : hindex[i] for i in range(0,len(hindex))} for i,v in indx.items(): revindx[v] = i else: row = line.rstrip('\n') CurrAA = row[0] row_items=row.split() for i in range(1,len(row_items)): blosum[line_count-2,i-1]=row_items[i] result = [indx,revindx,blosum] return(result) Wszystko jest obiektem
Funkcje pomocnicze def read_blosum(name): revindx={} indx={} for line in Blosum_file: if line[0]!= '#': header = line.strip('\n') hindex=header.split() indx={i : hindex[i] for i in range(0,len(hindex))} for i,v in indx.items(): revindx[v] = i else: row = line.rstrip('\n') CurrAA = row[0] row_items=row.split() for i in range(1,len(row_items)): blosum[line_count-2,i-1]=row_items[i] result = [indx,revindx,blosum] return(result) Słownik utworzenie wypełenie
Funkcje pomocnicze def read_blosum(name): revindx={} indx={} for line in Blosum_file: if line[0]!= '#': header = line.strip('\n') hindex=header.split() indx={i : hindex[i] for i in range(0,len(hindex))} for i,v in indx.items(): revindx[v] = i else: row = line.rstrip('\n') CurrAA = row[0] row_items=row.split() for i in range(1,len(row_items)): blosum[line_count-2,i-1]=row_items[i] result = [indx,revindx,blosum] return(result) Słownik utworzenie wypełenie
Funkcje pomocnicze def read_blosum(name): revindx={} indx={} for line in Blosum_file: if line[0]!= '#': header = line.strip('\n') hindex=header.split() indx={i : hindex[i] for i in range(0,len(hindex))} for i,v in indx.items(): revindx[v] = i else: row = line.rstrip('\n') CurrAA = row[0] row_items=row.split() for i in range(1,len(row_items)): blosum[line_count-2,i-1]=row_items[i] result = [indx,revindx,blosum] return(result) Słownik utworzenie wypełenie
Funkcje pomocnicze def read_blosum(name): Słownik revindx={} utworzenie indx={} wypełenie for line in Blosum_file: if line[0]!= '#': odwołanie header = line.strip('\n') hindex=header.split() indx={i : hindex[i] for i in range(0,len(hindex))} for i,v in indx.items(): revindx[v] = i else: row = line.rstrip('\n') CurrAA = row[0] row_items=row.split() for i in range(1,len(row_items)): blosum[line_count-2,i-1]=row_items[i] result = [indx,revindx,blosum] return(result)
Funkcje pomocnicze def read_fasta(name): Fasta_file = open(name,'r') MySeq='' first_line=fasta_file.readline() if first_line[0] == '>': #print('header found') for line in Fasta_file: MySeq=MySeq+line.rstrip('\n') Fasta_file.close() return(myseq) >sp P52789 HXK2_HUMAN HEXOKINASE, TYPE II (EC 2.7.1.1) (HK II) (MUSCLE FORM HEXOKINASE) - Homo sapiens (Human). MIASHLLAYFFTELNHDQVQKVDQYLYHMRLSDETLLEISKRFRKEMEKG LGATTHPTAAVKMLPTFVRSTPDGTEHGEFLALDLGGTNFRVLWVKVTDN GLQKVEMENQIYAIPEDIMRGSGTQLFDHIAECLANFMDKLQIKDKKLPL
Problem Zmodyfikuj funkcję read_fasta() tak aby mogła wczytać plik w formacie FASTA zawierający dowolną liczbę sekwencji. Wynikiem powinny być dwie listy: Lista nagłówków Lista sekwencji >sp P52789 HXK2_HUMAN HEXOKINASE, TYPE II (EC 2.7.1.1) (HK II) (MUSCLE FORM HEXOKINASE) - Homo sapiens (Human). MIASHLLAYFFTELNHDQVQKVDQYLYHMRLSDETLLEISKRFRKEMEKG LGATTHPTAAVKMLPTFVRSTPDGTEHGEFLALDLGGTNFRVLWVKVTDN GLQKVEMENQIYAIPEDIMRGSGTQLFDHIAECLANFMDKLQIKDKKLPL! >sp P52790 HXK3_HUMAN HEXOKINASE TYPE III (EC 2.7.1.1) (HK III) - Homo sapiens (Human). MDSIGSSGLRQGEETLSCSEEGLPGPSDSSELVQECLQQFKVTRAQLQQI QASLLGSMEQALRGQASPAPAVRMLPTYVGSTPHGTEQGDFVVLELGATG
Przyrównanie sekwencji Algorytm Smitha-Watermana dla pary sekwencji P i Q o długościach odpowiednio M i N. Zbuduj macierz prostokątną H o wymiarze MxN Wypełnij macierz tak, że H[i,j] jest miarą podobieństwa między i- tym aminokwasem z P i j-tym aminokwasem z Q Przetwórz macierz, zaczynając od górnego lewego roku używając wzoru H [ i, j] = max k max k H [ i 1, j 1]+ H [ i, j] ( H [ i,k] GapPenalty( i, j,k) ) ( H [ k, j] GapPenalty( i, j,k) ) 0
SW_align_simple MIAAQLLAY MIAAQEDLLAY MIAAQ--LLAY MIAAQEDLLAY H [ i, j] = max k max k H [ i 1, j 1]+ H [ i, j] H [ i,k] GapPenalty i, j, k H [ k, j] GapPenalty i, j, k ( ) ( ) ( ) ( ) 0 _ M I A A Q E D L L A Y -[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] M[ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] I[ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] A[ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] A[ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] Q[ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] L[ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] L[ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] A[ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] Y[ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]
SW_align_simple MIAAQLLAY MIAAQEDLLAY MIAAQ--LLAY MIAAQEDLLAY H [ i, j] = max k max k H [ i 1, j 1]+ H [ i, j] H [ i,k] GapPenalty i, j, k H [ k, j] GapPenalty i, j, k ( ( )) ( ) ( ) 0 _ M I A A Q E D L L A Y -[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] M[ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] I[ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] A[ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] A[ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] Q[ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] L[ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] L[ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] A[ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] Y[ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]
SW_align_simple max{ H[i-1,j-1]+Blosum62[E,Q]=6+2 = 8 max(h[i,k]-gapopen-(j-k)*gapext) = 22-10-1=11 max(h[i,k]-gapopen-(j-k)*gapext) = 5 10-1=-6 0 max(0,8,11,-6) = 11 _ M I A A Q E D L L A Y -[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] M[ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] I[ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] A[ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] A[ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] Q[ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] L[ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] L[ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] A[ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] Y[ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]
SW_align_simple max{ H[i-1,j-1]+Blosum62[E,Q]=4-2 = 2 max(h[i,k]-gapopen-(j-k)*gapext) = 22-10-3=9 max(h[i,k]-gapopen-(j-k)*gapext) = 3 10-1=-8 0 max(0,2,9,-8) = 9 _ M I A A Q E D L L A Y -[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] M[ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] I[ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] A[ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] A[ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] Q[ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] L[ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] L[ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] A[ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] Y[ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]
SW_align_simple max{ H[i-1,j-1]+Blosum62[E,Q]=4-2 = 2 max(h[i,k]-gapopen-(j-k)*gapext) = 22-10-3=9 max(h[i,k]-gapopen-(j-k)*gapext) = 3 10-1=-8 0 max(0,2,9,-8) = 9 _ M I A A Q E D L L A Y -[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] M[ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] I[ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] A[ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] A[ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] Q[ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] L[ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] L[ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] A[ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] Y[ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]
SW_align_simple import numpy import copy import sys! def SW_align_simple(s1,s2,SimMat,RevIndx,GapOpen,GapExt): # Version without traceback # Create matrices H, E, F dim1=len(s1)+1 dim2=len(s2)+1 H = numpy.zeros((dim1,dim2)) E = numpy.zeros(dim1) F = numpy.zeros(dim2) MaxScore, MaxI, MaxJ, RowStart, ColStart = 0, 0, 0, 0, 0
SW_align_simple def SW_align_simple(s1,s2,SimMat,RevIndx,GapOpen,GapExt): # Version without traceback # Create matrices H, E, F dim1=len(s1)+1 dim2=len(s2)+1 H = numpy.zeros((dim1,dim2)) E = numpy.zeros(dim1) F = numpy.zeros(dim2) MaxScore, MaxI, MaxJ, RowStart, ColStart = 0, 0, 0, 0, 0! #Fill matrix H for i in range(1,dim1): for j in range(1,dim2): H[i,j] = SimMat[RevIndx[s1[i-1]],RevIndx[s2[j-1]]]!
SW_align_simple def SW_align_simple(s1,s2,SimMat,RevIndx,GapOpen,GapExt): # Version without traceback # Create matrices H, E, F dim1=len(s1)+1 Słownik dim2=len(s2)+1 H = numpy.zeros((dim1,dim2)) odwołanie E = numpy.zeros(dim1) F = numpy.zeros(dim2) MaxScore, MaxI, MaxJ, RowStart, ColStart = 0, 0, 0, 0, 0!! #Fill matrix H for i in range(1,dim1): for j in range(1,dim2): H[i,j] = SimMat[RevIndx[s1[i-1]],RevIndx[s2[j-1]]]
SW_align_simple def SW_align_simple(s1,s2,SimMat,RevIndx,GapOpen,GapExt): # Version without traceback # Create matrices H, E, F #Fill matrix H for i in range(1,dim1): for j in range(1,dim2): #compute E #compute F diag = H[i-1,j-1]+H[i,j] H[i,j]=max(0,E[i],F[j],diag) if H[i,j] > MaxScore: MaxScore = H[i,j] return(maxscore)
SW_align_simple def SW_align_simple(s1,s2,SimMat,RevIndx,GapOpen,GapExt): # Version without traceback # Create matrices H, E, F #Fill matrix H for i in range(1,dim1): for j in range(1,dim2): #compute E #compute F diag = H[i-1,j-1]+H[i,j] H[i,j]=max(0,E[i],F[j],diag) if H[i,j] > MaxScore: MaxScore = H[i,j] return(maxscore) Konstrukcja pętli for z iteratorem
SW_align_simple def SW_align_simple(s1,s2,SimMat,RevIndx,GapOpen,GapExt): for i in range(1,dim1): for j in range(1,dim2): #compute E E[i], RowStart = 0, 0 for col in range(0,j): tmp = H[i,col]-GapOpen-(j-col)*GapExt if tmp > E[i]: E[i] = tmp #compute F F[j] = 0 for row in range(0,i): tmp = H[row,j] - GapOpen-(i-row)*GapExt if tmp > F[j]: F[j] = tmp return(maxscore)
SW_align_simple def SW_align_simple(s1,s2,SimMat,RevIndx,GapOpen,GapExt): for i in range(1,dim1): for j in range(1,dim2): #compute E E[i], RowStart = 0, 0 for col in range(0,j): tmp = H[i,col]-GapOpen-(j-col)*GapExt if tmp > E[i]: E[i] = tmp #compute F F[j] = 0 for row in range(0,i): tmp = H[row,j] - GapOpen-(i-row)*GapExt if tmp > F[j]: F[j] = tmp return(maxscore)
SW_align_trace def SW_align_trace(s1,s2,SimMat,RevIndx,GapOpen,GapExt): # Version with traceback # Create matrices H, E, F dim1=len(s1)+1 Lista dim2=len(s2)+1 H = numpy.zeros((dim1,dim2)) E = numpy.zeros(dim1) F = numpy.zeros(dim2) Htrace =[None]*dim1 for i in range(dim1): Htrace[i]=[None]*dim2 MaxScore, MaxI, MaxJ, RowStart, ColStart = 0, 0, 0, 0, 0! tworzenie wypełnianie
SW_align_trace def SW_align_trace(s1,s2,SimMat,RevIndx,GapOpen,GapExt): for i in range(1,dim1): for j in range(1,dim2): #compute E E[i], RowStart = 0, 0 for col in range(0,j): tmp = H[i,col]-GapOpen-(j-col)*GapExt if tmp > E[i]: E[i], RowStart = tmp, col #compute F F[j] = 0 for row in range(0,i): tmp = H[row,j] - GapOpen-(i-row)*GapExt if tmp > F[j]: F[j], ColStart = tmp, row!!
SW_align_trace def SW_align_trace(s1,s2,SimMat,RevIndx,GapOpen,GapExt): for i in range(1,dim1): for j in range(1,dim2): #compute E E[i], RowStart = 0, 0 #compute F #find max and identify from where we arrived diag = H[i-1,j-1]+H[i,j] H[i,j]=max(0,E[i],F[j],diag) if H[i,j] == 0: Htrace[i][j]=(0,0) elif H[i,j] == diag: Htrace[i][j]=(i-1,j-1) elif H[i,j] == E[i]: Htrace[i][j]=(i,RowStart) else: Htrace[i][j]=(ColStart,j) if H[i,j] > MaxScore: MaxScore, MaxI, MaxJ = H[i,j], i, j return([h,maxscore,maxi,maxj,htrace])
SW_align_trace def SW_align_trace(s1,s2,SimMat,RevIndx,GapOpen,GapExt): for i in range(1,dim1): for j in range(1,dim2): #compute E E[i], RowStart = 0, 0 #compute F #find max and identify from where we arrived diag = H[i-1,j-1]+H[i,j] H[i,j]=max(0,E[i],F[j],diag) if H[i,j] == 0: Htrace[i][j]=(0,0) elif H[i,j] == diag: Htrace[i][j]=(i-1,j-1) elif H[i,j] == E[i]: Htrace[i][j]=(i,RowStart) else: Htrace[i][j]=(ColStart,j) if H[i,j] > MaxScore: MaxScore, MaxI, MaxJ = H[i,j], i, j return([h,maxscore,maxi,maxj,htrace])
SW_align_trace def SW_build_traceback(H,MaxScore,MaxI,MaxJ,Htrace,s1,s2): Size = len(s1)+len(s2) Align_index = [None]*Size CurrI, CurrJ = MaxI, MaxJ Align_index[0]=(MaxI,MaxJ) count = 0 CONT = True while CONT: Next = Htrace[CurrI][CurrJ] if Next == (CurrI,CurrJ): CONT=0 CurrI, CurrJ = Next[0],Next[1] count +=1 Align_index[count]=(CurrI,CurrJ) if CurrI == 0: CONT=False if CurrJ == 0: CONT=False # Trace back is ready - now we invert it # We return index for the forward alignment return(f_index)
SW_align_trace def SW_build_traceback(H,MaxScore,MaxI,MaxJ,Htrace,s1,s2): Size = len(s1)+len(s2) Align_index = [None]*Size CurrI, CurrJ = MaxI, MaxJ Align_index[0]=(MaxI,MaxJ) count = 0 CONT = True while CONT: Next = Htrace[CurrI][CurrJ] if Next == (CurrI,CurrJ): CONT=0 CurrI, CurrJ = Next[0],Next[1] count +=1 Align_index[count]=(CurrI,CurrJ) if CurrI == 0: CONT=False if CurrJ == 0: CONT=False # Trace back is ready - now we invert it # We return index for the forward alignment return(f_index)
SW_align_trace def SW_build_traceback(H,MaxScore,MaxI,MaxJ,Htrace,s1,s2): Size = len(s1)+len(s2) Align_index = [None]*Size CurrI, CurrJ = MaxI, MaxJ Align_index[0]=(MaxI,MaxJ) count = 0 CONT = True while CONT: Next = Htrace[CurrI][CurrJ] if Next == (CurrI,CurrJ): CONT=0 CurrI, CurrJ = Next[0],Next[1] count +=1 Align_index[count]=(CurrI,CurrJ) if CurrI == 0: CONT=False if CurrJ == 0: CONT=False # Trace back is ready - now we invert it # We return index for the forward alignment return(f_index) wielokrotne przypisanie
SW_align_trace def SW_build_traceback(H,MaxScore,MaxI,MaxJ,Htrace,s1,s2): Size = len(s1)+len(s2) Align_index = [None]*Size CurrI, CurrJ = MaxI, MaxJ pętla Align_index[0]=(MaxI,MaxJ) while count = 0 CONT = True while CONT: Next = Htrace[CurrI][CurrJ] if Next == (CurrI,CurrJ): CONT=0 CurrI, CurrJ = Next[0],Next[1] count +=1 Align_index[count]=(CurrI,CurrJ) if CurrI == 0: CONT=False if CurrJ == 0: CONT=False # Trace back is ready - now we invert it # We return index for the forward alignment return(f_index)
SW_align_trace def SW_build_traceback(H,MaxScore,MaxI,MaxJ,Htrace,s1,s2): Size = len(s1)+len(s2) Align_index = [None]*Size CurrI, CurrJ = MaxI, MaxJ Align_index[0]=(MaxI,MaxJ) count = 0 CONT = True while CONT: Next = Htrace[CurrI][CurrJ] if Next == (CurrI,CurrJ): CONT=0 CurrI, CurrJ = Next[0],Next[1] count +=1 Align_index[count]=(CurrI,CurrJ) if CurrI == 0: CONT=False if CurrJ == 0: CONT=False # Trace back is ready - now we invert it # We return index for the forward alignment return(f_index)
SW_align_trace def SW_build_traceback(H,MaxScore,MaxI,MaxJ,Htrace,s1,s2): while CONT: # Trace back is ready - now we invert it F_index = [None]*(count) for i in range(1,(count+1)) : tmp=align_index[count-i] F_index[i-1]=(tmp[0]-1,tmp[1]-1) # We return index for the forward alignment return(f_index)
SW_align_trace >>>print('',s1,'\n',s2) MIAAQLLAY MIAAQEDLLAY >>>SWar=SW_align_trace(s1,s11,BL62,RevIndx,10,1) >>>H=SWar[0] >>>print(h) [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] [ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] [ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] [ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] [ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] [ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] [ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] [ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] [ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]
SW_align_trace >>>Htrace=SWar[4] >>>for i in range(10): print(i,htrace[i]) 0 [None, None, None, None, None, None, None, None, None, None, None, None] 1 [None, (0, 0), (0, 1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 7), (0, 8), (0, 0), (0, 0)] 2 [None, (1, 0), (1, 1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (1, 7), (1, 8), (1, 9), (0, 0)] 3 [None, (0, 0), (0, 0), (2, 2), (2, 3), (3, 3), (0, 0), (0, 0), (0, 0), (2, 8), (2, 9), (0, 0)] 4 [None, (0, 0), (0, 0), (3, 2), (3, 3), (4, 4), (4, 4), (4, 4), (4, 4), (4, 4), (3, 9), (3, 10)] 5 [None, (0, 0), (0, 0), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (5, 5), (5, 5), (5, 5)] 6 [None, (5, 0), (5, 1), (0, 0), (4, 4), (5, 5), (5, 5), (6, 6), (5, 7), (5, 8), (5, 9), (5, 10)] 7 [None, (6, 0), (6, 1), (6, 2), (4, 4), (5, 5), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (6, 10)] 8 [None, (0, 0), (7, 1), (7, 2), (7, 3), (5, 5), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 10)] 9 [None, (0, 0), (0, 0), (0, 0), (8, 3), (5, 5), (8, 5), (8, 6), (8, 7), (8, 8), (8, 10), (8, 10)]! >>>Ftrace=SW_build_traceback(SWar[0],SWar[1],SWar[2],SWar[3],SWar[4],s1,s2)! >>>print(ftrace) # values offset by -1 [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (4, 6), (5, 7), (6, 8), (7, 9), (8, 10)]
SW_align_trace 9 [None, (0, 0), (0, 0), (0, 0), (8, 3), (5, 5), (8, 5), (8, 6), (8, 7), (8, 8), (8, 10), (8, 10)]! >>>for i in range(10): print(i,htrace[i]) 0 [None, None, None, None, None, None, None, None, None, None, None, None] 1 [None, (0, 0), (0, 1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 7), (0, 8), (0, 0), (0, 0)] 2 [None, (1, 0), (1, 1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (1, 7), (1, 8), (1, 9), (0, 0)] 3 [None, (0, 0), (0, 0), (2, 2), (2, 3), (3, 3), (0, 0), (0, 0), (0, 0), (2, 8), (2, 9), (0, 0)] 4 [None, (0, 0), (0, 0), (3, 2), (3, 3), (4, 4), (4, 4), (4, 4), (4, 4), (4, 4), (3, 9), (3, 10)] 5 [None, (0, 0), (0, 0), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (5, 5), (5, 5), (5, 5)] 6 [None, (5, 0), (5, 1), (0, 0), (4, 4), (5, 5), (5, 5), (6, 6), (5, 7), (5, 8), (5, 9), (5, 10)] 7 [None, (6, 0), (6, 1), (6, 2), (4, 4), (5, 5), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (6, 10)] 8 [None, (0, 0), (7, 1), (7, 2), (7, 3), (5, 5), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 10)] >>>print(h) [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] [ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] [ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] [ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] [ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] [ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] [ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] [ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] [ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]
SW_build_traceback 9 [None, (0, 0), (0, 0), (0, 0), (8, 3), (5, 5), (8, 5), (8, 6), (8, 7), (8, 8), (8, 10), (8, 10)]! >>>for i in range(10): print(i,htrace[i]) 0 [None, None, None, None, None, None, None, None, None, None, None, None] 1 [None, (0, 0), (0, 1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 7), (0, 8), (0, 0), (0, 0)] 2 [None, (1, 0), (1, 1), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (1, 7), (1, 8), (1, 9), (0, 0)] 3 [None, (0, 0), (0, 0), (2, 2), (2, 3), (3, 3), (0, 0), (0, 0), (0, 0), (2, 8), (2, 9), (0, 0)] 4 [None, (0, 0), (0, 0), (3, 2), (3, 3), (4, 4), (4, 4), (4, 4), (4, 4), (4, 4), (3, 9), (3, 10)] 5 [None, (0, 0), (0, 0), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (5, 5), (5, 5), (5, 5)] 6 [None, (5, 0), (5, 1), (0, 0), (4, 4), (5, 5), (5, 5), (6, 6), (5, 7), (5, 8), (5, 9), (5, 10)] 7 [None, (6, 0), (6, 1), (6, 2), (4, 4), (5, 5), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (6, 10)] 8 [None, (0, 0), (7, 1), (7, 2), (7, 3), (5, 5), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 10)] >>>print(h) [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] [ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] [ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] [ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] [ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] [ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] [ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] [ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] [ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]! >>>Ftrace=SW_build_traceback(SWar[0],SWar[1],SWar[2],SWar[3],SWar[4],s1,s2)! >>>print(ftrace) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (4, 6), (5, 7), (6, 8), (7, 9), (8, 10)]
SW_build_alignment!! def SW_build_alignment(Ftrace,s1,s2): Len = len(ftrace) Align = [None]*(2*Len) s1_pos, s2_pos = Ftrace[0][0],Ftrace[0][1] s1_nxt, s2_nxt = 0,0 curr_indx = 0 nxt_indx = curr_indx+1 Align[0]=(s1[s1_pos],s2[s2_pos]) curr_align=0 while curr_indx < (Len-1): FinalAlign = [None]*(curr_align+1) Als1, Als2 = '', '' for i in range(curr_align+1): FinalAlign[i]=Align[i] Als1 = Als1 + Align[i][0] Als2 = Als2 + Align[i][1] return([finalalign,als1,als2])
def SW_build_alignment(Ftrace,s1,s2): while curr_indx < (Len-1): nxt_indx = curr_indx+1 s1_nxt = Ftrace[nxt_indx][0] s2_nxt = Ftrace[nxt_indx][1] if ( (s1_nxt == s1_pos+1) & (s2_nxt == s2_pos+1) ): #We go along diagonal elif (s1_nxt == s1_pos) : #break in sequence 1 (s1) elif (s2_nxt == s2_pos) : # break in sequence 2 (s2) else : #Error - we never should get here print(s1_pos,s1_t,s1_nxt,' :: ',s2_pos,s2_t,s2_nxt) print('alignment error, exiting\n') sys.exit(1) return([finalalign,als1,als2])
def SW_build_alignment(Ftrace,s1,s2): while curr_indx < (Len-1): nxt_indx = curr_indx+1 s1_nxt = Ftrace[nxt_indx][0] s2_nxt = Ftrace[nxt_indx][1] if ( (s1_nxt == s1_pos+1) & (s2_nxt == s2_pos+1) ): #We go along diagonal s1_pos,s2_pos = s1_nxt,s2_nxt curr_indx = nxt_indx curr_align +=1 Align[curr_align] = (s1[s1_pos],s2[s2_pos]) elif (s1_nxt == s1_pos) : #break in sequence 1 (s1) elif (s2_nxt == s2_pos) : # break in sequence 2 (s2) else : #Error - we never should get here return([finalalign,als1,als2])
def SW_build_alignment(Ftrace,s1,s2): while curr_indx < (Len-1): if ( (s1_nxt == s1_pos+1) & (s2_nxt == s2_pos+1) ): #We go along diagonal elif (s1_nxt == s1_pos) : #break in sequence 1 (s1) while s2_pos < s2_nxt: # we fill the gap with '-' signs s2_pos += 1 curr_align +=1 Align[curr_align] = ('-',s2[s2_pos]) # End of break curr_indx = nxt_indx elif (s2_nxt == s2_pos) : # break in sequence 2 (s2) else : #Error - we never should get here return([finalalign,als1,als2])
def SW_build_alignment(Ftrace,s1,s2): while curr_indx < (Len-1): if ( (s1_nxt == s1_pos+1) & (s2_nxt == s2_pos+1) ): #We go along diagonal elif (s1_nxt == s1_pos) : #break in sequence 1 (s1) elif (s2_nxt == s2_pos) : # break in sequence 2 (s2) while s1_pos< s1_nxt: # we fill the gap with '-' signs s1_pos += 1 curr_align +=1 Align[curr_align] = (s1[s1_pos],'-') # End of break curr_indx = nxt_indx! else : #Error - we never should get here return([finalalign,als1,als2])
SW_build_alignment! >>>print(h) [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] [ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] [ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] [ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] [ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] [ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] [ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] [ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] [ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]! >>>print(ftrace) [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (4, 6), (5, 7), (6, 8), (7, 9), (8, 10)]! >>>SWal=SW_build_alignment(Ftrace,s1,s11) >>>print(swal[0]) [( M','M'),('I','I'),('A','A'),('A','A'),('Q','Q'),('-','E'),('-',D'), ( L,'L'),('L','L'),('A','A'),('Y','Y')]! >>>print('',swal[1],'\n',swal[2]) MIAAQ--LLAY MIAAQEDLLAY
Problem Zmodyfikuj funkcję SW_align_simple() aby zmienić złożoność obliczeniową z O(N*M*(N+M)) do O(N*M) Wskazówka: zauważ, że w wierszach i kolumnach odchodzących od diagonali wartości w miarę odchodzenia od diagonali spadają o wartość GapExt [[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 0. 5. 1. 0. 0. 0. 0. 0. 2. 2. 0. 0.] [ 0. 1. 9. 0. 0. 0. 0. 0. 2. 4. 1. 0.] [ 0. 0. 0. 13. 4. 1. 0. 0. 0. 1. 8. 0.] [ 0. 0. 0. 4. 17. 6. 5. 4. 3. 2. 5. 6.] [ 0. 0. 0. 1. 6. 22. 11. 10. 9. 8. 7. 6.] [ 0. 2. 2. 0. 5. 11. 19. 8. 14. 13. 7. 6.] [ 0. 2. 4. 1. 4. 10. 8. 15. 12. 18. 12. 6.] [ 0. 0. 1. 8. 5. 9. 9. 6. 14. 11. 22. 11.] [ 0. 0. 0. 0. 6. 8. 7. 6. 5. 13. 11. 29.]]
Problem - cd Zmodyfikuj funkcję SW_align_simple() aby zmienić złożoność obliczeniową z O(N*M*(N+M)) do O(N*M) Wskazówka: zauważ, że w wierszach i kolumnach odchodzących od diagonali wartości w miarę odchodzenia od diagonali spadają o wartość GapExt Dla każdej komórki [i,j] zmienna E[i] (lub F[j]) może być uzyskana na dwa sposoby pomniejszenie o wartość GapExt wartości E[i] = E[i-1]-GapExt : F[j] = F[j-1]-GapExt rozpoczęcie nowej przerwy E[i] = H[i,j-1]-GapOpen F[j] = H[j,i-1]-GapOpen
Problem -cd Zamiast liczyć funkcję max() po wszystkich możliwych wartościach wystarczy dla każdej komórki sprawdzić dwie wartości E i dwie F (czyli wersja algorytmu wg. Osamu Gotoha) H [ i, j] = max H [ i 1, j 1]+ H i, j [ ] [ ] E i, j F i, j 0 [ ] E[ i, j] = max F[ i, j] = max E[ i, j 1] GapExt H [ i, j 1] GapOpen GapExt F[ i 1, j] GapExt H [ i 1, j] GapOpen GapExt
Problem -cd Zamiast liczyć funkcję max() po wszystkich możliwych wartościach wystarczy dla każdej komórki sprawdzić dwie wartości E i dwie F (czyli wersja algorytmu wg. Osamu Gotoha)! Trzeba jedynie zapamiętać wiersz ostatnich wartości F (dla E nie jest to konieczne - liczymy na bieżąco).! Dodatkowe uproszczenie W wersji bez śledzenia powrotu nie trzeba przechowywać macierzy kwadratowych - wartości H[] można obliczać na bieżąco.