计算化学公社

标题: 如何使用rdkit正确产生高斯坐标 [打印本页]

作者
Author:
sjkcn    时间: 2025-5-29 09:28
标题: 如何使用rdkit正确产生高斯坐标
由于我需要在复杂的pandas库中方便多维操作。我的分子对象rdkit mol保存在pandas内,现在我需要让rdkit的mol对象合理的转换成xyz坐标,以及高斯输入文件。如何批量生成呢?
之前尝试用

try:
        # 从SMILES创建分子
        mol = Chem.MolFromSmiles(smiles)
        if mol is None:
            if logger:
                logger.warning(f"无效的SMILES字符串: {smiles}")
            return False

        # 添加氢原子
        mol = Chem.AddHs(mol)

        # 尝试多种方法生成3D构象
        success = False
        method_used = None

        # 方法1: ETKDG
        try:
            result = AllChem.EmbedMolecule(mol, AllChem.ETKDG())
            if result == 0:  # 成功
                AllChem.UFFOptimizeMolecule(mol)
                success = True
                method_used = "ETKDG"
        except Exception as e:
            if logger:
                logger.info(f"ETKDG方法失败: {str(e)}")

但是之前发现生成的坐标,有严重的高斯输入不合理性,这些输入可以视为高斯的初猜结构。是为了后面能避免Gaussian运算。请问大家有没有什么好办法,用Python代码解决坐标输入和电荷、自旋多重度的计算



作者
Author:
Loading0760    时间: 2025-5-29 10:16
但是之前发现生成的坐标,有严重的高斯输入不合理性,这些输入可以视为高斯的初猜结构。是为了后面能避免Gaussian运算。请问大家有没有什么好办法,用Python代码解决坐标输入和电荷、自旋多重度的计算


有严重的高斯输入不合理性,可以视为高斯的初猜结构. 不合理为什么还视为高斯输入. 后面又到底要不要进行Gaussian运算rdkit应该是没有办法给mol对象添加自旋的属性.
作者
Author:
sjkcn    时间: 2025-5-29 10:21
是这样的,我因为是放在ssh上,想通过python生成的rdkit mol对象,去产生高斯的输入文件。当时比较着急,ssh没有图形界面。所以希望有一个比较好鲁棒性的代码,能正确的生成三维构象,同时填入正确的电荷和多重度数值。有一篇文章https://github.com/mitkeng/CCS_Focusing/ 这里人家是生成xyz,然后在生成高斯坐标。我要处理的反应数目(反应物、产物)比较多,一个个看过去确实很麻烦。希望从代码上增强鲁棒性解决。
作者
Author:
18217265596    时间: 2025-5-29 10:31
smi生成的结构 如果是有机物并且不包含连2个/4个的氮 连奇数的氧
都是电中性的
直接 0 1就行
如果含过渡金属 非人工不可。
作者
Author:
wal    时间: 2025-5-29 10:40
如果是纯有机分子 做ML的 没有构象搜索的条件 那ETKDGv3算法生成构象 力场优化一下应该差不多
要是正儿八经算 那没有图形界面是不行的 你无法预知代码会在什么地方给你整什么活 早期我尝试偷懒的时候甚至遇到过把羧基搞成C-O-O-H的情况
作者
Author:
sjkcn    时间: 2025-5-29 10:47
wal 发表于 2025-5-29 10:40
如果是纯有机分子 做ML的 没有构象搜索的条件 那ETKDGv3算法生成构象 力场优化一下应该差不多
要是正儿八 ...

谢谢,当时也是用GPT辅助,力场优化用的是UFF。我不知道rdkit还有没有其他的代码。确实下一步要接入ML的考虑, 没有构象搜索的条件,后期如何评价模型,有的人是把高斯的DFT高精度当作输入(前期耗时具大),也有人是把DFT做验证。目前是原先做的输入有30%不好,主要的问题是addHs还有二面角的问题。(也许有可能是从平面smiles到立体的过程有问题)
作者
Author:
sjkcn    时间: 2025-5-29 10:48
18217265596 发表于 2025-5-29 10:31
smi生成的结构 如果是有机物并且不包含连2个/4个的氮 连奇数的氧
都是电中性的
直接 0 1就行

有生物体系的磷酸O-存在,还有N3,非天然脂质
作者
Author:
wal    时间: 2025-5-29 10:53
sjkcn 发表于 2025-5-29 10:47
谢谢,当时也是用GPT辅助,力场优化用的是UFF。我不知道rdkit还有没有其他的代码。确实下一步要接入ML的 ...

可以试试MMFF94力场
作者
Author:
Loading0760    时间: 2025-5-29 13:35
rdkit, openbabel, autodE 多试几个,然后得到xyz结构之后用XTB跑个单点,这样筛选能量最低的? 如果及结构比较大的话,就用分子力场
作者
Author:
sjkcn    时间: 2025-5-29 16:38
Loading0760 发表于 2025-5-29 13:35
rdkit, openbabel, autodE 多试几个,然后得到xyz结构之后用XTB跑个单点,这样筛选能量最低的? 如果及结构比 ...

是这样的,我之前利用rdkit smarts 跑出rdkit mol对象。如果用除了rdkit 其他工具,可能还要单独写Python代码。
其他软件如openbabel autodE 生成三维坐标的过程我不是很懂,是不是也是用力场来建立坐标?
作者
Author:
Loading0760    时间: 2025-5-29 17:28
sjkcn 发表于 2025-5-29 16:38
是这样的,我之前利用rdkit smarts 跑出rdkit mol对象。如果用除了rdkit 其他工具,可能还要单独写Python ...

代码部分其实很好实现,假设你的两个变量一个是smiles,一个是xyz文件的名称
  1. import subprocess
  2. cmd = f'obabel -:"{smiles}" -O {xyz_filename}.xyz -h --gen3d'
  3. subprocess.run(cmd, shell=True, check=True)
复制代码
用autodE的话功能更多
  1. import autode as ade
  2. molecular = ade.Molecule(name=xyz_filename, smiles=smiles)
  3. molecular.optimise(method=ade.methods.XTB())

  4. print(molecular.charge,molecular.mult)
  5. molecular.print_xyz_file()
复制代码
都可以保存一个xyz文件
作者
Author:
sjkcn    时间: 2025-5-29 19:23
Loading0760 发表于 2025-5-29 17:28
代码部分其实很好实现,假设你的两个变量一个是smiles,一个是xyz文件的名称
用autodE的话功能更多
都可 ...
  1. def generate_molecule_hash(smiles):
  2.     """
  3.     生成分子SMILES的哈希值,用于避免重复生成相同分子的XYZ文件
  4.     """
  5.     return hashlib.md5(smiles.encode('utf-8')).hexdigest()[:8]

  6. def mol_to_xyz_with_smiles(mol, file_path, smiles=None, molecule_type=None):
  7.     """
  8.     将rdkit分子对象写为xyz文件,并在文件头部添加SMILES注释和分子类型信息。
  9.    
  10.     参数:
  11.         mol: RDKit Mol对象
  12.         file_path: 输出文件路径
  13.         smiles: SMILES字符串(用于备注)
  14.         molecule_type: 分子类型(Lipid, Probe或Product)
  15.     """
  16.     try:
  17.         # 检查输入分子是否有效
  18.         if mol is None:
  19.             raise ValueError("输入分子对象为空")
  20.             
  21.         # 确保分子有氢原子
  22.         mol = Chem.AddHs(mol)
  23.         
  24.         # 检查并生成3D坐标
  25.         conf = None
  26.         conformer_error = None
  27.         
  28.         # 步骤1: 尝试获取现有构象
  29.         try:
  30.             conf = mol.GetConformer()
  31.             if not conf.Is3D():
  32.                 print(f"警告: 分子已有构象但不是3D构象,将尝试生成3D坐标")
  33.                 conformer_error = "现有构象不是3D"
  34.                 conf = None
  35.         except Exception as e:
  36.             print(f"信息: 分子没有现有构象 ({str(e)}),将尝试生成3D坐标")
  37.             conformer_error = str(e)
  38.             conf = None
  39.         
  40.         # 步骤2: 如果没有有效构象,尝试ETKDG方法生成(更高级的构象生成方法)
  41.         if conf is None:
  42.             try:
  43.                 print(f"尝试使用ETKDG方法为分子生成3D构象...")
  44.                 AllChem.EmbedMolecule(mol, AllChem.ETKDG())
  45.                 AllChem.UFFOptimizeMolecule(mol)
  46.                 conf = mol.GetConformer()
  47.                 if not conf.Is3D():
  48.                     raise ValueError("ETKDG方法生成的构象不是3D")
  49.                 print(f"ETKDG方法成功生成3D构象")
  50.             except Exception as e:
  51.                 print(f"ETKDG方法失败: {str(e)},尝试基本嵌入方法...")
  52.                 conformer_error = f"{conformer_error} -> ETKDG失败: {str(e)}"
  53.         
  54.         # 步骤3: 如果ETKDG失败,尝试基本的嵌入方法
  55.         if conf is None or not conf.Is3D():
  56.             try:
  57.                 print(f"尝试使用基本嵌入方法生成3D构象...")
  58.                 # 先清除所有构象
  59.                 while mol.GetNumConformers() > 0:
  60.                     mol.RemoveConformer(0)
  61.                
  62.                 # 尝试多次随机种子
  63.                 for seed in [42, 123, 987, 555]:
  64.                     ps = AllChem.ETKDGv3()
  65.                     ps.randomSeed = seed
  66.                     cid = AllChem.EmbedMolecule(mol, ps)
  67.                     if cid >= 0:  # 成功嵌入
  68.                         conf = mol.GetConformer(cid)
  69.                         if conf.Is3D():
  70.                             print(f"基本嵌入方法在种子{seed}下成功")
  71.                             # 优化构象
  72.                             AllChem.UFFOptimizeMolecule(mol, confId=cid)
  73.                             break
  74.                
  75.                 if conf is None or not conf.Is3D():
  76.                     raise ValueError("多次尝试后仍无法生成有效的3D构象")
  77.             except Exception as e:
  78.                 print(f"所有嵌入方法均失败: {str(e)}")
  79.                 conformer_error = f"{conformer_error} -> 基本嵌入失败: {str(e)}"
  80.                 raise ValueError(f"无法生成3D构象: {conformer_error}")
  81.         
  82.         # 确认我们有有效的3D构象
  83.         if conf is None or not conf.Is3D():
  84.             raise ValueError("尝试所有方法后仍无法获得有效的3D构象")
  85.             
  86.         # 写入XYZ文件
  87.         with open(file_path, 'w') as f:
  88.             f.write(f"{mol.GetNumAtoms()}\n")
  89.             comments = []
  90.             if molecule_type:
  91.                 comments.append(f"Type: {molecule_type}")
  92.             if smiles:
  93.                 comments.append(f"SMILES: {smiles}")
  94.             f.write(f"{' | '.join(comments)}\n")
  95.             
  96.             for atom in mol.GetAtoms():
  97.                 pos = conf.GetAtomPosition(atom.GetIdx())
  98.                 f.write(f"{atom.GetSymbol()} {pos.x:.6f} {pos.y:.6f} {pos.z:.6f}\n")
  99.         
  100.         return True
  101.     except Exception as e:
  102.         print(f"警告: 无法将分子转换为XYZ格式: {e}")
  103.         return False

  104. def smiles_to_xyz(smiles, file_path, molecule_type=None):
  105.     """
  106.     从SMILES生成XYZ文件(备用方法)
  107.     """
  108.     if not smiles:
  109.         return False
  110.    
  111.     try:
  112.         mol = Chem.MolFromSmiles(smiles)
  113.         if mol is None:
  114.             raise ValueError("无效的SMILES字符串")
  115.         
  116.         return mol_to_xyz_with_smiles(mol, file_path, smiles, molecule_type)
  117.     except Exception as e:
  118.         print(f"警告: 无法从SMILES生成XYZ文件: {e}")
  119.         return False

  120. def safe_write_xyz(mol, smiles, filename, output_dir, molecule_type):
  121.     """
  122.     安全地生成XYZ文件,优先使用RDKit Mol对象,失败时尝试使用SMILES
  123.    
  124.     返回:
  125.         tuple: (文件名, 成功状态, 使用的方法)
  126.     """
  127.     file_path = os.path.join(output_dir, filename)
  128.    
  129.     # 检查文件是否已存在
  130.     if os.path.exists(file_path):
  131.         return filename, True, "existing"
  132.    
  133.     # 尝试使用RDKit Mol对象生成XYZ
  134.     if mol is not None:
  135.         success = mol_to_xyz_with_smiles(mol, file_path, smiles, molecule_type)
  136.         if success:
  137.             return filename, True, "mol"
  138.    
  139.     # 如果Mol对象失败或不存在,尝试使用SMILES
  140.     if smiles:
  141.         success = smiles_to_xyz(smiles, file_path, molecule_type)
  142.         if success:
  143.             return filename, True, "smiles"
  144.    
  145.     # 如果都失败了,返回失败信息
  146.     return filename, False, "failed"
复制代码
这个是我原先写的,利用您的第三方的代码,适合放在我的代码的哪部分呢?出现失败的smile是带这TCO的结构,如CCCOCOC1CC/C=C\CCC1
作者
Author:
Daniel_Arndt    时间: 2025-5-30 11:35
之前搞一些纯有机的分子的时候试过Open Babel和RDKit,当时处理一些小分子时没感觉到差别,但分子较大时(如一些天然产物),发现Open Babel比RDKit容易出问题。

目前对于纯有机的分子批量生成构象,我都是用RDKit中的ETKDG v3,这个功能是RDKit 2020.03开始有的。

以下是一段简单的代码供参考,其功能是利用RDKit从SMILES字符串生成xyz文件,仅适用于纯有机的体系。
  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)
复制代码



作者
Author:
sjkcn    时间: 2025-5-31 09:09
Daniel_Arndt 发表于 2025-5-30 11:35
之前搞一些纯有机的分子的时候试过Open Babel和RDKit,当时处理一些小分子时没感觉到差别,但分子较大时( ...

好的,坐标问题其实针对脂质可能不一定好解决。如果分子变大。另外自旋多重度和电荷,如果是针对大批量工作,你有什么好办法吗?
作者
Author:
sjkcn    时间: 2025-6-4 09:32
Daniel_Arndt 发表于 2025-5-30 11:35
之前搞一些纯有机的分子的时候试过Open Babel和RDKit,当时处理一些小分子时没感觉到差别,但分子较大时( ...

pip show rdkit
Name: rdkit
Version: 2024.9.6
Summary: A collection of chemoinformatics and machine-learning software written in C++ and Python
Home-page: https://github.com/kuelumbus/rdkit-pypi
Author: Christopher Kuenneth
Author-email: chris@kuenneth.dev
License: BSD-3-Clause
Location: c:\programdata\anaconda3\envs\chemagent\lib\site-packages
Requires: numpy, Pillow
Required-by: deepchem, scikit-mol 这个是我现在用的版本。我想如果是批量设计,流程是不是先用这个生成xyz坐标,然后自己设置电荷和自旋多重度。最后输入回去生成高斯坐标?
作者
Author:
Daniel_Arndt    时间: 2025-6-4 10:12
sjkcn 发表于 2025-6-4 09:32
pip show rdkit
Name: rdkit
Version: 2024.9.6

之前有个搞高通量计算的人说过,实际操作中上了规模后,总有约5%~10%的比例会出问题。你要走通流程的话,相当一部分力气会花在处理异常情况上。

你可以直接把write_xyz_file这个函数修改成写高斯输入文件的函数。如果对python不是太熟悉的话,先让DeepSeek或Gemini来改,然后自己再对代码做出一些调整。
作者
Author:
wxyhgk    时间: 2025-6-4 10:17
本帖最后由 wxyhgk 于 2025-6-4 10:19 编辑

这个根本就实现不了,除非你针对你自己特定的一系列物质做了优化,否则根本就是实现不了的事情。

稍微复杂一点的就不行了,例如含有刚性结构,链稍微长一点的就不行了

SMILES 本身就没有三维信息,上哪去生成坐标

作者
Author:
sjkcn    时间: 2025-6-4 10:36
wxyhgk 发表于 2025-6-4 10:17
这个根本就实现不了,除非你针对你自己特定的一系列物质做了优化,否则根本就是实现不了的事情。

稍微复 ...

smiles二维的,在chemdraw显示的很好,但是在转换成三维的过程中确实有不少问题,这个我承认。那么,我看到有文章先用rdkit reactions smarts 生成了新的smiles。然后进行计算。假如你单个的,还可以优化下,但是数据量一大就不行了。一个个检查,忙不过来的。刚性结构比如DBCO TCO这种大环。即便我smiles定义好了顺反要求,确实输出不好,这个我发现了。
作者
Author:
wxyhgk    时间: 2025-6-4 10:45
sjkcn 发表于 2025-6-4 10:36
smiles二维的,在chemdraw显示的很好,但是在转换成三维的过程中确实有不少问题,这个我承认。那么,我看 ...

chemdraw 是专门做了 SMILES 的优化的,你用开源的试试看?

文章里面的都是些简单东西,根本没有实际用处,我做工业化的,很清楚,我最近也在研究这些,他们这些都是扯淡
作者
Author:
wal    时间: 2025-6-4 10:54
sjkcn 发表于 2025-6-4 10:36
smiles二维的,在chemdraw显示的很好,但是在转换成三维的过程中确实有不少问题,这个我承认。那么,我看 ...

我室友做ML的 也是RDkit批量生成 听他说这种数据后面还要做清洗
我也没听太明白 听起来像是要用脚本来判断他想研究的特征结构有没有被力场胡搞 如果乱了就肃反掉
作者
Author:
sjkcn    时间: 2025-6-4 11:06
wal 发表于 2025-6-4 10:54
我室友做ML的 也是RDkit批量生成 听他说这种数据后面还要做清洗
我也没听太明白 听起来像是要用脚本来判 ...

我只希望用保守的方式生成,就可以了。至于forcefield那些设置啥的,我又不是专门做这块,我的目的只是希望计算能生成合适的坐标。基本的键长、二面角不太离谱就可以了
作者
Author:
sjkcn    时间: 2025-6-4 11:08
Daniel_Arndt 发表于 2025-6-4 10:12
之前有个搞高通量计算的人说过,实际操作中上了规模后,总有约5%~10%的比例会出问题。你要走通流程的话, ...

我已经做了很多次了。当时原先是想电荷和自旋多重度都要让代码跑,后面算了,自己手动确认,因为有些结构相似的,自己在文件命名中是清楚的。另外,代码上,我也用不同的GPT,感觉claude想的try except比较多。其他的不太行,deepseek经常你懂的问题。
作者
Author:
sjkcn    时间: 2025-6-4 11:10
wxyhgk 发表于 2025-6-4 10:45
chemdraw 是专门做了 SMILES 的优化的,你用开源的试试看?

文章里面的都是些简单东西,根本没有实际 ...

我是一个小白,那么就您的看法而言,现在用什么方法比较稳妥呢? 工业界是一般怎么做呢?
作者
Author:
wal    时间: 2025-6-4 12:18
sjkcn 发表于 2025-6-4 11:06
我只希望用保守的方式生成,就可以了。至于forcefield那些设置啥的,我又不是专门做这块,我的目的只是希 ...

用"只是"来形容一项极其复杂的任务并不能使其实际上变简单
作者
Author:
wxyhgk    时间: 2025-6-4 21:02
sjkcn 发表于 2025-6-4 11:10
我是一个小白,那么就您的看法而言,现在用什么方法比较稳妥呢? 工业界是一般怎么做呢?

目前没有解决办法,论文都是吹牛的,计算化学找个构象都得搞半天,你一个缺少三维信息的 SMILES 怎么可能成功?从原理上就搞不了好吧
作者
Author:
sjkcn    时间: 2025-6-4 21:14
wxyhgk 发表于 2025-6-4 21:02
目前没有解决办法,论文都是吹牛的,计算化学找个构象都得搞半天,你一个缺少三维信息的 SMILES 怎么可能 ...

既然这样,开发这种力场和算法的都是无用功咯。不是所有结构都有X-ray的表征。三维信息微观水平本身就是一个假想。基于现有的条件去算去解释,应该说搞了也不一定准。是这样吗?
作者
Author:
Peng14    时间: 2025-6-4 22:02
sjkcn 发表于 2025-6-4 11:06
我只希望用保守的方式生成,就可以了。至于forcefield那些设置啥的,我又不是专门做这块,我的目的只是希 ...

最近一直在做类似的事情,我目前的经验是:对于一些常见的有机化合物(成键方式没有太离谱,也不包含金属配位键之类的),可以用RDKit解析SMILES,生成包含包含原子三维坐标信息和键连关系的mol/mol2文件,再用xtb调用GFN-FF力场(避免键的断裂)进行快速的结构优化,同时也会输出优化后结构的mol文件,这时候的坐标、键长、二面角等参数基本是比较合理的
作者
Author:
sjkcn    时间: 2025-6-5 09:58
Peng14 发表于 2025-6-4 22:02
最近一直在做类似的事情,我目前的经验是:对于一些常见的有机化合物(成键方式没有太离谱,也不包含金属 ...

xtb我不是很熟悉,rdkit用的针对大环张力效果不是很好。我一直有一个疑问,对于力场优化。是不是类似药物小分子在受体的结合那种力的计算啊
作者
Author:
wxyhgk    时间: 2025-6-5 10:14
Peng14 发表于 2025-6-4 22:02
最近一直在做类似的事情,我目前的经验是:对于一些常见的有机化合物(成键方式没有太离谱,也不包含金属 ...

你这种都是些小分子/简单分子完全达不到工业化的标准,发论文吹吹牛还行,一用到实际就不行了
作者
Author:
Uus/pMeC6H4-/キ    时间: 2025-6-5 11:07
wxyhgk 发表于 2025-6-5 10:14
你这种都是些小分子/简单分子完全达不到工业化的标准,发论文吹吹牛还行,一用到实际就不行了

复读半天差不多得了,敢问可有哪怕半点建设性的、可重复的切实提议?工业化能赚钱就是清高就是了不起哦,指指点点这么多连搞简单小体系的科研努力都要否定(注意这不代表我就不反感学术界灌水的行为),除了逞口舌之快毫无意义(流汗黄豆)想反驳我随意,我不会浪费时间跟进的。


作者
Author:
sjkcn    时间: 2025-6-5 14:37
wxyhgk 发表于 2025-6-5 10:14
你这种都是些小分子/简单分子完全达不到工业化的标准,发论文吹吹牛还行,一用到实际就不行了

我很好奇,工业化解决的思路是什么呢?
作者
Author:
sjkcn    时间: 2025-6-5 14:41
Uus/pMeC6H4-/キ 发表于 2025-6-5 11:07
复读半天差不多得了,敢问可有哪怕半点建设性的、可重复的切实提议?工业化能赚钱就是清高就是了不起哦, ...

理性分析看待,思考即可。有理有据,我希望大家讨论都理性些,这个问题其实很多人都挺困扰的。算单个对于一般人来说不是很难。只要耐心算。但是大批量的计算,不仅是时间、精力还有错误率等等因素要考虑的。我开了这个贴也是多听听大家的思考方向如何。不管是学术界还是工业界,找得到方法都是好的。
作者
Author:
wxyhgk    时间: 2025-6-5 14:43
sjkcn 发表于 2025-6-5 14:37
我很好奇,工业化解决的思路是什么呢?

只能先找一批类似的分子做,做机器学习和力场一起搞,但是问题在于如果在母核周围增加些复杂的芳环,立体结构强的(例如金刚烷什么的)就非常难受了,还是得自己手动修改。

如果你的情况是一些小分子(没有立体效应很强的,或者奇怪的刚性结构)可以用这些学术上的模型去搞没问题,如果是很复杂的基本都有问题
作者
Author:
sjkcn    时间: 2025-6-5 16:56
wxyhgk 发表于 2025-6-5 14:43
只能先找一批类似的分子做,做机器学习和力场一起搞,但是问题在于如果在母核周围增加些复杂的芳环,立体 ...

请教下,我知道高斯是支持内坐标表示原子和原子的连接关系。但是,对于复杂的体系,内坐标的方法是不是也不太好呢?
作者
Author:
proszx    时间: 2025-6-8 19:35
rdkit生成结构算法就有问题,拿来做高斯意思不大
作者
Author:
proszx    时间: 2025-6-27 17:27
rdkit生成稍微大一些的分子的构象就有问题,到现在仍然没有一个很好的处理方法,都是尝试
作者
Author:
Graphite    时间: 2025-6-30 21:59
本帖最后由 Graphite 于 2025-7-1 10:25 编辑

...不知道纯技术的事情咋能引战了


从本质上来说,SMILES是一种分子的图表示,当然是不包含三维坐标信息的。SMILES只能展开成一组键列表(拓扑、图的邻居列表),并且一般也不包含手性、顺反异构信息。(对映异构体和顺反异构体如果不做特殊处理,其实是图同构的

RDKit或OpenBabel或Chemdraw直接从SMILES生成三维坐标的方法,其实也是通过经验方法,用预制键长键角生成,没有MD的过程在。

如果要说从SMILES能够稳定地、99%以上地生成可用的三维坐标,一种可能的方法应该:1、展开拓扑,2、从拓扑通过图算法生长出初始的结构,这个结构很可能就是包含重叠原子、不合理的坐标。3、加载预制键长键角、soft势或其他稳健性强的原子间势,进行能量最小化。加氢问题相当于:在一个有节点度数约束的赋权图上,先确定边的正确权重,再根据顶点剩余权重,用氢饱和。

问题的复杂度在于其本质复杂度,而不是附加复杂度。现有的包表现差强人意、自己写总是免不了try-except、剔除异常结果只是核心问题的表象。如果选择更硬核的方法:自己开发写算法,要发文章还是以后转码都很锻炼人。如果只是快速要一批差不多的分子,就得接受当下10%、20%甚至更多的失败率、可能还是要反复人工剔除。




作者
Author:
sjkcn    时间: 2025-7-15 11:05
Graphite 发表于 2025-6-30 21:59
...不知道纯技术的事情咋能引战了

本质上,还是从smiles到初始坐标的过程。这里的过程怎么判断,细节很多。而且并不类似于蛋白与小分子对接那种有口袋的构象搜索。去扭转啥的。不知道我的理解对不对哈
作者
Author:
Graphite    时间: 2025-7-15 16:05
sjkcn 发表于 2025-7-15 11:05
本质上,还是从smiles到初始坐标的过程。这里的过程怎么判断,细节很多。而且并不类似于蛋白与小分子对接 ...

你说的“构象搜索”我理解是构象的能稳定用的初始化和优化方案,即使输入是垃圾结构,输出应该基本像个分子样子,能作为量化之类的输入。

这个没有开箱即用的包,只能说自己去加载力场,做能量最小化,或者做MD。我所知的一种方法是用带限制的能量优化器或者积分器 + 软核势可以把很多垃圾结构搓正常。
http://bbs.keinsci.com/thread-42434-1-1.html
http://bbs.keinsci.com/thread-53708-1-1.html
作者
Author:
duan_zhou    时间: 2025-7-16 16:13
sjkcn 发表于 2025-7-15 11:05
本质上,还是从smiles到初始坐标的过程。这里的过程怎么判断,细节很多。而且并不类似于蛋白与小分子对接 ...

我看rdkit的相关论文,就是从初始原子坐标进行优化使它们的距离满足目标键长和手性值,由于非键的原子对只能设置个范围值,因此用距离矩阵分解时只能随机设置并进行筛选。成键的键长估计是从uff力场那套定义计算的。之后又加了个力场优化和构象搜索





欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3