分子拆解文件(Molecular Split Definition file,后缀名为.mdef)是MoleSplit.dll程序集专用的数据文件,其内容采用了一套通用的基团拆分语法编写而成,该语法定义了基团贡献法对分子的拆解规则。 该文件为文本文件,其内容由声明标签与定义信息构成,声明标签用于声明启用某种解析方法,在标签的两端需要加上#号;而定义信息根据具体的基团贡献法编写,为分子拆分方法提供了必要的规则信息。其中预定义的解析方法共有5种,对应的声明标签为:#Radical#、#Atom#、#Ring#、#Bond#、#Element#,这5种方法涵盖了大部分基团贡献法的基础拆解原理。
分子拆解文件的内容由一个或多个“拆解信息定义块”组成,每个“拆解信息定义块”由开头的声明标签和方法所需的具体定义信息构成。信息块之间及声明标签与定义信息之间必须空一行。单个信息块的结构示意如下:
#Declaration Label#
……
Definition information
……
原子编码准确描述了单个原子的元素种类及连接环境(原子轨道杂化类型)的信息,其编写规则作如下约定:
Radical是所有解析标签中最强大的一个,以基团-CON(CH3)2为例,如图5-3所示,图中灰色框中的内容为该基团在定义未见中的定义编码,其由三部分组成:基团签名、原子编码列表和基团邻接矩阵;图片描述了从基团结构图转化为定义编码的过程。
基团签名可以包含的信息有:基团名称、辅助定位原子索引列表和三种标记:部分屏蔽、属性标记、编码重写标记。其书写位置位于整个基团定义编码的第一行。
功能描述 | 语法规则 |
---|---|
完全屏蔽匹配 | RadicalName |
部分屏蔽匹配 | *RadicalName=(AtomIndex1,AtomIndex2,...) |
属性标记 | _AttributeTag_=(AtomIndex1,AtomIndex2,...) |
原子编码重命名 | NewAtomCode=(AtomIndex1,AtomIndex2,...) |
- 完全屏蔽匹配:只写基团名称时,语法默认采用完全屏蔽的方式对该基团进行匹配,即在完成匹配后注销所有参与匹配的原子(后续匹配中将无法再次使用这些原子);
- 部分屏蔽匹配:辅助定位原子索引列表中原子将不会被注销,可以在后续匹配中继续使用;
- 属性标记:原子索引列表中的原子将被打上标记,不会影响原有的原子编码,且不会有数据输出,属于匹配预处理过程,打上标记的原子将在后续识别中提供原子环境信息;
- 原子编码重命名:原子索引列表中的原子编码将被替换为新的编码,也属于匹配预处理过程,不会有数据输出,为后续识别提供原子环境等信息。
原子编码列表中的AtomCode是一种稍作改良的正则表达式,注意其与原子编码的不同:原子编码是用于描述单个原子的元素种类及连接环境(原子轨道杂化类型)的,而此处的AtomCode则是用于匹配原子编码,只要是符合正则表达式的原子编码类型,均会通过匹配。因此,原子编码列表中的AtomCode具有通配性,而之前提到的原子编码则具有唯一性。
功能描述 | 语法规则 |
---|---|
普通匹配 | AtomCode |
属性匹配 | AtomCode_AttributeTag1_AttributeTag2… |
限制属性匹配 | AtomCode$ / AtomCode_AttributeTag1$ |
- 普通匹配:完全符合正则表达式的语法规则,将需要匹配的一种或一类原子编码表述为正则表达式即可,该匹配状态下将无视原子的属性;
- 属性匹配:在原有原子编码的基础上,以下划线连接属性名称,属性名称来源于之前的属性标记中的名称,注意:一定要在完成某一属性标记之后才可使用该属性名称,否则将无法匹配;
- 限制属性匹配:在之前的原子编码基础在,若需要限制原子的属性,比如不希望匹配到的原子带有任何属性,或期待原子只含有某一种属性,可在原有编码的末尾添加$符号。
基团的邻接矩阵,顾名思义,就是按原子编码列表中的原子顺序书写的邻接矩阵,其中的数字含义如下:
- x = 0 :表示横纵索引所对应的两个原子不相连;
- 0<x<5 :表示横纵索引所对应的两个原子以 键相连(单键、双键……);
- x >= 5 :表示横纵索引所对应的两个原子以任意化学键相连都将符合要求。 由于基团或分子所构成的图是无向图,所以其邻接矩阵必为对称阵,且对角线原子必为0,所以在实际应用中可以省略包括对角线在内的一半。(在本软件中,程序只会读取邻接矩阵的下半部分,所以用户书写完整版的矩阵也不会报错。)
Ring解析器提供了有关环结构的统计和属性标记功能。有必要说明的是:对于桥环类化合物,其拓扑结构中的不同环存在共用节点,这类情况下,在不同应用领域的定义中,环的数量是不相同的。为了防止造成对单个环上原子数目与环的数量出现歧义,本解析器对环的解析依据如下:
- 环的数量依据:
Ring_Number = (N - S +1)
式中N
为原子个数(节点数);S
为化学键数(边数) - 环的大小(即组成一个环的节点个数)依据:使所有环的共用节点数最少。
本解析器的声明标签为:#Ring#,并提供3类功能,分别为:输出统计、标记环上原子和标记环上化学键。
将多元环的统计结果添加进MoleSplitter实例中的DefinedFragment属性里,与其余碎片一并输出。
功能描述 | 语法规则 |
---|---|
输出多元环的统计结果 | PRINT=(RING) |
输出多元碳环的统计结果 | PRINT=(C_RING) |
输出饱和多元碳环的统计结果 | PRINT=(SAT_C_RING) |
将符合定义的环原子贴上相应的自定义标签,为后续带有属性判断的解析器提供识别依据。
功能描述 | 语法规则 |
---|---|
标记环原子 | _CUSTOM LABEL_=(RING) |
标记碳环原子 | _CUSTOM LABEL_=(C_RING) |
标记饱和碳环原子 | _CUSTOM LABEL_=(SAT_C_RING) |
标记符合定义的环上的化学键,为Bond识别器提供环属性判断依据。
功能描述 | 语法规则 |
---|---|
标记环上的键 | SIGN=(RING_BOND) |
标记碳环上的键 | SIGN=(C_RING_BOND) |
标记饱和碳环上的键 | SIGN=(SAT_C_RING_BOND) |
Bond解析器用于统计分子中指定类型的化学键,可指定的化学键特征包括:
- 化学键两端的元素类型;
- 化学键键数;
- 化学键是否属于环的一部分。
Atom解析器用于统计分子中指定原子编码的单原子或含氢基团,支持原型原子与带属性原子的识别,其语法格式与#Radical#中的语法类似,由于单原子或含氢基团不存在连接关系,故不需要邻接矩阵;此外,Atom识别中的原子编码不支持正则表达式。 在使用上,完全可以用Radical解析器所提供的功能代替Atom解析;但在代码实现上,Atom的原子统计是基于哈希表的,故其具有更低的时间复杂度,在批处理时可以体现出时间上的优势。
Element解析器用于统计分子中指定种类的元素,需要注意的是Atom解析与Element解析的区别:Atom解析用于识别单原子或含氢基团,其采用原子编码进行匹配,比对信息包括了元素及其连接环境的信息;Element解析仅用于识别元素,不含其连接环境的信息。与Atom相同的是,Element的元素统计也是基于哈希表的,该解析器不支持属性的识别。