请选择 进入手机版 | 继续访问电脑版

计算化学公社

 找回密码
 现在注册!
查看: 255|回复: 2

[综合交流] 用python实现SMILES字符串的输出

[复制链接]

2442

帖子

10

威望

4812

eV
积分
7454

Level 6 (一方通行)

首席卖萌官

发表于 2019-8-26 10:54:13 | 显示全部楼层 |阅读模式
基于OpenBabel批量产生特定基团以任意方式接到苯上的结构的方法这篇文章提出了一种用Fortran语言程序输出SMILES字符串的方法。对此:

python表示不服~~~(没啥不服的,就是python需要的代码少,可读性比较强)

于是花了一个小时的时间写了两个python程序,可以输出全部的和随机20个特定基团以任意方式接到苯上的结构。代码如下:

smile_all.py (282 Bytes, 下载次数: 24)

评分

参与人数 4eV +18 收起 理由
ggdh + 5 赞!
sobereva + 5
yjmaxpayne + 3 好物!
少年爱吃地三鲜 + 5 你太可爱

查看全部评分

She doesn't love me.
Even so,
my heart has been taken away by her.

126

帖子

0

威望

1421

eV
积分
1547

Level 5 (御坂)

发表于 2019-8-26 15:59:10 | 显示全部楼层
挺好用,修改之后还可以设置任意位置的随机取代, 只需要指定好({})所在位置即可。 娃娃还可以考虑结合RDKit来看看, 可以一次性把结构都画出来。

64

帖子

0

威望

1452

eV
积分
1516

Level 5 (御坂)

发表于 2019-8-26 18:19:06 | 显示全部楼层
既然用了 python,那干脆直接调内置库得了
当然,这么做主要还是对 py 的多重 for 循环没好感
  1. from itertools import product
  2. from random import choice

  3. lists = ["C","","C#N","F","Cl","Br","I","O"]
  4. tmp = 'c1({})c({})c({})c({})c({})c1({})'

  5. def ren_tmp(i):
  6.     return tmp.format(*i)

  7. def smiles_all(n_sites=6):
  8.     a = product(lists,repeat=n_sites)
  9.     return map(ren_tmp, a)

  10. def smile_random(n_sites=6):
  11.     i = [choice(lists) for _ in range(n_sites)]
  12.     return ren_tmp(i)

  13. def save_all(filename='subben.smi', n_sites=6):
  14.     with open(filename, 'w') as f:
  15.         for i in smiles_all(n_sites):
  16.             print(i, file=f)

  17. def save_random(filename='subben_random.smi', n=20, n_sites=6):
  18.     with open(filename, 'w') as f:
  19.         for _ in range(n):
  20.             print(smile_random(n_sites), file=f)
复制代码
您需要登录后才可以回帖 登录 | 现在注册!

本版积分规则

手机版|北京科音自然科学研究中心|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949-1号 )

GMT+8, 2019-9-22 08:23 , Processed in 0.152666 second(s), 27 queries .

快速回复 返回顶部 返回列表