Opracowanie przykładów prezentujących zastosowania języka Python w bioinformatyce



Podobne dokumenty
Bioinformatyka. Michał Bereta

Bioinformatyka. Michał Bereta

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

1 Podstawy c++ w pigułce.

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Programowanie w języku Python. Grażyna Koba

1 Podstawy c++ w pigułce.

Bioinformatyka. Ocena wiarygodności dopasowania sekwencji.

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Bazy danych - wykład wstępny

Krzysztof Kadowski. PL-E3579, PL-EA0312,

Laboratorium Technologii Informacyjnych. Projektowanie Baz Danych

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Umieszczanie kodu. kod skryptu

Informatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

QUERY język zapytań do tworzenia raportów w AS/400

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

2017/2018 WGGiOS AGH. LibreOffice Base

Przewodnik Szybki start

Python. Skąd taka nazwa? Kurs systemu UNIX 1

ECDL Podstawy programowania Sylabus - wersja 1.0

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Python dla początkujących. Małgorzata Niewiem AGH, GGiOŚ, Katedra Geoinformatyki i Informatyki Stosowanej SATIM Satelitarny Monitoring

WPROWADZENIE DO BAZ DANYCH

Pętle. Dodał Administrator niedziela, 14 marzec :27

5.5. Wybieranie informacji z bazy

Programowanie robota mobilnego E-puck w języku Python

PHP: bloki kodu, tablice, obiekty i formularze

PROLOG WSTĘP DO INFORMATYKI. Akademia Górniczo-Hutnicza. Wydział Elektrotechniki, Automatyki, Informatyki i Inżynierii Biomedycznej.

Języki programowania zasady ich tworzenia

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Uzupełnij pola tabeli zgodnie z przykładem poniżej,

Podstawy Programowania Podstawowa składnia języka C++

Python wstęp do programowania dla użytkowników WCSS

Dopasowanie sekwencji (sequence alignment)

ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia

Baza danych. Baza danych to:

Podstawy programowania skrót z wykładów:

ECDL/ICDL Użytkowanie baz danych Moduł S1 Sylabus - wersja 6.0

TP1 - TABELE PRZESTAWNE od A do Z

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

ECDL/ICDL Użytkowanie baz danych Moduł S1 Sylabus - wersja 5.0

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

Podstawy Programowania C++

Systemy operacyjne. Laboratorium 8. Perl find

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Podstawy technologii WWW

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

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

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Informatyka Ćwiczenie 10. Bazy danych. Strukturę bazy danych można określić w formie jak na rysunku 1. atrybuty

Autor: Joanna Karwowska

Spis treści. Przedmowa... XI. Wprowadzenie i biologiczne bazy danych. 1 Wprowadzenie Wprowadzenie do biologicznych baz danych...

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Zawartość. Wstęp. Moduł Rozbiórki. Wstęp Instalacja Konfiguracja Uruchomienie i praca z raportem... 6

Informatyka klasa III Gimnazjum wymagania na poszczególne oceny

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

Biblioteka Wirtualnej Nauki

Wprowadzenie (17) Część I. Makra w Excelu - podstawy (23)

Wykład 8: klasy cz. 4

Wykresy i interfejsy użytkownika

Cw.12 JAVAScript w dokumentach HTML

Bazy danych Karta pracy 1

Materiały do laboratorium MS ACCESS BASIC

Języki skryptowe w programie Plans

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Algorytm. a programowanie -

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI

World Wide Web? rkijanka

I. Interfejs użytkownika.

Bazy danych TERMINOLOGIA

Od programowania wizualnego do tekstowego

Technologie informacyjne: Arkusz kalkulacyjny

4. Funkcje. Przykłady

Zintegrowany System Zarządzania Biblioteką SOWA2/MARC21 OBSŁUGA CZASOPISM

5. Bazy danych Base Okno bazy danych

Zakres treści Czas. 2 Określenie charakteru i tematyki strony. Rodzaje witryn. Projekt graficzny witryny. Opracowanie skryptów

MS Excel 2007 Kurs zaawansowany Obsługa baz danych. prowadzi: Dr inż. Tomasz Bartuś. Kraków:

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

OpenOfficePL. Zestaw szablonów magazynowych. Instrukcja obsługi

WYMAGANIA EDUKACYJNE Z INFORMATYKI dla klasy III gimnazjalnej, Szkoły Podstawowej w Rychtalu

Tabela wewnętrzna - definicja

1 Wprowadzenie do algorytmiki

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

WPROWADZANIE ZLECEŃ POPRZEZ STRONĘ INSTRUKCJA UŻYTKOWNIKA

Układy VLSI Bramki 1.0

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Jak zaimportować bazę do system SARE

PODSTAWY BIOINFORMATYKI WYKŁAD 4 DOPASOWANIE SEKWENCJI

Algorytmy i struktury danych. Wykład 4 Tablice nieporządkowane i uporządkowane

Ćwiczenie 1. Wprowadzenie do programu Octave

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

BIOINFORMATYKA BIOLOGICZNE BAZY DANYCH

Transkrypt:

POLITECHNIKA RZESZOWSKA im. I. Łukasiewicza WYDZIAŁ ELEKTROTECHNIKI I INFORMATYKI Katedra Informatyki i Automatyki Opracowanie przykładów prezentujących zastosowania języka Python w bioinformatyce Autor: Wiktor Pęczar Promotor: dr inż. Krzysztof Świder Rzeszów 2010

2

Spis treści 1 WSTĘP... 4 2 BIOLOGICZNE BAZY DANYCH... 5 2.1 PRZEGLĄD BAZ SEKWENCJI NUKLEOTYDOWYCH... 5 2.2 ALGORYTMY DOPASOWANIA SEKWENCJI... 11 2.3 CHARAKTERYSTYKA WYBRANYCH NARZĘDZI... 15 3 JĘZYK PYTHON W ZASTOSOWANIACH BIOINFORMATYCZNYCH 19 3.1 WYBRANE ELEMENTY JĘZYKA... 19 3.2 PRZEGLĄD ZASTOSOWAŃ... 28 3.3 BIBLIOTEKA BIOPYTHON... 30 4 APLIKACJE DO ANALIZY DANYCH GENETYCZNYCH... 35 4.1 PRZYGOTOWANIE DANYCH DO ANALIZY... 35 4.2 WYSZUKIWANIE I PORÓWNYWANIE SEKWENCJI DNA... 37 4.3 PORÓWNYWANIE SEKWENCJI BIAŁKOWYCH... 40 5 PODSUMOWANIE... 43 BIBLIOGRAFIA... 44 DODATEK A... 45 3

1 Wstęp Bioinformatyka to nowoczesna dziedzina nauki zajmująca się rozwojem metod obliczeniowych służących do badania struktury oraz funkcji genów i białek. Jednocześnie rośnie popularność języków programowania takich jak Perl i Python wykorzystywanych w aplikacjach przetwarzających dane biologiczne. Coraz więcej badaczy zaczyna interesować się bioinformatyką, a wraz z rozwojem narzędzi takich jak Biopython ich liczba powinna się zwiększać. Celem pracy jest krótka prezentacja biologicznych baz danych, wybranych narzędzi do analizy danych biologicznych oraz języka programowania Python ze szczególnym uwzględnieniem biblioteki Biopython. Część praktyczną stanowią trzy opracowane przez autora aplikacje do pobierania i analizy sekwencji DNA oraz sekwencji białkowych. Rozdział 2 zawiera charakterystykę najważniejszych baz sekwencji nukleotydowych. Nawiązano do tego jak w odpowiedzi na potrzebę przechowywania informacji o sekwencjach powstały odpowiednie bazy danych oraz jak zbierane w nich dane były organizowane i zapisywane. Opisano również rodzaj przechowywanych informacji oraz strukturę rekordów. W dalszej części rozdziału znajduje się opis kilku najważniejszych algorytmów dopasowania sekwencji DNA oraz krótka charakterystyka narzędzi dostępnych za pośrednictwem strony NCBI (National Center for Biotechnology Information) służących do porównywania i analizy sekwencji. Rozdział 3 w całości poświęcony jest językowi programowania Python. Omówiona została struktura języka oraz zaprezentowano możliwości biblioteki Biopython, która znacznie ułatwia przetwarzanie danych biologicznych jakimi są sekwencje DNA i sekwencje białkowe. W rozdziale wspomniano także o firmach i projektach, które stały się słynne na cały świat dzięki językowi Python. W rozdziale 4 zaprezentowane zostały trzy aplikacje autora napisane w języku Python. Pierwsza z nich Entrez.py służy do wyszukiwania i pobierania informacji z biologicznych baz danych dostępnych przez Internet. Za pomocą kolejnej aplikacji Alg_S_W.py można wykonać porównanie dwóch sekwencji białkowych. Ostatnia, trzecia aplikacja BLAST.py umożliwia przeszukanie za pośrednictwem Internetu wybranej bazy sekwencją pytającą w celu odnalezienia sekwencji do niej podobnych. Pracę kończy krótkie podsumowanie. 4

2 Biologiczne bazy danych 2.1 Przegląd baz sekwencji nukleotydowych Biologiczne bazy danych powstały w celu zaspokojenia rosnących potrzeb w zakresie przechowywania i przetwarzania informacji z tej dziedziny nauki. Na początku były wykorzystywane przez pojedynczych naukowców, umożliwiając wymianę informacji wąskiej grupie specjalistów z dziedziny nauk biomedycznych. Bazy powstały również w celu organizowania danych spływających z realizowanych projektów sekwencjonowania jak np. ustalanie kolejności (sekwencji) aminokwasów w polipeptydach i nukleotydów w kwasach nukleinowych. Stanowiły także pomoc dla firm farmaceutycznych w badaniach nad nowymi lekami. Rolą pierwszych baz danych było zbieranie i opisywanie sekwencji wyznaczanych dostępnymi w tych czasach technikami sekwencjonowania. Gdy funkcjonowały już bazy danych, w których przechowywano sekwencje, zaczęto rozwijać metody analizy gromadzonych danych umożliwiając klasyfikowanie sekwencji, a tym samym katalogowanie rodzin białek i charakteryzowanie związków funkcyjnych między nimi. Obecnie takie metody analizy sekwencji odgrywają kluczową rolę w procesie opisywania genomów. Masowy napływ informacji o genomach wywarł duży wpływ na badania biomedyczne. Dotychczas zgromadzone dane pozwalały naukowcom prowadzić poszukiwania nowych genów i białek, oceniać możliwości ich wykorzystania w terapii farmakologicznej oraz badać, dlaczego różni pacjenci reagują w różny sposób na takie same dawki leków. Ilość dotychczas zebranej informacji jest przytłaczająca. Ogromnym wyzwaniem staje się jej scalenie i przedstawienie w postaci, która pozwoli wykorzystać sekwencje genomów człowieka i innych gatunków do zrozumienia zawiłości biologii molekularnej, co z kolei umożliwi pełne zrozumienie związków pomiędzy określonymi zmianami genetycznymi a chorobami. Struktura rekordów Struktura rekordów jest ściśle określona dla poszczególnych baz danych. Dzięki temu dane mogą być wczytywane i automatycznie przetwarzane przez komputer. W tym celu konieczna jest informacja o tym, jakiego typu dane zawiera rekord i gdzie należy ich szukać. Z każdym rekordem w bazie danych wiąże się tzw. numer dostępu - niepowtarzalne i nie ulegające zmianie oznaczenie przypisywane rekordowi w chwili jego umieszczania w bazie. Numery dostępu są łatwo wyszukiwane i indeksowane przez komputery. Ponadto rekordom w niektórych bazach danych przypisuje się 5

dodatkowy identyfikator tekstowy (ID), który w skróconej formie niesie informacje o zwartości określonego rekordu w sposób zrozumiały dla użytkownika. Istotnym elementem definicji bazy danych jest struktura i zawartość rekordu. Każdy rekord bazy danych sekwencji nukleotydowych powinien zawierać nazwę genu, informacje o organizmie, z którego pochodzi, kto i kiedy go sekwencjonował, a także, jeśli to możliwe, jaka jest jego funkcja i struktura. Niewątpliwie cenna będzie również informacja o wszelkich publikacjach naukowych, które opisują wyniki badań dotyczących określonego genu. Wymienione rodzaje informacji są odmiennie traktowane w różnych bazach danych. Nie ma jednego sposobu umieszczania tych informacji w rekordach, ale ważne jest, aby konsekwentnie stosować raz ustalony sposób zapisu danych określonego typu. Im lepiej przemyślana struktura rekordów, tym łatwiej można je wykorzystać. Sekwencja DNA - jest to kolejność nukleotydów w cząsteczce DNA. Oznaczana jest za pomocą skrótów od zasad wchodzących w skład nukleotydów np. CCGATTACGT. Analogicznie, sekwencja RNA to kolejność nukleotydów w cząsteczce RNA, z tym, że w RNA nie występuje tymina "T", a uracyl "U". Powyższa sekwencja wyglądałaby więc tak: CCGAUUACGU. Istnieje wiele baz danych zawierających sekwencje. Chcąc wyświetlić zawartość pliku z pojedynczym rekordem danych trzeba przewinąć jego część zanim dotrze się do fragmentu z sekwencją. Zwykle w tej części rekordu liczba znaków jest ściśle ograniczona, a czasami kolejne reszty w sekwencji są podane w grupach po 10 znaków. Liczby podane na początku i na końcu kolejnych wierszy zawierających sekwencje ułatwiają zorientowanie się, w jakim miejscu aktualnie się znajdujemy. Wiele pakietów oprogramowania bioinformatycznego ma własny format zapisu sekwencji. Jednym z najprostszych jest format FASTA. Format ten składa się z jednej linii informacyjnej rozpoczynającej się od znaku > (większe niż) zawierającej opis całej sekwencji. W kolejnych wierszach jest podana właściwa sekwencja. Zaleca się aby wszystkie linie w pliku FASTA były nie dłuższe niż 80 znaków. Zawartość początkowego fragmentu pliku w formacie FASTA z sekwencją kodującą białko ludzkiego prionu przedstawiono na rys.1. Rys.1 Fragment pliku w formacie FASTA W przykładzie z rys.1 pierwszy wiersz zawiera numer dostępu (M13667), identyfikator tekstowy (HUMPRP0A), skrótową nazwę bazy (gb) oraz numer sekwencji (190469) który jest opcjonalny. Właściwie po znaku > można umieścić dowolny ciąg znaków, a większość z programów używanych w bioinformatyce do analizy sekwencji poprawnie rozpozna taki plik jako zapisany w formacie FASTA. 6

Pierwszymi bazami danych sekwencji nukleotydowych były EMBL i GenBank obie powstały w 1982 roku. Po nich, w roku 1986, powstała baza danych DDBJ i powiązana z nią baza danych INSD [5]. EMBL Baza danych EMBL jest podstawowym zbiorem sekwencji nukleotydowych w Europie. Jej zasoby zostały opublikowane po raz pierwszy w czerwcu 1982 roku i obejmowały 568 rekordów. Zarządzanie bazą danych zajmuje się European Bioinformaties Insttitute (EBI) mieszczący się w Histon, angielskiej placówce European Molecular Biology Laboratory (EMBL), którego główna siedziba jest zlokalizowania w Heidelbergu w Niemczech. Początkowo głównym źródłem wykorzystywanym do poszerzania zasobów bazy danych EMBL były sekwencje opublikowane w czasopismach naukowych. Obecnie jednak najczęstszą praktyką jest deponowanie sekwencji za pomocą Internetu. Taka elektroniczna forma deponowania jest ważna, gdyż przyjęte dla niej procedury narzucają określone standardy wprowadzania danych i pozwalają na ograniczenie liczby błędów w rekordach bazy danych. Znaczna część danych jest pozyskiwana również bezpośrednio z ośrodków sekwencjonowania. Wielkość bazy danych rośnie w oszałamiającym tempie w roku 2004 zawierała ona 30 351 263 rekordy, dla porównania w roku 2006 baza ta posiadała już 83 666 567 rekordów. Z uwagi na ogromną ilość gromadzonych danych, a także w celu ułatwienia zarządzania tymi danymi, zasoby bazy danych EMBL zostały podzielone na mniejsze części. Podstawą powstania większości działów EMBL była klasyfikacja taksonomiczna organizmu źródłowego sekwencji (np. bezjądrowce, grzyby, rośliny i ssaki). Zawartość pola rekordu bazy danych EMBL, mieści się zwykle w pojedynczym wierszu pliku. Na początku każdego wiersza znajduje się dwuznakowa etykieta opisująca typ danych zawarty w dalszej części wiersza. Istnieje ponad 20 różnych oznaczeń wierszy związanych z różnymi typami danych, np. w wierszu z etykietą ID znajduje się identyfikator rekordu, grupa taksonomiczna i długość sekwencji. Inne wiersze zawierają między innymi: numer dostępu (AC) podstawowe oznaczenie sekwencji, nie ulegające zmianie w kolejnych wydaniach bazy dnach, opis (DE) - zawiera symbole genów zawartych w sekwencji, lokalizacje genomową sekwencji, a także wiele innych informacji, odnośniki literaturowe (PN i RP) do publikacji z wynikami badań dotyczących określonej sekwencji, odsyłacze do rekordów z różnych baz danych (DR), które w jakiś sposób są związane z określoną sekwencją, komentarze (CC), hasła kluczowe (KW), które wskazując na zagadnienia funkcjonalne, strukturalne lub ważne z innych powodów własności sekwencji, mogą być wykorzystywane do tworzenia dodatkowych powiązań między rekordami tej samej bazy, tablice cech (FT), w których znajdują się adnotacje do określonej sekwencji z informacjami o położeniu sekwencji sygnałowych, sekwencji kodujących białko i innych znanych cech sekwencji. Tablica cech może również zabierać 7

opis wszelkich niejasności, na które zwrócono uwagę w trakcie opracowywania danych. GenBank GenBank jest bazą danych sekwencji nukleotydowych zarządzaną przez National Center for Biotechnology Information (NCBI) w Bethesda w USA. Jej zasoby zostały po raz pierwszy opublikowane w grudniu 1982 roku i obejmowały 606 rekordów. Dane gromadzone w bazie danych pochodzą od indywidualnych badaczy, z prowadzonych na dużą skalę projektów sekwencjonowania, z baz danych Genome Sequence Data Base w Santa Fe w USA oraz z różnych międzynarodowych biur patentowych, a także z bezpośredniej wymiany między partnerami zrzeszonymi w ramach INSD. Wielkość bazy danych GenBank rośnie w ogromnym tempie, głównie z powodu deponowania w niej sekwencji EST (Expressed Sequence Tags). Są to krótkie fragmenty genów, które zostały sklonowane i zsekwencjonowane, a następnie zdeponowane w publicznych genowych bazach danych). W lutym 2004 roku baza GenBank zawierała 30 968 418 rekordów, natomiast w lutym 2008 roku ta sama baza posiadała już 82 853 685 rekordów. W bazie tej można zaleźć między innymi sekwencje następujących gatunków: Homo sapiens (człowiek rozumny), Mus musculus (mysz domowa), Rattus norvegicus (szczur wędrowny) oraz Zea mays (kukurydza zwyczajna). Z uwagi na wielkość bazy danych oraz różnorodności źródeł danych, rekordy bazy danych GenBank zostały podzielone na działy odpowiadające w dużej części ustalonym grupom taksonomicznym, ale również typowi zawartych w nich sekwencji (EST, GSS, HTG, itd.). Aktualny podział bazy GenBank znajduje się w tab.1. Dział PRI ROD MAM VRT INV PLN BCT VRL PHG SYN UNA EST PAT STS GSS HTG HTC Typ sekwencji lub jej pochodzenie Z naczelnych Z gryzoni Z innych ssaków Z innych gryzoni Z bezkręgowców Roślinne, z grzybów i glonów Bakteryjne Wirusowe Z bakteriofagów Sztucznie wytworzone Nieopisane Znaczniki sekwencji ulegających ekspresji Opatentowane Miejsca markerowe sekwencji Sekwencje przeglądowe genomu Wysokoprzepustowe sekwencje genomowe Wysokoprzepustowe sekwencje cdna Tab.1 Działy bazy GenBank [4] Wiele serwisów sieciowych tworzy powiązania hipertekstowe do rekordów bazy GenBank zawierających sekwencję i towarzyszące jej adnotacje. Warto więc przyjrzeć się bliżej formatowi takiego rekordu. 8

Pola rekordu zwierają dane, których typ jest oznaczony etykietami. Zwartość niektórych pól mieści się w pojedynczych wierszach pliku z rekordem. W przypadku złożonych typów danych, pole rekordu może odpowiadać więcej niż jednemu wierszowi. Najbardziej złożonym typem danych, który wchodzi w skład rekordu bazy danych GenBank jest tablica cech sekwencji. W przykładowym rekordzie bazy, którego zawartość pokazano na rys.2, występuje 11 etykiet: LOCUS, DEFINITION, ACCESSION, VERSION, KEYWORDS, SOURCE, REFERENCE, COMMENT, PEATURES, BASE COUNT i ORGIN. Etykieta LOCUS pozwala zdefiniować kodowe oznaczenie dla określonego rekordu bazy (tu HUMPRP0A). Pole oznaczone tą etykietą, zwiera również inne istotne dane takie jak: liczba nukleotydów, źródło danych sekwencyjnych (mrna) oraz datę zdeponowania sekwencji w bazie. Pole DEFINITION zawiera zwięzły opis sekwencji (w omawianym przykładzie, human prion protein). Następne mamy pole ACCESSION zawierające numer dostępu - unikalne oznaczenie każdego rekordu. Po nim występuje pole VERSION, które zawiera informacje o liczbie zmian sekwencji oraz nr sekwencji nukleotydowej (ang. Genino identifier, tu GI: 190469). Pole KEYWORDS zawiera listę haseł kluczowych przypisanych sekwencji przez autora rekordu. Pole SOURCE zawiera informacje o źródle pochodzenia sekwencji. Etykietą ORGANISM oznaczono biologiczną klasyfikację organizmu. W polu REFERENCE są umieszczone informacje wiążące określone fragmenty sekwencji z podanymi publikacjami naukowymi. Pole COMMENT umożliwia umieszczenie w rekordzie rozmaitych komentarzy dotyczących danej sekwencji. Etykieta FEATURES wskazuje na początek tabeli cech, w której znajduje się szczegółowy opis sekwencji. Kolejne pole rekordu jest oznaczone etykietą BASE COUNT i zawiera informacje o nukleotydowym składzie sekwencji (tu 669 A, 500 C, 583 G, 668 T). W polu ORGIN jest podana, o ile jest to możliwe, informacja o lokalizacji genomowej pierwszego nukleotydu sekwencji. Rekord zakończony jest polem oznaczonym etykietą / / [4]. 9

Rys. 2 Struktura przykładowego rekordu bazy GenBank dla białka ludzkiego prionu DDBJ Baza danych DDBJ (DNA Data Bank of Japan) powstała w 1986 roku w National Institute of Genetics (NIG) w Mishima w Japonii. DDBJ działa obecnie jako część INSD, a podstawowym źródłem jej poszerzających się zasobów są rozmaite ośrodki sekwencjonowania, przede wszystkim jednak międzynarodowe konsorcjum sekwencjonowania ludzkiego genomu. Wielkość bazy danych rośnie więc gwałtownie. Aby poradzić sobie z takim napływem danych, kuratorzy bazy danych wykorzystują lokalnie rozwijane oprogramowanie do masowej obsługi procesu deponowania i przetwarzania danych, co poprawia spójność danych i ogranicza rozprzestrzenianie się błędów. W lutym w 2004 roku DDBJ zawierała 30 405 173 rekordy, natomiast w wrześniu 2010 roku baza ta posiadała już 124 079 491 rekordów co świadczy o ciągłym napływie nowych informacji do bazy DDBJ. Dla wygodniejszego zarządzania powiększającą się bazą danych, podzielono ją na działy - w każdym z nich są 10

gromadzone sekwencje dla tego samego organizmu źródłowego. Dodatkowo znajduje się w niej oddzielny dział zawierający opatentowane dane zbierane i przetwarzane prze Japanease Patent Office. INSD Realizowane projekty sekwencjonowania dostarczały tak ogromne ilości danych, że pojedyncze grupy badawcze nie były w stanie na bieżąco ich kompletować. W lutym 1986 roku ludzie zajmujący się bazami danych EMBL i GenBank zadecydowali o podjęciu wspólnych działań w celu uproszczenia i standaryzacji procesów gromadzenia sekwencji. W roku 1987 projektem objęto również zasoby baz danych DDBJ. Obecnie w każdej z tych trzech baz danych deponowana jest część generowanych na całym świecie danych sekwencyjnych, a zawartość baz danych jest codziennie synchronizowana za pośrednictwem Internetu. Na rys.3 przedstawiono strukturę bazy INSD. Rys. 3 Struktura bazy danych INSD obejmująca bazy EMBL, GenBank, DDBJ Wynikiem nawiązanej współpracy było powstanie baza danych INSD (International Nucleotide Sequence Database), dzięki której bazy: EMBL, GenBank i DDBJ charakteryzują się obecnie taką samą ilością i jakością danych, a użytkownicy, deponując dane w jednej z tych baz danych, maja pewność, że będą one dostępne również i w pozostałych bazach danych. Zasoby wszystkich baz danych wchodzących w skład INSD powiększają się w wyniku bezpośredniego deponowania danych przez pojedyncze laboratoria oraz realizacji prowadzonych na dużą skalę projektów sekwencjonowania. W roku 2005 zawierała ona sekwencje DNA ponad 150 000 organizmów, a liczba ta ciągnie rośnie [4]. 2.2 Algorytmy dopasowania sekwencji W bioinformatyce, dopasowanie sekwencji jest sposobem dopasowania struktur pierwszorzędowych DNA, RNA, lub białek do zidentyfikowania regionów wykazujących podobieństwo, mogące być konsekwencją funkcjonalnych, strukturalnych, lub ewolucyjnych powiązań pomiędzy sekwencjami. Zestawione sekwencje nukleotydów lub aminokwasów są zazwyczaj przedstawione jako wiersze macierzy. Pomiędzy reszty wprowadzane są przerwy, tak że reszty zbliżonych do siebie sekwencji tworzą kolejne kolumny. Na rys.4 przedstawiono jeden ze sposobów porównywania ludzkich białek. 11

Rys. 4 Przykład dopasowania sekwencji, dwóch ludzkich białek Jeśli dwie dopasowywane sekwencje mają wspólne pochodzenie, niedopasowania mogą być interpretowane jako mutacje punktowe, a przerwy jako indele (mutacje polegające na delecji jeden lub więcej nukleotydów wypada z sekwencji DNA lub insercji jeden lub więcej nukleotydów zostaje wstawionych do sekwencji DNA), które zaszły w jednej lub obu liniach od czasu, kiedy obie sekwencje uległy rozdzieleniu. Pokazano to na rys.5. W przypadku dopasowywania sekwencji białek, stopień podobieństwa pomiędzy aminokwasami zajmującymi konkretną pozycję, może stanowić miarę tego, jak konserwatywny jest dany region lub motyw. Brak substytucji lub obecność jedynie konserwatywnych substytucji (tj. zamiany reszty na inną, ale o podobnych właściwościach chemicznych) w określonym regionie sekwencji sugeruje, że jest on ważny strukturalnie lub funkcjonalnie. 12 Rys. 5 Mutacje w informacji genetycznej Bardzo krótkie lub bardzo podobne sekwencje mogą być dopasowane ręcznie. Często jednak konieczne jest dopasowanie licznych, bardzo długich i zmiennych sekwencji, które nie mogą być dopasowane tylko i wyłącznie ludzkim wysiłkiem. Zamiast tego, wysiłek wkładany jest w opracowanie algorytmów umożliwiających wysokiej jakości dopasowania, ewentualnie wprowadzanie poprawek do uzyskanych w ten sposób rezultatów. Ogólnie, podejścia obliczeniowe do dopasowywania sekwencji mogą być dwojakiego rodzaju: dopasowań globalnych i dopasowań lokalnych. Obliczanie dopasowania globalnego jest formą optymalizacji globalnej, w której dopasowanie musi obejmować całą długość wszystkich analizowanych sekwencji. Przeciwnie, dopasowanie lokalne identyfikuje podobne regiony w obrębie długich

sekwencji, które rozpatrywane w całości nie muszą wykazywać znacznego podobieństwa. Dopasowanie lokalne jest bardziej znaczące do porównywania białek z różnych rodzin, gdyż pozwala wykryć powtarzające się fragmenty (motywy), które często maja wpływ na funkcjonalność białka. Dopasowania lokalne są zazwyczaj preferowane, ale ich obliczenie może być trudniejsze z uwagi na dodatkowe wyzwanie określenia regionów wykazujących podobieństwo. Różnorodne algorytmy są stosowane do dopasowań sekwencji, w tym powolne, ale formalnie optymalizujące metody, jak programowanie dynamiczne, także efektywne metody heurystyczne. Zarys problemu Dopasowanie par sekwencji wykonuje się zwykle zakładając, że są one homologiczne, czyli że wywodzą się od wspólnego przodka. Do wyznaczenia najlepszego dopasowania sekwencji potrzeba systemu punktacji. Wiadomo, że dopasowywane sekwencje zawierają litery z alfabetu dopuszczalnych znaków. W przypadku DNA na alfabet składają się znaki A, C, G, T. W przypadku białek alfabet liczy aż 20 znaków odpowiadających jednoliterowym symbolom aminokwasów. Jednym z elementów systemu punktacji są oceny dopasowań dla każdej możliwej pary S α, β. W przypadku DNA punktacja par zasad jest bardzo znaków w alfabecie ( ) prosta: S (, ) = 1, jeśli α i β są takimi samymi nukleotydami oraz S (, ) = 0 α β α β, gdy nukleotydy α i β są różne. Jak wiadomo sekwencje DNA mogą zawierać przerwy. Ich występowanie pozwala tak przesuwać względem siebie fragmenty sekwencji, że odcinki sekwencji charakteryzujące się wysokim lokalnym podobieństwem staną się łatwo widoczne. Drugim elementem systemu punktacji jest funkcja kary za przerwy. W ogólnym przypadku można zdefiniować W (l) jako funkcję kary za przerwę o długości l znaków. Najprościej przedstawić W (l) w postaci funkcji linowej. W ( l) = g * l, co oznacza, że kara za jeden znak przerwy w dopasowaniu sekwencji jest równa g, a kara za całą przerwę jest równa iloczynowi g i długości przerwy. W rzeczywistości jednak przerwa obejmująca trzy reszty może nie być trzykrotnie mniej prawdopodobna niż przerwa o jednostkowej długości. Dłuższa z tych przerw mogła być przecież wynikiem pojedynczego zdarzenia w ewolucji. Prawdopodobieństwo, że tak się stało zależy zatem od charakteru odpowiedzialnej za to mutacji, czyli błędu w replikacji DNA, którego skutek jest widoczny jako przerwa w dopasowaniu dwóch homologicznych sekwencji genu. Chociaż nie ma teoretycznych podstaw, które mogły by pomóc w wyborze funkcji kary za przerwy, to jednak poczyniono w tej kwestii pewien postęp, analizując empiryczny rozkład długości przerw ( Benner, Cohen i Gonnet, 1993). Z praktycznych względów funkcja punktacji przerw ma zwykle dość prostą postać. W praktyce najpowszechniej wykorzystywanym sposobem punktacji przerw jest afiniczna funkcja kary za przerwy, której przebieg znajduje się na rys.6. Zakładamy w tym przypadku, że kara za utworzenie nowej przerwy jest równa g open, natomiast kara za jednostkowe wydłużenie istniejącej przerwy jest równa g ext. Zatem kara za przerwę o długości l to W ( l) = gopen + gext ( l 1). Przebieg takiej funkcji pokazano na rys.6 linią koloru niebieskiego. Z powodów opisany powyżej zazwyczaj gext jest mniejsze od g open. Właściwie przebieg afinicznej funkcji kary za przerwy niewiele różni się od oczekiwanego przebiegu uogólnionej funkcji kary za przerwy [4]. 13

Rys. 6 Funkcje kary za przerwy W (l) - liniowa, afiniczna i uogólniona [4] Dysponując kompletną definicją systemu punktacji, można wyznaczyć ocenę dopasowania pary sekwencji: ocena = dopasowane _ pary S( α, β ) przerwy W ( l) Metoda Smitha Watermana Algorytm Smitha-Watermana - to algorytm bazujący na programowaniu dynamicznym umożliwiający poszukiwanie optymalnych lokalnych dopasowań sekwencji. Wydaje się całkiem naturalne, aby traktować ocenę dopasowań par sekwencji jako miarę prawdopodobieństwa między tymi sekwencjami. Często zdarza się, że interesuje nas określona sekwencja i chcemy wiedzieć, czy istnieją inne, podobne do niej sekwencje. W tym celu należy wyznaczyć dopasowania określonej sekwencji (sekwencji pytającej query sequence) kolejno z poszczególnymi sekwencjami w bazie danych, za każdym razem zapamiętując ocenę dopasowania. Takie oceny należy następnie uporządkować w kolejności malejącej i zwrócić użytkownikowi szczegółowe informacje o sekwencji zajmujących czołowe miejsca na liście trafień. Algorytm FASTA Algorytm FASTA rozpoczyna swoje działanie od wyszukania w bazie danych fragmentów sekwencji o minimalnej długości ktup (dla sekwencji białek i DNA domyślne wartości ktup są równe, odpowiednio, 2 i 6 reszt) dokładnie pasujących do odpowiednich fragmentów sekwencji w zapytaniu. Następnie w macierzy ocen cząstkowych dopasowania są identyfikowane tzw. ciągi diagonalne (diagonal runs), które zawierają największa liczbę fragmentów ktup położonych względnie blisko siebie. W dalszych etapach algorytmu jest wykorzystana informacja o 10 takich najlepiej ocenionych ciągach diagonalnych. Odpowiadają one wysoko ocenionym lokalnym dopasowaniem bez przerw. Algorytm ustala następnie, które z ciągów diagonalnych mogą być ze sobą połączone w jednym dopasowaniu, gdzie będzie dopuszczalne występowanie przerw. Ocena wyznaczonych w taki sposób przybliżonych dopasowań jest potem wykorzystywana do uporządkowania sekwencji z bazy danych według ich malejącego podobieństwa do zadanej sekwencji. Dla sekwencji zajmujących czołowe miejsca na liście jest uruchamiana procedura wyznaczania dopasowania metodą programowania dynamicznego. W ten sposób najbardziej czasochłonne obliczenia są 14

wykonywane jedynie dla sekwencji w bazie danych, których podobieństwo do sekwencji w zapytaniu uznano za stosunkowo duże. Algorytm BLAST Za pomocą algorytm Blast (Basic Local Alignment Serach Tool) wyznacza się najlepiej ocenione, pozbawione przerw lokalne dopasowanie sekwencji w zapytaniu i kolejnych sekwencji z bazy danych. W algorytmie jest zdefiniowana wartość parametru długości słowa w mającego podobne znaczenie, jak ktup w algorytmie FASTA. Zwykle długość w jest równa 3 dla sekwencji białkowych oraz 12 dla sekwencji nukleotydowych. BLAST przeszukuje bazę danych sekwencji w celu zidentyfikowania słów o długości w, których ocena dopasowania ze słowami z sekwencji pytającej przekracza ustaloną wartość progową T. Następnie wyznacza się lokalne dopasowanie przez rozbudowę prowadzoną na obu końcach słowa. Niezależnie od kierunku rozbudowy, wydłużanie dopasowania jest przerywane w chwili, kiedy wielkość oceny obniży się względem wcześniej osiągniętego maksimum o więcej niż pewną zadaną wartość. Z pośród wyznaczonych w taki sposób dopasowań lokalnych jest zwracane to najwyżej ocenione [6]. 2.3 Charakterystyka wybranych narzędzi Entrez to system służący do uzyskiwania danych, rozwijany przez National Center for Biotechnology Information (NCBI). Zapewnia zintegrowany dostęp do różnych dziedzin danych, takich jak literatura, sekwencje nukleotydów i protein, kompletne genomy, czy struktury trójwymiarowe. Entrez obsługuje wiele baz danych, m.in.: PubMed, GenBank, EMBL, OMIA, PubChem Compound, PubChem Substance. Jest jednym z najpowszechniej używanych systemów uzyskiwania danych z biologicznych internetowych baz danych. Zasady korzystania z systemów NCBI Dostęp do genetycznych baz danych firmy NCBI jest całkowicie darmowy, wystarczy tylko przestrzegać kilku prostych zasad: nie należy przeciążać systemów NCBI, użytkownicy, którzy zamierzają wysyłać liczne zapytania lub pobierać wiele rekordów danych powinni wykonywać te operację w weekendy między godziną 9 popołudniu a 5 rano, w dni powszechne żadna seria nie może przekraczać 1000 zapytań, nie wolno wysyłać więcej niż 3 zapytania w ciągu 1 sekundy, podczas wysyłania zapytań powinno się podać adres email skrzynki pocztowej aby firma NCBI mogła w razie wystąpienia jakichkolwiek problemów skontaktować się z użytkownikiem w celu ich eliminacji. Jeśli użytkownik nie będzie przestrzegał tych zasad, jego dostęp do zasobów NCBI może zostać zablokowany [8]. Wyszukiwanie informacji ze wszystkich dostępnych w serwisie NCBI baz danych odbywa się w podobny sposób, za pomocą interfejsu Entrez (rys.7). Użytkownik ma możliwość wyboru rodzaju bazy, którą chce przeszukać. Istnieje także 15

możliwość przeszukania wszystkich baz jednocześnie. Po wybraniu rodzaju bazy należy wpisać hasło, które ma być wyszukane, np. yeast mitochondrial ribonuclease (bez znaków ), wyszuka sekwencję, w których opisie występują te trzy słowa. Jeżeli chcemy aby złożona fraza traktowana była jako całość, należy wziąć ją w cudzysłów. Autorów publikacji wyszukuje się wpisując nazwisko i inicjały imienia, bez znaków przestankowych. Na rys.8 przedstawiono przykładowy wynik uzyskany po przeszukaniu podanym powyżej przykładowym hasłem bazy sekwencji białek. Kliknięcie dowolnego z numerów dostępu wyświetli pełną informację o sekwencji w formacie GenBank. Rys. 7 Wyszukiwanie informacji w serwisie NCBI 16 Rys. 8 Lista wyszukanych w bazie danych sekwencji

Można także łączyć kilka sekwencji w jedną stronę do wyświetlenia w kilku wybranych formatach, zapisywać je na dysku lub w schowku systemowym. Sekwencje wybiera się zaznaczając je w boksach po lewej stronie. Na samym dole strony mamy przycisk Sent to. Naciśnięcie tego przycisku wyśle zaznaczone sekwencje do wcześniej wybranego celu (plik lub schowek systemowy). W ten sposób można łatwo zapisać kilka wybranych sekwencji do jednego pliku w formacie FASTA i później poddawać je różnym analizom. Serwer BLAST Poza wyszukiwaniem sekwencji na podstawie jej opisu, podstawowym sposobem korzystania z biologicznych baz danych jest wyszukiwanie sekwencji homologicznych do podanej przez użytkownika. Najczęściej stosowanym narzędziem do poszukiwania homologii w bazach danych jest algorytm BLAST. Serwis BLAST jest dostępny pod tym adresem: http://blast.ncbi.nlm.nih.gov/blast.cgi w kilku wariantach (rys.9), zależnie od tego, jaki charakter ma sekwencja użyta do przeszukiwania oraz rodzaj przeszukiwanej bazy danych. Warianty BLAST: nucleotide blast wyszukiwanie sekwencji DNA w bazie sekwencji nukleotydowych protein blast służy do przeszukiwania zapytaniem białkowym bazy sekwencji białkowych blastx stosowany jest w zapytaniach nukleotydowych, które tworzy translację wpisanego zapytania i porównuje uzyskany wynik z bazą sekwencji białkowych tblastn w wariancie tym zapytaniem jest sekwencja nukleotydowa, która jest poddawana translacji i stosowana do przeszukiwania bazy sekwencji nukleotydowych Rys. 9 Lista dostanych wariantów przeszukiwań w serwisie BLAST 17

Po wybraniu odpowiedniego wariantu przeszukiwania pojawia się nam kolejne okno w którym należy wprowadzić sekwencje pytającą (query sequence). Obsługa i parametry wszystkich wariantów są bardzo podobne. Zapytanie można wprowadzić na dwa sposoby wklejając w odpowiednie okienko programu sekwencje w formacie FASTA, albo podając numer dostępu, jeżeli jest to wpisana już do bazy danych sekwencja. Przykład podstawowego ekranu wprowadzania danych dla sekwencji nukleotydowych przedstawia rys.10. Poza polem do wprowadzania sekwencji pytającej, znajduje się tu również lista dostępnych baz danych. Skład tej listy zależy od tego, czy mamy do czynienia z bazami sekwencji DNA, czy białkowymi. Po tych czynnościach pozostaje użytkownikowi kliknąć na przycisk Blast, co zaowocuje wyświetleniem znalezionych informacji. Rys. 10 Podstawowy interfejs serwisu BLAST i lista dostępnych baz danych 18

3 Język Python w zastosowaniach bioinformatycznych 3.1 Wybrane elementy języka Python jest współczesnym językiem programowania, którego znaczenie i wartość rośnie dzisiaj bardzo szybko. Cechą wyróżniającą Python na tle innych języków jest składnia języka ściśle związana z formatowaniem - dzięki temu kod jest bardziej czytelny. Dodatkowe zalety to dynamiczne typy danych, programowanie funkcyjne, automatyczne zarządzanie pamięcią i możliwość praktycznego programowania w locie, dzięki dostępności linii poleceń interpretera. Python nie wymusza stylu programowania. W Pythonie możemy programować obiektowo, strukturalnie i funkcyjnie. Jest pod pewnymi względami podobny do Perl'a, jednakże wyróżnia go prostsza składnia, czytelna nawet dla osób nie znających języka. Zmienne Pyhona mają dynamiczne typy, wszystkie wartości przekazywane są przez referencję w praktyce każda zmienna jest "wskaźnikiem" do pewnego elementu w pamięci zarządzanej dynamicznie. Posiadanie dwóch kopii tej samej wartości wymaga dokonania operacji kopiowania tej pamięci, o czym należy pamiętać. W praktyce ten mechanizm zmniejsza zużycie pamięci przez programy i zwiększa ich wydajność. Standardowa biblioteka Pythona stanowi zbiór różnorodnych komponentów. Zawiera ona definicje typów danych, takie jak liczby i listy, które można zaliczyć do "jądra" języka. Dla tych typów jądro języka definiuje formy literałów i narzuca pewne zasady dotyczące ich składni, lecz w pełni tej składni nie definiuje. Jądro języka definiuje natomiast takie własności składniowe, jak pisownia i priorytety operatorów. Biblioteka standardowa zawiera również wbudowane funkcje i wyjątki - obiekty, które mogą być użyte przez jakikolwiek kod Pythona bez potrzeby stosowania operacji importu. Niektóre z nich są zdefiniowane przez jądro języka, lecz wiele z nich nie ma znaczenia dla podstawowej składni języka. Na większą część biblioteki składa się zbiór modułów. Zbiór ten można podzielić na wiele sposobów. Istnieją moduły napisane w C i wbudowane w interpreter Pythona, inne są napisane w Pythonie i importowane w postaci kodu źródłowego. Niektóre moduły udostępniają interfejsy bardzo specyficzne dla Pythona, takie jak wypisywanie stosu wywołań. Część modułów udostępnia interfejsy specyficzne dla szczególnego systemu operacyjnego, jak na przykład dostęp do specjalizowanego sprzętu. Inne moduły zawierają interfejsy specyficzne dla konkretnej dziedziny oprogramowania np. World Wide Web. Kod Pythona można tworzyć w dowolnym edytorze tekstowym, który umożliwia zapis i odczyt plików tekstowych stosujących kodowanie znaków ASCII lub UTF-8 Unicode. Domyślnie pliki Pythona stosują kodowanie UTF-8 obejmujące 19

większy zbiór znaków niż ASCII. Za pomocą kodowania UTF-8 można przedstawić każdy znak w każdym języku. Pliki Pythona zwykle mają rozszerzenie.py, chociaż w niektórych systemach z rodziny Unix (na przykład Linux i Mac OS X) pewne aplikacje Pythona nie mają rozszerzenia pliku. W niniejszej pracy moduły Pythona oraz programy zawsze mają rozszerzenie.py. Wszystkie przykłady zaprezentowane w tejże pracy można w niezmienionej postaci uruchomić na każdej platformie sprzętowej z zainstalowanym interpreterem języka Python 2.6. Składnia Wyróżnikiem Pythona na tle innych języków jest jego składnia oparta na wydzielaniu bloków przez wcięcia. Brak jest nawiasów klamrowych, czy słów "begin" i "end". Krytycy Pythona uważają to za cofnięcie się do czasów kart perforowanych, gdzie układ kodu był istotny dla prawidłowego programowania. Zwolennicy zaś twierdzą, że profesjonalne programowanie i tak narzuca standard kodowania, przez co Python z automatu w tej kwestii jest pomocny. Poniżej przedstawiono kod zawierający definicję funkcji silnia. def silnia(x): Funkcja obliczająca silnię if x == 0: # Blok instrukcji warunkowej return 1 else: return x * silnia(x-1) Komentarze w Pythonie rozpoczynają się znakiem "#" i obowiązują do końca linii. Komentarze wielowierszowe ograniczone są znakami """. Ustawione w pierwszej linii klasy lub funkcji oraz na początku modułu stanowią element docstring, będący częścią automatycznego systemu dokumentacji pydoc. Typy liczbowe Istnieją cztery różne typy liczbowe: zwykłe liczby całkowite (int), długie liczby całkowite (long), liczby zmiennoprzecinkowe (float) i liczby zespolone (complex). Dodatkowo jako podtyp typu całkowitego został zdefiniowany typ logiczny. Zwykłe liczby całkowite są zaimplementowane z wykorzystaniem typu long języka C, który daje przynajmniej 32 bitową precyzję. Długie liczby całkowite mają nieograniczoną precyzję. Liczby zmiennoprzecinkowe są zaimplementowane z wykorzystaniem typu double języka C. Python w pełni obsługuje arytmetykę na różnych typach: w przypadku, gdy operator dwuargumentowy posiada operandy różnych typów liczbowych, operand "węższego" typu zostaje przekonwertowany do typu drugiego operandu, to znaczy zwykła liczba całkowita jest węższego typu od długiej liczby całkowitej, która jest węższego typu od liczby zmiennoprzecinkowej, która z kolei jest węższego typu od liczby zespolonej. Każdy typ liczbowy obsługuje wszystkie operacje zamieszczone w tab.2. Ułożone są one według rosnącego priorytetu (operacje w tej samej komórce posiadają równy priorytet). Wszystkie operacje liczbowe posiadają wyższy priorytet od operacji porównania. 20

Operacja wynik x + y suma x i y x - y różnica x i y x * y iloczyn x i y x / y iloraz x i y x % y reszta z ilorazu x / y -x zanegowane x +x x nie zmienione abs(x) wartość bezwzględna x int(x) x przekonwertowany na liczbę całkowitą long(x) x przekonwertowany na długą liczbę całkowitą float(x) x przekonwertowany na liczbę zmiennoprzecinkową complex(re,im) liczba zespolona z częścią rzeczywistą re, częścią urojoną im im domyślnie przyjmowane jest jako zero. c.conjugate() conjugate of the complex number c divmod(x, y) para (x / y, x % y) pow(x, y) x do potęgi y x ** y x do potęgi y Tab.2 Możliwe operacje liczbowe w języku Python Ciągi znakowe czyli napisy Oprócz liczb Python może również manipulować ciągami znaków, które można wyrazić na parę sposobów. Mogą one być objęte pojedynczym lub podwójnym cudzysłowem. >>> 'A\'propos' "A'propos" >>> "A'propos" "A'propos" >>> '"Tak," powiedział.' '"Tak," powiedział.' >>> "\"Tak,\" powiedział." '"Tak," powiedział.' Ciągi znaków mogą być ujęte w pary potrójnych cudzysłowów: """ lub '''. Końce linii nie muszą być w takim przypadku cytowane, lecz zostaną dosłownie włączone do ciągu. print """ UŜytkowanie: cienias [OPCJE] -h PokaŜ ten opis poleceń -H nazwaserwera Nazwa serwera, z którym chcesz się połączyć""" Powyższy kod spowoduje następującą odpowiedź interpretera: UŜytkowanie: cienias [OPCJE] -h PokaŜ ten opis poleceń -H nazwaserwera Nazwa serwera, z którym chcesz się połączyć Łańcuchy znaków mogą być indeksowane. Podobnie jak w C, pierwszy znak w ciągu ma indeks (numer porządkowy) 0. Nie istnieje osobny typ oznaczający znak - znak jest po prostu napisem o długości jeden. Podciągi znaków mogą zostać wyodrębnione za pomocą operatora segmentowania co doskonale widać na kolejnym przykładzie [10]. 21

>>> slowo = 'Pomoc' + 'A' >>> slowo[5] 'A' >>> slowo[0:2] 'Po' >>> word[2:5] 'moc' Wbudowane typy danych W języku Python istnieje pewna liczba złożonych typów danych, używanych do grupowania innych wartości. Najbardziej użytecznym typem jest lista, którą można zapisać jako listę elementów poprzedzielanych przecinkiem, umieszczoną w kwadratowych nawiasach. Elementy listy nie muszą być tego samego typu. >>> a = ['wędzonka', 'jaja', 100, 1234] >>> a ['wędzonka', 'jaja', 100, 1234] Podobnie jak indeksy łańcuchów znaków, indeksy listy rozpoczynają się od wartości 0. Listy mogą być przedmiotem operacji segmentacji, sklejania itd. >>> a[0] 'wędzonka' >>> a[3] 1234 >>> a[-2] 100 >>> a[1:-1] ['jaja', 100] >>> a[:2] + ['bekon', 2*2] ['wędzonka', 'jaja', 'bekon', 4] Możliwe jest zagnieżdżanie list (tworzenie list, której elementami są inne listy). >>> q = [2, 3] >>> p = [1, q, 4] >>> len(p) 3 >>> p[1] [2, 3] >>> p[1][0] 2 W tab.3 zamieszczono kilkanaście najważniejszych metod dostępnych dla listy. 22

Wybrane metody listy list(s) s.append(x) s.extend(t) s.count(x) s.index(x) s.pop([i]) s.remove(x) s.reverse() s.sort([funkcja]) s.capitalize() s.center(długość) s.count(sub) s.replace(old, new) s.rstrip() s.split(separator) s.isdigit() s.islower() s.isspace() s.isupper() s.join(t) konwertuje sekwencję s na listę dodaje nowy element x na końcu s dodaje nową listę t na końcu s zlicza wystąpienie x w s zwraca najmniejszy indeks i, gdzie s[i] == x zwraca i-ty element i usuwa go z listy odnajduje x i usuwa go z listy s odwraca w miejscu kolejność elementów s Sortuje w miejscu elementy zmienia pierwszą literę na dużą Centruje napis w polu o podanej długości zlicza wystąpienie podciągu sub w napisie s zastępuje stary podciąg nowym usuwa końcowe białe znaki dzieli napis używają podanego separatora sprawdza czy wszystkie znaki są cyframi sprawdza czy wszystkie litery są małe sprawdza czy wszystkie znaki są białymi znakami sprawdza czy wszystkie litery są duże łączy wszystkie napisy na liście t używając s jako separatora Tab.3 Metody, które są dostępne dla listy Kolejnym użytecznym typem jest krotka, którą można zapisać jako listę elementów poprzedzielanych przecinkiem, umieszczoną w okrągłych nawiasach. Elementy listy nie muszą być tego samego typu. >>> a = ( pierwszy,2, trzeci ) >>> print Pierwszy element krotki to %s % a[0] Pierwszy element krotki to pierwszy >>> print Drugi element krotki to %i % a[1] Drugi element krotki to 2 >>> print Trzeci element krotki to %s % a[2] Trzeci element krotki to trzeci Krotki różnią się tym od list, że nie można zmieniać wartości elementów krotki po jej utworzeniu. Ostatnim ważnym typem danych o którym warto wspomnieć jest słownik. Słownik to w innych językach takich jak PHP tablica asocjacyjna (haszująca) zawierająca obiekty poindeksowane za pomocą kluczy co doskonale pokazuje poniższy fragment kodu [2]. >>> slownik = {"imie" : "jurek", "nazwisko" : "lepper", "wiek" : "54 lata", "zawod" : "polityk"} >>> print slownik["imie"] jurek >>> for i in slownik: print i + " - " +slownik[i] imie - jurek nazwisko - lepper 23

zawod - polityk wiek - 54 lata Słowniki podobne są do list, aby wyświetlić określony wpis wystarczy podać jego klucz nazwa_słownika["nazwa_klucza"]. Próba odwołania się do nieistniejącego klucza spowoduje błąd wykonywania skryptu. Jeżeli może zdarzyć się sytuacja, że klucz może nie istnieć, to warto skorzystać z metody słownika has_key. W tab.4 pokazano kilka wybranych metod obsługiwanych przez słowniki. >>> if bar.has_key("imie"): print bar["imie"] jurek Metody obsługiwane przez słowniki d.clear() d.copy() d.get(k) Usuwa wszystkie elementy z słownika Zwraca kopię słownika Zwraca wartość przypisaną kluczowi k lub wartość none jeśli klucz k nie istnieje d.items() d.keys() d.pop(k) Zwraca widok wszystkich par (klucz-warość) Zwraca widok wszystkich kluczy słownika d Zwraca wartość przypisaną kluczowi k i usuwa element, którego kluczem jest k. d.values() Zwraca widok wszystkich wartości w słowniku Tab.4 Wybrane metody, które są dostępne dla każdego słownika Podejmowanie decyzji Python wyposażony jest w zestaw wielu instrukcji, za pomocą których programista ma kontrolę nad kolejnością wykonywania poszczególnych poleceń. Najbardziej znaną instrukcją jest instrukcja if. Ogólna składnia polecenia if w Pythonie jest następująca. if wyraŝenie_boolean1: instrukcje_1 elif wyraŝenie_boolean2: instrukcje_2... elif wyraŝenie_booleann: instrukcje_n else: instrukcje_else Można wstawić zero lub więcej części elif, a część else jest opcjonalna. Słowo kluczowe elif jest skrótem instrukcji else if '. Sekwencja if... elif... elif... zastępuje instrukcje switch lub case spotykane w innych językach programowania. b = 2 a = 1 if a > b: print b else: print a c = 2 if a > b and a > c: print a 24

elif c == b: print "C i B rowne" else: print b Po wykonaniu tego skryptu otrzymamy: >>> 1 C i B rowne Należy zwrócić uwagę na wcięcia - są one obowiązkowe. Struktura blokowa jest elementem składni Pythona (w C/C++ czy np. PHP odpowiednikiem są nawiasy klamrowe). Polecenie while jest używane w celu wykonywania instrukcji dowolna liczbę razy, chodź może wystąpić sytuacja, w której instrukcje w ogóle nie zostaną wykonane. Ilość powtórzeń zależy od stanu wyrażenia boolowskiego w pętli while. Poniżej przedstawiono składnię tego polecenia. While wyraŝenie_boolean: Instrukcje Składnia pętli while jest trochę bardziej skomplikowana gdyż obsługiwane są słowa kluczowe break i continue. Ponadto w pętli może znajdować się opcjonalnie klauzura else. Polecenie break powoduje opuszczenie bieżącej pętli. Z kolei polecenie continue przekazuje kontrolę nad programem do początku pętli. while True: element = pobierz_element() if not element: break powtorz_element(element) Powyższa pętla while ma bardzo typową strukturę i działa aż do chwili przetworzenia wszystkich elementów przeznaczonych do tego celu [11]. Instrukcja for różni się trochę w Pythonie od tego, co spotykane jest w C lub Pascalu. Nie prowadzi się iteracji od liczby do liczby (jak w Pascalu). Instrukcja for w Pythonie powoduje iterację po elementach jakiejkolwiek sekwencji (np. listy, krotki lub łańcucha znaków), w takim porządku, w jakim są one umieszczone w danej sekwencji. Na przykład: # Mierzy pewne napisy a = ['kot', 'okno', 'wypróŝnić'] for x in a: print x, len(x) kot 3 okno 4 wypróŝnić 9 Nie jest bezpiecznym modyfikacja sekwencji, która właśnie jest przedmiotem iteracji (można to zrobić tylko dla mutowalnego typu sekwencji, tzn. listy). Jeśli chce się ją modyfikować, np. duplikować wybrane jej elementy, to należy wtedy przeprowadzić iterację na jej kopii. Jeśli zajdzie potrzeba iteracji określonej zakresem liczbowym (czyli iteracji na sekwencji liczb w Pythonie), można użyć wbudowanej w 25

interpreter funkcji range(). Wynikiem jej działania jest lista zawierająca ciąg arytmetyczny, tzn.: >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Aby przeglądnąć wszystkie elementy listy często łączy się funkcje range() i len(), tak jak pokazano poniżej: >>> a = ['Marysia', 'miała', 'małego', 'baranka'] >>> for i in range(len(a)): print i, a[i] 0 Marysia 1 miała 2 małego 2 baranka Definiowanie funkcji Słowo kluczowe def wprowadza definicję funkcji. Musi po nim następować nazwa funkcji i lista jej parametrów formalnych umieszczonych w nawiasach okrągłych. Instrukcje, które tworzą ciało funkcji, są oczywiście wsunięte w stosunku do wiersza zawierającego nazwę funkcji i muszą zaczynać się w nowym wierszu. Opcjonalnie, pierwszy wiersz ciała funkcji może być gołym napisem (literałem): jest to tzw. napis dokumentujący lub inna nazwa tego zjawiska - docstring. >>> def fib(n): """ Funkcja wypisuje ciąg liczb Fibonacciego aŝ do n. Funkcja ta jest bardzo prosta """ a, b = 0, 1 while b < n: print b, a, b = b, a+b >>> # Teraz, wywołajmy funkcję, którą przed chwilą zdefiniowaliśmy: fib(2000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 Istnieją pewne narzędzia, które używają napisów dokumentacyjnych (docstringów) do automatycznego tworzenia drukowanej dokumentacji albo pozwalają użytkownikowi na interaktywne przeglądanie kodu. Dobrym zwyczajem jest pisane napisów dokumentacyjnych w czasie pisania programu gdyż dzięki temu można w każdej chwili w łatwy i szybki sposób sprawdzić do czego służy dana funkcja, co przedstawione jest poniżej. >>> print fib. doc Funkcja wypisuje ciąg liczb Fibonacciego aŝ do n. Funkcja ta jest bardzo prosta Zmienne w definicji funkcji mogą mieć przypisane wartości domyślne (jeżeli w wywołaniu funkcji nie podamy wartości parametru to użyta zostanie wartość domyślna). Zmienne utworzone wewnątrz funkcji nie są dostępne poza nią, lecz można je zdefiniować jako zmienne globalne za pomocą operatora global [1]. 26

Klasy i obiekty Instrukcja class pozwala definiować klasy - używane w programowaniu obiektowym. Klasy to w uproszczeniu zbiory funkcji powiązanych między sobą, co pozwala na tworzenie w łatwy i niezależny sposób wielu komponentów złożonej aplikacji przez wielu programistów. class koszyk: def init (self): self.koszyk = [] def dodaj(self,obiekt): self.koszyk.append(obiekt) def rozmiar(self): return len(self.koszyk) s = koszyk() s.dodaj("pierwszy wpis") s.dodaj("drugi wpis") print s.rozmiar() del s Metody klasy definiowane są za pomocą def. Pierwszy argument każdej metody odnosi się do obiektu i zazwyczaj stosuje się nazwę "self". Wszystkie operacje wykorzystujące atrybuty obiektu muszą odwoływać się do nich poprzez tą zmienną. Metody poprzedzone to metody specjalne, które można definiować w klasach. Nie wywołujemy ich bezpośrednio z naszego kodu (jak zwykłe metody). Wywołuje je za nas Python w określonych okolicznościach lub gdy użyjemy określonej składni np. init jest wykonywana przy utworzeniu obiektu klasy (wywołaniu klasy - s = koszyk()) [1]. Organizacja programów - moduły W chwili gdy zakończy się pracę w interpreterze Python i ponownie rozpocznie, wszystkie definicje, które wprowadzono (funkcje i zmienne) zostają stracone. Dlatego też, jeśli chce się napisać dłuższy program, lepiej będzie gdy użyje się edytora tekstów do przygotowania poleceń dla interpretera i uruchomi go z przygotowanym plikiem na wejściu. Nazywa się to tworzeniem skryptu. W miarę, jak program staje się dłuższy, pojawia się konieczność podzielenia go na kilka plików w celu lepszej czytelności kodu. Dzięki temu można użyć funkcji, które wcześniej zostały napisane w paru innych programach bez potrzeby wklejania ich w każdy program z osobna. Python wspomaga te działania poprzez mechanizm umieszczania definicji w pliku i używania ich w skrypcie lub w interaktywnej postaci interpretera. Taki plik nazywany jest modułem, a definicje z modułu mogą być importowane do innych modułów lub do głównego modułu. Moduł jest plikiem zawierającym definicje Python i jego instrukcje. Nazwa pliku jest nazwą modułu pozbawionego rozszerzenia.py. Jeśli programista stworzy plik o nazwie fibo.py i umieści go w bieżącym katalogu z następującą zawartością: # Moduł liczb Fibonacciego def fib(n): # wypisz ciąg Fibonacciego aŝ do n a, b = 0, 1 while b < n: print b, a, b = b, a+b def fib2(n): # zwróć ciąg Fibonacciego aŝ do n wybik = [] 27

a, b = 0, 1 while b < n: wynik.append(b) a, b = b, a+b return wynik to po uruchomieniu interpretera Python można zaimportować ten moduł za pomocą następującego polecenia: >>> import fibo W ten sposób nie zaimportuje się nazw funkcji zdefiniowanych w module fibo wprost do bieżącej tablicy symboli - to polecenie wprowadza tylko nazwę fibo do tej tablicy. Aby dostać się do owych funkcji, trzeba użyć polecenia nazwa_modułu.nazwa_funkcji(). >>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo. name 'fibo' Istnieje również możliwość importu wszystkich obiektów modułu. Można tego dokonać używając poniższego polecenia. >>> from fibo import * Po wykonaniu tego polecenia wszystkie obiekty importowanego modułu są dostępne bezpośrednio tzn. nie trzeba już poprzedzać nazwy funkcji nazwą modułu [10]. 28 3.2 Przegląd zastosowań Python jest językiem programowania ogólnego przeznaczenia, który może zostać uruchomiony w każdym nowoczesnym systemie operacyjnym. Można go w łatwy sposób wykorzystać do przetwarzania tekstu, liczb, obrazów, danych naukowych, czy czegokolwiek innego, co można zapisać na komputerze. Python jest wykorzystywany przez wiele znaczących firm niekoniecznie związanych z usługami sieciowymi. Google, Yahoo, Nokia, IBM czy NASA wykorzystują Pythona w swoich wartych wiele milionów, czy też miliardów dolarów aplikacjach i projektach. Microsoft oraz Apple oferują pełne wsparcie dla Pythona w swoich systemach operacyjnych i platformach programistycznych. Wiele stron internetowych takich jak YouTube czy Grono napisanych jest w Pythonie. NASA wykorzystuje Pythona w swoich aplikacjach od wielu lat. Jednym z dobrze opisanych wdrożeń jest zastosowanie aplikacji napisanych w Pythonie do zarządzania kontrolą startową wahadłowców. Także niedawno upubliczniony został projekt Nebula - to rozproszone środowisko obliczeniowe przystosowane do wykonywania skomplikowanych obliczeń łączące wiele modułów i aplikacji

Pythonowych (framework Django, Trac, API dla LUSTRE, RabbitMQ, Subversion) z innymi językami i technologiami (np. Solr w Javie do pełno tekstowego wyszukiwania). YouTube - popularny serwis z klipami wideo jest w większości napisany w Pythonie. Twórcy serwisu (wykupionego przez Google) podkreślali wydajność jaką oferuje Python, a także szybkie implementowanie nowych funkcjonalności poprzez czytelny kod, który łatwo rozszerzać i aktualizować. Google używa Pythona w wielu swoich aplikacjach i usługach takich jak Google App Engine, czy Google Wave. Zatrudnia nawet twórcę języka - Guido van Rossuma. Również silnik wyszukiwarki internetowej Google jest po części napisany w języku Python. Firma Nokia stworzyła, wydała i teraz wykorzystuje platformę Python for S60 do tworzenia różnorodnych aplikacji dla telefonów z systemem operacyjnym Symbian. Tworzenie dynamicznych stron internetowych jest bardzo łatwe i efektywne dzięki frameworkom takim jak Django, Pylons, czy kombajnowi aplikacji Zope/Plone. Python znalazł zastosowanie przy efektywnym i szybkim tworzeniu nowoczesnych stron internetowych bogatych w funkcjonalności. Dzięki wszechstronnej kolekcji modułów i bibliotek serwisy "web 2.0" napisane w Pythonie mogą łatwiej oferować funkcjonalności znane np. z aplikacji desktopowych w porównaniu do np. PHP. Platforma Google App Engine dla rozproszonego hostingu aplikacji internetowy oparta została o Pythona i oferuje serwisom www taką samą skalowalność, jaką posiadają wszystkie aplikacje i usługi tej firmy. Bez administracji serwerami i bez ich konfigurowania. Chmura automatycznie skaluje się do generowanego na stronie ruchu. GAE jest darmowe i tylko za zużycie większej ilości zasobów należy płacić (a darmowe limity i tak są w miarę wysokie). Usługi i serwisy społecznościowe to obecnie podstawa dla wielu serwisów www. Za pomocą Pythona bezproblemowo można wykorzystać API/usługi serwisów takich jak Twitter, Blip.pl, Facebook, aplikacji Google (Maps, Docs i innych przez GData), czy Google Wave. Przykładowo biblioteka PyFacebook pozwala w prosty sposób tworzyć aplikacje dla tego serwisu społecznościowego, a API Google Wave umożliwia tworzenie aplikacji dla tej platformy, czy integrowanie własnych stron i aplikacji z Wave. Biopython jest dojrzałym, w pełni darmowym (open source) projektem, który powstał z ochotniczej inicjatywy. Biopython to biblioteka wspomagająca wszelakiego rodzaju badania i analizy danych biomedycznych. Zawiera moduły do zapisu i odczytu sekwnwcji DNA, sekwencji białkowych w różnych formatach, oraz ułatwia pobierania danych z baz, które zawierają informacje biologiczne. Obecnie Biopython jest wykorzystywany przez wielu naukowców, którzy zajmują się bioinformatyka i ewolucją molekularną. 29

3.3 Biblioteka Biopython Biopython jest dość popularna biblioteka języka Python, która ma ułatwiać codzienną pracę bioinformatyka, pozwalając mu na łatwe wywoływanie typowych funkcji z poziomu języka skryptowego. Dzięki tej bibliotece można: czytać pliki o rozszerzeniach (*.fasta,*.gbk), dokonywać analizy składniowej plików (FASTA, gbk) z sekwencjami, wyszukiwać informacje w biologicznych bazach danych, pobierać poszczególne informacje oraz całe rekordy z biologicznych baz danych, tworzyć sekwencje DNA, RNA oraz wykonywać na nich różne operacje (complement DNA, revers DNA, translation, transcryption itp.), tworzyć konwersje pomiędzy danymi w formacie FASTA i gbk, tworzyć całe rekordy w różnych formatach i zapisywać je do pliku, porównywać sekwencje DNA lub sekwencje białkowe. Czytanie plików z danymi biologicznymi Biopython umożliwia programistom wczytywanie do pamięci plików FASTA i genbank zawierających sekwencje DNA lub sekwencje białkowe. Aby tego dokonać należy najpierw z biblioteki Biopython zaimportować moduł seqio, który posiada gotowe funkcje do czytania i analizy składniowej takich plików. Za pomocą funkcji for można czytać pliki FASTA lub genbank rekord po rekordzie, dokonywać rozbioru (parsing) i wypisywać ważne dla bioinformatyków informacje na ekran monitora lub zapisywać wyodrębnione dane na dysk w celu późniejszej analizy. #import odpowiedniego modułu from Bio import SeqIO #czytanie w pętli pliku fasta rekord po rekordzie for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"): #wypisanie na ekran nr ID sekwencji print seq_record.id #wypisanie na ekran sekwencji DNA print repr(seq_record.seq) #wypisanie długośći sekwencji print len(seq_record) Po wykonaniu powyższego kodu na ekranie monitora powinno pojawić się cos podobnego do tego co widnieje na rys.11. 30 Rys. 11 Zrzut ekranu, na którym widnieje efekt przetworzenia pliku ls_orchid.fasta Wyszukiwanie informacji w biologicznych bazach danych Następnym modułem wchodzącym w skład biblioteki Biopython, o którym warto wspomnieć, jest moduł Entrez. Dzięki temu modułowi można z łatwością wyszukiwać różne informację, poprzez Internet lub lokalnie jeśli mamy na komputerze

zainstalowaną jakąś biologiczna bazę danych. Wystarczy tylko znać nazwę bazy (np. nucleotide, protein, pubmed), która musi być podana małymi literami oraz frazę pytającą (np. biopython, homo sapiens itd.). Po zakończeniu wyszukiwania informacji powinno się poinformować użytkownika ile pozycji znaleziono oraz wypisać ich nr ID, co ułatwi później pobranie całego rekordu z bazy danych. Jeśli liczba znalezionych pozycji jest duża można ograniczyć ilość wyświetlanych nr ID dodając do funkcji esearch dodatkowy parametr o nazwie retmax i podając mu dowolna wartość [7]. Na rys.12 pokazano przykładowy wynik przeszukania jednej z biologicznych baz danych. #import odowiedniego modułu from Bio import Entez #podanie nazwy bazy i szukanego terminu handle = Entrez.esearch(db="pubmed", retmax=10, term="biopython") #zapisanie znalezionych informacji do zmiennej record record = Entrez.read(handle) #wypisanie ilość znalezionych pozycji print "Znaleziono "+record["count"]+" publikacji o nastepujacych nr ID: " #wypisanie nr ID znalezionych pozycji print record["idlist"] Rys. 12 Wynik przeszukania bazy PubMed frazą pytającą biopython Pobierane całego rekordu z bazy danych Biblioteka Biopython pozwala również na pobieranie całych rekordów z biologicznych baz danych. Wystarczy tylko mieć dostęp do Internetu. Za pobieranie danych z bazy odpowiada funkcja efetch, która jest częścią modułu Entrez. W celu pobrania całego rekordu należy podać w parametrach funkcji efetch nazwę bazy, typ w jakim ma zostać zwrócona informacja (FASTA, gb) oraz nr ID rekordu, który poznaliśmy dzięki skryptowi opisanego w powyższym fragmencie nim mniejszej pracy. Pobrany rekord można wyświetlić na ekranie lub zapisać do pliku. #!/usr/bin/env python #import odowiedniego modułu from Bio import Entrez #poinformowanie NCBI kim jesteś(email moŝe być dowolny, ale musi być) Entrez.email = "A.N.Other@example.com" #uzyskanie uchwytu do rekordu bazy nucleotide o podanym nr ID handle = Entrez.efetch(db="nucleotide", id="186972394", rettype="gb") #wyswietlenie pobranego rekordu w formacie genbank print handle.read() Efekt działania powyższego fragmentu kodu ukazano na rys.13. 31

Rys. 13 Fragment pobranego rekordu z bazy wyświetlony w formacie genbank Operacje na sekwencjach DNA, RNA oraz sekwencjach białkowych Kolejnymi modułami, którym warto się bliżej przyglądnąć są moduły Seq i Alphabet. Umożliwią one tworzenie własnych sekwencji oraz wykonywać różne operację na sekwencjach za pomocą gotowych funkcji, oczywiście wszystko odbywa się zgodnie z zasadami obowiązującymi w naturze. Poniższy fragment kodu pokazuje jak skorzystać z owych funkcji i wypisać efekt ich działań na ekranie monitora [8]. #import odowiednich modułów from Bio.Seq import Seq from Bio.Alphabet import IUPAC #stworzenie własnej sekwencji DNA my_seq = Seq("GATCGATGGGCCTATATAGGATCGAAAATCGC", IUPAC.unambiguous_dna) #wypisanie utworzonej sekwencji print "My DNA: "+my_seq #utworzenie komplementarnego DNA my_seq_comp = my_seq.complement() #wypisanie komplementarnego DNA print "Complemet DNA: "+my_seq_comp #utworzenie reves DNA my_seq_rev_comp = my_seq.reverse_complement() #wypisanie revers DNA print "Revers DNA: "+my_seq_rev_comp Gdy interpreter języka Python przetworzy ten skrypt na ekranie powinno pojawić się dokładnie to, co widnieje na rys.14. 32 Rys. 14 Efekt przetworzenia powyższego skryptu przez interpreter języka Konwersja pomiędzy plikami FASTA i genbank Moduł SeqIO, o którym było wspomniane na początku tego podrozdziału umożliwia również konwersję pomiędzy plikami FASTA i genbank w obydwie strony. Aby tego dokonać wystarczy napisać kilka linijek kodu.

Rys. 15 Zawartość folderu przed wykonaniem konwersji Rys. 16 Zawartość folderu po wykonaniu konwersji #import odpowiednich modułów from Bio import SeqIO #utworzenie uchwytu do pliku w formacie genbank input_handle = open("ls_orchid.gbk") #utworzenie uchwytu do nowego pliku output_handle = open("ls_oechid_convert.fasta", "w") #zapisanie przeparsowanego pliku do zmiennej sequence sequence = SeqIO.parse(input_handle,"genbank") #zapisanie w formacie fasta całej strukury przeparsowanego pliku na dysk SeqIO.write(sequence,output_handle, "fasta") #zamknięcie plików output_handle.close() input_handle.close() Wykonanie tego skryptu zaowocuje powstaniem nowego pliku w folderze, w którym został wykonany skrypt, o czym można się przekonać porównując rys.15 z rys.16. Tworzenie nowych rekordów z danymi Dzięki bibliotece Biopython, znając strukturę plików FASTA lub genbank, można tworzyć całe rekordy z danymi biologicznym i zapisywać je do pliku lub do bazy. Jeśli chcemy tego dokonać najpierw należy wykonać import czterech modułów: Seq, SeqRecord, generic_protein, SeqIO. Następnie można przejść do wpisywania danych do rekordu. Jeśli chcemy aby nasz plik zawierał kilka rekordów wystarczy stworzyć kilka zmiennych i do nich zapisywać wprowadzone dane. Później trzeba stworzone rekordy zapisać do jednej listy i wykorzystują moduł SeqIO zapisać dane na dysk [9]. #import odpowiednich modułów from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from Bio.Alphabet import generic_protein from Bio import SeqIO #stworzenie pierwszego rekordu z danymi rec1 = SeqRecord(Seq("MMYQQGCFAGGTVLRLAKDLAENNRGARVLVVCSEITAVTFRGPSETHLDSMVGQ ALFGD" \ +"GAGAVIVGSDPDLSVERPLYELVWTGATLLPDSEGAIDGHLREVGLTFHLLKDVPGLISK" \ +"NIEKSLKEAFTPLGISDWNSTFWIAHPGGPAILDQVEAKLGLKEEKMRATREVLSEYGNM" \ +"SSAC", generic_protein), id="gi 14150838 gb AAK54648.1 AF376133_1", 33