Drzewa filogenetyczne i zegar molekularny
Drzewa filogenetyczne i zegar molekularny
Drzewa filogenetyczne, które tworzyliśmy dotychczas pokazywały relacje filogenetyczne pomiędzy badanymi organizmami i ich stopień podobieństwa, jednak nie pozwalały na odniesienie poszczególnych wydarzeń, takich jak rozdzielanie się kladów, do czasu w którym mogły się wydarzyć.
Drzewa posiadające informacje na temat długości gałęzi (filogramy) pozwalają szacować względne odległości między taksonami ale aby dopasować je do ram czasowych potrzebujemy sposobu ich ,,wykalibrowania'' tak aby można było znaleźć relacje pomiędzy liczbą mutacji a czasem.
Kalibracja drzewa może przebiegać na przynajmniej dwa sposoby. Jeśli znamy tempo ewolucji badanych sekwencji to można dopasować skalę czasową na podstawie liczby mutacji na poszczególnych gałęziach. Można też podejść do problemu z drugiej strony. Znając przybliżony czas w którym doszło do rozdzielenia się kladów, na przykład opierając się na danych opartych na skamieniałościach, można dopasować go do odpowiedniego węzła na drzewie i na tej podstawie wyliczyć związek między czasem a liczbą mutacji. Tutaj pokażę prosty przykład tego drugiego podejścia.
W praktyce trzeba pamiętać, że nie tylko różne rodzaje sekwencji ewoluują z różną prędkością, ale także ten sam typ sekwencji może mieć różne tempo ewolucji u różnych grup organizmów. Oznacza to, że różne części naszego drzewa mogą mieć różne tempo ewolucji. Zatem lepiej jest wyznaczyć kilka ,,markerów'' - w przypadku pierwszego podejścia wyznaczyć tempo ewolucji dla różnych kladów, dla drugiego oznaczyć czas dla kilku węzłów.
Do programów pozwalających na użycie zegara molekularnego do drzew filogenetycznych należą obsługiwany z linii komend r8s
, nawiązujący do niego, napisany w Pythonie pyr8s
, z którego można korzystać używając linii komend lub interfejsu graficznego, oraz ,,okienkowy'' i dużo bardziej złożony BEAST
. Na naszych zajęciach będziemy używali pyr8s
.
Pyr8s
Pyr8s
Strona domowa programu pyr8s
znajduje się pod adresem https://github.com/iTaxoTools/pyr8s.
Program pobieramy używając narzędzia git
:
Można też go pobrać wybierając na stronie zielony przycisk <> Code
a następnie Download ZIP
.
Ewentualnie możemy wykorzystać wget
:
Następnie instalujemy program:
Uruchamianie programu bez instalacji jest opisane na stronie projektu.
W pobranym katalogu pyr8s
znajdziemy kilka plików i katalogów:
Plik Sanderson_r8s_1_7_original_manual.pdf
zawiera manual programu r8s
, na którym został oparty pyr8s
, można zatem znaleźć wiele informacji na temat użytkowania programu, my skupimy się na podstawach.
Katalog tests
zawiera przykładowe pliki wsadowe programu. Nasz przykładowy plik będzie oparty na jednym z nich (legacy_1
), ale nic nie stoi na przeszkodzie, żeby wypróbować też inne.
LICENCE
i README
to pliki, których nazwy jasno wskazują na ich znaczenie. Pozostałe raczej nie będą nas bezpośrednio interesować.
Utwórz katalog roboczy, np. zegar
a w nim plik rosliny.set
(przedłużenie pliku nie ma specjalnego znaczenia).
Umieść w nim poniższą zawartość:
Na początku pliku znajduje się deklaracja, że jest to plik w formacie NEXUS
. Dalej znajduje się komentarz - jak widać ograniczony jest parą nawiasów klamrowych.
Polecenia begin
, po którym następuje nazwa oraz end
ograniczają blok kodu. W tym przypadku jest to blok trees
, niezbędny do działania programu (co jest zrozumiałe). Zauważ, ze komendy kończą się średnikiem.
W bloku znajduje się drzewo (komenda tree
), zapisane w formacie newick
, które będzie miało nazwę rosliny
. Zawartość drzewa została skopiowana z pliku legacy_2
. Trzeba tu zaznaczyć, że pyr8s
nie wylicza drzew, ale korzysta z już gotowych.
Dopisz do pliku (poniżej komendy end;
) blok z poleceniami dla programu r8s
:
Komenda blformat
opisuje drzewo, które badamy. nsites
to liczba miejsc w sekwencjach, które zostały użyte przy tworzeniu drzewa. lengths
informuje o znaczeniu liczb określających długość gałęzi: opcja persite
oznacza liczbę mutacji na miejsce w sekwencji, jeśli oznaczałyby całkowitą liczbę mutacji to użylibyśmy opcji total
.
Komenda collapse
, nie wchodząc w szczegóły pozwala radzić sobie programowi w sytuacjach, w których gałęzie mają zerową długość.
Następnie definiujemy/nazywamy, używając komendy mrca
dwa wewnętrzne węzły. Nazwa komendy to skrót od recent common ancestor, czyli ostatni wspólny przodek. Podając nazwy dwóch taksonów, określamy, że podana nazwa odnosi się do węzła w którym rozdzieliły się ich drogi ewolucyjne.
W naszym przykładzie oznaczamy węzły ostatnich wspólnych przodków (badanych) roślin lądowych (LAND_PLANTS
), nagonasiennych (GYMNOSPERMS
) oraz okrytonasiennych (ANGIOSPERMS
).
Dalej, wykorzystujemy utworzone wcześniej nazwy do umiejscowienia ich w czasie, co pozwala na ,,wyskalowanie'' drzewa. Komenda fixage
ustawia ,,na sztywno'' czas, natomiast constrain
pozwala określić zakres czasowy w którym doszło do rozdzielenia się linii ewolucyjnych, poprzez wyznaczenie jednej (maksymalną lub minimalną) lub obu granic. W naszym pliku czas jest określony w milionach lat.
Komenda divtime
wylicza czasy dla pozostałych węzłów przy użyciu wybranej metody i algorytmu. Nie będziemy ich analizować. Wyniki zostają wypisane w sposób mało czytelny, dlatego dalej używamy komendy skowage
, która je prezentuje w sposób bardziej przejrzysty.
Następnie trzykrotnie zostaje wywołana komenda descriptions
z różnymi wartościami parametru plot
, dzięki której otrzymujemy wyniki w formie drzew w różnych formatach. Dwa pierwsze drzewa prezentowane są w trybie wizualno-tekstowym: chronogram, w którym długości gałęzi odpowiadają czasowi (dlatego są wyrównane do prawej krawędzi) oraz filogram, posiadający gałęzie o długościach proporcjonalnych do liczby mutacji. Trzecie drzewo jest zapisane w formacie nexus
.
Istnieje możliwość, że dla danego zestawu danych istnieje więcej niż jedno optymalne rozwiązanie. Dlatego na końcu sprawdzamy trzykrotnie (można ustawić inną wartość) obliczenia, za każdym razem program (nie wchodząc w szczegóły) używając innych wewnętrznych wartości startowych. Jeśli otrzymujemy dla każdej serii wyliczeń otrzymujemy inne wyniki, oznacza to, że istnieją różne optymalne rozwiązania.
Zapisz plik i uruchom, obejrzyj wyniki na ekranie i spróbuj dopasować je do kolejnych poleceń. Wynik warto też zapisać w pliku:
Jak widać program wczytał drzewo i zakończył działanie. Teraz skopiuj z pliku wynikowego (lub z terminala) drzewo wynikowe w formacie newick
i zapisz je w osobnym pliku (np. rosliny-drzewo.newick
). Na początku dodaj tree rosliny =
.
Zauważ, że zawiera ono opisy węzłów, które im nadaliśmy a także wyliczone czasy. Brak natomiast wartości odpowiadających długości gałęzi w odniesieniu do liczby mutacji.
Otwórz plik w programie FigTree
. Przy pytaniu o nazwę etykiet dla węzłów wpisz ,,Opis''.
Jak zwykle dopasuj czcionki itp. aby drzewo było bardziej czytelne. Następnie zaznacz zakładkę ,,Node Labels'' wyświetlaną wartość na ,,Node ages''. Po dopasowaniu parametrów czcionki i liczby miejsc po przecinku powinieneś uzyskać mniej więcej taki obraz:
Jak widać, na drzewie widoczny jest wyliczony (i ustawiony przez nas) wiek dla poszczególnych węzłów, oznaczający miliony lat, które upłynęły od momentu rozdzielnia się poszczególnych linii ewolucyjnych.
Ustawiając ,,opisy'' w ,,Branch Labels'', otrzymasz drzewo dodatkowo z etykietkami, które przypisaliśmy do węzłów.
Powyższy przykład pokazał podstawy używania programu pyr8s
. Studiując dołączone do programu pliki z przykładami a zwłaszcza tutorial można dowiedzieć się znacznie więcej na temat jego możliwości, do czego zachęcam.
Last updated