12.pdf

(360 KB) Pobierz
184432119 UNPDF
Rozdział 12
Przeglądarka cząsteczek
Wyświetlanie informacji przy użyciu trójwymiarowej grafiki jest zawsze
interesującym zagadnieniem. W rozdziale wykorzystamy GDK ( Graphics
Drawing Kit ) do napisania przeglądarki plików .pdb, która pozwoli oglą-
dać cząsteczki na kontrolce obszaru rysunkowego (patrz rysunek 12.1).
W programie wykorzystamy arytmetykę trójwymiarową; jeśli czytelnicy
nie czują się pewnie w tym temacie, mogą po prostu zapoznać się
z ogólnymi koncepcjami, ignorując mnożenie macierzy. Jeśli zaś chcieliby
dowiedzieć się więcej o obliczeniach trójwymiarowych, mogą sięgnąć po
jedną z wielu książek traktujących o grafice komputerowej.
Rysunek 12.1. Przeglądarka cząsteczek.
Oprócz samego wyświetlania cząsteczki, aplikacja będzie dysponowała
możliwością jej obracania. Użytkownik będzie także mógł wyświetlać
cząsteczkę w kolorze i z tekstem, opisującym poszczególne atomy. Aby
184432119.001.png
332
Część III Rysowanie, kolor i GDK
obracanie cząsteczki nie powodowało zakłóceń na ekranie, wykorzysta-
my podwójne buforowanie.
Format pliku
Aby wyświetlać pliki .pdb, musimy umieć je odczytać, a także zrozumieć
format opisu cząsteczek. Format pliku .pdb jest dość skomplikowany,
ponieważ zaprojektowano go do opisu złożonych cząsteczek. Na szczę-
ście możemy zignorować większość danych, przechowywanych w pliku
.pdb. Interesują nas tylko nazwy atomów, ich pozycje, oraz wiązania po-
między nimi. Pliki .pdb posiadają dwie części: pierwsza opisuje atomy,
a druga (opcjonalna) wiązania pomiędzy atomami. Pełen opis atomów
jest dość skomplikowany:
Format rekordu
KOLUMN
Y
TYP DANYCH
POLE
OPIS
1 -6
Nazwa rekordu
"ATOM
"
07 - 11
Liczba całkowita
serial
Numer kolejny atomu
13 -16
Atom
name
Nazwa atomu
17
Znak
altLoc
Wskaźnik alternatywnego położenia
18 - 20
Nazwa pozostałości resName Nazwa pozostałości
22
Znak
chainID Identyfikator łańcucha
23 - 26
Liczba całkowita
resSeq
Numer kolejny pozostałości
27
Znak
iCode
Kod wstawiania pozostałości
31 - 38
L. rzeczywista (8.3) x
Ortogonalna współrzędna X
w angstremach.
39 - 46
L. rzeczywista (8.3) y
Ortogonalna współrzędna Y
w angstremach.
47 - 54
L. rzeczywista (8.3) z
Ortogonalna współrzędna
Z w angstremach.
55 - 60
L. rzeczywista (6.3) occupanc
y
Zajętość
61 - 66
L. rzeczywista (6.3) tempFact
or
Czynnik temperaturowy
73 - 76
LString(4)
segID
Identyfikator segmentu,
wyrównany do lewej
77 - 78
LString(2)
element Symbol pierwiastka, wyrównany do
prawej
79 - 80
LString(2)
charge Ładunek atomu
184432119.002.png
Przeglądarka cząsteczek
333
Najważniejszymi informacjami są nazwa rekordu, „Atom” i współrzędne
przestrzenne (x, y, z).
Druga część pliku .pdb jest opcjonalna i zawiera informacje, potrzebne do
wyświetlenia wiązań atomowych. Linie CONECT opisują atom
i wszystkie jego wiązania z innymi atomami. Pierwsza liczba po słowie
CONECT jest numerem kolejnym atomu w cząsteczce, a pozostałe są
numerami kolejnymi atomów, z którymi jest związany. Przykładowy plik
.pdb z danymi o wiązaniach wygląda następująco:
ATOM
1 O11
1
2.227 3.257 9.904
ATOM
2 O12
1
4.387 2.116 10.202
ATOM
3 O13
1
3.470 2.116 8.123
ATOM
4 N1
1
1.032 3.192 13.498
ATOM
5 C1
1
1.135 4.580 13.046
ATOM
6 C2
1
1.192 2.116 12.739
ATOM
7 C3
1
0.762 2.796 14.797
ATOM 8 C3' 1
0.507 3.783 15.877
ATOM
9 C11
1
2.759 4.526 9.626
ATOM
10 C12
1
4.372 2.116 11.603
ATOM
11 C13
1
2.451 2.116 7.171
ATOM
12 B1
1
3.078 2.116 9.530
ATOM
13 N1*
1
1.032 1.041 13.498
ATOM
14 C3*
1
0.762 1.437 14.797
ATOM
15 O11*
1
2.227 0.976 9.904
ATOM
16 C1*
1
1.135 -0.347 13.046
ATOM
17 C3'*
1
0.507 0.450 15.877
ATOM
18 C11*
1
2.759 -0.293 9.626
TER
CONECT 1 9 12
CONECT 2
10
12
CONECT 3
11
12
CONECT 4
5
6
7
CONECT 5
4
CONECT 6
4
13
CONECT 7
4
8
14
CONECT 8 7
CONECT 9 1
CONECT 10 2
CONECT 11 3
CONECT 12
1
2
3
15
CONECT 13 6 14 16
334
Część III Rysowanie, kolor i GDK
CONECT 14 7 13 17
CONECT 15 12
CONECT 16 13
CONECT 17 14
Przyjrzyjmy się pierwszej linii pliku. Zaczyna się od słowa ATOM, co
oznacza, że linia opisuje atom. Następny znak, 1, jest indeksem (nume-
rem kolejnym) atomu. Atomy powinny być uporządkowane. O11 jest
nazwą atomu - w tym przypadku O oznacza prawdopodobnie tlen.
Położenie atomu określają trzy ostatnie liczby w linii. Są to współrzędne
x, y i z atomu w cząsteczce.
ATOM 1 O11 1 2.227 3.257 9.904
Opis atomów kończy się na linii o etykiecie TER, po której następują
wiązania. Poszczególne linie zaczynają się od słowa CONECT, i zawierają
numer atomu oraz numery wszystkich atomów, z którymi łączą go
wiązania. Pierwsza linia opisu wiązań wygląda następująco:
CONECT 1 9 12
Oznacza ona, że atom 1 ma wiązania zatomami 9 i12. Atomy
niekoniecznie muszą mieć wiązania, ale zazwyczaj je mają.
Struktury danych
Struktura danych atomu (typAtom) przechowuje nazwę atomu, dwa
zbiory współrzędnych oraz listę atomów, z którymi atom jest połączony
wiązaniami. Struktura posiada dwa zbiory współrzędnych, ponieważ
przechowujemy wniej współrzędne pierwotne oraz współrzędne
przekształcone. Potrzebujemy przekształconych współrzędnych dlatego,
że cząsteczka będzie obracana wokół osi-a w miarę obrotu będzie
zmieniać się położenie atomów w trójwymiarowej przestrzeni. Określają
je przekształcone współrzędne, obliczane od nowa po każdym
przesunięciu cząsteczki. Przekształcone współrzędne odzwierciedlają
miejsce, w którym atom zostanie narysowany. Ponieważ każdy atom
może mieć wiązania z jednym lub wieloma atomami, struktura typAtom
przechowuje wszystkie wiązania w łączonej liście GSList.
typedef struct {
char *szNazwa; // --- Nazwa atomu
double x; // --- Pierwotne współrzędne
double y; //
double z; //
double tx; // --- Współrzędne po translacji
Przeglądarka cząsteczek
335
double ty; //
double tz; //
GSList *listaWiazan; // --- Atomy, z którymi atom ma wiązania
} typAtom;
Wiązania opisują związki, które umożliwiają połączenie atomów liniami.
Dodatkowy znacznik przyspiesza rysowanie-wiązanie powinno być ry-
sowane tylko raz dla każdej pary atomów.
typedef struct {
typAtom *atom1; /* --- Pierwszy atom we wiązaniu --- */
typAtom *atom2; /* --- Drugi atom we wiązaniu--- */
int bNarysowane; /* --- narysowane--- */
} typWiazanie;
Atomy i wiązania są przechowywane w statycznych tablicach (autor nad
tym ubolewa, ale dynamiczne przydzielanie pamięci oznaczałoby znacz-
nie więcej pracy). Tablice ułatwiają rysowanie atomów.
Rysowanie w trzech wymiarach
Ponieważ cząsteczka ma strukturę trójwymiarową, powinniśmy naryso-
wać ją tak, aby stworzyć iluzję trójwymiarowości. Podczas wyświetlania
cząsteczek należy unikać oczywistych błędów, jak na przykład rysowania
atomów bez uwzględnienia ich położenia w osi z. Spowodowałoby to, że
atomy znajdujące się dalej znalazłyby na ekranie przed atomami położo-
nymi bliżej oglądającego. Można uporać się z tym problemem, sortując
atomy według przekształconej współrzędnej z. Jeśli narysujemy najpierw
odległe atomy, mamy gwarancję, że atomy znajdujące się najbliżej oglą-
dającego pozostaną na szczycie, i nie zostaną przykryte przez inne. Algo-
rytm rysowania wyświetla najpierw najdalsze atomy, a potem przykrywa
je bliższymi.
Kod źródłowy
Cały kod służący do rysowania cząsteczek (z wyjątkiem procedur mate-
matycznych operujących na macierzach) znajduje się w pliku czasteczka.c.
Umieszczono tutaj procedury umożliwiające wczytywanie plików, ryso-
wanie cząsteczek i wykonywanie innych operacji na cząsteczkach; tego
rodzaju modularyzacja kodu pozwala na łatwe wykorzystanie go w innej
aplikacji. Ponieważ większość nowych funkcji znajduje się w pliku
Zgłoś jeśli naruszono regulamin