Moleküler editör / görselleştirici yapma: Nesneye yönelik programlama, veri yapıları ve moleküller


12

Programlamaya yeniyim ve ilk büyük sorunumu çözmeye ve ilk büyük programımı yazmaya çalışıyorum. Öğrenmek için açık kaynak kod örnekleri aradım, ancak şimdiye kadar sadece tam olarak anlamadığım veya gerçekten öğrenmem gereken çok ilgili şeyler yapan dillerde kodlar buldum. Burada bazı kavramsal adımlar atmakta zorlanıyorum.

Küçük organik molekülleri oluşturmak, değiştirmek ve daha sonra temsil etmek için basit bir yazılım parçası yapmak istiyorum. Bu esas olarak bir öğrenme alıştırmasıdır. Bir kullanıcı bir SMILES dizesi verir veya temel bir dizi başlangıç ​​molekülü arasından seçim yapar ve daha sonra bu molekül üzerinde grafiksel olarak veya bir metin giriş sözdizimi yoluyla oluşturulabilir. Ancak henüz bu karmaşıklık noktasında değilim. Molekülleri depolamak için sınıfların / nesnelerin nasıl yapılacağını tam olarak anlayamıyorum. Öyleyse, sorum kısa ve öz: Tüm bilgileri korurken moleküller oluşturmak için sınıfları / nesneleri nasıl kullanırım ve hangi nesnelere öznitelik olarak hangi veri yapılarını kullanmalıyım? Ve, nesneler diğer nesnelere öznitelik olabilir mi?

İşte benim düşünce trenim: Ben bir "Molekül" sınıfı, sonra bir "Atom" sınıfı / alt sınıfı ve bir "Bond" alt sınıfı ve belki de bir "FunctionalGroup" alt sınıfı var düşünüyordum. Bu başlamak için iyi bir yer gibi görünüyor, ama belki OOP yanlış anlıyorum ve bu kötü. Ama sonra sorunum gerçekten kafa karıştırıyor (benim için). Tüm bu kavramlara / fikirlere / sınıflara sahip olmama rağmen, molekülü temsil etmek için hangi veri yapılarının gerekli olduğunu tam olarak kavrayamıyorum. Bir atom listesi olması iyi bir şey olurdu. Bu liste Atom nesnelerinin bir listesi olabilir mi? Bağlantıyı saklamanın bir yoluna ihtiyacım olacaktı. Bir 2D matris, matris konumlarında tamsayı olarak bağlanma sırası ile iyi bir fikir gibi görünüyor.

Bu noktada göreve boğulmaya başlıyorum. Şimdiye kadar yaptığım her şey mantıklı mı? Bunun üzerine bir ekran / çizim yönü eklemek, bu şeylerin çoğunu yeniden yazmam / yeniden işlemem gerektiği anlamına gelebilir, ancak en azından ilgili verilerle molekülleri depolayabileceğim ve daha sonra erişebileceğim bir noktaya gelmeye çalışıyorum denetlemek / değiştirmek için bu verileri kullanın. Python bunu yapmayı düşünüyordum, bu yüzden kod / sınıflar belki böyle bir şey olurdu: http://pastebin.com/uUi1BMzr

Belki de bu gerçekten StackOverflow için bir programlama soruları, ama buraya gitmek için yeterince spesifik olduğunu düşündüm. Kavramsal hatalar yaptığım yeri işaret etseniz bile, herhangi bir yardım çok takdir edilecektir. Şimdiden teşekkürler.


1
Ayrıca, benzer bir şey yapmaya çalışan herkes için, moleküler mekanik araç kiti için MMTK adlı birkaç kavramla bana yardımcı olan güzel bir açık kaynak python paketi buldum.
Nate

1
OpenBabel'a baktınız mı? İhtiyacınız olan her şeye sahip olmalısınız.
Deathbreath

Yanıtlar:


5

yazılım yazmak yinelemeli bir süreçtir - kod yazma -> ne kadar ilerleyebileceğinizi görün ve sonraki adımları planlayın -> kod yazma -> tekrarlayın. Sanatı öğrenmenin bu aşamasında, sadece suları test etmek için yakında atlamanızı öneririm. Tüm sistemi önceden planlamaya gerek yoktur. Evet python iyi bir ilk dil olurdu. Görselleştirme için MatPlotLib'i deneyin, ayrıca NumPy ve SciPy de kullanışlıdır. Endüstriyel ölçekli yazılım, her şeyi kendiniz yazmak yerine her zaman önceden oluşturulmuş kütüphaneleri çekmeye dayanır, ancak özellikle programlamayı öğrenirken basit çözümler kendiniz yazılabilir ve yazılmalıdır. OO düzeniniz şimdilik iyi görünüyor. Nesne ilişkilerinizin daha sonra değiştirilmesi gerektiğinde / gerekiyorsa, kodunuzun kendisini yeniden faktörlendirme eylemi, ustalaşmaya değer bir deneyimdir. Gemiye Hoşgeldiniz !


Giriş için teşekkürler. Ben sadece buna devam edeceğim. Ayrıca bir nesne öznitelikleri / değişkenleri geçirme ve mutasyon hakkında biraz öğreniyorum. Gerçek dünyadan bir şey almak ve onu bilgisayar kodunda temsil etmeye çalışmak gerçekten büyüleyici.
Nate

9

Hedefinizin birçok zorluğu var. Onları parçalara ayıracağım.

SMILES ayrıştırılması önemsiz bir dil değildir ve aromatiklik algısı için kurallar iyi tanımlanmamıştır. OpenSMILES projesinin ayrıntılı dilbilgisi tanımı bazılarına yardımcı olmalıdır.

SMILES topolojiyi tanımlar, ancak 2D veya 3D bilgi vermez. İkisini de yapmak zor. (Yani, güzel görünmesini istiyorsanız.)

Gerçekten, RDKit cheminformatics araç setine (veya OpenBabel'a bakmalısınız, ancak RDKit'i tercih ederim). Dahili bir SMILES ayrıştırıcısının yanı sıra 2D düzenine sahiptir ve 3D konformasyon jenerasyonuna inanıyorum. OpenBabel da öyle.

Ardından görüntüleme için GUI sistemini bulmanız gerekir. Aslında, burada CD'deki CDK cheminformatics araç takımı en gelişmiş olanıdır.

Ama bir molekülü nasıl temsil edeceğinizin temellerinde bulunuyorsunuz. Küçük molekül ve büyük molekül (protein, DNA) veri modelleri arasında farklılıklar vardır, ancak SMILES ile ilgilendiğiniz için bu, küçük molekül odaklı olduğunuz anlamına gelir.

Diğerlerinin yanı sıra RDKit, OpenBabel, CDK, OEChem ve Indigo için API belgelerine bakabilirsiniz. Bu, insanların sınıf API'larını geliştirmelerinin çeşitli yolları hakkında bir fikir verecektir. Bunlardan en çok OEChem'i, ardından RDKit'i tercih ederim. OEChem açık kaynak olmasına rağmen, API, kullanım örnekleri ile birlikte çevrimiçi ve serbestçe okunabilir.

Kısacası, Atom ve Bond örneklerinin bir listesini içeren bir Molecule sınıfına sahip olun. "mol.AddAtom (öğe numarası)", bağ olmadan yeni bir atom oluşturur, "mol.AddBond (atom1, atom2, bond_type)" bir bağ bağlantısı oluşturur. Her bağın bağlı olduğu atomları bilmesi ve her atomun bir bağ listesine ihtiyacı vardır. Bu, veri yapısında çok sayıda döngüye yol açar, ancak bağlantı araması gibi çeşitli algoritmaların doğrusal zamanda yapılabilmesi için gereklidir.

2D matris kullanmayın. Küçük bir molekül için uygun olsa da, o kadar iyi ölçeklenmez ve buna gerek yoktur. Birkaç algoritma bağlantı matrisine ihtiyaç duyar ve gerektiğinde / gerektiğinde kolayca oluşturulur.

"FunctionalGroup" yok. Çok özel. İlgilendiğiniz atomların ve bağların listesini içeren "Altküme" veya "Parça" gibi bir şey kullanın. Bu yolla "seçilen atomlar" ve "halka altyapısı" ve "iskele" gibi şeyleri de kullanabilirsiniz. belirli bir alt küme.

Ben senin macununa baktım. Ayrıştırıcı bu şekilde çalışmamalıdır. Ayrıştırma işlemini gerçek molekül yapınızdan ayırmalısınız. Bunun gibi bir şey deneyin:

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

ve "CC O" gibi basit bir doğrusal zincir için ayrıştırıcı:

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

Tabii ki, tam bir SMILES ayrıştırıcısı bundan çok daha karmaşıktır ve tam veri modeli, genellikle kapalı olan hidrojen sayımları gibi şeyleri işlemelidir.

Bu araç setlerinden birini kullanmaya karar verirseniz, OpenBabel, RDKit ve CDK posta listeleri de iyi yerlerdir. Shapado'nun ev sahipliğinde "Mavi Dikilitaş" Soru-Cevap sitesi de var.


1

Başlamak için başka bir yaklaşım, sorununuzla ilgili bir şey yapan bazı kodlara bakmak olabilir. Bu durumda egzersiziniz başka bir programla bile sonuçlanabilir ve bu iyi olurdu, değil mi?

İlginizi çekebilecek programlar

  • MD simülasyonu ve moleküler modelleme paketi MMTK (yukarıda Nate tarafından önerildiği gibi)

  • Görselleştirme paketi PyMol


1

Moleküler bir nesne sisteminin detaylarını öğrenmek kimyagerlerin nesne yönelimli programlamayı öğrenmeleri için harika bir yoldur. Böyle bir sistemin uygulanmasının moleküler sezgilerinizi geliştireceğini göreceksiniz. Nitelikler ve yöntemler açısından atomlar, moleküller ve belki de molekül koleksiyonları hakkında biraz düşünmelisiniz.

İşte size yardımcı olabilecek bazı güzel python (biraz daha eski) slaytlar: http://www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

Çalışmanızı kontrol etmek için: openbabel (python bağlamaları olan!) Ve MMTK'ye ek olarak, phenix'te DİRSEK vardır.

İçindeki poliglot için ayrıca PerlMol (Perlmol.org) var. PerlMol nesne yönelimli perl ile yazılmıştır ve CPAN'dan indirilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.