Bioinformatyka: Wykład 2. Algorytm Smitha Watermana implementacja w języku Python

Podobne dokumenty
Zaawansowany kurs języka Python

Dopasowywanie sekwencji (ang. sequence alignment) Metody dopasowywania sekwencji. Homologia a podobieństwo sekwencji. Rodzaje dopasowania

Python. Wprowadzenie. Jolanta Bachan

Wykład 5 Dopasowywanie lokalne

Dopasowania par sekwencji DNA

PODSTAWY BIOINFORMATYKI WYKŁAD 4 DOPASOWANIE SEKWENCJI

PODSTAWY BIOINFORMATYKI WYKŁAD 4 DOPASOWANIE SEKWENCJI

Bioinformatyka. Ocena wiarygodności dopasowania sekwencji.

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

Bioinformatyka. (wykład monograficzny) wykład 5. E. Banachowicz. Zakład Biofizyki Molekularnej IF UAM

Wprowadzenie do Python

Wykresy i interfejsy użytkownika

a) ile wynosiła populacja najbardziej i najmniej ludnego z województw (oraz jakie były ich nazwy)

Język Python. Język Python 1/35

Kurs języka Python Wykład 8. Przetwarzanie tekstu Wyrażenia regularne Biblioteka urllib Parsowanie html'a XML

Przyrównywanie sekwencji

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Wstęp do programowania

Języki i metody programowania

Podstawy Pythona. Krzysztof Gdawiec. Instytut Informatyki Uniwersytet Śląski

rozdział 4: ZMIENNE I INSTRUKCJE

Listy, krotki, słowniki, funkcje

Podstawy programowania w Pythonie

System operacyjny Linux

Kurs rozszerzony języka Python

Kurs rozszerzony języka Python

Algorytmy i struktury danych

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Przyrównanie sekwencji. Magda Mielczarek Katedra Genetyki Uniwersytet Przyrodniczy we Wrocławiu

Materiały. Technologie baz danych. Plan wykładu Kursory. Wykład 5: Kursory jawne. Podprogramy. Kursory jawne. Kursory niejawne

Dopasowanie sekwencji Sequence alignment. Bioinformatyka, wykłady 3 i 4 (19, 26.X.2010)

PRZYRÓWNANIE SEKWENCJI

Politechnika Wrocławska. Dopasowywanie sekwencji Sequence alignment

Kurs języka Python Wykład 6. Pliki tekstowe Pliki rekordów Pliki CSV Strumienie

Dzi kuj za uwag! Spotkania z Pythonem. Cz ± 1 - podstawy - rozwi zania zada« Michaª Alichniewicz. Gda«sk Studenckie Koªo Automatyków SKALP

Podstawy Programowania C++

Podstawy programowania w Pythonie

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Wstęp do programowania

Dopasowanie sekwencji Sequence alignment. Bioinformatyka, wykłady 3 i 4 (16, 23.X.2012)

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

Oracle PL/SQL. Paweł Rajba.

Przedmiot: Informatyka w inżynierii produkcji Forma: Laboratorium Temat: Zadanie 4. Instrukcja warunkowa.

Wstęp do programowania

Pakiety Matematyczne - R Zestaw 2.

Bloki anonimowe w PL/SQL

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

do MATLABa programowanie WYKŁAD Piotr Ciskowski

Plik->Opcje->Zakladka Główne->Dostosuj Wstążkę Zaznaczamy kwadracik Developer na liscie po prawej stronie. Klikamy OK.

Podstawy programowania w Pythonie

Wstęp do Informatyki i Programowania (kierunek matematyka stosowana)

Dopasowanie par sekwencji

SQL 4 Structured Query Lenguage

PODSTAWY BIOINFORMATYKI 8 DOPASOWYWANIE SEKWENCJI AMINOKWASÓW

Kurs rozszerzony języka Python

Podstawowe I/O Liczby

Programowanie obiektowe

(kod ten służy wprowadzeniu definicji mediany, nie jest to optymalna ani nawet szczególnie dobra implementacja obliczania mediany w praktyce!

Programowanie w języku Python. Grażyna Koba

Cheatsheet PL/SQL Andrzej Klusiewicz 1/9

Zaawansowane bazy danych i hurtownie danych semestr I

Bioinformatyka Laboratorium, 30h. Michał Bereta

Programowanie robota mobilnego E-puck w języku Python

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Dokowanie molekularne. Andrzej Bąk

Technologie Informacyjne Mechatronika 2012/2013 Błędy obliczeń. Python.

Język Python (2) Język Python (2) 1/36

Wykład Bioinformatyka. Wykład 9. E. Banachowicz. Zakład Biofizyki Molekularnej IF UAM

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Programowanie w Ruby

Wrocław, Wstęp do informatyki i programowania: liczby pierwsze. Wydział Matematyki Politechniki Wrocławskiej.

2.8. Algorytmy, schematy, programy

Zaawansowany kurs języka Python

Opis implementacji: Implementacja przedstawia Grę w życie jako przykład prostej symulacji opartej na automatach.

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Kurs języka Python. Wykład 5. Marcin Młotkowski. 9 listopada Rodzaje parametrów funkcji. 2 Biblioteka Tk. 3 Układanie kontrolek w oknie

Pytania dla języka Python

Wstęp do programowania

Administracja sieciowymi systemami operacyjnymi III Klasa - Linux

Programowanie w Scilab

Projekt 6: Równanie Poissona - rozwiązanie metodą algebraiczną.

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Podstawy Programowania ELEMENTY PROGRAMU i TYPY DANYCH

Funkcje są prawdopodobnie najważniejszą częścią każdego poważnego programu (w każdym języku programowania).

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Operacje na wektorach i macierzach.

Programowanie w Ruby

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Przedmiotowy Konkurs Informatyczny LOGIA powołany przez Mazowieckiego Kuratora Oświaty

Program szkolenia VBA (VISUAL BASIC FOR APPLICATIONS) W EXCELU PODSTAWOWY.

Lekcja 3: Pierwsze kroki z Pythonem. Pętle

Języki i metody programowania

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

Wstęp do informatyki Ćwiczenia. Piotr Fulmański

Wstęp do Pythona. Janusz Szwabiński. Python w obliczeniach numerycznych (C) 2005 Janusz Szwabiński p.1/36

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

MATLAB Z3. Rafał Woźniak. Warsaw, Faculty of Economic Sciences, University of Warsaw

Transkrypt:

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.