轻量级的SMILES读取器和写入器
项目描述
pysmiles:轻量级的纯Python SMILES读取器和写入器
这是我开始的一个小型项目,因为我找不到任何易于安装(即:仅Python)的SMILES读取器或写入器。目前,写入器非常基础,尽管它应该产生有效的SMILES,但它们可能不美观,也可以参见问题#17。读取器状态更好,应该可以使用。
SMILES字符串假设符合OpenSmiles标准。
分子
分子表示为Networkx图。原子是图的节点,键是边。节点可以有以下属性
- element: str. 描述原子的元素。默认为'*'表示未知。
- aromatic: bool. 原子是否是(反)芳香系统的部分。默认为False。
- isotope: float. 原子的质量。默认为未知。
- hcount: int. 与此原子连接的隐式氢的数量。默认为0。
- charge: int. 该原子的电荷。默认为0。
- class: int. 该原子的"类别"。默认为0。
边有以下属性
- order: Number. 键的顺序。1.5用于芳香键。默认为1。
当前无法指定立体化学信息,读取时会将其丢弃。在未来某处,这些信息可能会存储在节点的 "stereo" 属性中。
读取SMILES
可以使用 read_smiles(smiles, explicit_hydrogen=False, zero_order_bonds=True, reinterpret_aromatic=True)
函数来解析SMILES字符串。不应使用该函数来验证字符串是否为有效的SMILES字符串 —— 该函数对SMILES字符串是否具有化学意义进行的验证很少。创建的分子中的边将始终具有 'order' 属性。节点将具有它们所指定的相关属性。对于元素未知的原子 (*) 将不会具有元素属性。
explicit_hydrogen
决定了氢原子是否应作为创建的分子中的显式节点表示,或隐式地在 'hcount' 属性中表示。zero_order_bonds
决定了SMILES字符串中的零阶键 (.) 是否应在产生的分子中产生边。reinterpret_aromatic
决定了是否应重新解释芳香性,并从构造的分子中确定,还是应将SMILES字符串中的芳香性规范(小写元素)作为首选。如果True
,还将将不是芳香环一部分且具有1.5阶的键的键阶设置为1。如果False
,将仅使用SMILES字符串中的信息创建分子。
立体化学信息
当前库无法处理立体化学信息,无论是E/Z还是R/S。SMILES字符串中的任何立体化学信息在解析时都会被 丢弃。这意味着解析 例如 N[C@](Br)(O)C
、N[C@@](Br)(O)C
和 NC(Br)(O)C
将没有区别。解析这些 将产生相同的分子。同样,对于 例如 F/C=C/F
和 FC=CF
,它们将产生相同的分子。
在丢弃立体化学信息时,将使用内置的 logging
模块记录警告。如果您想禁用 pysmiles
记录的所有消息,可以将以下片段添加到您的代码中,而不会干扰您自己的代码中的任何日志记录
import logging
logging.getLogger('pysmiles').setLevel(logging.CRITICAL) # Anything higher than warning
写入SMILES
可以使用 write_smiles(molecule, default_element='*', start=None)
函数从分子写入SMILES字符串。函数 不会 检查您的分子是否具有化学意义。相反,它将写入您提供的分子的SMILES表示,其他什么也不做。
default_element
是用于没有 'element' 属性的节点的元素。start
是深度优先遍历应开始的节点的键。如果没有指定,将执行一些巧妙的操作。
其他函数
除了这两个核心函数之外,还公开了四个其他函数,这些函数可以在最少的工作量下帮助创建具有化学相关性的分子。
fill_valence(mol, respect_hcount=True, respect_bond_order=True, max_bond_order=3)
此函数将通过增加 'hcount' 和(如果指定)键阶来填充您分子中所有原子的价。请注意,它不使用 'charge' 属性来查找正确的价。respect_hcount
: bool。是否可以覆盖现有的 hcounts。respect_bond_order
: bool。是否可以更改键阶。max_bond_order
: int。将设置的键阶的最大值。
add_explicit_hydrogens(mol)
此函数将隐式氢原子(由 'hcount' 属性指定)转换为显式节点。remove_explicit_hydrogens(mol)
此函数是add_explicit_hydrogens
的逆操作:它将删除显式氢节点并将它们添加到相关的 'hcount' 属性中。correct_aromatic_rings(mol)
该函数标记分子中所有的(反)芳香族原子,并将(反)芳香族原子之间的所有键设置为1.5级。在尝试确定哪些原子是芳香族之前,它会填充所有原子的价电子(也见fill_valence
)。它通过首先找到所有环中的原子来工作。然后,对于每个环中的每个原子,检查这些原子是否为sp2杂化(注意这是一个模糊的概念。严格来说,我们检查它们的元素是否可能是芳香族,以及它们是否有2或3个键)。最后,计算每个环中的电子数,如果这是偶数,则该环中的原子被认为是芳香族。该函数在整个库中是最脆弱的,我预计在某些情况下它会产生错误答案。特别是对于稠合(芳香族)环系(如吲哚)和带有环外杂原子的环(如O=C1C=CC=C1)。购买者请注意。
示例
读取
from pysmiles import read_smiles
smiles = 'C1CC[13CH2]CC1C1CCCCC1'
mol = read_smiles(smiles)
print(mol.nodes(data='element'))
# [(0, 'C'),
# (1, 'C'),
# (2, 'C'),
# (3, 'C'),
# (4, 'C'),
# (5, 'C'),
# (6, 'C'),
# (7, 'C'),
# (8, 'C'),
# (9, 'C'),
# (10, 'C'),
# (11, 'C')]
print(mol.nodes(data='hcount'))
# [(0, 2),
# (1, 2),
# (2, 2),
# (3, 2),
# (4, 2),
# (5, 1),
# (6, 1),
# (7, 2),
# (8, 2),
# (9, 2),
# (10, 2),
# (11, 2)]
mol_with_H = read_smiles(smiles, explicit_hydrogen=True)
print(mol_with_H.nodes(data='element'))
# [(0, 'C'),
# (1, 'C'),
# (2, 'C'),
# (3, 'C'),
# (4, 'C'),
# (5, 'C'),
# (6, 'C'),
# (7, 'C'),
# (8, 'C'),
# (9, 'C'),
# (10, 'C'),
# (11, 'C'),
# (12, 'H'),
# (13, 'H'),
# (14, 'H'),
# (15, 'H'),
# (16, 'H'),
# (17, 'H'),
# (18, 'H'),
# (19, 'H'),
# (20, 'H'),
# (21, 'H'),
# (22, 'H'),
# (23, 'H'),
# (24, 'H'),
# (25, 'H'),
# (26, 'H'),
# (27, 'H'),
# (28, 'H'),
# (29, 'H'),
# (30, 'H'),
# (31, 'H'),
# (32, 'H'),
# (33, 'H')]
写入
import networkx as nx
from pysmiles import write_smiles, fill_valence
mol = nx.Graph()
mol.add_edges_from([(0, 1), (1, 2), (1, 3), (3, 4), (1, 5), (3, 6)])
for idx, ele in enumerate('CCCCOCO'):
mol.nodes[idx]['element'] = ele
mol.nodes[4]['charge'] = -1
mol.nodes[4]['hcount'] = 0
mol.edges[3, 6]['order'] = 2
print(write_smiles(mol))
# [O-]C(=O)C([C])([C])[C]
fill_valence(mol, respect_hcount=True)
print(write_smiles(mol))
# [O-]C(=O)C(C)(C)C
限制
- 编写器生成非推荐SMILES字符串(根据OpenSmiles)。
- 编写器更像是一个“序列化器”:如果提供的图没有化学意义,生成的“SMILES”字符串将精确地表示该图。因此,SMILES字符串将是无效的。
fill_valence
不使用'电荷'来查找正确的价电子。correct_aromatic_rings
是脆弱的。- 目前无法指定立体化学信息。解析器可以处理它,但它将被丢弃。
- 它只处理SMILES。这可能会后来扩展到例如InChi、SLN、SMARTS等。
要求
类似项目
有更多处理SMILES的Python项目,我尽量在这里列出其中的一些。如果您的项目缺失,请随时提交PR。
- PySMILE:一个同名项目,能够编码/解码SMILE格式对象。不处理SMILES。
- RDKit:一组化学信息和机器学习软件,能够读取和写入SMILES、InChi以及其他格式。
- OpenEye Chem toolkit:OpenEye化学工具包是化学和化学信息学的编程库。它能够处理(规范的)SMILES和InChi。
许可证
PySmiles使用Apache 2.0许可证分发。版权所有2018 Peter C Kroon
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://apache.ac.cn/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
项目详情
下载文件
下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。