计算化学公社

 找回密码 Forget password
 注册 Register
Views: 964|回复 Reply: 6
打印 Print 上一主题 Last thread 下一主题 Next thread

[程序/脚本开发] 一个输入SMILES获取分子pdb文件的小工具

[复制链接 Copy URL]

21

帖子

1

威望

90

eV
积分
131

Level 2 能力者

本帖最后由 TerminSong 于 2025-3-5 15:35 编辑

萌新报道,本身是个毫无技术含量的工具,要说哪里困难可能也就是研究怎么把RDKit静态连接到MFC程序里花了我一天(笑

初学lammps开发,去年完成了一个不大不小的后处理项目,现在正在找未来的科研课题,欢迎讨论与合作 输入smiles生成分子文件.zip (1.61 MB, 下载次数 Times of downloads: 54)

SMILES2PdbSvgFile.zip (847.45 KB, 下载次数 Times of downloads: 44)




评分 Rate

参与人数
Participants 2
eV +8 收起 理由
Reason
Voidmio + 5 好物!
Serious + 3 赞!

查看全部评分 View all ratings

171

帖子

0

威望

1859

eV
积分
2030

Level 5 (御坂)

2#
发表于 Post on 2025-3-4 17:17:41 | 只看该作者 Only view this author

214

帖子

5

威望

2205

eV
积分
2519

Level 5 (御坂)

3#
发表于 Post on 2025-3-5 10:34:18 | 只看该作者 Only view this author
你这个编译好的缺少boost的动态库,别人一般用不了。

21

帖子

1

威望

90

eV
积分
131

Level 2 能力者

4#
 楼主 Author| 发表于 Post on 2025-3-5 15:36:24 | 只看该作者 Only view this author
liuyuje714 发表于 2025-3-5 10:34
你这个编译好的缺少boost的动态库,别人一般用不了。

我去 ,还真是,打包的时候把freetype放进去了忘了吧boost的库放进去,手滑多点了一下
已经更新了打包,把boost的dll依赖加进去了

419

帖子

5

威望

1674

eV
积分
2193

Level 5 (御坂)

鸩羽

5#
发表于 Post on 2025-3-5 15:44:10 | 只看该作者 Only view this author
静态链接怎么搞啊XD 我想把我写的一个python脚本转成C++的 结果卡在openbabel库上 是要先手动编译一遍对应库吗
某不知名实验组从苞米地里长出来的计算选手

21

帖子

1

威望

90

eV
积分
131

Level 2 能力者

6#
 楼主 Author| 发表于 Post on 2025-3-5 16:26:14 | 只看该作者 Only view this author
wal 发表于 2025-3-5 15:44
静态链接怎么搞啊XD 我想把我写的一个python脚本转成C++的 结果卡在openbabel库上 是要先手动编译一遍对应 ...

我是从头自己按需编译了RDkit,编译出来的静态库再丢给连接器,但是boost我用的导入库是官方发布的二进制windows版本,windows下的话你找找openbable(我没用过这个)目录下面有没有lib之类的文件夹,进去看看有没有.lib文件,一股脑都丢给连接器让它自己挑就可以了。

465

帖子

1

威望

2318

eV
积分
2803

Level 5 (御坂)

7#
发表于 Post on 2025-4-1 10:36:14 | 只看该作者 Only view this author
我以前用过RDKit中的ETKDGv3功能( https://www.rdkit.org/docs/source/rdkit.Chem.rdDistGeom.html )。这是当时写的从SMILES字符串生成xyz文件的代码,博君一笑。ETKDGv3是自RDKit 2020.03版本引入的。自RDKit 2024.03开始,ETKDGv3成为RDKit中生成构象的默认功能。

  1. '''
  2. This script generates xyz files from a SMILES string. This script requires
  3. RDKit which should be at least version 2020.03. Cite the following paper
  4. if you use this script in any published work.
  5. S. Wang, J. Witek, G. A. Landrum, S. Riniker, J. Chem. Inf. Model. 2020, 60(4), 2044–2058

  6. Generate one conformer for a molecule with the following command:
  7.   python smiles2xyz.py -s "CC(CC1=CC=CC=C1)[N+]2=NOC(=C2)/N=C(/NC3=CC=CC=C3)\[O-]" -c mesocarb
  8. Generate ten conformers for a molecule with the following command:
  9.   python smiles2xyz.py -s "CC(CC1=CC=CC=C1)[N+]2=NOC(=C2)/N=C(/NC3=CC=CC=C3)\[O-]" -c mesocarb -n 10
  10. '''

  11. import sys
  12. import argparse
  13. from rdkit import Chem
  14. from rdkit.Chem import AllChem

  15. def write_xyz_file(fragment, fragment_name):
  16.     number_of_atoms = fragment.GetNumAtoms()
  17.     symbols = [a.GetSymbol() for a in fragment.GetAtoms()]
  18.     fNames = []
  19.     for i,conf in enumerate(fragment.GetConformers()):
  20.         file_name = fragment_name+"_"+str(i)+".xyz"
  21.         fNames.append(file_name)
  22.         with open(file_name, "w") as file:
  23.             file.write(str(number_of_atoms)+"\n")
  24.             file.write("\n")
  25.             for atom,symbol in enumerate(symbols):
  26.                 p = conf.GetAtomPosition(atom)
  27.                 line = " ".join((symbol,str(p.x),str(p.y),str(p.z),"\n"))
  28.                 file.write(line)
  29.     return fNames

  30. parser = argparse.ArgumentParser(usage=__doc__)
  31. parser.add_argument('--string', '-s', required=True, type=str, help='SMILES string')
  32. parser.add_argument('--compound', '-c', required=True, type=str, help='Compound name, which will be used as the prefix for xyz file')
  33. parser.add_argument('--number', '-n', default=argparse.SUPPRESS, type=int, help='Number of conformers for a compound')
  34. args = parser.parse_args()

  35. mol = Chem.MolFromSmiles(args.string)
  36. mol_h = Chem.AddHs(mol)

  37. params = Chem.rdDistGeom.srETKDGv3()
  38. params.randomSeed = 0xf00d
  39. params.clearConfs = True
  40. if 'number' in args:
  41.     if args.number > 0:
  42.         number_of_conformers = args.number
  43.     else:
  44.         print("The argument for number of conformers in the input cannot be used.")
  45.         sys.exit(1)
  46. else:
  47.     number_of_conformers = 1
  48. cids = AllChem.EmbedMultipleConfs(mol_h, number_of_conformers, params)
  49. fn = write_xyz_file(mol_h, args.compound)
复制代码


评分 Rate

参与人数
Participants 1
eV +4 收起 理由
Reason
TerminSong + 4 谢谢分享

查看全部评分 View all ratings

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2025-8-16 23:25 , Processed in 0.167709 second(s), 25 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list