制作分子编辑器/可视化器:面向对象的程序,数据结构和分子


12

我是编程新手,正在尝试解决我的第一个大问题并编写我的第一个大程序。我一直在寻找可以学习的开放源代码示例,但是到目前为止,我只发现了我无法完全理解的语言代码,或者确实找到了相关但仍然相距甚远的语言来学习。我在这里采取一些概念上的步骤时遇到了麻烦。

我想制作一个简单的软件来构建,修改并稍后代表有机小分子。这主要是一种学习练习。用户可以给出一个SMILES字符串或从一组基本的起始分子中进行选择,然后可以以图形方式或通过文本输入语法在该分子上进行构建。但是,我还没有达到那种复杂程度。我什至无法完全理解如何创建类/对象来存储分子。因此,我的问题简明扼要:如何在保留所有信息级别的同时使用类/对象构建分子,以及应使用哪些数据结构作为哪些对象的属性?而且,对象可以作为其他对象的属性吗?

到目前为止,这是我的思路:我正在考虑创建一个“分子”类,然后是一个“原子”类/子类和一个“邦德”子类,也许还有一个“ FunctionalGroup”子类。这似乎是一个不错的起点,但也许我误会了OOP,这很不好。但是后来我的问题真的变得令人困惑(对我来说)。即使我拥有所有这些概念/想法/类,我仍未完全掌握表示分子所需的数据结构。原子列表将是一件好事。该列表可以是Atom对象的列表吗?我还需要一种存储连接性的方法。2D矩阵似乎是个好主意,在矩阵位置,键序为整数。

在这一点上,我开始不知所措。我到目前为止所做的一切都有意义吗?在此之上附加显示/绘图方面可能意味着我需要重写/重做许多这些事情,但是我只是想达到一个这样的程度,即我至少可以将分子与相关数据一起存储,然后访问该数据进行检查/修改。我正在考虑在Python中执行此操作,因此代码/类可能看起来像这样:http : //pastebin.com/uUi1BMzr

也许这确实是StackOverflow的编程问题,但是我认为它足够具体了。即使您仅指出我在概念上犯了错误的地方,也将不胜感激任何帮助。提前致谢。


1
另外,对于任何尝试做类似事情的人,我都找到了一个不错的开源python软件包,该软件包为我提供了一些名为MMTK的概念,用于分子力学工具包。
Nate 2012年

1
您看过OpenBabel吗?那应该拥有您需要的一切。
死息2012年

Answers:


5

编写软件是一个反复的过程-编写代码->查看可以获得的内容,然后计划下一步->编写代码->重复。在这个学习艺术的现阶段,我建议您尽快参加测试。无需预先计划整个系统。是的,python将是一种很好的第一语言。对于可视化,请尝试MatPlotLib,NumPy和SciPy也很方便。工业规模的软件始终依赖于引入预构建库,而不是自己编写所有内容,但是可以并且应该自己编写简单的解决方案,尤其是在学习编程时。您的OO布局目前看来还可以。当/如果以后需要更改对象关系时,重构代码本身的行为是值得掌握的经验。欢迎上车!


感谢您的输入。我将继续保持下去。我还学习了一些有关传递和变异对象属性/变量的知识。从现实世界中获取某些东西并尝试用计算机代码表示它确实很有趣。
Nate 2012年

9

您的目标有很多挑战。我将它们分为几部分。

SMILES并不是一门琐碎的语言,对于芳香感的规则还没有很好的定义。OpenSMILES项目中详细的语法定义应有所帮助。

SMILES定义拓扑,但不提供2D或3D信息。做一个都很难。(也就是说,如果您希望它看起来不错。)

确实,您应该使用RDKit化学格式工具包(或OpenBabel,但我更喜欢RDKit)。它具有内置的SMILES解析器以及2D布局,并且我相信3D构象生成。OpenBabel也是如此。

然后为了显示,您必须弄清楚GUI系统。实际上,这里的Java CDK化学信息工具包是最先进的。

但是您掌握了如何表示分子的基础知识。小分子和大分子(蛋白质,DNA)数据模型之间存在差异,但是由于您对SMILES感兴趣,这意味着您面向小分子。

您可以查看RDKit,OpenBabel,CDK,OEChem和Indigo等的API文档。这将使您了解人们开发其类API的多种方式。其中,我最喜欢OEChem,其次是RDKit。即使OEChem是开源的,该API仍是在线且可免费阅读的,以及使用示例。

简而言之,有一个Molecule类,其中包含Atom和Bond实例的列表。“ mol.AddAtom(元素编号)”创建一个没有键的新原子,“ mol.AddBond(atom1,atom2,bond_type)”建立键连接。每个键都需要知道其连接的原子,每个原子都需要一个键列表。这导致了数据结构中的许多循环,但是这是必需的,以便可以在线性时间内完成各种算法(例如连接性搜索)。

不要使用2D矩阵。虽然对于一个小分子而言可行,但它的缩放比例不够好,因此也不需要它。很少有算法需要连通性矩阵,并且在需要时很容易生成。

没有“ FunctionalGroup”。太专业了。使用诸如“子集”或“片段”之类的东西,其中包含您感兴趣的原子和键的列表。这样,您还可以通过引用来处理“选定原子”,“环子结构”和“支架”之类的东西。特定子集。

我看着你的便签纸。解析器不应该那样工作。您应该将解析与实际的分子结构分开。尝试这样的事情:

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

然后,像“ CC O”这样的简单线性链的解析器是:

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

当然,完整的SMILES解析器要比这复杂得多,并且完整的数据模型必须处理诸如氢计数之类的事情,而这通常是隐式的。

如果您决定使用其中一种工具包,OpenBabel,RDKit和CDK邮件列表也是不错的选择。还有Shapado主持的“蓝色方尖碑”问答网站。


1

另一种入门方法可能是查看一些已经完成与您的问题相关的代码。在这种情况下,您的练习甚至可能会结束其他程序,那很好,不是吗?

您可能感兴趣的程序是

  • MD仿真和分子建模程序包MMTK(如Nate上文所建议)

  • 可视化包PyMol


1

学习分子对象系统的细节是化学家学习面向对象程序设计的绝妙方法。您会发现,这样的系统的实施将改善您的分子直觉。您应该就属性,方法等方面对原子,分子甚至分子集合进行一些认真的思考。

这是一些不错的python幻灯片(较旧),可能会有所帮助:http : //www.wag.caltech.edu/home/rpm/python_course/Lecture_4.pdf

用于检查您的工作:除了openbabel(具有python绑定!)和MMTK,phenix中还有ELBOW。

对于您中的多种语言,还有PerlMol(Perlmol.org)。PerlMol是用面向对象的perl编写的,可以从CPAN下载。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.