技术背景

SMILES表达式是化学里面常用的用于标定元素之间关系的字符串,旨在用最简短的语句来完整的表达一个分子体系内所蕴含的基本信息,比如元素、连接性以及连接属性等。由于SMILES表达式的定义种类太多,需要完整介绍的可以阅读这篇博客或者是opensmiles的官方网站。这里我们简单介绍几种常见的情况:

  1. 在SMILES表达式中,往往会去掉\(H\)元素,比如甲烷\(CH_4\)用SMILES表达式来表达的话就是\(C\);
  2. 双键用\(=\)来表示,比如\(C(=O)=O\)表示一个二氧化碳;
  3. 三键用\(#\)来表示,用法与双键一样;
  4. 主干线不加标记,分支加圆括号,比如上面提到的二氧化碳,第一个\(O\)原子不在主分支上,因此加了括号;
  5. 不成键的分子之间用.隔开,比如\(O.C(=O)=O\)表示一个水分子和一个二氧化碳分子;
  6. 成环的要打开来写,并在开头和结尾加上断键标记,比如\(C1CCCCC1\)表示一个环己烷\(C_6H_{12}\),这里的两个1前所对应的碳是相互连接的。

    诸如此类的复杂的化学表达式解析,最好是能够有一个方便使用的工具来进行转化,这里介绍的是其中一款:pysmiles。

pysmiles的安装

pysmiles是一个纯粹用python写的sdk,其中借用了networkx的框架来存储元素之间的键连信息。那么我们可以直接使用pip来进行安装和管理:

dechin@ubuntu2004:~/projects/gitlab/dechin/src/smile$ python3 -m pip install pysmiles
Collecting pysmiles
Downloading pysmiles-1.0.1.tar.gz (34 kB)
Collecting pbr
Using cached pbr-5.6.0-py2.py3-none-any.whl (111 kB)
Requirement already satisfied: networkx~=2.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from pysmiles) (2.5)
Requirement already satisfied: decorator>=4.3.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from networkx~=2.0->pysmiles) (4.4.2)
Building wheels for collected packages: pysmiles
Building wheel for pysmiles (setup.py) ... done
Created wheel for pysmiles: filename=pysmiles-1.0.1-py2.py3-none-any.whl size=22016 sha256=9c9bf6bf2f1667bfdb0d9a3c96f6d4499b7749b0ba4fc63ff45512c9dd1af8db
Stored in directory: /home/dechin/.cache/pip/wheels/1b/ae/65/19c5062b483dbf3a22b8a42e32dfe1bdfc17f3d31b475e0d2f
Successfully built pysmiles
Installing collected packages: pbr, pysmiles
Successfully installed pbr-5.6.0 pysmiles-1.0.1

因为并没有什么特殊的依赖关系,所以安装还是比较顺利的。

pysmiles的使用

这里我们通过一个简单的案例来展示一下pysmiles的使用方法(其中关于networkx的使用,可以参考这一篇博客):

from pysmiles import read_smiles
import networkx as nx
import matplotlib.pyplot as plt smiles = 'N#CC#N' # 给定的SMILES表达式
mol = read_smiles(smiles) # 读取到一个networkx的网络结构中
print(mol.nodes) # 打印节点信息
print(mol.edges) # 打印边信息
print(nx.to_numpy_matrix(mol)) # 打印邻接矩阵信息 elements = nx.get_node_attributes(mol, name = "element")
nx.draw(mol, with_labels=True, labels=elements)
plt.savefig('pysmiles.png') # 保存图层

上述是一个简单的SMILES表达式读取的程序,执行的结果如下所示:

dechin@ubuntu2004:~/projects/gitlab/dechin/src/smile$ python3 pysmiles_test.py
[0, 1, 2, 3]
[(0, 1), (1, 2), (2, 3)]
[[0. 1. 0. 0.]
[1. 0. 1. 0.]
[0. 1. 0. 1.]
[0. 0. 1. 0.]]

同时会在当前目录下生成一个利用networkx画出来的简单图片:



当然,这个结构有点过于的简单,如果对于分子模型的展示稍微有点追求的话,可以参考这篇文章所介绍的vmd的使用方法。由于这里我们只是倾向于使用pysmiles的阅读功能,如果要使用pysmiles的写入功能,可以参考如下官方案例,这里不做过多的展开:

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

其实本质上也是通过构建一个networkx的数据结构,再通过这个数据结构去产生一个smiles的字符串。

总结概要

本文介绍了一款基于python语言的SMILES化学表达式的读写SDK,使用openSMILES表达式所定义的分子结构是非常精简的,但是其中的规则又非常的多,因此使用一款友好的SMILES表达式能够大大的缩减解析的成本。并且pysmiles结合了一款非常常用的python的拓扑网络结构表示SDK——networkx,使得对SMILES表达式的结果分析更加的人性化。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/pysmiles.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

pysmiles:一个用于读写SMILES表达式的python库的更多相关文章

  1. 3 个用于数据科学的顶级 Python 库

    使用这些库把 Python 变成一个科学数据分析和建模工具. Python 的许多特性,比如开发效率.代码可读性.速度等使之成为了数据科学爱好者的首选编程语言.对于想要升级应用程序功能的数据科学家和机 ...

  2. 8 个用于业余项目的优秀 Python 库

    在 Python/Django 的世界里有这样一个谚语:为语言而来,为社区而留.对绝大多数人来说的确是这样的,但是,还有一件事情使得我们一直停留在 Python 的世界里,不愿离开,那就是我们可以很容 ...

  3. 一个用于实现并行执行的 Java actor 库

    即使 Java 6 和 Java 7 中引入并发性更新,Java 语言仍然无法让并行编程变得特别容易.Java 线程.synchronized 代码块.wait/notify 和java.util.c ...

  4. 一个随机切换user_agent的第三方python库:my_fake_useragent

    因为my_fake_useragent 是第三方,所以需要自己进行安装. 不用担心,它没有任何依赖或者附加环境,只安装它自己就行. 方法1: pycharm传统安装方式. 方法2: pip insta ...

  5. Python 库大全

    作者:Lingfeng Ai链接:http://www.zhihu.com/question/24590883/answer/92420471来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...

  6. 哪些 Python 库让你相见恨晚?【转】

    原文链接:https://www.zhihu.com/question/24590883/answer/92420471 原文链接:Python 资源大全 ---------------- 这又是一个 ...

  7. Python库,让你相见恨晚的第三方库

    环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具.pyenv – 简单的 Python 版本管理工具.Vex – 可以在虚拟环境中执行命令.virt ...

  8. Python资源 --Python库

    环境管理 管理 Python 版本和环境的工具 pyenv – 简单的 Python 版本管理工具. Vex – 可以在虚拟环境中执行命令. virtualenv – 创建独立 Python 环境的工 ...

  9. python 库资源大全

    偶然的机会翻到这篇文章,很全面,来源:  Python 资源大全中文版       哪些 Python 库让你相见恨晚? 环境管理 管理 Python 版本和环境的工具 p:非常简单的交互式 pyth ...

随机推荐

  1. Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?

    Redis是目前广为人知的一个内存数据库,在各个场景中都有着非常丰富的应用,前段时间Redis推出了6.0的版本,在新版本中采用了多线程模型. 因为我们公司使用的内存数据库是自研的,按理说我对Redi ...

  2. P1115_最大子段和(JAVA语言)

    思路:贪心.累加求和,若和小于0则设置和为0,因为和小于0时对这段序列和无正作用,只会使整体变小,所以我们把小于0的段舍弃,从下一个数开始求序列和. 题目描述 给出一段序列,选出其中连续且非空的一段使 ...

  3. P1200_你的飞碟在这儿(JAVA语言)

    题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者. 不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带 ...

  4. switch case语句,switch case用法详解

    switch 是"开关"的意思,它也是一种"选择"语句,但它的用法非常简单.switch 是多分支选择语句.说得通俗点,多分支就是多个 if. 从功能上说,sw ...

  5. Spring源码之ApplicationContext

    ​ 本文是针对Srping的ClassPathXMLApplicationContext来进行源码解析,在本篇博客中将不会讲述spring Xml解析注册代码,因为ApplicationContext ...

  6. 【JVM进阶之路】七:垃圾收集器盘点

    在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法.接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的 ...

  7. C++并发与多线程学习笔记--线程之间调度

    condition_variable wait() notify_one notify_all condition_variable 条件变量的实际用途: 比如有两个线程A和B,在线程A中等待一个条件 ...

  8. Spring Boot 2.x 快速集成Kafka

    1 Kafka Kafka是一个开源分布式的流处理平台,一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据.Kafka由Scala和Java编写,2012年成为Apache ...

  9. Linux下安装Anaconda 并进行用户共享

    下载镜像 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ Anaconda3-5.3.1-Linux-x86_64.sh 安装 ...

  10. Django模板引擎

    Django作为Web框架,需要一种很便利的方法动态地生成 HTML 网页,因此有了模板这个概念.模板包含所需 HTML 的部分代码以及一些特殊语法,特殊语法用于描述如何将视图传递的数据动态插入HTM ...