Projekt H: dopasowanie sekwencji

advertisement
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
Download