参与CDK开发,有兴趣的个人需要在SourceForge(SF)注册以获得一个免费的SF账户,并订阅开发者邮件列表[email protected]。然后他或她联系其中一位项目管理员,然后该管理员将新成员添加到项目的开发人员列表中。除了良好的 Java 编程技能外,还需要具备并发版本系统 (CVS) 的工作知识。CVS 是开源社区中使用最广泛的版本管理系统,它极大地方便了多个开发人员在同一源代码树上工作的协调。
在开始编码之前编写需求规范在计算机科学中很常见。这样的规范描述了软件的预期行为(在这种情况下是类),开发人员可以使用它来检查实现,用户可以使用这些类来查看如何使用这些类。在设计 CDK 时,此类规范仅部分使用统一建模语言 (UML) 图。
五、库功能说明
5.1. 核心课程。CDK 包层次结构的根部分中包含的类都是基本化学概念的形式化表示,例如原子、键、分子等。如下图显示了解释继承层次结构和 CDK 基本类之间的依赖关系的 UML 图。显示的 UML 图仅描述了核心类之间的关系。因此,它们被编辑并且只显示了它们真正的类间关系的一个子集。它们展示了 ChemObject 类的核心作用,它是所有其他类的超类,并提供了为任何派生 CDK 对象存储甚至复杂属性的方法。
在核心类中提到的第一个也是最明显的继承链是 Atom 扩展 AtomType 扩展 Isotope 扩展元素。这不仅从化学的角度来看是合乎逻辑的,而且还为基于单个 IsotopeFactory 工具类的子类创建原子、原子类型、同位素和元素的简单机制提供了基础,这将在下面讨论。将 Atom 置于一长串继承中,为不同级别的系统提供了中央访问点信息。例如,虽然元素提供对符号或原子序数的访问,但某些 AtomType 可以进一步区分原子的杂交状态或力场可能需要的其他一些区别。
AtomContainer 和 ElectronContainer 合并了进一步的抽象级别。ElectronContainer 构成了诸如 Bonds 和 Orbitals 之类的结构的基础,而 AtomContainer 是原子及其键的预想存储,并且是环、分子和子结构的超类。
为了支持更高级的概念,如分子集合或反应,CDK 核心补充了将分子分组为更高阶结构的类,如 SetOfMolecules、ChemSequence、ChemModel 和 ChemFile。
为清楚起见,ChemObject 和 AtomContainer 的关系已移至如下图所示的附加 UML 图。
它显示了分子如何包含在 SetOfMolecules 中,它是 ChemModel 的一部分。ChemModels 旨在存储特定时间点化学系统状态的分子信息。为了允许对时间变化进行建模,引入了将各种 ChemModel 排列到 ChemSequence 中的可能性。ChemFile 类被设计为顶级容器,它可以包含存储在一个化学文档中的所有概念,其中一个或多个 ChemSequences。
Polymer 类扩展了 Molecule 并提供了对其组成的单体的便捷访问。Monomer 本身是作为 AtomContainer 实现的。Polymer 的一个子类是用于表示蛋白质和 DNA 分子的 BioPolymer。Polymer 设计允许 BioPolymers 将每个氨基酸视为 AtomContainer。
5.2. 2D 结构图形处理。显示和操作化学结构的 2D 绘图的能力是任何化学信息学相关程序最重要的功能之一。这包括为那些化学结构生成坐标的能力,例如由结构生成器生成的无坐标化学图。后面这一步的细节在 5.4 节中讨论。
模型-视图-控制器范例在 CDK 库设计中适用。例如,用于 2D 结构图形处理的类在它们显示和操作的 ChemModel 内容之上工作。Renderer2D 类生成的 2D 绘图与主要市售产品生成的绘图相当。可以通过更改 Renderer2DModel 对象的标准设置来自定义此视图。如果要通过操作绘图的选项来补充纯显示,则可以将 Controler2D 添加到设置中。同样,它的设置由 Controler2DModel 确定,并且可以更改,例如,通过使用 setDrawNumbers(true) 以显示注释到结构的原子编号。Controler2D 是可用输入设备的适配器,通常是鼠标和键盘,并将输入转换为对底层模型的更改,这些更改再次反映在 Renderer2D 生成的视图中的更改中。一个简单的结果应用程序如下图所示.
5.3. 3D 结构处理。为了提供高性能 3D 图形,CDK 中使用了 Java3D API。然而,这使得基于 CDK 的 3D 应用程序不再独立于平台。这种依赖源于 Java3D API 依赖 OpenGL 或 DirectX更高的性能。SUN microsystems 只为 Windows(OpenGL 和 DirectX)、Solaris 和 SGI IRIX 提供 Java3D,而 Linux 版本由 Blackdown 30开发,可用于各种架构。
关于失去平台独立性,CDK 还包含不基于 Java3D API 的 3D 渲染类。再加上渲染类的分离,由于Model-View-Controller范式,这就导致了3D渲染的四个基本类:Renderer3D、Renderer3DModel、AcceleratedRenderer3D和AcceleratedRenderer3DModel,后两者基于Java3D。
5.4. 结构图布局。化学信息学的关键领域,如虚拟组合化学、虚拟筛选或计算机辅助结构解析,经常将化学结构处理为一维图。例如,这些图是结构生成器的产物,它们使用图论技术详尽无遗地生成与给定分子式一致的所有构成异构体。然而,在这些程序中的任何一个中,在虚拟筛选期间进行选择之后,例如,成功的候选结构需要呈现给化学家。此时,需要一个工具来生成 2D 或 3D 坐标以生成化学家习惯的那种描绘。这个过程被称为结构图生成。虽然 CORINA等 3D 模型构建器在未来的愿望清单上并且尚未实现,但 CDK 具有 2D 结构图生成器,它是从头开始编写的,很容易被视为最好和最CDK 的有用部分,因为它的大多数应用程序需要在几个阶段生成结构图。
5.5. 图不变量。该包包含一些用于计算图不变量的类,例如 Wiener 指数、Morgan 的扩展连接 (EC) 指数、等。例如,摩根的 EC 指数用于化合物的规范标记。这个包很可能是未来发展的热点之一,因为许多化学信息学应用,比如(定量)结构活性关系((Q)SAR)计算,经常依赖于计算不同类型的图不变量的各种组合。
5.6. 结构生成器。这个包包含一些简单的结构生成器,它们被 SENECA 系统用于计算机辅助结构解析。类 SingleRandomStructureGenerator 可用于从特定分子式给出的构成空间生成完全随机的结构。基于这种随机生成的结构,然后可以使用 RandomGenerator 根据 Faulon 建议的算法在构成空间中进行小的随机移动。如果这样的生成器与目标函数和模拟退火协议相结合,就可以有效地搜索具有某些所需特性的结构的结构空间,前提是这些特性可以从给定的结构公式可靠地反算出来。
为了能够基于进化算法(如众所周知的遗传算法)为化学图构建结构生成器,包含一个 CrossOverMachine,它以 AtomContainers 的形式接受两个化学图并产生两个后代。遗传算法是基于种群的方法,通过精心选择的突变和交叉程序组合为下一代产生新的后代,应用于当前种群。因此,CrossOverMachine 确实补充了 RandomGenerator 类中使用的变异操作。
5.7. 环搜索。John Figueras 的用于寻找最小环的最小集 (SSSR) 的快速算法已被实现,并用于例如结构图生成包。特别大的凝聚环系统,由于旧系统中的深度第一环感知算法缓慢,坐标生成过程可能需要长达一分钟的时间,现在可以在几分之一秒内布置,如下图所示。此外,这个包包含一个类,用于将给定的环系统划分为 AtomContainers,每个环一个。
在其他应用中,例如芳香性检测,计算所有环的集合 (SAR) 是必不可少的。虽然已经发布了从 SSSR 生成 SAR 的程序,但它的计算效率更高为此目的使用专门的算法。
5.8. 芳香度检测。芳香性有多种定义,并且根据这些定义检测芳香性的方法至少有很多。这个包是所有这些的预期容器,目前确实包含 HueckelAromaticityDetector 类的实现。基于 SAR 检测算法。(参见第 5.7 节)该类从检测到的最大环开始,计算交替双键或三键电子的数量,并且还考虑了杂原子的自由电子对。然后检查环是否包含 4 n+ 2 π 电子,根据著名的 Hückel 规则。环、它的所有原子和键都被标记为芳香族,并且继续寻找相同或更小尺寸的剩余环,排除那些完全属于已检测到的更大芳香系统的环。
5.9. 同构。能够确定两个化学结构是否相同或一个结构是否是另一个结构的子图是化学信息学库最重要的功能之一。同构子包包含一个用于最大公共子结构 (MCSS) 搜索的通用模块。由于 MCSS 确定是图匹配的最一般情况,因此它可用于确定结构身份并进行子图匹配和最大公共子结构搜索。
5.10. 文件输入/输出。文件输入和输出在 CDK 中进行了概括。所有文件 I/O 类都实现 ChemObjectReader 或 ChemObjectWriter。每种文件格式由实现这些接口之一的两个单独的类表示。
CDK 目前支持 XYZ、MDL molfile、PDB、和 CML 的IO 类。后一种格式由 Murray-Rust 和 Rzepa 开发,作为第一种基于 XML 的化学成分文件格式。CDK 包含此格式的输入和输出类。CML 输入阅读器使用 Murray-Rust 的 DOM 方法的替代方法,并且基于 SAX。
5.11. 与其他 Java 库的交互。除了文件I/O,CDK 还支持第二种与其他程序和库交换数据的方法。与其他库的接口使得可以将两个库中的方法结合起来,从而访问更大的功能集。CDK 提供 CDK 类到 JOELib 类的直接转换。计划支持 CMLDOM。
5.12. 微笑。简化的分子线输入规范 (SMILES) 提供分子结构的字符串表示。由于它们的紧凑性和相对简单性,它们现在被广泛用作无坐标分子结构的交换格式。基于唯一(规范)微笑的规范,还可以执行图同构检查。CDK 具有用于规范 SMILES 的生成器,其编写符合 Daylight Inc. 创始人发布的规则。虽然 SMILES 生成器实现了所有已发布的 SMILES 标准,包括手性,但 CDK 包中的 SMILES 解析器仅符合(略微扩展的)超级简化 SMILES 规范,这足以编码大多数有机结构。
5.13. 指纹。指纹是当今判断分子相似性不可或缺的工具,作为同构检查的预过滤器,从而在数据库中进行结构搜索。在这里以及在 SMILES 的情况下,此类算法的自己的子包是合理的,因为有多种计算指纹的方法。通过允许添加不同的指纹识别器而不是只有一个单一的 org.openscience.cdk.tools.Fingerprinter,让用户可以自由选择任何方法,为他的案例产生最佳性能。CDK 中的 Fingerprinter 类生成 Daylight 类型的指纹。它的工作原理是运行广度优先搜索,从分子中的每个原子开始,从而生成长达六个原子的路径的字符串表示。对于每个类似 SMILES 的字符串,使用 Java 语言提供的标准字符串散列算法计算散列代码。使用这些哈希码,生成默认工作范围为 [0-1023] 的伪随机数生成器并检索第一个随机数。该数字表示长度为 1024 的指纹位串中的位置,然后将其设置为“1”。基于来自分子的所有计算路径的整体,以该位串的形式获得分子指纹。
5.14. 工具。工具包包含适用于所有无法证明创建专用包的情况的实用程序类。例如,IsotopeFactory 可以为给定的元素符号或给定的原子质量返回元素和同位素的预配置实例。
ConnectivityChecker 类测试给定的化学图是否连通,即图中每个可能的原子对之间是否存在键路径,在非连通图的情况下,它可以返回一个带有分离部分的向量图,存储在 AtomContainer 对象中。与 ConnectivityChecker 相关的是 PathTools 类,例如,它提供了寻找分子中给定原子之间最短路径的方法。
MFAnalyser 类具有返回给定 Molecule 对象的分子式和从给定分子式字符串创建未绑定的 AtomContainer 对象的方法。HOSECodeGenerator为给定 AtomContainer 中的每个原子生成 HOSE 代码。通过将这些 HOSE 代码输入 BremserOneSphereHOSECodePredictor 类,可以预测碳 13 NMR 化学位移的预期范围。
六、 总结
CDK 现在是许多软件项目的基础。化学编辑器 JChemPaint 11利用 CDK 并为其实现了 CDK 的模型-视图-控制器机制,它再次只是一个支持工具,用于更高级别的应用程序,例如用于有机化合物及其 NMR 化学位移的 Web 数据库 NMRShiftDB,或 SENECA,一种计算机辅助结构解析程序。
虽然允许快速组装诸如 SENECA 或 NMRShiftDB 之类的大型整体应用程序,但 CDK 的真正优势在于其作为化学信息学家工作台的能力。只需编写几行代码,就可以快速测试新想法或修改现有的基于 CDK 的应用程序,使其适合其他需求。