Jakiej struktury danych użyłbyś do przedstawienia związku organicznego?

11

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.

Richarizardd
źródło
Powiązane: scicomp.stackexchange.com/q/2081
scriptin
8
Myślę, że powinieneś zapytać chemika. Mogą nie wiedzieć, jak to zaprogramować, ale na pewno wiedzą, jak reprezentować związki i zastanowili się nad większością możliwości (na przykład reprezentują bencene tylko za pomocą sześciokąta). Istnieją również pewne poziomy abstrakcji (białko opisuje się jako sekwencję aminokwasów, a nie jako grupę atomów). Kiedy zrozumiesz, jak to przedstawić w formie papierowej, część programistyczna powinna być dość prosta
SJuan76
To doskonałe pytanie. Mam nadzieję, że później będę mógł dodać trochę przemyśleń.
Stephen
2
Dwie rzeczy do zapamiętania: pamiętaj, że atomy mogą mieć różne izotopy i pamiętaj, że niektóre związki mają te same pierwiastki, ale różnią się ze względu na lokalizację wiązania .
Telastyn

Odpowiedzi:

7

(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 ...

Mcottle
źródło
4

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 #:

public class OrganicCompound
{
    private Regex benzineRingRegex;

    public OrganicCompound(string formula, NameCalculator nameCalculator, Regex benzineRingRegex)
    {
        this.Formula = formula;
        this.Name = nameCalculator.CalculateName(formula);
        this.benzineRingRegex = benzineRingRegex
    }

    public string Formula { get; private set; }

    public string Name { get; private set; }

    public bool HasBenzeneRing() 
    { 
        return Regex.IsMatch(this.Formula, benzineRingRegex);
    }
}

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

Stephen
źródło
2
Jak obchodzisz się z izomerami w ten sposób?
To świetne pytanie. Okazuje się, że już o tym pomyślano. Do odpowiedzi dodałem informacje o reprezentacji wzoru chemicznego SMILES.
Stephen
istnieją różne systematyczne systemy nazw, których można również użyć w zależności od tego, jakie właściwości chcesz modelować
jk.