1.皂苷和多肽成功反应的代码
我的这个项目比较特殊,因为我甾环上的羟基并不能被成功识别,因为不是常规意识上的碱。所以我的解放方案,是间接通过多肽和氨基酸取代的方法实现的皂苷和多肽反应的代码
#########################################
#这是最终调试成功的我的皂苷和氨基酸调试的代码
#########################################
from rdkit import Chem
from rdkit.Chem import AllChem
import os
# 皂苷分子结构定义
smiles_saponin = "C[C@]12CC[C@@H](C([C@@H]1CC[C@@]3([C@@H]2CC=C4[C@]3(CC[C@@]5([C@H]4CC(CC5)(C)C)C(=O)O)C)C)(C)C)O"
mol_a = Chem.MolFromSmiles(smiles_saponin)
def save_product(mol, base_name, group_idx, prod_idx, output_dir):
"""保存单个产物到SDF文件"""
try:
AllChem.Compute2DCoords(mol)
filename = f"{base_name}_group{group_idx}_prod{prod_idx}.sdf"
output_path = os.path.join(output_dir, filename)
writer = Chem.SDWriter(output_path)
writer.write(mol)
writer.close()
print(f" 已保存产物到: {output_path}") # 显示完整路径
except Exception as e:
print(f" 保存失败: {str(e)}")
def process_sdf_folder(input_folder, output_folder):
"""处理SDF文件并保存产物到指定路径"""
# 创建输出目录(包括中间目录)
os.makedirs(output_folder, exist_ok=True)
sdf_files = [f for f in os.listdir(input_folder) if f.endswith(".sdf")]
for sdf_file in sdf_files:
input_path = os.path.join(input_folder, sdf_file)
print(f"\n正在处理文件: {input_path}")
supplier = Chem.SDMolSupplier(input_path)
mol_b = supplier[0] if supplier else None
if not mol_b:
print(f"警告:{sdf_file} 未找到有效分子,已跳过")
continue
reaction_smarts = "[C:1][OH:2].[C:3](=[O:4])[OH:5]>>[C:1][O:2][C:3](=[O:4])"
rxn = AllChem.ReactionFromSmarts(reaction_smarts)
products = rxn.RunReactants((mol_a, mol_b))
if products:
print(f"发现 {len(products)} 组产物")
base_name = os.path.splitext(sdf_file)[0]
for group_idx, prod_group in enumerate(products, 1):
print(f" 第{group_idx}组产物:")
for prod_idx, mol in enumerate(prod_group, 1):
print(f" 产物{prod_idx}: {Chem.MolToSmiles(mol)}")
save_product(mol, base_name, group_idx, prod_idx, output_folder)
else:
print(f"未生成产物,请检查反应条件")
if __name__ == "__main__":
# 用户自定义路径
input_folder = "E:/AIDDproject/Pycharm/rdkit/chemical_reaction/amino/" # 输入目录
output_folder = "E:/AIDDproject/Pycharm/rdkit/chemical_reaction/djjproducts" # 输出目录(可任意指定)
if os.path.exists(input_folder):
process_sdf_folder(input_folder, output_folder)
print(f"\n处理完成!产物保存在: {os.path.abspath(output_folder)}")
else:
print(f"错误:输入路径 {input_folder} 不存在")
下面是调试代码
单个皂苷和单个氨基酸调试成功的代码
##### 单个皂苷和单个氨基酸调试成功的代码
##############
from rdkit import Chem
from rdkit.Chem import AllChem
# 分子结构定义
smiles_saponin = "C[C@]12CC[C@@H](C([C@@H]1CC[C@@]3([C@@H]2CC=C4[C@]3(CC[C@@]5([C@H]4CC(CC5)(C)C)C(=O)O)C)C)(C)C)O"
smiles_arginine = "C(CC(C(=O)O)N)CN=C(N)N" # 精氨酸含羧酸基团
# 加载分子
mol_a = Chem.MolFromSmiles(smiles_saponin)
mol_b = Chem.MolFromSmiles(smiles_arginine)
# 更新反应规则:羟基与羧酸缩合
# 模式解释:皂苷羟基[C:1]-[OH:2] + 精氨酸羧酸[C:3]-[OH:4] → 形成酯键[C:1]-O-[C:3]
reaction_smarts = "[C:1][OH:2].[C:3](=[O:4])[OH:5]>>[C:1][O:2][C:3](=[O:4])"
rxn = AllChem.ReactionFromSmarts(reaction_smarts)
# 执行反应
products = rxn.RunReactants((mol_a, mol_b))
# 结果输出
if products:
print("成功生成酯化产物:")
for i, prod in enumerate(products[0]):
print(f"产物{i+1}: {Chem.MolToSmiles(prod)}")
else:
print("提示:请确认羟基位点是否匹配,或尝试调整反应模式")