Skip to content

Latest commit

 

History

History
119 lines (86 loc) · 8.21 KB

Syntax Specification.md

File metadata and controls

119 lines (86 loc) · 8.21 KB

MSD文件语法规则说明

分子拆解文件(Molecular Split Definition file,后缀名为.mdef)是MoleSplit.dll程序集专用的数据文件,其内容采用了一套通用的基团拆分语法编写而成,该语法定义了基团贡献法对分子的拆解规则。 该文件为文本文件,其内容由声明标签与定义信息构成,声明标签用于声明启用某种解析方法,在标签的两端需要加上#号;而定义信息根据具体的基团贡献法编写,为分子拆分方法提供了必要的规则信息。其中预定义的解析方法共有5种,对应的声明标签为:#Radical#、#Atom#、#Ring#、#Bond#、#Element#,这5种方法涵盖了大部分基团贡献法的基础拆解原理。

1.文件结构

分子拆解文件的内容由一个或多个“拆解信息定义块”组成,每个“拆解信息定义块”由开头的声明标签和方法所需的具体定义信息构成。信息块之间及声明标签与定义信息之间必须空一行。单个信息块的结构示意如下:

#Declaration Label#

……
Definition information
……

2.原子编码

原子编码准确描述了单个原子的元素种类及连接环境(原子轨道杂化类型)的信息,其编写规则作如下约定:

  • 不计分子中的H原子;
  • 编码结构为:元素符号 + 化学键列表(1 – 单键、2 – 双键……以此类推);
  • 化学键列表中的化学键按键数从大到小的顺序排列。

3.解析器

3.1Radical解析功能

Radical是所有解析标签中最强大的一个,以基团-CON(CH3)2为例,如图5-3所示,图中灰色框中的内容为该基团在定义未见中的定义编码,其由三部分组成:基团签名、原子编码列表和基团邻接矩阵;图片描述了从基团结构图转化为定义编码的过程。

3.1.1基团签名

基团签名可以包含的信息有:基团名称、辅助定位原子索引列表和三种标记:部分屏蔽、属性标记、编码重写标记。其书写位置位于整个基团定义编码的第一行。

功能描述 语法规则
完全屏蔽匹配 RadicalName
部分屏蔽匹配 *RadicalName=(AtomIndex1,AtomIndex2,...)
属性标记 _AttributeTag_=(AtomIndex1,AtomIndex2,...)
原子编码重命名 NewAtomCode=(AtomIndex1,AtomIndex2,...)
  • 完全屏蔽匹配:只写基团名称时,语法默认采用完全屏蔽的方式对该基团进行匹配,即在完成匹配后注销所有参与匹配的原子(后续匹配中将无法再次使用这些原子);
  • 部分屏蔽匹配:辅助定位原子索引列表中原子将不会被注销,可以在后续匹配中继续使用;
  • 属性标记:原子索引列表中的原子将被打上标记,不会影响原有的原子编码,且不会有数据输出,属于匹配预处理过程,打上标记的原子将在后续识别中提供原子环境信息;
  • 原子编码重命名:原子索引列表中的原子编码将被替换为新的编码,也属于匹配预处理过程,不会有数据输出,为后续识别提供原子环境等信息。

3.1.2原子编码列表

原子编码列表中的AtomCode是一种稍作改良的正则表达式,注意其与原子编码的不同:原子编码是用于描述单个原子的元素种类及连接环境(原子轨道杂化类型)的,而此处的AtomCode则是用于匹配原子编码,只要是符合正则表达式的原子编码类型,均会通过匹配。因此,原子编码列表中的AtomCode具有通配性,而之前提到的原子编码则具有唯一性。

功能描述 语法规则
普通匹配 AtomCode
属性匹配 AtomCode_AttributeTag1_AttributeTag2…
限制属性匹配 AtomCode$ / AtomCode_AttributeTag1$
  • 普通匹配:完全符合正则表达式的语法规则,将需要匹配的一种或一类原子编码表述为正则表达式即可,该匹配状态下将无视原子的属性;
  • 属性匹配:在原有原子编码的基础上,以下划线连接属性名称,属性名称来源于之前的属性标记中的名称,注意:一定要在完成某一属性标记之后才可使用该属性名称,否则将无法匹配;
  • 限制属性匹配:在之前的原子编码基础在,若需要限制原子的属性,比如不希望匹配到的原子带有任何属性,或期待原子只含有某一种属性,可在原有编码的末尾添加$符号。

3.1.3基团邻接矩阵

基团的邻接矩阵,顾名思义,就是按原子编码列表中的原子顺序书写的邻接矩阵,其中的数字含义如下:

  • x = 0 :表示横纵索引所对应的两个原子不相连;
  • 0<x<5 :表示横纵索引所对应的两个原子以 键相连(单键、双键……);
  • x >= 5 :表示横纵索引所对应的两个原子以任意化学键相连都将符合要求。 由于基团或分子所构成的图是无向图,所以其邻接矩阵必为对称阵,且对角线原子必为0,所以在实际应用中可以省略包括对角线在内的一半。(在本软件中,程序只会读取邻接矩阵的下半部分,所以用户书写完整版的矩阵也不会报错。)

3.2Ring解析功能

Ring解析器提供了有关环结构的统计和属性标记功能。有必要说明的是:对于桥环类化合物,其拓扑结构中的不同环存在共用节点,这类情况下,在不同应用领域的定义中,环的数量是不相同的。为了防止造成对单个环上原子数目与环的数量出现歧义,本解析器对环的解析依据如下:

  • 环的数量依据:Ring_Number = (N - S +1) 式中N为原子个数(节点数);S为化学键数(边数)
  • 环的大小(即组成一个环的节点个数)依据:使所有环的共用节点数最少。

本解析器的声明标签为:#Ring#,并提供3类功能,分别为:输出统计、标记环上原子和标记环上化学键。

3.2.1输出统计

将多元环的统计结果添加进MoleSplitter实例中的DefinedFragment属性里,与其余碎片一并输出。

功能描述 语法规则
输出多元环的统计结果 PRINT=(RING)
输出多元碳环的统计结果 PRINT=(C_RING)
输出饱和多元碳环的统计结果 PRINT=(SAT_C_RING)

3.2.2标记环上原子

将符合定义的环原子贴上相应的自定义标签,为后续带有属性判断的解析器提供识别依据。

功能描述 语法规则
标记环原子 _CUSTOM LABEL_=(RING)
标记碳环原子 _CUSTOM LABEL_=(C_RING)
标记饱和碳环原子 _CUSTOM LABEL_=(SAT_C_RING)

3.2.3标记环上化学键

标记符合定义的环上的化学键,为Bond识别器提供环属性判断依据。

功能描述 语法规则
标记环上的键 SIGN=(RING_BOND)
标记碳环上的键 SIGN=(C_RING_BOND)
标记饱和碳环上的键 SIGN=(SAT_C_RING_BOND)

3.3Bond解析功能

Bond解析器用于统计分子中指定类型的化学键,可指定的化学键特征包括:

  • 化学键两端的元素类型;
  • 化学键键数;
  • 化学键是否属于环的一部分。

3.4Atom解析功能

Atom解析器用于统计分子中指定原子编码的单原子或含氢基团,支持原型原子与带属性原子的识别,其语法格式与#Radical#中的语法类似,由于单原子或含氢基团不存在连接关系,故不需要邻接矩阵;此外,Atom识别中的原子编码支持正则表达式。 在使用上,完全可以用Radical解析器所提供的功能代替Atom解析;但在代码实现上,Atom的原子统计是基于哈希表的,故其具有更低的时间复杂度,在批处理时可以体现出时间上的优势。

3.5Element解析功能

Element解析器用于统计分子中指定种类的元素,需要注意的是Atom解析与Element解析的区别:Atom解析用于识别单原子或含氢基团,其采用原子编码进行匹配,比对信息包括了元素及其连接环境的信息;Element解析仅用于识别元素,不含其连接环境的信息。与Atom相同的是,Element的元素统计也是基于哈希表的,该解析器不支持属性的识别。