Making a Molecular editor / visualizer: Pemrograman berorientasi objek, struktur data, dan molekul


12

Saya baru dalam pemrograman dan saya mencoba untuk menyelesaikan masalah besar pertama saya dan menulis program besar pertama saya. Saya telah mencari contoh kode sumber terbuka untuk dipelajari, tetapi sejauh ini hanya menemukan kode dalam bahasa yang tidak sepenuhnya saya pahami atau yang terkait tetapi masih terlalu jauh untuk saya pelajari. Saya mengalami kesulitan mengambil beberapa langkah konseptual di sini.

Saya ingin membuat perangkat lunak sederhana untuk membangun, memodifikasi, dan kemudian mewakili molekul organik kecil. Ini terutama latihan pembelajaran. Seorang pengguna akan memberikan string SMILES atau memilih dari set dasar molekul starter, dan kemudian dapat membangun molekul itu baik secara grafis atau melalui sintaks input teks. Namun, saya belum sampai pada tingkat kerumitan itu. Saya bahkan tidak dapat sepenuhnya memahami cara membuat kelas / objek untuk menyimpan molekul. Jadi, pertanyaan saya secara ringkas: Bagaimana cara menggunakan kelas / objek untuk membangun molekul sambil mempertahankan semua tingkat informasi, dan struktur data apa yang harus saya gunakan sebagai atribut ke objek mana? Dan, bisakah objek menjadi atribut ke objek lain?

Inilah pemikiran saya sejauh ini: Saya berpikir untuk memiliki kelas "Molekul", kemudian kelas / subkelas "Atom" dan subkelas "Bond", dan mungkin juga subkelas "FunctionalGroup". Itu sepertinya tempat yang bagus untuk memulai, tapi mungkin saya salah paham OOP dan ini buruk. Tapi kemudian masalah saya benar-benar membingungkan (untuk saya). Meskipun saya memiliki semua konsep / ide / kelas ini, saya tidak sepenuhnya memahami struktur data apa yang diperlukan untuk mewakili molekul. Daftar atom akan menjadi hal yang baik untuk dimiliki. Mungkinkah daftar itu menjadi daftar objek Atom? Saya juga perlu memiliki cara untuk menyimpan konektivitas. Matriks 2D sepertinya ide yang bagus, dengan urutan ikatan sebagai bilangan bulat dalam posisi matriks.

Pada titik ini saya mulai kewalahan dengan tugas. Apakah semua yang saya lakukan sejauh ini masuk akal? Melampirkan aspek tampilan / gambar di atas ini mungkin berarti bahwa saya perlu menulis ulang / mengerjakan ulang banyak hal ini, tapi saya hanya mencoba untuk sampai pada titik di mana saya setidaknya dapat menyimpan molekul dengan data yang relevan dan kemudian mengakses data yang akan diperiksa / dimodifikasi. Saya berpikir untuk melakukan ini dengan Python, jadi kode / kelas mungkin akan terlihat seperti ini: http://pastebin.com/uUi1BMzr

Mungkin ini benar-benar pertanyaan pemrograman untuk StackOverflow, tapi saya pikir itu cukup spesifik untuk pergi ke sini. Setiap bantuan akan sangat dihargai, bahkan jika Anda hanya menunjukkan di mana saya telah membuat kesalahan konseptual. Terima kasih sebelumnya.


1
Juga, bagi siapa pun yang mencoba melakukan sesuatu yang serupa, saya baru saja menemukan paket python open source yang bagus yang telah membantu saya dengan beberapa konsep yang disebut MMTK, untuk kit alat mekanika molekuler.
Nate

1
Sudahkah Anda melihat OpenBabel? Itu harus memiliki semua yang Anda butuhkan.
Deathbreath

Jawaban:


5

menulis perangkat lunak adalah proses berulang - menulis kode -> melihat seberapa jauh Anda bisa mendapatkan kemudian merencanakan langkah selanjutnya -> menulis kode -> ulangi. Pada tahap ini dalam mempelajari seni saya sarankan Anda segera melompat hanya untuk menguji air. Tidak perlu merencanakan seluruh sistem di muka. Ya python akan menjadi bahasa pertama yang baik. Untuk visualisasi, coba MatPlotLib, juga NumPy dan SciPy sangat berguna. Perangkat lunak berskala industri selalu bergantung pada menarik perpustakaan pra-bangun, alih-alih menulis semuanya sendiri, namun solusi sederhana dapat dan harus ditulis sendiri, terutama ketika belajar memprogram. Tata letak OO Anda tampaknya OK untuk saat ini. Ketika / jika hubungan objek Anda perlu diubah kemudian, tindakan re-factoring kode Anda sendiri adalah pengalaman yang layak untuk dikuasai. Selamat bergabung !


Terima kasih atas masukannya. Saya hanya akan terus melakukannya. Saya juga belajar sedikit tentang meneruskan dan bermutasi atribut objek / variabel. Sangat menarik untuk mengambil sesuatu dari dunia nyata dan mencoba untuk mewakilinya dalam kode komputer.
Nate

9

Tujuan Anda memiliki banyak tantangan. Saya akan memecahnya menjadi beberapa bagian.

SMILES bukan bahasa yang sepele untuk diurai, dan aturan untuk persepsi aromatisitas tidak didefinisikan dengan baik. Definisi tata bahasa terperinci dari proyek OpenSMILES akan membantu beberapa orang.

SMILES mendefinisikan topologi, tetapi tidak memberikan informasi 2D atau 3D. Membuat keduanya itu sulit. (Yaitu, jika Anda ingin terlihat bagus.)

Sungguh, Anda harus melihat ke toolkit cheminformatika RDKit (atau OpenBabel, tapi saya lebih suka RDKit). Ini memiliki parser SMILES bawaan, serta tata letak 2D, dan saya percaya generasi konformasi 3D. OpenBabel juga.

Maka untuk tampilan Anda harus mencari tahu sistem GUI. Sebenarnya, di sini CDK cheminformatics toolkit, di Jawa, adalah yang paling canggih.

Tetapi Anda berada di dasar-dasar bagaimana merepresentasikan molekul. Ada perbedaan antara model data molekul kecil dan molekul besar (protein, DNA), tetapi karena Anda tertarik pada SMILES, artinya Anda berorientasi pada molekul kecil.

Anda dapat melihat dokumen API untuk RDKit, OpenBabel, CDK, OEChem, dan Indigo, di antara banyak lainnya. Itu akan memberi Anda gambaran tentang beragam cara orang mengembangkan API kelas mereka. Dari jumlah tersebut, saya lebih suka OEChem, diikuti oleh RDKit. Meskipun OEChem adalah open source, API online dan dapat dibaca secara bebas, bersama dengan contoh penggunaan.

Singkatnya, memiliki kelas Molekul, dengan daftar contoh Atom dan Bond. "mol.AddAtom (nomor elemen)" membuat atom baru, tanpa ikatan, "mol.AddBond (atom1, atom2, bond_type)" membuat koneksi ikatan. Setiap ikatan perlu mengetahui atom-atom yang terhubung dengannya, dan setiap atom membutuhkan daftar ikatan. Ini mengarah ke banyak siklus dalam struktur data, tetapi diperlukan agar berbagai algoritma, seperti pencarian konektivitas, dapat dilakukan dalam waktu linier.

Jangan gunakan matriks 2D. Meskipun layak untuk sebuah molekul kecil, ia tidak mengalami skala yang baik, dan tidak perlu untuk itu. Beberapa algoritma memerlukan matriks konektivitas, dan mudah dihasilkan jika diperlukan.

Tidak punya "FunctionalGroup". Itu terlalu khusus. Gunakan sesuatu seperti "Subset" atau "Fragmen", yang berisi daftar atom dan ikatan yang Anda minati. Dengan begitu Anda juga dapat menangani hal-hal seperti "atom yang dipilih" dan "substruktur cincin" dan "perancah" dengan merujuk ke bagian tertentu.

Saya melihat pastebin Anda. Parser tidak seharusnya bekerja seperti itu. Anda harus memisahkan parsing dari struktur molekul Anda yang sebenarnya. Coba sesuatu seperti ini:

class Molecule(object):
    def __init__(self):
        self.atoms = []
        self.bonds = []
        self._atom_id = 0
        self._bond_id = 0
    def _next_atom_id(self):
        atom_id = self._atom_id
        self.atom_id += 1
        return atom_id
    def AddAtom(self, eleno):
        self.atoms.append(Atom(self, self._next_atom_id(), eleno))
    def AddBond(self, atom1, atom2, bondtype):
        assert atom1.molecule is atom2.molecule
        self.bonds.append(Bond(self, self._next_bond_id(),
                               atom1, atom2, bondtype))

class Atom(object):
    def __init__(self, molecule, id, eleno):
        self.molecule = molecule
        self.id = id
        self.eleno = eleno
        self.charge = 0
        self.isotope = 0
   ..

dan kemudian parser untuk rantai linier sederhana seperti "CC O" adalah:

def parse_linear_chain(text):
   mol = Molecule()
   prev_atom = None
   for atom_symbol in text.split():
     eleno = lookup_symbol[atom_symbol]
     atom = mol.NewAtom(eleno)
     if pre_atom is not None:
       mol.AddBond(prev_atom, atom, 1)
     prev_atom = atom
   return mol

Tentu saja, parser SMILES lengkap jauh lebih rumit dari ini, dan model data lengkap harus menangani hal-hal seperti jumlah hidrogen, yang sering kali tersirat.

OpenBabel, RDKit, dan milis CDK juga merupakan tempat yang baik untuk dikunjungi, jika Anda memutuskan untuk menggunakan salah satu dari toolkit tersebut. Ada juga situs tanya jawab "Obelisk Biru", yang diselenggarakan oleh Shapado.


1

Pendekatan lain untuk memulai mungkin dengan melihat beberapa kode yang sudah melakukan sesuatu yang berhubungan dengan masalah Anda. Dalam hal ini, olahraga Anda mungkin berakhir di beberapa program lain, dan itu akan menyenangkan, bukan?

Program yang mungkin menarik bagi Anda

  • Paket simulasi MD dan pemodelan molekul MMTK (seperti yang telah disarankan oleh Nate di atas)

  • Paket visualisasi PyMol


1

Mempelajari detail sistem objek molekuler adalah cara yang bagus bagi ahli kimia untuk mempelajari pemrograman berorientasi objek. Anda akan menemukan bahwa implementasi sistem seperti itu akan memperbaiki intuisi molekuler Anda. Anda harus melakukan beberapa pemikiran keras tentang atom, molekul, dan mungkin koleksi molekul dalam hal atribut dan metode.

Berikut ini beberapa slide python yang bagus (sedikit lebih tua) yang dapat membantu: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

Untuk memeriksa pekerjaan Anda: selain openbabel (yang memiliki ikatan python!) Dan MMTK, ada ELBOW dalam fenix.

Untuk polyglot dalam diri Anda, ada juga PerlMol (Perlmol.org). PerlMol ditulis dalam perl berorientasi objek dan dapat diunduh dari CPAN.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.