1/4/2017 „Wyjściówka” CGGGGCTATGCAACTGGGTCGTCACATTCCCCTTTCGATA TTTGAGGGTGCCCAATAAATGCAACTCCAAAGCGGACAAA GGATGCAACTGATGCCGTTTGACGACCTAAATCAACGGCC AAGGATGCAACTCCAGGAGCGCCTTTGCTGGTTCTACCTG AATTTTCTAAAAAGATTATAATGTCGGTCCATGCAACTTC CTGCTGTACAACTGAGATCATGCTGCATGCAACTTTCAAC TACATGATCTTTTGATGCAACTTGGATGAGGGAATGATGC Dane jest 7 sekwencji DNA. Wyszukać w nich (z opisem) wszystkie wystąpienia zlepków nukleotydów GC zawierają zlepki G…C lub C…G przy czym jeden dowolny nukleotyd jest pomiędzy nimi zawierają dwa zlepki GC i CG przy czym pomiędzy nimi jest dowolna sekwencja nie dłuższa niż 6 kończą się na zlepku C…C przy czym pomiędzy nimi jest dowolna liczba wystąpień A „Projekt” Dane jest 7 sekwencji DNA. Znaleźć l-mery (łańcuchy konsensusu) po jednym z każdej sekwencji , które maksymalizują wynik (Score) łańcucha konsensusu, wykorzystując strukturę drzewa do 1) przeszukiwania wyczerpującego 2) przeszukiwania z ograniczeniami. Numer strony 1 1/4/2017 Moduł w Pythonie • kolekcja narzędzi: funkcji i typów danych umieszczona w pliku o rozszerzeniu nazwa_modulu.py • dostęp do nich poprzez instrukcje ogólną import nazwa_modulu, a szczególne funkcje wywołuje się nazwa_modulu.nazwa_narzedzia Przykład import czytaj_znaki DNA = czytaj_znaki.czytaj_plik_znakowo('DNA.txt') print(DNA) Zawartość pliku czytaj_znaki.py: Powszechne użycie to wstawienie kodu, warunkowo testującego wykonanie funkcji modułu. Kod ten jest wykonywany jedynie gdy skrypt ma status „main”. def czytaj_plik_znakowo(nazwa_pliku): try: plik = open(nazwa_pliku, 'r') print ( "\n\nCzytam z " + nazwa_pliku ) zawartosc = plik.read() except IOError: print ("\n\nBłąd dostępu do pliku. STOP? ") zawartosc={} return zawartosc if __name__ == "__main__" : dna= input("podaj nazwe pliku: \t") DNA = czytaj_plik_znakowo(dna) print(DNA) Moduł re.py (regular expressions ) Konstrukcja wzorca do poszukiwań: if re.search(r'GAATA', DNA) or re.search(r'GATTA', DNA) : print(’ mamy') else: print('nie ma') Wykorzystanie wyrażeń regularnych: if re.search( r'GA(A|T)TA', DNA) : print('mamy') if re.search( r'GA(A|T|C|G)TA', DNA) : print('mamy') if re.search( r'GA [ATCG]TA', DNA) : print('mamy') if re.search( r'GA.TA', DNA) : print('mamy') if re.search( r'GA[^A]TA', DNA) : print('mamy') Może być albo A albo T w danej pozycji Może być dowolna z liter A, T, C, G albo T w danej pozycji Może być dowolna z liter A, T, C, G albo T w danej pozycji Może być dowolny znak w danej pozycji Każdy inny znak niż A w danej pozycji 2 1/4/2017 ZNAKI SPECJALNEGO ZNACZENIA ? znak / grupa znaków opcjonalna jest lub go/jej nie ma + znak/grupa znaków musi być, ale może występować wiele razy * znak/grupa znaków może być, i może występować wiele razy {k} znak/ grupa znaków musi wystąpić dana ilość razy., {k,l} wystąpień od k do l. ^ i wzorzec – wyszukiwanie łańcuchów o zadanym początku $ za wzorcem – wyszukiwanie łańcuchów o zadanym końcu Wzorzec Szukamy: GAT?C GATC GA(AAT)?C GAAATC GAT+C GAC GAC GATC GATTC GATTTC ….. GA(AT)+C GAATC GAATATC GAATATATATC …. GAT*C GA(AT)*C GAC GATC GATTC GATTTC ….. GAC GAATC GAATATC ….. GAT{2,4}C GA(AT){2}C GATTC GATTTC GATTTTC GAATATC ^GAT GAT……. GAT$ ……..GAT Wzorzec może być reprezentowany na wiele sposobów • GG[AT]CC, • (GGACC|GGTCC) • (GGA|GGT)CC • G{2}[AT]C{2} Wyrażenia można łączyć na wiele sposobów ^ATG[ATGC]{30,1000}A{5,10}$ Start to ATG Od 30 do 1000 dowolnych nukleotydów Zakończonych 5 do 10 A 3 1/4/2017 DNA=DNA.split() m zbiera wynik wyszukiwnia for dna in range(len(DNA)): m = re.search(r"G[ATGC]{3}A", DNA[dna] ) if m : print(dna, ' jest ', m.group()) else: print(dna, ' brak ') W każdej linii szukamy pięcionukleotydowej sekwencji o początku T , potem trzy dowolne znaki , na końcu A Przykład : Jakich sekwencji szukamy jeśli: GA([ATGC]{3})AC([ATGC]{2})AC GA([ATGC]{3})AC([ATGC]{2})AC GA .. .. .. AC .. .. AC Dwa Trzy nukleo- nukleotydy tydy dna = "ATGACGTACGTACGACTGACGTACCGACG" # w zmiennej m przechowujemy wynik poszukiwań m = re.search(r"GA([ATGC]{3})AC([ATGC]{2})AC", dna) print(„calkowita zgodność: " + m.group()) print(„zgodnośc pierwszej cześci: " + m.group(1)) print(„zgodnośc w drugiej częsci wzorca " + m.group(2)) • mamy dostęp do wydzielonych nawiasami grup. • mamy informacje o lokalizacji dna = "ATGACGTACGTACGACTGACGTACCGACG" # w zmiennej m przechowujemy wynik poszukiwań m = re.search(r"GA([ATGC]{3})AC([ATGC]{2})AC", dna) print("calkowita zgodność: " + m.group(), ' start: ', m.start(), ' koniec: ', m.end() ) print("zgodnośc pierwszej cześci: " + m.group(1), ' start: ', m.start(1), ' koniec: ', m.end(1) ) print("zgodnośc w drugiej częsci wzorca " + m.group(2), ' start: ', m.start(2), ' koniec: ', m.end(2)) 4 1/4/2017 dna = "ATGACGTACGTACGACTGACGTACCGACG" wystapienia = re.finditer(r"GA([ATGC]{3})AC([ATGC]{2})AC", dna) for wystapienie in wystapienia: start = wystapienie.start() end = wystapienie.end() print(' mamy od ', start, ' do ' , end) Przykład: nazwy dostępu do genów xkn59438, yhdck2, eihd39d9, chdsye847, hedle3455, xjhd53e, 45da, de37dp Podaj wzorzec , który wybiera z powyższej listy tylko te nazwy które zawierają liczbę 5 zawierają literę d lub e zawierają obie litery d i e i to w tym porządku zawierają litery d i e ,w tym porządku i tylko jedna litera pomiędzy nimi zawierają litery d i e w dowolnym porządku zaczynają się od x lub y Łańcuch konsensusu http://www.cs.unc.edu/~prins/Classes/555/Code/SearchTrees.py 5 http://www.cs.unc.edu/~prins/Classes/555/Code/SearchTrees.py 1/4/2017 Algorytm wyczerpujący Algorytm wyczerpujący z ograniczeniami --- Poziom 0 11- 111 121 22- 21- 12- 112 Poziom 1 2-- 1-- 122 211 212 221 Poziom 2 222 Poziom 3 6 1/4/2017 Prune Interior --- Poziom 0 11- 121 22- 21- 12- 112 111 Poziom 1 2-- 1-- 122 211 212 Poziom 2 222 221 Poziom 3 Prune Exterior --- Poziom 0 11- 111 121 22- 21- 12- 112 Poziom 1 2-- 1-- 122 211 212 221 Poziom 2 222 Poziom 3 7