Struktur data apa yang akan Anda gunakan untuk mewakili senyawa organik?

11

Apakah ada struktur data yang baik di luar sana yang dapat digunakan untuk mewakili molekul?

Saya berpikir mungkin saya menggambarkannya sebagai Grafik dengan membuat setiap atom menjadi simpul, namun, senyawa organik memiliki banyak Karbon dan Hidrogen. Bagaimana Anda menghitungnya? Adakah cara yang baik untuk merepresentasikan molekul, tetapi pada saat yang sama, memiliki .contains()metode yang efisien ?

Salah satu kegunaan paling mendasar untuk ini adalah untuk memeriksa apakah suatu senyawa mengandung gugus karbonil, atau hidrogen benzilik, atau bahkan cincin benzen.

Richarizardd
sumber
8
Saya pikir Anda harus bertanya kepada seorang ahli kimia. Mereka mungkin tidak tahu cara memprogramnya, tetapi mereka benar-benar tahu cara merepresentasikan senyawa, dan memiliki hampir semua kemungkinan (misalnya, mereka mewakili bencene hanya dengan segi enam). Juga, ada beberapa tingkat abstraksi (protein digambarkan sebagai sekuens asam amino, bukan sebagai kelompok atom). Setelah Anda memahami bagaimana merepresentasikannya di kertas, bagian pemrograman harus cukup mudah
SJuan76
Ini adalah pertanyaan yang sangat bagus. Semoga saya akan mendapat kesempatan untuk menambahkan beberapa pemikiran nanti.
Stephen
2
Dua hal yang perlu diingat: ingat bahwa atom dapat memiliki isotop yang berbeda, dan ingat bahwa beberapa senyawa memiliki unsur yang sama, tetapi berbeda karena lokasi ikatan .
Telastyn

Jawaban:

7

(Lulusan biokimia dengan pengalaman pengembangan perangkat lunak 30 tahun)

Molekul non-organik adalah "relatif" sederhana. Yang menarik adalah mereka yang dapat terikat dengan diri mereka sendiri misalnya C, N, O, Si karena Anda bisa mendapatkan beberapa kombinasi yang benar-benar funky. Cincin Benzene adalah contoh yang sangat sederhana. Beberapa variasi menggantikan Nitrogen untuk salah satu Karbon dan itu menjadi aneh dengan cepat.

Saya akan mulai dengan objek "atom" dengan berbagai jenis atom yang diwarisi darinya.

Setiap "atom" objek akan berisi daftar objek atom untuk mewakili berbagai ikatan sehingga Nitrogen akan memiliki daftar ukuran tetap 3. Kemudian dapat menyimpan tautan ke tiga atom lainnya. Ikatan rangkap dapat direpresentasikan sebagai entri rangkap.

Setiap atom akan memiliki aturan yang tertanam tentang apa yang dapat mengikat secara hukum dan bagaimana.

Jadi, Anda dapat membuat molekul yang cukup rumit secara jelas - karena ikatan 3 pada Karbon # 1 terkait dengan ikatan 1 pada Hidrogen 2 dll.

Harapan itu masuk akal ...

mcottle
sumber
4

Godaan pertama dengan pemodelan ini adalah dengan menggunakan struktur data gaya quad-tree. Setiap atom karbon memiliki empat koneksi, masing-masing oksigen dua dan masing-masing satu hidrogen. Saya tidak berpikir bahwa ini adalah solusi yang tepat.

Saya pikir solusi yang tepat telah ditemukan. Struktur data yang digunakan adalah string.

Pikirkan tentang ini. Kimiawan telah memodelkan senyawa organik untuk waktu yang cukup lama sekarang. Jika Anda menunjukkan ahli kimia CH4, mereka akan segera mengenali itu sebagai metana. Tunjukkan pada mereka CH3CH2OH dan mereka akan mengenalinya sebagai etanol. Mereka mengenali ini karena mereka mengidentifikasi kombinasi CH3CH2 sebagai senyawa "et" (artinya dua atom karbon) dan OH sebagai "anol" atau kelompok alkohol.

Kami juga memiliki metodologi yang sudah ada sebelumnya untuk mencari dan mengidentifikasi substring - ekspresi reguler.

Jadi untuk mewakili secara pemrograman suatu senyawa organik, saya akan mendefinisikan suatu senyawa sebagai mengandung string yang mewakili formula kimianya dan string yang mendefinisikan nama kimianya. Itu dapat memiliki metode yang mengidentifikasi sifat "khusus" yang dimiliki senyawa.

Contoh kelas di 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);
    }
}

Tentunya Anda perlu menulis kelas nameCalculator, yang menghitung nama berdasarkan rumus. Anda harus membuat regex yang mendefinisikan cincin benzine. Tetapkan regex tambahan untuk setiap grup yang ingin Anda cari.

Keuntungan dari memodelkan senyawa dengan cara ini adalah dalam bahasa yang persis berada dalam domain bisnis pengguna akhir. Yang perlu Anda ketahui sebagai pengembang adalah string yang harus dicari, yang dapat dengan mudah disediakan oleh buku teks atau ahli kimia.

Jika representasi struktural dari bahan kimia ini diperlukan, saya sarankan untuk menjaga representasi SMILES dari formula ini.

Representasi formula kimia SMILES

Stephen
sumber
2
Bagaimana Anda menangani isomer dengan cara ini?
Itu pertanyaan yang bagus. Ternyata ini sudah dipikirkan. Saya telah menambahkan informasi tentang representasi formula kimia SMILES ke dalam jawabannya.
Stephen
ada berbagai sistem nama sistematis yang juga dapat digunakan tergantung pada properti apa yang sebenarnya ingin Anda model
jk.