Czy istnieją jakieś dobre struktury danych, które można wykorzystać do przedstawienia cząsteczki?
Pomyślałem, że może przedstawię go jako wykres, czyniąc każdy atom wierzchołkiem, jednak często związki organiczne zawierają wiele atomów węgla i wodoru. Jak byś to numerował? Czy istnieje dobry sposób na reprezentowanie cząsteczek, ale jednocześnie ma skuteczną .contains()
metodę?
Jednym z najbardziej podstawowych zastosowań tego byłoby sprawdzenie, czy związek zawiera grupę karbonylową, benzylowy wodór, a nawet pierścień benzenowy.
data-structures
Richarizardd
źródło
źródło
Odpowiedzi:
(Absolwent biochemii z 30-letnim doświadczeniem w tworzeniu oprogramowania)
Cząsteczki nieorganiczne są „względnie” proste. Interesujące są te, które mogą się ze sobą wiązać, np. C, N, O, Si, ponieważ można uzyskać naprawdę fajne kombinacje. Pierścień benzenowy jest bardzo prostym przykładem. Niektóre odmiany zastępują azot jednym z atomów węgla i robi się dziwnie szybko.
Zacznę od obiektu „atomowego” z różnymi typami dziedziczącymi po nim atomów.
Każdy obiekt „atomowy” zawierałby listę obiektów atomowych reprezentujących różne wiązania, więc azot miałby listę o stałym rozmiarze 3. Mógłby wówczas przechowywać linki do trzech innych atomów. Podwójne wiązanie może być reprezentowane jako zduplikowany wpis.
Każdy atom miałby osadzone zasady dotyczące tego, z czym może i zgodnie z prawem się wiązać.
Możesz więc jednoznacznie tworzyć dość skomplikowane cząsteczki - ponieważ wiązanie 3 na węglu nr 1 jest połączone z wiązaniem 1 na atomie wodoru 2 itd.
Mam nadzieję, że to ma sens ...
źródło
Pierwszą pokusą przy modelowaniu jest użycie struktury danych w stylu drzewa czworokątnego. Każdy atom węgla ma cztery połączenia, każdy tlen dwa i każdy wodór jeden. Nie sądzę jednak, aby to było właściwe rozwiązanie.
Myślę, że właściwe rozwiązanie zostało już wynalezione. Używana struktura danych to ciąg znaków.
Pomyśl o tym. Chemicy modelują związki organiczne już od dłuższego czasu. Jeśli pokażesz chemikowi CH4, natychmiast rozpoznają go jako metan. Pokaż im CH3CH2OH, a rozpoznają to jako etanol. Rozpoznają to, ponieważ identyfikują kombinację CH3CH2 jako związek „etyczny” (co oznacza dwa atomy węgla), a OH jako „anol” lub grupę alkoholową.
Mamy również wcześniej istniejącą metodologię wyszukiwania i identyfikowania podciągów - wyrażeń regularnych.
Aby programowo przedstawić związek organiczny, zdefiniowałbym związek jako zawierający ciąg znaków reprezentujący jego wzór chemiczny i ciąg określający jego nazwę chemiczną. Mogłyby mieć metody, które pozwoliłyby zidentyfikować, jakie „specjalne” właściwości miał związek.
Przykładowa klasa w języku C #:
Oczywiście musisz napisać klasę nameCalculator, która oblicza nazwę na podstawie formuły. Trzeba by utworzyć regex, który definiuje pierścień benzynowy. Zdefiniuj dodatkowe wyrażenia regularne dla każdej grupy, którą chcesz wyszukać.
Zaletą modelowania związków w ten sposób jest to, że jest to język, który jest dokładnie w domenie biznesowej użytkownika końcowego. Wszystko, co programista musi wiedzieć, to ciągi znaków do wyszukiwania, które mogą być łatwo dostarczone przez podręcznik lub aptekę.
Jeśli wymagane są reprezentacje strukturalne tych chemikaliów, sugeruję zastanowienie się nad utrzymaniem reprezentacji SMILES w formule.
Reprezentacja wzoru chemicznego SMILES
źródło